From 31ef295f52d82302e9c44b10d36be58803c8b1e8 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Sun, 26 Jan 2025 09:13:40 -0500 Subject: [PATCH] SDL upgrade --- Frameworks/SDL3.xcframework/Info.plist | 40 +- .../{sdl3-config.cmake => SDL3Config.cmake} | 2 +- ...-version.cmake => SDL3ConfigVersion.cmake} | 0 .../ios-arm64/SDL3.framework/Headers/SDL.h | 12 +- .../SDL3.framework/Headers/SDL_assert.h | 209 +- .../SDL3.framework/Headers/SDL_asyncio.h | 546 +++ .../SDL3.framework/Headers/SDL_atomic.h | 283 +- .../SDL3.framework/Headers/SDL_audio.h | 576 ++- .../SDL3.framework/Headers/SDL_begin_code.h | 271 +- .../SDL3.framework/Headers/SDL_bits.h | 25 +- .../SDL3.framework/Headers/SDL_blendmode.h | 14 +- .../SDL3.framework/Headers/SDL_camera.h | 111 +- .../SDL3.framework/Headers/SDL_clipboard.h | 161 +- .../SDL3.framework/Headers/SDL_close_code.h | 7 +- .../SDL3.framework/Headers/SDL_copying.h | 2 +- .../SDL3.framework/Headers/SDL_cpuinfo.h | 144 +- .../SDL3.framework/Headers/SDL_dialog.h | 211 +- .../SDL3.framework/Headers/SDL_egl.h | 2 +- .../SDL3.framework/Headers/SDL_endian.h | 152 +- .../SDL3.framework/Headers/SDL_error.h | 109 +- .../SDL3.framework/Headers/SDL_events.h | 430 +- .../SDL3.framework/Headers/SDL_filesystem.h | 315 +- .../SDL3.framework/Headers/SDL_gamepad.h | 363 +- .../SDL3.framework/Headers/SDL_gpu.h | 3770 ++++++++++++----- .../SDL3.framework/Headers/SDL_guid.h | 11 +- .../SDL3.framework/Headers/SDL_haptic.h | 251 +- .../SDL3.framework/Headers/SDL_hidapi.h | 56 +- .../SDL3.framework/Headers/SDL_hints.h | 1110 ++--- .../SDL3.framework/Headers/SDL_init.h | 199 +- .../SDL3.framework/Headers/SDL_intrin.h | 258 +- .../SDL3.framework/Headers/SDL_iostream.h | 631 ++- .../SDL3.framework/Headers/SDL_joystick.h | 286 +- .../SDL3.framework/Headers/SDL_keyboard.h | 211 +- .../SDL3.framework/Headers/SDL_keycode.h | 523 +-- .../SDL3.framework/Headers/SDL_loadso.h | 47 +- .../SDL3.framework/Headers/SDL_locale.h | 12 +- .../SDL3.framework/Headers/SDL_log.h | 145 +- .../SDL3.framework/Headers/SDL_main.h | 293 +- .../SDL3.framework/Headers/SDL_main_impl.h | 97 +- .../SDL3.framework/Headers/SDL_messagebox.h | 53 +- .../SDL3.framework/Headers/SDL_metal.h | 14 +- .../SDL3.framework/Headers/SDL_misc.h | 10 +- .../SDL3.framework/Headers/SDL_mouse.h | 310 +- .../SDL3.framework/Headers/SDL_mutex.h | 420 +- .../SDL3.framework/Headers/SDL_oldnames.h | 78 +- .../SDL3.framework/Headers/SDL_opengl.h | 990 ++++- .../SDL3.framework/Headers/SDL_opengles.h | 2 +- .../SDL3.framework/Headers/SDL_opengles2.h | 2 +- .../SDL3.framework/Headers/SDL_pen.h | 50 +- .../SDL3.framework/Headers/SDL_pixels.h | 696 ++- .../SDL3.framework/Headers/SDL_platform.h | 4 +- .../Headers/SDL_platform_defines.h | 386 +- .../SDL3.framework/Headers/SDL_power.h | 15 +- .../SDL3.framework/Headers/SDL_process.h | 430 ++ .../SDL3.framework/Headers/SDL_properties.h | 120 +- .../SDL3.framework/Headers/SDL_rect.h | 144 +- .../SDL3.framework/Headers/SDL_render.h | 1038 +++-- .../SDL3.framework/Headers/SDL_revision.h | 34 +- .../SDL3.framework/Headers/SDL_scancode.h | 13 +- .../SDL3.framework/Headers/SDL_sensor.h | 56 +- .../SDL3.framework/Headers/SDL_stdinc.h | 3524 +++++++++++++-- .../SDL3.framework/Headers/SDL_storage.h | 399 +- .../SDL3.framework/Headers/SDL_surface.h | 448 +- .../SDL3.framework/Headers/SDL_system.h | 365 +- .../SDL3.framework/Headers/SDL_thread.h | 121 +- .../SDL3.framework/Headers/SDL_time.h | 58 +- .../SDL3.framework/Headers/SDL_timer.h | 212 +- .../SDL3.framework/Headers/SDL_touch.h | 74 +- .../SDL3.framework/Headers/SDL_tray.h | 544 +++ .../SDL3.framework/Headers/SDL_version.h | 31 +- .../SDL3.framework/Headers/SDL_video.h | 1311 ++++-- .../SDL3.framework/Headers/SDL_vulkan.h | 71 +- .../ios-arm64/SDL3.framework/INSTALL.md | 41 + .../ios-arm64/SDL3.framework/Info.plist | Bin 860 -> 854 bytes .../ios-arm64/SDL3.framework/License.txt | 5 +- .../ios-arm64/SDL3.framework/README.md | 17 + .../ios-arm64/SDL3.framework/ReadMe.txt | 44 - .../ios-arm64/SDL3.framework/SDL3 | Bin 1382352 -> 1618944 bytes .../SDL3.framework/compile_shaders.sh | 68 - .../ios-arm64/SDL3.framework/default.metallib | Bin 26077 -> 34505 bytes .../SDL3.framework/CMake/SDL3Config.cmake} | 2 +- ...-version.cmake => SDL3ConfigVersion.cmake} | 0 .../SDL3.framework/Headers/SDL.h | 12 +- .../SDL3.framework/Headers/SDL_assert.h | 209 +- .../SDL3.framework/Headers/SDL_asyncio.h | 546 +++ .../SDL3.framework/Headers/SDL_atomic.h | 283 +- .../SDL3.framework/Headers/SDL_audio.h | 576 ++- .../SDL3.framework/Headers/SDL_begin_code.h | 271 +- .../SDL3.framework/Headers/SDL_bits.h | 25 +- .../SDL3.framework/Headers/SDL_blendmode.h | 14 +- .../SDL3.framework/Headers/SDL_camera.h | 111 +- .../SDL3.framework/Headers/SDL_clipboard.h | 161 +- .../SDL3.framework/Headers/SDL_close_code.h | 7 +- .../SDL3.framework/Headers/SDL_copying.h | 2 +- .../SDL3.framework/Headers/SDL_cpuinfo.h | 144 +- .../SDL3.framework/Headers/SDL_dialog.h | 211 +- .../SDL3.framework/Headers/SDL_egl.h | 2 +- .../SDL3.framework/Headers/SDL_endian.h | 152 +- .../SDL3.framework/Headers/SDL_error.h | 109 +- .../SDL3.framework/Headers/SDL_events.h | 430 +- .../SDL3.framework/Headers/SDL_filesystem.h | 315 +- .../SDL3.framework/Headers/SDL_gamepad.h | 363 +- .../SDL3.framework/Headers/SDL_gpu.h | 3770 ++++++++++++----- .../SDL3.framework/Headers/SDL_guid.h | 11 +- .../SDL3.framework/Headers/SDL_haptic.h | 251 +- .../SDL3.framework/Headers/SDL_hidapi.h | 56 +- .../SDL3.framework/Headers/SDL_hints.h | 1110 ++--- .../SDL3.framework/Headers/SDL_init.h | 199 +- .../SDL3.framework/Headers/SDL_intrin.h | 258 +- .../SDL3.framework/Headers/SDL_iostream.h | 631 ++- .../SDL3.framework/Headers/SDL_joystick.h | 286 +- .../SDL3.framework/Headers/SDL_keyboard.h | 211 +- .../SDL3.framework/Headers/SDL_keycode.h | 523 +-- .../SDL3.framework/Headers/SDL_loadso.h | 47 +- .../SDL3.framework/Headers/SDL_locale.h | 12 +- .../SDL3.framework/Headers/SDL_log.h | 145 +- .../SDL3.framework/Headers/SDL_main.h | 293 +- .../SDL3.framework/Headers/SDL_main_impl.h | 97 +- .../SDL3.framework/Headers/SDL_messagebox.h | 53 +- .../SDL3.framework/Headers/SDL_metal.h | 14 +- .../SDL3.framework/Headers/SDL_misc.h | 10 +- .../SDL3.framework/Headers/SDL_mouse.h | 310 +- .../SDL3.framework/Headers/SDL_mutex.h | 420 +- .../SDL3.framework/Headers/SDL_oldnames.h | 78 +- .../SDL3.framework/Headers/SDL_opengl.h | 990 ++++- .../SDL3.framework/Headers/SDL_opengles.h | 2 +- .../SDL3.framework/Headers/SDL_opengles2.h | 2 +- .../SDL3.framework/Headers/SDL_pen.h | 50 +- .../SDL3.framework/Headers/SDL_pixels.h | 696 ++- .../SDL3.framework/Headers/SDL_platform.h | 4 +- .../Headers/SDL_platform_defines.h | 386 +- .../SDL3.framework/Headers/SDL_power.h | 15 +- .../SDL3.framework/Headers/SDL_process.h | 430 ++ .../SDL3.framework/Headers/SDL_properties.h | 120 +- .../SDL3.framework/Headers/SDL_rect.h | 144 +- .../SDL3.framework/Headers/SDL_render.h | 1038 +++-- .../SDL3.framework/Headers/SDL_revision.h | 34 +- .../SDL3.framework/Headers/SDL_scancode.h | 13 +- .../SDL3.framework/Headers/SDL_sensor.h | 56 +- .../SDL3.framework/Headers/SDL_stdinc.h | 3524 +++++++++++++-- .../SDL3.framework/Headers/SDL_storage.h | 399 +- .../SDL3.framework/Headers/SDL_surface.h | 448 +- .../SDL3.framework/Headers/SDL_system.h | 365 +- .../SDL3.framework/Headers/SDL_thread.h | 121 +- .../SDL3.framework/Headers/SDL_time.h | 58 +- .../SDL3.framework/Headers/SDL_timer.h | 212 +- .../SDL3.framework/Headers/SDL_touch.h | 74 +- .../SDL3.framework/Headers/SDL_tray.h | 544 +++ .../SDL3.framework/Headers/SDL_version.h | 31 +- .../SDL3.framework/Headers/SDL_video.h | 1311 ++++-- .../SDL3.framework/Headers/SDL_vulkan.h | 71 +- .../SDL3.framework/INSTALL.md | 41 + .../SDL3.framework/Info.plist | Bin 840 -> 834 bytes .../SDL3.framework/License.txt | 5 +- .../SDL3.framework/README.md | 17 + .../SDL3.framework/ReadMe.txt | 44 - .../SDL3.framework/SDL3 | Bin 3004224 -> 3566640 bytes .../_CodeSignature/CodeResources | 982 +++++ .../SDL3.framework/compile_shaders.sh | 68 - .../SDL3.framework/default.metallib | Bin 30135 -> 37843 bytes .../SDL3.framework/Versions/A/Headers/SDL.h | 12 +- .../Versions/A/Headers/SDL_assert.h | 209 +- .../Versions/A/Headers/SDL_asyncio.h | 546 +++ .../Versions/A/Headers/SDL_atomic.h | 283 +- .../Versions/A/Headers/SDL_audio.h | 576 ++- .../Versions/A/Headers/SDL_begin_code.h | 271 +- .../Versions/A/Headers/SDL_bits.h | 25 +- .../Versions/A/Headers/SDL_blendmode.h | 14 +- .../Versions/A/Headers/SDL_camera.h | 111 +- .../Versions/A/Headers/SDL_clipboard.h | 161 +- .../Versions/A/Headers/SDL_close_code.h | 7 +- .../Versions/A/Headers/SDL_copying.h | 2 +- .../Versions/A/Headers/SDL_cpuinfo.h | 144 +- .../Versions/A/Headers/SDL_dialog.h | 211 +- .../Versions/A/Headers/SDL_egl.h | 2 +- .../Versions/A/Headers/SDL_endian.h | 152 +- .../Versions/A/Headers/SDL_error.h | 109 +- .../Versions/A/Headers/SDL_events.h | 430 +- .../Versions/A/Headers/SDL_filesystem.h | 315 +- .../Versions/A/Headers/SDL_gamepad.h | 363 +- .../Versions/A/Headers/SDL_gpu.h | 3770 ++++++++++++----- .../Versions/A/Headers/SDL_guid.h | 11 +- .../Versions/A/Headers/SDL_haptic.h | 251 +- .../Versions/A/Headers/SDL_hidapi.h | 56 +- .../Versions/A/Headers/SDL_hints.h | 1110 ++--- .../Versions/A/Headers/SDL_init.h | 199 +- .../Versions/A/Headers/SDL_intrin.h | 258 +- .../Versions/A/Headers/SDL_iostream.h | 631 ++- .../Versions/A/Headers/SDL_joystick.h | 286 +- .../Versions/A/Headers/SDL_keyboard.h | 211 +- .../Versions/A/Headers/SDL_keycode.h | 523 +-- .../Versions/A/Headers/SDL_loadso.h | 47 +- .../Versions/A/Headers/SDL_locale.h | 12 +- .../Versions/A/Headers/SDL_log.h | 145 +- .../Versions/A/Headers/SDL_main.h | 293 +- .../Versions/A/Headers/SDL_main_impl.h | 97 +- .../Versions/A/Headers/SDL_messagebox.h | 53 +- .../Versions/A/Headers/SDL_metal.h | 14 +- .../Versions/A/Headers/SDL_misc.h | 10 +- .../Versions/A/Headers/SDL_mouse.h | 310 +- .../Versions/A/Headers/SDL_mutex.h | 420 +- .../Versions/A/Headers/SDL_oldnames.h | 78 +- .../Versions/A/Headers/SDL_opengl.h | 990 ++++- .../Versions/A/Headers/SDL_opengles.h | 2 +- .../Versions/A/Headers/SDL_opengles2.h | 2 +- .../Versions/A/Headers/SDL_pen.h | 50 +- .../Versions/A/Headers/SDL_pixels.h | 696 ++- .../Versions/A/Headers/SDL_platform.h | 4 +- .../Versions/A/Headers/SDL_platform_defines.h | 386 +- .../Versions/A/Headers/SDL_power.h | 15 +- .../Versions/A/Headers/SDL_process.h | 430 ++ .../Versions/A/Headers/SDL_properties.h | 120 +- .../Versions/A/Headers/SDL_rect.h | 144 +- .../Versions/A/Headers/SDL_render.h | 1038 +++-- .../Versions/A/Headers/SDL_revision.h | 34 +- .../Versions/A/Headers/SDL_scancode.h | 13 +- .../Versions/A/Headers/SDL_sensor.h | 56 +- .../Versions/A/Headers/SDL_stdinc.h | 3524 +++++++++++++-- .../Versions/A/Headers/SDL_storage.h | 399 +- .../Versions/A/Headers/SDL_surface.h | 448 +- .../Versions/A/Headers/SDL_system.h | 365 +- .../Versions/A/Headers/SDL_thread.h | 121 +- .../Versions/A/Headers/SDL_time.h | 58 +- .../Versions/A/Headers/SDL_timer.h | 212 +- .../Versions/A/Headers/SDL_touch.h | 74 +- .../Versions/A/Headers/SDL_tray.h | 544 +++ .../Versions/A/Headers/SDL_version.h | 31 +- .../Versions/A/Headers/SDL_video.h | 1311 ++++-- .../Versions/A/Headers/SDL_vulkan.h | 71 +- .../A/Resources/CMake/SDL3Config.cmake} | 2 +- ...-version.cmake => SDL3ConfigVersion.cmake} | 0 .../Versions/A/Resources/INSTALL.md | 41 + .../Versions/A/Resources/Info.plist | 20 +- .../Versions/A/Resources/License.txt | 5 +- .../Versions/A/Resources/README.md | 17 + .../Versions/A/Resources/ReadMe.txt | 44 - .../Versions/A/Resources/compile_shaders.sh | 68 - .../Versions/A/Resources/default.metallib | Bin 25005 -> 33609 bytes .../SDL3.framework/Versions/A/SDL3 | Bin 4143448 -> 4400544 bytes .../Versions/A/_CodeSignature/CodeResources | 712 ++++ .../SDL3.framework/CMake/SDL3Config.cmake} | 2 +- ...-version.cmake => SDL3ConfigVersion.cmake} | 0 .../tvos-arm64/SDL3.framework/Headers/SDL.h | 12 +- .../SDL3.framework/Headers/SDL_assert.h | 209 +- .../SDL3.framework/Headers/SDL_asyncio.h | 546 +++ .../SDL3.framework/Headers/SDL_atomic.h | 283 +- .../SDL3.framework/Headers/SDL_audio.h | 576 ++- .../SDL3.framework/Headers/SDL_begin_code.h | 271 +- .../SDL3.framework/Headers/SDL_bits.h | 25 +- .../SDL3.framework/Headers/SDL_blendmode.h | 14 +- .../SDL3.framework/Headers/SDL_camera.h | 111 +- .../SDL3.framework/Headers/SDL_clipboard.h | 161 +- .../SDL3.framework/Headers/SDL_close_code.h | 7 +- .../SDL3.framework/Headers/SDL_copying.h | 2 +- .../SDL3.framework/Headers/SDL_cpuinfo.h | 144 +- .../SDL3.framework/Headers/SDL_dialog.h | 211 +- .../SDL3.framework/Headers/SDL_egl.h | 2 +- .../SDL3.framework/Headers/SDL_endian.h | 152 +- .../SDL3.framework/Headers/SDL_error.h | 109 +- .../SDL3.framework/Headers/SDL_events.h | 430 +- .../SDL3.framework/Headers/SDL_filesystem.h | 315 +- .../SDL3.framework/Headers/SDL_gamepad.h | 363 +- .../SDL3.framework/Headers/SDL_gpu.h | 3770 ++++++++++++----- .../SDL3.framework/Headers/SDL_guid.h | 11 +- .../SDL3.framework/Headers/SDL_haptic.h | 251 +- .../SDL3.framework/Headers/SDL_hidapi.h | 56 +- .../SDL3.framework/Headers/SDL_hints.h | 1110 ++--- .../SDL3.framework/Headers/SDL_init.h | 199 +- .../SDL3.framework/Headers/SDL_intrin.h | 258 +- .../SDL3.framework/Headers/SDL_iostream.h | 631 ++- .../SDL3.framework/Headers/SDL_joystick.h | 286 +- .../SDL3.framework/Headers/SDL_keyboard.h | 211 +- .../SDL3.framework/Headers/SDL_keycode.h | 523 +-- .../SDL3.framework/Headers/SDL_loadso.h | 47 +- .../SDL3.framework/Headers/SDL_locale.h | 12 +- .../SDL3.framework/Headers/SDL_log.h | 145 +- .../SDL3.framework/Headers/SDL_main.h | 293 +- .../SDL3.framework/Headers/SDL_main_impl.h | 97 +- .../SDL3.framework/Headers/SDL_messagebox.h | 53 +- .../SDL3.framework/Headers/SDL_metal.h | 14 +- .../SDL3.framework/Headers/SDL_misc.h | 10 +- .../SDL3.framework/Headers/SDL_mouse.h | 310 +- .../SDL3.framework/Headers/SDL_mutex.h | 420 +- .../SDL3.framework/Headers/SDL_oldnames.h | 78 +- .../SDL3.framework/Headers/SDL_opengl.h | 990 ++++- .../SDL3.framework/Headers/SDL_opengles.h | 2 +- .../SDL3.framework/Headers/SDL_opengles2.h | 2 +- .../SDL3.framework/Headers/SDL_pen.h | 50 +- .../SDL3.framework/Headers/SDL_pixels.h | 696 ++- .../SDL3.framework/Headers/SDL_platform.h | 4 +- .../Headers/SDL_platform_defines.h | 386 +- .../SDL3.framework/Headers/SDL_power.h | 15 +- .../SDL3.framework/Headers/SDL_process.h | 430 ++ .../SDL3.framework/Headers/SDL_properties.h | 120 +- .../SDL3.framework/Headers/SDL_rect.h | 144 +- .../SDL3.framework/Headers/SDL_render.h | 1038 +++-- .../SDL3.framework/Headers/SDL_revision.h | 34 +- .../SDL3.framework/Headers/SDL_scancode.h | 13 +- .../SDL3.framework/Headers/SDL_sensor.h | 56 +- .../SDL3.framework/Headers/SDL_stdinc.h | 3524 +++++++++++++-- .../SDL3.framework/Headers/SDL_storage.h | 399 +- .../SDL3.framework/Headers/SDL_surface.h | 448 +- .../SDL3.framework/Headers/SDL_system.h | 365 +- .../SDL3.framework/Headers/SDL_thread.h | 121 +- .../SDL3.framework/Headers/SDL_time.h | 58 +- .../SDL3.framework/Headers/SDL_timer.h | 212 +- .../SDL3.framework/Headers/SDL_touch.h | 74 +- .../SDL3.framework/Headers/SDL_tray.h | 544 +++ .../SDL3.framework/Headers/SDL_version.h | 31 +- .../SDL3.framework/Headers/SDL_video.h | 1311 ++++-- .../SDL3.framework/Headers/SDL_vulkan.h | 71 +- .../tvos-arm64/SDL3.framework/INSTALL.md | 41 + .../tvos-arm64/SDL3.framework/Info.plist | Bin 816 -> 811 bytes .../tvos-arm64/SDL3.framework/License.txt | 5 +- .../tvos-arm64/SDL3.framework/README.md | 17 + .../tvos-arm64/SDL3.framework/ReadMe.txt | 44 - .../tvos-arm64/SDL3.framework/SDL3 | Bin 1345064 -> 1581848 bytes .../SDL3.framework/compile_shaders.sh | 68 - .../SDL3.framework/default.metallib | Bin 26077 -> 34521 bytes .../SDL3.framework/CMake/SDL3Config.cmake | 106 + ...-version.cmake => SDL3ConfigVersion.cmake} | 0 .../SDL3.framework/CMake/sdl3-config.cmake | 106 - .../SDL3.framework/Headers/SDL.h | 12 +- .../SDL3.framework/Headers/SDL_assert.h | 209 +- .../SDL3.framework/Headers/SDL_asyncio.h | 546 +++ .../SDL3.framework/Headers/SDL_atomic.h | 283 +- .../SDL3.framework/Headers/SDL_audio.h | 576 ++- .../SDL3.framework/Headers/SDL_begin_code.h | 271 +- .../SDL3.framework/Headers/SDL_bits.h | 25 +- .../SDL3.framework/Headers/SDL_blendmode.h | 14 +- .../SDL3.framework/Headers/SDL_camera.h | 111 +- .../SDL3.framework/Headers/SDL_clipboard.h | 161 +- .../SDL3.framework/Headers/SDL_close_code.h | 7 +- .../SDL3.framework/Headers/SDL_copying.h | 2 +- .../SDL3.framework/Headers/SDL_cpuinfo.h | 144 +- .../SDL3.framework/Headers/SDL_dialog.h | 211 +- .../SDL3.framework/Headers/SDL_egl.h | 2 +- .../SDL3.framework/Headers/SDL_endian.h | 152 +- .../SDL3.framework/Headers/SDL_error.h | 109 +- .../SDL3.framework/Headers/SDL_events.h | 430 +- .../SDL3.framework/Headers/SDL_filesystem.h | 315 +- .../SDL3.framework/Headers/SDL_gamepad.h | 363 +- .../SDL3.framework/Headers/SDL_gpu.h | 3770 ++++++++++++----- .../SDL3.framework/Headers/SDL_guid.h | 11 +- .../SDL3.framework/Headers/SDL_haptic.h | 251 +- .../SDL3.framework/Headers/SDL_hidapi.h | 56 +- .../SDL3.framework/Headers/SDL_hints.h | 1110 ++--- .../SDL3.framework/Headers/SDL_init.h | 199 +- .../SDL3.framework/Headers/SDL_intrin.h | 258 +- .../SDL3.framework/Headers/SDL_iostream.h | 631 ++- .../SDL3.framework/Headers/SDL_joystick.h | 286 +- .../SDL3.framework/Headers/SDL_keyboard.h | 211 +- .../SDL3.framework/Headers/SDL_keycode.h | 523 +-- .../SDL3.framework/Headers/SDL_loadso.h | 47 +- .../SDL3.framework/Headers/SDL_locale.h | 12 +- .../SDL3.framework/Headers/SDL_log.h | 145 +- .../SDL3.framework/Headers/SDL_main.h | 293 +- .../SDL3.framework/Headers/SDL_main_impl.h | 97 +- .../SDL3.framework/Headers/SDL_messagebox.h | 53 +- .../SDL3.framework/Headers/SDL_metal.h | 14 +- .../SDL3.framework/Headers/SDL_misc.h | 10 +- .../SDL3.framework/Headers/SDL_mouse.h | 310 +- .../SDL3.framework/Headers/SDL_mutex.h | 420 +- .../SDL3.framework/Headers/SDL_oldnames.h | 78 +- .../SDL3.framework/Headers/SDL_opengl.h | 990 ++++- .../SDL3.framework/Headers/SDL_opengles.h | 2 +- .../SDL3.framework/Headers/SDL_opengles2.h | 2 +- .../SDL3.framework/Headers/SDL_pen.h | 50 +- .../SDL3.framework/Headers/SDL_pixels.h | 696 ++- .../SDL3.framework/Headers/SDL_platform.h | 4 +- .../Headers/SDL_platform_defines.h | 386 +- .../SDL3.framework/Headers/SDL_power.h | 15 +- .../SDL3.framework/Headers/SDL_process.h | 430 ++ .../SDL3.framework/Headers/SDL_properties.h | 120 +- .../SDL3.framework/Headers/SDL_rect.h | 144 +- .../SDL3.framework/Headers/SDL_render.h | 1038 +++-- .../SDL3.framework/Headers/SDL_revision.h | 34 +- .../SDL3.framework/Headers/SDL_scancode.h | 13 +- .../SDL3.framework/Headers/SDL_sensor.h | 56 +- .../SDL3.framework/Headers/SDL_stdinc.h | 3524 +++++++++++++-- .../SDL3.framework/Headers/SDL_storage.h | 399 +- .../SDL3.framework/Headers/SDL_surface.h | 448 +- .../SDL3.framework/Headers/SDL_system.h | 365 +- .../SDL3.framework/Headers/SDL_thread.h | 121 +- .../SDL3.framework/Headers/SDL_time.h | 58 +- .../SDL3.framework/Headers/SDL_timer.h | 212 +- .../SDL3.framework/Headers/SDL_touch.h | 74 +- .../SDL3.framework/Headers/SDL_tray.h | 544 +++ .../SDL3.framework/Headers/SDL_version.h | 31 +- .../SDL3.framework/Headers/SDL_video.h | 1311 ++++-- .../SDL3.framework/Headers/SDL_vulkan.h | 71 +- .../SDL3.framework/INSTALL.md | 41 + .../SDL3.framework/Info.plist | Bin 843 -> 838 bytes .../SDL3.framework/License.txt | 5 +- .../SDL3.framework/README.md | 17 + .../SDL3.framework/ReadMe.txt | 44 - .../SDL3.framework/SDL3 | Bin 2934160 -> 3480112 bytes .../_CodeSignature/CodeResources | 982 +++++ .../SDL3.framework/compile_shaders.sh | 68 - .../SDL3.framework/default.metallib | Bin 30151 -> 37843 bytes 400 files changed, 92536 insertions(+), 30625 deletions(-) rename Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/{sdl3-config.cmake => SDL3Config.cmake} (98%) rename Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/{sdl3-config-version.cmake => SDL3ConfigVersion.cmake} (100%) create mode 100644 Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_asyncio.h create mode 100644 Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_process.h create mode 100644 Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_tray.h create mode 100644 Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/INSTALL.md create mode 100644 Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/README.md delete mode 100644 Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/ReadMe.txt delete mode 100755 Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/compile_shaders.sh rename Frameworks/SDL3.xcframework/{macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/CMake/sdl3-config.cmake => ios-arm64_x86_64-simulator/SDL3.framework/CMake/SDL3Config.cmake} (98%) rename Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/CMake/{sdl3-config-version.cmake => SDL3ConfigVersion.cmake} (100%) create mode 100644 Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_asyncio.h create mode 100644 Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_process.h create mode 100644 Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_tray.h create mode 100644 Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/INSTALL.md create mode 100644 Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/README.md delete mode 100644 Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/ReadMe.txt create mode 100644 Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/_CodeSignature/CodeResources delete mode 100755 Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/compile_shaders.sh create mode 100644 Frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_asyncio.h create mode 100644 Frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_process.h create mode 100644 Frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_tray.h rename Frameworks/SDL3.xcframework/{tvos-arm64/SDL3.framework/CMake/sdl3-config.cmake => macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/CMake/SDL3Config.cmake} (98%) rename Frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/CMake/{sdl3-config-version.cmake => SDL3ConfigVersion.cmake} (100%) create mode 100644 Frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/INSTALL.md create mode 100644 Frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/README.md delete mode 100644 Frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/ReadMe.txt delete mode 100755 Frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/compile_shaders.sh create mode 100644 Frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework/Versions/A/_CodeSignature/CodeResources rename Frameworks/SDL3.xcframework/{ios-arm64_x86_64-simulator/SDL3.framework/CMake/sdl3-config.cmake => tvos-arm64/SDL3.framework/CMake/SDL3Config.cmake} (98%) rename Frameworks/SDL3.xcframework/tvos-arm64/SDL3.framework/CMake/{sdl3-config-version.cmake => SDL3ConfigVersion.cmake} (100%) create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64/SDL3.framework/Headers/SDL_asyncio.h create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64/SDL3.framework/Headers/SDL_process.h create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64/SDL3.framework/Headers/SDL_tray.h create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64/SDL3.framework/INSTALL.md create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64/SDL3.framework/README.md delete mode 100644 Frameworks/SDL3.xcframework/tvos-arm64/SDL3.framework/ReadMe.txt delete mode 100755 Frameworks/SDL3.xcframework/tvos-arm64/SDL3.framework/compile_shaders.sh create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/CMake/SDL3Config.cmake rename Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/CMake/{sdl3-config-version.cmake => SDL3ConfigVersion.cmake} (100%) delete mode 100644 Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/CMake/sdl3-config.cmake create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_asyncio.h create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_process.h create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_tray.h create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/INSTALL.md create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/README.md delete mode 100644 Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/ReadMe.txt create mode 100644 Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/_CodeSignature/CodeResources delete mode 100755 Frameworks/SDL3.xcframework/tvos-arm64_x86_64-simulator/SDL3.framework/compile_shaders.sh diff --git a/Frameworks/SDL3.xcframework/Info.plist b/Frameworks/SDL3.xcframework/Info.plist index a89f873..e4b0c2e 100644 --- a/Frameworks/SDL3.xcframework/Info.plist +++ b/Frameworks/SDL3.xcframework/Info.plist @@ -4,23 +4,6 @@ AvailableLibraries - - BinaryPath - SDL3.framework/SDL3 - LibraryIdentifier - ios-arm64_x86_64-simulator - LibraryPath - SDL3.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - ios - SupportedPlatformVariant - simulator - BinaryPath SDL3.framework/SDL3 @@ -35,6 +18,21 @@ SupportedPlatform ios + + BinaryPath + SDL3.framework/Versions/A/SDL3 + LibraryIdentifier + macos-arm64_x86_64 + LibraryPath + SDL3.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + macos + BinaryPath SDL3.framework/SDL3 @@ -68,9 +66,9 @@ BinaryPath - SDL3.framework/Versions/A/SDL3 + SDL3.framework/SDL3 LibraryIdentifier - macos-arm64_x86_64 + ios-arm64_x86_64-simulator LibraryPath SDL3.framework SupportedArchitectures @@ -79,7 +77,9 @@ x86_64 SupportedPlatform - macos + ios + SupportedPlatformVariant + simulator CFBundlePackageType diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config.cmake b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/SDL3Config.cmake similarity index 98% rename from Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config.cmake rename to Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/SDL3Config.cmake index 784d27d..03673f3 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config.cmake +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/SDL3Config.cmake @@ -59,7 +59,7 @@ if(NOT TARGET SDL3::SDL3-shared) set_target_properties(SDL3::SDL3-shared PROPERTIES FRAMEWORK "TRUE" - IMPORTED_LOCATION "${_sdl3_framework_path}/SDL3" + IMPORTED_LOCATION "${_sdl3_framework_path}" INTERFACE_LINK_LIBRARIES "SDL3::Headers" COMPATIBLE_INTERFACE_BOOL "SDL3_SHARED" INTERFACE_SDL3_SHARED "ON" diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config-version.cmake b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/SDL3ConfigVersion.cmake similarity index 100% rename from Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config-version.cmake rename to Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/SDL3ConfigVersion.cmake diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL.h index c963394..861c404 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -20,9 +20,12 @@ */ /** - * \file SDL.h + * Main include header for the SDL library, version 3.2.0 * - * Main include header for the SDL library, version 3.1.2 + * It is almost always best to include just this one header instead of + * picking out individual headers included here. There are exceptions to + * this rule--SDL_main.h is special and not included here--but usually + * letting SDL.h include the kitchen sink for you is the correct approach. */ #ifndef SDL_h_ @@ -30,6 +33,7 @@ #include #include +#include #include #include #include @@ -65,6 +69,7 @@ #include #include #include +#include #include #include #include @@ -76,6 +81,7 @@ #include #include #include +#include #include #include #include diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_assert.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_assert.h index f5f798e..09b3b47 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_assert.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_assert.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -51,9 +51,14 @@ * - It provides statistics and data on all failed assertions to the app. * - It allows the default assertion handler to be controlled with environment * variables, in case an automated script needs to control it. + * - It can be used as an aid to Clang's static analysis; it will treat SDL + * assertions as universally true (under the assumption that you are serious + * about the asserted claims and that your debug builds will detect when + * these claims were wrong). This can help the analyzer avoid false + * positives. * - * To use it: do a debug build and just sprinkle around tests to check your - * code! + * To use it: compile a debug build and just sprinkle around tests to check + * your code! */ #ifndef SDL_assert_h_ @@ -84,7 +89,7 @@ extern "C" { * - 3: Paranoid settings: All SDL assertion macros enabled, including * SDL_assert_paranoid. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ASSERT_LEVEL SomeNumberBasedOnVariousFactors @@ -113,24 +118,27 @@ extern "C" { * * If the program is not running under a debugger, SDL_TriggerBreakpoint will * likely terminate the app, possibly without warning. If the current platform - * isn't supported (SDL doesn't know how to trigger a breakpoint), this macro - * does nothing. + * isn't supported, this macro is left undefined. * - * \threadsafety It is safe to call this function from any thread. + * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner -#elif defined(_MSC_VER) +#elif defined(_MSC_VER) && _MSC_VER >= 1310 /* Don't include intrin.h here because it contains C++ code */ extern void __cdecl __debugbreak(void); #define SDL_TriggerBreakpoint() __debugbreak() +#elif defined(_MSC_VER) && defined(_M_IX86) + #define SDL_TriggerBreakpoint() { _asm { int 0x03 } } #elif defined(ANDROID) #include #define SDL_TriggerBreakpoint() assert(0) #elif SDL_HAS_BUILTIN(__builtin_debugtrap) #define SDL_TriggerBreakpoint() __builtin_debugtrap() +#elif SDL_HAS_BUILTIN(__builtin_trap) + #define SDL_TriggerBreakpoint() __builtin_trap() #elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) #elif (defined(__GNUC__) || defined(__clang__)) && defined(__riscv) @@ -147,18 +155,40 @@ extern "C" { #include #define SDL_TriggerBreakpoint() raise(SIGTRAP) #else - /* How do we trigger breakpoints on this platform? */ - #define SDL_TriggerBreakpoint() + /* SDL_TriggerBreakpoint is intentionally left undefined on unknown platforms. */ #endif -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro that reports the current function being compiled. + * + * If SDL can't figure how the compiler reports this, it will use "???". + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_FUNCTION __FUNCTION__ + +#elif 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 + +/** + * A macro that reports the current file being compiled. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_FILE __FILE__ + +/** + * A macro that reports the current line number of the file being compiled. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_LINE __LINE__ /* @@ -176,14 +206,50 @@ This also solves the problem of... disable assertions. */ +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro for wrapping code in `do {} while (0);` without compiler warnings. + * + * Visual Studio with really aggressive warnings enabled needs this to avoid + * compiler complaints. + * + * the `do {} while (0);` trick is useful for wrapping code in a macro that + * may or may not be a single statement, to avoid various C language + * accidents. + * + * To use: + * + * ```c + * do { SomethingOnce(); } while (SDL_NULL_WHILE_LOOP_CONDITION (0)); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_NULL_WHILE_LOOP_CONDITION (0) + +#elif defined(_MSC_VER) /* Avoid /W4 warnings. */ /* "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 +/** + * The macro used when an assertion is disabled. + * + * This isn't for direct use by apps, but this is the code that is inserted + * when an SDL_assert is disabled (perhaps in a release build). + * + * The code does nothing, but wraps `condition` in a sizeof operator, which + * generates no code and has no side effects, but avoid compiler warnings + * about unused variables. + * + * \param condition the condition to assert (but not actually run here). + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_disabled_assert(condition) \ do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION) @@ -198,7 +264,7 @@ disable assertions. * condition, try to break in a debugger, kill the program, or ignore the * problem). * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_AssertState { @@ -216,11 +282,11 @@ typedef enum SDL_AssertState * used by the assertion handler, then added to the assertion report. This is * returned as a linked list from SDL_GetAssertionReport(). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_AssertData { - SDL_bool always_ignore; /**< SDL_TRUE if app should always continue when assertion is triggered. */ + bool always_ignore; /**< true if app should always continue when assertion is triggered. */ unsigned int trigger_count; /**< Number of times this assertion has been triggered. */ const char *condition; /**< A string of this assert's test code. */ const char *filename; /**< The source file where this assert lives. */ @@ -232,7 +298,7 @@ typedef struct SDL_AssertData /** * Never call this directly. * - * Use the SDL_assert* macros instead. + * Use the SDL_assert macros instead. * * \param data assert data structure. * \param func function name. @@ -240,29 +306,57 @@ typedef struct SDL_AssertData * \param line line number. * \returns assert state. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *data, const char *func, const char *file, int line) SDL_ANALYZER_NORETURN; -/* Define the trigger breakpoint call used in asserts */ -#ifndef SDL_AssertBreakpoint -#if defined(ANDROID) && defined(assert) -/* Define this as empty in case assert() is defined as SDL_assert */ -#define SDL_AssertBreakpoint() -#else + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * The macro used when an assertion triggers a breakpoint. + * + * This isn't for direct use by apps; use SDL_assert or SDL_TriggerBreakpoint + * instead. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_AssertBreakpoint() SDL_TriggerBreakpoint() -#endif + +#elif !defined(SDL_AssertBreakpoint) +# if defined(ANDROID) && defined(assert) + /* Define this as empty in case assert() is defined as SDL_assert */ +# define SDL_AssertBreakpoint() +# else +# define SDL_AssertBreakpoint() SDL_TriggerBreakpoint() +# endif #endif /* !SDL_AssertBreakpoint */ -/* 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. -*/ +/** + * The macro used when an assertion is enabled. + * + * This isn't for direct use by apps, but this is the code that is inserted + * when an SDL_assert is enabled. + * + * The `do {} while(0)` avoids dangling else problems: + * + * ```c + * 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(). + * + * \param condition the condition to assert. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_enabled_assert(condition) \ do { \ while ( !(condition) ) { \ @@ -305,7 +399,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \param condition boolean value to test. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert(condition) if (assertion_enabled && (condition)) { trigger_assertion; } @@ -336,7 +432,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \param condition boolean value to test. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert_release(condition) SDL_disabled_assert(condition) @@ -363,7 +461,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \param condition boolean value to test. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) @@ -389,7 +489,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * #endif /** - * An assertion test that always performed. + * An assertion test that is always performed. * * This macro is always enabled no matter what SDL_ASSERT_LEVEL is set to. You * almost never want to use this, as it could trigger on an end-user's system, @@ -405,7 +505,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \param condition boolean value to test. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert_always(condition) SDL_enabled_assert(condition) @@ -418,7 +520,10 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * \param userdata what was passed as `userdata` to SDL_SetAssertionHandler(). * \returns an SDL_AssertState value indicating how to handle the failure. * - * \since This datatype is available since SDL 3.0.0. + * \threadsafety This callback may be called from any thread that triggers an + * assert at any time. + * + * \since This datatype is available since SDL 3.2.0. */ typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)( const SDL_AssertData *data, void *userdata); @@ -440,7 +545,9 @@ typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)( * fails or NULL for the default handler. * \param userdata a pointer that is passed to `handler`. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAssertionHandler */ @@ -459,7 +566,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetAssertionHandler( * \returns the default SDL_AssertionHandler that is called when an assert * triggers. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAssertionHandler */ @@ -482,7 +591,9 @@ extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler( * was passed to SDL_SetAssertionHandler(). * \returns the SDL_AssertionHandler that is called when an assert triggers. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAssertionHandler */ @@ -508,9 +619,15 @@ extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void ** * ``` * * \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. + * memory should not be modified or freed by the application. This + * pointer remains valid until the next call to SDL_Quit() or + * SDL_ResetAssertionReport(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. Other threads calling + * SDL_ResetAssertionReport() simultaneously, may render the + * returned pointer invalid. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResetAssertionReport */ @@ -524,7 +641,11 @@ extern SDL_DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void); * 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 3.0.0. + * \threadsafety This function is not thread safe. Other threads triggering an + * assertion, or simultaneously calling this function may cause + * memory leaks or crashes. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAssertionReport */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_asyncio.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_asyncio.h new file mode 100644 index 0000000..b36cb07 --- /dev/null +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_asyncio.h @@ -0,0 +1,546 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 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. +*/ + +/* WIKI CATEGORY: AsyncIO */ + +/** + * # CategoryAsyncIO + * + * SDL offers a way to perform I/O asynchronously. This allows an app to read + * or write files without waiting for data to actually transfer; the functions + * that request I/O never block while the request is fulfilled. + * + * Instead, the data moves in the background and the app can check for results + * at their leisure. + * + * This is more complicated than just reading and writing files in a + * synchronous way, but it can allow for more efficiency, and never having + * framerate drops as the hard drive catches up, etc. + * + * The general usage pattern for async I/O is: + * + * - Create one or more SDL_AsyncIOQueue objects. + * - Open files with SDL_AsyncIOFromFile. + * - Start I/O tasks to the files with SDL_ReadAsyncIO or SDL_WriteAsyncIO, + * putting those tasks into one of the queues. + * - Later on, use SDL_GetAsyncIOResult on a queue to see if any task is + * finished without blocking. Tasks might finish in any order with success + * or failure. + * - When all your tasks are done, close the file with SDL_CloseAsyncIO. This + * also generates a task, since it might flush data to disk! + * + * This all works, without blocking, in a single thread, but one can also wait + * on a queue in a background thread, sleeping until new results have arrived: + * + * - Call SDL_WaitAsyncIOResult from one or more threads to efficiently block + * until new tasks complete. + * - When shutting down, call SDL_SignalAsyncIOQueue to unblock any sleeping + * threads despite there being no new tasks completed. + * + * And, of course, to match the synchronous SDL_LoadFile, we offer + * SDL_LoadFileAsync as a convenience function. This will handle allocating a + * buffer, slurping in the file data, and null-terminating it; you still check + * for results later. + * + * Behind the scenes, SDL will use newer, efficient APIs on platforms that + * support them: Linux's io_uring and Windows 11's IoRing, for example. If + * those technologies aren't available, SDL will offload the work to a thread + * pool that will manage otherwise-synchronous loads without blocking the app. + * + * ## Best Practices + * + * Simple non-blocking I/O--for an app that just wants to pick up data + * whenever it's ready without losing framerate waiting on disks to spin--can + * use whatever pattern works well for the program. In this case, simply call + * SDL_ReadAsyncIO, or maybe SDL_LoadFileAsync, as needed. Once a frame, call + * SDL_GetAsyncIOResult to check for any completed tasks and deal with the + * data as it arrives. + * + * If two separate pieces of the same program need their own I/O, it is legal + * for each to create their own queue. This will prevent either piece from + * accidentally consuming the other's completed tasks. Each queue does require + * some amount of resources, but it is not an overwhelming cost. Do not make a + * queue for each task, however. It is better to put many tasks into a single + * queue. They will be reported in order of completion, not in the order they + * were submitted, so it doesn't generally matter what order tasks are + * started. + * + * One async I/O queue can be shared by multiple threads, or one thread can + * have more than one queue, but the most efficient way--if ruthless + * efficiency is the goal--is to have one queue per thread, with multiple + * threads working in parallel, and attempt to keep each queue loaded with + * tasks that are both started by and consumed by the same thread. On modern + * platforms that can use newer interfaces, this can keep data flowing as + * efficiently as possible all the way from storage hardware to the app, with + * no contention between threads for access to the same queue. + * + * Written data is not guaranteed to make it to physical media by the time a + * closing task is completed, unless SDL_CloseAsyncIO is called with its + * `flush` parameter set to true, which is to say that a successful result + * here can still result in lost data during an unfortunately-timed power + * outage if not flushed. However, flushing will take longer and may be + * unnecessary, depending on the app's needs. + */ + +#ifndef SDL_asyncio_h_ +#define SDL_asyncio_h_ + +#include + +#include +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The asynchronous I/O operation structure. + * + * This operates as an opaque handle. One can then request read or write + * operations on it. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_AsyncIOFromFile + */ +typedef struct SDL_AsyncIO SDL_AsyncIO; + +/** + * Types of asynchronous I/O tasks. + * + * \since This enum is available since SDL 3.2.0. + */ +typedef enum SDL_AsyncIOTaskType +{ + SDL_ASYNCIO_TASK_READ, /**< A read operation. */ + SDL_ASYNCIO_TASK_WRITE, /**< A write operation. */ + SDL_ASYNCIO_TASK_CLOSE /**< A close operation. */ +} SDL_AsyncIOTaskType; + +/** + * Possible outcomes of an asynchronous I/O task. + * + * \since This enum is available since SDL 3.2.0. + */ +typedef enum SDL_AsyncIOResult +{ + SDL_ASYNCIO_COMPLETE, /**< request was completed without error */ + SDL_ASYNCIO_FAILURE, /**< request failed for some reason; check SDL_GetError()! */ + SDL_ASYNCIO_CANCELED /**< request was canceled before completing. */ +} SDL_AsyncIOResult; + +/** + * Information about a completed asynchronous I/O request. + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_AsyncIOOutcome +{ + SDL_AsyncIO *asyncio; /**< what generated this task. This pointer will be invalid if it was closed! */ + SDL_AsyncIOTaskType type; /**< What sort of task was this? Read, write, etc? */ + SDL_AsyncIOResult result; /**< the result of the work (success, failure, cancellation). */ + void *buffer; /**< buffer where data was read/written. */ + Uint64 offset; /**< offset in the SDL_AsyncIO where data was read/written. */ + Uint64 bytes_requested; /**< number of bytes the task was to read/write. */ + Uint64 bytes_transferred; /**< actual number of bytes that were read/written. */ + void *userdata; /**< pointer provided by the app when starting the task */ +} SDL_AsyncIOOutcome; + +/** + * A queue of completed asynchronous I/O tasks. + * + * When starting an asynchronous operation, you specify a queue for the new + * task. A queue can be asked later if any tasks in it have completed, + * allowing an app to manage multiple pending tasks in one place, in whatever + * order they complete. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateAsyncIOQueue + * \sa SDL_ReadAsyncIO + * \sa SDL_WriteAsyncIO + * \sa SDL_GetAsyncIOResult + * \sa SDL_WaitAsyncIOResult + */ +typedef struct SDL_AsyncIOQueue SDL_AsyncIOQueue; + +/** + * Use this function to create a new SDL_AsyncIO object for reading from + * and/or writing to a named file. + * + * The `mode` string understands the following values: + * + * - "r": Open a file for reading only. It must exist. + * - "w": Open a file for writing only. It will create missing files or + * truncate existing ones. + * - "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. + * + * There is no "b" mode, as there is only "binary" style I/O, and no "a" mode + * for appending, since you specify the position when starting a task. + * + * This function supports Unicode filenames, but they must be encoded in UTF-8 + * format, regardless of the underlying operating system. + * + * This call is _not_ asynchronous; it will open the file before returning, + * under the assumption that doing so is generally a fast operation. Future + * reads and writes to the opened file will be async, however. + * + * \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_AsyncIO structure that is created or NULL on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CloseAsyncIO + * \sa SDL_ReadAsyncIO + * \sa SDL_WriteAsyncIO + */ +extern SDL_DECLSPEC SDL_AsyncIO * SDLCALL SDL_AsyncIOFromFile(const char *file, const char *mode); + +/** + * Use this function to get the size of the data stream in an SDL_AsyncIO. + * + * This call is _not_ asynchronous; it assumes that obtaining this info is a + * non-blocking operation in most reasonable cases. + * + * \param asyncio the SDL_AsyncIO to get the size of the data stream from. + * \returns the size of the data stream in the SDL_IOStream on success or a + * negative error code on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetAsyncIOSize(SDL_AsyncIO *asyncio); + +/** + * Start an async read. + * + * This function reads up to `size` bytes from `offset` position in the data + * source to the area pointed at by `ptr`. This function may read less bytes + * than requested. + * + * This function returns as quickly as possible; it does not wait for the read + * to complete. On a successful return, this work will continue in the + * background. If the work begins, even failure is asynchronous: a failing + * return value from this function only means the work couldn't start at all. + * + * `ptr` must remain available until the work is done, and may be accessed by + * the system at any time until then. Do not allocate it on the stack, as this + * might take longer than the life of the calling function to complete! + * + * An SDL_AsyncIOQueue must be specified. The newly-created task will be added + * to it when it completes its work. + * + * \param asyncio a pointer to an SDL_AsyncIO structure. + * \param ptr a pointer to a buffer to read data into. + * \param offset the position to start reading in the data source. + * \param size the number of bytes to read from the data source. + * \param queue a queue to add the new SDL_AsyncIO to. + * \param userdata an app-defined pointer that will be provided with the task + * results. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_WriteAsyncIO + * \sa SDL_CreateAsyncIOQueue + */ +extern SDL_DECLSPEC bool SDLCALL SDL_ReadAsyncIO(SDL_AsyncIO *asyncio, void *ptr, Uint64 offset, Uint64 size, SDL_AsyncIOQueue *queue, void *userdata); + +/** + * Start an async write. + * + * This function writes `size` bytes from `offset` position in the data source + * to the area pointed at by `ptr`. + * + * This function returns as quickly as possible; it does not wait for the + * write to complete. On a successful return, this work will continue in the + * background. If the work begins, even failure is asynchronous: a failing + * return value from this function only means the work couldn't start at all. + * + * `ptr` must remain available until the work is done, and may be accessed by + * the system at any time until then. Do not allocate it on the stack, as this + * might take longer than the life of the calling function to complete! + * + * An SDL_AsyncIOQueue must be specified. The newly-created task will be added + * to it when it completes its work. + * + * \param asyncio a pointer to an SDL_AsyncIO structure. + * \param ptr a pointer to a buffer to write data from. + * \param offset the position to start writing to the data source. + * \param size the number of bytes to write to the data source. + * \param queue a queue to add the new SDL_AsyncIO to. + * \param userdata an app-defined pointer that will be provided with the task + * results. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ReadAsyncIO + * \sa SDL_CreateAsyncIOQueue + */ +extern SDL_DECLSPEC bool SDLCALL SDL_WriteAsyncIO(SDL_AsyncIO *asyncio, void *ptr, Uint64 offset, Uint64 size, SDL_AsyncIOQueue *queue, void *userdata); + +/** + * Close and free any allocated resources for an async I/O object. + * + * Closing a file is _also_ an asynchronous task! If a write failure were to + * happen during the closing process, for example, the task results will + * report it as usual. + * + * Closing a file that has been written to does not guarantee the data has + * made it to physical media; it may remain in the operating system's file + * cache, for later writing to disk. This means that a successfully-closed + * file can be lost if the system crashes or loses power in this small window. + * To prevent this, call this function with the `flush` parameter set to true. + * This will make the operation take longer, and perhaps increase system load + * in general, but a successful result guarantees that the data has made it to + * physical storage. Don't use this for temporary files, caches, and + * unimportant data, and definitely use it for crucial irreplaceable files, + * like game saves. + * + * This function guarantees that the close will happen after any other pending + * tasks to `asyncio`, so it's safe to open a file, start several operations, + * close the file immediately, then check for all results later. This function + * will not block until the tasks have completed. + * + * Once this function returns true, `asyncio` is no longer valid, regardless + * of any future outcomes. Any completed tasks might still contain this + * pointer in their SDL_AsyncIOOutcome data, in case the app was using this + * value to track information, but it should not be used again. + * + * If this function returns false, the close wasn't started at all, and it's + * safe to attempt to close again later. + * + * An SDL_AsyncIOQueue must be specified. The newly-created task will be added + * to it when it completes its work. + * + * \param asyncio a pointer to an SDL_AsyncIO structure to close. + * \param flush true if data should sync to disk before the task completes. + * \param queue a queue to add the new SDL_AsyncIO to. + * \param userdata an app-defined pointer that will be provided with the task + * results. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread, but two + * threads should not attempt to close the same object. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_CloseAsyncIO(SDL_AsyncIO *asyncio, bool flush, SDL_AsyncIOQueue *queue, void *userdata); + +/** + * Create a task queue for tracking multiple I/O operations. + * + * Async I/O operations are assigned to a queue when started. The queue can be + * checked for completed tasks thereafter. + * + * \returns a new task queue object or NULL if there was an error; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_DestroyAsyncIOQueue + * \sa SDL_GetAsyncIOResult + * \sa SDL_WaitAsyncIOResult + */ +extern SDL_DECLSPEC SDL_AsyncIOQueue * SDLCALL SDL_CreateAsyncIOQueue(void); + +/** + * Destroy a previously-created async I/O task queue. + * + * If there are still tasks pending for this queue, this call will block until + * those tasks are finished. All those tasks will be deallocated. Their + * results will be lost to the app. + * + * Any pending reads from SDL_LoadFileAsync() that are still in this queue + * will have their buffers deallocated by this function, to prevent a memory + * leak. + * + * Once this function is called, the queue is no longer valid and should not + * be used, including by other threads that might access it while destruction + * is blocking on pending tasks. + * + * Do not destroy a queue that still has threads waiting on it through + * SDL_WaitAsyncIOResult(). You can call SDL_SignalAsyncIOQueue() first to + * unblock those threads, and take measures (such as SDL_WaitThread()) to make + * sure they have finished their wait and won't wait on the queue again. + * + * \param queue the task queue to destroy. + * + * \threadsafety It is safe to call this function from any thread, so long as + * no other thread is waiting on the queue with + * SDL_WaitAsyncIOResult. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_DestroyAsyncIOQueue(SDL_AsyncIOQueue *queue); + +/** + * Query an async I/O task queue for completed tasks. + * + * If a task assigned to this queue has finished, this will return true and + * fill in `outcome` with the details of the task. If no task in the queue has + * finished, this function will return false. This function does not block. + * + * If a task has completed, this function will free its resources and the task + * pointer will no longer be valid. The task will be removed from the queue. + * + * It is safe for multiple threads to call this function on the same queue at + * once; a completed task will only go to one of the threads. + * + * \param queue the async I/O task queue to query. + * \param outcome details of a finished task will be written here. May not be + * NULL. + * \returns true if a task has completed, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_WaitAsyncIOResult + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GetAsyncIOResult(SDL_AsyncIOQueue *queue, SDL_AsyncIOOutcome *outcome); + +/** + * Block until an async I/O task queue has a completed task. + * + * This function puts the calling thread to sleep until there a task assigned + * to the queue that has finished. + * + * If a task assigned to the queue has finished, this will return true and + * fill in `outcome` with the details of the task. If no task in the queue has + * finished, this function will return false. + * + * If a task has completed, this function will free its resources and the task + * pointer will no longer be valid. The task will be removed from the queue. + * + * It is safe for multiple threads to call this function on the same queue at + * once; a completed task will only go to one of the threads. + * + * Note that by the nature of various platforms, more than one waiting thread + * may wake to handle a single task, but only one will obtain it, so + * `timeoutMS` is a _maximum_ wait time, and this function may return false + * sooner. + * + * This function may return false if there was a system error, the OS + * inadvertently awoke multiple threads, or if SDL_SignalAsyncIOQueue() was + * called to wake up all waiting threads without a finished task. + * + * A timeout can be used to specify a maximum wait time, but rather than + * polling, it is possible to have a timeout of -1 to wait forever, and use + * SDL_SignalAsyncIOQueue() to wake up the waiting threads later. + * + * \param queue the async I/O task queue to wait on. + * \param outcome details of a finished task will be written here. May not be + * NULL. + * \param timeoutMS the maximum time to wait, in milliseconds, or -1 to wait + * indefinitely. + * \returns true if task has completed, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SignalAsyncIOQueue + */ +extern SDL_DECLSPEC bool SDLCALL SDL_WaitAsyncIOResult(SDL_AsyncIOQueue *queue, SDL_AsyncIOOutcome *outcome, Sint32 timeoutMS); + +/** + * Wake up any threads that are blocking in SDL_WaitAsyncIOResult(). + * + * This will unblock any threads that are sleeping in a call to + * SDL_WaitAsyncIOResult for the specified queue, and cause them to return + * from that function. + * + * This can be useful when destroying a queue to make sure nothing is touching + * it indefinitely. In this case, once this call completes, the caller should + * take measures to make sure any previously-blocked threads have returned + * from their wait and will not touch the queue again (perhaps by setting a + * flag to tell the threads to terminate and then using SDL_WaitThread() to + * make sure they've done so). + * + * \param queue the async I/O task queue to signal. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_WaitAsyncIOResult + */ +extern SDL_DECLSPEC void SDLCALL SDL_SignalAsyncIOQueue(SDL_AsyncIOQueue *queue); + +/** + * Load all the data from a file path, asynchronously. + * + * This function returns as quickly as possible; it does not wait for the read + * to complete. On a successful return, this work will continue in the + * background. If the work begins, even failure is asynchronous: a failing + * return value from this function only means the work couldn't start at all. + * + * The data is allocated with a zero byte at the end (null terminated) for + * convenience. This extra byte is not included in SDL_AsyncIOOutcome's + * bytes_transferred value. + * + * This function will allocate the buffer to contain the file. It must be + * deallocated by calling SDL_free() on SDL_AsyncIOOutcome's buffer field + * after completion. + * + * An SDL_AsyncIOQueue must be specified. The newly-created task will be added + * to it when it completes its work. + * + * \param file the path to read all available data from. + * \param queue a queue to add the new SDL_AsyncIO to. + * \param userdata an app-defined pointer that will be provided with the task + * results. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_LoadFile_IO + */ +extern SDL_DECLSPEC bool SDLCALL SDL_LoadFileAsync(const char *file, SDL_AsyncIOQueue *queue, void *userdata); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include + +#endif /* SDL_asyncio_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_atomic.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_atomic.h index f159bcd..03e3fb1 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_atomic.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_atomic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -88,15 +88,16 @@ typedef int SDL_SpinLock; * 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. + * \returns true if the lock succeeded, false if the lock is already held. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockSpinlock * \sa SDL_UnlockSpinlock */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock); /** * Lock a spin lock by setting it to a non-zero value. @@ -106,7 +107,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock); * * \param lock a pointer to a lock variable. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_TryLockSpinlock * \sa SDL_UnlockSpinlock @@ -123,7 +126,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockSpinlock(SDL_SpinLock *lock); * * \param lock a pointer to a lock variable. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockSpinlock * \sa SDL_TryLockSpinlock @@ -147,9 +152,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockSpinlock(SDL_SpinLock *lock); * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_CompilerBarrier() DoCompilerSpecificReadWriteBarrier() + #elif defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__) void _ReadWriteBarrier(void); #pragma intrinsic(_ReadWriteBarrier) @@ -166,7 +172,50 @@ extern __inline void SDL_CompilerBarrier(void); #endif /** - * Insert a memory release barrier. + * Insert a memory release barrier (function version). + * + * Please refer to SDL_MemoryBarrierRelease for details. This is a function + * version, which might be useful if you need to use this functionality from a + * scripting language, etc. Also, some of the macro versions call this + * function behind the scenes, where more heavy lifting can happen inside of + * SDL. Generally, though, an app written in C/C++/etc should use the macro + * version, as it will be more efficient. + * + * \threadsafety Obviously this function is safe to use from any thread at any + * time, but if you find yourself needing this, you are probably + * dealing with some very sensitive code; be careful! + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_MemoryBarrierRelease + */ +extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void); + +/** + * Insert a memory acquire barrier (function version). + * + * Please refer to SDL_MemoryBarrierRelease for details. This is a function + * version, which might be useful if you need to use this functionality from a + * scripting language, etc. Also, some of the macro versions call this + * function behind the scenes, where more heavy lifting can happen inside of + * SDL. Generally, though, an app written in C/C++/etc should use the macro + * version, as it will be more efficient. + * + * \threadsafety Obviously this function is safe to use from any thread at any + * time, but if you find yourself needing this, you are probably + * dealing with some very sensitive code; be careful! + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_MemoryBarrierAcquire + */ +extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void); + + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Insert a memory release barrier (macro version). * * 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. @@ -186,31 +235,47 @@ extern __inline void SDL_CompilerBarrier(void); * For more information on these semantics, take a look at the blog post: * http://preshing.com/20120913/acquire-and-release-semantics * + * This is the macro version of this functionality; if possible, SDL will use + * compiler intrinsics or inline assembly, but some platforms might need to + * call the function version of this, SDL_MemoryBarrierReleaseFunction to do + * the heavy lifting. Apps that can use the macro should favor it over the + * function. + * * \threadsafety Obviously this macro is safe to use from any thread at any * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This function is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_MemoryBarrierAcquire + * \sa SDL_MemoryBarrierReleaseFunction */ -extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void); +#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction() /** - * Insert a memory acquire barrier. + * Insert a memory acquire barrier (macro version). * - * Please refer to SDL_MemoryBarrierReleaseFunction for the details! + * Please see SDL_MemoryBarrierRelease for the details on what memory barriers + * are and when to use them. * - * \threadsafety Obviously this function is safe to use from any thread at any + * This is the macro version of this functionality; if possible, SDL will use + * compiler intrinsics or inline assembly, but some platforms might need to + * call the function version of this, SDL_MemoryBarrierAcquireFunction, to do + * the heavy lifting. Apps that can use the macro should favor it over the + * function. + * + * \threadsafety Obviously this macro is safe to use from any thread at any * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This function is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * - * \sa SDL_MemoryBarrierReleaseFunction + * \sa SDL_MemoryBarrierRelease + * \sa SDL_MemoryBarrierAcquireFunction */ -extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void); +#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction() -/* !!! FIXME: this should have documentation! */ -#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +#elif 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__) @@ -225,8 +290,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void); hard-coded at address 0xffff0fa0 */ typedef void (*SDL_KernelMemoryBarrierFunc)(); -#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() -#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() +#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() +#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() #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") @@ -276,9 +341,10 @@ typedef void (*SDL_KernelMemoryBarrierFunc)(); * * \threadsafety This macro is safe to use from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_CPUPauseInstruction() DoACPUPauseInACompilerAndArchitectureSpecificWay + #elif (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__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(__aarch64__) @@ -303,9 +369,10 @@ typedef void (*SDL_KernelMemoryBarrierFunc)(); * A type representing an atomic integer value. * * This can be used to manage a value that is synchronized across multiple - * CPUs without a race condition; when an app sets a value with SDL_AtomicSet - * all other threads, regardless of the CPU it is running on, will see that - * value when retrieved with SDL_AtomicGet, regardless of CPU caches, etc. + * CPUs without a race condition; when an app sets a value with + * SDL_SetAtomicInt all other threads, regardless of the CPU it is running on, + * will see that value when retrieved with SDL_GetAtomicInt, regardless of CPU + * caches, etc. * * This is also useful for atomic compare-and-swap operations: a thread can * change the value as long as its current value matches expectations. When @@ -316,14 +383,14 @@ typedef void (*SDL_KernelMemoryBarrierFunc)(); * this!). * * This is a struct so people don't accidentally use numeric operations on it - * directly. You have to use SDL_Atomic* functions. + * directly. You have to use SDL atomic functions. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * - * \sa SDL_AtomicCompareAndSwap - * \sa SDL_AtomicGet - * \sa SDL_AtomicSet - * \sa SDL_AtomicAdd + * \sa SDL_CompareAndSwapAtomicInt + * \sa SDL_GetAtomicInt + * \sa SDL_SetAtomicInt + * \sa SDL_AddAtomicInt */ typedef struct SDL_AtomicInt { int value; } SDL_AtomicInt; @@ -336,15 +403,16 @@ typedef struct SDL_AtomicInt { int value; } SDL_AtomicInt; * \param a a pointer to an SDL_AtomicInt 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. + * \returns true if the atomic variable was set, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicCompareAndSwapPointer + * \sa SDL_GetAtomicInt + * \sa SDL_SetAtomicInt */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwap(SDL_AtomicInt *a, int oldval, int newval); +extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicInt(SDL_AtomicInt *a, int oldval, int newval); /** * Set an atomic variable to a value. @@ -360,11 +428,11 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwap(SDL_AtomicInt *a, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicGet + * \sa SDL_GetAtomicInt */ -extern SDL_DECLSPEC int SDLCALL SDL_AtomicSet(SDL_AtomicInt *a, int v); +extern SDL_DECLSPEC int SDLCALL SDL_SetAtomicInt(SDL_AtomicInt *a, int v); /** * Get the value of an atomic variable. @@ -377,11 +445,11 @@ extern SDL_DECLSPEC int SDLCALL SDL_AtomicSet(SDL_AtomicInt *a, int v); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicSet + * \sa SDL_SetAtomicInt */ -extern SDL_DECLSPEC int SDLCALL SDL_AtomicGet(SDL_AtomicInt *a); +extern SDL_DECLSPEC int SDLCALL SDL_GetAtomicInt(SDL_AtomicInt *a); /** * Add to an atomic variable. @@ -397,12 +465,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_AtomicGet(SDL_AtomicInt *a); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AtomicDecRef * \sa SDL_AtomicIncRef */ -extern SDL_DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_AtomicInt *a, int v); +extern SDL_DECLSPEC int SDLCALL SDL_AddAtomicInt(SDL_AtomicInt *a, int v); #ifndef SDL_AtomicIncRef @@ -414,11 +482,13 @@ extern SDL_DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_AtomicInt *a, int v); * \param a a pointer to an SDL_AtomicInt to increment. * \returns the previous value of the atomic variable. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. * * \sa SDL_AtomicDecRef */ -#define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1) +#define SDL_AtomicIncRef(a) SDL_AddAtomicInt(a, 1) #endif #ifndef SDL_AtomicDecRef @@ -429,16 +499,103 @@ extern SDL_DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_AtomicInt *a, int v); * ***Note: If you don't know what this macro is for, you shouldn't use it!*** * * \param a a pointer to an SDL_AtomicInt to increment. - * \returns SDL_TRUE if the variable reached zero after decrementing, - * SDL_FALSE otherwise. + * \returns true if the variable reached zero after decrementing, false + * otherwise. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. * * \sa SDL_AtomicIncRef */ -#define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1) +#define SDL_AtomicDecRef(a) (SDL_AddAtomicInt(a, -1) == 1) #endif +/** + * A type representing an atomic unsigned 32-bit value. + * + * This can be used to manage a value that is synchronized across multiple + * CPUs without a race condition; when an app sets a value with + * SDL_SetAtomicU32 all other threads, regardless of the CPU it is running on, + * will see that value when retrieved with SDL_GetAtomicU32, regardless of CPU + * caches, etc. + * + * This is also useful for atomic compare-and-swap operations: a thread can + * change the value as long as its current value matches expectations. When + * done in a loop, one can guarantee data consistency across threads without a + * lock (but the usual warnings apply: if you don't know what you're doing, or + * you don't do it carefully, you can confidently cause any number of + * disasters with this, so in most cases, you _should_ use a mutex instead of + * this!). + * + * This is a struct so people don't accidentally use numeric operations on it + * directly. You have to use SDL atomic functions. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CompareAndSwapAtomicU32 + * \sa SDL_GetAtomicU32 + * \sa SDL_SetAtomicU32 + */ +typedef struct SDL_AtomicU32 { Uint32 value; } SDL_AtomicU32; + +/** + * 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_AtomicU32 variable to be modified. + * \param oldval the old value. + * \param newval the new value. + * \returns true if the atomic variable was set, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetAtomicU32 + * \sa SDL_SetAtomicU32 + */ +extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicU32(SDL_AtomicU32 *a, Uint32 oldval, Uint32 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_AtomicU32 variable to be modified. + * \param v the desired value. + * \returns the previous value of the atomic variable. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetAtomicU32 + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_SetAtomicU32(SDL_AtomicU32 *a, Uint32 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_AtomicU32 variable. + * \returns the current value of an atomic variable. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetAtomicU32 + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAtomicU32(SDL_AtomicU32 *a); + /** * Set a pointer to a new value if it is currently an old value. * @@ -448,17 +605,17 @@ extern SDL_DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_AtomicInt *a, int v); * \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. + * \returns true if the pointer was set, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicCompareAndSwap - * \sa SDL_AtomicGetPointer - * \sa SDL_AtomicSetPointer + * \sa SDL_CompareAndSwapAtomicInt + * \sa SDL_GetAtomicPointer + * \sa SDL_SetAtomicPointer */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwapPointer(void **a, void *oldval, void *newval); +extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicPointer(void **a, void *oldval, void *newval); /** * Set a pointer to a value atomically. @@ -472,12 +629,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwapPointer(void **a, v * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicCompareAndSwapPointer - * \sa SDL_AtomicGetPointer + * \sa SDL_CompareAndSwapAtomicPointer + * \sa SDL_GetAtomicPointer */ -extern SDL_DECLSPEC void * SDLCALL SDL_AtomicSetPointer(void **a, void *v); +extern SDL_DECLSPEC void * SDLCALL SDL_SetAtomicPointer(void **a, void *v); /** * Get the value of a pointer atomically. @@ -490,12 +647,12 @@ extern SDL_DECLSPEC void * SDLCALL SDL_AtomicSetPointer(void **a, void *v); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicCompareAndSwapPointer - * \sa SDL_AtomicSetPointer + * \sa SDL_CompareAndSwapAtomicPointer + * \sa SDL_SetAtomicPointer */ -extern SDL_DECLSPEC void * SDLCALL SDL_AtomicGetPointer(void **a); +extern SDL_DECLSPEC void * SDLCALL SDL_GetAtomicPointer(void **a); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_audio.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_audio.h index b7a4b7b..9569382 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_audio.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_audio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -33,8 +33,9 @@ * even if the data format changes on either side halfway through. * * An app opens an audio device and binds any number of audio streams to it, - * feeding more data to it as available. When the devices needs more data, it - * will pull it from all bound streams and mix them together for playback. + * feeding more data to the streams as available. When the device needs more + * data, it will pull it from all bound streams and mix them together for + * playback. * * Audio streams can also use an app-provided callback to supply data * on-demand, which maps pretty closely to the SDL2 audio model. @@ -43,6 +44,45 @@ * if you aren't reading from a file) as a basic means to load sound data into * your program. * + * ## Logical audio devices + * + * In SDL3, opening a physical device (like a SoundBlaster 16 Pro) gives you a + * logical device ID that you can bind audio streams to. In almost all cases, + * logical devices can be used anywhere in the API that a physical device is + * normally used. However, since each device opening generates a new logical + * device, different parts of the program (say, a VoIP library, or + * text-to-speech framework, or maybe some other sort of mixer on top of SDL) + * can have their own device opens that do not interfere with each other; each + * logical device will mix its separate audio down to a single buffer, fed to + * the physical device, behind the scenes. As many logical devices as you like + * can come and go; SDL will only have to open the physical device at the OS + * level once, and will manage all the logical devices on top of it + * internally. + * + * One other benefit of logical devices: if you don't open a specific physical + * device, instead opting for the default, SDL can automatically migrate those + * logical devices to different hardware as circumstances change: a user + * plugged in headphones? The system default changed? SDL can transparently + * migrate the logical devices to the correct physical device seamlessly and + * keep playing; the app doesn't even have to know it happened if it doesn't + * want to. + * + * ## Simplified audio + * + * As a simplified model for when a single source of audio is all that's + * needed, an app can use SDL_OpenAudioDeviceStream, which is a single + * function to open an audio device, create an audio stream, bind that stream + * to the newly-opened device, and (optionally) provide a callback for + * obtaining audio data. When using this function, the primary interface is + * the SDL_AudioStream and the device handle is mostly hidden away; destroying + * a stream created through this function will also close the device, stream + * bindings cannot be changed, etc. One other quirk of this is that the device + * is started in a _paused_ state and must be explicitly resumed; this is + * partially to offer a clean migration for SDL2 apps and partially because + * the app might have to do more setup before playback begins; in the + * non-simplified form, nothing will play until a stream is bound to a device, + * so they start _unpaused_. + * * ## Channel layouts * * Audio data passing through SDL is uncompressed PCM data, interleaved. One @@ -73,7 +113,7 @@ * - 4 channels (quad) layout: FL, FR, BL, BR * - 5 channels (4.1) layout: FL, FR, LFE, BL, BR * - 6 channels (5.1) layout: FL, FR, FC, LFE, BL, BR (last two can also be - * BL, BR) + * SL, SR) * - 7 channels (6.1) layout: FL, FR, FC, LFE, BC, SL, SR * - 8 channels (7.1) layout: FL, FR, FC, LFE, BL, BR, SL, SR * @@ -94,7 +134,6 @@ #include #include #include -#include #include /* Set up for C function definitions, even when using C++ */ @@ -102,19 +141,73 @@ extern "C" { #endif -/* masks for different parts of SDL_AudioFormat. */ +/** + * Mask of bits in an SDL_AudioFormat that contains the format bit size. + * + * Generally one should use SDL_AUDIO_BITSIZE instead of this macro directly. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_AUDIO_MASK_BITSIZE (0xFFu) + +/** + * Mask of bits in an SDL_AudioFormat that contain the floating point flag. + * + * Generally one should use SDL_AUDIO_ISFLOAT instead of this macro directly. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_AUDIO_MASK_FLOAT (1u<<8) + +/** + * Mask of bits in an SDL_AudioFormat that contain the bigendian flag. + * + * Generally one should use SDL_AUDIO_ISBIGENDIAN or SDL_AUDIO_ISLITTLEENDIAN + * instead of this macro directly. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_AUDIO_MASK_BIG_ENDIAN (1u<<12) + +/** + * Mask of bits in an SDL_AudioFormat that contain the signed data flag. + * + * Generally one should use SDL_AUDIO_ISSIGNED instead of this macro directly. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_AUDIO_MASK_SIGNED (1u<<15) -#define SDL_DEFINE_AUDIO_FORMAT(signed, bigendian, float, size) \ - (((Uint16)(signed) << 15) | ((Uint16)(bigendian) << 12) | ((Uint16)(float) << 8) | ((size) & SDL_AUDIO_MASK_BITSIZE)) +/** + * Define an SDL_AudioFormat value. + * + * SDL does not support custom audio formats, so this macro is not of much use + * externally, but it can be illustrative as to what the various bits of an + * SDL_AudioFormat mean. + * + * For example, SDL_AUDIO_S32LE looks like this: + * + * ```c + * SDL_DEFINE_AUDIO_FORMAT(1, 0, 0, 32) + * ``` + * + * \param signed 1 for signed data, 0 for unsigned data. + * \param bigendian 1 for bigendian data, 0 for littleendian data. + * \param flt 1 for floating point data, 0 for integer data. + * \param size number of bits per sample. + * \returns a format value in the style of SDL_AudioFormat. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_DEFINE_AUDIO_FORMAT(signed, bigendian, flt, size) \ + (((Uint16)(signed) << 15) | ((Uint16)(bigendian) << 12) | ((Uint16)(flt) << 8) | ((size) & SDL_AUDIO_MASK_BITSIZE)) /** * Audio format. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_AUDIO_BITSIZE * \sa SDL_AUDIO_BYTESIZE @@ -144,17 +237,18 @@ typedef enum SDL_AudioFormat /* SDL_DEFINE_AUDIO_FORMAT(1, 0, 1, 32), */ SDL_AUDIO_F32BE = 0x9120u, /**< As above, but big-endian byte order */ /* SDL_DEFINE_AUDIO_FORMAT(1, 1, 1, 32), */ -} SDL_AudioFormat; -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define SDL_AUDIO_S16 SDL_AUDIO_S16LE -#define SDL_AUDIO_S32 SDL_AUDIO_S32LE -#define SDL_AUDIO_F32 SDL_AUDIO_F32LE -#else -#define SDL_AUDIO_S16 SDL_AUDIO_S16BE -#define SDL_AUDIO_S32 SDL_AUDIO_S32BE -#define SDL_AUDIO_F32 SDL_AUDIO_F32BE -#endif + /* These represent the current system's byteorder. */ + #if SDL_BYTEORDER == SDL_LIL_ENDIAN + SDL_AUDIO_S16 = SDL_AUDIO_S16LE, + SDL_AUDIO_S32 = SDL_AUDIO_S32LE, + SDL_AUDIO_F32 = SDL_AUDIO_F32LE + #else + SDL_AUDIO_S16 = SDL_AUDIO_S16BE, + SDL_AUDIO_S32 = SDL_AUDIO_S32BE, + SDL_AUDIO_F32 = SDL_AUDIO_F32BE + #endif +} SDL_AudioFormat; /** @@ -167,7 +261,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_BITSIZE(x) ((x) & SDL_AUDIO_MASK_BITSIZE) @@ -181,7 +275,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_BYTESIZE(x) (SDL_AUDIO_BITSIZE(x) / 8) @@ -195,7 +289,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISFLOAT(x) ((x) & SDL_AUDIO_MASK_FLOAT) @@ -209,7 +303,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISBIGENDIAN(x) ((x) & SDL_AUDIO_MASK_BIG_ENDIAN) @@ -223,7 +317,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x)) @@ -237,7 +331,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISSIGNED(x) ((x) & SDL_AUDIO_MASK_SIGNED) @@ -251,7 +345,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x)) @@ -265,7 +359,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x)) @@ -275,7 +369,7 @@ typedef enum SDL_AudioFormat * * Zero is used to signify an invalid/null device. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_AudioDeviceID; @@ -286,7 +380,7 @@ typedef Uint32 SDL_AudioDeviceID; * to signify the app just wants the system to choose a default device instead * of the app providing a specific one. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK ((SDL_AudioDeviceID) 0xFFFFFFFFu) @@ -297,14 +391,14 @@ typedef Uint32 SDL_AudioDeviceID; * to signify the app just wants the system to choose a default device instead * of the app providing a specific one. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_DEVICE_DEFAULT_RECORDING ((SDL_AudioDeviceID) 0xFFFFFFFEu) /** * Format specifier for audio data. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_AudioFormat */ @@ -326,7 +420,7 @@ typedef struct SDL_AudioSpec * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_FRAMESIZE(x) (SDL_AUDIO_BYTESIZE((x).format) * (x).channels) @@ -350,7 +444,7 @@ typedef struct SDL_AudioSpec * more of them, bind them to an opened audio device, and feed data to them * (or for recording, consume data from them). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateAudioStream */ @@ -359,14 +453,6 @@ typedef struct SDL_AudioStream SDL_AudioStream; /* 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. * @@ -384,7 +470,7 @@ typedef struct SDL_AudioStream SDL_AudioStream; * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioDriver */ @@ -408,12 +494,11 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumAudioDrivers */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDriver(int index); -/* @} */ /** * Get the name of the current audio driver. @@ -427,7 +512,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDriver(int index); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver(void); @@ -453,7 +538,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenAudioDevice * \sa SDL_GetAudioRecordingDevices @@ -482,7 +567,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioPlaybackDevices(int * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenAudioDevice * \sa SDL_GetAudioPlaybackDevices @@ -498,11 +583,10 @@ extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioRecordingDevices(int * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioPlaybackDevices * \sa SDL_GetAudioRecordingDevices - * \sa SDL_GetDefaultAudioInfo */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDeviceName(SDL_AudioDeviceID devid); @@ -532,14 +616,14 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDeviceName(SDL_AudioDeviceI * \param spec on return, will be filled with device details. * \param sample_frames pointer to store device buffer size, in sample frames. * Can be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devid, SDL_AudioSpec *spec, int *sample_frames); +extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devid, SDL_AudioSpec *spec, int *sample_frames); /** * Get the current channel map of an audio device. @@ -558,7 +642,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -633,13 +717,52 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioDeviceChannelMap(SDL_AudioDeviceID * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseAudioDevice * \sa SDL_GetAudioDeviceFormat */ extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(SDL_AudioDeviceID devid, const SDL_AudioSpec *spec); +/** + * Determine if an audio device is physical (instead of logical). + * + * An SDL_AudioDeviceID that represents physical hardware is a physical + * device; there is one for each piece of hardware that SDL can see. Logical + * devices are created by calling SDL_OpenAudioDevice or + * SDL_OpenAudioDeviceStream, and while each is associated with a physical + * device, there can be any number of logical devices on one physical device. + * + * For the most part, logical and physical IDs are interchangeable--if you try + * to open a logical device, SDL understands to assign that effort to the + * underlying physical device, etc. However, it might be useful to know if an + * arbitrary device ID is physical or logical. This function reports which. + * + * This function may return either true or false for invalid device IDs. + * + * \param devid the device ID to query. + * \returns true if devid is a physical device, false if it is logical. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_IsAudioDevicePhysical(SDL_AudioDeviceID devid); + +/** + * Determine if an audio device is a playback device (instead of recording). + * + * This function may return either true or false for invalid device IDs. + * + * \param devid the device ID to query. + * \returns true if devid is a playback device, false if it is recording. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_IsAudioDevicePlayback(SDL_AudioDeviceID devid); + /** * Use this function to pause audio playback on a specified device. * @@ -659,17 +782,17 @@ extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(SDL_AudioDevic * created through SDL_OpenAudioDevice() can be. * * \param dev a device opened by SDL_OpenAudioDevice(). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResumeAudioDevice * \sa SDL_AudioDevicePaused */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev); +extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev); /** * Use this function to unpause audio playback on a specified device. @@ -687,17 +810,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev) * created through SDL_OpenAudioDevice() can be. * * \param dev a device opened by SDL_OpenAudioDevice(). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AudioDevicePaused * \sa SDL_PauseAudioDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResumeAudioDevice(SDL_AudioDeviceID dev); +extern SDL_DECLSPEC bool SDLCALL SDL_ResumeAudioDevice(SDL_AudioDeviceID dev); /** * Use this function to query if an audio device is paused. @@ -710,16 +833,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResumeAudioDevice(SDL_AudioDeviceID dev * IDs will report themselves as unpaused here. * * \param dev a device opened by SDL_OpenAudioDevice(). - * \returns SDL_TRUE if device is valid and paused, SDL_FALSE otherwise. + * \returns true if device is valid and paused, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PauseAudioDevice * \sa SDL_ResumeAudioDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AudioDevicePaused(SDL_AudioDeviceID dev); +extern SDL_DECLSPEC bool SDLCALL SDL_AudioDevicePaused(SDL_AudioDeviceID dev); /** * Get the gain of an audio device. @@ -738,7 +861,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AudioDevicePaused(SDL_AudioDeviceID dev * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioDeviceGain */ @@ -753,8 +876,8 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioDeviceGain(SDL_AudioDeviceID devid * Audio devices default to a gain of 1.0f (no change in output). * * Physical devices may not have their gain changed, only logical devices, and - * this function will always return -1 when used on physical devices. While it - * might seem attractive to adjust several logical devices at once in this + * this function will always return false when used on physical devices. While + * it might seem attractive to adjust several logical devices at once in this * way, it would allow an app or library to interfere with another portion of * the program's otherwise-isolated devices. * @@ -767,17 +890,17 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioDeviceGain(SDL_AudioDeviceID devid * * \param devid the audio device on which to change gain. * \param gain the gain. 1.0f is no change, 0.0f is silence. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioDeviceGain */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioDeviceGain(SDL_AudioDeviceID devid, float gain); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioDeviceGain(SDL_AudioDeviceID devid, float gain); /** * Close a previously-opened audio device. @@ -794,7 +917,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioDeviceGain(SDL_AudioDeviceID de * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenAudioDevice */ @@ -819,23 +942,23 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID devid); * Binding a stream to a device will set its output format for playback * devices, and its input format for recording devices, so they match the * device's settings. The caller is welcome to change the other end of the - * stream's format at any time. + * stream's format at any time with SDL_SetAudioStreamFormat(). * * \param devid an audio device to bind a stream to. * \param streams an array of audio streams to bind. * \param num_streams number streams listed in the `streams` array. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStreams * \sa SDL_UnbindAudioStream * \sa SDL_GetAudioStreamDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream **streams, int num_streams); +extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream * const *streams, int num_streams); /** * Bind a single audio stream to an audio device. @@ -845,18 +968,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devi * * \param devid an audio device to bind a stream to. * \param stream an audio stream to bind to a device. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStreams * \sa SDL_UnbindAudioStream * \sa SDL_GetAudioStreamDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BindAudioStream(SDL_AudioDeviceID devid, SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStream(SDL_AudioDeviceID devid, SDL_AudioStream *stream); /** * Unbind a list of audio streams from their audio devices. @@ -867,16 +990,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BindAudioStream(SDL_AudioDeviceID devid * * Unbinding a stream that isn't bound to a device is a legal no-op. * - * \param streams an array of audio streams to unbind. + * \param streams an array of audio streams to unbind. Can be NULL or contain + * NULL. * \param num_streams number streams listed in the `streams` array. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStreams */ -extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream **streams, int num_streams); +extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream * const *streams, int num_streams); /** * Unbind a single audio stream from its audio device. @@ -884,11 +1008,11 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream **stream * This is a convenience function, equivalent to calling * `SDL_UnbindAudioStreams(&stream, 1)`. * - * \param stream an audio stream to unbind from a device. + * \param stream an audio stream to unbind from a device. Can be NULL. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStream */ @@ -907,7 +1031,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStream(SDL_AudioStream *stream); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStream * \sa SDL_BindAudioStreams @@ -924,7 +1048,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_GetAudioStreamDevice(SDL_Audio * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PutAudioStreamData * \sa SDL_GetAudioStreamData @@ -943,7 +1067,9 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_Au * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_AudioStream *stream); @@ -953,17 +1079,17 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_Au * \param stream the SDL_AudioStream to query. * \param src_spec where to store the input audio format; ignored if NULL. * \param dst_spec where to store the output audio format; ignored if NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamFormat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetAudioStreamFormat(SDL_AudioStream *stream, SDL_AudioSpec *src_spec, SDL_AudioSpec *dst_spec); +extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioStreamFormat(SDL_AudioStream *stream, SDL_AudioSpec *src_spec, SDL_AudioSpec *dst_spec); /** * Change the input and output formats of an audio stream. @@ -978,23 +1104,29 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetAudioStreamFormat(SDL_AudioStream *s * next sound file, and start putting that new data while the previous sound * file is still queued, and everything will still play back correctly. * + * If a stream is bound to a device, then the format of the side of the stream + * bound to a device cannot be changed (src_spec for recording devices, + * dst_spec for playback devices). Attempts to make a change to this side will + * be ignored, but this will not report an error. The other side's format can + * be changed. + * * \param stream the stream the format is being changed. * \param src_spec the new format of the audio input; if NULL, it is not * changed. * \param dst_spec the new format of the audio output; if NULL, it is not * changed. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamFormat * \sa SDL_SetAudioStreamFrequencyRatio */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamFormat(SDL_AudioStream *stream, const SDL_AudioSpec *src_spec, const SDL_AudioSpec *dst_spec); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamFormat(SDL_AudioStream *stream, const SDL_AudioSpec *src_spec, const SDL_AudioSpec *dst_spec); /** * Get the frequency ratio of an audio stream. @@ -1006,7 +1138,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamFormat(SDL_AudioStream *s * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamFrequencyRatio */ @@ -1027,18 +1159,18 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamFrequencyRatio(SDL_AudioStre * \param stream the stream the frequency ratio is being changed. * \param ratio the frequency ratio. 1.0 is normal speed. Must be between 0.01 * and 100. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamFrequencyRatio * \sa SDL_SetAudioStreamFormat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamFrequencyRatio(SDL_AudioStream *stream, float ratio); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamFrequencyRatio(SDL_AudioStream *stream, float ratio); /** * Get the gain of an audio stream. @@ -1055,7 +1187,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamFrequencyRatio(SDL_AudioS * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamGain */ @@ -1074,17 +1206,17 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamGain(SDL_AudioStream *stream * * \param stream the stream on which the gain is being changed. * \param gain the gain. 1.0f is no change, 0.0f is silence. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamGain */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *stream, float gain); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *stream, float gain); /** * Get the current input channel map of an audio stream. @@ -1104,7 +1236,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *str * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -1128,7 +1260,7 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamInputChannelMap(SDL_AudioStr * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -1148,8 +1280,12 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioSt * channel that it should be remapped to. To reverse a stereo signal's left * and right values, you'd have an array of `{ 1, 0 }`. It is legal to remap * multiple channels to the same thing, so `{ 1, 1 }` would duplicate the - * right channel to both channels of a stereo signal. You cannot change the - * number of channels through a channel map, just reorder them. + * right channel to both channels of a stereo signal. An element in the + * channel map set to -1 instead of a valid channel will mute that channel, + * setting it to a silence value. + * + * You cannot change the number of channels through a channel map, just + * reorder/mute them. * * Data that was previously queued in the stream will still be operated on in * the order that was current when it was added, which is to say you can put @@ -1164,26 +1300,31 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioSt * after this call. * * If `count` is not equal to the current number of channels in the audio - * stream's format, this will fail. This is a safety measure to make sure a a - * race condition hasn't changed the format while you this call is setting the + * stream's format, this will fail. This is a safety measure to make sure a + * race condition hasn't changed the format while this call is setting the * channel map. * + * Unlike attempting to change the stream's format, the input channel map on a + * stream bound to a recording device is permitted to change at any time; any + * data added to the stream from the device after this call will have the new + * mapping, but previously-added data will still have the prior mapping. + * * \param stream the SDL_AudioStream to change. * \param chmap the new channel map, NULL to reset to default. * \param count The number of channels in the map. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. Don't change the * stream's format to have a different number of channels from a * a different thread at the same time, though! * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStream *stream, const int *chmap, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStream *stream, const int *chmap, int count); /** * Set the current output channel map of an audio stream. @@ -1194,12 +1335,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_Audio * The output channel map reorders data that leaving a stream via * SDL_GetAudioStreamData. * - * Each item in the array represents an output channel, and its value is the + * Each item in the array represents an input channel, and its value is the * channel that it should be remapped to. To reverse a stereo signal's left * and right values, you'd have an array of `{ 1, 0 }`. It is legal to remap * multiple channels to the same thing, so `{ 1, 1 }` would duplicate the - * right channel to both channels of a stereo signal. You cannot change the - * number of channels through a channel map, just reorder them. + * right channel to both channels of a stereo signal. An element in the + * channel map set to -1 instead of a valid channel will mute that channel, + * setting it to a silence value. + * + * You cannot change the number of channels through a channel map, just + * reorder/mute them. * * The output channel map can be changed at any time, as output remapping is * applied during SDL_GetAudioStreamData. @@ -1211,26 +1356,33 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_Audio * after this call. * * If `count` is not equal to the current number of channels in the audio - * stream's format, this will fail. This is a safety measure to make sure a a - * race condition hasn't changed the format while you this call is setting the + * stream's format, this will fail. This is a safety measure to make sure a + * race condition hasn't changed the format while this call is setting the * channel map. * + * Unlike attempting to change the stream's format, the output channel map on + * a stream bound to a recording device is permitted to change at any time; + * any data added to the stream after this call will have the new mapping, but + * previously-added data will still have the prior mapping. When the channel + * map doesn't match the hardware's channel layout, SDL will convert the data + * before feeding it to the device for playback. + * * \param stream the SDL_AudioStream to change. * \param chmap the new channel map, NULL to reset to default. * \param count The number of channels in the map. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. Don't change the * stream's format to have a different number of channels from a * a different thread at the same time, though! * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_AudioStream *stream, const int *chmap, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_AudioStream *stream, const int *chmap, int count); /** * Add data to the stream. @@ -1246,21 +1398,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_Audi * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, but if the * stream has a callback set, the caller might need to manage * extra locking. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearAudioStream * \sa SDL_FlushAudioStream * \sa SDL_GetAudioStreamData * \sa SDL_GetAudioStreamQueued */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *stream, const void *buf, int len); +extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *stream, const void *buf, int len); /** * Get converted/resampled data from the stream. @@ -1284,7 +1436,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *str * stream has a callback set, the caller might need to manage * extra locking. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearAudioStream * \sa SDL_GetAudioStreamAvailable @@ -1311,7 +1463,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamData(SDL_AudioStream *stream, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamData * \sa SDL_PutAudioStreamData @@ -1322,6 +1474,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamAvailable(SDL_AudioStream *str /** * Get the number of bytes currently queued. * + * This is the number of bytes put into a stream as input, not the number that + * can be retrieved as output. Because of several details, it's not possible + * to calculate one number directly from the other. If you need to know how + * much usable data can be retrieved right now, you should use + * SDL_GetAudioStreamAvailable() and not this function. + * * Note that audio streams can change their input format at any time, even if * there is still data queued in a different format, so the returned byte * count will not necessarily match the number of _sample frames_ available. @@ -1344,7 +1502,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamAvailable(SDL_AudioStream *str * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PutAudioStreamData * \sa SDL_ClearAudioStream @@ -1361,16 +1519,16 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamQueued(SDL_AudioStream *stream * input, so the complete output becomes available. * * \param stream the audio stream to flush. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PutAudioStreamData */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlushAudioStream(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_FlushAudioStream(SDL_AudioStream *stream); /** * Clear any pending data in the stream. @@ -1379,19 +1537,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlushAudioStream(SDL_AudioStream *strea * stream until more is added. * * \param stream the audio stream to clear. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamAvailable * \sa SDL_GetAudioStreamData * \sa SDL_GetAudioStreamQueued * \sa SDL_PutAudioStreamData */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearAudioStream(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearAudioStream(SDL_AudioStream *stream); /** * Use this function to pause audio playback on the audio device associated @@ -1406,16 +1564,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearAudioStream(SDL_AudioStream *strea * loading, etc. * * \param stream the audio stream associated with the audio device to pause. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResumeAudioStreamDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream *stream); /** * Use this function to unpause audio playback on the audio device associated @@ -1426,16 +1584,36 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream * to progress again, and audio can be generated. * * \param stream the audio stream associated with the audio device to resume. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PauseAudioStreamDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResumeAudioStreamDevice(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_ResumeAudioStreamDevice(SDL_AudioStream *stream); + +/** + * Use this function to query if an audio device associated with a stream is + * paused. + * + * Unlike in SDL2, audio devices start in an _unpaused_ state, since an app + * has to bind a stream before any audio will flow. + * + * \param stream the audio stream associated with the audio device to query. + * \returns true if device is valid and paused, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_PauseAudioStreamDevice + * \sa SDL_ResumeAudioStreamDevice + */ +extern SDL_DECLSPEC bool SDLCALL SDL_AudioStreamDevicePaused(SDL_AudioStream *stream); + /** * Lock an audio stream for serialized access. @@ -1454,16 +1632,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResumeAudioStreamDevice(SDL_AudioStream * all the same attributes (recursive locks are allowed, etc). * * \param stream the audio stream to lock. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UnlockAudioStream */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockAudioStream(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_LockAudioStream(SDL_AudioStream *stream); /** @@ -1472,17 +1650,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockAudioStream(SDL_AudioStream *stream * This unlocks an audio stream after a call to SDL_LockAudioStream. * * \param stream the audio stream to unlock. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety You should only call this from the same thread that * previously called SDL_LockAudioStream. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockAudioStream */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UnlockAudioStream(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_UnlockAudioStream(SDL_AudioStream *stream); /** * A callback that fires when data passes through an SDL_AudioStream. @@ -1519,7 +1697,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UnlockAudioStream(SDL_AudioStream *stre * is called, so your callback does not need to manage the lock * explicitly. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamGetCallback * \sa SDL_SetAudioStreamPutCallback @@ -1561,16 +1739,16 @@ typedef void (SDLCALL *SDL_AudioStreamCallback)(void *userdata, SDL_AudioStream * from the stream. * \param userdata an opaque pointer provided to the callback for its own * personal use. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. This only fails if `stream` is NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. This only fails if `stream` is NULL. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamPutCallback */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStream *stream, SDL_AudioStreamCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStream *stream, SDL_AudioStreamCallback callback, void *userdata); /** * Set a callback that runs when data is added to an audio stream. @@ -1610,16 +1788,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStre * stream. * \param userdata an opaque pointer provided to the callback for its own * personal use. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. This only fails if `stream` is NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. This only fails if `stream` is NULL. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamGetCallback */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamPutCallback(SDL_AudioStream *stream, SDL_AudioStreamCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamPutCallback(SDL_AudioStream *stream, SDL_AudioStreamCallback callback, void *userdata); /** @@ -1637,7 +1815,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamPutCallback(SDL_AudioStre * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateAudioStream */ @@ -1699,7 +1877,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyAudioStream(SDL_AudioStream *stream) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamDevice * \sa SDL_ResumeAudioStreamDevice @@ -1737,7 +1915,7 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_OpenAudioDeviceStream(SDL_Audi * application is responsible for locking resources the callback * touches that need to be protected. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetAudioPostmixCallback */ @@ -1788,14 +1966,14 @@ typedef void (SDLCALL *SDL_AudioPostmixCallback)(void *userdata, const SDL_Audio * \param devid the ID of an opened audio device. * \param callback a callback function to be called. Can be NULL. * \param userdata app-controlled pointer passed to callback. Can be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDeviceID devid, SDL_AudioPostmixCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDeviceID devid, SDL_AudioPostmixCallback callback, void *userdata); /** @@ -1839,7 +2017,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDevice * Example: * * ```c - * SDL_LoadWAV_IO(SDL_IOFromFile("sample.wav", "rb"), 1, &spec, &buf, &len); + * SDL_LoadWAV_IO(SDL_IOFromFile("sample.wav", "rb"), true, &spec, &buf, &len); * ``` * * Note that the SDL_LoadWAV function does this same thing for you, but in a @@ -1850,19 +2028,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDevice * ``` * * \param src the data source for the WAVE data. - * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning, - * even in the case of an error. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. * \param spec a pointer to an SDL_AudioSpec that will be set to the WAVE * data's format details on successful return. * \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 SDL_TRUE on success. `audio_buf` will be filled with a pointer to - * an allocated buffer containing the audio data, and `audio_len` is + * \returns true on success. `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 SDL_FALSE if the .WAV file cannot be opened, + * This function returns false if the .WAV file cannot be opened, * uses an unknown data format, or is corrupt; call SDL_GetError() * for more information. * @@ -1871,12 +2049,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDevice * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_free * \sa SDL_LoadWAV */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, SDL_bool closeio, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); +extern SDL_DECLSPEC bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, bool closeio, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); /** * Loads a WAV from a file path. @@ -1884,7 +2062,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, SDL_bool * This is a convenience function that is effectively the same as: * * ```c - * SDL_LoadWAV_IO(SDL_IOFromFile(path, "rb"), SDL_TRUE, spec, audio_buf, audio_len); + * SDL_LoadWAV_IO(SDL_IOFromFile(path, "rb"), true, spec, audio_buf, audio_len); * ``` * * \param path the file path of the WAV file to open. @@ -1894,11 +2072,11 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, SDL_bool * function. * \param audio_len a pointer filled with the length of the audio data buffer * in bytes. - * \returns SDL_TRUE on success. `audio_buf` will be filled with a pointer to - * an allocated buffer containing the audio data, and `audio_len` is + * \returns true on success. `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 SDL_FALSE if the .WAV file cannot be opened, + * This function returns false if the .WAV file cannot be opened, * uses an unknown data format, or is corrupt; call SDL_GetError() * for more information. * @@ -1907,12 +2085,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, SDL_bool * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_free * \sa SDL_LoadWAV_IO */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV(const char *path, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); +extern SDL_DECLSPEC bool SDLCALL SDL_LoadWAV(const char *path, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); /** * Mix audio data in a specified format. @@ -1941,14 +2119,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV(const char *path, SDL_AudioSpec * \param len the length of the audio buffer in bytes. * \param volume ranges from 0.0 - 1.0, and should be set to 1.0 for full * audio volume. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, SDL_AudioFormat format, Uint32 len, float volume); +extern SDL_DECLSPEC bool SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, SDL_AudioFormat format, Uint32 len, float volume); /** * Convert some audio data of one format to another format. @@ -1971,14 +2149,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, * which should be freed with SDL_free(). On error, it will be * NULL. * \param dst_len will be filled with the len of dst_data. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec *src_spec, const Uint8 *src_data, int src_len, const SDL_AudioSpec *dst_spec, Uint8 **dst_data, int *dst_len); +extern SDL_DECLSPEC bool SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec *src_spec, const Uint8 *src_data, int src_len, const SDL_AudioSpec *dst_spec, Uint8 **dst_data, int *dst_len); /** * Get the human readable name of an audio format. @@ -1989,7 +2167,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioFormatName(SDL_AudioFormat format); @@ -2005,7 +2183,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioFormatName(SDL_AudioFormat * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSilenceValueForFormat(SDL_AudioFormat format); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_begin_code.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_begin_code.h index f418c61..a6b47cf 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_begin_code.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_begin_code.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,9 +22,15 @@ /* WIKI CATEGORY: BeginCode */ /** - * SDL_begin_code.h 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. :) + * # CategoryBeginCode + * + * `SDL_begin_code.h` 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. :) + * + * SDL's headers use this; applications generally should not include this + * header directly. */ /* This shouldn't be nested -- included it around code only. */ @@ -33,6 +39,259 @@ #endif #define SDL_begin_code_h +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro to tag a symbol as deprecated. + * + * A function is marked deprecated by adding this macro to its declaration: + * + * ```c + * extern SDL_DEPRECATED int ThisFunctionWasABadIdea(void); + * ``` + * + * Compilers with deprecation support can give a warning when a deprecated + * function is used. This symbol may be used in SDL's headers, but apps are + * welcome to use it for their own interfaces as well. + * + * SDL, on occasion, might deprecate a function for various reasons. However, + * SDL never removes symbols before major versions, so deprecated interfaces + * in SDL3 will remain available until SDL4, where it would be expected an app + * would have to take steps to migrate anyhow. + * + * On compilers without a deprecation mechanism, this is defined to nothing, + * and using a deprecated function will not generate a warning. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_DEPRECATED __attribute__((deprecated)) + +/** + * A macro to tag a symbol as a public API. + * + * SDL uses this macro for all its public functions. On some targets, it is + * used to signal to the compiler that this function needs to be exported from + * a shared library, but it might have other side effects. + * + * This symbol is used in SDL's headers, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_DECLSPEC __attribute__ ((visibility("default"))) + +/** + * A macro to set a function's calling conventions. + * + * SDL uses this macro for all its public functions, and any callbacks it + * defines. This macro guarantees that calling conventions match between SDL + * and the app, even if the two were built with different compilers or + * optimization settings. + * + * When writing a callback function, it is very important for it to be + * correctly tagged with SDLCALL, as mismatched calling conventions can cause + * strange behaviors and can be difficult to diagnose. Plus, on many + * platforms, SDLCALL is defined to nothing, so compilers won't be able to + * warn that the tag is missing. + * + * This symbol is used in SDL's headers, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDLCALL __cdecl + +/** + * A macro to request a function be inlined. + * + * This is a hint to the compiler to inline a function. The compiler is free + * to ignore this request. On compilers without inline support, this is + * defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_INLINE __inline + +/** + * A macro to demand a function be inlined. + * + * This is a command to the compiler to inline a function. SDL uses this macro + * in its public headers for a handful of simple functions. On compilers + * without forceinline support, this is defined to `static SDL_INLINE`, which + * is often good enough. + * + * This symbol is used in SDL's headers, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_FORCE_INLINE __forceinline + +/** + * A macro to tag a function as never-returning. + * + * This is a hint to the compiler that a function does not return. An example + * of a function like this is the C runtime's exit() function. + * + * This hint can lead to code optimizations, and help analyzers understand + * code flow better. On compilers without noreturn support, this is defined to + * nothing. + * + * This symbol is used in SDL's headers, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_NORETURN __attribute__((noreturn)) + +/** + * A macro to tag a function as never-returning (for analysis purposes). + * + * This is almost identical to SDL_NORETURN, except functions marked with this + * _can_ actually return. The difference is that this isn't used for code + * generation, but rather static analyzers use this information to assume + * truths about program state and available code paths. Specifically, this tag + * is useful for writing an assertion mechanism. Indeed, SDL_assert uses this + * tag behind the scenes. Generally, apps that don't understand the specific + * use-case for this tag should avoid using it directly. + * + * On compilers without analyzer_noreturn support, this is defined to nothing. + * + * This symbol is used in SDL's headers, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ANALYZER_NORETURN __attribute__((analyzer_noreturn)) + + +/** + * A macro to signal that a case statement without a `break` is intentional. + * + * C compilers have gotten more aggressive about warning when a switch's + * `case` block does not end with a `break` or other flow control statement, + * flowing into the next case's code, as this is a common accident that leads + * to strange bugs. But sometimes falling through to the next case is the + * correct and desired behavior. This symbol lets an app communicate this + * intention to the compiler, so it doesn't generate a warning. + * + * It is used like this: + * + * ```c + * switch (x) { + * case 1: + * DoSomethingOnlyForOne(); + * SDL_FALLTHROUGH; // tell the compiler this was intentional. + * case 2: + * DoSomethingForOneAndTwo(); + * break; + * } + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_FALLTHROUGH [[fallthrough]] + +/** + * A macro to tag a function's return value as critical. + * + * This is a hint to the compiler that a function's return value should not be + * ignored. + * + * If an NODISCARD function's return value is thrown away (the function is + * called as if it returns `void`), the compiler will issue a warning. + * + * While it's generally good practice to check return values for errors, often + * times legitimate programs do not for good reasons. Be careful about what + * functions are tagged as NODISCARD. It operates best when used on a function + * that's failure is surprising and catastrophic; a good example would be a + * program that checks the return values of all its file write function calls + * but not the call to close the file, which it assumes incorrectly never + * fails. + * + * Function callers that want to throw away a NODISCARD return value can call + * the function with a `(void)` cast, which informs the compiler the act is + * intentional. + * + * On compilers without nodiscard support, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_NODISCARD [[nodiscard]] + +/** + * A macro to tag a function as an allocator. + * + * This is a hint to the compiler that a function is an allocator, like + * malloc(), with certain rules. A description of how GCC treats this hint is + * here: + * + * https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute + * + * On compilers without allocator tag support, this is defined to nothing. + * + * Most apps don't need to, and should not, use this directly. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_MALLOC __declspec(allocator) __desclspec(restrict) + +/** + * A macro to tag a function as returning a certain allocation. + * + * This is a hint to the compiler that a function allocates and returns a + * specific amount of memory based on one of its arguments. For example, the C + * runtime's malloc() function could use this macro with an argument of 1 + * (first argument to malloc is the size of the allocation). + * + * On compilers without alloc_size support, this is defined to nothing. + * + * Most apps don't need to, and should not, use this directly. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ALLOC_SIZE(p) __attribute__((alloc_size(p))) + +/** + * A macro to tag a pointer variable, to help with pointer aliasing. + * + * A good explanation of the restrict keyword is here: + * + * https://en.wikipedia.org/wiki/Restrict + * + * On compilers without restrict support, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_RESTRICT __restrict__ + +/** + * Check if the compiler supports a given builtin functionality. + * + * This allows preprocessor checks for things that otherwise might fail to + * compile. + * + * Supported by virtually all clang versions and more-recent GCCs. Use this + * instead of checking the clang version if possible. + * + * On compilers without has_builtin support, this is defined to 0 (always + * false). + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_HAS_BUILTIN(x) __has_builtin(x) + +/* end of wiki documentation section. */ +#endif + +#ifndef SDL_HAS_BUILTIN +#ifdef __has_builtin +#define SDL_HAS_BUILTIN(x) __has_builtin(x) +#else +#define SDL_HAS_BUILTIN(x) 0 +#endif +#endif + #ifndef SDL_DEPRECATED # if defined(__GNUC__) && (__GNUC__ >= 4) /* technically, this arrived in gcc 3.1, but oh well. */ # define SDL_DEPRECATED __attribute__((deprecated)) @@ -53,7 +312,7 @@ /* Some compilers use a special export keyword */ #ifndef SDL_DECLSPEC -# if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINRT) || defined(SDL_PLATFORM_CYGWIN) || defined(SDL_PLATFORM_GDK) +# if defined(SDL_PLATFORM_WINDOWS) # ifdef DLL_EXPORT # define SDL_DECLSPEC __declspec(dllexport) # else @@ -70,7 +329,7 @@ /* By default SDL uses the C calling convention */ #ifndef SDLCALL -#if (defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINRT) || defined(SDL_PLATFORM_GDK)) && !defined(__GNUC__) +#if defined(SDL_PLATFORM_WINDOWS) && !defined(__GNUC__) #define SDLCALL __cdecl #else #define SDLCALL diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_bits.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_bits.h index 72be082..7435ce6 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_bits.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_bits.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -36,10 +36,6 @@ extern "C" { #endif -/** - * \file SDL_bits.h - */ - #if defined(__WATCOMC__) && defined(__386__) extern __inline int _SDL_bsr_watcom(Uint32); #pragma aux _SDL_bsr_watcom = \ @@ -65,7 +61,7 @@ extern __inline int _SDL_bsr_watcom(Uint32); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) { @@ -82,10 +78,10 @@ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) return -1; } return _SDL_bsr_watcom(x); -#elif defined(_MSC_VER) +#elif defined(_MSC_VER) && _MSC_VER >= 1400 unsigned long index; if (_BitScanReverse(&index, x)) { - return index; + return (int)index; } return -1; #else @@ -120,8 +116,7 @@ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) * Determine if a unsigned 32-bit value has exactly one bit set. * * If there are no bits set (`x` is zero), or more than one bit set, this - * returns SDL_FALSE. If any one bit is exclusively set, this returns - * SDL_TRUE. + * returns false. If any one bit is exclusively set, this returns true. * * Note that this is a forced-inline function in a header, and not a public * API function available in the SDL library (which is to say, the code is @@ -129,18 +124,18 @@ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) * be able to find this function inside SDL itself). * * \param x the 32-bit value to examine. - * \returns SDL_TRUE if exactly one bit is set in `x`, SDL_FALSE otherwise. + * \returns true if exactly one bit is set in `x`, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_HasExactlyOneBitSet32(Uint32 x) +SDL_FORCE_INLINE bool SDL_HasExactlyOneBitSet32(Uint32 x) { if (x && !(x & (x - 1))) { - return SDL_TRUE; + return true; } - return SDL_FALSE; + return false; } /* Ends C function definitions when using C++ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_blendmode.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_blendmode.h index 76aa197..8f00cbc 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_blendmode.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_blendmode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -24,7 +24,7 @@ * * Blend modes decide how two colors will mix together. There are both * standard modes for basic needs and a means to create custom modes, - * dictating what sort of math to do what on what color components. + * dictating what sort of math to do on what color components. */ #ifndef SDL_blendmode_h_ @@ -45,7 +45,7 @@ extern "C" { * * Additional values may be obtained from SDL_ComposeCustomBlendMode. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_ComposeCustomBlendMode */ @@ -64,7 +64,7 @@ typedef Uint32 SDL_BlendMode; * The blend operation used when combining source and destination pixel * components. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_BlendOperation { @@ -83,7 +83,7 @@ typedef enum SDL_BlendOperation * operation. The comma-separated factors listed above are always applied in * the component order red, green, blue, and alpha. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_BlendFactor { @@ -177,7 +177,9 @@ typedef enum SDL_BlendFactor * \returns an SDL_BlendMode that represents the chosen factors and * operations. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawBlendMode * \sa SDL_GetRenderDrawBlendMode diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_camera.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_camera.h index 3d4c57e..c4d0596 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_camera.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_camera.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -28,13 +28,51 @@ * devices can be enumerated, queried, and opened. Once opened, it will * provide SDL_Surface objects as new frames of video come in. These surfaces * can be uploaded to an SDL_Texture or processed as pixels in memory. + * + * Several platforms will alert the user if an app tries to access a camera, + * and some will present a UI asking the user if your application should be + * allowed to obtain images at all, which they can deny. A successfully opened + * camera will not provide images until permission is granted. Applications, + * after opening a camera device, can see if they were granted access by + * either polling with the SDL_GetCameraPermissionState() function, or waiting + * for an SDL_EVENT_CAMERA_DEVICE_APPROVED or SDL_EVENT_CAMERA_DEVICE_DENIED + * event. Platforms that don't have any user approval process will report + * approval immediately. + * + * Note that SDL cameras only provide video as individual frames; they will + * not provide full-motion video encoded in a movie file format, although an + * app is free to encode the acquired frames into any format it likes. It also + * does not provide audio from the camera hardware through this API; not only + * do many webcams not have microphones at all, many people--from streamers to + * people on Zoom calls--will want to use a separate microphone regardless of + * the camera. In any case, recorded audio will be available through SDL's + * audio API no matter what hardware provides the microphone. + * + * ## Camera gotchas + * + * Consumer-level camera hardware tends to take a little while to warm up, + * once the device has been opened. Generally most camera apps have some sort + * of UI to take a picture (a button to snap a pic while a preview is showing, + * some sort of multi-second countdown for the user to pose, like a photo + * booth), which puts control in the users' hands, or they are intended to + * stay on for long times (Pokemon Go, etc). + * + * It's not uncommon that a newly-opened camera will provide a couple of + * completely black frames, maybe followed by some under-exposed images. If + * taking a single frame automatically, or recording video from a camera's + * input without the user initiating it from a preview, it could be wise to + * drop the first several frames (if not the first several _seconds_ worth of + * frames!) before using images from a camera. */ #ifndef SDL_camera_h_ #define SDL_camera_h_ +#include #include -#include +#include +#include +#include #include /* Set up for C function definitions, even when using C++ */ @@ -50,7 +88,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetCameras */ @@ -59,7 +97,7 @@ typedef Uint32 SDL_CameraID; /** * The opaque structure used to identify an opened SDL camera. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Camera SDL_Camera; @@ -69,7 +107,7 @@ typedef struct SDL_Camera SDL_Camera; * Cameras often support multiple formats; each one will be encapsulated in * this struct. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetCameraSupportedFormats * \sa SDL_GetCameraFormat @@ -87,7 +125,7 @@ typedef struct SDL_CameraSpec /** * The position of camera in relation to system device. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetCameraPosition */ @@ -116,7 +154,7 @@ typedef enum SDL_CameraPosition * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameraDriver */ @@ -140,7 +178,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumCameraDrivers(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumCameraDrivers */ @@ -158,7 +196,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraDriver(int index); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void); @@ -173,7 +211,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera */ @@ -211,7 +249,7 @@ extern SDL_DECLSPEC SDL_CameraID * SDLCALL SDL_GetCameras(int *count); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras * \sa SDL_OpenCamera @@ -227,7 +265,7 @@ extern SDL_DECLSPEC SDL_CameraSpec ** SDLCALL SDL_GetCameraSupportedFormats(SDL_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras */ @@ -246,7 +284,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraName(SDL_CameraID instance * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras */ @@ -265,7 +303,7 @@ extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraI * * You can call SDL_GetCameraFormat() to get the actual data format if passing * a NULL spec here. You can see the exact specs a device can support without - * conversion with SDL_GetCameraSupportedSpecs(). + * conversion with SDL_GetCameraSupportedFormats(). * * SDL will not attempt to emulate framerate; it will try to set the hardware * to the rate closest to the requested speed, but it won't attempt to limit @@ -278,10 +316,11 @@ extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraI * the camera, and they can choose Yes or No at that point. Until they do, the * camera will not be usable. The app should either wait for an * SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, - * or poll SDL_IsCameraApproved() occasionally until it returns non-zero. On - * platforms that don't require explicit user approval (and perhaps in places - * where the user previously permitted access), the approval event might come - * immediately, but it might come seconds, minutes, or hours later! + * or poll SDL_GetCameraPermissionState() occasionally until it returns + * non-zero. On platforms that don't require explicit user approval (and + * perhaps in places where the user previously permitted access), the approval + * event might come immediately, but it might come seconds, minutes, or hours + * later! * * \param instance_id the camera device instance ID. * \param spec the desired format for data the device will provide. Can be @@ -291,7 +330,7 @@ extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraI * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras * \sa SDL_GetCameraFormat @@ -324,7 +363,7 @@ extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera * \sa SDL_CloseCamera @@ -340,7 +379,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera */ @@ -355,7 +394,7 @@ extern SDL_DECLSPEC SDL_CameraID SDLCALL SDL_GetCameraID(SDL_Camera *camera); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera *camera); @@ -366,23 +405,24 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera * be converting to this format behind the scenes. * * If the system is waiting for the user to approve access to the camera, as - * some platforms require, this will return SDL_FALSE, but this isn't - * necessarily a fatal error; you should either wait for an + * some platforms require, this will return false, but this isn't necessarily + * a fatal error; you should either wait for an * SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, - * or poll SDL_IsCameraApproved() occasionally until it returns non-zero. + * or poll SDL_GetCameraPermissionState() occasionally until it returns + * non-zero. * * \param camera opened camera device. * \param spec the SDL_CameraSpec to be initialized by this function. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL_CameraSpec *spec); +extern SDL_DECLSPEC bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL_CameraSpec *spec); /** * Acquire a frame. @@ -404,14 +444,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL * After use, the frame should be released with SDL_ReleaseCameraFrame(). If * you don't do this, the system may stop providing more video! * - * Do not call SDL_FreeSurface() on the returned surface! It must be given + * Do not call SDL_DestroySurface() on the returned surface! It must be given * back to the camera subsystem with SDL_ReleaseCameraFrame! * * If the system is waiting for the user to approve access to the camera, as * some platforms require, this will return NULL (no frames available); you * should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or - * SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll SDL_IsCameraApproved() - * occasionally until it returns non-zero. + * SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll + * SDL_GetCameraPermissionState() occasionally until it returns non-zero. * * \param camera opened camera device. * \param timestampNS a pointer filled in with the frame's timestamp, or 0 on @@ -421,7 +461,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ReleaseCameraFrame */ @@ -449,7 +489,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_AcquireCameraFrame(SDL_Camera *cam * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AcquireCameraFrame */ @@ -464,9 +504,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseCameraFrame(SDL_Camera *camera, SDL_ * \threadsafety It is safe to call this function from any thread, but no * thread may reference `device` once this function is called. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_OpenCameraWithSpec * \sa SDL_OpenCamera */ extern SDL_DECLSPEC void SDLCALL SDL_CloseCamera(SDL_Camera *camera); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_clipboard.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_clipboard.h index 4d4ae32..0d3cbb4 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_clipboard.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_clipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -26,6 +26,51 @@ * from other processes and publishing information of its own. * * This is not just text! SDL apps can access and publish data by mimetype. + * + * ## Basic use (text) + * + * Obtaining and publishing simple text to the system clipboard is as easy as + * calling SDL_GetClipboardText() and SDL_SetClipboardText(), respectively. + * These deal with C strings in UTF-8 encoding. Data transmission and encoding + * conversion is completely managed by SDL. + * + * ## Clipboard callbacks (data other than text) + * + * Things get more complicated when the clipboard contains something other + * than text. Not only can the system clipboard contain data of any type, in + * some cases it can contain the same data in different formats! For example, + * an image painting app might let the user copy a graphic to the clipboard, + * and offers it in .BMP, .JPG, or .PNG format for other apps to consume. + * + * Obtaining clipboard data ("pasting") like this is a matter of calling + * SDL_GetClipboardData() and telling it the mimetype of the data you want. + * But how does one know if that format is available? SDL_HasClipboardData() + * can report if a specific mimetype is offered, and + * SDL_GetClipboardMimeTypes() can provide the entire list of mimetypes + * available, so the app can decide what to do with the data and what formats + * it can support. + * + * Setting the clipboard ("copying") to arbitrary data is done with + * SDL_SetClipboardData. The app does not provide the data in this call, but + * rather the mimetypes it is willing to provide and a callback function. + * During the callback, the app will generate the data. This allows massive + * data sets to be provided to the clipboard, without any data being copied + * before it is explicitly requested. More specifically, it allows an app to + * offer data in multiple formats without providing a copy of all of them + * upfront. If the app has an image that it could provide in PNG or JPG + * format, it doesn't have to encode it to either of those unless and until + * something tries to paste it. + * + * ## Primary Selection + * + * The X11 and Wayland video targets have a concept of the "primary selection" + * in addition to the usual clipboard. This is generally highlighted (but not + * explicitly copied) text from various apps. SDL offers APIs for this through + * SDL_GetPrimarySelectionText() and SDL_SetPrimarySelectionText(). SDL offers + * these APIs on platforms without this concept, too, but only so far that it + * will keep a copy of a string that the app sets for later retrieval; the + * operating system will not ever attempt to change the string externally if + * it doesn't support a primary selection. */ #ifndef SDL_clipboard_h_ @@ -46,27 +91,31 @@ extern "C" { * Put UTF-8 text into the clipboard. * * \param text the text to store in the clipboard. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetClipboardText * \sa SDL_HasClipboardText */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetClipboardText(const char *text); +extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardText(const char *text); /** * Get UTF-8 text from the clipboard. * - * This functions returns empty string if there was not enough memory left for - * a copy of the clipboard's content. + * This functions returns an 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. This should be freed with * SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasClipboardText * \sa SDL_SetClipboardText @@ -76,40 +125,46 @@ extern SDL_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. + * \returns true if the clipboard has text, or false if it does not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetClipboardText * \sa SDL_SetClipboardText */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasClipboardText(void); /** * Put UTF-8 text into the primary selection. * * \param text the text to store in the primary selection. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPrimarySelectionText * \sa SDL_HasPrimarySelectionText */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPrimarySelectionText(const char *text); +extern SDL_DECLSPEC bool SDLCALL SDL_SetPrimarySelectionText(const char *text); /** * Get UTF-8 text from the primary selection. * - * This functions returns empty string if there was not enough memory left for - * a copy of the primary selection's content. + * This functions returns an 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. This should be * freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasPrimarySelectionText * \sa SDL_SetPrimarySelectionText @@ -120,15 +175,16 @@ extern SDL_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. + * \returns true if the primary selection has text, or false if it does not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPrimarySelectionText * \sa SDL_SetPrimarySelectionText */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasPrimarySelectionText(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasPrimarySelectionText(void); /** * Callback function that will be called when data for the specified mime-type @@ -148,7 +204,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasPrimarySelectionText(void); * breakage in receiving applications. The returned data will not be * freed so it needs to be retained and dealt with internally. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData */ @@ -160,7 +216,7 @@ typedef const void *(SDLCALL *SDL_ClipboardDataCallback)(void *userdata, const c * * \param userdata a pointer to provided user data. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData */ @@ -170,13 +226,13 @@ typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata); * Offer clipboard data to the OS. * * Tell the operating system that the application is offering clipboard data - * for each of the proivded mime-types. Once another application requests the - * data the callback function will be called allowing it to generate and + * for each of the provided mime-types. Once another application requests the + * data the callback function will be called, allowing it to generate and * respond with the data for the requested mime-type. * * The size of text data does not include any terminator, and the text does * not need to be null terminated (e.g. you can directly copy a portion of a - * document) + * document). * * \param callback a function pointer to the function that provides the * clipboard data. @@ -185,28 +241,32 @@ typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata); * \param userdata an opaque pointer that will be forwarded to the callbacks. * \param mime_types a list of mime-types that are being offered. * \param num_mime_types the number of mime-types in the mime_types list. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearClipboardData * \sa SDL_GetClipboardData * \sa SDL_HasClipboardData */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetClipboardData(SDL_ClipboardDataCallback callback, SDL_ClipboardCleanupCallback cleanup, void *userdata, const char **mime_types, size_t num_mime_types); +extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardData(SDL_ClipboardDataCallback callback, SDL_ClipboardCleanupCallback cleanup, void *userdata, const char **mime_types, size_t num_mime_types); /** * Clear the clipboard data. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearClipboardData(void); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearClipboardData(void); /** * Get the data from clipboard for a given mime type. @@ -220,7 +280,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearClipboardData(void); * for more information. This should be freed with SDL_free() when it * is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasClipboardData * \sa SDL_SetClipboardData @@ -231,15 +293,34 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetClipboardData(const char *mime_type, s * Query whether there is data in the clipboard for the provided mime type. * * \param mime_type the mime type to check for data for. - * \returns SDL_TRUE if there exists data in clipboard for the provided mime - * type, SDL_FALSE if it does not. + * \returns true if there exists data in clipboard for the provided mime type, + * false if it does not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData * \sa SDL_GetClipboardData */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasClipboardData(const char *mime_type); +extern SDL_DECLSPEC bool SDLCALL SDL_HasClipboardData(const char *mime_type); + +/** + * Retrieve the list of mime types available in the clipboard. + * + * \param num_mime_types a pointer filled with the number of mime types, may + * be NULL. + * \returns a null terminated array of strings with mime types, or NULL on + * failure; call SDL_GetError() for more information. This should be + * freed with SDL_free() when it is no longer needed. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetClipboardData + */ +extern SDL_DECLSPEC char ** SDLCALL SDL_GetClipboardMimeTypes(size_t *num_mime_types); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_close_code.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_close_code.h index fa4d3d1..da1dea7 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_close_code.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_close_code.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -21,7 +21,10 @@ /* * This file reverses the effects of SDL_begin_code.h and should be included - * after you finish any function and structure declarations in your headers + * after you finish any function and structure declarations in your headers. + * + * SDL's headers use this; applications generally should not include this + * header directly. */ #ifndef SDL_begin_code_h diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_copying.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_copying.h index dcbdcea..747bd35 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_copying.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_copying.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_cpuinfo.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_cpuinfo.h index e7ced26..1745bd9 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_cpuinfo.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_cpuinfo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -29,6 +29,12 @@ * These functions are largely concerned with reporting if the system has * access to various SIMD instruction sets, but also has other important info * to share, such as system RAM size and number of logical CPU cores. + * + * CPU instruction set checks, like SDL_HasSSE() and SDL_HasNEON(), are + * available on all platforms, even if they don't make sense (an ARM processor + * will never have SSE and an x86 processor will never have NEON, for example, + * but these functions still exist and will simply return false in these + * cases). */ #ifndef SDL_cpuinfo_h_ @@ -49,20 +55,22 @@ extern "C" { * processors have a 128 byte cache line. We use the larger value to be * generally safe. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_CACHELINE_SIZE 128 /** - * Get the number of CPU cores available. + * Get the number of logical 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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCount(void); +extern SDL_DECLSPEC int SDLCALL SDL_GetNumLogicalCPUCores(void); /** * Determine the L1 cache line size of the CPU. @@ -72,7 +80,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCount(void); * * \returns the L1 cache line size of the CPU, in bytes. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); @@ -82,144 +92,164 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); * 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. + * \returns true if the CPU has AltiVec features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has MMX features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasMMX(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. + * \returns true if the CPU has SSE features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE2 * \sa SDL_HasSSE3 * \sa SDL_HasSSE41 * \sa SDL_HasSSE42 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has SSE2 features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE3 * \sa SDL_HasSSE41 * \sa SDL_HasSSE42 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has SSE3 features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE2 * \sa SDL_HasSSE41 * \sa SDL_HasSSE42 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has SSE4.1 features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE2 * \sa SDL_HasSSE3 * \sa SDL_HasSSE42 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has SSE4.2 features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE2 * \sa SDL_HasSSE3 * \sa SDL_HasSSE41 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has AVX features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasAVX2 * \sa SDL_HasAVX512F */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has AVX2 features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasAVX * \sa SDL_HasAVX512F */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has AVX-512F features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasAVX * \sa SDL_HasAVX2 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX512F(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasAVX512F(void); /** * Determine whether the CPU has ARM SIMD (ARMv6) features. @@ -228,24 +258,28 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX512F(void); * * 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. + * \returns true if the CPU has ARM SIMD features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasNEON */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasARMSIMD(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has ARM NEON features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasNEON(void); /** * Determine whether the CPU has LSX (LOONGARCH SIMD) features. @@ -253,12 +287,13 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void); * 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. + * \returns true if the CPU has LOONGARCH LSX features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasLSX(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasLSX(void); /** * Determine whether the CPU has LASX (LOONGARCH SIMD) features. @@ -266,19 +301,22 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasLSX(void); * 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. + * \returns true if the CPU has LOONGARCH LASX features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasLASX(void); +extern SDL_DECLSPEC 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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSystemRAM(void); @@ -297,7 +335,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetSystemRAM(void); * \returns the alignment in bytes needed for available, known SIMD * instructions. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_aligned_alloc * \sa SDL_aligned_free diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_dialog.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_dialog.h index 8a198a8..460038f 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_dialog.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_dialog.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,12 +23,23 @@ * # CategoryDialog * * File dialog support. + * + * SDL offers file dialogs, to let users select files with native GUI + * interfaces. There are "open" dialogs, "save" dialogs, and folder selection + * dialogs. The app can control some details, such as filtering to specific + * files, or whether multiple files can be selected by the user. + * + * Note that launching a file dialog is a non-blocking operation; control + * returns to the app immediately, and a callback is called later (possibly in + * another thread) when the user makes a choice. */ #ifndef SDL_dialog_h_ #define SDL_dialog_h_ +#include #include +#include #include #include @@ -48,12 +59,13 @@ extern "C" { * hyphens, underscores and periods. Alternatively, the whole string can be a * single asterisk ("*"), which serves as an "All files" filter. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_ShowOpenFileDialog * \sa SDL_ShowSaveFileDialog * \sa SDL_ShowOpenFolderDialog + * \sa SDL_ShowFileDialogWithProperties */ typedef struct SDL_DialogFileFilter { @@ -75,31 +87,34 @@ typedef struct SDL_DialogFileFilter * is a null-terminated list of pointers to C strings, each containing a * path. * - * The filelist argument does not need to be freed; it will automatically be - * freed when the callback returns. + * The filelist argument should not be freed; it will automatically be freed + * when the callback returns. * * The filter argument is the index of the filter that was selected, or -1 if * no filter was selected or if the platform or method doesn't support * fetching the selected filter. * + * In Android, the `filelist` are `content://` URIs. They should be opened + * using SDL_IOFromFile() with appropriate modes. This applies both to open + * and save file dialog. + * * \param userdata an app-provided pointer, for the callback's use. * \param filelist the file(s) chosen by the user. * \param filter index of the selected filter. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_DialogFileFilter * \sa SDL_ShowOpenFileDialog * \sa SDL_ShowSaveFileDialog * \sa SDL_ShowOpenFolderDialog + * \sa SDL_ShowFileDialogWithProperties */ typedef void (SDLCALL *SDL_DialogFileCallback)(void *userdata, const char * const *filelist, int filter); /** * Displays a dialog that lets the user select a file on their filesystem. * - * This function should only be invoked from the main thread. - * * This is an asynchronous function; it will return immediately, and the * result will be passed to the callback. * @@ -117,47 +132,41 @@ typedef void (SDLCALL *SDL_DialogFileCallback)(void *userdata, const char * cons * requires an event-handling loop. Apps that do not use SDL to handle events * should add a call to SDL_PumpEvents in their main loop. * - * \param callback an SDL_DialogFileCallback to be invoked when the user - * selects a file and accepts, or cancels the dialog, or an - * error occurs. The first argument is a null-terminated list - * of C strings, representing the paths chosen by the user. - * The list will be empty if the user canceled the dialog, and - * it will be NULL if an error occurred. If an error occurred, - * it can be fetched with SDL_GetError(). The second argument - * is the userdata pointer passed to the function. The third - * argument is the index of the filter selected by the user, - * or one past the index of the last filter (therefore the - * index of the terminating NULL filter) if no filter was - * chosen, or -1 if the platform does not support detecting - * the selected filter. + * \param callback a function pointer to be invoked when the user selects a + * file and accepts, or cancels the dialog, or an error + * occurs. * \param userdata an optional pointer to pass extra data to the callback when * it will be invoked. - * \param window the window that the dialog should be modal for. May be NULL. + * \param window the window that the dialog should be modal for, may be NULL. * Not all platforms support this option. - * \param filters a list of SDL_DialogFileFilter's. May be NULL. Not all - * platforms support this option, and platforms that do support - * it may allow the user to ignore the filters. + * \param filters a list of filters, may be NULL. Not all platforms support + * this option, and platforms that do support it may allow the + * user to ignore the filters. If non-NULL, it must remain + * valid at least until the callback is invoked. * \param nfilters the number of filters. Ignored if filters is NULL. - * \param default_location the default folder or file to start the dialog at. - * May be NULL. Not all platforms support this option. + * \param default_location the default folder or file to start the dialog at, + * may be NULL. Not all platforms support this option. * \param allow_many if non-zero, the user will be allowed to select multiple * entries. Not all platforms support this option. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should be called only from the main thread. The + * callback may be invoked from the same thread or from a + * different one, depending on the OS's constraints. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_DialogFileFilter * \sa SDL_ShowSaveFileDialog * \sa SDL_ShowOpenFolderDialog + * \sa SDL_ShowFileDialogWithProperties */ -extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location, SDL_bool allow_many); +extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location, bool allow_many); /** * Displays a dialog that lets the user choose a new or existing file on their * filesystem. * - * This function should only be invoked from the main thread. - * * This is an asynchronous function; it will return immediately, and the * result will be passed to the callback. * @@ -174,44 +183,38 @@ extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFileDialog(SDL_DialogFileCallback c * requires an event-handling loop. Apps that do not use SDL to handle events * should add a call to SDL_PumpEvents in their main loop. * - * \param callback an SDL_DialogFileCallback to be invoked when the user - * selects a file and accepts, or cancels the dialog, or an - * error occurs. The first argument is a null-terminated list - * of C strings, representing the paths chosen by the user. - * The list will be empty if the user canceled the dialog, and - * it will be NULL if an error occurred. If an error occurred, - * it can be fetched with SDL_GetError(). The second argument - * is the userdata pointer passed to the function. The third - * argument is the index of the filter selected by the user, - * or one past the index of the last filter (therefore the - * index of the terminating NULL filter) if no filter was - * chosen, or -1 if the platform does not support detecting - * the selected filter. + * \param callback a function pointer to be invoked when the user selects a + * file and accepts, or cancels the dialog, or an error + * occurs. * \param userdata an optional pointer to pass extra data to the callback when * it will be invoked. - * \param window the window that the dialog should be modal for. May be NULL. + * \param window the window that the dialog should be modal for, may be NULL. * Not all platforms support this option. - * \param filters a list of SDL_DialogFileFilter's. May be NULL. Not all - * platforms support this option, and platforms that do support - * it may allow the user to ignore the filters. + * \param filters a list of filters, may be NULL. Not all platforms support + * this option, and platforms that do support it may allow the + * user to ignore the filters. If non-NULL, it must remain + * valid at least until the callback is invoked. * \param nfilters the number of filters. Ignored if filters is NULL. - * \param default_location the default folder or file to start the dialog at. - * May be NULL. Not all platforms support this option. + * \param default_location the default folder or file to start the dialog at, + * may be NULL. Not all platforms support this option. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should be called only from the main thread. The + * callback may be invoked from the same thread or from a + * different one, depending on the OS's constraints. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_DialogFileFilter * \sa SDL_ShowOpenFileDialog * \sa SDL_ShowOpenFolderDialog + * \sa SDL_ShowFileDialogWithProperties */ extern SDL_DECLSPEC void SDLCALL SDL_ShowSaveFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location); /** * Displays a dialog that lets the user select a folder on their filesystem. * - * This function should only be invoked from the main thread. - * * This is an asynchronous function; it will return immediately, and the * result will be passed to the callback. * @@ -229,31 +232,105 @@ extern SDL_DECLSPEC void SDLCALL SDL_ShowSaveFileDialog(SDL_DialogFileCallback c * requires an event-handling loop. Apps that do not use SDL to handle events * should add a call to SDL_PumpEvents in their main loop. * - * \param callback an SDL_DialogFileCallback to be invoked when the user - * selects a file and accepts, or cancels the dialog, or an - * error occurs. The first argument is a null-terminated list - * of C strings, representing the paths chosen by the user. - * The list will be empty if the user canceled the dialog, and - * it will be NULL if an error occurred. If an error occurred, - * it can be fetched with SDL_GetError(). The second argument - * is the userdata pointer passed to the function. The third - * argument is always -1 for SDL_ShowOpenFolderDialog. + * \param callback a function pointer to be invoked when the user selects a + * file and accepts, or cancels the dialog, or an error + * occurs. * \param userdata an optional pointer to pass extra data to the callback when * it will be invoked. - * \param window the window that the dialog should be modal for. May be NULL. + * \param window the window that the dialog should be modal for, may be NULL. * Not all platforms support this option. - * \param default_location the default folder or file to start the dialog at. - * May be NULL. Not all platforms support this option. + * \param default_location the default folder or file to start the dialog at, + * may be NULL. Not all platforms support this option. * \param allow_many if non-zero, the user will be allowed to select multiple * entries. Not all platforms support this option. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should be called only from the main thread. The + * callback may be invoked from the same thread or from a + * different one, depending on the OS's constraints. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_ShowOpenFileDialog * \sa SDL_ShowSaveFileDialog + * \sa SDL_ShowFileDialogWithProperties */ -extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFolderDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const char *default_location, SDL_bool allow_many); +extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFolderDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const char *default_location, bool allow_many); + +/** + * Various types of file dialogs. + * + * This is used by SDL_ShowFileDialogWithProperties() to decide what kind of + * dialog to present to the user. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_ShowFileDialogWithProperties + */ +typedef enum SDL_FileDialogType +{ + SDL_FILEDIALOG_OPENFILE, + SDL_FILEDIALOG_SAVEFILE, + SDL_FILEDIALOG_OPENFOLDER +} SDL_FileDialogType; + +/** + * Create and launch a file dialog with the specified properties. + * + * These are the supported properties: + * + * - `SDL_PROP_FILE_DIALOG_FILTERS_POINTER`: a pointer to a list of + * SDL_DialogFileFilter structs, which will be used as filters for + * file-based selections. Ignored if the dialog is an "Open Folder" dialog. + * If non-NULL, the array of filters must remain valid at least until the + * callback is invoked. + * - `SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER`: the number of filters in the + * array of filters, if it exists. + * - `SDL_PROP_FILE_DIALOG_WINDOW_POINTER`: the window that the dialog should + * be modal for. + * - `SDL_PROP_FILE_DIALOG_LOCATION_STRING`: the default folder or file to + * start the dialog at. + * - `SDL_PROP_FILE_DIALOG_MANY_BOOLEAN`: true to allow the user to select + * more than one entry. + * - `SDL_PROP_FILE_DIALOG_TITLE_STRING`: the title for the dialog. + * - `SDL_PROP_FILE_DIALOG_ACCEPT_STRING`: the label that the accept button + * should have. + * - `SDL_PROP_FILE_DIALOG_CANCEL_STRING`: the label that the cancel button + * should have. + * + * Note that each platform may or may not support any of the properties. + * + * \param type the type of file dialog. + * \param callback a function pointer to be invoked when the user selects a + * file and accepts, or cancels the dialog, or an error + * occurs. + * \param userdata an optional pointer to pass extra data to the callback when + * it will be invoked. + * \param props the properties to use. + * + * \threadsafety This function should be called only from the main thread. The + * callback may be invoked from the same thread or from a + * different one, depending on the OS's constraints. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_FileDialogType + * \sa SDL_DialogFileCallback + * \sa SDL_DialogFileFilter + * \sa SDL_ShowOpenFileDialog + * \sa SDL_ShowSaveFileDialog + * \sa SDL_ShowOpenFolderDialog + */ +extern SDL_DECLSPEC void SDLCALL SDL_ShowFileDialogWithProperties(SDL_FileDialogType type, SDL_DialogFileCallback callback, void *userdata, SDL_PropertiesID props); + +#define SDL_PROP_FILE_DIALOG_FILTERS_POINTER "SDL.filedialog.filters" +#define SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER "SDL.filedialog.nfilters" +#define SDL_PROP_FILE_DIALOG_WINDOW_POINTER "SDL.filedialog.window" +#define SDL_PROP_FILE_DIALOG_LOCATION_STRING "SDL.filedialog.location" +#define SDL_PROP_FILE_DIALOG_MANY_BOOLEAN "SDL.filedialog.many" +#define SDL_PROP_FILE_DIALOG_TITLE_STRING "SDL.filedialog.title" +#define SDL_PROP_FILE_DIALOG_ACCEPT_STRING "SDL.filedialog.accept" +#define SDL_PROP_FILE_DIALOG_CANCEL_STRING "SDL.filedialog.cancel" /* Ends C function definitions when using C++ */ #ifdef __cplusplus @@ -261,4 +338,4 @@ extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFolderDialog(SDL_DialogFileCallback #endif #include -#endif /* SDL_joystick_h_ */ +#endif /* SDL_dialog_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_egl.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_egl.h index cc557d6..65d4e96 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_egl.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_egl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_endian.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_endian.h index cb3d7f3..a34e9d4 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_endian.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_endian.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,20 @@ /** * # CategoryEndian * - * Functions for reading and writing endian-specific values. + * Functions converting endian-specific values to different byte orders. + * + * These functions either unconditionally swap byte order (SDL_Swap16, + * SDL_Swap32, SDL_Swap64, SDL_SwapFloat), or they swap to/from the system's + * native byte order (SDL_Swap16LE, SDL_Swap16BE, SDL_Swap32LE, SDL_Swap32BE, + * SDL_Swap32LE, SDL_Swap32BE, SDL_SwapFloatLE, SDL_SwapFloatBE). In the + * latter case, the functionality is provided by macros that become no-ops if + * a swap isn't necessary: on an x86 (littleendian) processor, SDL_Swap32LE + * does nothing, but SDL_Swap32BE reverses the bytes of the data. On a PowerPC + * processor (bigendian), the macros behavior is reversed. + * + * The swap routines are inline functions, and attempt to use compiler + * intrinsics, inline assembly, and other magic to make byteswapping + * efficient. */ #ifndef SDL_endian_h_ @@ -51,12 +64,71 @@ _m_prefetch(void *__P) * \name The two types of endianness */ /* @{ */ + + +/** + * A value to represent littleendian byteorder. + * + * This is used with the preprocessor macro SDL_BYTEORDER, to determine a + * platform's byte ordering: + * + * ```c + * #if SDL_BYTEORDER == SDL_LIL_ENDIAN + * SDL_Log("This system is littleendian."); + * #endif + * ``` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_BYTEORDER + * \sa SDL_BIG_ENDIAN + */ #define SDL_LIL_ENDIAN 1234 + +/** + * A value to represent bigendian byteorder. + * + * This is used with the preprocessor macro SDL_BYTEORDER, to determine a + * platform's byte ordering: + * + * ```c + * #if SDL_BYTEORDER == SDL_BIG_ENDIAN + * SDL_Log("This system is bigendian."); + * #endif + * ``` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_BYTEORDER + * \sa SDL_LIL_ENDIAN + */ #define SDL_BIG_ENDIAN 4321 + /* @} */ #ifndef SDL_BYTEORDER -#ifdef SDL_PLATFORM_LINUX +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro that reports the target system's byte order. + * + * This is set to either SDL_LIL_ENDIAN or SDL_BIG_ENDIAN (and maybe other + * values in the future, if something else becomes popular). This can be + * tested with the preprocessor, so decisions can be made at compile time. + * + * ```c + * #if SDL_BYTEORDER == SDL_BIG_ENDIAN + * SDL_Log("This system is bigendian."); + * #endif + * ``` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_LIL_ENDIAN + * \sa SDL_BIG_ENDIAN + */ +#define SDL_BYTEORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN +#elif defined(SDL_PLATFORM_LINUX) #include #define SDL_BYTEORDER __BYTE_ORDER #elif defined(SDL_PLATFORM_SOLARIS) @@ -97,8 +169,29 @@ _m_prefetch(void *__P) #endif /* !SDL_BYTEORDER */ #ifndef SDL_FLOATWORDORDER +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro that reports the target system's floating point word order. + * + * This is set to either SDL_LIL_ENDIAN or SDL_BIG_ENDIAN (and maybe other + * values in the future, if something else becomes popular). This can be + * tested with the preprocessor, so decisions can be made at compile time. + * + * ```c + * #if SDL_FLOATWORDORDER == SDL_BIG_ENDIAN + * SDL_Log("This system's floats are bigendian."); + * #endif + * ``` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_LIL_ENDIAN + * \sa SDL_BIG_ENDIAN + */ +#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN /* predefs from newer gcc versions: */ -#if defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__FLOAT_WORD_ORDER__) +#elif 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__) @@ -125,10 +218,6 @@ _m_prefetch(void *__P) 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)) || \ @@ -148,6 +237,7 @@ extern "C" { #endif /* Byte swap 16-bit integer. */ +#ifndef SDL_WIKI_DOCUMENTATION_SECTION #if HAS_BUILTIN_BSWAP16 #define SDL_Swap16(x) __builtin_bswap16(x) #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL) @@ -191,8 +281,10 @@ SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) return SDL_static_cast(Uint16, ((x << 8) | (x >> 8))); } #endif +#endif /* Byte swap 32-bit integer. */ +#ifndef SDL_WIKI_DOCUMENTATION_SECTION #if HAS_BUILTIN_BSWAP32 #define SDL_Swap32(x) __builtin_bswap32(x) #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL) @@ -239,8 +331,10 @@ SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) ((x >> 8) & 0x0000FF00) | (x >> 24))); } #endif +#endif /* Byte swap 64-bit integer. */ +#ifndef SDL_WIKI_DOCUMENTATION_SECTION #if HAS_BUILTIN_BSWAP64 #define SDL_Swap64(x) __builtin_bswap64(x) #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL) @@ -290,7 +384,7 @@ SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x) return (x); } #endif - +#endif /** * Byte-swap a floating point number. @@ -309,7 +403,7 @@ SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE float SDL_SwapFloat(float x) { @@ -348,7 +442,7 @@ SDL_FORCE_INLINE float SDL_SwapFloat(float x) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { return x_but_byteswapped; } @@ -369,7 +463,7 @@ SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { return x_but_byteswapped; } @@ -390,7 +484,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } @@ -404,7 +498,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in littleendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap16LE(x) SwapOnlyIfNecessary(x) @@ -418,7 +514,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in littleendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap32LE(x) SwapOnlyIfNecessary(x) @@ -432,7 +530,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in littleendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap64LE(x) SwapOnlyIfNecessary(x) @@ -446,7 +546,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in littleendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_SwapFloatLE(x) SwapOnlyIfNecessary(x) @@ -460,7 +562,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in bigendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap16BE(x) SwapOnlyIfNecessary(x) @@ -474,7 +578,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in bigendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap32BE(x) SwapOnlyIfNecessary(x) @@ -488,7 +594,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in bigendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap64BE(x) SwapOnlyIfNecessary(x) @@ -502,7 +610,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in bigendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_SwapFloatBE(x) SwapOnlyIfNecessary(x) diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_error.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_error.h index a98823f..934967c 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_error.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_error.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,26 @@ * # CategoryError * * Simple error message routines for SDL. + * + * Most apps will interface with these APIs in exactly one function: when + * almost any SDL function call reports failure, you can get a human-readable + * string of the problem from SDL_GetError(). + * + * These strings are maintained per-thread, and apps are welcome to set their + * own errors, which is popular when building libraries on top of SDL for + * other apps to consume. These strings are set by calling SDL_SetError(). + * + * A common usage pattern is to have a function that returns true for success + * and false for failure, and do this when something fails: + * + * ```c + * if (something_went_wrong) { + * return SDL_SetError("The thing broke in this specific way: %d", errcode); + * } + * ``` + * + * It's also common to just return `false` in this case if the failing thing + * is known to call SDL_SetError(), so errors simply propagate through. */ #ifndef SDL_error_h_ @@ -44,8 +64,8 @@ extern "C" { * * 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: + * This function always returns false, since SDL frequently uses false to + * signify a failing result, leading to this idiom: * * ```c * if (error_code) { @@ -56,25 +76,49 @@ extern "C" { * \param fmt a printf()-style message format string. * \param ... additional parameters matching % tokens in the `fmt` string, if * any. - * \returns SDL_FALSE. + * \returns false. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearError * \sa SDL_GetError + * \sa SDL_SetErrorV */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); +extern SDL_DECLSPEC bool SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); + +/** + * Set the SDL error message for the current thread. + * + * Calling this function will replace any previous error message that was set. + * + * \param fmt a printf()-style message format string. + * \param ap a variable argument list. + * \returns false. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ClearError + * \sa SDL_GetError + * \sa SDL_SetError + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetErrorV(SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(1); /** * Set an error indicating that memory allocation failed. * * This function does not do any memory allocation. * - * \returns SDL_FALSE. + * \returns false. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_OutOfMemory(void); +extern SDL_DECLSPEC bool SDLCALL SDL_OutOfMemory(void); /** * Retrieve a message about the last error that occurred on the current @@ -104,7 +148,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_OutOfMemory(void); * or an empty string if there hasn't been an error message set since * the last call to SDL_ClearError(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearError * \sa SDL_SetError @@ -114,14 +160,16 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetError(void); /** * Clear any previous error message for this thread. * - * \returns SDL_TRUE. + * \returns true. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetError * \sa SDL_SetError */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearError(void); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearError(void); /** * \name Internal error functions @@ -130,8 +178,43 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearError(void); * Private error reporting function - used internally. */ /* @{ */ + +/** + * A macro to standardize error reporting on unsupported operations. + * + * This simply calls SDL_SetError() with a standardized error string, for + * convenience, consistency, and clarity. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_Unsupported() SDL_SetError("That operation is not supported") + +/** + * A macro to standardize error reporting on unsupported operations. + * + * This simply calls SDL_SetError() with a standardized error string, for + * convenience, consistency, and clarity. + * + * A common usage pattern inside SDL is this: + * + * ```c + * bool MyFunction(const char *str) { + * if (!str) { + * return SDL_InvalidParamError("str"); // returns false. + * } + * DoSomething(str); + * return true; + * } + * ``` + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_InvalidParamError(param) SDL_SetError("Parameter '%s' is invalid", (param)) + /* @} *//* Internal error functions */ /* Ends C function definitions when using C++ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_events.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_events.h index fbe2bb0..1323e9f 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_events.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_events.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,22 +23,50 @@ * # CategoryEvents * * Event queue management. + * + * It's extremely common--often required--that an app deal with SDL's event + * queue. Almost all useful information about interactions with the real world + * flow through here: the user interacting with the computer and app, hardware + * coming and going, the system changing in some way, etc. + * + * An app generally takes a moment, perhaps at the start of a new frame, to + * examine any events that have occured since the last time and process or + * ignore them. This is generally done by calling SDL_PollEvent() in a loop + * until it returns false (or, if using the main callbacks, events are + * provided one at a time in calls to SDL_AppEvent() before the next call to + * SDL_AppIterate(); in this scenario, the app does not call SDL_PollEvent() + * at all). + * + * There is other forms of control, too: SDL_PeepEvents() has more + * functionality at the cost of more complexity, and SDL_WaitEvent() can block + * the process until something interesting happens, which might be beneficial + * for certain types of programs on low-power hardware. One may also call + * SDL_AddEventWatch() to set a callback when new events arrive. + * + * The app is free to generate their own events, too: SDL_PushEvent allows the + * app to put events onto the queue for later retrieval; SDL_RegisterEvents + * can guarantee that these events have a type that isn't in use by other + * parts of the system. */ #ifndef SDL_events_h_ #define SDL_events_h_ +#include #include +#include #include #include #include #include +#include #include #include -#include +#include +#include +#include #include #include -#include #include /* Set up for C function definitions, even when using C++ */ @@ -48,29 +76,10 @@ extern "C" { /* General keyboard/mouse/pen state definitions */ -/** - * A value that signifies a button is no longer pressed. - * - * \since This macro is available since SDL 3.0.0. - * - * \sa SDL_PRESSED - */ -#define SDL_RELEASED 0 - -/** - * A value that signifies a button has been pressed down. - * - * \since This macro is available since SDL 3.0.0. - * - * \sa SDL_RELEASED - */ -#define SDL_PRESSED 1 - - /** * The types of events that can be delivered. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_EventType { @@ -148,7 +157,7 @@ typedef enum SDL_EventType SDL_EVENT_WINDOW_ENTER_FULLSCREEN, /**< The window has entered fullscreen mode */ SDL_EVENT_WINDOW_LEAVE_FULLSCREEN, /**< The window has left fullscreen mode */ SDL_EVENT_WINDOW_DESTROYED, /**< The window with the associated ID is being or has been destroyed. If this message is being handled - in an event watcher, the window handle is still valid and can still be used to retrieve any userdata + in an event watcher, the window handle is still valid and can still be used to retrieve any properties associated with the window. Otherwise, the handle has already been destroyed and all resources associated with it are invalid */ SDL_EVENT_WINDOW_HDR_STATE_CHANGED, /**< Window HDR properties have changed */ @@ -203,6 +212,7 @@ typedef enum SDL_EventType SDL_EVENT_FINGER_DOWN = 0x700, SDL_EVENT_FINGER_UP, SDL_EVENT_FINGER_MOTION, + SDL_EVENT_FINGER_CANCELED, /* 0x800, 0x801, and 0x802 were the Gesture events from SDL2. Do not reuse these values! sdl2-compat needs them! */ @@ -243,6 +253,13 @@ typedef enum SDL_EventType /* Render events */ SDL_EVENT_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset and their contents need to be updated */ SDL_EVENT_RENDER_DEVICE_RESET, /**< The device has been reset and all textures need to be recreated */ + SDL_EVENT_RENDER_DEVICE_LOST, /**< The device has been lost and can't be recovered. */ + + /* Reserved events for private platforms */ + SDL_EVENT_PRIVATE0 = 0x4000, + SDL_EVENT_PRIVATE1, + SDL_EVENT_PRIVATE2, + SDL_EVENT_PRIVATE3, /* Internal events */ SDL_EVENT_POLL_SENTINEL = 0x7F00, /**< Signals the end of an event poll cycle */ @@ -265,7 +282,7 @@ typedef enum SDL_EventType /** * Fields shared by every event * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_CommonEvent { @@ -277,7 +294,7 @@ typedef struct SDL_CommonEvent /** * Display state change event data (event.display.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_DisplayEvent { @@ -292,7 +309,7 @@ typedef struct SDL_DisplayEvent /** * Window state change event data (event.window.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_WindowEvent { @@ -307,7 +324,7 @@ typedef struct SDL_WindowEvent /** * Keyboard device event structure (event.kdevice.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_KeyboardDeviceEvent { @@ -326,7 +343,7 @@ typedef struct SDL_KeyboardDeviceEvent * event scancode and modifiers directly from the keyboard layout, bypassing * SDL_HINT_KEYCODE_OPTIONS, by calling SDL_GetKeyFromScancode(). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetKeyFromScancode * \sa SDL_HINT_KEYCODE_OPTIONS @@ -342,8 +359,8 @@ typedef struct SDL_KeyboardEvent SDL_Keycode key; /**< SDL virtual key code */ SDL_Keymod mod; /**< current key modifiers */ Uint16 raw; /**< The platform dependent scancode for this event */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ - Uint8 repeat; /**< Non-zero if this is a key repeat */ + bool down; /**< true if the key is pressed */ + bool repeat; /**< true if this is a key repeat */ } SDL_KeyboardEvent; /** @@ -353,7 +370,7 @@ typedef struct SDL_KeyboardEvent * will be inserted into the editing text. The length is the number of UTF-8 * characters that will be replaced by new typing. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_TextEditingEvent { @@ -369,7 +386,7 @@ typedef struct SDL_TextEditingEvent /** * Keyboard IME candidates event structure (event.edit_candidates.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_TextEditingCandidatesEvent { @@ -380,7 +397,10 @@ typedef struct SDL_TextEditingCandidatesEvent const char * const *candidates; /**< The list of candidates, or NULL if there are no candidates available */ Sint32 num_candidates; /**< The number of strings in `candidates` */ Sint32 selected_candidate; /**< The index of the selected candidate, or -1 if no candidate is selected */ - SDL_bool horizontal; /**< SDL_TRUE if the list is horizontal, SDL_FALSE if it's vertical */ + bool horizontal; /**< true if the list is horizontal, false if it's vertical */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; } SDL_TextEditingCandidatesEvent; /** @@ -389,7 +409,7 @@ typedef struct SDL_TextEditingCandidatesEvent * This event will never be delivered unless text input is enabled by calling * SDL_StartTextInput(). Text input is disabled by default! * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_StartTextInput * \sa SDL_StopTextInput @@ -406,7 +426,7 @@ typedef struct SDL_TextInputEvent /** * Mouse device event structure (event.mdevice.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseDeviceEvent { @@ -419,7 +439,7 @@ typedef struct SDL_MouseDeviceEvent /** * Mouse motion event structure (event.motion.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseMotionEvent { @@ -427,7 +447,7 @@ typedef struct SDL_MouseMotionEvent Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_WindowID windowID; /**< The window with mouse focus, if any */ - SDL_MouseID which; /**< The mouse instance id or SDL_TOUCH_MOUSEID */ + SDL_MouseID which; /**< The mouse instance id in relative mode, SDL_TOUCH_MOUSEID for touch events, or 0 */ SDL_MouseButtonFlags state; /**< The current button state */ float x; /**< X coordinate, relative to window */ float y; /**< Y coordinate, relative to window */ @@ -438,7 +458,7 @@ typedef struct SDL_MouseMotionEvent /** * Mouse button event structure (event.button.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseButtonEvent { @@ -446,9 +466,9 @@ typedef struct SDL_MouseButtonEvent Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_WindowID windowID; /**< The window with mouse focus, if any */ - SDL_MouseID which; /**< The mouse instance id, SDL_TOUCH_MOUSEID */ + SDL_MouseID which; /**< The mouse instance id in relative mode, SDL_TOUCH_MOUSEID for touch events, or 0 */ Uint8 button; /**< The mouse button index */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + bool down; /**< true if the button is pressed */ Uint8 clicks; /**< 1 for single-click, 2 for double-click, etc. */ Uint8 padding; float x; /**< X coordinate, relative to window */ @@ -458,7 +478,7 @@ typedef struct SDL_MouseButtonEvent /** * Mouse wheel event structure (event.wheel.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseWheelEvent { @@ -466,7 +486,7 @@ typedef struct SDL_MouseWheelEvent Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_WindowID windowID; /**< The window with mouse focus, if any */ - SDL_MouseID which; /**< The mouse instance id, SDL_TOUCH_MOUSEID */ + SDL_MouseID which; /**< The mouse instance id in relative mode or 0 */ float x; /**< The amount scrolled horizontally, positive to the right and negative to the left */ float y; /**< The amount scrolled vertically, positive away from the user and negative toward the user */ SDL_MouseWheelDirection 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 */ @@ -477,7 +497,7 @@ typedef struct SDL_MouseWheelEvent /** * Joystick axis motion event structure (event.jaxis.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyAxisEvent { @@ -496,7 +516,7 @@ typedef struct SDL_JoyAxisEvent /** * Joystick trackball motion event structure (event.jball.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyBallEvent { @@ -515,7 +535,7 @@ typedef struct SDL_JoyBallEvent /** * Joystick hat position change event structure (event.jhat.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyHatEvent { @@ -538,7 +558,7 @@ typedef struct SDL_JoyHatEvent /** * Joystick button event structure (event.jbutton.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyButtonEvent { @@ -547,7 +567,7 @@ typedef struct SDL_JoyButtonEvent Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_JoystickID which; /**< The joystick instance id */ Uint8 button; /**< The joystick button index */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + bool down; /**< true if the button is pressed */ Uint8 padding1; Uint8 padding2; } SDL_JoyButtonEvent; @@ -555,7 +575,12 @@ typedef struct SDL_JoyButtonEvent /** * Joystick device event structure (event.jdevice.*) * - * \since This struct is available since SDL 3.0.0. + * SDL will send JOYSTICK_ADDED events for devices that are already plugged in + * during SDL_Init. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GamepadDeviceEvent */ typedef struct SDL_JoyDeviceEvent { @@ -566,9 +591,9 @@ typedef struct SDL_JoyDeviceEvent } SDL_JoyDeviceEvent; /** - * Joysick battery level change event structure (event.jbattery.*) + * Joystick battery level change event structure (event.jbattery.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyBatteryEvent { @@ -583,7 +608,7 @@ typedef struct SDL_JoyBatteryEvent /** * Gamepad axis motion event structure (event.gaxis.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadAxisEvent { @@ -603,7 +628,7 @@ typedef struct SDL_GamepadAxisEvent /** * Gamepad button event structure (event.gbutton.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadButtonEvent { @@ -612,7 +637,7 @@ typedef struct SDL_GamepadButtonEvent Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_JoystickID which; /**< The joystick instance id */ Uint8 button; /**< The gamepad button (SDL_GamepadButton) */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + bool down; /**< true if the button is pressed */ Uint8 padding1; Uint8 padding2; } SDL_GamepadButtonEvent; @@ -621,7 +646,16 @@ typedef struct SDL_GamepadButtonEvent /** * Gamepad device event structure (event.gdevice.*) * - * \since This struct is available since SDL 3.0.0. + * Joysticks that are supported gamepads receive both an SDL_JoyDeviceEvent + * and an SDL_GamepadDeviceEvent. + * + * SDL will send GAMEPAD_ADDED events for joysticks that are already plugged + * in during SDL_Init() and are recognized as gamepads. It will also send + * events for joysticks that get gamepad mappings at runtime. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_JoyDeviceEvent */ typedef struct SDL_GamepadDeviceEvent { @@ -634,7 +668,7 @@ typedef struct SDL_GamepadDeviceEvent /** * Gamepad touchpad event structure (event.gtouchpad.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadTouchpadEvent { @@ -652,7 +686,7 @@ typedef struct SDL_GamepadTouchpadEvent /** * Gamepad sensor event structure (event.gsensor.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadSensorEvent { @@ -668,7 +702,7 @@ typedef struct SDL_GamepadSensorEvent /** * Audio device event structure (event.adevice.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_AudioDeviceEvent { @@ -676,7 +710,7 @@ typedef struct SDL_AudioDeviceEvent Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_AudioDeviceID which; /**< SDL_AudioDeviceID for the device being added or removed or changing */ - Uint8 recording; /**< zero if a playback device, non-zero if a recording device. */ + bool recording; /**< false if a playback device, true if a recording device. */ Uint8 padding1; Uint8 padding2; Uint8 padding3; @@ -685,7 +719,7 @@ typedef struct SDL_AudioDeviceEvent /** * Camera device event structure (event.cdevice.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_CameraDeviceEvent { @@ -695,14 +729,43 @@ typedef struct SDL_CameraDeviceEvent SDL_CameraID which; /**< SDL_CameraID for the device being added or removed or changing */ } SDL_CameraDeviceEvent; + +/** + * Renderer event structure (event.render.*) + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_RenderEvent +{ + SDL_EventType type; /**< SDL_EVENT_RENDER_TARGETS_RESET, SDL_EVENT_RENDER_DEVICE_RESET, SDL_EVENT_RENDER_DEVICE_LOST */ + Uint32 reserved; + Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ + SDL_WindowID windowID; /**< The window containing the renderer in question. */ +} SDL_RenderEvent; + + /** * Touch finger event structure (event.tfinger.*) * - * \since This struct is available since SDL 3.0.0. + * Coordinates in this event are normalized. `x` and `y` are normalized to a + * range between 0.0f and 1.0f, relative to the window, so (0,0) is the top + * left and (1,1) is the bottom right. Delta coordinates `dx` and `dy` are + * normalized in the ranges of -1.0f (traversed all the way from the bottom or + * right to all the way up or left) to 1.0f (traversed all the way from the + * top or left to all the way down or right). + * + * Note that while the coordinates are _normalized_, they are not _clamped_, + * which means in some circumstances you can get a value outside of this + * range. For example, a renderer using logical presentation might give a + * negative value when the touch is in the letterboxing. Some platforms might + * report a touch outside of the window, which will also be outside of the + * range. + * + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_TouchFingerEvent { - SDL_EventType type; /**< SDL_EVENT_FINGER_MOTION or SDL_EVENT_FINGER_DOWN or SDL_EVENT_FINGER_UP */ + SDL_EventType type; /**< SDL_EVENT_FINGER_DOWN, SDL_EVENT_FINGER_UP, SDL_EVENT_FINGER_MOTION, or SDL_EVENT_FINGER_CANCELED */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_TouchID touchID; /**< The touch device id */ @@ -728,14 +791,14 @@ typedef struct SDL_TouchFingerEvent * is there." The pen touching and lifting off from the tablet while not * leaving the area are handled by SDL_EVENT_PEN_DOWN and SDL_EVENT_PEN_UP. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenProximityEvent { SDL_EventType type; /**< SDL_EVENT_PEN_PROXIMITY_IN or SDL_EVENT_PEN_PROXIMITY_OUT */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ - SDL_WindowID windowID; /**< The window with mouse focus, if any */ + SDL_WindowID windowID; /**< The window with pen focus, if any */ SDL_PenID which; /**< The pen instance id */ } SDL_PenProximityEvent; @@ -748,18 +811,18 @@ typedef struct SDL_PenProximityEvent * `pen_state & SDL_PEN_INPUT_DOWN` to decide if a pen is "drawing" when * dealing with pen motion. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenMotionEvent { SDL_EventType type; /**< SDL_EVENT_PEN_MOTION */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ - SDL_WindowID windowID; /**< The window with mouse focus, if any */ + SDL_WindowID windowID; /**< The window with pen focus, if any */ SDL_PenID which; /**< The pen instance id */ SDL_PenInputFlags pen_state; /**< Complete pen input state at time of event */ - float x; /**< X position of pen on tablet */ - float y; /**< Y position of pen on tablet */ + float x; /**< X coordinate, relative to window */ + float y; /**< Y coordinate, relative to window */ } SDL_PenMotionEvent; /** @@ -768,7 +831,7 @@ typedef struct SDL_PenMotionEvent * These events come when a pen touches a surface (a tablet, etc), or lifts * off from one. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenTouchEvent { @@ -778,10 +841,10 @@ typedef struct SDL_PenTouchEvent SDL_WindowID windowID; /**< The window with pen focus, if any */ SDL_PenID which; /**< The pen instance id */ SDL_PenInputFlags pen_state; /**< Complete pen input state at time of event */ - float x; /**< X position of pen on tablet */ - float y; /**< Y position of pen on tablet */ - Uint8 eraser; /**< Non-zero if eraser end is used (not all pens support this). */ - Uint8 state; /**< SDL_PRESSED (pen is touching) or SDL_RELEASED (pen is lifted off) */ + float x; /**< X coordinate, relative to window */ + float y; /**< Y coordinate, relative to window */ + bool eraser; /**< true if eraser end is used (not all pens support this). */ + bool down; /**< true if the pen is touching or false if the pen is lifted off */ } SDL_PenTouchEvent; /** @@ -790,7 +853,7 @@ typedef struct SDL_PenTouchEvent * This is for buttons on the pen itself that the user might click. The pen * itself pressing down to draw triggers a SDL_EVENT_PEN_DOWN event instead. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenButtonEvent { @@ -800,10 +863,10 @@ typedef struct SDL_PenButtonEvent SDL_WindowID windowID; /**< The window with mouse focus, if any */ SDL_PenID which; /**< The pen instance id */ SDL_PenInputFlags pen_state; /**< Complete pen input state at time of event */ - float x; /**< X position of pen on tablet */ - float y; /**< Y position of pen on tablet */ + float x; /**< X coordinate, relative to window */ + float y; /**< Y coordinate, relative to window */ Uint8 button; /**< The pen button index (first button is 1). */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + bool down; /**< true if the button is pressed */ } SDL_PenButtonEvent; /** @@ -812,7 +875,7 @@ typedef struct SDL_PenButtonEvent * You might get some of these events even if the pen isn't touching the * tablet. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenAxisEvent { @@ -822,8 +885,8 @@ typedef struct SDL_PenAxisEvent SDL_WindowID windowID; /**< The window with pen focus, if any */ SDL_PenID which; /**< The pen instance id */ SDL_PenInputFlags pen_state; /**< Complete pen input state at time of event */ - float x; /**< X position of pen on tablet */ - float y; /**< Y position of pen on tablet */ + float x; /**< X coordinate, relative to window */ + float y; /**< Y coordinate, relative to window */ SDL_PenAxis axis; /**< Axis that has changed */ float value; /**< New value of axis */ } SDL_PenAxisEvent; @@ -832,7 +895,7 @@ typedef struct SDL_PenAxisEvent * An event used to drop text or request a file open by the system * (event.drop.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_DropEvent { @@ -850,19 +913,22 @@ typedef struct SDL_DropEvent * An event triggered when the clipboard contents have changed * (event.clipboard.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_ClipboardEvent { SDL_EventType type; /**< SDL_EVENT_CLIPBOARD_UPDATE */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ + bool owner; /**< are we owning the clipboard (internal update) */ + Sint32 num_mime_types; /**< number of mime types */ + const char **mime_types; /**< current mime types */ } SDL_ClipboardEvent; /** * Sensor event structure (event.sensor.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_SensorEvent { @@ -877,7 +943,7 @@ typedef struct SDL_SensorEvent /** * The "quit requested" event * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_QuitEvent { @@ -895,7 +961,7 @@ typedef struct SDL_QuitEvent * the programmer; the only requirement is that '''type''' is a value obtained * from SDL_RegisterEvents(). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_UserEvent { @@ -912,7 +978,10 @@ typedef struct SDL_UserEvent /** * The structure for all events in SDL. * - * \since This struct is available since SDL 3.0.0. + * The SDL_Event structure is the core of all event handling in SDL. SDL_Event + * is a union of all event structures used in SDL. + * + * \since This struct is available since SDL 3.2.0. */ typedef union SDL_Event { @@ -951,6 +1020,7 @@ typedef union SDL_Event SDL_PenMotionEvent pmotion; /**< Pen motion event data */ SDL_PenButtonEvent pbutton; /**< Pen button event data */ SDL_PenAxisEvent paxis; /**< Pen axis event data */ + SDL_RenderEvent render; /**< Render event data */ SDL_DropEvent drop; /**< Drag and drop event data */ SDL_ClipboardEvent clipboard; /**< Clipboard event data */ @@ -981,10 +1051,6 @@ SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NUL * * 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 @@ -993,7 +1059,9 @@ SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NUL * 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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_WaitEvent @@ -1001,11 +1069,17 @@ SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NUL extern SDL_DECLSPEC void SDLCALL SDL_PumpEvents(void); /* @{ */ + +/** + * The type of action to request from SDL_PeepEvents(). + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_EventAction { - SDL_ADDEVENT, - SDL_PEEKEVENT, - SDL_GETEVENT + SDL_ADDEVENT, /**< Add events to the back of the queue. */ + SDL_PEEKEVENT, /**< Check but don't remove events from the queue front. */ + SDL_GETEVENT /**< Retrieve/remove events from the front of the queue. */ } SDL_EventAction; /** @@ -1017,7 +1091,9 @@ typedef enum SDL_EventAction * 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. + * caller and will _not_ be removed from the queue. If you pass NULL for + * `events`, then `numevents` is ignored and the total number of matching + * events will be returned. * - `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. @@ -1026,8 +1102,6 @@ typedef enum SDL_EventAction * 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, may be NULL to * leave the events in the queue and return the number of events * that would have been stored. @@ -1042,7 +1116,9 @@ typedef enum SDL_EventAction * \returns the number of events actually stored or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_PumpEvents @@ -1058,14 +1134,16 @@ extern SDL_DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, * 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. + * \returns true if events matching `type` are present, or false if events + * matching `type` are not present. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasEvents */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type); +extern SDL_DECLSPEC bool SDLCALL SDL_HasEvent(Uint32 type); /** @@ -1077,14 +1155,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type); * 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. + * \returns true if events with type >= `minType` and <= `maxType` are + * present, or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasEvents */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); +extern SDL_DECLSPEC bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); /** * Clear events of a specific type from the event queue. @@ -1106,7 +1186,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxTyp * * \param type the type of event to be cleared; see SDL_EventType for details. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_FlushEvents */ @@ -1131,7 +1213,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type); * \param maxType the high end of event type to be cleared, inclusive; see * SDL_EventType for details. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_FlushEvent */ @@ -1171,16 +1255,17 @@ extern SDL_DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType) * * \param event the SDL_Event structure to be filled with the next event from * the queue, or NULL. - * \returns SDL_TRUE if this got an event or SDL_FALSE if there are none - * available. + * \returns true if this got an event or false if there are none available. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PushEvent * \sa SDL_WaitEvent * \sa SDL_WaitEventTimeout */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PollEvent(SDL_Event *event); +extern SDL_DECLSPEC bool SDLCALL SDL_PollEvent(SDL_Event *event); /** * Wait indefinitely for the next available event. @@ -1193,16 +1278,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PollEvent(SDL_Event *event); * * \param event the SDL_Event structure to be filled in with the next event * from the queue, or NULL. - * \returns SDL_TRUE on success or SDL_FALSE if there was an error while - * waiting for events; call SDL_GetError() for more information. + * \returns true on success or false if there was an error while waiting for + * events; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_PushEvent * \sa SDL_WaitEventTimeout */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEvent(SDL_Event *event); +extern SDL_DECLSPEC bool SDLCALL SDL_WaitEvent(SDL_Event *event); /** * Wait until the specified timeout (in milliseconds) for the next available @@ -1221,16 +1308,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEvent(SDL_Event *event); * from the queue, or NULL. * \param timeoutMS the maximum number of milliseconds to wait for the next * available event. - * \returns SDL_TRUE if this got an event or SDL_FALSE if the timeout elapsed - * without any events available. + * \returns true if this got an event or false if the timeout elapsed without + * any events available. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_PushEvent * \sa SDL_WaitEvent */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEventTimeout(SDL_Event *event, Sint32 timeoutMS); +extern SDL_DECLSPEC bool SDLCALL SDL_WaitEventTimeout(SDL_Event *event, Sint32 timeoutMS); /** * Add an event to the event queue. @@ -1244,8 +1333,6 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEventTimeout(SDL_Event *event, Sint * 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. * @@ -1254,17 +1341,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEventTimeout(SDL_Event *event, Sint * its own custom event types. * * \param event the SDL_Event to be added to the queue. - * \returns SDL_TRUE on success, SDL_FALSE if the event was filtered or on - * failure; call SDL_GetError() for more information. A common reason - * for error is the event queue being full. + * \returns true on success, false if the event was filtered or 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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PeepEvents * \sa SDL_PollEvent * \sa SDL_RegisterEvents */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PushEvent(SDL_Event *event); +extern SDL_DECLSPEC bool SDLCALL SDL_PushEvent(SDL_Event *event); /** * A function pointer used for callbacks that watch the event queue. @@ -1272,29 +1361,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PushEvent(SDL_Event *event); * \param userdata what was passed as `userdata` to SDL_SetEventFilter() or * SDL_AddEventWatch, etc. * \param event the event that triggered the callback. - * \returns SDL_TRUE to permit event to be added to the queue, and SDL_FALSE - * to disallow it. When used with SDL_AddEventWatch, the return value - * is ignored. + * \returns true to permit event to be added to the queue, and false to + * disallow it. When used with SDL_AddEventWatch, the return value is + * ignored. * * \threadsafety SDL may call this callback at any time from any thread; the * application is responsible for locking resources the callback * touches that need to be protected. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetEventFilter * \sa SDL_AddEventWatch */ -typedef SDL_bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); +typedef bool (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. + * Set up a filter to process all events before they are added to the internal + * event queue. * - * If the filter function returns SDL_TRUE when called, then the event will be - * added to the internal queue. If it returns SDL_FALSE, 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. + * If you just want to see events without modifying them or preventing them + * from being queued, you should use SDL_AddEventWatch() instead. + * + * If the filter function returns true when called, then the event will be + * added to the internal queue. If it returns false, 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! @@ -1303,17 +1395,9 @@ typedef SDL_bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); * 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_SetEventEnabled(). * - * 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. @@ -1321,11 +1405,9 @@ typedef SDL_bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); * \param filter an SDL_EventFilter function to call when an event happens. * \param userdata a pointer that is passed to `filter`. * - * \threadsafety SDL may call the filter callback at any time from any thread; - * the application is responsible for locking resources the - * callback touches that need to be protected. + * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch * \sa SDL_SetEventEnabled @@ -1344,13 +1426,15 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter, void * \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. + * \returns true on success or false if there is no event filter set. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetEventFilter */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter *filter, void **userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_GetEventFilter(SDL_EventFilter *filter, void **userdata); /** * Add a callback to be triggered when an event is added to the event queue. @@ -1372,17 +1456,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter *filter, * * \param filter an SDL_EventFilter function to call when an event happens. * \param userdata a pointer that is passed to `filter`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RemoveEventWatch * \sa SDL_SetEventFilter */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, void *userdata); /** * Remove an event watch callback added with SDL_AddEventWatch(). @@ -1393,7 +1477,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, v * \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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch */ @@ -1401,7 +1487,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveEventWatch(SDL_EventFilter filter, vo /** * Run a specific filter function on the current event queue, removing any - * events for which the filter returns SDL_FALSE. + * events for which the filter returns false. * * See SDL_SetEventFilter() for more information. Unlike SDL_SetEventFilter(), * this function does not change the filter permanently, it only uses the @@ -1410,7 +1496,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveEventWatch(SDL_EventFilter filter, vo * \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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetEventFilter * \sa SDL_SetEventFilter @@ -1423,23 +1511,27 @@ extern SDL_DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, void * * \param type the type of event; see SDL_EventType for details. * \param enabled whether to process the event or not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_EventEnabled */ -extern SDL_DECLSPEC void SDLCALL SDL_SetEventEnabled(Uint32 type, SDL_bool enabled); +extern SDL_DECLSPEC void SDLCALL SDL_SetEventEnabled(Uint32 type, bool enabled); /** * Query the state of processing events by type. * * \param type the type of event; see SDL_EventType for details. - * \returns SDL_TRUE if the event is being processed, SDL_FALSE otherwise. + * \returns true if the event is being processed, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetEventEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EventEnabled(Uint32 type); +extern SDL_DECLSPEC bool SDLCALL SDL_EventEnabled(Uint32 type); /** * Allocate a set of user-defined events, and return the beginning event @@ -1449,7 +1541,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EventEnabled(Uint32 type); * \returns the beginning event number, or 0 if numevents is invalid or if * there are not enough user-defined events left. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PushEvent */ @@ -1461,7 +1555,9 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); * \param event an event containing a `windowID`. * \returns the associated window on success or NULL if there is none. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_WaitEvent diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_filesystem.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_filesystem.h index 5faa244..af3ca27 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_filesystem.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_filesystem.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,23 @@ /** * # CategoryFilesystem * - * SDL Filesystem API. + * SDL offers an API for examining and manipulating the system's filesystem. + * This covers most things one would need to do with directories, except for + * actual file I/O (which is covered by [CategoryIOStream](CategoryIOStream) + * and [CategoryAsyncIO](CategoryAsyncIO) instead). + * + * There are functions to answer necessary path questions: + * + * - Where is my app's data? SDL_GetBasePath(). + * - Where can I safely write files? SDL_GetPrefPath(). + * - Where are paths like Downloads, Desktop, Music? SDL_GetUserFolder(). + * - What is this thing at this location? SDL_GetPathInfo(). + * - What items live in this folder? SDL_EnumerateDirectory(). + * - What items live in this folder by wildcard? SDL_GlobDirectory(). + * - What is my current working directory? SDL_GetCurrentDirectory(). + * + * SDL also offers functions to manipulate the directory tree: renaming, + * removing, copying files. */ #ifndef SDL_filesystem_h_ @@ -73,7 +89,7 @@ extern "C" { * doesn't implement this functionality, call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPrefPath */ @@ -128,7 +144,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetBasePath(void); * etc.). This should be freed with SDL_free() when it is no longer * needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetBasePath */ @@ -143,66 +159,40 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetPrefPath(const char *org, const char * * * The folders supported per platform are: * - * | | Windows | WinRT/UWP |macOS/iOS | tvOS | Unix (XDG) | Haiku | Emscripten | - * | ----------- | ------- | --------- |--------- | ---- | ---------- | ----- | ---------- | - * | HOME | X | X | X | | X | X | X | - * | DESKTOP | X | X | X | | X | X | | - * | DOCUMENTS | X | X | X | | X | | | - * | DOWNLOADS | Vista+ | X | X | | X | | | - * | MUSIC | X | X | X | | X | | | - * | PICTURES | X | X | X | | X | | | - * | PUBLICSHARE | | | X | | X | | | - * | SAVEDGAMES | Vista+ | | | | | | | - * | SCREENSHOTS | Vista+ | X | | | | | | - * | TEMPLATES | X | X | X | | X | | | - * | VIDEOS | X | X | X* | | X | | | + * | | Windows | macOS/iOS | tvOS | Unix (XDG) | Haiku | Emscripten | + * | ----------- | ------- | --------- | ---- | ---------- | ----- | ---------- | + * | HOME | X | X | | X | X | X | + * | DESKTOP | X | X | | X | X | | + * | DOCUMENTS | X | X | | X | | | + * | DOWNLOADS | Vista+ | X | | X | | | + * | MUSIC | X | X | | X | | | + * | PICTURES | X | X | | X | | | + * | PUBLICSHARE | | X | | X | | | + * | SAVEDGAMES | Vista+ | | | | | | + * | SCREENSHOTS | Vista+ | | | | | | + * | TEMPLATES | X | X | | X | | | + * | VIDEOS | X | X* | | X | | | * * Note that on macOS/iOS, the Videos folder is called "Movies". * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetUserFolder */ typedef enum SDL_Folder { - /** The folder which contains all of the current user's data, preferences, - and documents. It usually contains most of the other folders. If a - requested folder does not exist, the home folder can be considered a safe - fallback to store a user's documents. */ - SDL_FOLDER_HOME, - /** The folder of files that are displayed on the desktop. Note that the - existence of a desktop folder does not guarantee that the system does - show icons on its desktop; certain GNU/Linux distros with a graphical - environment may not have desktop icons. */ - SDL_FOLDER_DESKTOP, - /** User document files, possibly application-specific. This is a good - place to save a user's projects. */ - SDL_FOLDER_DOCUMENTS, - /** Standard folder for user files downloaded from the internet. */ - SDL_FOLDER_DOWNLOADS, - /** Music files that can be played using a standard music player (mp3, - ogg...). */ - SDL_FOLDER_MUSIC, - /** Image files that can be displayed using a standard viewer (png, - jpg...). */ - SDL_FOLDER_PICTURES, - /** Files that are meant to be shared with other users on the same - computer. */ - SDL_FOLDER_PUBLICSHARE, - /** Save files for games. */ - SDL_FOLDER_SAVEDGAMES, - /** Application screenshots. */ - SDL_FOLDER_SCREENSHOTS, - /** Template files to be used when the user requests the desktop environment - to create a new file in a certain folder, such as "New Text File.txt". - Any file in the Templates folder can be used as a starting point for a - new file. */ - SDL_FOLDER_TEMPLATES, - /** Video files that can be played using a standard video player (mp4, - webm...). */ - SDL_FOLDER_VIDEOS, - /** total number of types in this enum, not a folder type by itself. */ - SDL_FOLDER_TOTAL + SDL_FOLDER_HOME, /**< The folder which contains all of the current user's data, preferences, and documents. It usually contains most of the other folders. If a requested folder does not exist, the home folder can be considered a safe fallback to store a user's documents. */ + SDL_FOLDER_DESKTOP, /**< The folder of files that are displayed on the desktop. Note that the existence of a desktop folder does not guarantee that the system does show icons on its desktop; certain GNU/Linux distros with a graphical environment may not have desktop icons. */ + SDL_FOLDER_DOCUMENTS, /**< User document files, possibly application-specific. This is a good place to save a user's projects. */ + SDL_FOLDER_DOWNLOADS, /**< Standard folder for user files downloaded from the internet. */ + SDL_FOLDER_MUSIC, /**< Music files that can be played using a standard music player (mp3, ogg...). */ + SDL_FOLDER_PICTURES, /**< Image files that can be displayed using a standard viewer (png, jpg...). */ + SDL_FOLDER_PUBLICSHARE, /**< Files that are meant to be shared with other users on the same computer. */ + SDL_FOLDER_SAVEDGAMES, /**< Save files for games. */ + SDL_FOLDER_SCREENSHOTS, /**< Application screenshots. */ + SDL_FOLDER_TEMPLATES, /**< Template files to be used when the user requests the desktop environment to create a new file in a certain folder, such as "New Text File.txt". Any file in the Templates folder can be used as a starting point for a new file. */ + SDL_FOLDER_VIDEOS, /**< Video files that can be played using a standard video player (mp4, webm...). */ + SDL_FOLDER_COUNT /**< Total number of types in this enum, not a folder type by itself. */ } SDL_Folder; /** @@ -226,13 +216,24 @@ typedef enum SDL_Folder * \returns either a null-terminated C string containing the full path to the * folder, or NULL if an error happened. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetUserFolder(SDL_Folder folder); /* Abstract filesystem interface */ +/** + * Types of filesystem entries. + * + * Note that there may be other sorts of items on a filesystem: devices, + * symlinks, named pipes, etc. They are currently reported as + * SDL_PATHTYPE_OTHER. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_PathInfo + */ typedef enum SDL_PathType { SDL_PATHTYPE_NONE, /**< path does not exist */ @@ -241,19 +242,27 @@ typedef enum SDL_PathType SDL_PATHTYPE_OTHER /**< something completely different like a device node (not a symlink, those are always followed) */ } SDL_PathType; +/** + * Information about a path on the filesystem. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_GetPathInfo + * \sa SDL_GetStoragePathInfo + */ typedef struct SDL_PathInfo { - SDL_PathType type; /* the path type */ - Uint64 size; /* the file size in bytes */ - SDL_Time create_time; /* the time when the path was created */ - SDL_Time modify_time; /* the last time the path was modified */ - SDL_Time access_time; /* the last time the path was read */ + SDL_PathType type; /**< the path type */ + Uint64 size; /**< the file size in bytes */ + SDL_Time create_time; /**< the time when the path was created */ + SDL_Time modify_time; /**< the last time the path was modified */ + SDL_Time access_time; /**< the last time the path was read */ } SDL_PathInfo; /** - * Flags for path matching + * Flags for path matching. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GlobDirectory * \sa SDL_GlobStorageDirectory @@ -263,73 +272,160 @@ typedef Uint32 SDL_GlobFlags; #define SDL_GLOB_CASEINSENSITIVE (1u << 0) /** - * Create a directory. + * Create a directory, and any missing parent directories. + * + * This reports success if `path` already exists as a directory. + * + * If parent directories are missing, it will also create them. Note that if + * this fails, it will not remove any parent directories it already made. * * \param path the path of the directory to create. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CreateDirectory(const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_CreateDirectory(const char *path); -/* Callback for directory enumeration. Return 1 to keep enumerating, - 0 to stop enumerating (no error), -1 to stop enumerating and - report an error. `dirname` is the directory being enumerated, - `fname` is the enumerated entry. */ -typedef int (SDLCALL *SDL_EnumerateDirectoryCallback)(void *userdata, const char *dirname, const char *fname); +/** + * Possible results from an enumeration callback. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_EnumerateDirectoryCallback + */ +typedef enum SDL_EnumerationResult +{ + SDL_ENUM_CONTINUE, /**< Value that requests that enumeration continue. */ + SDL_ENUM_SUCCESS, /**< Value that requests that enumeration stop, successfully. */ + SDL_ENUM_FAILURE /**< Value that requests that enumeration stop, as a failure. */ +} SDL_EnumerationResult; + +/** + * Callback for directory enumeration. + * + * Enumeration of directory entries will continue until either all entries + * have been provided to the callback, or the callback has requested a stop + * through its return value. + * + * Returning SDL_ENUM_CONTINUE will let enumeration proceed, calling the + * callback with further entries. SDL_ENUM_SUCCESS and SDL_ENUM_FAILURE will + * terminate the enumeration early, and dictate the return value of the + * enumeration function itself. + * + * `dirname` is guaranteed to end with a path separator ('\\' on Windows, '/' + * on most other platforms). + * + * \param userdata an app-controlled pointer that is passed to the callback. + * \param dirname the directory that is being enumerated. + * \param fname the next entry in the enumeration. + * \returns how the enumeration should proceed. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_EnumerateDirectory + */ +typedef SDL_EnumerationResult (SDLCALL *SDL_EnumerateDirectoryCallback)(void *userdata, const char *dirname, const char *fname); /** * Enumerate a directory through a callback function. * * This function provides every directory entry through an app-provided * callback, called once for each directory entry, until all results have been - * provided or the callback returns <= 0. + * provided or the callback returns either SDL_ENUM_SUCCESS or + * SDL_ENUM_FAILURE. + * + * This will return false if there was a system problem in general, or if a + * callback returns SDL_ENUM_FAILURE. A successful return means a callback + * returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries + * were enumerated. * * \param path the path of the directory to enumerate. * \param callback a function that is called for each entry in the directory. * \param userdata a pointer that is passed to `callback`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata); /** * Remove a file or an empty directory. * - * \param path the path of the directory to enumerate. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * Directories that are not empty will fail; this function will not recursely + * delete directory trees. * - * \since This function is available since SDL 3.0.0. + * \param path the path to remove from the filesystem. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RemovePath(const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_RemovePath(const char *path); /** * Rename a file or directory. * + * If the file at `newpath` already exists, it will replaced. + * + * Note that this will not copy files across filesystems/drives/volumes, as + * that is a much more complicated (and possibly time-consuming) operation. + * + * Which is to say, if this function fails, SDL_CopyFile() to a temporary file + * in the same directory as `newpath`, then SDL_RenamePath() from the + * temporary file to `newpath` and SDL_RemovePath() on `oldpath` might work + * for files. Renaming a non-empty directory across filesystems is + * dramatically more complex, however. + * * \param oldpath the old path. * \param newpath the new path. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenamePath(const char *oldpath, const char *newpath); +extern SDL_DECLSPEC bool SDLCALL SDL_RenamePath(const char *oldpath, const char *newpath); /** * Copy a file. * + * If the file at `newpath` already exists, it will be overwritten with the + * contents of the file at `oldpath`. + * + * This function will block until the copy is complete, which might be a + * significant time for large files on slow disks. On some platforms, the copy + * can be handed off to the OS itself, but on others SDL might just open both + * paths, and read from one and write to the other. + * + * Note that this is not an atomic operation! If something tries to read from + * `newpath` while the copy is in progress, it will see an incomplete copy of + * the data, and if the calling thread terminates (or the power goes out) + * during the copy, `newpath`'s previous contents will be gone, replaced with + * an incomplete copy of the data. To avoid this risk, it is recommended that + * the app copy to a temporary file in the same directory as `newpath`, and if + * the copy is successful, use SDL_RenamePath() to replace `newpath` with the + * temporary file. This will ensure that reads of `newpath` will either see a + * complete copy of the data, or it will see the pre-copy state of `newpath`. + * + * This function attempts to synchronize the newly-copied data to disk before + * returning, if the platform allows it, so that the renaming trick will not + * have a problem in a system crash or power failure, where the file could be + * renamed but the contents never made it from the system file cache to the + * physical disk. + * + * If the copy fails for any reason, the state of `newpath` is undefined. It + * might be half a copy, it might be the untouched data of what was already + * there, or it might be a zero-byte file, etc. + * * \param oldpath the old path. * \param newpath the new path. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyFile(const char *oldpath, const char *newpath); +extern SDL_DECLSPEC bool SDLCALL SDL_CopyFile(const char *oldpath, const char *newpath); /** * Get information about a filesystem path. @@ -337,21 +433,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyFile(const char *oldpath, const cha * \param path the path to query. * \param info a pointer filled in with information about the path, or NULL to * check for the existence of a file. - * \returns SDL_TRUE on success or SDL_FALSE if the file doesn't exist, or - * another failure; call SDL_GetError() for more information. + * \returns true on success or false if the file doesn't exist, or another + * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo *info); +extern SDL_DECLSPEC bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo *info); /** * Enumerate a directory tree, filtered by pattern, and return a list. * * Files are filtered out if they don't match the string in `pattern`, which - * may contain wildcard characters '*' (match everything) and '?' (match one + * may contain wildcard characters '\*' (match everything) and '?' (match one * character). If pattern is NULL, no filtering is done and all results are * returned. Subdirectories are permitted, and are specified with a path - * separator of '/'. Wildcard characters '*' and '?' never match a path + * separator of '/'. Wildcard characters '\*' and '?' never match a path * separator. * * `flags` may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching @@ -373,10 +469,31 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathI * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char ** SDLCALL SDL_GlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count); +/** + * Get what the system believes is the "current working directory." + * + * For systems without a concept of a current working directory, this will + * still attempt to provide something reasonable. + * + * SDL does not provide a means to _change_ the current working directory; for + * platforms without this concept, this would cause surprises with file access + * outside of SDL. + * + * The returned path is guaranteed to end with a path separator ('\\' on + * Windows, '/' on most other platforms). + * + * \returns a UTF-8 string of the current working directory in + * platform-dependent notation. NULL if there's a problem. This + * should be freed with SDL_free() when it is no longer needed. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC char * SDLCALL SDL_GetCurrentDirectory(void); + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gamepad.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gamepad.h index 3d2d726..264f763 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gamepad.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gamepad.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -51,6 +51,24 @@ * If you would like to receive gamepad updates while the application is in * the background, you should set the following hint before calling * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + * + * Gamepads support various optional features such as rumble, color LEDs, + * touchpad, gyro, etc. The support for these features varies depending on the + * controller and OS support available. You can check for LED and rumble + * capabilities at runtime by calling SDL_GetGamepadProperties() and checking + * the various capability properties. You can check for touchpad by calling + * SDL_GetNumGamepadTouchpads() and check for gyro and accelerometer by + * calling SDL_GamepadHasSensor(). + * + * By default SDL will try to use the most capable driver available, but you + * can tune which OS drivers to use with the various joystick hints in + * SDL_hints.h. + * + * Your application should always support gamepad hotplugging. On some + * platforms like Xbox, Steam Deck, etc., this is a requirement for + * certification. On other platforms, like macOS and Windows when using + * Windows.Gaming.Input, controllers may not be available at startup and will + * come in at some point after you've started processing events. */ #ifndef SDL_gamepad_h_ @@ -58,9 +76,11 @@ #include #include -#include -#include +#include #include +#include +#include +#include #include #include @@ -72,7 +92,7 @@ extern "C" { /** * The structure used to identify an SDL gamepad * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Gamepad SDL_Gamepad; @@ -98,7 +118,7 @@ typedef enum SDL_GamepadType SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT, SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT, SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR, - SDL_GAMEPAD_TYPE_MAX + SDL_GAMEPAD_TYPE_COUNT } SDL_GamepadType; /** @@ -122,15 +142,15 @@ typedef enum SDL_GamepadType * You can query the labels for the face buttons using * SDL_GetGamepadButtonLabel() * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadButton { SDL_GAMEPAD_BUTTON_INVALID = -1, - SDL_GAMEPAD_BUTTON_SOUTH, /* Bottom face button (e.g. Xbox A button) */ - SDL_GAMEPAD_BUTTON_EAST, /* Right face button (e.g. Xbox B button) */ - SDL_GAMEPAD_BUTTON_WEST, /* Left face button (e.g. Xbox X button) */ - SDL_GAMEPAD_BUTTON_NORTH, /* Top face button (e.g. Xbox Y button) */ + SDL_GAMEPAD_BUTTON_SOUTH, /**< Bottom face button (e.g. Xbox A button) */ + SDL_GAMEPAD_BUTTON_EAST, /**< Right face button (e.g. Xbox B button) */ + SDL_GAMEPAD_BUTTON_WEST, /**< Left face button (e.g. Xbox X button) */ + SDL_GAMEPAD_BUTTON_NORTH, /**< Top face button (e.g. Xbox Y button) */ SDL_GAMEPAD_BUTTON_BACK, SDL_GAMEPAD_BUTTON_GUIDE, SDL_GAMEPAD_BUTTON_START, @@ -142,18 +162,18 @@ typedef enum SDL_GamepadButton SDL_GAMEPAD_BUTTON_DPAD_DOWN, SDL_GAMEPAD_BUTTON_DPAD_LEFT, SDL_GAMEPAD_BUTTON_DPAD_RIGHT, - SDL_GAMEPAD_BUTTON_MISC1, /* Additional button (e.g. Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button, Google Stadia capture button) */ - SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1, /* Upper or primary paddle, under your right hand (e.g. Xbox Elite paddle P1) */ - SDL_GAMEPAD_BUTTON_LEFT_PADDLE1, /* Upper or primary paddle, under your left hand (e.g. Xbox Elite paddle P3) */ - SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2, /* Lower or secondary paddle, under your right hand (e.g. Xbox Elite paddle P2) */ - SDL_GAMEPAD_BUTTON_LEFT_PADDLE2, /* Lower or secondary paddle, under your left hand (e.g. Xbox Elite paddle P4) */ - SDL_GAMEPAD_BUTTON_TOUCHPAD, /* PS4/PS5 touchpad button */ - SDL_GAMEPAD_BUTTON_MISC2, /* Additional button */ - SDL_GAMEPAD_BUTTON_MISC3, /* Additional button */ - SDL_GAMEPAD_BUTTON_MISC4, /* Additional button */ - SDL_GAMEPAD_BUTTON_MISC5, /* Additional button */ - SDL_GAMEPAD_BUTTON_MISC6, /* Additional button */ - SDL_GAMEPAD_BUTTON_MAX + SDL_GAMEPAD_BUTTON_MISC1, /**< Additional button (e.g. Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button, Google Stadia capture button) */ + SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1, /**< Upper or primary paddle, under your right hand (e.g. Xbox Elite paddle P1) */ + SDL_GAMEPAD_BUTTON_LEFT_PADDLE1, /**< Upper or primary paddle, under your left hand (e.g. Xbox Elite paddle P3) */ + SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2, /**< Lower or secondary paddle, under your right hand (e.g. Xbox Elite paddle P2) */ + SDL_GAMEPAD_BUTTON_LEFT_PADDLE2, /**< Lower or secondary paddle, under your left hand (e.g. Xbox Elite paddle P4) */ + SDL_GAMEPAD_BUTTON_TOUCHPAD, /**< PS4/PS5 touchpad button */ + SDL_GAMEPAD_BUTTON_MISC2, /**< Additional button */ + SDL_GAMEPAD_BUTTON_MISC3, /**< Additional button */ + SDL_GAMEPAD_BUTTON_MISC4, /**< Additional button */ + SDL_GAMEPAD_BUTTON_MISC5, /**< Additional button */ + SDL_GAMEPAD_BUTTON_MISC6, /**< Additional button */ + SDL_GAMEPAD_BUTTON_COUNT } SDL_GamepadButton; /** @@ -165,7 +185,7 @@ typedef enum SDL_GamepadButton * For a complete set, you should look at the button and gamepad type and have * a set of symbols that work well with your art style. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadButtonLabel { @@ -192,7 +212,7 @@ typedef enum SDL_GamepadButtonLabel * pressed) when reported by SDL_GetGamepadAxis(). Note that this is not the * same range that will be reported by the lower-level SDL_GetJoystickAxis(). * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadAxis { @@ -203,7 +223,7 @@ typedef enum SDL_GamepadAxis SDL_GAMEPAD_AXIS_RIGHTY, SDL_GAMEPAD_AXIS_LEFT_TRIGGER, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, - SDL_GAMEPAD_AXIS_MAX + SDL_GAMEPAD_AXIS_COUNT } SDL_GamepadAxis; /** @@ -214,7 +234,7 @@ typedef enum SDL_GamepadAxis * gamepad. This enum is used as part of SDL_GamepadBinding to specify those * mappings. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadBindingType { @@ -235,7 +255,7 @@ typedef enum SDL_GamepadBindingType * more with a simple text string. Those strings are parsed into a collection * of these structs to make it easier to operate on the data. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetGamepadBindings */ @@ -293,6 +313,9 @@ typedef struct SDL_GamepadBinding * * Buttons can be used as a gamepad axes and vice versa. * + * If a device with this GUID is already plugged in, SDL will generate an + * SDL_EVENT_GAMEPAD_ADDED event. + * * This string shows an example of a valid mapping for a gamepad: * * ```c @@ -305,10 +328,15 @@ typedef struct SDL_GamepadBinding * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * + * \sa SDL_AddGamepadMappingsFromFile + * \sa SDL_AddGamepadMappingsFromIO * \sa SDL_GetGamepadMapping * \sa SDL_GetGamepadMappingForGUID + * \sa SDL_HINT_GAMECONTROLLERCONFIG + * \sa SDL_HINT_GAMECONTROLLERCONFIG_FILE + * \sa SDL_EVENT_GAMEPAD_ADDED */ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMapping(const char *mapping); @@ -321,6 +349,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMapping(const char *mapping); * If a new mapping is loaded for an already known gamepad GUID, the later * version will overwrite the one currently loaded. * + * Any new mappings for already plugged in controllers will generate + * SDL_EVENT_GAMEPAD_ADDED events. + * * 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). @@ -330,21 +361,24 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMapping(const char *mapping); * constrained environment. * * \param src the data stream for the mappings to be added. - * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning, - * even in the case of an error. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. * \returns the number of mappings added or -1 on failure; call SDL_GetError() * for more information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_AddGamepadMappingsFromFile * \sa SDL_GetGamepadMapping * \sa SDL_GetGamepadMappingForGUID + * \sa SDL_HINT_GAMECONTROLLERCONFIG + * \sa SDL_HINT_GAMECONTROLLERCONFIG_FILE + * \sa SDL_EVENT_GAMEPAD_ADDED */ -extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, SDL_bool closeio); +extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, bool closeio); /** * Load a set of gamepad mappings from a file. @@ -355,6 +389,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, * If a new mapping is loaded for an already known gamepad GUID, the later * version will overwrite the one currently loaded. * + * Any new mappings for already plugged in controllers will generate + * SDL_EVENT_GAMEPAD_ADDED events. + * * 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). @@ -365,12 +402,15 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_AddGamepadMappingsFromIO * \sa SDL_GetGamepadMapping * \sa SDL_GetGamepadMappingForGUID + * \sa SDL_HINT_GAMECONTROLLERCONFIG + * \sa SDL_HINT_GAMECONTROLLERCONFIG_FILE + * \sa SDL_EVENT_GAMEPAD_ADDED */ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromFile(const char *file); @@ -379,12 +419,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromFile(const char *file) * * This will generate gamepad events as needed if device mappings change. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReloadGamepadMappings(void); +extern SDL_DECLSPEC bool SDLCALL SDL_ReloadGamepadMappings(void); /** * Get the current gamepad mappings. @@ -396,7 +436,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReloadGamepadMappings(void); * single allocation that should be freed with SDL_free() when it is * no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char ** SDLCALL SDL_GetGamepadMappings(int *count); @@ -408,7 +448,7 @@ extern SDL_DECLSPEC char ** SDLCALL SDL_GetGamepadMappings(int *count); * information. This should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID * \sa SDL_GetJoystickGUID @@ -425,7 +465,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForGUID(SDL_GUID guid); * available; call SDL_GetError() for more information. This should * be freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_GetGamepadMappingForID @@ -442,26 +482,26 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMapping(SDL_Gamepad *gamepad); * \param instance_id the joystick instance ID. * \param mapping the mapping to use for this device, or NULL to clear the * mapping. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_GetGamepadMapping */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadMapping(SDL_JoystickID instance_id, const char *mapping); +extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadMapping(SDL_JoystickID instance_id, const char *mapping); /** * Return whether a gamepad is currently connected. * - * \returns SDL_TRUE if a gamepad is connected, SDL_FALSE otherwise. + * \returns true if a gamepad is connected, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepads */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasGamepad(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasGamepad(void); /** * Get a list of currently connected gamepads. @@ -472,7 +512,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasGamepad(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasGamepad * \sa SDL_OpenGamepad @@ -483,15 +523,15 @@ extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetGamepads(int *count); * Check if the given joystick is supported by the gamepad interface. * * \param instance_id the joystick instance ID. - * \returns SDL_TRUE if the given joystick is supported by the gamepad - * interface, SDL_FALSE if it isn't or it's an invalid index. + * \returns true if the given joystick is supported by the gamepad interface, + * false if it isn't or it's an invalid index. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoysticks * \sa SDL_OpenGamepad */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id); +extern SDL_DECLSPEC bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id); /** * Get the implementation dependent name of a gamepad. @@ -502,7 +542,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id); * \returns the name of the selected gamepad. If no name can be found, this * function returns NULL; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadName * \sa SDL_GetGamepads @@ -518,7 +558,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadNameForID(SDL_JoystickID * \returns the path of the selected gamepad. If no path can be found, this * function returns NULL; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPath * \sa SDL_GetGamepads @@ -533,7 +573,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPathForID(SDL_JoystickID * \param instance_id the joystick instance ID. * \returns the player index of a gamepad, or -1 if it's not available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex * \sa SDL_GetGamepads @@ -549,7 +589,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndexForID(SDL_JoystickID in * \returns the GUID of the selected gamepad. If called on an invalid index, * this function returns a zero GUID. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GUIDToString * \sa SDL_GetGamepads @@ -566,7 +606,7 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetGamepadGUIDForID(SDL_JoystickID inst * \returns the USB vendor ID of the selected gamepad. If called on an invalid * index, this function returns zero. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadVendor * \sa SDL_GetGamepads @@ -583,7 +623,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendorForID(SDL_JoystickID inst * \returns the USB product ID of the selected gamepad. If called on an * invalid index, this function returns zero. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProduct * \sa SDL_GetGamepads @@ -600,7 +640,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductForID(SDL_JoystickID ins * \returns the product version of the selected gamepad. If called on an * invalid index, this function returns zero. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductVersion * \sa SDL_GetGamepads @@ -615,7 +655,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersionForID(SDL_Joystic * \param instance_id the joystick instance ID. * \returns the gamepad type. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadType * \sa SDL_GetGamepads @@ -631,7 +671,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeForID(SDL_Joystick * \param instance_id the joystick instance ID. * \returns the gamepad type. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeForID * \sa SDL_GetGamepads @@ -648,7 +688,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadTypeForID(SDL_Joys * \returns the mapping string. Returns NULL if no mapping is available. This * should be freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepads * \sa SDL_GetGamepadMapping @@ -662,7 +702,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForID(SDL_JoystickID ins * \returns a gamepad identifier or NULL if an error occurred; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseGamepad * \sa SDL_IsGamepad @@ -677,7 +717,7 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_OpenGamepad(SDL_JoystickID instanc * \returns an SDL_Gamepad on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromID(SDL_JoystickID instance_id); @@ -687,7 +727,7 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromID(SDL_JoystickID in * \param player_index the player index, which different from the instance ID. * \returns the SDL_Gamepad associated with a player index. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex * \sa SDL_SetGamepadPlayerIndex @@ -717,7 +757,7 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromPlayerIndex(int play * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGamepadProperties(SDL_Gamepad *gamepad); @@ -735,7 +775,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGamepadProperties(SDL_Gamepa * \returns the instance ID of the specified gamepad on success or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad); @@ -747,7 +787,7 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad * \returns the implementation dependent name for the gamepad, or NULL if * there is no name or the identifier passed is invalid. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadNameForID */ @@ -761,7 +801,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadName(SDL_Gamepad *gamepad * \returns the implementation dependent path for the gamepad, or NULL if * there is no path or the identifier passed is invalid. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPathForID */ @@ -774,7 +814,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPath(SDL_Gamepad *gamepad * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not * available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeForID */ @@ -787,7 +827,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadType(SDL_Gamepad *game * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not * available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRealGamepadTypeForID */ @@ -801,7 +841,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadType(SDL_Gamepad * * \param gamepad the gamepad object to query. * \returns the player index for gamepad, or -1 if it's not available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadPlayerIndex */ @@ -813,14 +853,14 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndex(SDL_Gamepad *gamepad); * \param gamepad the gamepad object to adjust. * \param player_index player index to assign to this gamepad, or -1 to clear * the player index and turn off player LEDs. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadPlayerIndex(SDL_Gamepad *gamepad, int player_index); +extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadPlayerIndex(SDL_Gamepad *gamepad, int player_index); /** * Get the USB vendor ID of an opened gamepad, if available. @@ -830,7 +870,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadPlayerIndex(SDL_Gamepad *game * \param gamepad the gamepad object to query. * \returns the USB vendor ID, or zero if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadVendorForID */ @@ -844,7 +884,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendor(SDL_Gamepad *gamepad); * \param gamepad the gamepad object to query. * \returns the USB product ID, or zero if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductForID */ @@ -858,7 +898,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProduct(SDL_Gamepad *gamepad); * \param gamepad the gamepad object to query. * \returns the USB product version, or zero if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductVersionForID */ @@ -872,7 +912,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersion(SDL_Gamepad *gam * \param gamepad the gamepad object to query. * \returns the gamepad firmware version, or zero if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *gamepad); @@ -884,7 +924,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *ga * \param gamepad the gamepad object to query. * \returns the serial number, or NULL if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamepad); @@ -897,7 +937,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamep * \param gamepad the gamepad object to query. * \returns the gamepad handle, or 0 if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetGamepadSteamHandle(SDL_Gamepad *gamepad); @@ -909,7 +949,7 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetGamepadSteamHandle(SDL_Gamepad *gamepa * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetGamepadConnectionState(SDL_Gamepad *gamepad); @@ -929,7 +969,7 @@ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetGamepadConnection * battery. * \returns the current battery state. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetGamepadPowerInfo(SDL_Gamepad *gamepad, int *percent); @@ -938,12 +978,12 @@ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetGamepadPowerInfo(SDL_Gamepad * * * \param gamepad a gamepad identifier previously returned by * SDL_OpenGamepad(). - * \returns SDL_TRUE if the gamepad has been opened and is currently - * connected, or SDL_FALSE if not. + * \returns true if the gamepad has been opened and is currently connected, or + * false if not. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); /** * Get the underlying joystick from a gamepad. @@ -961,7 +1001,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); * \returns an SDL_Joystick object, or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetGamepadJoystick(SDL_Gamepad *gamepad); @@ -973,12 +1013,12 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetGamepadJoystick(SDL_Gamepad *g * * \param enabled whether to process gamepad events or not. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadEventsEnabled * \sa SDL_UpdateGamepads */ -extern SDL_DECLSPEC void SDLCALL SDL_SetGamepadEventsEnabled(SDL_bool enabled); +extern SDL_DECLSPEC void SDLCALL SDL_SetGamepadEventsEnabled(bool enabled); /** * Query the state of gamepad event processing. @@ -986,14 +1026,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGamepadEventsEnabled(SDL_bool enabled); * If gamepad events are disabled, you must call SDL_UpdateGamepads() yourself * and check the state of the gamepad when you want gamepad information. * - * \returns SDL_TRUE if gamepad events are being processed, SDL_FALSE - * otherwise. + * \returns true if gamepad events are being processed, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadEventsEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadEventsEnabled(void); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadEventsEnabled(void); /** * Get the SDL joystick layer bindings for a gamepad. @@ -1005,7 +1044,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadEventsEnabled(void); * single allocation that should be freed with SDL_free() when it is * no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gamepad *gamepad, int *count); @@ -1016,7 +1055,7 @@ extern SDL_DECLSPEC SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gam * enabled. Under such circumstances, it will not be necessary to call this * function. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateGamepads(void); @@ -1032,7 +1071,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UpdateGamepads(void); * \returns the SDL_GamepadType enum corresponding to the input string, or * `SDL_GAMEPAD_TYPE_UNKNOWN` if no match was found. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForType */ @@ -1046,7 +1085,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeFromString(const c * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeFromString */ @@ -1068,7 +1107,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForType(SDL_Gamepad * \returns the SDL_GamepadAxis enum corresponding to the input string, or * `SDL_GAMEPAD_AXIS_INVALID` if no match was found. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForAxis */ @@ -1082,7 +1121,7 @@ extern SDL_DECLSPEC SDL_GamepadAxis SDLCALL SDL_GetGamepadAxisFromString(const c * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAxisFromString */ @@ -1096,14 +1135,14 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForAxis(SDL_Gamepad * * \param gamepad a gamepad. * \param axis an axis enum value (an SDL_GamepadAxis value). - * \returns SDL_TRUE if the gamepad has this axis, SDL_FALSE otherwise. + * \returns true if the gamepad has this axis, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasButton * \sa SDL_GetGamepadAxis */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); /** * Get the current state of an axis control on a gamepad. @@ -1122,7 +1161,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SD * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasAxis * \sa SDL_GetGamepadButton @@ -1141,7 +1180,7 @@ extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetGamepadAxis(SDL_Gamepad *gamepad, SDL_ * \returns the SDL_GamepadButton enum corresponding to the input string, or * `SDL_GAMEPAD_BUTTON_INVALID` if no match was found. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForButton */ @@ -1155,7 +1194,7 @@ extern SDL_DECLSPEC SDL_GamepadButton SDLCALL SDL_GetGamepadButtonFromString(con * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonFromString */ @@ -1169,28 +1208,27 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForButton(SDL_Gamep * * \param gamepad a gamepad. * \param button a button enum value (an SDL_GamepadButton value). - * \returns SDL_TRUE if the gamepad has this button, SDL_FALSE otherwise. + * \returns true if the gamepad has this button, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasAxis */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); /** * Get the current state of a button on a gamepad. * * \param gamepad a gamepad. * \param button a button index (one of the SDL_GamepadButton values). - * \returns 1 for pressed state or 0 for not pressed state or failure; call - * SDL_GetError() for more information. + * \returns true if the button is pressed, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasButton * \sa SDL_GetGamepadAxis */ -extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); +extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); /** * Get the label of a button on a gamepad. @@ -1199,7 +1237,7 @@ extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL * \param button a button index (one of the SDL_GamepadButton values). * \returns the SDL_GamepadButtonLabel enum corresponding to the button label. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonLabel */ @@ -1212,7 +1250,7 @@ extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabelForT * \param button a button index (one of the SDL_GamepadButton values). * \returns the SDL_GamepadButtonLabel enum corresponding to the button label. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonLabelForType */ @@ -1224,7 +1262,7 @@ extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabel(SDL * \param gamepad a gamepad. * \returns number of touchpads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumGamepadTouchpadFingers */ @@ -1238,7 +1276,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpads(SDL_Gamepad *gamepad) * \param touchpad a touchpad. * \returns number of supported simultaneous fingers. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTouchpadFinger * \sa SDL_GetNumGamepadTouchpads @@ -1251,35 +1289,36 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpadFingers(SDL_Gamepad *ga * \param gamepad a gamepad. * \param touchpad a touchpad. * \param finger a finger. - * \param state filled with state. - * \param x filled with x position, normalized 0 to 1, with the origin in the - * upper left. - * \param y filled with y position, normalized 0 to 1, with the origin in the - * upper left. - * \param pressure filled with pressure value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param down a pointer filled with true if the finger is down, false + * otherwise, may be NULL. + * \param x a pointer filled with the x position, normalized 0 to 1, with the + * origin in the upper left, may be NULL. + * \param y a pointer filled with the y position, normalized 0 to 1, with the + * origin in the upper left, may be NULL. + * \param pressure a pointer filled with pressure value, may be NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumGamepadTouchpadFingers */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGamepadTouchpadFinger(SDL_Gamepad *gamepad, int touchpad, int finger, Uint8 *state, float *x, float *y, float *pressure); +extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadTouchpadFinger(SDL_Gamepad *gamepad, int touchpad, int finger, bool *down, float *x, float *y, float *pressure); /** * Return whether a gamepad has a particular sensor. * * \param gamepad the gamepad to query. * \param type the type of sensor to query. - * \returns SDL_TRUE if the sensor exists, SDL_FALSE otherwise. + * \returns true if the sensor exists, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadSensorData * \sa SDL_GetGamepadSensorDataRate * \sa SDL_SetGamepadSensorEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasSensor(SDL_Gamepad *gamepad, SDL_SensorType type); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasSensor(SDL_Gamepad *gamepad, SDL_SensorType type); /** * Set whether data reporting for a gamepad sensor is enabled. @@ -1287,28 +1326,28 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasSensor(SDL_Gamepad *gamepad, * \param gamepad the gamepad to update. * \param type the type of sensor to enable/disable. * \param enabled whether data reporting should be enabled. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasSensor * \sa SDL_GamepadSensorEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type, SDL_bool enabled); +extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type, bool enabled); /** * Query whether sensor data reporting is enabled for a gamepad. * * \param gamepad the gamepad to query. * \param type the type of sensor to query. - * \returns SDL_TRUE if the sensor is enabled, SDL_FALSE otherwise. + * \returns true if the sensor is enabled, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadSensorEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type); /** * Get the data rate (number of events per second) of a gamepad sensor. @@ -1317,7 +1356,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadSensorEnabled(SDL_Gamepad *gamep * \param type the type of sensor to query. * \returns the data rate, or 0.0f if the data rate is not available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *gamepad, SDL_SensorType type); @@ -1331,12 +1370,12 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *game * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamepad, SDL_SensorType type, float *data, int num_values); +extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamepad, SDL_SensorType type, float *data, int num_values); /** * Start a rumble effect on a gamepad. @@ -1353,12 +1392,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamep * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); +extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); /** * Start a rumble effect in the gamepad's triggers. @@ -1379,14 +1418,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uin * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RumbleGamepad */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleGamepadTriggers(SDL_Gamepad *gamepad, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); +extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepadTriggers(SDL_Gamepad *gamepad, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); /** * Update a gamepad's LED color. @@ -1401,12 +1440,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleGamepadTriggers(SDL_Gamepad *game * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uint8 red, Uint8 green, Uint8 blue); +extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uint8 red, Uint8 green, Uint8 blue); /** * Send a gamepad specific effect packet. @@ -1414,12 +1453,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uin * \param gamepad the gamepad to affect. * \param data the data to send to the gamepad. * \param size the size of the data to send to the gamepad. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, const void *data, int size); +extern SDL_DECLSPEC bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, const void *data, int size); /** * Close a gamepad previously opened with SDL_OpenGamepad(). @@ -1427,7 +1466,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, * \param gamepad a gamepad identifier previously returned by * SDL_OpenGamepad(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenGamepad */ @@ -1441,7 +1480,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseGamepad(SDL_Gamepad *gamepad); * \param button a button on the gamepad. * \returns the sfSymbolsName or NULL if the name can't be found. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAppleSFSymbolsNameForAxis */ @@ -1454,7 +1493,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForButt * \param axis an axis on the gamepad. * \returns the sfSymbolsName or NULL if the name can't be found. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAppleSFSymbolsNameForButton */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gpu.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gpu.h index bba47cc..fa870a5 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gpu.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gpu.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -24,7 +24,281 @@ /** * # CategoryGPU * - * Include file for SDL GPU API functions + * The GPU API offers a cross-platform way for apps to talk to modern graphics + * hardware. It offers both 3D graphics and compute support, in the style of + * Metal, Vulkan, and Direct3D 12. + * + * A basic workflow might be something like this: + * + * The app creates a GPU device with SDL_CreateGPUDevice(), and assigns it to + * a window with SDL_ClaimWindowForGPUDevice()--although strictly speaking you + * can render offscreen entirely, perhaps for image processing, and not use a + * window at all. + * + * Next the app prepares static data (things that are created once and used + * over and over). For example: + * + * - Shaders (programs that run on the GPU): use SDL_CreateGPUShader(). + * - Vertex buffers (arrays of geometry data) and other data rendering will + * need: use SDL_UploadToGPUBuffer(). + * - Textures (images): use SDL_UploadToGPUTexture(). + * - Samplers (how textures should be read from): use SDL_CreateGPUSampler(). + * - Render pipelines (precalculated rendering state): use + * SDL_CreateGPUGraphicsPipeline() + * + * To render, the app creates one or more command buffers, with + * SDL_AcquireGPUCommandBuffer(). Command buffers collect rendering + * instructions that will be submitted to the GPU in batch. Complex scenes can + * use multiple command buffers, maybe configured across multiple threads in + * parallel, as long as they are submitted in the correct order, but many apps + * will just need one command buffer per frame. + * + * Rendering can happen to a texture (what other APIs call a "render target") + * or it can happen to the swapchain texture (which is just a special texture + * that represents a window's contents). The app can use + * SDL_WaitAndAcquireGPUSwapchainTexture() to render to the window. + * + * Rendering actually happens in a Render Pass, which is encoded into a + * command buffer. One can encode multiple render passes (or alternate between + * render and compute passes) in a single command buffer, but many apps might + * simply need a single render pass in a single command buffer. Render Passes + * can render to up to four color textures and one depth texture + * simultaneously. If the set of textures being rendered to needs to change, + * the Render Pass must be ended and a new one must be begun. + * + * The app calls SDL_BeginGPURenderPass(). Then it sets states it needs for + * each draw: + * + * - SDL_BindGPUGraphicsPipeline() + * - SDL_SetGPUViewport() + * - SDL_BindGPUVertexBuffers() + * - SDL_BindGPUVertexSamplers() + * - etc + * + * Then, make the actual draw commands with these states: + * + * - SDL_DrawGPUPrimitives() + * - SDL_DrawGPUPrimitivesIndirect() + * - SDL_DrawGPUIndexedPrimitivesIndirect() + * - etc + * + * After all the drawing commands for a pass are complete, the app should call + * SDL_EndGPURenderPass(). Once a render pass ends all render-related state is + * reset. + * + * The app can begin new Render Passes and make new draws in the same command + * buffer until the entire scene is rendered. + * + * Once all of the render commands for the scene are complete, the app calls + * SDL_SubmitGPUCommandBuffer() to send it to the GPU for processing. + * + * If the app needs to read back data from texture or buffers, the API has an + * efficient way of doing this, provided that the app is willing to tolerate + * some latency. When the app uses SDL_DownloadFromGPUTexture() or + * SDL_DownloadFromGPUBuffer(), submitting the command buffer with + * SDL_SubmitGPUCommandBufferAndAcquireFence() will return a fence handle that + * the app can poll or wait on in a thread. Once the fence indicates that the + * command buffer is done processing, it is safe to read the downloaded data. + * Make sure to call SDL_ReleaseGPUFence() when done with the fence. + * + * The API also has "compute" support. The app calls SDL_BeginGPUComputePass() + * with compute-writeable textures and/or buffers, which can be written to in + * a compute shader. Then it sets states it needs for the compute dispatches: + * + * - SDL_BindGPUComputePipeline() + * - SDL_BindGPUComputeStorageBuffers() + * - SDL_BindGPUComputeStorageTextures() + * + * Then, dispatch compute work: + * + * - SDL_DispatchGPUCompute() + * + * For advanced users, this opens up powerful GPU-driven workflows. + * + * Graphics and compute pipelines require the use of shaders, which as + * mentioned above are small programs executed on the GPU. Each backend + * (Vulkan, Metal, D3D12) requires a different shader format. When the app + * creates the GPU device, the app lets the device know which shader formats + * the app can provide. It will then select the appropriate backend depending + * on the available shader formats and the backends available on the platform. + * When creating shaders, the app must provide the correct shader format for + * the selected backend. If you would like to learn more about why the API + * works this way, there is a detailed + * [blog post](https://moonside.games/posts/layers-all-the-way-down/) + * explaining this situation. + * + * It is optimal for apps to pre-compile the shader formats they might use, + * but for ease of use SDL provides a separate project, + * [SDL_shadercross](https://github.com/libsdl-org/SDL_shadercross) + * , for performing runtime shader cross-compilation. + * + * This is an extremely quick overview that leaves out several important + * details. Already, though, one can see that GPU programming can be quite + * complex! If you just need simple 2D graphics, the + * [Render API](https://wiki.libsdl.org/SDL3/CategoryRender) + * is much easier to use but still hardware-accelerated. That said, even for + * 2D applications the performance benefits and expressiveness of the GPU API + * are significant. + * + * The GPU API targets a feature set with a wide range of hardware support and + * ease of portability. It is designed so that the app won't have to branch + * itself by querying feature support. If you need cutting-edge features with + * limited hardware support, this API is probably not for you. + * + * Examples demonstrating proper usage of this API can be found + * [here](https://github.com/TheSpydog/SDL_gpu_examples) + * . + * + * ## Performance considerations + * + * Here are some basic tips for maximizing your rendering performance. + * + * - Beginning a new render pass is relatively expensive. Use as few render + * passes as you can. + * - Minimize the amount of state changes. For example, binding a pipeline is + * relatively cheap, but doing it hundreds of times when you don't need to + * will slow the performance significantly. + * - Perform your data uploads as early as possible in the frame. + * - Don't churn resources. Creating and releasing resources is expensive. + * It's better to create what you need up front and cache it. + * - Don't use uniform buffers for large amounts of data (more than a matrix + * or so). Use a storage buffer instead. + * - Use cycling correctly. There is a detailed explanation of cycling further + * below. + * - Use culling techniques to minimize pixel writes. The less writing the GPU + * has to do the better. Culling can be a very advanced topic but even + * simple culling techniques can boost performance significantly. + * + * In general try to remember the golden rule of performance: doing things is + * more expensive than not doing things. Don't Touch The Driver! + * + * ## FAQ + * + * **Question: When are you adding more advanced features, like ray tracing or + * mesh shaders?** + * + * Answer: We don't have immediate plans to add more bleeding-edge features, + * but we certainly might in the future, when these features prove worthwhile, + * and reasonable to implement across several platforms and underlying APIs. + * So while these things are not in the "never" category, they are definitely + * not "near future" items either. + * + * **Question: Why is my shader not working?** + * + * Answer: A common oversight when using shaders is not properly laying out + * the shader resources/registers correctly. The GPU API is very strict with + * how it wants resources to be laid out and it's difficult for the API to + * automatically validate shaders to see if they have a compatible layout. See + * the documentation for SDL_CreateGPUShader() and + * SDL_CreateGPUComputePipeline() for information on the expected layout. + * + * Another common issue is not setting the correct number of samplers, + * textures, and buffers in SDL_GPUShaderCreateInfo. If possible use shader + * reflection to extract the required information from the shader + * automatically instead of manually filling in the struct's values. + * + * **Question: My application isn't performing very well. Is this the GPU + * API's fault?** + * + * Answer: No. Long answer: The GPU API is a relatively thin layer over the + * underlying graphics API. While it's possible that we have done something + * inefficiently, it's very unlikely especially if you are relatively + * inexperienced with GPU rendering. Please see the performance tips above and + * make sure you are following them. Additionally, tools like RenderDoc can be + * very helpful for diagnosing incorrect behavior and performance issues. + * + * ## System Requirements + * + * **Vulkan:** Supported on Windows, Linux, Nintendo Switch, and certain + * Android devices. Requires Vulkan 1.0 with the following extensions and + * device features: + * + * - `VK_KHR_swapchain` + * - `VK_KHR_maintenance1` + * - `independentBlend` + * - `imageCubeArray` + * - `depthClamp` + * - `shaderClipDistance` + * - `drawIndirectFirstInstance` + * + * **D3D12:** Supported on Windows 10 or newer, Xbox One (GDK), and Xbox + * Series X|S (GDK). Requires a GPU that supports DirectX 12 Feature Level + * 11_1. + * + * **Metal:** Supported on macOS 10.14+ and iOS/tvOS 13.0+. Hardware + * requirements vary by operating system: + * + * - macOS requires an Apple Silicon or + * [Intel Mac2 family](https://developer.apple.com/documentation/metal/mtlfeatureset/mtlfeatureset_macos_gpufamily2_v1?language=objc) + * GPU + * - iOS/tvOS requires an A9 GPU or newer + * - iOS Simulator and tvOS Simulator are unsupported + * + * ## Uniform Data + * + * Uniforms are for passing data to shaders. The uniform data will be constant + * across all executions of the shader. + * + * There are 4 available uniform slots per shader stage (where the stages are + * vertex, fragment, and compute). Uniform data pushed to a slot on a stage + * keeps its value throughout the command buffer until you call the relevant + * Push function on that slot again. + * + * For example, you could write your vertex shaders to read a camera matrix + * from uniform binding slot 0, push the camera matrix at the start of the + * command buffer, and that data will be used for every subsequent draw call. + * + * It is valid to push uniform data during a render or compute pass. + * + * Uniforms are best for pushing small amounts of data. If you are pushing + * more than a matrix or two per call you should consider using a storage + * buffer instead. + * + * ## A Note On Cycling + * + * When using a command buffer, operations do not occur immediately - they + * occur some time after the command buffer is submitted. + * + * When a resource is used in a pending or active command buffer, it is + * considered to be "bound". When a resource is no longer used in any pending + * or active command buffers, it is considered to be "unbound". + * + * If data resources are bound, it is unspecified when that data will be + * unbound unless you acquire a fence when submitting the command buffer and + * wait on it. However, this doesn't mean you need to track resource usage + * manually. + * + * All of the functions and structs that involve writing to a resource have a + * "cycle" bool. SDL_GPUTransferBuffer, SDL_GPUBuffer, and SDL_GPUTexture all + * effectively function as ring buffers on internal resources. When cycle is + * true, if the resource is bound, the cycle rotates to the next unbound + * internal resource, or if none are available, a new one is created. This + * means you don't have to worry about complex state tracking and + * synchronization as long as cycling is correctly employed. + * + * For example: you can call SDL_MapGPUTransferBuffer(), write texture data, + * SDL_UnmapGPUTransferBuffer(), and then SDL_UploadToGPUTexture(). The next + * time you write texture data to the transfer buffer, if you set the cycle + * param to true, you don't have to worry about overwriting any data that is + * not yet uploaded. + * + * Another example: If you are using a texture in a render pass every frame, + * this can cause a data dependency between frames. If you set cycle to true + * in the SDL_GPUColorTargetInfo struct, you can prevent this data dependency. + * + * Cycling will never undefine already bound data. When cycling, all data in + * the resource is considered to be undefined for subsequent commands until + * that data is written again. You must take care not to read undefined data. + * + * Note that when cycling a texture, the entire texture will be cycled, even + * if only part of the texture is used in the call, so you must consider the + * entire texture to contain undefined data after cycling. + * + * You must also take care not to overwrite a section of data that has been + * referenced in a command without cycling first. It is OK to overwrite + * unreferenced data in a bound resource without cycling, but overwriting a + * section of data that has already been referenced will produce unexpected + * results. */ #ifndef SDL_gpu_h_ @@ -44,132 +318,394 @@ extern "C" { /* Type Declarations */ +/** + * An opaque handle representing the SDL_GPU context. + * + * \since This struct is available since SDL 3.2.0. + */ typedef struct SDL_GPUDevice SDL_GPUDevice; + +/** + * An opaque handle representing a buffer. + * + * Used for vertices, indices, indirect draw commands, and general compute + * data. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUBuffer + * \sa SDL_UploadToGPUBuffer + * \sa SDL_DownloadFromGPUBuffer + * \sa SDL_CopyGPUBufferToBuffer + * \sa SDL_BindGPUVertexBuffers + * \sa SDL_BindGPUIndexBuffer + * \sa SDL_BindGPUVertexStorageBuffers + * \sa SDL_BindGPUFragmentStorageBuffers + * \sa SDL_DrawGPUPrimitivesIndirect + * \sa SDL_DrawGPUIndexedPrimitivesIndirect + * \sa SDL_BindGPUComputeStorageBuffers + * \sa SDL_DispatchGPUComputeIndirect + * \sa SDL_ReleaseGPUBuffer + */ typedef struct SDL_GPUBuffer SDL_GPUBuffer; + +/** + * An opaque handle representing a transfer buffer. + * + * Used for transferring data to and from the device. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTransferBuffer + * \sa SDL_MapGPUTransferBuffer + * \sa SDL_UnmapGPUTransferBuffer + * \sa SDL_UploadToGPUBuffer + * \sa SDL_UploadToGPUTexture + * \sa SDL_DownloadFromGPUBuffer + * \sa SDL_DownloadFromGPUTexture + * \sa SDL_ReleaseGPUTransferBuffer + */ typedef struct SDL_GPUTransferBuffer SDL_GPUTransferBuffer; + +/** + * An opaque handle representing a texture. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + * \sa SDL_UploadToGPUTexture + * \sa SDL_DownloadFromGPUTexture + * \sa SDL_CopyGPUTextureToTexture + * \sa SDL_BindGPUVertexSamplers + * \sa SDL_BindGPUVertexStorageTextures + * \sa SDL_BindGPUFragmentSamplers + * \sa SDL_BindGPUFragmentStorageTextures + * \sa SDL_BindGPUComputeStorageTextures + * \sa SDL_GenerateMipmapsForGPUTexture + * \sa SDL_BlitGPUTexture + * \sa SDL_ReleaseGPUTexture + */ typedef struct SDL_GPUTexture SDL_GPUTexture; + +/** + * An opaque handle representing a sampler. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUSampler + * \sa SDL_BindGPUVertexSamplers + * \sa SDL_BindGPUFragmentSamplers + * \sa SDL_ReleaseGPUSampler + */ typedef struct SDL_GPUSampler SDL_GPUSampler; + +/** + * An opaque handle representing a compiled shader object. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUShader + * \sa SDL_CreateGPUGraphicsPipeline + * \sa SDL_ReleaseGPUShader + */ typedef struct SDL_GPUShader SDL_GPUShader; + +/** + * An opaque handle representing a compute pipeline. + * + * Used during compute passes. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUComputePipeline + * \sa SDL_BindGPUComputePipeline + * \sa SDL_ReleaseGPUComputePipeline + */ typedef struct SDL_GPUComputePipeline SDL_GPUComputePipeline; + +/** + * An opaque handle representing a graphics pipeline. + * + * Used during render passes. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + * \sa SDL_BindGPUGraphicsPipeline + * \sa SDL_ReleaseGPUGraphicsPipeline + */ typedef struct SDL_GPUGraphicsPipeline SDL_GPUGraphicsPipeline; + +/** + * An opaque handle representing a command buffer. + * + * Most state is managed via command buffers. When setting state using a + * command buffer, that state is local to the command buffer. + * + * Commands only begin execution on the GPU once SDL_SubmitGPUCommandBuffer is + * called. Once the command buffer is submitted, it is no longer valid to use + * it. + * + * Command buffers are executed in submission order. If you submit command + * buffer A and then command buffer B all commands in A will begin executing + * before any command in B begins executing. + * + * In multi-threading scenarios, you should only access a command buffer on + * the thread you acquired it from. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_AcquireGPUCommandBuffer + * \sa SDL_SubmitGPUCommandBuffer + * \sa SDL_SubmitGPUCommandBufferAndAcquireFence + */ typedef struct SDL_GPUCommandBuffer SDL_GPUCommandBuffer; + +/** + * An opaque handle representing a render pass. + * + * This handle is transient and should not be held or referenced after + * SDL_EndGPURenderPass is called. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPURenderPass + * \sa SDL_EndGPURenderPass + */ typedef struct SDL_GPURenderPass SDL_GPURenderPass; + +/** + * An opaque handle representing a compute pass. + * + * This handle is transient and should not be held or referenced after + * SDL_EndGPUComputePass is called. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPUComputePass + * \sa SDL_EndGPUComputePass + */ typedef struct SDL_GPUComputePass SDL_GPUComputePass; + +/** + * An opaque handle representing a copy pass. + * + * This handle is transient and should not be held or referenced after + * SDL_EndGPUCopyPass is called. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPUCopyPass + * \sa SDL_EndGPUCopyPass + */ typedef struct SDL_GPUCopyPass SDL_GPUCopyPass; + +/** + * An opaque handle representing a fence. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_SubmitGPUCommandBufferAndAcquireFence + * \sa SDL_QueryGPUFence + * \sa SDL_WaitForGPUFences + * \sa SDL_ReleaseGPUFence + */ typedef struct SDL_GPUFence SDL_GPUFence; +/** + * Specifies the primitive topology of a graphics pipeline. + * + * If you are using POINTLIST you must include a point size output in the + * vertex shader. + * + * - For HLSL compiling to SPIRV you must decorate a float output with + * [[vk::builtin("PointSize")]]. + * - For GLSL you must set the gl_PointSize builtin. + * - For MSL you must include a float output with the [[point_size]] + * decorator. + * + * Note that sized point topology is totally unsupported on D3D12. Any size + * other than 1 will be ignored. In general, you should avoid using point + * topology for both compatibility and performance reasons. You WILL regret + * using it. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUPrimitiveType { - SDL_GPU_PRIMITIVETYPE_POINTLIST, - SDL_GPU_PRIMITIVETYPE_LINELIST, - SDL_GPU_PRIMITIVETYPE_LINESTRIP, - SDL_GPU_PRIMITIVETYPE_TRIANGLELIST, - SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP + SDL_GPU_PRIMITIVETYPE_TRIANGLELIST, /**< A series of separate triangles. */ + SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP, /**< A series of connected triangles. */ + SDL_GPU_PRIMITIVETYPE_LINELIST, /**< A series of separate lines. */ + SDL_GPU_PRIMITIVETYPE_LINESTRIP, /**< A series of connected lines. */ + SDL_GPU_PRIMITIVETYPE_POINTLIST /**< A series of separate points. */ } SDL_GPUPrimitiveType; +/** + * Specifies how the contents of a texture attached to a render pass are + * treated at the beginning of the render pass. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_BeginGPURenderPass + */ typedef enum SDL_GPULoadOp { - SDL_GPU_LOADOP_LOAD, - SDL_GPU_LOADOP_CLEAR, - SDL_GPU_LOADOP_DONT_CARE + SDL_GPU_LOADOP_LOAD, /**< The previous contents of the texture will be preserved. */ + SDL_GPU_LOADOP_CLEAR, /**< The contents of the texture will be cleared to a color. */ + SDL_GPU_LOADOP_DONT_CARE /**< The previous contents of the texture need not be preserved. The contents will be undefined. */ } SDL_GPULoadOp; +/** + * Specifies how the contents of a texture attached to a render pass are + * treated at the end of the render pass. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_BeginGPURenderPass + */ typedef enum SDL_GPUStoreOp { - SDL_GPU_STOREOP_STORE, - SDL_GPU_STOREOP_DONT_CARE + SDL_GPU_STOREOP_STORE, /**< The contents generated during the render pass will be written to memory. */ + SDL_GPU_STOREOP_DONT_CARE, /**< The contents generated during the render pass are not needed and may be discarded. The contents will be undefined. */ + SDL_GPU_STOREOP_RESOLVE, /**< The multisample contents generated during the render pass will be resolved to a non-multisample texture. The contents in the multisample texture may then be discarded and will be undefined. */ + SDL_GPU_STOREOP_RESOLVE_AND_STORE /**< The multisample contents generated during the render pass will be resolved to a non-multisample texture. The contents in the multisample texture will be written to memory. */ } SDL_GPUStoreOp; +/** + * Specifies the size of elements in an index buffer. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUIndexElementSize { - SDL_GPU_INDEXELEMENTSIZE_16BIT, - SDL_GPU_INDEXELEMENTSIZE_32BIT + SDL_GPU_INDEXELEMENTSIZE_16BIT, /**< The index elements are 16-bit. */ + SDL_GPU_INDEXELEMENTSIZE_32BIT /**< The index elements are 32-bit. */ } SDL_GPUIndexElementSize; -/* Texture format support varies depending on driver, hardware, and usage flags. - * In general, you should use SDL_GPUTextureSupportsFormat to query if a format - * is supported before using it. However, there are a few guaranteed formats. +/** + * Specifies the pixel format of a texture. + * + * Texture format support varies depending on driver, hardware, and usage + * flags. In general, you should use SDL_GPUTextureSupportsFormat to query if + * a format is supported before using it. However, there are a few guaranteed + * formats. + * + * FIXME: Check universal support for 32-bit component formats FIXME: Check + * universal support for SIMULTANEOUS_READ_WRITE * * For SAMPLER usage, the following formats are universally supported: - * - R8G8B8A8_UNORM - * - B8G8R8A8_UNORM - * - R8_UNORM - * - R8G8_SNORM - * - R8G8B8A8_SNORM - * - R16_FLOAT - * - R16G16_FLOAT - * - R16G16B16A16_FLOAT - * - R32_FLOAT - * - R32G32_FLOAT - * - R32G32B32A32_FLOAT - * - R8G8B8A8_UNORM_SRGB - * - B8G8R8A8_UNORM_SRGB - * - D16_UNORM + * + * - R8G8B8A8_UNORM + * - B8G8R8A8_UNORM + * - R8_UNORM + * - R8_SNORM + * - R8G8_UNORM + * - R8G8_SNORM + * - R8G8B8A8_SNORM + * - R16_FLOAT + * - R16G16_FLOAT + * - R16G16B16A16_FLOAT + * - R32_FLOAT + * - R32G32_FLOAT + * - R32G32B32A32_FLOAT + * - R11G11B10_UFLOAT + * - R8G8B8A8_UNORM_SRGB + * - B8G8R8A8_UNORM_SRGB + * - D16_UNORM * * For COLOR_TARGET usage, the following formats are universally supported: - * - R8G8B8A8_UNORM - * - B8G8R8A8_UNORM - * - R8_UNORM - * - R16_FLOAT - * - R16G16_FLOAT - * - R16G16B16A16_FLOAT - * - R32_FLOAT - * - R32G32_FLOAT - * - R32G32B32A32_FLOAT - * - R8_UINT - * - R8G8_UINT - * - R8G8B8A8_UINT - * - R16_UINT - * - R16G16_UINT - * - R16G16B16A16_UINT - * - R8G8B8A8_UNORM_SRGB - * - B8G8R8A8_UNORM_SRGB + * + * - R8G8B8A8_UNORM + * - B8G8R8A8_UNORM + * - R8_UNORM + * - R16_FLOAT + * - R16G16_FLOAT + * - R16G16B16A16_FLOAT + * - R32_FLOAT + * - R32G32_FLOAT + * - R32G32B32A32_FLOAT + * - R8_UINT + * - R8G8_UINT + * - R8G8B8A8_UINT + * - R16_UINT + * - R16G16_UINT + * - R16G16B16A16_UINT + * - R8_INT + * - R8G8_INT + * - R8G8B8A8_INT + * - R16_INT + * - R16G16_INT + * - R16G16B16A16_INT + * - R8G8B8A8_UNORM_SRGB + * - B8G8R8A8_UNORM_SRGB * * For STORAGE usages, the following formats are universally supported: - * - R8G8B8A8_UNORM - * - R8G8B8A8_SNORM - * - R16G16B16A16_FLOAT - * - R32_FLOAT - * - R32G32_FLOAT - * - R32G32B32A32_FLOAT - * - R8_UINT - * - R8G8_UINT - * - R8G8B8A8_UINT - * - R16_UINT - * - R16G16_UINT - * - R16G16B16A16_UINT * - * For DEPTH_STENCIL_TARGET usage, the following formats are universally supported: - * - D16_UNORM - * - Either (but not necessarily both!) D24_UNORM or D32_SFLOAT - * - Either (but not necessarily both!) D24_UNORM_S8_UINT or D32_SFLOAT_S8_UINT + * - R8G8B8A8_UNORM + * - R8G8B8A8_SNORM + * - R16G16B16A16_FLOAT + * - R32_FLOAT + * - R32G32_FLOAT + * - R32G32B32A32_FLOAT + * - R8G8B8A8_UINT + * - R16G16B16A16_UINT + * - R8G8B8A8_INT + * - R16G16B16A16_INT * - * Unless D16_UNORM is sufficient for your purposes, always check which - * of D24/D32 is supported before creating a depth-stencil texture! + * For DEPTH_STENCIL_TARGET usage, the following formats are universally + * supported: + * + * - D16_UNORM + * - Either (but not necessarily both!) D24_UNORM or D32_FLOAT + * - Either (but not necessarily both!) D24_UNORM_S8_UINT or D32_FLOAT_S8_UINT + * + * Unless D16_UNORM is sufficient for your purposes, always check which of + * D24/D32 is supported before creating a depth-stencil texture! + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + * \sa SDL_GPUTextureSupportsFormat */ typedef enum SDL_GPUTextureFormat { - SDL_GPU_TEXTUREFORMAT_INVALID = -1, + SDL_GPU_TEXTUREFORMAT_INVALID, /* Unsigned Normalized Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_A8_UNORM, + SDL_GPU_TEXTUREFORMAT_R8_UNORM, + SDL_GPU_TEXTUREFORMAT_R8G8_UNORM, SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM, - SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, + SDL_GPU_TEXTUREFORMAT_R16_UNORM, + SDL_GPU_TEXTUREFORMAT_R16G16_UNORM, + SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM, + SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM, SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM, SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM, SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM, - SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM, - SDL_GPU_TEXTUREFORMAT_R16G16_UNORM, - SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM, - SDL_GPU_TEXTUREFORMAT_R8_UNORM, - SDL_GPU_TEXTUREFORMAT_A8_UNORM, + SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, /* Compressed Unsigned Normalized Float Color Formats */ - SDL_GPU_TEXTUREFORMAT_BC1_UNORM, - SDL_GPU_TEXTUREFORMAT_BC2_UNORM, - SDL_GPU_TEXTUREFORMAT_BC3_UNORM, - SDL_GPU_TEXTUREFORMAT_BC7_UNORM, + SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM, + SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM, + SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM, + SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM, + SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM, + SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM, + /* Compressed Signed Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT, + /* Compressed Unsigned Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT, /* Signed Normalized Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_R8_SNORM, SDL_GPU_TEXTUREFORMAT_R8G8_SNORM, SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM, + SDL_GPU_TEXTUREFORMAT_R16_SNORM, + SDL_GPU_TEXTUREFORMAT_R16G16_SNORM, + SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM, /* Signed Float Color Formats */ SDL_GPU_TEXTUREFORMAT_R16_FLOAT, SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT, @@ -177,6 +713,8 @@ typedef enum SDL_GPUTextureFormat SDL_GPU_TEXTUREFORMAT_R32_FLOAT, SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT, SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT, + /* Unsigned Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT, /* Unsigned Integer Color Formats */ SDL_GPU_TEXTUREFORMAT_R8_UINT, SDL_GPU_TEXTUREFORMAT_R8G8_UINT, @@ -184,48 +722,153 @@ typedef enum SDL_GPUTextureFormat SDL_GPU_TEXTUREFORMAT_R16_UINT, SDL_GPU_TEXTUREFORMAT_R16G16_UINT, SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT, + SDL_GPU_TEXTUREFORMAT_R32_UINT, + SDL_GPU_TEXTUREFORMAT_R32G32_UINT, + SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT, + /* Signed Integer Color Formats */ + SDL_GPU_TEXTUREFORMAT_R8_INT, + SDL_GPU_TEXTUREFORMAT_R8G8_INT, + SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT, + SDL_GPU_TEXTUREFORMAT_R16_INT, + SDL_GPU_TEXTUREFORMAT_R16G16_INT, + SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT, + SDL_GPU_TEXTUREFORMAT_R32_INT, + SDL_GPU_TEXTUREFORMAT_R32G32_INT, + SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT, /* SRGB Unsigned Normalized Color Formats */ SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB, SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB, /* Compressed SRGB Unsigned Normalized Color Formats */ - SDL_GPU_TEXTUREFORMAT_BC3_UNORM_SRGB, - SDL_GPU_TEXTUREFORMAT_BC7_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB, /* Depth Formats */ SDL_GPU_TEXTUREFORMAT_D16_UNORM, SDL_GPU_TEXTUREFORMAT_D24_UNORM, SDL_GPU_TEXTUREFORMAT_D32_FLOAT, SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT, - SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT + SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT, + /* Compressed ASTC Normalized Float Color Formats*/ + SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM, + /* Compressed SRGB ASTC Normalized Float Color Formats*/ + SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB, + /* Compressed ASTC Signed Float Color Formats*/ + SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT } SDL_GPUTextureFormat; -typedef enum SDL_GPUTextureUsageFlagBits -{ - SDL_GPU_TEXTUREUSAGE_SAMPLER_BIT = 0x00000001, - SDL_GPU_TEXTUREUSAGE_COLOR_TARGET_BIT = 0x00000002, - SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET_BIT = 0x00000004, - SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ_BIT = 0x00000008, - SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ_BIT = 0x00000020, - SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE_BIT = 0x00000040 -} SDL_GPUTextureUsageFlagBits; - +/** + * Specifies how a texture is intended to be used by the client. + * + * A texture must have at least one usage flag. Note that some usage flag + * combinations are invalid. + * + * With regards to compute storage usage, READ | WRITE means that you can have + * shader A that only writes into the texture and shader B that only reads + * from the texture and bind the same texture to either shader respectively. + * SIMULTANEOUS means that you can do reads and writes within the same shader + * or compute pass. It also implies that atomic ops can be used, since those + * are read-modify-write operations. If you use SIMULTANEOUS, you are + * responsible for avoiding data races, as there is no data synchronization + * within a compute pass. Note that SIMULTANEOUS usage is only supported by a + * limited number of texture formats. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + */ typedef Uint32 SDL_GPUTextureUsageFlags; +#define SDL_GPU_TEXTUREUSAGE_SAMPLER (1u << 0) /**< Texture supports sampling. */ +#define SDL_GPU_TEXTUREUSAGE_COLOR_TARGET (1u << 1) /**< Texture is a color render target. */ +#define SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET (1u << 2) /**< Texture is a depth stencil target. */ +#define SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ (1u << 3) /**< Texture supports storage reads in graphics stages. */ +#define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ (1u << 4) /**< Texture supports storage reads in the compute stage. */ +#define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE (1u << 5) /**< Texture supports storage writes in the compute stage. */ +#define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE (1u << 6) /**< Texture supports reads and writes in the same compute shader. This is NOT equivalent to READ | WRITE. */ + +/** + * Specifies the type of a texture. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + */ typedef enum SDL_GPUTextureType { - SDL_GPU_TEXTURETYPE_2D, - SDL_GPU_TEXTURETYPE_2D_ARRAY, - SDL_GPU_TEXTURETYPE_3D, - SDL_GPU_TEXTURETYPE_CUBE + SDL_GPU_TEXTURETYPE_2D, /**< The texture is a 2-dimensional image. */ + SDL_GPU_TEXTURETYPE_2D_ARRAY, /**< The texture is a 2-dimensional array image. */ + SDL_GPU_TEXTURETYPE_3D, /**< The texture is a 3-dimensional image. */ + SDL_GPU_TEXTURETYPE_CUBE, /**< The texture is a cube image. */ + SDL_GPU_TEXTURETYPE_CUBE_ARRAY /**< The texture is a cube array image. */ } SDL_GPUTextureType; +/** + * Specifies the sample count of a texture. + * + * Used in multisampling. Note that this value only applies when the texture + * is used as a render target. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + * \sa SDL_GPUTextureSupportsSampleCount + */ typedef enum SDL_GPUSampleCount { - SDL_GPU_SAMPLECOUNT_1, - SDL_GPU_SAMPLECOUNT_2, - SDL_GPU_SAMPLECOUNT_4, - SDL_GPU_SAMPLECOUNT_8 + SDL_GPU_SAMPLECOUNT_1, /**< No multisampling. */ + SDL_GPU_SAMPLECOUNT_2, /**< MSAA 2x */ + SDL_GPU_SAMPLECOUNT_4, /**< MSAA 4x */ + SDL_GPU_SAMPLECOUNT_8 /**< MSAA 8x */ } SDL_GPUSampleCount; + +/** + * Specifies the face of a cube map. + * + * Can be passed in as the layer field in texture-related structs. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_GPUCubeMapFace { SDL_GPU_CUBEMAPFACE_POSITIVEX, @@ -236,45 +879,87 @@ typedef enum SDL_GPUCubeMapFace SDL_GPU_CUBEMAPFACE_NEGATIVEZ } SDL_GPUCubeMapFace; -typedef enum SDL_GPUBufferUsageFlagBits -{ - SDL_GPU_BUFFERUSAGE_VERTEX_BIT = 0x00000001, - SDL_GPU_BUFFERUSAGE_INDEX_BIT = 0x00000002, - SDL_GPU_BUFFERUSAGE_INDIRECT_BIT = 0x00000004, - SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ_BIT = 0x00000008, - SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ_BIT = 0x00000020, - SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE_BIT = 0x00000040 -} SDL_GPUBufferUsageFlagBits; - +/** + * Specifies how a buffer is intended to be used by the client. + * + * A buffer must have at least one usage flag. Note that some usage flag + * combinations are invalid. + * + * Unlike textures, READ | WRITE can be used for simultaneous read-write + * usage. The same data synchronization concerns as textures apply. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUBuffer + */ typedef Uint32 SDL_GPUBufferUsageFlags; +#define SDL_GPU_BUFFERUSAGE_VERTEX (1u << 0) /**< Buffer is a vertex buffer. */ +#define SDL_GPU_BUFFERUSAGE_INDEX (1u << 1) /**< Buffer is an index buffer. */ +#define SDL_GPU_BUFFERUSAGE_INDIRECT (1u << 2) /**< Buffer is an indirect buffer. */ +#define SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ (1u << 3) /**< Buffer supports storage reads in graphics stages. */ +#define SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ (1u << 4) /**< Buffer supports storage reads in the compute stage. */ +#define SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE (1u << 5) /**< Buffer supports storage writes in the compute stage. */ + +/** + * Specifies how a transfer buffer is intended to be used by the client. + * + * Note that mapping and copying FROM an upload transfer buffer or TO a + * download transfer buffer is undefined behavior. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTransferBuffer + */ typedef enum SDL_GPUTransferBufferUsage { SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD, SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD } SDL_GPUTransferBufferUsage; +/** + * Specifies which stage a shader program corresponds to. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUShader + */ typedef enum SDL_GPUShaderStage { SDL_GPU_SHADERSTAGE_VERTEX, SDL_GPU_SHADERSTAGE_FRAGMENT } SDL_GPUShaderStage; -typedef enum SDL_GPUShaderFormatFlagBits -{ - SDL_GPU_SHADERFORMAT_INVALID = 0x00000000, - SDL_GPU_SHADERFORMAT_SECRET = 0x00000001, /* NDA'd platforms */ - SDL_GPU_SHADERFORMAT_SPIRV = 0x00000002, /* Vulkan */ - SDL_GPU_SHADERFORMAT_DXBC = 0x00000004, /* D3D11 (Shader Model 5_0) */ - SDL_GPU_SHADERFORMAT_DXIL = 0x00000008, /* D3D12 */ - SDL_GPU_SHADERFORMAT_MSL = 0x00000010, /* Metal */ - SDL_GPU_SHADERFORMAT_METALLIB = 0x00000020, /* Metal */ -} SDL_GPUShaderFormatFlagBits; - +/** + * Specifies the format of shader code. + * + * Each format corresponds to a specific backend that accepts it. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUShader + */ typedef Uint32 SDL_GPUShaderFormat; +#define SDL_GPU_SHADERFORMAT_INVALID 0 +#define SDL_GPU_SHADERFORMAT_PRIVATE (1u << 0) /**< Shaders for NDA'd platforms. */ +#define SDL_GPU_SHADERFORMAT_SPIRV (1u << 1) /**< SPIR-V shaders for Vulkan. */ +#define SDL_GPU_SHADERFORMAT_DXBC (1u << 2) /**< DXBC SM5_1 shaders for D3D12. */ +#define SDL_GPU_SHADERFORMAT_DXIL (1u << 3) /**< DXIL SM6_0 shaders for D3D12. */ +#define SDL_GPU_SHADERFORMAT_MSL (1u << 4) /**< MSL shaders for Metal. */ +#define SDL_GPU_SHADERFORMAT_METALLIB (1u << 5) /**< Precompiled metallib shaders for Metal. */ + +/** + * Specifies the format of a vertex attribute. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUVertexElementFormat { + SDL_GPU_VERTEXELEMENTFORMAT_INVALID, + /* 32-bit Signed Integers */ SDL_GPU_VERTEXELEMENTFORMAT_INT, SDL_GPU_VERTEXELEMENTFORMAT_INT2, @@ -330,125 +1015,230 @@ typedef enum SDL_GPUVertexElementFormat SDL_GPU_VERTEXELEMENTFORMAT_HALF4 } SDL_GPUVertexElementFormat; +/** + * Specifies the rate at which vertex attributes are pulled from buffers. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUVertexInputRate { - SDL_GPU_VERTEXINPUTRATE_VERTEX = 0, - SDL_GPU_VERTEXINPUTRATE_INSTANCE = 1 + SDL_GPU_VERTEXINPUTRATE_VERTEX, /**< Attribute addressing is a function of the vertex index. */ + SDL_GPU_VERTEXINPUTRATE_INSTANCE /**< Attribute addressing is a function of the instance index. */ } SDL_GPUVertexInputRate; +/** + * Specifies the fill mode of the graphics pipeline. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUFillMode { - SDL_GPU_FILLMODE_FILL, - SDL_GPU_FILLMODE_LINE + SDL_GPU_FILLMODE_FILL, /**< Polygons will be rendered via rasterization. */ + SDL_GPU_FILLMODE_LINE /**< Polygon edges will be drawn as line segments. */ } SDL_GPUFillMode; +/** + * Specifies the facing direction in which triangle faces will be culled. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUCullMode { - SDL_GPU_CULLMODE_NONE, - SDL_GPU_CULLMODE_FRONT, - SDL_GPU_CULLMODE_BACK + SDL_GPU_CULLMODE_NONE, /**< No triangles are culled. */ + SDL_GPU_CULLMODE_FRONT, /**< Front-facing triangles are culled. */ + SDL_GPU_CULLMODE_BACK /**< Back-facing triangles are culled. */ } SDL_GPUCullMode; +/** + * Specifies the vertex winding that will cause a triangle to be determined to + * be front-facing. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUFrontFace { - SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE, - SDL_GPU_FRONTFACE_CLOCKWISE + SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE, /**< A triangle with counter-clockwise vertex winding will be considered front-facing. */ + SDL_GPU_FRONTFACE_CLOCKWISE /**< A triangle with clockwise vertex winding will be considered front-facing. */ } SDL_GPUFrontFace; +/** + * Specifies a comparison operator for depth, stencil and sampler operations. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUCompareOp { - SDL_GPU_COMPAREOP_NEVER, - SDL_GPU_COMPAREOP_LESS, - SDL_GPU_COMPAREOP_EQUAL, - SDL_GPU_COMPAREOP_LESS_OR_EQUAL, - SDL_GPU_COMPAREOP_GREATER, - SDL_GPU_COMPAREOP_NOT_EQUAL, - SDL_GPU_COMPAREOP_GREATER_OR_EQUAL, - SDL_GPU_COMPAREOP_ALWAYS + SDL_GPU_COMPAREOP_INVALID, + SDL_GPU_COMPAREOP_NEVER, /**< The comparison always evaluates false. */ + SDL_GPU_COMPAREOP_LESS, /**< The comparison evaluates reference < test. */ + SDL_GPU_COMPAREOP_EQUAL, /**< The comparison evaluates reference == test. */ + SDL_GPU_COMPAREOP_LESS_OR_EQUAL, /**< The comparison evaluates reference <= test. */ + SDL_GPU_COMPAREOP_GREATER, /**< The comparison evaluates reference > test. */ + SDL_GPU_COMPAREOP_NOT_EQUAL, /**< The comparison evaluates reference != test. */ + SDL_GPU_COMPAREOP_GREATER_OR_EQUAL, /**< The comparison evalutes reference >= test. */ + SDL_GPU_COMPAREOP_ALWAYS /**< The comparison always evaluates true. */ } SDL_GPUCompareOp; +/** + * Specifies what happens to a stored stencil value if stencil tests fail or + * pass. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUStencilOp { - SDL_GPU_STENCILOP_KEEP, - SDL_GPU_STENCILOP_ZERO, - SDL_GPU_STENCILOP_REPLACE, - SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP, - SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP, - SDL_GPU_STENCILOP_INVERT, - SDL_GPU_STENCILOP_INCREMENT_AND_WRAP, - SDL_GPU_STENCILOP_DECREMENT_AND_WRAP + SDL_GPU_STENCILOP_INVALID, + SDL_GPU_STENCILOP_KEEP, /**< Keeps the current value. */ + SDL_GPU_STENCILOP_ZERO, /**< Sets the value to 0. */ + SDL_GPU_STENCILOP_REPLACE, /**< Sets the value to reference. */ + SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP, /**< Increments the current value and clamps to the maximum value. */ + SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP, /**< Decrements the current value and clamps to 0. */ + SDL_GPU_STENCILOP_INVERT, /**< Bitwise-inverts the current value. */ + SDL_GPU_STENCILOP_INCREMENT_AND_WRAP, /**< Increments the current value and wraps back to 0. */ + SDL_GPU_STENCILOP_DECREMENT_AND_WRAP /**< Decrements the current value and wraps to the maximum value. */ } SDL_GPUStencilOp; +/** + * Specifies the operator to be used when pixels in a render target are + * blended with existing pixels in the texture. + * + * The source color is the value written by the fragment shader. The + * destination color is the value currently existing in the texture. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUBlendOp { - SDL_GPU_BLENDOP_ADD, - SDL_GPU_BLENDOP_SUBTRACT, - SDL_GPU_BLENDOP_REVERSE_SUBTRACT, - SDL_GPU_BLENDOP_MIN, - SDL_GPU_BLENDOP_MAX + SDL_GPU_BLENDOP_INVALID, + SDL_GPU_BLENDOP_ADD, /**< (source * source_factor) + (destination * destination_factor) */ + SDL_GPU_BLENDOP_SUBTRACT, /**< (source * source_factor) - (destination * destination_factor) */ + SDL_GPU_BLENDOP_REVERSE_SUBTRACT, /**< (destination * destination_factor) - (source * source_factor) */ + SDL_GPU_BLENDOP_MIN, /**< min(source, destination) */ + SDL_GPU_BLENDOP_MAX /**< max(source, destination) */ } SDL_GPUBlendOp; +/** + * Specifies a blending factor to be used when pixels in a render target are + * blended with existing pixels in the texture. + * + * The source color is the value written by the fragment shader. The + * destination color is the value currently existing in the texture. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUBlendFactor { - SDL_GPU_BLENDFACTOR_ZERO, - SDL_GPU_BLENDFACTOR_ONE, - SDL_GPU_BLENDFACTOR_SRC_COLOR, - SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR, - SDL_GPU_BLENDFACTOR_DST_COLOR, - SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR, - SDL_GPU_BLENDFACTOR_SRC_ALPHA, - SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, - SDL_GPU_BLENDFACTOR_DST_ALPHA, - SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA, - SDL_GPU_BLENDFACTOR_CONSTANT_COLOR, - SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR, - SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE + SDL_GPU_BLENDFACTOR_INVALID, + SDL_GPU_BLENDFACTOR_ZERO, /**< 0 */ + SDL_GPU_BLENDFACTOR_ONE, /**< 1 */ + SDL_GPU_BLENDFACTOR_SRC_COLOR, /**< source color */ + SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR, /**< 1 - source color */ + SDL_GPU_BLENDFACTOR_DST_COLOR, /**< destination color */ + SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR, /**< 1 - destination color */ + SDL_GPU_BLENDFACTOR_SRC_ALPHA, /**< source alpha */ + SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, /**< 1 - source alpha */ + SDL_GPU_BLENDFACTOR_DST_ALPHA, /**< destination alpha */ + SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA, /**< 1 - destination alpha */ + SDL_GPU_BLENDFACTOR_CONSTANT_COLOR, /**< blend constant */ + SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR, /**< 1 - blend constant */ + SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE /**< min(source alpha, 1 - destination alpha) */ } SDL_GPUBlendFactor; -typedef enum SDL_GPUColorComponentFlagBits -{ - SDL_GPU_COLORCOMPONENT_R_BIT = 0x00000001, - SDL_GPU_COLORCOMPONENT_G_BIT = 0x00000002, - SDL_GPU_COLORCOMPONENT_B_BIT = 0x00000004, - SDL_GPU_COLORCOMPONENT_A_BIT = 0x00000008 -} SDL_GPUColorComponentFlagBits; - +/** + * Specifies which color components are written in a graphics pipeline. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef Uint8 SDL_GPUColorComponentFlags; +#define SDL_GPU_COLORCOMPONENT_R (1u << 0) /**< the red component */ +#define SDL_GPU_COLORCOMPONENT_G (1u << 1) /**< the green component */ +#define SDL_GPU_COLORCOMPONENT_B (1u << 2) /**< the blue component */ +#define SDL_GPU_COLORCOMPONENT_A (1u << 3) /**< the alpha component */ + +/** + * Specifies a filter operation used by a sampler. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUSampler + */ typedef enum SDL_GPUFilter { - SDL_GPU_FILTER_NEAREST, - SDL_GPU_FILTER_LINEAR + SDL_GPU_FILTER_NEAREST, /**< Point filtering. */ + SDL_GPU_FILTER_LINEAR /**< Linear filtering. */ } SDL_GPUFilter; +/** + * Specifies a mipmap mode used by a sampler. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUSampler + */ typedef enum SDL_GPUSamplerMipmapMode { - SDL_GPU_SAMPLERMIPMAPMODE_NEAREST, - SDL_GPU_SAMPLERMIPMAPMODE_LINEAR + SDL_GPU_SAMPLERMIPMAPMODE_NEAREST, /**< Point filtering. */ + SDL_GPU_SAMPLERMIPMAPMODE_LINEAR /**< Linear filtering. */ } SDL_GPUSamplerMipmapMode; +/** + * Specifies behavior of texture sampling when the coordinates exceed the 0-1 + * range. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUSampler + */ typedef enum SDL_GPUSamplerAddressMode { - SDL_GPU_SAMPLERADDRESSMODE_REPEAT, - SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT, - SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE + SDL_GPU_SAMPLERADDRESSMODE_REPEAT, /**< Specifies that the coordinates will wrap around. */ + SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT, /**< Specifies that the coordinates will wrap around mirrored. */ + SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE /**< Specifies that the coordinates will clamp to the 0-1 range. */ } SDL_GPUSamplerAddressMode; -/* - * VSYNC: - * Waits for vblank before presenting. - * If there is a pending image to present, the new image is enqueued for presentation. - * Disallows tearing at the cost of visual latency. - * When using this present mode, AcquireSwapchainTexture will block if too many frames are in flight. - * IMMEDIATE: - * Immediately presents. - * Lowest latency option, but tearing may occur. - * When using this mode, AcquireSwapchainTexture will return NULL if too many frames are in flight. - * MAILBOX: - * Waits for vblank before presenting. No tearing is possible. - * If there is a pending image to present, the pending image is replaced by the new image. - * Similar to VSYNC, but with reduced visual latency. - * When using this mode, AcquireSwapchainTexture will return NULL if too many frames are in flight. +/** + * Specifies the timing that will be used to present swapchain textures to the + * OS. + * + * VSYNC mode will always be supported. IMMEDIATE and MAILBOX modes may not be + * supported on certain systems. + * + * It is recommended to query SDL_WindowSupportsGPUPresentMode after claiming + * the window if you wish to change the present mode to IMMEDIATE or MAILBOX. + * + * - VSYNC: Waits for vblank before presenting. No tearing is possible. If + * there is a pending image to present, the new image is enqueued for + * presentation. Disallows tearing at the cost of visual latency. + * - IMMEDIATE: Immediately presents. Lowest latency option, but tearing may + * occur. + * - MAILBOX: Waits for vblank before presenting. No tearing is possible. If + * there is a pending image to present, the pending image is replaced by the + * new image. Similar to VSYNC, but with reduced visual latency. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_SetGPUSwapchainParameters + * \sa SDL_WindowSupportsGPUPresentMode + * \sa SDL_WaitAndAcquireGPUSwapchainTexture */ typedef enum SDL_GPUPresentMode { @@ -457,493 +1247,866 @@ typedef enum SDL_GPUPresentMode SDL_GPU_PRESENTMODE_MAILBOX } SDL_GPUPresentMode; -/* - * SDR: - * B8G8R8A8 or R8G8B8A8 swapchain. Pixel values are in nonlinear sRGB encoding. Blends raw pixel values. - * SDR_LINEAR: - * B8G8R8A8_SRGB or R8G8B8A8_SRGB swapchain. Pixel values are in nonlinear sRGB encoding. Blends in linear space. - * HDR_EXTENDED_LINEAR: - * R16G16B16A16_SFLOAT swapchain. Pixel values are in extended linear encoding. Blends in linear space. - * HDR10_ST2048: - * A2R10G10B10 or A2B10G10R10 swapchain. Pixel values are in PQ ST2048 encoding. Blends raw pixel values. (TODO: verify this) +/** + * Specifies the texture format and colorspace of the swapchain textures. + * + * SDR will always be supported. Other compositions may not be supported on + * certain systems. + * + * It is recommended to query SDL_WindowSupportsGPUSwapchainComposition after + * claiming the window if you wish to change the swapchain composition from + * SDR. + * + * - SDR: B8G8R8A8 or R8G8B8A8 swapchain. Pixel values are in sRGB encoding. + * - SDR_LINEAR: B8G8R8A8_SRGB or R8G8B8A8_SRGB swapchain. Pixel values are + * stored in memory in sRGB encoding but accessed in shaders in "linear + * sRGB" encoding which is sRGB but with a linear transfer function. + * - HDR_EXTENDED_LINEAR: R16G16B16A16_FLOAT swapchain. Pixel values are in + * extended linear sRGB encoding and permits values outside of the [0, 1] + * range. + * - HDR10_ST2084: A2R10G10B10 or A2B10G10R10 swapchain. Pixel values are in + * BT.2020 ST2084 (PQ) encoding. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_SetGPUSwapchainParameters + * \sa SDL_WindowSupportsGPUSwapchainComposition + * \sa SDL_WaitAndAcquireGPUSwapchainTexture */ typedef enum SDL_GPUSwapchainComposition { SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR, SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR, - SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048 + SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084 } SDL_GPUSwapchainComposition; -typedef enum SDL_GPUDriver -{ - SDL_GPU_DRIVER_INVALID = -1, - SDL_GPU_DRIVER_SECRET, /* NDA'd platforms */ - SDL_GPU_DRIVER_VULKAN, - SDL_GPU_DRIVER_D3D11, - SDL_GPU_DRIVER_D3D12, - SDL_GPU_DRIVER_METAL -} SDL_GPUDriver; - /* Structures */ -typedef struct SDL_GPUDepthStencilValue -{ - float depth; - Uint8 stencil; -} SDL_GPUDepthStencilValue; - +/** + * A structure specifying a viewport. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_SetGPUViewport + */ typedef struct SDL_GPUViewport { - float x; - float y; - float w; - float h; - float minDepth; - float maxDepth; + float x; /**< The left offset of the viewport. */ + float y; /**< The top offset of the viewport. */ + float w; /**< The width of the viewport. */ + float h; /**< The height of the viewport. */ + float min_depth; /**< The minimum depth of the viewport. */ + float max_depth; /**< The maximum depth of the viewport. */ } SDL_GPUViewport; +/** + * A structure specifying parameters related to transferring data to or from a + * texture. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_UploadToGPUTexture + * \sa SDL_DownloadFromGPUTexture + */ typedef struct SDL_GPUTextureTransferInfo { - SDL_GPUTransferBuffer *transferBuffer; - Uint32 offset; /* starting location of the image data */ - Uint32 imagePitch; /* number of pixels from one row to the next */ - Uint32 imageHeight; /* number of rows from one layer/depth-slice to the next */ + SDL_GPUTransferBuffer *transfer_buffer; /**< The transfer buffer used in the transfer operation. */ + Uint32 offset; /**< The starting byte of the image data in the transfer buffer. */ + Uint32 pixels_per_row; /**< The number of pixels from one row to the next. */ + Uint32 rows_per_layer; /**< The number of rows from one layer/depth-slice to the next. */ } SDL_GPUTextureTransferInfo; +/** + * A structure specifying a location in a transfer buffer. + * + * Used when transferring buffer data to or from a transfer buffer. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_UploadToGPUBuffer + * \sa SDL_DownloadFromGPUBuffer + */ typedef struct SDL_GPUTransferBufferLocation { - SDL_GPUTransferBuffer *transferBuffer; - Uint32 offset; + SDL_GPUTransferBuffer *transfer_buffer; /**< The transfer buffer used in the transfer operation. */ + Uint32 offset; /**< The starting byte of the buffer data in the transfer buffer. */ } SDL_GPUTransferBufferLocation; +/** + * A structure specifying a location in a texture. + * + * Used when copying data from one texture to another. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CopyGPUTextureToTexture + */ typedef struct SDL_GPUTextureLocation { - SDL_GPUTexture *texture; - Uint32 mipLevel; - Uint32 layer; - Uint32 x; - Uint32 y; - Uint32 z; + SDL_GPUTexture *texture; /**< The texture used in the copy operation. */ + Uint32 mip_level; /**< The mip level index of the location. */ + Uint32 layer; /**< The layer index of the location. */ + Uint32 x; /**< The left offset of the location. */ + Uint32 y; /**< The top offset of the location. */ + Uint32 z; /**< The front offset of the location. */ } SDL_GPUTextureLocation; +/** + * A structure specifying a region of a texture. + * + * Used when transferring data to or from a texture. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_UploadToGPUTexture + * \sa SDL_DownloadFromGPUTexture + */ typedef struct SDL_GPUTextureRegion { - SDL_GPUTexture *texture; - Uint32 mipLevel; - Uint32 layer; - Uint32 x; - Uint32 y; - Uint32 z; - Uint32 w; - Uint32 h; - Uint32 d; + SDL_GPUTexture *texture; /**< The texture used in the copy operation. */ + Uint32 mip_level; /**< The mip level index to transfer. */ + Uint32 layer; /**< The layer index to transfer. */ + Uint32 x; /**< The left offset of the region. */ + Uint32 y; /**< The top offset of the region. */ + Uint32 z; /**< The front offset of the region. */ + Uint32 w; /**< The width of the region. */ + Uint32 h; /**< The height of the region. */ + Uint32 d; /**< The depth of the region. */ } SDL_GPUTextureRegion; +/** + * A structure specifying a region of a texture used in the blit operation. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BlitGPUTexture + */ typedef struct SDL_GPUBlitRegion { - SDL_GPUTexture *texture; - Uint32 mipLevel; - Uint32 layerOrDepthPlane; - Uint32 x; - Uint32 y; - Uint32 w; - Uint32 h; + SDL_GPUTexture *texture; /**< The texture. */ + Uint32 mip_level; /**< The mip level index of the region. */ + Uint32 layer_or_depth_plane; /**< The layer index or depth plane of the region. This value is treated as a layer index on 2D array and cube textures, and as a depth plane on 3D textures. */ + Uint32 x; /**< The left offset of the region. */ + Uint32 y; /**< The top offset of the region. */ + Uint32 w; /**< The width of the region. */ + Uint32 h; /**< The height of the region. */ } SDL_GPUBlitRegion; +/** + * A structure specifying a location in a buffer. + * + * Used when copying data between buffers. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CopyGPUBufferToBuffer + */ typedef struct SDL_GPUBufferLocation { - SDL_GPUBuffer *buffer; - Uint32 offset; + SDL_GPUBuffer *buffer; /**< The buffer. */ + Uint32 offset; /**< The starting byte within the buffer. */ } SDL_GPUBufferLocation; +/** + * A structure specifying a region of a buffer. + * + * Used when transferring data to or from buffers. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_UploadToGPUBuffer + * \sa SDL_DownloadFromGPUBuffer + */ typedef struct SDL_GPUBufferRegion { - SDL_GPUBuffer *buffer; - Uint32 offset; - Uint32 size; + SDL_GPUBuffer *buffer; /**< The buffer. */ + Uint32 offset; /**< The starting byte within the buffer. */ + Uint32 size; /**< The size in bytes of the region. */ } SDL_GPUBufferRegion; -/* Note that the `firstVertex` and `firstInstance` parameters are NOT compatible with - * built-in vertex/instance ID variables in shaders (for example, SV_VertexID). If - * your shader depends on these variables, the correlating draw call parameter MUST - * be 0. +/** + * A structure specifying the parameters of an indirect draw command. + * + * Note that the `first_vertex` and `first_instance` parameters are NOT + * compatible with built-in vertex/instance ID variables in shaders (for + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_DrawGPUPrimitivesIndirect */ typedef struct SDL_GPUIndirectDrawCommand { - Uint32 vertexCount; /* number of vertices to draw */ - Uint32 instanceCount; /* number of instances to draw */ - Uint32 firstVertex; /* index of the first vertex to draw */ - Uint32 firstInstance; /* ID of the first instance to draw */ + Uint32 num_vertices; /**< The number of vertices to draw. */ + Uint32 num_instances; /**< The number of instances to draw. */ + Uint32 first_vertex; /**< The index of the first vertex to draw. */ + Uint32 first_instance; /**< The ID of the first instance to draw. */ } SDL_GPUIndirectDrawCommand; +/** + * A structure specifying the parameters of an indexed indirect draw command. + * + * Note that the `first_vertex` and `first_instance` parameters are NOT + * compatible with built-in vertex/instance ID variables in shaders (for + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_DrawGPUIndexedPrimitivesIndirect + */ typedef struct SDL_GPUIndexedIndirectDrawCommand { - Uint32 indexCount; /* number of vertices to draw per instance */ - Uint32 instanceCount; /* number of instances to draw */ - Uint32 firstIndex; /* base index within the index buffer */ - Sint32 vertexOffset; /* value added to vertex index before indexing into the vertex buffer */ - Uint32 firstInstance; /* ID of the first instance to draw */ + Uint32 num_indices; /**< The number of indices to draw per instance. */ + Uint32 num_instances; /**< The number of instances to draw. */ + Uint32 first_index; /**< The base index within the index buffer. */ + Sint32 vertex_offset; /**< The value added to the vertex index before indexing into the vertex buffer. */ + Uint32 first_instance; /**< The ID of the first instance to draw. */ } SDL_GPUIndexedIndirectDrawCommand; +/** + * A structure specifying the parameters of an indexed dispatch command. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_DispatchGPUComputeIndirect + */ typedef struct SDL_GPUIndirectDispatchCommand { - Uint32 groupCountX; - Uint32 groupCountY; - Uint32 groupCountZ; + Uint32 groupcount_x; /**< The number of local workgroups to dispatch in the X dimension. */ + Uint32 groupcount_y; /**< The number of local workgroups to dispatch in the Y dimension. */ + Uint32 groupcount_z; /**< The number of local workgroups to dispatch in the Z dimension. */ } SDL_GPUIndirectDispatchCommand; /* State structures */ +/** + * A structure specifying the parameters of a sampler. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUSampler + */ typedef struct SDL_GPUSamplerCreateInfo { - SDL_GPUFilter minFilter; - SDL_GPUFilter magFilter; - SDL_GPUSamplerMipmapMode mipmapMode; - SDL_GPUSamplerAddressMode addressModeU; - SDL_GPUSamplerAddressMode addressModeV; - SDL_GPUSamplerAddressMode addressModeW; - float mipLodBias; - SDL_bool anisotropyEnable; - float maxAnisotropy; - SDL_bool compareEnable; - SDL_GPUCompareOp compareOp; - float minLod; - float maxLod; + SDL_GPUFilter min_filter; /**< The minification filter to apply to lookups. */ + SDL_GPUFilter mag_filter; /**< The magnification filter to apply to lookups. */ + SDL_GPUSamplerMipmapMode mipmap_mode; /**< The mipmap filter to apply to lookups. */ + SDL_GPUSamplerAddressMode address_mode_u; /**< The addressing mode for U coordinates outside [0, 1). */ + SDL_GPUSamplerAddressMode address_mode_v; /**< The addressing mode for V coordinates outside [0, 1). */ + SDL_GPUSamplerAddressMode address_mode_w; /**< The addressing mode for W coordinates outside [0, 1). */ + float mip_lod_bias; /**< The bias to be added to mipmap LOD calculation. */ + float max_anisotropy; /**< The anisotropy value clamp used by the sampler. If enable_anisotropy is false, this is ignored. */ + SDL_GPUCompareOp compare_op; /**< The comparison operator to apply to fetched data before filtering. */ + float min_lod; /**< Clamps the minimum of the computed LOD value. */ + float max_lod; /**< Clamps the maximum of the computed LOD value. */ + bool enable_anisotropy; /**< true to enable anisotropic filtering. */ + bool enable_compare; /**< true to enable comparison against a reference value during lookups. */ + Uint8 padding1; + Uint8 padding2; - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUSamplerCreateInfo; -typedef struct SDL_GPUVertexBinding +/** + * A structure specifying the parameters of vertex buffers used in a graphics + * pipeline. + * + * When you call SDL_BindGPUVertexBuffers, you specify the binding slots of + * the vertex buffers. For example if you called SDL_BindGPUVertexBuffers with + * a first_slot of 2 and num_bindings of 3, the binding slots 2, 3, 4 would be + * used by the vertex buffers you pass in. + * + * Vertex attributes are linked to buffers via the buffer_slot field of + * SDL_GPUVertexAttribute. For example, if an attribute has a buffer_slot of + * 0, then that attribute belongs to the vertex buffer bound at slot 0. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUVertexAttribute + * \sa SDL_GPUVertexInputState + */ +typedef struct SDL_GPUVertexBufferDescription { - Uint32 binding; - Uint32 stride; - SDL_GPUVertexInputRate inputRate; - Uint32 instanceStepRate; /* ignored unless inputRate is INSTANCE */ -} SDL_GPUVertexBinding; + Uint32 slot; /**< The binding slot of the vertex buffer. */ + Uint32 pitch; /**< The byte pitch between consecutive elements of the vertex buffer. */ + SDL_GPUVertexInputRate input_rate; /**< Whether attribute addressing is a function of the vertex index or instance index. */ + Uint32 instance_step_rate; /**< The number of instances to draw using the same per-instance data before advancing in the instance buffer by one element. Ignored unless input_rate is SDL_GPU_VERTEXINPUTRATE_INSTANCE */ +} SDL_GPUVertexBufferDescription; +/** + * A structure specifying a vertex attribute. + * + * All vertex attribute locations provided to an SDL_GPUVertexInputState must + * be unique. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUVertexBufferDescription + * \sa SDL_GPUVertexInputState + */ typedef struct SDL_GPUVertexAttribute { - Uint32 location; - Uint32 binding; - SDL_GPUVertexElementFormat format; - Uint32 offset; + Uint32 location; /**< The shader input location index. */ + Uint32 buffer_slot; /**< The binding slot of the associated vertex buffer. */ + SDL_GPUVertexElementFormat format; /**< The size and type of the attribute data. */ + Uint32 offset; /**< The byte offset of this attribute relative to the start of the vertex element. */ } SDL_GPUVertexAttribute; +/** + * A structure specifying the parameters of a graphics pipeline vertex input + * state. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineCreateInfo + * \sa SDL_GPUVertexBufferDescription + * \sa SDL_GPUVertexAttribute + */ typedef struct SDL_GPUVertexInputState { - const SDL_GPUVertexBinding *vertexBindings; - Uint32 vertexBindingCount; - const SDL_GPUVertexAttribute *vertexAttributes; - Uint32 vertexAttributeCount; + const SDL_GPUVertexBufferDescription *vertex_buffer_descriptions; /**< A pointer to an array of vertex buffer descriptions. */ + Uint32 num_vertex_buffers; /**< The number of vertex buffer descriptions in the above array. */ + const SDL_GPUVertexAttribute *vertex_attributes; /**< A pointer to an array of vertex attribute descriptions. */ + Uint32 num_vertex_attributes; /**< The number of vertex attribute descriptions in the above array. */ } SDL_GPUVertexInputState; +/** + * A structure specifying the stencil operation state of a graphics pipeline. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUDepthStencilState + */ typedef struct SDL_GPUStencilOpState { - SDL_GPUStencilOp failOp; - SDL_GPUStencilOp passOp; - SDL_GPUStencilOp depthFailOp; - SDL_GPUCompareOp compareOp; + SDL_GPUStencilOp fail_op; /**< The action performed on samples that fail the stencil test. */ + SDL_GPUStencilOp pass_op; /**< The action performed on samples that pass the depth and stencil tests. */ + SDL_GPUStencilOp depth_fail_op; /**< The action performed on samples that pass the stencil test and fail the depth test. */ + SDL_GPUCompareOp compare_op; /**< The comparison operator used in the stencil test. */ } SDL_GPUStencilOpState; -typedef struct SDL_GPUColorAttachmentBlendState +/** + * A structure specifying the blend state of a color target. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUColorTargetDescription + */ +typedef struct SDL_GPUColorTargetBlendState { - SDL_bool blendEnable; - SDL_GPUBlendFactor srcColorBlendFactor; - SDL_GPUBlendFactor dstColorBlendFactor; - SDL_GPUBlendOp colorBlendOp; - SDL_GPUBlendFactor srcAlphaBlendFactor; - SDL_GPUBlendFactor dstAlphaBlendFactor; - SDL_GPUBlendOp alphaBlendOp; - SDL_GPUColorComponentFlags colorWriteMask; -} SDL_GPUColorAttachmentBlendState; + SDL_GPUBlendFactor src_color_blendfactor; /**< The value to be multiplied by the source RGB value. */ + SDL_GPUBlendFactor dst_color_blendfactor; /**< The value to be multiplied by the destination RGB value. */ + SDL_GPUBlendOp color_blend_op; /**< The blend operation for the RGB components. */ + SDL_GPUBlendFactor src_alpha_blendfactor; /**< The value to be multiplied by the source alpha. */ + SDL_GPUBlendFactor dst_alpha_blendfactor; /**< The value to be multiplied by the destination alpha. */ + SDL_GPUBlendOp alpha_blend_op; /**< The blend operation for the alpha component. */ + SDL_GPUColorComponentFlags color_write_mask; /**< A bitmask specifying which of the RGBA components are enabled for writing. Writes to all channels if enable_color_write_mask is false. */ + bool enable_blend; /**< Whether blending is enabled for the color target. */ + bool enable_color_write_mask; /**< Whether the color write mask is enabled. */ + Uint8 padding1; + Uint8 padding2; +} SDL_GPUColorTargetBlendState; + +/** + * A structure specifying code and metadata for creating a shader object. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUShader + */ typedef struct SDL_GPUShaderCreateInfo { - size_t codeSize; - const Uint8 *code; - const char *entryPointName; - SDL_GPUShaderFormat format; - SDL_GPUShaderStage stage; - Uint32 samplerCount; - Uint32 storageTextureCount; - Uint32 storageBufferCount; - Uint32 uniformBufferCount; + size_t code_size; /**< The size in bytes of the code pointed to. */ + const Uint8 *code; /**< A pointer to shader code. */ + const char *entrypoint; /**< A pointer to a null-terminated UTF-8 string specifying the entry point function name for the shader. */ + SDL_GPUShaderFormat format; /**< The format of the shader code. */ + SDL_GPUShaderStage stage; /**< The stage the shader program corresponds to. */ + Uint32 num_samplers; /**< The number of samplers defined in the shader. */ + Uint32 num_storage_textures; /**< The number of storage textures defined in the shader. */ + Uint32 num_storage_buffers; /**< The number of storage buffers defined in the shader. */ + Uint32 num_uniform_buffers; /**< The number of uniform buffers defined in the shader. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUShaderCreateInfo; +/** + * A structure specifying the parameters of a texture. + * + * Usage flags can be bitwise OR'd together for combinations of usages. Note + * that certain usage combinations are invalid, for example SAMPLER and + * GRAPHICS_STORAGE. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + * \sa SDL_GPUTextureType + * \sa SDL_GPUTextureFormat + * \sa SDL_GPUTextureUsageFlags + * \sa SDL_GPUSampleCount + */ typedef struct SDL_GPUTextureCreateInfo { - SDL_GPUTextureType type; - SDL_GPUTextureFormat format; - SDL_GPUTextureUsageFlags usageFlags; - Uint32 width; - Uint32 height; - Uint32 layerCountOrDepth; - Uint32 levelCount; - SDL_GPUSampleCount sampleCount; + SDL_GPUTextureType type; /**< The base dimensionality of the texture. */ + SDL_GPUTextureFormat format; /**< The pixel format of the texture. */ + SDL_GPUTextureUsageFlags usage; /**< How the texture is intended to be used by the client. */ + Uint32 width; /**< The width of the texture. */ + Uint32 height; /**< The height of the texture. */ + Uint32 layer_count_or_depth; /**< The layer count or depth of the texture. This value is treated as a layer count on 2D array textures, and as a depth value on 3D textures. */ + Uint32 num_levels; /**< The number of mip levels in the texture. */ + SDL_GPUSampleCount sample_count; /**< The number of samples per texel. Only applies if the texture is used as a render target. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUTextureCreateInfo; -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_R_FLOAT "SDL.gpu.createtexture.d3d12.clear.r" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_G_FLOAT "SDL.gpu.createtexture.d3d12.clear.g" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_B_FLOAT "SDL.gpu.createtexture.d3d12.clear.b" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_A_FLOAT "SDL.gpu.createtexture.d3d12.clear.a" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_DEPTH_FLOAT "SDL.gpu.createtexture.d3d12.clear.depth" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_STENCIL_UINT8 "SDL.gpu.createtexture.d3d12.clear.stencil" - +/** + * A structure specifying the parameters of a buffer. + * + * Usage flags can be bitwise OR'd together for combinations of usages. Note + * that certain combinations are invalid, for example VERTEX and INDEX. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUBuffer + * \sa SDL_GPUBufferUsageFlags + */ typedef struct SDL_GPUBufferCreateInfo { - SDL_GPUBufferUsageFlags usageFlags; - Uint32 sizeInBytes; + SDL_GPUBufferUsageFlags usage; /**< How the buffer is intended to be used by the client. */ + Uint32 size; /**< The size in bytes of the buffer. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUBufferCreateInfo; +/** + * A structure specifying the parameters of a transfer buffer. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTransferBuffer + */ typedef struct SDL_GPUTransferBufferCreateInfo { - SDL_GPUTransferBufferUsage usage; - Uint32 sizeInBytes; + SDL_GPUTransferBufferUsage usage; /**< How the transfer buffer is intended to be used by the client. */ + Uint32 size; /**< The size in bytes of the transfer buffer. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUTransferBufferCreateInfo; /* Pipeline state structures */ +/** + * A structure specifying the parameters of the graphics pipeline rasterizer + * state. + * + * NOTE: Some backend APIs (D3D11/12) will enable depth clamping even if + * enable_depth_clip is true. If you rely on this clamp+clip behavior, + * consider enabling depth clip and then manually clamping depth in your + * fragment shaders on Metal and Vulkan. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineCreateInfo + */ typedef struct SDL_GPURasterizerState { - SDL_GPUFillMode fillMode; - SDL_GPUCullMode cullMode; - SDL_GPUFrontFace frontFace; - SDL_bool depthBiasEnable; - float depthBiasConstantFactor; - float depthBiasClamp; - float depthBiasSlopeFactor; + SDL_GPUFillMode fill_mode; /**< Whether polygons will be filled in or drawn as lines. */ + SDL_GPUCullMode cull_mode; /**< The facing direction in which triangles will be culled. */ + SDL_GPUFrontFace front_face; /**< The vertex winding that will cause a triangle to be determined as front-facing. */ + float depth_bias_constant_factor; /**< A scalar factor controlling the depth value added to each fragment. */ + float depth_bias_clamp; /**< The maximum depth bias of a fragment. */ + float depth_bias_slope_factor; /**< A scalar factor applied to a fragment's slope in depth calculations. */ + bool enable_depth_bias; /**< true to bias fragment depth values. */ + bool enable_depth_clip; /**< true to enable depth clip, false to enable depth clamp. */ + Uint8 padding1; + Uint8 padding2; } SDL_GPURasterizerState; +/** + * A structure specifying the parameters of the graphics pipeline multisample + * state. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineCreateInfo + */ typedef struct SDL_GPUMultisampleState { - SDL_GPUSampleCount sampleCount; - Uint32 sampleMask; + SDL_GPUSampleCount sample_count; /**< The number of samples to be used in rasterization. */ + Uint32 sample_mask; /**< Determines which samples get updated in the render targets. Treated as 0xFFFFFFFF if enable_mask is false. */ + bool enable_mask; /**< Enables sample masking. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; } SDL_GPUMultisampleState; +/** + * A structure specifying the parameters of the graphics pipeline depth + * stencil state. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineCreateInfo + */ typedef struct SDL_GPUDepthStencilState { - SDL_bool depthTestEnable; - SDL_bool depthWriteEnable; - SDL_GPUCompareOp compareOp; - SDL_bool stencilTestEnable; - SDL_GPUStencilOpState backStencilState; - SDL_GPUStencilOpState frontStencilState; - Uint8 compareMask; - Uint8 writeMask; - Uint8 reference; + SDL_GPUCompareOp compare_op; /**< The comparison operator used for depth testing. */ + SDL_GPUStencilOpState back_stencil_state; /**< The stencil op state for back-facing triangles. */ + SDL_GPUStencilOpState front_stencil_state; /**< The stencil op state for front-facing triangles. */ + Uint8 compare_mask; /**< Selects the bits of the stencil values participating in the stencil test. */ + Uint8 write_mask; /**< Selects the bits of the stencil values updated by the stencil test. */ + bool enable_depth_test; /**< true enables the depth test. */ + bool enable_depth_write; /**< true enables depth writes. Depth writes are always disabled when enable_depth_test is false. */ + bool enable_stencil_test; /**< true enables the stencil test. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; } SDL_GPUDepthStencilState; -typedef struct SDL_GPUColorAttachmentDescription +/** + * A structure specifying the parameters of color targets used in a graphics + * pipeline. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineTargetInfo + */ +typedef struct SDL_GPUColorTargetDescription { - SDL_GPUTextureFormat format; - SDL_GPUColorAttachmentBlendState blendState; -} SDL_GPUColorAttachmentDescription; + SDL_GPUTextureFormat format; /**< The pixel format of the texture to be used as a color target. */ + SDL_GPUColorTargetBlendState blend_state; /**< The blend state to be used for the color target. */ +} SDL_GPUColorTargetDescription; -typedef struct SDL_GPUGraphicsPipelineAttachmentInfo +/** + * A structure specifying the descriptions of render targets used in a + * graphics pipeline. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineCreateInfo + */ +typedef struct SDL_GPUGraphicsPipelineTargetInfo { - SDL_GPUColorAttachmentDescription *colorAttachmentDescriptions; - Uint32 colorAttachmentCount; - SDL_bool hasDepthStencilAttachment; - SDL_GPUTextureFormat depthStencilFormat; -} SDL_GPUGraphicsPipelineAttachmentInfo; + const SDL_GPUColorTargetDescription *color_target_descriptions; /**< A pointer to an array of color target descriptions. */ + Uint32 num_color_targets; /**< The number of color target descriptions in the above array. */ + SDL_GPUTextureFormat depth_stencil_format; /**< The pixel format of the depth-stencil target. Ignored if has_depth_stencil_target is false. */ + bool has_depth_stencil_target; /**< true specifies that the pipeline uses a depth-stencil target. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_GPUGraphicsPipelineTargetInfo; +/** + * A structure specifying the parameters of a graphics pipeline state. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + * \sa SDL_GPUVertexInputState + * \sa SDL_GPUPrimitiveType + * \sa SDL_GPURasterizerState + * \sa SDL_GPUMultisampleState + * \sa SDL_GPUDepthStencilState + * \sa SDL_GPUGraphicsPipelineTargetInfo + */ typedef struct SDL_GPUGraphicsPipelineCreateInfo { - SDL_GPUShader *vertexShader; - SDL_GPUShader *fragmentShader; - SDL_GPUVertexInputState vertexInputState; - SDL_GPUPrimitiveType primitiveType; - SDL_GPURasterizerState rasterizerState; - SDL_GPUMultisampleState multisampleState; - SDL_GPUDepthStencilState depthStencilState; - SDL_GPUGraphicsPipelineAttachmentInfo attachmentInfo; - float blendConstants[4]; + SDL_GPUShader *vertex_shader; /**< The vertex shader used by the graphics pipeline. */ + SDL_GPUShader *fragment_shader; /**< The fragment shader used by the graphics pipeline. */ + SDL_GPUVertexInputState vertex_input_state; /**< The vertex layout of the graphics pipeline. */ + SDL_GPUPrimitiveType primitive_type; /**< The primitive topology of the graphics pipeline. */ + SDL_GPURasterizerState rasterizer_state; /**< The rasterizer state of the graphics pipeline. */ + SDL_GPUMultisampleState multisample_state; /**< The multisample state of the graphics pipeline. */ + SDL_GPUDepthStencilState depth_stencil_state; /**< The depth-stencil state of the graphics pipeline. */ + SDL_GPUGraphicsPipelineTargetInfo target_info; /**< Formats and blend modes for the render targets of the graphics pipeline. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUGraphicsPipelineCreateInfo; +/** + * A structure specifying the parameters of a compute pipeline state. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUComputePipeline + */ typedef struct SDL_GPUComputePipelineCreateInfo { - size_t codeSize; - const Uint8 *code; - const char *entryPointName; - SDL_GPUShaderFormat format; - Uint32 readOnlyStorageTextureCount; - Uint32 readOnlyStorageBufferCount; - Uint32 writeOnlyStorageTextureCount; - Uint32 writeOnlyStorageBufferCount; - Uint32 uniformBufferCount; - Uint32 threadCountX; - Uint32 threadCountY; - Uint32 threadCountZ; + size_t code_size; /**< The size in bytes of the compute shader code pointed to. */ + const Uint8 *code; /**< A pointer to compute shader code. */ + const char *entrypoint; /**< A pointer to a null-terminated UTF-8 string specifying the entry point function name for the shader. */ + SDL_GPUShaderFormat format; /**< The format of the compute shader code. */ + Uint32 num_samplers; /**< The number of samplers defined in the shader. */ + Uint32 num_readonly_storage_textures; /**< The number of readonly storage textures defined in the shader. */ + Uint32 num_readonly_storage_buffers; /**< The number of readonly storage buffers defined in the shader. */ + Uint32 num_readwrite_storage_textures; /**< The number of read-write storage textures defined in the shader. */ + Uint32 num_readwrite_storage_buffers; /**< The number of read-write storage buffers defined in the shader. */ + Uint32 num_uniform_buffers; /**< The number of uniform buffers defined in the shader. */ + Uint32 threadcount_x; /**< The number of threads in the X dimension. This should match the value in the shader. */ + Uint32 threadcount_y; /**< The number of threads in the Y dimension. This should match the value in the shader. */ + Uint32 threadcount_z; /**< The number of threads in the Z dimension. This should match the value in the shader. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUComputePipelineCreateInfo; -typedef struct SDL_GPUColorAttachmentInfo +/** + * A structure specifying the parameters of a color target used by a render + * pass. + * + * The load_op field determines what is done with the texture at the beginning + * of the render pass. + * + * - LOAD: Loads the data currently in the texture. Not recommended for + * multisample textures as it requires significant memory bandwidth. + * - CLEAR: Clears the texture to a single color. + * - DONT_CARE: The driver will do whatever it wants with the texture memory. + * This is a good option if you know that every single pixel will be touched + * in the render pass. + * + * The store_op field determines what is done with the color results of the + * render pass. + * + * - STORE: Stores the results of the render pass in the texture. Not + * recommended for multisample textures as it requires significant memory + * bandwidth. + * - DONT_CARE: The driver will do whatever it wants with the texture memory. + * This is often a good option for depth/stencil textures. + * - RESOLVE: Resolves a multisample texture into resolve_texture, which must + * have a sample count of 1. Then the driver may discard the multisample + * texture memory. This is the most performant method of resolving a + * multisample target. + * - RESOLVE_AND_STORE: Resolves a multisample texture into the + * resolve_texture, which must have a sample count of 1. Then the driver + * stores the multisample texture's contents. Not recommended as it requires + * significant memory bandwidth. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPURenderPass + */ +typedef struct SDL_GPUColorTargetInfo { - /* The texture that will be used as a color attachment by a render pass. */ - SDL_GPUTexture *texture; - Uint32 mipLevel; - Uint32 layerOrDepthPlane; /* For 3D textures, you can bind an individual depth plane as an attachment. */ + SDL_GPUTexture *texture; /**< The texture that will be used as a color target by a render pass. */ + Uint32 mip_level; /**< The mip level to use as a color target. */ + Uint32 layer_or_depth_plane; /**< The layer index or depth plane to use as a color target. This value is treated as a layer index on 2D array and cube textures, and as a depth plane on 3D textures. */ + SDL_FColor clear_color; /**< The color to clear the color target to at the start of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */ + SDL_GPULoadOp load_op; /**< What is done with the contents of the color target at the beginning of the render pass. */ + SDL_GPUStoreOp store_op; /**< What is done with the results of the render pass. */ + SDL_GPUTexture *resolve_texture; /**< The texture that will receive the results of a multisample resolve operation. Ignored if a RESOLVE* store_op is not used. */ + Uint32 resolve_mip_level; /**< The mip level of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used. */ + Uint32 resolve_layer; /**< The layer index of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used. */ + bool cycle; /**< true cycles the texture if the texture is bound and load_op is not LOAD */ + bool cycle_resolve_texture; /**< true cycles the resolve texture if the resolve texture is bound. Ignored if a RESOLVE* store_op is not used. */ + Uint8 padding1; + Uint8 padding2; +} SDL_GPUColorTargetInfo; - /* Can be ignored by RenderPass if CLEAR is not used */ - SDL_FColor clearColor; - - /* Determines what is done with the texture at the beginning of the render pass. - * - * LOAD: - * Loads the data currently in the texture. - * - * CLEAR: - * Clears the texture to a single color. - * - * DONT_CARE: - * The driver will do whatever it wants with the texture memory. - * This is a good option if you know that every single pixel will be touched in the render pass. - */ - SDL_GPULoadOp loadOp; - - /* Determines what is done with the texture at the end of the render pass. - * - * STORE: - * Stores the results of the render pass in the texture. - * - * DONT_CARE: - * The driver will do whatever it wants with the texture memory. - * This is often a good option for depth/stencil textures. - */ - SDL_GPUStoreOp storeOp; - - /* if SDL_TRUE, cycles the texture if the texture is bound and loadOp is not LOAD */ - SDL_bool cycle; -} SDL_GPUColorAttachmentInfo; - -typedef struct SDL_GPUDepthStencilAttachmentInfo +/** + * A structure specifying the parameters of a depth-stencil target used by a + * render pass. + * + * The load_op field determines what is done with the depth contents of the + * texture at the beginning of the render pass. + * + * - LOAD: Loads the depth values currently in the texture. + * - CLEAR: Clears the texture to a single depth. + * - DONT_CARE: The driver will do whatever it wants with the memory. This is + * a good option if you know that every single pixel will be touched in the + * render pass. + * + * The store_op field determines what is done with the depth results of the + * render pass. + * + * - STORE: Stores the depth results in the texture. + * - DONT_CARE: The driver will do whatever it wants with the depth results. + * This is often a good option for depth/stencil textures that don't need to + * be reused again. + * + * The stencil_load_op field determines what is done with the stencil contents + * of the texture at the beginning of the render pass. + * + * - LOAD: Loads the stencil values currently in the texture. + * - CLEAR: Clears the stencil values to a single value. + * - DONT_CARE: The driver will do whatever it wants with the memory. This is + * a good option if you know that every single pixel will be touched in the + * render pass. + * + * The stencil_store_op field determines what is done with the stencil results + * of the render pass. + * + * - STORE: Stores the stencil results in the texture. + * - DONT_CARE: The driver will do whatever it wants with the stencil results. + * This is often a good option for depth/stencil textures that don't need to + * be reused again. + * + * Note that depth/stencil targets do not support multisample resolves. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPURenderPass + */ +typedef struct SDL_GPUDepthStencilTargetInfo { - /* The texture that will be used as the depth stencil attachment by a render pass. */ - SDL_GPUTexture *texture; + SDL_GPUTexture *texture; /**< The texture that will be used as the depth stencil target by the render pass. */ + float clear_depth; /**< The value to clear the depth component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */ + SDL_GPULoadOp load_op; /**< What is done with the depth contents at the beginning of the render pass. */ + SDL_GPUStoreOp store_op; /**< What is done with the depth results of the render pass. */ + SDL_GPULoadOp stencil_load_op; /**< What is done with the stencil contents at the beginning of the render pass. */ + SDL_GPUStoreOp stencil_store_op; /**< What is done with the stencil results of the render pass. */ + bool cycle; /**< true cycles the texture if the texture is bound and any load ops are not LOAD */ + Uint8 clear_stencil; /**< The value to clear the stencil component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */ + Uint8 padding1; + Uint8 padding2; +} SDL_GPUDepthStencilTargetInfo; - /* Can be ignored by the render pass if CLEAR is not used */ - SDL_GPUDepthStencilValue depthStencilClearValue; - - /* Determines what is done with the depth values at the beginning of the render pass. - * - * LOAD: - * Loads the depth values currently in the texture. - * - * CLEAR: - * Clears the texture to a single depth. - * - * DONT_CARE: - * The driver will do whatever it wants with the memory. - * This is a good option if you know that every single pixel will be touched in the render pass. - */ - SDL_GPULoadOp loadOp; - - /* Determines what is done with the depth values at the end of the render pass. - * - * STORE: - * Stores the depth results in the texture. - * - * DONT_CARE: - * The driver will do whatever it wants with the texture memory. - * This is often a good option for depth/stencil textures. - */ - SDL_GPUStoreOp storeOp; - - /* Determines what is done with the stencil values at the beginning of the render pass. - * - * LOAD: - * Loads the stencil values currently in the texture. - * - * CLEAR: - * Clears the texture to a single stencil value. - * - * DONT_CARE: - * The driver will do whatever it wants with the memory. - * This is a good option if you know that every single pixel will be touched in the render pass. - */ - SDL_GPULoadOp stencilLoadOp; - - /* Determines what is done with the stencil values at the end of the render pass. - * - * STORE: - * Stores the stencil results in the texture. - * - * DONT_CARE: - * The driver will do whatever it wants with the texture memory. - * This is often a good option for depth/stencil textures. - */ - SDL_GPUStoreOp stencilStoreOp; - - /* if SDL_TRUE, cycles the texture if the texture is bound and any load ops are not LOAD */ - SDL_bool cycle; -} SDL_GPUDepthStencilAttachmentInfo; +/** + * A structure containing parameters for a blit command. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BlitGPUTexture + */ +typedef struct SDL_GPUBlitInfo { + SDL_GPUBlitRegion source; /**< The source region for the blit. */ + SDL_GPUBlitRegion destination; /**< The destination region for the blit. */ + SDL_GPULoadOp load_op; /**< What is done with the contents of the destination before the blit. */ + SDL_FColor clear_color; /**< The color to clear the destination region to before the blit. Ignored if load_op is not SDL_GPU_LOADOP_CLEAR. */ + SDL_FlipMode flip_mode; /**< The flip mode for the source region. */ + SDL_GPUFilter filter; /**< The filter mode used when blitting. */ + bool cycle; /**< true cycles the destination texture if it is already bound. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_GPUBlitInfo; /* Binding structs */ +/** + * A structure specifying parameters in a buffer binding call. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BindGPUVertexBuffers + * \sa SDL_BindGPUIndexBuffer + */ typedef struct SDL_GPUBufferBinding { - SDL_GPUBuffer *buffer; - Uint32 offset; + SDL_GPUBuffer *buffer; /**< The buffer to bind. Must have been created with SDL_GPU_BUFFERUSAGE_VERTEX for SDL_BindGPUVertexBuffers, or SDL_GPU_BUFFERUSAGE_INDEX for SDL_BindGPUIndexBuffer. */ + Uint32 offset; /**< The starting byte of the data to bind in the buffer. */ } SDL_GPUBufferBinding; +/** + * A structure specifying parameters in a sampler binding call. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BindGPUVertexSamplers + * \sa SDL_BindGPUFragmentSamplers + */ typedef struct SDL_GPUTextureSamplerBinding { - SDL_GPUTexture *texture; - SDL_GPUSampler *sampler; + SDL_GPUTexture *texture; /**< The texture to bind. Must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. */ + SDL_GPUSampler *sampler; /**< The sampler to bind. */ } SDL_GPUTextureSamplerBinding; -typedef struct SDL_GPUStorageBufferWriteOnlyBinding +/** + * A structure specifying parameters related to binding buffers in a compute + * pass. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPUComputePass + */ +typedef struct SDL_GPUStorageBufferReadWriteBinding { - SDL_GPUBuffer *buffer; + SDL_GPUBuffer *buffer; /**< The buffer to bind. Must have been created with SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE. */ + bool cycle; /**< true cycles the buffer if it is already bound. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_GPUStorageBufferReadWriteBinding; - /* if SDL_TRUE, cycles the buffer if it is bound. */ - SDL_bool cycle; -} SDL_GPUStorageBufferWriteOnlyBinding; - -typedef struct SDL_GPUStorageTextureWriteOnlyBinding +/** + * A structure specifying parameters related to binding textures in a compute + * pass. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPUComputePass + */ +typedef struct SDL_GPUStorageTextureReadWriteBinding { - SDL_GPUTexture *texture; - Uint32 mipLevel; - Uint32 layer; - - /* if SDL_TRUE, cycles the texture if the texture is bound. */ - SDL_bool cycle; -} SDL_GPUStorageTextureWriteOnlyBinding; + SDL_GPUTexture *texture; /**< The texture to bind. Must have been created with SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE or SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE. */ + Uint32 mip_level; /**< The mip level index to bind. */ + Uint32 layer; /**< The layer index to bind. */ + bool cycle; /**< true cycles the texture if it is already bound. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_GPUStorageTextureReadWriteBinding; /* Functions */ /* Device */ /** - * Creates a GPU context. + * Checks for GPU runtime support. * - * \param formatFlags a bitflag indicating which shader formats the app is - * able to provide. - * \param debugMode enable debug mode properties and validations. + * \param format_flags a bitflag indicating which shader formats the app is + * able to provide. * \param name the preferred GPU driver, or NULL to let SDL pick the optimal * driver. - * \returns a GPU context on success or NULL on failure. + * \returns true if supported, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_GetGPUDriver + * \sa SDL_CreateGPUDevice + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsShaderFormats( + SDL_GPUShaderFormat format_flags, + const char *name); + +/** + * Checks for GPU runtime support. + * + * \param props the properties to use. + * \returns true if supported, false otherwise. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUDeviceWithProperties + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsProperties( + SDL_PropertiesID props); + +/** + * Creates a GPU context. + * + * \param format_flags a bitflag indicating which shader formats the app is + * able to provide. + * \param debug_mode enable debug mode properties and validations. + * \param name the preferred GPU driver, or NULL to let SDL pick the optimal + * driver. + * \returns a GPU context on success or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetGPUShaderFormats + * \sa SDL_GetGPUDeviceDriver * \sa SDL_DestroyGPUDevice + * \sa SDL_GPUSupportsShaderFormats */ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDevice( - SDL_GPUShaderFormat formatFlags, - SDL_bool debugMode, + SDL_GPUShaderFormat format_flags, + bool debug_mode, const char *name); /** @@ -951,26 +2114,26 @@ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDevice( * * These are the supported properties: * - * - `SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOL`: enable debug mode properties - * and validations, defaults to SDL_TRUE. - * - `SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOL`: enable to prefer energy - * efficiency over maximum GPU performance, defaults to SDL_FALSE. + * - `SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN`: enable debug mode + * properties and validations, defaults to true. + * - `SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN`: enable to prefer + * energy efficiency over maximum GPU performance, defaults to false. * - `SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING`: the name of the GPU driver to * use, if a specific one is desired. * * These are the current shader format properties: * - * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SECRET_BOOL`: The app is able to + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN`: The app is able to * provide shaders for an NDA platform. - * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOL`: The app is able to + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN`: The app is able to * provide SPIR-V shaders if applicable. - * - SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOL`: The app is able to provide - * DXBC shaders if applicable - * `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOL`: The app is able to + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN`: The app is able to + * provide DXBC shaders if applicable + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN`: The app is able to * provide DXIL shaders if applicable. - * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOL`: The app is able to provide - * MSL shaders if applicable. - * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOL`: The app is able to + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN`: The app is able to + * provide MSL shaders if applicable. + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN`: The app is able to * provide Metal shader libraries if applicable. * * With the D3D12 renderer: @@ -979,25 +2142,28 @@ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDevice( * use for all vertex semantics, default is "TEXCOORD". * * \param props the properties to use. - * \returns a GPU context on success or NULL on failure. + * \returns a GPU context on success or NULL on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_GetGPUDriver + * \sa SDL_GetGPUShaderFormats + * \sa SDL_GetGPUDeviceDriver * \sa SDL_DestroyGPUDevice + * \sa SDL_GPUSupportsProperties */ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDeviceWithProperties( SDL_PropertiesID props); -#define SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOL "SDL.gpu.device.create.debugmode" -#define SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOL "SDL.gpu.device.create.preferlowpower" +#define SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN "SDL.gpu.device.create.debugmode" +#define SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN "SDL.gpu.device.create.preferlowpower" #define SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING "SDL.gpu.device.create.name" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SECRET_BOOL "SDL.gpu.device.create.shaders.secret" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOL "SDL.gpu.device.create.shaders.spirv" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOL "SDL.gpu.device.create.shaders.dxbc" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOL "SDL.gpu.device.create.shaders.dxil" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOL "SDL.gpu.device.create.shaders.msl" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOL "SDL.gpu.device.create.shaders.metallib" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN "SDL.gpu.device.create.shaders.private" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN "SDL.gpu.device.create.shaders.spirv" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN "SDL.gpu.device.create.shaders.dxbc" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN "SDL.gpu.device.create.shaders.dxil" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN "SDL.gpu.device.create.shaders.msl" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN "SDL.gpu.device.create.shaders.metallib" #define SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING "SDL.gpu.device.create.d3d12.semantic" /** @@ -1005,70 +2171,132 @@ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDeviceWithProperties( * * \param device a GPU Context to destroy. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUDevice */ extern SDL_DECLSPEC void SDLCALL SDL_DestroyGPUDevice(SDL_GPUDevice *device); /** - * Returns the backend used to create this GPU context. + * Get the number of GPU drivers compiled into SDL. + * + * \returns the number of built in GPU drivers. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetGPUDriver + */ +extern SDL_DECLSPEC int SDLCALL SDL_GetNumGPUDrivers(void); + +/** + * Get the name of a built in GPU driver. + * + * The GPU drivers are presented in the order in which they are normally + * checked during initialization. + * + * The names of drivers are all simple, low-ASCII identifiers, like "vulkan", + * "metal" or "direct3d12". These never have Unicode characters, and are not + * meant to be proper names. + * + * \param index the index of a GPU driver. + * \returns the name of the GPU driver with the given **index**. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetNumGPUDrivers + */ +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDriver(int index); + +/** + * Returns the name of the backend used to create this GPU context. * * \param device a GPU context to query. - * \returns an SDL_GPUDriver value, or SDL_GPU_DRIVER_INVALID on error. + * \returns the name of the device's driver, or NULL on error. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_GPUDriver SDLCALL SDL_GetGPUDriver(SDL_GPUDevice *device); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDeviceDriver(SDL_GPUDevice *device); + +/** + * Returns the supported shader formats for this GPU context. + * + * \param device a GPU context to query. + * \returns a bitflag indicating which shader formats the driver is able to + * consume. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC SDL_GPUShaderFormat SDLCALL SDL_GetGPUShaderFormats(SDL_GPUDevice *device); /* State Creation */ /** * Creates a pipeline object to be used in a compute workflow. * - * Shader resource bindings must be authored to follow a particular order. For - * SPIR-V shaders, use the following resource sets: 0: Read-only storage - * textures, followed by read-only storage buffers 1: Write-only storage - * textures, followed by write-only storage buffers 2: Uniform buffers + * Shader resource bindings must be authored to follow a particular order + * depending on the shader format. * - * For DXBC Shader Model 5_0 shaders, use the following register order: For t - * registers: Read-only storage textures, followed by read-only storage - * buffers For u registers: Write-only storage textures, followed by - * write-only storage buffers For b registers: Uniform buffers + * For SPIR-V shaders, use the following resource sets: * - * For DXIL shaders, use the following register order: (t[n], space0): - * Read-only storage textures, followed by read-only storage buffers (u[n], - * space1): Write-only storage textures, followed by write-only storage - * buffers (b[n], space2): Uniform buffers + * - 0: Sampled textures, followed by read-only storage textures, followed by + * read-only storage buffers + * - 1: Read-write storage textures, followed by read-write storage buffers + * - 2: Uniform buffers * - * For MSL/metallib, use the following order: For [[buffer]]: Uniform buffers, - * followed by write-only storage buffers, followed by write-only storage - * buffers For [[texture]]: Read-only storage textures, followed by write-only - * storage textures + * For DXBC and DXIL shaders, use the following register order: + * + * - (t[n], space0): Sampled textures, followed by read-only storage textures, + * followed by read-only storage buffers + * - (u[n], space1): Read-write storage textures, followed by read-write + * storage buffers + * - (b[n], space2): Uniform buffers + * + * For MSL/metallib, use the following order: + * + * - [[buffer]]: Uniform buffers, followed by read-only storage buffers, + * followed by read-write storage buffers + * - [[texture]]: Sampled textures, followed by read-only storage textures, + * followed by read-write storage textures + * + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING`: a name that can be + * displayed in debugging tools. * * \param device a GPU Context. - * \param computePipelineCreateInfo a struct describing the state of the - * requested compute pipeline. - * \returns a compute pipeline object on success, or NULL on failure. + * \param createinfo a struct describing the state of the compute pipeline to + * create. + * \returns a compute pipeline object on success, or NULL on failure; call + * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindGPUComputePipeline * \sa SDL_ReleaseGPUComputePipeline */ extern SDL_DECLSPEC SDL_GPUComputePipeline *SDLCALL SDL_CreateGPUComputePipeline( SDL_GPUDevice *device, - SDL_GPUComputePipelineCreateInfo *computePipelineCreateInfo); + const SDL_GPUComputePipelineCreateInfo *createinfo); + +#define SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING "SDL.gpu.computepipeline.create.name" /** * Creates a pipeline object to be used in a graphics workflow. * - * \param device a GPU Context. - * \param pipelineCreateInfo a struct describing the state of the desired - * graphics pipeline. - * \returns a graphics pipeline object on success, or NULL on failure. + * There are optional properties that can be provided through `props`. These + * are the supported properties: * - * \since This function is available since SDL 3.0.0. + * - `SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING`: a name that can be + * displayed in debugging tools. + * + * \param device a GPU Context. + * \param createinfo a struct describing the state of the graphics pipeline to + * create. + * \returns a graphics pipeline object on success, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUShader * \sa SDL_BindGPUGraphicsPipeline @@ -1076,26 +2304,36 @@ extern SDL_DECLSPEC SDL_GPUComputePipeline *SDLCALL SDL_CreateGPUComputePipeline */ extern SDL_DECLSPEC SDL_GPUGraphicsPipeline *SDLCALL SDL_CreateGPUGraphicsPipeline( SDL_GPUDevice *device, - SDL_GPUGraphicsPipelineCreateInfo *pipelineCreateInfo); + const SDL_GPUGraphicsPipelineCreateInfo *createinfo); + +#define SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING "SDL.gpu.graphicspipeline.create.name" /** * Creates a sampler object to be used when binding textures in a graphics * workflow. * - * \param device a GPU Context. - * \param samplerCreateInfo a struct describing the state of the desired - * sampler. - * \returns a sampler object on success, or NULL on failure. + * There are optional properties that can be provided through `props`. These + * are the supported properties: * - * \since This function is available since SDL 3.0.0. + * - `SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING`: a name that can be displayed + * in debugging tools. + * + * \param device a GPU Context. + * \param createinfo a struct describing the state of the sampler to create. + * \returns a sampler object on success, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindGPUVertexSamplers * \sa SDL_BindGPUFragmentSamplers - * \sa SDL_ReleaseSampler + * \sa SDL_ReleaseGPUSampler */ extern SDL_DECLSPEC SDL_GPUSampler *SDLCALL SDL_CreateGPUSampler( SDL_GPUDevice *device, - SDL_GPUSamplerCreateInfo *samplerCreateInfo); + const SDL_GPUSamplerCreateInfo *createinfo); + +#define SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING "SDL.gpu.sampler.create.name" /** * Creates a shader to be used when creating a graphics pipeline. @@ -1103,46 +2341,78 @@ extern SDL_DECLSPEC SDL_GPUSampler *SDLCALL SDL_CreateGPUSampler( * Shader resource bindings must be authored to follow a particular order * depending on the shader format. * - * For SPIR-V shaders, use the following resource sets: For vertex shaders: 0: - * Sampled textures, followed by storage textures, followed by storage buffers - * 1: Uniform buffers For fragment shaders: 2: Sampled textures, followed by - * storage textures, followed by storage buffers 3: Uniform buffers + * For SPIR-V shaders, use the following resource sets: * - * For DXBC Shader Model 5_0 shaders, use the following register order: For t - * registers: Sampled textures, followed by storage textures, followed by - * storage buffers For s registers: Samplers with indices corresponding to the - * sampled textures For b registers: Uniform buffers + * For vertex shaders: * - * For DXIL shaders, use the following register order: For vertex shaders: - * (t[n], space0): Sampled textures, followed by storage textures, followed by - * storage buffers (s[n], space0): Samplers with indices corresponding to the - * sampled textures (b[n], space1): Uniform buffers For pixel shaders: (t[n], - * space2): Sampled textures, followed by storage textures, followed by - * storage buffers (s[n], space2): Samplers with indices corresponding to the - * sampled textures (b[n], space3): Uniform buffers + * - 0: Sampled textures, followed by storage textures, followed by storage + * buffers + * - 1: Uniform buffers * - * For MSL/metallib, use the following order: For [[texture]]: Sampled - * textures, followed by storage textures For [[sampler]]: Samplers with - * indices corresponding to the sampled textures For [[buffer]]: Uniform - * buffers, followed by storage buffers. Vertex buffer 0 is bound at - * [[buffer(30)]], vertex buffer 1 at [[buffer(29)]], and so on. Rather than - * manually authoring vertex buffer indices, use the [[stage_in]] attribute - * which will automatically use the vertex input information from the - * SDL_GPUPipeline. + * For fragment shaders: + * + * - 2: Sampled textures, followed by storage textures, followed by storage + * buffers + * - 3: Uniform buffers + * + * For DXBC and DXIL shaders, use the following register order: + * + * For vertex shaders: + * + * - (t[n], space0): Sampled textures, followed by storage textures, followed + * by storage buffers + * - (s[n], space0): Samplers with indices corresponding to the sampled + * textures + * - (b[n], space1): Uniform buffers + * + * For pixel shaders: + * + * - (t[n], space2): Sampled textures, followed by storage textures, followed + * by storage buffers + * - (s[n], space2): Samplers with indices corresponding to the sampled + * textures + * - (b[n], space3): Uniform buffers + * + * For MSL/metallib, use the following order: + * + * - [[texture]]: Sampled textures, followed by storage textures + * - [[sampler]]: Samplers with indices corresponding to the sampled textures + * - [[buffer]]: Uniform buffers, followed by storage buffers. Vertex buffer 0 + * is bound at [[buffer(14)]], vertex buffer 1 at [[buffer(15)]], and so on. + * Rather than manually authoring vertex buffer indices, use the + * [[stage_in]] attribute which will automatically use the vertex input + * information from the SDL_GPUGraphicsPipeline. + * + * Shader semantics other than system-value semantics do not matter in D3D12 + * and for ease of use the SDL implementation assumes that non system-value + * semantics will all be TEXCOORD. If you are using HLSL as the shader source + * language, your vertex semantics should start at TEXCOORD0 and increment + * like so: TEXCOORD1, TEXCOORD2, etc. If you wish to change the semantic + * prefix to something other than TEXCOORD you can use + * SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING with + * SDL_CreateGPUDeviceWithProperties(). + * + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_SHADER_CREATE_NAME_STRING`: a name that can be displayed in + * debugging tools. * * \param device a GPU Context. - * \param shaderCreateInfo a struct describing the state of the desired - * shader. - * \returns a shader object on success, or NULL on failure. + * \param createinfo a struct describing the state of the shader to create. + * \returns a shader object on success, or NULL on failure; call + * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline * \sa SDL_ReleaseGPUShader */ extern SDL_DECLSPEC SDL_GPUShader *SDLCALL SDL_CreateGPUShader( SDL_GPUDevice *device, - SDL_GPUShaderCreateInfo *shaderCreateInfo); + const SDL_GPUShaderCreateInfo *createinfo); + +#define SDL_PROP_GPU_SHADER_CREATE_NAME_STRING "SDL.gpu.shader.create.name" /** * Creates a texture object to be used in graphics or compute workflows. @@ -1157,12 +2427,36 @@ extern SDL_DECLSPEC SDL_GPUShader *SDLCALL SDL_CreateGPUShader( * implementation will automatically fall back to the highest available sample * count. * - * \param device a GPU Context. - * \param textureCreateInfo a struct describing the state of the texture to - * create. - * \returns a texture object on success, or NULL on failure. + * There are optional properties that can be provided through + * SDL_GPUTextureCreateInfo's `props`. These are the supported properties: * - * \since This function is available since SDL 3.0.0. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT`: (Direct3D 12 only) if + * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture + * to a color with this red intensity. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT`: (Direct3D 12 only) if + * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture + * to a color with this green intensity. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT`: (Direct3D 12 only) if + * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture + * to a color with this blue intensity. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT`: (Direct3D 12 only) if + * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture + * to a color with this alpha intensity. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT`: (Direct3D 12 only) + * if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear + * the texture to a depth of this value. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_UINT8`: (Direct3D 12 + * only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, + * clear the texture to a stencil of this value. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING`: a name that can be displayed + * in debugging tools. + * + * \param device a GPU Context. + * \param createinfo a struct describing the state of the texture to create. + * \returns a texture object on success, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUTexture * \sa SDL_DownloadFromGPUTexture @@ -1177,7 +2471,15 @@ extern SDL_DECLSPEC SDL_GPUShader *SDLCALL SDL_CreateGPUShader( */ extern SDL_DECLSPEC SDL_GPUTexture *SDLCALL SDL_CreateGPUTexture( SDL_GPUDevice *device, - SDL_GPUTextureCreateInfo *textureCreateInfo); + const SDL_GPUTextureCreateInfo *createinfo); + +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT "SDL.gpu.texture.create.d3d12.clear.r" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT "SDL.gpu.texture.create.d3d12.clear.g" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT "SDL.gpu.texture.create.d3d12.clear.b" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT "SDL.gpu.texture.create.d3d12.clear.a" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT "SDL.gpu.texture.create.d3d12.clear.depth" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_UINT8 "SDL.gpu.texture.create.d3d12.clear.stencil" +#define SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING "SDL.gpu.texture.create.name" /** * Creates a buffer object to be used in graphics or compute workflows. @@ -1188,35 +2490,63 @@ extern SDL_DECLSPEC SDL_GPUTexture *SDLCALL SDL_CreateGPUTexture( * Note that certain combinations of usage flags are invalid. For example, a * buffer cannot have both the VERTEX and INDEX flags. * - * \param device a GPU Context. - * \param bufferCreateInfo a struct describing the state of the buffer to - * create. - * \returns a buffer object on success, or NULL on failure. + * For better understanding of underlying concepts and memory management with + * SDL GPU API, you may refer + * [this blog post](https://moonside.games/posts/sdl-gpu-concepts-cycling/) + * . * - * \since This function is available since SDL 3.0.0. + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING`: a name that can be displayed in + * debugging tools. + * + * \param device a GPU Context. + * \param createinfo a struct describing the state of the buffer to create. + * \returns a buffer object on success, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUBuffer + * \sa SDL_DownloadFromGPUBuffer + * \sa SDL_CopyGPUBufferToBuffer * \sa SDL_BindGPUVertexBuffers * \sa SDL_BindGPUIndexBuffer * \sa SDL_BindGPUVertexStorageBuffers * \sa SDL_BindGPUFragmentStorageBuffers + * \sa SDL_DrawGPUPrimitivesIndirect + * \sa SDL_DrawGPUIndexedPrimitivesIndirect * \sa SDL_BindGPUComputeStorageBuffers + * \sa SDL_DispatchGPUComputeIndirect * \sa SDL_ReleaseGPUBuffer */ extern SDL_DECLSPEC SDL_GPUBuffer *SDLCALL SDL_CreateGPUBuffer( SDL_GPUDevice *device, - SDL_GPUBufferCreateInfo *bufferCreateInfo); + const SDL_GPUBufferCreateInfo *createinfo); + +#define SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING "SDL.gpu.buffer.create.name" /** * Creates a transfer buffer to be used when uploading to or downloading from * graphics resources. * - * \param device a GPU Context. - * \param transferBufferCreateInfo a struct describing the state of the - * transfer buffer to create. - * \returns a transfer buffer on success, or NULL on failure. + * Download buffers can be particularly expensive to create, so it is good + * practice to reuse them if data will be downloaded regularly. * - * \since This function is available since SDL 3.0.0. + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING`: a name that can be + * displayed in debugging tools. + * + * \param device a GPU Context. + * \param createinfo a struct describing the state of the transfer buffer to + * create. + * \returns a transfer buffer on success, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUBuffer * \sa SDL_DownloadFromGPUBuffer @@ -1226,20 +2556,28 @@ extern SDL_DECLSPEC SDL_GPUBuffer *SDLCALL SDL_CreateGPUBuffer( */ extern SDL_DECLSPEC SDL_GPUTransferBuffer *SDLCALL SDL_CreateGPUTransferBuffer( SDL_GPUDevice *device, - SDL_GPUTransferBufferCreateInfo *transferBufferCreateInfo); + const SDL_GPUTransferBufferCreateInfo *createinfo); + +#define SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING "SDL.gpu.transferbuffer.create.name" /* Debug Naming */ /** * Sets an arbitrary string constant to label a buffer. * - * Useful for debugging. + * You should use SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING with + * SDL_CreateGPUBuffer instead of this function to avoid thread safety issues. * * \param device a GPU Context. * \param buffer a buffer to attach the name to. * \param text a UTF-8 string constant to mark as the name of the buffer. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe, you must make sure the + * buffer is not simultaneously used by any other thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUBuffer */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBufferName( SDL_GPUDevice *device, @@ -1249,13 +2587,20 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBufferName( /** * Sets an arbitrary string constant to label a texture. * - * Useful for debugging. + * You should use SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING with + * SDL_CreateGPUTexture instead of this function to avoid thread safety + * issues. * * \param device a GPU Context. * \param texture a texture to attach the name to. * \param text a UTF-8 string constant to mark as the name of the texture. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe, you must make sure the + * texture is not simultaneously used by any other thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUTextureName( SDL_GPUDevice *device, @@ -1267,13 +2612,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUTextureName( * * Useful for debugging. * - * \param commandBuffer a command buffer. + * \param command_buffer a command buffer. * \param text a UTF-8 string constant to insert as the label. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel( - SDL_GPUCommandBuffer *commandBuffer, + SDL_GPUCommandBuffer *command_buffer, const char *text); /** @@ -1290,28 +2635,28 @@ extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel( * pass rather than the command buffer. For best results, if you push a debug * group during a pass, always pop it in the same pass. * - * \param commandBuffer a command buffer. + * \param command_buffer a command buffer. * \param name a UTF-8 string constant that names the group. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PopGPUDebugGroup */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUDebugGroup( - SDL_GPUCommandBuffer *commandBuffer, + SDL_GPUCommandBuffer *command_buffer, const char *name); /** * Ends the most-recently pushed debug group. * - * \param commandBuffer a command buffer. + * \param command_buffer a command buffer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PushGPUDebugGroup */ extern SDL_DECLSPEC void SDLCALL SDL_PopGPUDebugGroup( - SDL_GPUCommandBuffer *commandBuffer); + SDL_GPUCommandBuffer *command_buffer); /* Disposal */ @@ -1323,7 +2668,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_PopGPUDebugGroup( * \param device a GPU context. * \param texture a texture to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTexture( SDL_GPUDevice *device, @@ -1332,12 +2677,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTexture( /** * Frees the given sampler as soon as it is safe to do so. * - * You must not reference the texture after calling this function. + * You must not reference the sampler after calling this function. * * \param device a GPU context. * \param sampler a sampler to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUSampler( SDL_GPUDevice *device, @@ -1351,7 +2696,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUSampler( * \param device a GPU context. * \param buffer a buffer to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUBuffer( SDL_GPUDevice *device, @@ -1363,13 +2708,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUBuffer( * You must not reference the transfer buffer after calling this function. * * \param device a GPU context. - * \param transferBuffer a transfer buffer to be destroyed. + * \param transfer_buffer a transfer buffer to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTransferBuffer( SDL_GPUDevice *device, - SDL_GPUTransferBuffer *transferBuffer); + SDL_GPUTransferBuffer *transfer_buffer); /** * Frees the given compute pipeline as soon as it is safe to do so. @@ -1377,13 +2722,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTransferBuffer( * You must not reference the compute pipeline after calling this function. * * \param device a GPU context. - * \param computePipeline a compute pipeline to be destroyed. + * \param compute_pipeline a compute pipeline to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUComputePipeline( SDL_GPUDevice *device, - SDL_GPUComputePipeline *computePipeline); + SDL_GPUComputePipeline *compute_pipeline); /** * Frees the given shader as soon as it is safe to do so. @@ -1393,7 +2738,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUComputePipeline( * \param device a GPU context. * \param shader a shader to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUShader( SDL_GPUDevice *device, @@ -1405,29 +2750,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUShader( * You must not reference the graphics pipeline after calling this function. * * \param device a GPU context. - * \param graphicsPipeline a graphics pipeline to be destroyed. + * \param graphics_pipeline a graphics pipeline to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline( SDL_GPUDevice *device, - SDL_GPUGraphicsPipeline *graphicsPipeline); - -/* - * COMMAND BUFFERS - * - * Render state is managed via command buffers. - * When setting render state, that state is always local to the command buffer. - * - * Commands only begin execution on the GPU once Submit is called. - * Once the command buffer is submitted, it is no longer valid to use it. - * - * Command buffers are executed in submission order. If you submit command buffer A and then command buffer B - * all commands in A will begin executing before any command in B begins executing. - * - * In multi-threading scenarios, you should acquire and submit a command buffer on the same thread. - * As long as you satisfy this requirement, all functionality related to command buffers is thread-safe. - */ + SDL_GPUGraphicsPipeline *graphics_pipeline); /** * Acquire a command buffer. @@ -1437,10 +2766,18 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline( * acquired on. The command buffer should be submitted on the thread it was * acquired on. * - * \param device a GPU context. - * \returns a command buffer. + * It is valid to acquire multiple command buffers on the same thread at once. + * In fact a common design pattern is to acquire two command buffers per frame + * where one is dedicated to render and compute passes and the other is + * dedicated to copy passes and other preparatory work such as generating + * mipmaps. Interleaving commands between the two command buffers reduces the + * total amount of passes overall which improves rendering performance. * - * \since This function is available since SDL 3.0.0. + * \param device a GPU context. + * \returns a command buffer, or NULL on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBuffer * \sa SDL_SubmitGPUCommandBufferAndAcquireFence @@ -1448,118 +2785,61 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline( extern SDL_DECLSPEC SDL_GPUCommandBuffer *SDLCALL SDL_AcquireGPUCommandBuffer( SDL_GPUDevice *device); -/* - * UNIFORM DATA - * - * Uniforms are for passing data to shaders. - * The uniform data will be constant across all executions of the shader. - * - * There are 4 available uniform slots per shader stage (vertex, fragment, compute). - * Uniform data pushed to a slot on a stage keeps its value throughout the command buffer - * until you call the relevant Push function on that slot again. - * - * For example, you could write your vertex shaders to read a camera matrix from uniform binding slot 0, - * push the camera matrix at the start of the command buffer, and that data will be used for every - * subsequent draw call. - * - * It is valid to push uniform data during a render or compute pass. - * - * Uniforms are best for pushing small amounts of data. - * If you are pushing more than a matrix or two per call you should consider using a storage buffer instead. - */ +/* Uniform Data */ /** * Pushes data to a vertex uniform slot on the command buffer. * * Subsequent draw calls will use this uniform data. * - * \param commandBuffer a command buffer. - * \param slotIndex the vertex uniform slot to push data to. + * \param command_buffer a command buffer. + * \param slot_index the vertex uniform slot to push data to. * \param data client data to write. - * \param dataLengthInBytes the length of the data to write. + * \param length the length of the data to write. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUVertexUniformData( - SDL_GPUCommandBuffer *commandBuffer, - Uint32 slotIndex, + SDL_GPUCommandBuffer *command_buffer, + Uint32 slot_index, const void *data, - Uint32 dataLengthInBytes); + Uint32 length); /** * Pushes data to a fragment uniform slot on the command buffer. * * Subsequent draw calls will use this uniform data. * - * \param commandBuffer a command buffer. - * \param slotIndex the fragment uniform slot to push data to. + * \param command_buffer a command buffer. + * \param slot_index the fragment uniform slot to push data to. * \param data client data to write. - * \param dataLengthInBytes the length of the data to write. + * \param length the length of the data to write. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUFragmentUniformData( - SDL_GPUCommandBuffer *commandBuffer, - Uint32 slotIndex, + SDL_GPUCommandBuffer *command_buffer, + Uint32 slot_index, const void *data, - Uint32 dataLengthInBytes); + Uint32 length); /** * Pushes data to a uniform slot on the command buffer. * * Subsequent draw calls will use this uniform data. * - * \param commandBuffer a command buffer. - * \param slotIndex the uniform slot to push data to. + * \param command_buffer a command buffer. + * \param slot_index the uniform slot to push data to. * \param data client data to write. - * \param dataLengthInBytes the length of the data to write. + * \param length the length of the data to write. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUComputeUniformData( - SDL_GPUCommandBuffer *commandBuffer, - Uint32 slotIndex, + SDL_GPUCommandBuffer *command_buffer, + Uint32 slot_index, const void *data, - Uint32 dataLengthInBytes); - -/* - * A NOTE ON CYCLING - * - * When using a command buffer, operations do not occur immediately - - * they occur some time after the command buffer is submitted. - * - * When a resource is used in a pending or active command buffer, it is considered to be "bound". - * When a resource is no longer used in any pending or active command buffers, it is considered to be "unbound". - * - * If data resources are bound, it is unspecified when that data will be unbound - * unless you acquire a fence when submitting the command buffer and wait on it. - * However, this doesn't mean you need to track resource usage manually. - * - * All of the functions and structs that involve writing to a resource have a "cycle" bool. - * GPUTransferBuffer, GPUBuffer, and GPUTexture all effectively function as ring buffers on internal resources. - * When cycle is SDL_TRUE, if the resource is bound, the cycle rotates to the next unbound internal resource, - * or if none are available, a new one is created. - * This means you don't have to worry about complex state tracking and synchronization as long as cycling is correctly employed. - * - * For example: you can call MapTransferBuffer, write texture data, UnmapTransferBuffer, and then UploadToTexture. - * The next time you write texture data to the transfer buffer, if you set the cycle param to SDL_TRUE, you don't have - * to worry about overwriting any data that is not yet uploaded. - * - * Another example: If you are using a texture in a render pass every frame, this can cause a data dependency between frames. - * If you set cycle to SDL_TRUE in the ColorAttachmentInfo struct, you can prevent this data dependency. - * - * Cycling will never undefine already bound data. - * When cycling, all data in the resource is considered to be undefined for subsequent commands until that data is written again. - * You must take care not to read undefined data. - * - * Note that when cycling a texture, the entire texture will be cycled, - * even if only part of the texture is used in the call, - * so you must consider the entire texture to contain undefined data after cycling. - * - * You must also take care not to overwrite a section of data that has been referenced in a command without cycling first. - * It is OK to overwrite unreferenced data in a bound resource without cycling, - * but overwriting a section of data that has already been referenced will produce unexpected results. - */ + Uint32 length); /* Graphics State */ @@ -1574,212 +2854,240 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUComputeUniformData( * is called. You cannot begin another render pass, or begin a compute pass or * copy pass until you have ended the render pass. * - * \param commandBuffer a command buffer. - * \param colorAttachmentInfos an array of texture subresources with - * corresponding clear values and load/store ops. - * \param colorAttachmentCount the number of color attachments in the - * colorAttachmentInfos array. - * \param depthStencilAttachmentInfo a texture subresource with corresponding - * clear value and load/store ops, may be - * NULL. + * \param command_buffer a command buffer. + * \param color_target_infos an array of texture subresources with + * corresponding clear values and load/store ops. + * \param num_color_targets the number of color targets in the + * color_target_infos array. + * \param depth_stencil_target_info a texture subresource with corresponding + * clear value and load/store ops, may be + * NULL. * \returns a render pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_EndGPURenderPass */ extern SDL_DECLSPEC SDL_GPURenderPass *SDLCALL SDL_BeginGPURenderPass( - SDL_GPUCommandBuffer *commandBuffer, - SDL_GPUColorAttachmentInfo *colorAttachmentInfos, - Uint32 colorAttachmentCount, - SDL_GPUDepthStencilAttachmentInfo *depthStencilAttachmentInfo); + SDL_GPUCommandBuffer *command_buffer, + const SDL_GPUColorTargetInfo *color_target_infos, + Uint32 num_color_targets, + const SDL_GPUDepthStencilTargetInfo *depth_stencil_target_info); /** * Binds a graphics pipeline on a render pass to be used in rendering. * * A graphics pipeline must be bound before making any draw calls. * - * \param renderPass a render pass handle. - * \param graphicsPipeline the graphics pipeline to bind. + * \param render_pass a render pass handle. + * \param graphics_pipeline the graphics pipeline to bind. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUGraphicsPipeline( - SDL_GPURenderPass *renderPass, - SDL_GPUGraphicsPipeline *graphicsPipeline); + SDL_GPURenderPass *render_pass, + SDL_GPUGraphicsPipeline *graphics_pipeline); /** * Sets the current viewport state on a command buffer. * - * \param renderPass a render pass handle. + * \param render_pass a render pass handle. * \param viewport the viewport to set. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUViewport( - SDL_GPURenderPass *renderPass, - SDL_GPUViewport *viewport); + SDL_GPURenderPass *render_pass, + const SDL_GPUViewport *viewport); /** * Sets the current scissor state on a command buffer. * - * \param renderPass a render pass handle. + * \param render_pass a render pass handle. * \param scissor the scissor area to set. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUScissor( - SDL_GPURenderPass *renderPass, - SDL_Rect *scissor); + SDL_GPURenderPass *render_pass, + const SDL_Rect *scissor); + +/** + * Sets the current blend constants on a command buffer. + * + * \param render_pass a render pass handle. + * \param blend_constants the blend constant color. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GPU_BLENDFACTOR_CONSTANT_COLOR + * \sa SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBlendConstants( + SDL_GPURenderPass *render_pass, + SDL_FColor blend_constants); + +/** + * Sets the current stencil reference value on a command buffer. + * + * \param render_pass a render pass handle. + * \param reference the stencil reference value to set. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetGPUStencilReference( + SDL_GPURenderPass *render_pass, + Uint8 reference); /** * Binds vertex buffers on a command buffer for use with subsequent draw * calls. * - * \param renderPass a render pass handle. - * \param firstBinding the starting bind point for the vertex buffers. - * \param pBindings an array of SDL_GPUBufferBinding structs containing vertex - * buffers and offset values. - * \param bindingCount the number of bindings in the pBindings array. + * \param render_pass a render pass handle. + * \param first_slot the vertex buffer slot to begin binding from. + * \param bindings an array of SDL_GPUBufferBinding structs containing vertex + * buffers and offset values. + * \param num_bindings the number of bindings in the bindings array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexBuffers( - SDL_GPURenderPass *renderPass, - Uint32 firstBinding, - SDL_GPUBufferBinding *pBindings, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + const SDL_GPUBufferBinding *bindings, + Uint32 num_bindings); /** * Binds an index buffer on a command buffer for use with subsequent draw * calls. * - * \param renderPass a render pass handle. - * \param pBinding a pointer to a struct containing an index buffer and - * offset. - * \param indexElementSize whether the index values in the buffer are 16- or - * 32-bit. + * \param render_pass a render pass handle. + * \param binding a pointer to a struct containing an index buffer and offset. + * \param index_element_size whether the index values in the buffer are 16- or + * 32-bit. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUIndexBuffer( - SDL_GPURenderPass *renderPass, - SDL_GPUBufferBinding *pBinding, - SDL_GPUIndexElementSize indexElementSize); + SDL_GPURenderPass *render_pass, + const SDL_GPUBufferBinding *binding, + SDL_GPUIndexElementSize index_element_size); /** * Binds texture-sampler pairs for use on the vertex shader. * - * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER_BIT. + * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. * - * \param renderPass a render pass handle. - * \param firstSlot the vertex sampler slot to begin binding from. - * \param textureSamplerBindings an array of texture-sampler binding structs. - * \param bindingCount the number of texture-sampler pairs to bind from the + * \param render_pass a render pass handle. + * \param first_slot the vertex sampler slot to begin binding from. + * \param texture_sampler_bindings an array of texture-sampler binding + * structs. + * \param num_bindings the number of texture-sampler pairs to bind from the * array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexSamplers( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUTextureSamplerBinding *textureSamplerBindings, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + const SDL_GPUTextureSamplerBinding *texture_sampler_bindings, + Uint32 num_bindings); /** * Binds storage textures for use on the vertex shader. * * These textures must have been created with - * SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ_BIT. + * SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ. * - * \param renderPass a render pass handle. - * \param firstSlot the vertex storage texture slot to begin binding from. - * \param storageTextures an array of storage textures. - * \param bindingCount the number of storage texture to bind from the array. + * \param render_pass a render pass handle. + * \param first_slot the vertex storage texture slot to begin binding from. + * \param storage_textures an array of storage textures. + * \param num_bindings the number of storage texture to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageTextures( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUTexture **storageTextures, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + SDL_GPUTexture *const *storage_textures, + Uint32 num_bindings); /** * Binds storage buffers for use on the vertex shader. * * These buffers must have been created with - * SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ_BIT. + * SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ. * - * \param renderPass a render pass handle. - * \param firstSlot the vertex storage buffer slot to begin binding from. - * \param storageBuffers an array of buffers. - * \param bindingCount the number of buffers to bind from the array. + * \param render_pass a render pass handle. + * \param first_slot the vertex storage buffer slot to begin binding from. + * \param storage_buffers an array of buffers. + * \param num_bindings the number of buffers to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageBuffers( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUBuffer **storageBuffers, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + SDL_GPUBuffer *const *storage_buffers, + Uint32 num_bindings); /** * Binds texture-sampler pairs for use on the fragment shader. * - * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER_BIT. + * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. * - * \param renderPass a render pass handle. - * \param firstSlot the fragment sampler slot to begin binding from. - * \param textureSamplerBindings an array of texture-sampler binding structs. - * \param bindingCount the number of texture-sampler pairs to bind from the + * \param render_pass a render pass handle. + * \param first_slot the fragment sampler slot to begin binding from. + * \param texture_sampler_bindings an array of texture-sampler binding + * structs. + * \param num_bindings the number of texture-sampler pairs to bind from the * array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentSamplers( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUTextureSamplerBinding *textureSamplerBindings, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + const SDL_GPUTextureSamplerBinding *texture_sampler_bindings, + Uint32 num_bindings); /** * Binds storage textures for use on the fragment shader. * * These textures must have been created with - * SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ_BIT. + * SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ. * - * \param renderPass a render pass handle. - * \param firstSlot the fragment storage texture slot to begin binding from. - * \param storageTextures an array of storage textures. - * \param bindingCount the number of storage textures to bind from the array. + * \param render_pass a render pass handle. + * \param first_slot the fragment storage texture slot to begin binding from. + * \param storage_textures an array of storage textures. + * \param num_bindings the number of storage textures to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageTextures( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUTexture **storageTextures, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + SDL_GPUTexture *const *storage_textures, + Uint32 num_bindings); /** * Binds storage buffers for use on the fragment shader. * * These buffers must have been created with - * SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ_BIT. + * SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ. * - * \param renderPass a render pass handle. - * \param firstSlot the fragment storage buffer slot to begin binding from. - * \param storageBuffers an array of storage buffers. - * \param bindingCount the number of storage buffers to bind from the array. + * \param render_pass a render pass handle. + * \param first_slot the fragment storage buffer slot to begin binding from. + * \param storage_buffers an array of storage buffers. + * \param num_bindings the number of storage buffers to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageBuffers( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUBuffer **storageBuffers, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + SDL_GPUBuffer *const *storage_buffers, + Uint32 num_bindings); /* Drawing */ @@ -1789,100 +3097,101 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageBuffers( * * You must not call this function before binding a graphics pipeline. * - * Note that the `firstVertex` and `firstInstance` parameters are NOT + * Note that the `first_vertex` and `first_instance` parameters are NOT * compatible with built-in vertex/instance ID variables in shaders (for - * example, SV_VertexID). If your shader depends on these variables, the - * correlating draw call parameter MUST be 0. + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. * - * \param renderPass a render pass handle. - * \param indexCount the number of vertices to draw per instance. - * \param instanceCount the number of instances to draw. - * \param firstIndex the starting index within the index buffer. - * \param vertexOffset value added to vertex index before indexing into the - * vertex buffer. - * \param firstInstance the ID of the first instance to draw. + * \param render_pass a render pass handle. + * \param num_indices the number of indices to draw per instance. + * \param num_instances the number of instances to draw. + * \param first_index the starting index within the index buffer. + * \param vertex_offset value added to vertex index before indexing into the + * vertex buffer. + * \param first_instance the ID of the first instance to draw. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitives( - SDL_GPURenderPass *renderPass, - Uint32 indexCount, - Uint32 instanceCount, - Uint32 firstIndex, - Sint32 vertexOffset, - Uint32 firstInstance); + SDL_GPURenderPass *render_pass, + Uint32 num_indices, + Uint32 num_instances, + Uint32 first_index, + Sint32 vertex_offset, + Uint32 first_instance); /** * Draws data using bound graphics state. * * You must not call this function before binding a graphics pipeline. * - * Note that the `firstVertex` and `firstInstance` parameters are NOT + * Note that the `first_vertex` and `first_instance` parameters are NOT * compatible with built-in vertex/instance ID variables in shaders (for - * example, SV_VertexID). If your shader depends on these variables, the - * correlating draw call parameter MUST be 0. + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. * - * \param renderPass a render pass handle. - * \param vertexCount the number of vertices to draw. - * \param instanceCount the number of instances that will be drawn. - * \param firstVertex the index of the first vertex to draw. - * \param firstInstance the ID of the first instance to draw. + * \param render_pass a render pass handle. + * \param num_vertices the number of vertices to draw. + * \param num_instances the number of instances that will be drawn. + * \param first_vertex the index of the first vertex to draw. + * \param first_instance the ID of the first instance to draw. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitives( - SDL_GPURenderPass *renderPass, - Uint32 vertexCount, - Uint32 instanceCount, - Uint32 firstVertex, - Uint32 firstInstance); + SDL_GPURenderPass *render_pass, + Uint32 num_vertices, + Uint32 num_instances, + Uint32 first_vertex, + Uint32 first_instance); /** * Draws data using bound graphics state and with draw parameters set from a * buffer. * - * The buffer layout should match the layout of SDL_GPUIndirectDrawCommand. - * You must not call this function before binding a graphics pipeline. + * The buffer must consist of tightly-packed draw parameter sets that each + * match the layout of SDL_GPUIndirectDrawCommand. You must not call this + * function before binding a graphics pipeline. * - * \param renderPass a render pass handle. + * \param render_pass a render pass handle. * \param buffer a buffer containing draw parameters. - * \param offsetInBytes the offset to start reading from the draw buffer. - * \param drawCount the number of draw parameter sets that should be read from - * the draw buffer. - * \param stride the byte stride between sets of draw parameters. + * \param offset the offset to start reading from the draw buffer. + * \param draw_count the number of draw parameter sets that should be read + * from the draw buffer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitivesIndirect( - SDL_GPURenderPass *renderPass, + SDL_GPURenderPass *render_pass, SDL_GPUBuffer *buffer, - Uint32 offsetInBytes, - Uint32 drawCount, - Uint32 stride); + Uint32 offset, + Uint32 draw_count); /** * Draws data using bound graphics state with an index buffer enabled and with * draw parameters set from a buffer. * - * The buffer layout should match the layout of - * SDL_GPUIndexedIndirectDrawCommand. You must not call this function before - * binding a graphics pipeline. + * The buffer must consist of tightly-packed draw parameter sets that each + * match the layout of SDL_GPUIndexedIndirectDrawCommand. You must not call + * this function before binding a graphics pipeline. * - * \param renderPass a render pass handle. + * \param render_pass a render pass handle. * \param buffer a buffer containing draw parameters. - * \param offsetInBytes the offset to start reading from the draw buffer. - * \param drawCount the number of draw parameter sets that should be read from - * the draw buffer. - * \param stride the byte stride between sets of draw parameters. + * \param offset the offset to start reading from the draw buffer. + * \param draw_count the number of draw parameter sets that should be read + * from the draw buffer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitivesIndirect( - SDL_GPURenderPass *renderPass, + SDL_GPURenderPass *render_pass, SDL_GPUBuffer *buffer, - Uint32 offsetInBytes, - Uint32 drawCount, - Uint32 stride); + Uint32 offset, + Uint32 draw_count); /** * Ends the given render pass. @@ -1890,12 +3199,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitivesIndirect( * All bound graphics state on the render pass command buffer is unset. The * render pass handle is now invalid. * - * \param renderPass a render pass handle. + * \param render_pass a render pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EndGPURenderPass( - SDL_GPURenderPass *renderPass); + SDL_GPURenderPass *render_pass); /* Compute Pass */ @@ -1903,89 +3212,115 @@ extern SDL_DECLSPEC void SDLCALL SDL_EndGPURenderPass( * Begins a compute pass on a command buffer. * * A compute pass is defined by a set of texture subresources and buffers that - * will be written to by compute pipelines. These textures and buffers must - * have been created with the COMPUTE_STORAGE_WRITE bit. All operations - * related to compute pipelines must take place inside of a compute pass. You - * must not begin another compute pass, or a render pass or copy pass before - * ending the compute pass. + * may be written to by compute pipelines. These textures and buffers must + * have been created with the COMPUTE_STORAGE_WRITE bit or the + * COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE bit. If you do not create a texture + * with COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE, you must not read from the + * texture in the compute pass. All operations related to compute pipelines + * must take place inside of a compute pass. You must not begin another + * compute pass, or a render pass or copy pass before ending the compute pass. * - * A VERY IMPORTANT NOTE Textures and buffers bound as write-only MUST NOT be - * read from during the compute pass. Doing so will result in undefined - * behavior. If your compute work requires reading the output from a previous - * dispatch, you MUST end the current compute pass and begin a new one before - * you can safely access the data. + * A VERY IMPORTANT NOTE - Reads and writes in compute passes are NOT + * implicitly synchronized. This means you may cause data races by both + * reading and writing a resource region in a compute pass, or by writing + * multiple times to a resource region. If your compute work depends on + * reading the completed output from a previous dispatch, you MUST end the + * current compute pass and begin a new one before you can safely access the + * data. Otherwise you will receive unexpected results. Reading and writing a + * texture in the same compute pass is only supported by specific texture + * formats. Make sure you check the format support! * - * \param commandBuffer a command buffer. - * \param storageTextureBindings an array of writeable storage texture binding - * structs. - * \param storageTextureBindingCount the number of storage textures to bind - * from the array. - * \param storageBufferBindings an array of writeable storage buffer binding - * structs. - * \param storageBufferBindingCount the number of storage buffers to bind from - * the array. + * \param command_buffer a command buffer. + * \param storage_texture_bindings an array of writeable storage texture + * binding structs. + * \param num_storage_texture_bindings the number of storage textures to bind + * from the array. + * \param storage_buffer_bindings an array of writeable storage buffer binding + * structs. + * \param num_storage_buffer_bindings the number of storage buffers to bind + * from the array. * \returns a compute pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_EndGPUComputePass */ extern SDL_DECLSPEC SDL_GPUComputePass *SDLCALL SDL_BeginGPUComputePass( - SDL_GPUCommandBuffer *commandBuffer, - SDL_GPUStorageTextureWriteOnlyBinding *storageTextureBindings, - Uint32 storageTextureBindingCount, - SDL_GPUStorageBufferWriteOnlyBinding *storageBufferBindings, - Uint32 storageBufferBindingCount); + SDL_GPUCommandBuffer *command_buffer, + const SDL_GPUStorageTextureReadWriteBinding *storage_texture_bindings, + Uint32 num_storage_texture_bindings, + const SDL_GPUStorageBufferReadWriteBinding *storage_buffer_bindings, + Uint32 num_storage_buffer_bindings); /** * Binds a compute pipeline on a command buffer for use in compute dispatch. * - * \param computePass a compute pass handle. - * \param computePipeline a compute pipeline to bind. + * \param compute_pass a compute pass handle. + * \param compute_pipeline a compute pipeline to bind. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputePipeline( - SDL_GPUComputePass *computePass, - SDL_GPUComputePipeline *computePipeline); + SDL_GPUComputePass *compute_pass, + SDL_GPUComputePipeline *compute_pipeline); + +/** + * Binds texture-sampler pairs for use on the compute shader. + * + * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. + * + * \param compute_pass a compute pass handle. + * \param first_slot the compute sampler slot to begin binding from. + * \param texture_sampler_bindings an array of texture-sampler binding + * structs. + * \param num_bindings the number of texture-sampler bindings to bind from the + * array. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeSamplers( + SDL_GPUComputePass *compute_pass, + Uint32 first_slot, + const SDL_GPUTextureSamplerBinding *texture_sampler_bindings, + Uint32 num_bindings); /** * Binds storage textures as readonly for use on the compute pipeline. * * These textures must have been created with - * SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ_BIT. + * SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ. * - * \param computePass a compute pass handle. - * \param firstSlot the compute storage texture slot to begin binding from. - * \param storageTextures an array of storage textures. - * \param bindingCount the number of storage textures to bind from the array. + * \param compute_pass a compute pass handle. + * \param first_slot the compute storage texture slot to begin binding from. + * \param storage_textures an array of storage textures. + * \param num_bindings the number of storage textures to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageTextures( - SDL_GPUComputePass *computePass, - Uint32 firstSlot, - SDL_GPUTexture **storageTextures, - Uint32 bindingCount); + SDL_GPUComputePass *compute_pass, + Uint32 first_slot, + SDL_GPUTexture *const *storage_textures, + Uint32 num_bindings); /** * Binds storage buffers as readonly for use on the compute pipeline. * * These buffers must have been created with - * SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ_BIT. + * SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ. * - * \param computePass a compute pass handle. - * \param firstSlot the compute storage buffer slot to begin binding from. - * \param storageBuffers an array of storage buffer binding structs. - * \param bindingCount the number of storage buffers to bind from the array. + * \param compute_pass a compute pass handle. + * \param first_slot the compute storage buffer slot to begin binding from. + * \param storage_buffers an array of storage buffer binding structs. + * \param num_bindings the number of storage buffers to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageBuffers( - SDL_GPUComputePass *computePass, - Uint32 firstSlot, - SDL_GPUBuffer **storageBuffers, - Uint32 bindingCount); + SDL_GPUComputePass *compute_pass, + Uint32 first_slot, + SDL_GPUBuffer *const *storage_buffers, + Uint32 num_bindings); /** * Dispatches compute work. @@ -1997,21 +3332,21 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageBuffers( * guarantee of which order the writes will occur. If the write order matters, * you MUST end the compute pass and begin another one. * - * \param computePass a compute pass handle. - * \param groupCountX number of local workgroups to dispatch in the X - * dimension. - * \param groupCountY number of local workgroups to dispatch in the Y - * dimension. - * \param groupCountZ number of local workgroups to dispatch in the Z - * dimension. + * \param compute_pass a compute pass handle. + * \param groupcount_x number of local workgroups to dispatch in the X + * dimension. + * \param groupcount_y number of local workgroups to dispatch in the Y + * dimension. + * \param groupcount_z number of local workgroups to dispatch in the Z + * dimension. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUCompute( - SDL_GPUComputePass *computePass, - Uint32 groupCountX, - Uint32 groupCountY, - Uint32 groupCountZ); + SDL_GPUComputePass *compute_pass, + Uint32 groupcount_x, + Uint32 groupcount_y, + Uint32 groupcount_z); /** * Dispatches compute work with parameters set from a buffer. @@ -2025,16 +3360,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUCompute( * guarantee of which order the writes will occur. If the write order matters, * you MUST end the compute pass and begin another one. * - * \param computePass a compute pass handle. + * \param compute_pass a compute pass handle. * \param buffer a buffer containing dispatch parameters. - * \param offsetInBytes the offset to start reading from the dispatch buffer. + * \param offset the offset to start reading from the dispatch buffer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUComputeIndirect( - SDL_GPUComputePass *computePass, + SDL_GPUComputePass *compute_pass, SDL_GPUBuffer *buffer, - Uint32 offsetInBytes); + Uint32 offset); /** * Ends the current compute pass. @@ -2042,12 +3377,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUComputeIndirect( * All bound compute state on the command buffer is unset. The compute pass * handle is now invalid. * - * \param computePass a compute pass handle. + * \param compute_pass a compute pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EndGPUComputePass( - SDL_GPUComputePass *computePass); + SDL_GPUComputePass *compute_pass); /* TransferBuffer Data */ @@ -2057,28 +3392,29 @@ extern SDL_DECLSPEC void SDLCALL SDL_EndGPUComputePass( * You must unmap the transfer buffer before encoding upload commands. * * \param device a GPU context. - * \param transferBuffer a transfer buffer. - * \param cycle if SDL_TRUE, cycles the transfer buffer if it is bound. - * \returns the address of the mapped transfer buffer memory. + * \param transfer_buffer a transfer buffer. + * \param cycle if true, cycles the transfer buffer if it is already bound. + * \returns the address of the mapped transfer buffer memory, or NULL on + * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void *SDLCALL SDL_MapGPUTransferBuffer( SDL_GPUDevice *device, - SDL_GPUTransferBuffer *transferBuffer, - SDL_bool cycle); + SDL_GPUTransferBuffer *transfer_buffer, + bool cycle); /** * Unmaps a previously mapped transfer buffer. * * \param device a GPU context. - * \param transferBuffer a previously mapped transfer buffer. + * \param transfer_buffer a previously mapped transfer buffer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnmapGPUTransferBuffer( SDL_GPUDevice *device, - SDL_GPUTransferBuffer *transferBuffer); + SDL_GPUTransferBuffer *transfer_buffer); /* Copy Pass */ @@ -2089,13 +3425,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnmapGPUTransferBuffer( * inside a copy pass. You must not begin another copy pass, or a render pass * or compute pass before ending the copy pass. * - * \param commandBuffer a command buffer. + * \param command_buffer a command buffer. * \returns a copy pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GPUCopyPass *SDLCALL SDL_BeginGPUCopyPass( - SDL_GPUCommandBuffer *commandBuffer); + SDL_GPUCommandBuffer *command_buffer); /** * Uploads data from a transfer buffer to a texture. @@ -2106,21 +3442,19 @@ extern SDL_DECLSPEC SDL_GPUCopyPass *SDLCALL SDL_BeginGPUCopyPass( * You must align the data in the transfer buffer to a multiple of the texel * size of the texture format. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source the source transfer buffer with image layout information. * \param destination the destination texture region. - * \param cycle if SDL_TRUE, cycles the texture if the texture is bound, - * otherwise overwrites the data. + * \param cycle if true, cycles the texture if the texture is bound, otherwise + * overwrites the data. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUTexture( - SDL_GPUCopyPass *copyPass, - SDL_GPUTextureTransferInfo *source, - SDL_GPUTextureRegion *destination, - SDL_bool cycle); - -/* Uploads data from a TransferBuffer to a Buffer. */ + SDL_GPUCopyPass *copy_pass, + const SDL_GPUTextureTransferInfo *source, + const SDL_GPUTextureRegion *destination, + bool cycle); /** * Uploads data from a transfer buffer to a buffer. @@ -2128,19 +3462,19 @@ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUTexture( * The upload occurs on the GPU timeline. You may assume that the upload has * finished in subsequent commands. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source the source transfer buffer with offset. * \param destination the destination buffer with offset and size. - * \param cycle if SDL_TRUE, cycles the buffer if it is bound, otherwise + * \param cycle if true, cycles the buffer if it is already bound, otherwise * overwrites the data. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUBuffer( - SDL_GPUCopyPass *copyPass, - SDL_GPUTransferBufferLocation *source, - SDL_GPUBufferRegion *destination, - SDL_bool cycle); + SDL_GPUCopyPass *copy_pass, + const SDL_GPUTransferBufferLocation *source, + const SDL_GPUBufferRegion *destination, + bool cycle); /** * Performs a texture-to-texture copy. @@ -2148,27 +3482,25 @@ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUBuffer( * This copy occurs on the GPU timeline. You may assume the copy has finished * in subsequent commands. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source a source texture region. * \param destination a destination texture region. * \param w the width of the region to copy. * \param h the height of the region to copy. * \param d the depth of the region to copy. - * \param cycle if SDL_TRUE, cycles the destination texture if the destination + * \param cycle if true, cycles the destination texture if the destination * texture is bound, otherwise overwrites the data. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUTextureToTexture( - SDL_GPUCopyPass *copyPass, - SDL_GPUTextureLocation *source, - SDL_GPUTextureLocation *destination, + SDL_GPUCopyPass *copy_pass, + const SDL_GPUTextureLocation *source, + const SDL_GPUTextureLocation *destination, Uint32 w, Uint32 h, Uint32 d, - SDL_bool cycle); - -/* Copies data from a buffer to a buffer. */ + bool cycle); /** * Performs a buffer-to-buffer copy. @@ -2176,21 +3508,21 @@ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUTextureToTexture( * This copy occurs on the GPU timeline. You may assume the copy has finished * in subsequent commands. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source the buffer and offset to copy from. * \param destination the buffer and offset to copy to. * \param size the length of the buffer to copy. - * \param cycle if SDL_TRUE, cycles the destination buffer if it is bound, + * \param cycle if true, cycles the destination buffer if it is already bound, * otherwise overwrites the data. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUBufferToBuffer( - SDL_GPUCopyPass *copyPass, - SDL_GPUBufferLocation *source, - SDL_GPUBufferLocation *destination, + SDL_GPUCopyPass *copy_pass, + const SDL_GPUBufferLocation *source, + const SDL_GPUBufferLocation *destination, Uint32 size, - SDL_bool cycle); + bool cycle); /** * Copies data from a texture to a transfer buffer on the GPU timeline. @@ -2198,17 +3530,17 @@ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUBufferToBuffer( * This data is not guaranteed to be copied until the command buffer fence is * signaled. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source the source texture region. * \param destination the destination transfer buffer with image layout * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUTexture( - SDL_GPUCopyPass *copyPass, - SDL_GPUTextureRegion *source, - SDL_GPUTextureTransferInfo *destination); + SDL_GPUCopyPass *copy_pass, + const SDL_GPUTextureRegion *source, + const SDL_GPUTextureTransferInfo *destination); /** * Copies data from a buffer to a transfer buffer on the GPU timeline. @@ -2216,39 +3548,39 @@ extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUTexture( * This data is not guaranteed to be copied until the command buffer fence is * signaled. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source the source buffer with offset and size. * \param destination the destination transfer buffer with offset. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUBuffer( - SDL_GPUCopyPass *copyPass, - SDL_GPUBufferRegion *source, - SDL_GPUTransferBufferLocation *destination); + SDL_GPUCopyPass *copy_pass, + const SDL_GPUBufferRegion *source, + const SDL_GPUTransferBufferLocation *destination); /** * Ends the current copy pass. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EndGPUCopyPass( - SDL_GPUCopyPass *copyPass); + SDL_GPUCopyPass *copy_pass); /** * Generates mipmaps for the given texture. * * This function must not be called inside of any pass. * - * \param commandBuffer a commandBuffer. + * \param command_buffer a command_buffer. * \param texture a texture with more than 1 mip level. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_GenerateMipmapsForGPUTexture( - SDL_GPUCommandBuffer *commandBuffer, + SDL_GPUCommandBuffer *command_buffer, SDL_GPUTexture *texture); /** @@ -2256,23 +3588,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_GenerateMipmapsForGPUTexture( * * This function must not be called inside of any pass. * - * \param commandBuffer a command buffer. - * \param source the texture region to copy from. - * \param destination the texture region to copy to. - * \param flipMode the flip mode for the source texture region. - * \param filterMode the filter mode that will be used when blitting. - * \param cycle if SDL_TRUE, cycles the destination texture if the destination - * texture is bound, otherwise overwrites the data. + * \param command_buffer a command buffer. + * \param info the blit info struct containing the blit parameters. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BlitGPUTexture( - SDL_GPUCommandBuffer *commandBuffer, - SDL_GPUBlitRegion *source, - SDL_GPUBlitRegion *destination, - SDL_FlipMode flipMode, - SDL_GPUFilter filterMode, - SDL_bool cycle); + SDL_GPUCommandBuffer *command_buffer, + const SDL_GPUBlitInfo *info); /* Submission/Presentation */ @@ -2283,17 +3606,17 @@ extern SDL_DECLSPEC void SDLCALL SDL_BlitGPUTexture( * * \param device a GPU context. * \param window an SDL_Window. - * \param swapchainComposition the swapchain composition to check. - * \returns SDL_TRUE if supported, SDL_FALSE if unsupported (or on error). + * \param swapchain_composition the swapchain composition to check. + * \returns true if supported, false if unsupported. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WindowSupportsGPUSwapchainComposition( +extern SDL_DECLSPEC bool SDLCALL SDL_WindowSupportsGPUSwapchainComposition( SDL_GPUDevice *device, SDL_Window *window, - SDL_GPUSwapchainComposition swapchainComposition); + SDL_GPUSwapchainComposition swapchain_composition); /** * Determines whether a presentation mode is supported by the window. @@ -2302,40 +3625,46 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WindowSupportsGPUSwapchainComposition( * * \param device a GPU context. * \param window an SDL_Window. - * \param presentMode the presentation mode to check. - * \returns SDL_TRUE if supported, SDL_FALSE if unsupported (or on error). + * \param present_mode the presentation mode to check. + * \returns true if supported, false if unsupported. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WindowSupportsGPUPresentMode( +extern SDL_DECLSPEC bool SDLCALL SDL_WindowSupportsGPUPresentMode( SDL_GPUDevice *device, SDL_Window *window, - SDL_GPUPresentMode presentMode); + SDL_GPUPresentMode present_mode); /** * Claims a window, creating a swapchain structure for it. * * This must be called before SDL_AcquireGPUSwapchainTexture is called using + * the window. You should only call this function from the thread that created * the window. * * The swapchain will be created with SDL_GPU_SWAPCHAINCOMPOSITION_SDR and * SDL_GPU_PRESENTMODE_VSYNC. If you want to have different swapchain - * parameters, you must call SetSwapchainParameters after claiming the window. + * parameters, you must call SDL_SetGPUSwapchainParameters after claiming the + * window. * * \param device a GPU context. * \param window an SDL_Window. - * \returns SDL_TRUE on success, otherwise SDL_FALSE. + * \returns true on success, or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called from the thread that + * created the window. * - * \sa SDL_AcquireGPUSwapchainTexture + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_WaitAndAcquireGPUSwapchainTexture * \sa SDL_ReleaseWindowFromGPUDevice * \sa SDL_WindowSupportsGPUPresentMode * \sa SDL_WindowSupportsGPUSwapchainComposition */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClaimWindowForGPUDevice( +extern SDL_DECLSPEC bool SDLCALL SDL_ClaimWindowForGPUDevice( SDL_GPUDevice *device, SDL_Window *window); @@ -2345,7 +3674,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClaimWindowForGPUDevice( * \param device a GPU context. * \param window an SDL_Window that has been claimed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice */ @@ -2366,29 +3695,61 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseWindowFromGPUDevice( * * \param device a GPU context. * \param window an SDL_Window that has been claimed. - * \param swapchainComposition the desired composition of the swapchain. - * \param presentMode the desired present mode for the swapchain. - * \returns SDL_TRUE if successful, SDL_FALSE on error. + * \param swapchain_composition the desired composition of the swapchain. + * \param present_mode the desired present mode for the swapchain. + * \returns true if successful, false on error; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WindowSupportsGPUPresentMode * \sa SDL_WindowSupportsGPUSwapchainComposition */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGPUSwapchainParameters( +extern SDL_DECLSPEC bool SDLCALL SDL_SetGPUSwapchainParameters( SDL_GPUDevice *device, SDL_Window *window, - SDL_GPUSwapchainComposition swapchainComposition, - SDL_GPUPresentMode presentMode); + SDL_GPUSwapchainComposition swapchain_composition, + SDL_GPUPresentMode present_mode); + +/** + * Configures the maximum allowed number of frames in flight. + * + * The default value when the device is created is 2. This means that after + * you have submitted 2 frames for presentation, if the GPU has not finished + * working on the first frame, SDL_AcquireGPUSwapchainTexture() will fill the + * swapchain texture pointer with NULL, and + * SDL_WaitAndAcquireGPUSwapchainTexture() will block. + * + * Higher values increase throughput at the expense of visual latency. Lower + * values decrease visual latency at the expense of throughput. + * + * Note that calling this function will stall and flush the command queue to + * prevent synchronization issues. + * + * The minimum value of allowed frames in flight is 1, and the maximum is 3. + * + * \param device a GPU context. + * \param allowed_frames_in_flight the maximum number of frames that can be + * pending on the GPU. + * \returns true if successful, false on error; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetGPUAllowedFramesInFlight( + SDL_GPUDevice *device, + Uint32 allowed_frames_in_flight); /** * Obtains the texture format of the swapchain for the given window. * + * Note that this format can change if the swapchain parameters change. + * * \param device a GPU context. * \param window an SDL_Window that has been claimed. * \returns the texture format of the swapchain. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUSwapchainTextureFormat( SDL_GPUDevice *device, @@ -2400,28 +3761,118 @@ extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUSwapchainTextureForma * When a swapchain texture is acquired on a command buffer, it will * automatically be submitted for presentation when the command buffer is * submitted. The swapchain texture should only be referenced by the command - * buffer used to acquire it. May return NULL under certain conditions. This - * is not necessarily an error. This texture is managed by the implementation - * and must not be freed by the user. You MUST NOT call this function from any - * thread other than the one that created the window. + * buffer used to acquire it. * - * \param commandBuffer a command buffer. + * This function will fill the swapchain texture handle with NULL if too many + * frames are in flight. This is not an error. + * + * If you use this function, it is possible to create a situation where many + * command buffers are allocated while the rendering context waits for the GPU + * to catch up, which will cause memory usage to grow. You should use + * SDL_WaitAndAcquireGPUSwapchainTexture() unless you know what you are doing + * with timing. + * + * The swapchain texture is managed by the implementation and must not be + * freed by the user. You MUST NOT call this function from any thread other + * than the one that created the window. + * + * \param command_buffer a command buffer. * \param window a window that has been claimed. - * \param pWidth a pointer filled in with the swapchain width. - * \param pHeight a pointer filled in with the swapchain height. - * \returns a swapchain texture. + * \param swapchain_texture a pointer filled in with a swapchain texture + * handle. + * \param swapchain_texture_width a pointer filled in with the swapchain + * texture width, may be NULL. + * \param swapchain_texture_height a pointer filled in with the swapchain + * texture height, may be NULL. + * \returns true on success, false on error; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called from the thread that + * created the window. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice * \sa SDL_SubmitGPUCommandBuffer * \sa SDL_SubmitGPUCommandBufferAndAcquireFence + * \sa SDL_CancelGPUCommandBuffer + * \sa SDL_GetWindowSizeInPixels + * \sa SDL_WaitForGPUSwapchain + * \sa SDL_WaitAndAcquireGPUSwapchainTexture + * \sa SDL_SetGPUAllowedFramesInFlight */ -extern SDL_DECLSPEC SDL_GPUTexture *SDLCALL SDL_AcquireGPUSwapchainTexture( - SDL_GPUCommandBuffer *commandBuffer, +extern SDL_DECLSPEC bool SDLCALL SDL_AcquireGPUSwapchainTexture( + SDL_GPUCommandBuffer *command_buffer, SDL_Window *window, - Uint32 *pWidth, - Uint32 *pHeight); + SDL_GPUTexture **swapchain_texture, + Uint32 *swapchain_texture_width, + Uint32 *swapchain_texture_height); + +/** + * Blocks the thread until a swapchain texture is available to be acquired. + * + * \param device a GPU context. + * \param window a window that has been claimed. + * \returns true on success, false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called from the thread that + * created the window. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_AcquireGPUSwapchainTexture + * \sa SDL_WaitAndAcquireGPUSwapchainTexture + * \sa SDL_SetGPUAllowedFramesInFlight + */ +extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUSwapchain( + SDL_GPUDevice *device, + SDL_Window *window); + +/** + * Blocks the thread until a swapchain texture is available to be acquired, + * and then acquires it. + * + * When a swapchain texture is acquired on a command buffer, it will + * automatically be submitted for presentation when the command buffer is + * submitted. The swapchain texture should only be referenced by the command + * buffer used to acquire it. It is an error to call + * SDL_CancelGPUCommandBuffer() after a swapchain texture is acquired. + * + * This function can fill the swapchain texture handle with NULL in certain + * cases, for example if the window is minimized. This is not an error. You + * should always make sure to check whether the pointer is NULL before + * actually using it. + * + * The swapchain texture is managed by the implementation and must not be + * freed by the user. You MUST NOT call this function from any thread other + * than the one that created the window. + * + * \param command_buffer a command buffer. + * \param window a window that has been claimed. + * \param swapchain_texture a pointer filled in with a swapchain texture + * handle. + * \param swapchain_texture_width a pointer filled in with the swapchain + * texture width, may be NULL. + * \param swapchain_texture_height a pointer filled in with the swapchain + * texture height, may be NULL. + * \returns true on success, false on error; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called from the thread that + * created the window. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SubmitGPUCommandBuffer + * \sa SDL_SubmitGPUCommandBufferAndAcquireFence + */ +extern SDL_DECLSPEC bool SDLCALL SDL_WaitAndAcquireGPUSwapchainTexture( + SDL_GPUCommandBuffer *command_buffer, + SDL_Window *window, + SDL_GPUTexture **swapchain_texture, + Uint32 *swapchain_texture_width, + Uint32 *swapchain_texture_height); /** * Submits a command buffer so its commands can be processed on the GPU. @@ -2433,16 +3884,19 @@ extern SDL_DECLSPEC SDL_GPUTexture *SDLCALL SDL_AcquireGPUSwapchainTexture( * All commands in the submission are guaranteed to begin executing before any * command in a subsequent submission begins executing. * - * \param commandBuffer a command buffer. + * \param command_buffer a command buffer. + * \returns true on success, false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AcquireGPUCommandBuffer + * \sa SDL_WaitAndAcquireGPUSwapchainTexture * \sa SDL_AcquireGPUSwapchainTexture * \sa SDL_SubmitGPUCommandBufferAndAcquireFence */ -extern SDL_DECLSPEC void SDLCALL SDL_SubmitGPUCommandBuffer( - SDL_GPUCommandBuffer *commandBuffer); +extern SDL_DECLSPEC bool SDLCALL SDL_SubmitGPUCommandBuffer( + SDL_GPUCommandBuffer *command_buffer); /** * Submits a command buffer so its commands can be processed on the GPU, and @@ -2456,63 +3910,94 @@ extern SDL_DECLSPEC void SDLCALL SDL_SubmitGPUCommandBuffer( * All commands in the submission are guaranteed to begin executing before any * command in a subsequent submission begins executing. * - * \param commandBuffer a command buffer. - * \returns a fence associated with the command buffer. + * \param command_buffer a command buffer. + * \returns a fence associated with the command buffer, or NULL on failure; + * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AcquireGPUCommandBuffer + * \sa SDL_WaitAndAcquireGPUSwapchainTexture * \sa SDL_AcquireGPUSwapchainTexture * \sa SDL_SubmitGPUCommandBuffer * \sa SDL_ReleaseGPUFence */ extern SDL_DECLSPEC SDL_GPUFence *SDLCALL SDL_SubmitGPUCommandBufferAndAcquireFence( - SDL_GPUCommandBuffer *commandBuffer); + SDL_GPUCommandBuffer *command_buffer); + +/** + * Cancels a command buffer. + * + * None of the enqueued commands are executed. + * + * It is an error to call this function after a swapchain texture has been + * acquired. + * + * This must be called from the thread the command buffer was acquired on. + * + * You must not reference the command buffer after calling this function. + * + * \param command_buffer a command buffer. + * \returns true on success, false on error; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_WaitAndAcquireGPUSwapchainTexture + * \sa SDL_AcquireGPUCommandBuffer + * \sa SDL_AcquireGPUSwapchainTexture + */ +extern SDL_DECLSPEC bool SDLCALL SDL_CancelGPUCommandBuffer( + SDL_GPUCommandBuffer *command_buffer); /** * Blocks the thread until the GPU is completely idle. * * \param device a GPU context. + * \returns true on success, false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WaitForGPUFences */ -extern SDL_DECLSPEC void SDLCALL SDL_WaitForGPUIdle( +extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUIdle( SDL_GPUDevice *device); /** * Blocks the thread until the given fences are signaled. * * \param device a GPU context. - * \param waitAll if 0, wait for any fence to be signaled, if 1, wait for all - * fences to be signaled. - * \param pFences an array of fences to wait on. - * \param fenceCount the number of fences in the pFences array. + * \param wait_all if 0, wait for any fence to be signaled, if 1, wait for all + * fences to be signaled. + * \param fences an array of fences to wait on. + * \param num_fences the number of fences in the fences array. + * \returns true on success, false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBufferAndAcquireFence * \sa SDL_WaitForGPUIdle */ -extern SDL_DECLSPEC void SDLCALL SDL_WaitForGPUFences( +extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUFences( SDL_GPUDevice *device, - SDL_bool waitAll, - SDL_GPUFence **pFences, - Uint32 fenceCount); + bool wait_all, + SDL_GPUFence *const *fences, + Uint32 num_fences); /** * Checks the status of a fence. * * \param device a GPU context. * \param fence a fence. - * \returns SDL_TRUE if the fence is signaled, SDL_FALSE if it is not. + * \returns true if the fence is signaled, false if it is not. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBufferAndAcquireFence */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_QueryGPUFence( +extern SDL_DECLSPEC bool SDLCALL SDL_QueryGPUFence( SDL_GPUDevice *device, SDL_GPUFence *fence); @@ -2522,7 +4007,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_QueryGPUFence( * \param device a GPU context. * \param fence a fence. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBufferAndAcquireFence */ @@ -2535,15 +4020,15 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUFence( /** * Obtains the texel block size for a texture format. * - * \param textureFormat the texture format you want to know the texel size of. + * \param format the texture format you want to know the texel size of. * \returns the texel block size of the texture format. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUTexture */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GPUTextureFormatTexelBlockSize( - SDL_GPUTextureFormat textureFormat); + SDL_GPUTextureFormat format); /** * Determines whether a texture format is supported for a given type and @@ -2555,9 +4040,9 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GPUTextureFormatTexelBlockSize( * \param usage a bitmask of all usage scenarios to check. * \returns whether the texture format is supported for this type and usage. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GPUTextureSupportsFormat( +extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsFormat( SDL_GPUDevice *device, SDL_GPUTextureFormat format, SDL_GPUTextureType type, @@ -2568,15 +4053,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GPUTextureSupportsFormat( * * \param device a GPU context. * \param format the texture format to check. - * \param sampleCount the sample count to check. + * \param sample_count the sample count to check. * \returns a hardware-specific version of min(preferred, possible). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GPUTextureSupportsSampleCount( +extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsSampleCount( SDL_GPUDevice *device, SDL_GPUTextureFormat format, - SDL_GPUSampleCount sampleCount); + SDL_GPUSampleCount sample_count); + +/** + * Calculate the size in bytes of a texture format with dimensions. + * + * \param format a texture format. + * \param width width in pixels. + * \param height height in pixels. + * \param depth_or_layer_count depth for 3D textures or layer count otherwise. + * \returns the size of a texture with this format and dimensions. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_CalculateGPUTextureFormatSize( + SDL_GPUTextureFormat format, + Uint32 width, + Uint32 height, + Uint32 depth_or_layer_count); #ifdef SDL_PLATFORM_GDK @@ -2589,7 +4091,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GPUTextureSupportsSampleCount( * * \param device a GPU context. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch */ @@ -2604,7 +4106,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendGPU(SDL_GPUDevice *device); * * \param device a GPU context. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_guid.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_guid.h index 285b237..e2f32ff 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_guid.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_guid.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -26,13 +26,14 @@ * * A GUID is a 128-bit value that represents something that is uniquely * identifiable by this value: "globally unique." + * + * SDL provides functions to convert a GUID to/from a string. */ #ifndef SDL_guid_h_ #define SDL_guid_h_ #include -#include #include /* Set up for C function definitions, even when using C++ */ @@ -55,7 +56,7 @@ extern "C" { * GUIDs may be platform-dependent (i.e., the same device may report different * GUIDs on different operating systems). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GUID { Uint8 data[16]; @@ -70,7 +71,7 @@ typedef struct SDL_GUID { * \param pszGUID buffer in which to write the ASCII string. * \param cbGUID the size of pszGUID, should be at least 33 bytes. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StringToGUID */ @@ -86,7 +87,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GUIDToString(SDL_GUID guid, char *pszGUID, * \param pchGUID string containing an ASCII representation of a GUID. * \returns a SDL_GUID structure. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GUIDToString */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_haptic.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_haptic.h index 95446fe..a45335b 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_haptic.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_haptic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -66,7 +66,7 @@ * Complete example: * * ```c - * SDL_bool test_haptic(SDL_Joystick *joystick) + * bool test_haptic(SDL_Joystick *joystick) * { * SDL_Haptic *haptic; * SDL_HapticEffect effect; @@ -74,12 +74,12 @@ * * // Open the device * haptic = SDL_OpenHapticFromJoystick(joystick); - * if (haptic == NULL) return SDL_FALSE; // Most likely joystick isn't haptic + * if (haptic == NULL) return false; // Most likely joystick isn't haptic * * // See if it can do sine waves * if ((SDL_GetHapticFeatures(haptic) & SDL_HAPTIC_SINE)==0) { * SDL_CloseHaptic(haptic); // No sine effect - * return SDL_FALSE; + * return false; * } * * // Create the effect @@ -106,7 +106,7 @@ * // Close the device * SDL_CloseHaptic(haptic); * - * return SDL_TRUE; // Success + * return true; // Success * } * ``` * @@ -139,15 +139,14 @@ extern "C" { */ /** - * \typedef SDL_Haptic + * The haptic structure used to identify an SDL haptic. * - * The haptic structure used to identify an SDL haptic. + * \since This struct is available since SDL 3.2.0. * - * \sa SDL_OpenHaptic - * \sa SDL_OpenHapticFromJoystick - * \sa SDL_CloseHaptic + * \sa SDL_OpenHaptic + * \sa SDL_OpenHapticFromJoystick + * \sa SDL_CloseHaptic */ -struct SDL_Haptic; typedef struct SDL_Haptic SDL_Haptic; @@ -168,7 +167,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Constant haptic effect. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -179,7 +178,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates sine waves. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -190,7 +189,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates square waves. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -201,7 +200,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates triangular waves. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -212,7 +211,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates saw tooth up waves. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -223,7 +222,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates saw tooth down waves. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -234,7 +233,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Ramp haptic effect. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticRamp */ @@ -246,7 +245,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates a spring. Effect is based on the * axes position. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -258,7 +257,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates dampening. Effect is based on the * axes velocity. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -270,7 +269,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates inertia. Effect is based on the axes * acceleration. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -282,7 +281,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates friction. Effect is based on the * axes movement. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -293,19 +292,31 @@ typedef struct SDL_Haptic SDL_Haptic; * * Haptic effect for direct control over high/low frequency motors. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticLeftRight */ #define SDL_HAPTIC_LEFTRIGHT (1u<<11) /** - * Reserved for future use + * Reserved for future use. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_HAPTIC_RESERVED1 (1u<<12) + +/** + * Reserved for future use. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_HAPTIC_RESERVED2 (1u<<13) + +/** + * Reserved for future use. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_HAPTIC_RESERVED3 (1u<<14) /** @@ -313,7 +324,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * User defined custom haptic effect. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_HAPTIC_CUSTOM (1u<<15) @@ -326,7 +337,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Device supports setting the global gain. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SetHapticGain */ @@ -337,7 +348,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Device supports setting autocenter. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SetHapticAutocenter */ @@ -348,7 +359,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Device supports querying effect status. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_GetHapticEffectStatus */ @@ -359,7 +370,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Devices supports being paused. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PauseHaptic * \sa SDL_ResumeHaptic @@ -375,7 +386,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Uses polar coordinates for the direction. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -384,7 +395,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Uses cartesian coordinates for the direction. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -393,7 +404,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Uses spherical coordinates for the direction. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -405,7 +416,7 @@ typedef struct SDL_Haptic SDL_Haptic; * This provides better compatibility across platforms and devices as SDL will * guess the correct axis. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -422,7 +433,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Used to play a device an infinite number of times. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_RunHapticEffect */ @@ -523,7 +534,7 @@ typedef struct SDL_Haptic SDL_Haptic; * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters. * ``` * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_POLAR * \sa SDL_HAPTIC_CARTESIAN @@ -547,7 +558,7 @@ typedef struct SDL_HapticDirection * A constant effect applies a constant force in the specified direction to * the joystick. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_CONSTANT * \sa SDL_HapticEffect @@ -629,7 +640,7 @@ typedef struct SDL_HapticConstant * \| \| \| \| \| \| \| * ``` * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_SINE * \sa SDL_HAPTIC_SQUARE @@ -685,7 +696,7 @@ typedef struct SDL_HapticPeriodic * SDL_HapticDirection diagram for which side is positive and which is * negative. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HapticDirection * \sa SDL_HAPTIC_SPRING @@ -699,7 +710,7 @@ 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. */ + SDL_HapticDirection direction; /**< Direction of the effect. */ /* Replay */ Uint32 length; /**< Duration of the effect. */ @@ -728,7 +739,7 @@ typedef struct SDL_HapticCondition * effects get added to the ramp effect making the effect become quadratic * instead of linear. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_RAMP * \sa SDL_HapticEffect @@ -767,7 +778,7 @@ typedef struct SDL_HapticRamp * motors, commonly found in modern game controllers. The small (right) motor * is high frequency, and the large (left) motor is low frequency. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_LEFTRIGHT * \sa SDL_HapticEffect @@ -797,7 +808,7 @@ typedef struct SDL_HapticLeftRight * If channels is one, the effect is rotated using the defined direction. * Otherwise it uses the samples in data for the different axes. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_CUSTOM * \sa SDL_HapticEffect @@ -892,7 +903,7 @@ typedef struct SDL_HapticCustom * Note either the attack_level or the fade_level may be above the actual * effect level. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HapticConstant * \sa SDL_HapticPeriodic @@ -921,7 +932,7 @@ typedef union SDL_HapticEffect * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_HapticID; @@ -937,7 +948,7 @@ typedef Uint32 SDL_HapticID; * failure; call SDL_GetError() for more information. This should be * freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHaptic */ @@ -953,7 +964,7 @@ extern SDL_DECLSPEC SDL_HapticID * SDLCALL SDL_GetHaptics(int *count); * this function returns NULL; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticName * \sa SDL_OpenHaptic @@ -974,7 +985,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetHapticNameForID(SDL_HapticID ins * \returns the device identifier or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseHaptic * \sa SDL_GetHaptics @@ -993,7 +1004,7 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHaptic(SDL_HapticID instance_id * \returns an SDL_Haptic on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_GetHapticFromID(SDL_HapticID instance_id); @@ -1004,7 +1015,7 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_GetHapticFromID(SDL_HapticID instan * \returns the instance ID of the specified haptic device on success or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_HapticID SDLCALL SDL_GetHapticID(SDL_Haptic *haptic); @@ -1016,7 +1027,7 @@ extern SDL_DECLSPEC SDL_HapticID SDLCALL SDL_GetHapticID(SDL_Haptic *haptic); * this function returns NULL; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticNameForID */ @@ -1025,13 +1036,13 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetHapticName(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. + * \returns true if the mouse is haptic or false if it isn't. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHapticFromMouse */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsMouseHaptic(void); +extern SDL_DECLSPEC bool SDLCALL SDL_IsMouseHaptic(void); /** * Try to open a haptic device from the current mouse. @@ -1039,7 +1050,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsMouseHaptic(void); * \returns the haptic device identifier or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseHaptic * \sa SDL_IsMouseHaptic @@ -1050,13 +1061,13 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHapticFromMouse(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 or SDL_FALSE if it isn't. + * \returns true if the joystick is haptic or false if it isn't. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHapticFromJoystick */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsJoystickHaptic(SDL_Joystick *joystick); +extern SDL_DECLSPEC bool SDLCALL SDL_IsJoystickHaptic(SDL_Joystick *joystick); /** * Open a haptic device for use from a joystick device. @@ -1073,7 +1084,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsJoystickHaptic(SDL_Joystick *joystick * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseHaptic * \sa SDL_IsJoystickHaptic @@ -1085,7 +1096,7 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHapticFromJoystick(SDL_Joystick * * \param haptic the SDL_Haptic device to close. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHaptic */ @@ -1102,7 +1113,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseHaptic(SDL_Haptic *haptic); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMaxHapticEffectsPlaying * \sa SDL_GetHapticFeatures @@ -1118,7 +1129,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetMaxHapticEffects(SDL_Haptic *haptic); * \returns the number of effects the haptic device can play at the same time * or -1 on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMaxHapticEffects * \sa SDL_GetHapticFeatures @@ -1132,7 +1143,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetMaxHapticEffectsPlaying(SDL_Haptic *hapti * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HapticEffectSupported * \sa SDL_GetMaxHapticEffects @@ -1149,7 +1160,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetHapticFeatures(SDL_Haptic *haptic); * \returns the number of axes on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetNumHapticAxes(SDL_Haptic *haptic); @@ -1158,14 +1169,14 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumHapticAxes(SDL_Haptic *haptic); * * \param haptic the SDL_Haptic device to query. * \param effect the desired effect to query. - * \returns SDL_TRUE if the effect is supported or SDL_FALSE if it isn't. + * \returns true if the effect is supported or false if it isn't. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateHapticEffect * \sa SDL_GetHapticFeatures */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HapticEffectSupported(SDL_Haptic *haptic, const SDL_HapticEffect *effect); +extern SDL_DECLSPEC bool SDLCALL SDL_HapticEffectSupported(SDL_Haptic *haptic, const SDL_HapticEffect *effect); /** * Create a new haptic effect on a specified device. @@ -1176,7 +1187,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HapticEffectSupported(SDL_Haptic *hapti * \returns the ID of the effect on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyHapticEffect * \sa SDL_RunHapticEffect @@ -1196,15 +1207,15 @@ extern SDL_DECLSPEC int SDLCALL SDL_CreateHapticEffect(SDL_Haptic *haptic, const * \param effect the identifier of the effect to update. * \param data an SDL_HapticEffect structure containing the new effect * properties to use. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateHapticEffect * \sa SDL_RunHapticEffect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, int effect, const SDL_HapticEffect *data); +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, int effect, const SDL_HapticEffect *data); /** * Run the haptic effect on its associated haptic device. @@ -1219,31 +1230,31 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticEffectStatus * \sa SDL_StopHapticEffect * \sa SDL_StopHapticEffects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RunHapticEffect(SDL_Haptic *haptic, int effect, Uint32 iterations); +extern SDL_DECLSPEC bool SDLCALL SDL_RunHapticEffect(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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RunHapticEffect * \sa SDL_StopHapticEffects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, int effect); +extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, int effect); /** * Destroy a haptic effect on the device. @@ -1254,7 +1265,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, in * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateHapticEffect */ @@ -1267,14 +1278,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyHapticEffect(SDL_Haptic *haptic, int * * \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 SDL_TRUE if it is playing, SDL_FALSE if it isn't playing or haptic - * status isn't supported. + * \returns true if it is playing, false if it isn't playing or haptic status + * isn't supported. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticFeatures */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetHapticEffectStatus(SDL_Haptic *haptic, int effect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetHapticEffectStatus(SDL_Haptic *haptic, int effect); /** * Set the global gain of the specified haptic device. @@ -1289,14 +1300,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetHapticEffectStatus(SDL_Haptic *hapti * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticFeatures */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHapticGain(SDL_Haptic *haptic, int gain); +extern SDL_DECLSPEC bool SDLCALL SDL_SetHapticGain(SDL_Haptic *haptic, int gain); /** * Set the global autocenter of the device. @@ -1308,14 +1319,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHapticGain(SDL_Haptic *haptic, int g * * \param haptic the SDL_Haptic device to set autocentering on. * \param autocenter value to set autocenter to (0-100). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticFeatures */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHapticAutocenter(SDL_Haptic *haptic, int autocenter); +extern SDL_DECLSPEC bool SDLCALL SDL_SetHapticAutocenter(SDL_Haptic *haptic, int autocenter); /** * Pause a haptic device. @@ -1327,14 +1338,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHapticAutocenter(SDL_Haptic *haptic, * can cause all sorts of weird errors. * * \param haptic the SDL_Haptic device to pause. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResumeHaptic */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseHaptic(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool SDLCALL SDL_PauseHaptic(SDL_Haptic *haptic); /** * Resume a haptic device. @@ -1342,55 +1353,55 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseHaptic(SDL_Haptic *haptic); * Call to unpause after SDL_PauseHaptic(). * * \param haptic the SDL_Haptic device to unpause. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PauseHaptic */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResumeHaptic(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool SDLCALL SDL_ResumeHaptic(SDL_Haptic *haptic); /** * Stop all the currently playing effects on a haptic device. * * \param haptic the SDL_Haptic device to stop. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RunHapticEffect * \sa SDL_StopHapticEffects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StopHapticEffects(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticEffects(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 the effect is supported or SDL_FALSE if it isn't. + * \returns true if the effect is supported or false if it isn't. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_InitHapticRumble */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HapticRumbleSupported(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PlayHapticRumble * \sa SDL_StopHapticRumble * \sa SDL_HapticRumbleSupported */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_InitHapticRumble(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool SDLCALL SDL_InitHapticRumble(SDL_Haptic *haptic); /** * Run a simple rumble effect on a haptic device. @@ -1398,28 +1409,28 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_InitHapticRumble(SDL_Haptic *haptic); * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_InitHapticRumble * \sa SDL_StopHapticRumble */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PlayHapticRumble(SDL_Haptic *haptic, float strength, Uint32 length); +extern SDL_DECLSPEC bool SDLCALL SDL_PlayHapticRumble(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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PlayHapticRumble */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StopHapticRumble(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticRumble(SDL_Haptic *haptic); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hidapi.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hidapi.h index 66bea9d..131b037 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hidapi.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hidapi.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -65,14 +65,14 @@ extern "C" { /** * An opaque handle representing an open HID device. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_hid_device SDL_hid_device; /** * HID underlying bus types. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_hid_bus_type { /** Unknown bus type */ @@ -107,7 +107,7 @@ typedef enum SDL_hid_bus_type { /** * Information about a connected HID device * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_hid_device_info { @@ -169,7 +169,7 @@ typedef struct SDL_hid_device_info * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_exit */ @@ -184,7 +184,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_init(void); * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_init */ @@ -205,7 +205,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_exit(void); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_enumerate */ @@ -233,7 +233,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_hid_device_change_count(void); * in the case of failure. Free this linked list by calling * SDL_hid_free_enumeration(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_device_change_count */ @@ -247,7 +247,7 @@ extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_enumerate(unsigned sho * \param devs pointer to a list of struct_device returned from * SDL_hid_enumerate(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *devs); @@ -265,7 +265,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *d * \returns a pointer to a SDL_hid_device object on success or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); @@ -279,7 +279,7 @@ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_ * \returns a pointer to a SDL_hid_device object on success or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path); @@ -306,7 +306,7 @@ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path) * \returns the actual number of bytes written and -1 on on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigned char *data, size_t length); @@ -327,7 +327,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigne * SDL_GetError() for more information. If no packet was available to * be read within the timeout period, this function returns 0. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsigned char *data, size_t length, int milliseconds); @@ -348,7 +348,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsign * be read and the handle is in non-blocking mode, this function * returns 0. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char *data, size_t length); @@ -367,7 +367,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int nonblock); @@ -392,7 +392,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int * \returns the actual number of bytes written and -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, const unsigned char *data, size_t length); @@ -415,7 +415,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, * still in the first byte), or -1 on on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, unsigned char *data, size_t length); @@ -438,7 +438,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, * still in the first byte), or -1 on on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_input_report(SDL_hid_device *dev, unsigned char *data, size_t length); @@ -449,7 +449,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_input_report(SDL_hid_device *dev, un * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_close(SDL_hid_device *dev); @@ -462,7 +462,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_close(SDL_hid_device *dev); * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); @@ -475,7 +475,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device * * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); @@ -488,7 +488,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); @@ -502,7 +502,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, int string_index, wchar_t *string, size_t maxlen); @@ -514,7 +514,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, * on failure; call SDL_GetError() for more information. This struct * is valid until the device is closed with SDL_hid_close(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_get_device_info(SDL_hid_device *dev); @@ -530,18 +530,18 @@ extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_get_device_info(SDL_hi * \returns the number of bytes actually copied or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_report_descriptor(SDL_hid_device *dev, unsigned char *buf, size_t buf_size); /** * 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. + * \param active true to start the scan, false to stop the scan. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC void SDLCALL SDL_hid_ble_scan(SDL_bool active); +extern SDL_DECLSPEC void SDLCALL SDL_hid_ble_scan(bool active); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hints.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hints.h index 8433240..8f2d074 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hints.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hints.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,8 +22,6 @@ /** * # CategoryHints * - * Official documentation for SDL configuration variables - * * This file contains functions to set and get configuration hints, as well as * listing each of them alphabetically. * @@ -63,7 +61,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED "SDL_ALLOW_ALT_TAB_WHILE_GRABBED" @@ -83,7 +81,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY "SDL_ANDROID_ALLOW_RECREATE_ACTIVITY" @@ -98,10 +96,27 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ANDROID_BLOCK_ON_PAUSE "SDL_ANDROID_BLOCK_ON_PAUSE" +/** + * A variable to control whether low latency audio should be enabled. + * + * Some devices have poor quality output when this is enabled, but this is + * usually an improvement in audio latency. + * + * The variable can be set to the following values: + * + * - "0": Low latency audio is not enabled. + * - "1": Low latency audio is enabled. (default) + * + * This hint should be set before SDL audio is initialized. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_ANDROID_LOW_LATENCY_AUDIO "SDL_ANDROID_LOW_LATENCY_AUDIO" + /** * A variable to control whether we trap the Android back button to handle it * manually. @@ -121,7 +136,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ANDROID_TRAP_BACK_BUTTON "SDL_ANDROID_TRAP_BACK_BUTTON" @@ -137,7 +152,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APP_ID "SDL_APP_ID" @@ -155,7 +170,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APP_NAME "SDL_APP_NAME" @@ -178,7 +193,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS "SDL_APPLE_TV_CONTROLLER_UI_EVENTS" @@ -193,7 +208,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION "SDL_APPLE_TV_REMOTE_ALLOW_ROTATION" @@ -201,16 +216,58 @@ extern "C" { * Specify the default ALSA audio device name. * * This variable is a specific audio device to open when the "default" audio - * device is used. By default if 4 channel audio is requested, the - * "plug:surround40" device will be opened and if 6 channel audio is requested - * the "plug:surround51" device will be opened. + * device is used. + * + * This hint will be ignored when opening the default playback device if + * SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE is set, or when opening the + * default recording device if SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE is + * set. * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. + * + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE */ #define SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE "SDL_AUDIO_ALSA_DEFAULT_DEVICE" +/** + * Specify the default ALSA audio playback device name. + * + * This variable is a specific audio device to open for playback, when the + * "default" audio device is used. + * + * If this hint isn't set, SDL will check SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE + * before choosing a reasonable default. + * + * This hint should be set before an audio device is opened. + * + * \since This hint is available since SDL 3.2.0. + * + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE + */ +#define SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE "SDL_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE" + +/** + * Specify the default ALSA audio recording device name. + * + * This variable is a specific audio device to open for recording, when the + * "default" audio device is used. + * + * If this hint isn't set, SDL will check SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE + * before choosing a reasonable default. + * + * This hint should be set before an audio device is opened. + * + * \since This hint is available since SDL 3.2.0. + * + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE + */ +#define SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE "SDL_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE" + /** * A variable controlling the audio category on iOS and macOS. * @@ -225,7 +282,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_CATEGORY "SDL_AUDIO_CATEGORY" @@ -238,7 +295,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_CHANNELS "SDL_AUDIO_CHANNELS" @@ -261,7 +318,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_APP_ICON_NAME "SDL_AUDIO_DEVICE_APP_ICON_NAME" @@ -283,7 +340,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES "SDL_AUDIO_DEVICE_SAMPLE_FRAMES" @@ -310,7 +367,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_STREAM_NAME "SDL_AUDIO_DEVICE_STREAM_NAME" @@ -336,7 +393,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_STREAM_ROLE "SDL_AUDIO_DEVICE_STREAM_ROLE" @@ -347,7 +404,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DISK_INPUT_FILE "SDL_AUDIO_DISK_INPUT_FILE" @@ -358,7 +415,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DISK_OUTPUT_FILE "SDL_AUDIO_DISK_OUTPUT_FILE" @@ -371,7 +428,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DISK_TIMESCALE "SDL_AUDIO_DISK_TIMESCALE" @@ -385,7 +442,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DRIVER "SDL_AUDIO_DRIVER" @@ -398,7 +455,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DUMMY_TIMESCALE "SDL_AUDIO_DUMMY_TIMESCALE" @@ -409,18 +466,23 @@ extern "C" { * device, this hint can be used to specify a default format that will be * used. * - * The variable can be set to the following values: - "U8": Unsigned 8-bit - * audio - "S8": Signed 8-bit audio - "S16LE": Signed 16-bit little-endian - * audio - "S16BE": Signed 16-bit big-endian audio - "S16": Signed 16-bit - * native-endian audio (default) - "S32LE": Signed 32-bit little-endian audio - * - "S32BE": Signed 32-bit big-endian audio - "S32": Signed 32-bit - * native-endian audio - "F32LE": Floating point little-endian audio - - * "F32BE": Floating point big-endian audio - "F32": Floating point - * native-endian audio + * The variable can be set to the following values: + * + * - "U8": Unsigned 8-bit audio + * - "S8": Signed 8-bit audio + * - "S16LE": Signed 16-bit little-endian audio + * - "S16BE": Signed 16-bit big-endian audio + * - "S16": Signed 16-bit native-endian audio (default) + * - "S32LE": Signed 32-bit little-endian audio + * - "S32BE": Signed 32-bit big-endian audio + * - "S32": Signed 32-bit native-endian audio + * - "F32LE": Floating point little-endian audio + * - "F32BE": Floating point big-endian audio + * - "F32": Floating point native-endian audio * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_FORMAT "SDL_AUDIO_FORMAT" @@ -433,7 +495,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_FREQUENCY "SDL_AUDIO_FREQUENCY" @@ -456,7 +518,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_INCLUDE_MONITORS "SDL_AUDIO_INCLUDE_MONITORS" @@ -471,7 +533,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUTO_UPDATE_JOYSTICKS "SDL_AUTO_UPDATE_JOYSTICKS" @@ -486,7 +548,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUTO_UPDATE_SENSORS "SDL_AUTO_UPDATE_SENSORS" @@ -509,7 +571,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_BMP_SAVE_LEGACY_FORMAT "SDL_BMP_SAVE_LEGACY_FORMAT" @@ -525,7 +587,7 @@ extern "C" { * best camera backend on your behalf. This hint needs to be set before * SDL_Init() is called to be useful. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_CAMERA_DRIVER "SDL_CAMERA_DRIVER" @@ -558,7 +620,7 @@ extern "C" { * * The items can be prefixed by '+'/'-' to add/remove features. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_CPU_FEATURE_MASK "SDL_CPU_FEATURE_MASK" @@ -572,7 +634,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_DIRECTINPUT "SDL_JOYSTICK_DIRECTINPUT" @@ -601,7 +663,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_FILE_DIALOG_DRIVER "SDL_FILE_DIALOG_DRIVER" @@ -619,7 +681,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_DISPLAY_USABLE_BOUNDS "SDL_DISPLAY_USABLE_BOUNDS" @@ -640,7 +702,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EMSCRIPTEN_ASYNCIFY "SDL_EMSCRIPTEN_ASYNCIFY" @@ -653,7 +715,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EMSCRIPTEN_CANVAS_SELECTOR "SDL_EMSCRIPTEN_CANVAS_SELECTOR" @@ -668,12 +730,13 @@ extern "C" { * - "#document": the javascript document object * - "#screen": the javascript window.screen object * - "#canvas": the WebGL canvas element + * - "#none": Don't bind anything at all * - any other string without a leading # sign applies to the element on the * page with that ID. * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT" @@ -690,7 +753,7 @@ extern "C" { * * This hint must be set before SDL_StartTextInput() is called * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ENABLE_SCREEN_KEYBOARD "SDL_ENABLE_SCREEN_KEYBOARD" @@ -707,7 +770,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EVDEV_DEVICES "SDL_EVDEV_DEVICES" @@ -731,7 +794,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EVENT_LOGGING "SDL_EVENT_LOGGING" @@ -751,7 +814,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_FORCE_RAISEWINDOW "SDL_FORCE_RAISEWINDOW" @@ -772,7 +835,7 @@ extern "C" { * * This hint should be set before calling SDL_GetWindowSurface() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_FRAMEBUFFER_ACCELERATION "SDL_FRAMEBUFFER_ACCELERATION" @@ -787,7 +850,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLERCONFIG "SDL_GAMECONTROLLERCONFIG" @@ -803,7 +866,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLERCONFIG_FILE "SDL_GAMECONTROLLERCONFIG_FILE" @@ -827,7 +890,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLERTYPE "SDL_GAMECONTROLLERTYPE" @@ -845,7 +908,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES "SDL_GAMECONTROLLER_IGNORE_DEVICES" @@ -863,7 +926,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT "SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT" @@ -886,7 +949,7 @@ extern "C" { * * This hint should be set before a gamepad is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLER_SENSOR_FUSION "SDL_GAMECONTROLLER_SENSOR_FUSION" @@ -898,7 +961,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT "SDL_GDK_TEXTINPUT_DEFAULT_TEXT" @@ -910,7 +973,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_DESCRIPTION "SDL_GDK_TEXTINPUT_DESCRIPTION" @@ -925,7 +988,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_MAX_LENGTH "SDL_GDK_TEXTINPUT_MAX_LENGTH" @@ -941,7 +1004,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_SCOPE "SDL_GDK_TEXTINPUT_SCOPE" @@ -952,7 +1015,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_TITLE "SDL_GDK_TEXTINPUT_TITLE" @@ -970,7 +1033,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_LIBUSB "SDL_HIDAPI_LIBUSB" @@ -988,7 +1051,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_LIBUSB_WHITELIST "SDL_HIDAPI_LIBUSB_WHITELIST" @@ -1002,7 +1065,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_UDEV "SDL_HIDAPI_UDEV" @@ -1011,12 +1074,12 @@ extern "C" { * * By default, SDL will try all available GPU 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 "d3d11" if, say, your hardware supports - * D3D12 but want to try using D3D11 instead. + * force a specific target, such as "direct3d11" if, say, your hardware + * supports D3D12 but want to try using D3D11 instead. * - * This hint should be set before SDL_GPUSelectBackend() is called. + * This hint should be set before any GPU functions are called. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GPU_DRIVER "SDL_GPU_DRIVER" @@ -1035,7 +1098,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS "SDL_HIDAPI_ENUMERATE_ONLY_CONTROLLERS" @@ -1052,7 +1115,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_IGNORE_DEVICES "SDL_HIDAPI_IGNORE_DEVICES" @@ -1075,7 +1138,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_IME_IMPLEMENTED_UI "SDL_IME_IMPLEMENTED_UI" @@ -1094,7 +1157,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_IOS_HIDE_HOME_INDICATOR "SDL_IOS_HIDE_HOME_INDICATOR" @@ -1111,7 +1174,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS" @@ -1128,7 +1191,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES "SDL_JOYSTICK_ARCADESTICK_DEVICES" @@ -1149,7 +1212,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED" @@ -1167,7 +1230,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_BLACKLIST_DEVICES "SDL_JOYSTICK_BLACKLIST_DEVICES" @@ -1188,7 +1251,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED "SDL_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED" @@ -1198,10 +1261,35 @@ extern "C" { * * This variable is currently only used by the Linux joystick driver. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_DEVICE "SDL_JOYSTICK_DEVICE" +/** + * A variable controlling whether enhanced reports should be used for + * controllers when using the HIDAPI driver. + * + * Enhanced reports allow rumble and effects on Bluetooth PlayStation + * controllers and gyro on Nintendo Switch controllers, but break Windows + * DirectInput for other applications that don't use SDL. + * + * Once enhanced reports are enabled, they can't be disabled on PlayStation + * controllers without power cycling the controller. + * + * The variable can be set to the following values: + * + * - "0": enhanced reports are not enabled. + * - "1": enhanced reports are enabled. (default) + * - "auto": enhanced features are advertised to the application, but SDL + * doesn't change the controller report mode unless the application uses + * them. + * + * This hint can be enabled anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_JOYSTICK_ENHANCED_REPORTS "SDL_JOYSTICK_ENHANCED_REPORTS" + /** * A variable containing a list of flightstick style controllers. * @@ -1215,7 +1303,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES "SDL_JOYSTICK_FLIGHTSTICK_DEVICES" @@ -1236,7 +1324,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED" @@ -1246,12 +1334,14 @@ extern "C" { * * The variable can be set to the following values: * - * - "0": GameInput is not used. (default) + * - "0": GameInput is not used. * - "1": GameInput is used. * + * The default is "1" on GDK platforms, and "0" otherwise. + * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_GAMEINPUT "SDL_JOYSTICK_GAMEINPUT" @@ -1269,7 +1359,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_GAMECUBE_DEVICES "SDL_JOYSTICK_GAMECUBE_DEVICES" @@ -1290,7 +1380,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED "SDL_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED" @@ -1305,9 +1395,9 @@ extern "C" { * This variable is the default for all drivers, but can be overridden by the * hints for specific drivers below. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI "SDL_JOYSTICK_HIDAPI" @@ -1322,9 +1412,9 @@ extern "C" { * - "1": Left and right Joy-Con controllers will be combined into a single * controller. (default) * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS "SDL_JOYSTICK_HIDAPI_COMBINE_JOY_CONS" @@ -1339,9 +1429,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE "SDL_JOYSTICK_HIDAPI_GAMECUBE" @@ -1362,7 +1452,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE "SDL_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE" @@ -1377,9 +1467,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS "SDL_JOYSTICK_HIDAPI_JOY_CONS" @@ -1398,7 +1488,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED "SDL_JOYSTICK_HIDAPI_JOYCON_HOME_LED" @@ -1413,9 +1503,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_LUNA "SDL_JOYSTICK_HIDAPI_LUNA" @@ -1430,9 +1520,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC "SDL_JOYSTICK_HIDAPI_NINTENDO_CLASSIC" @@ -1452,9 +1542,9 @@ extern "C" { * SDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER. See * https://github.com/ViGEm/DsHidMini for an alternative driver on Windows. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS3 "SDL_JOYSTICK_HIDAPI_PS3" @@ -1469,9 +1559,9 @@ extern "C" { * * The default value is 0. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER "SDL_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER" @@ -1486,9 +1576,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS4 "SDL_JOYSTICK_HIDAPI_PS4" @@ -1503,36 +1593,10 @@ extern "C" { * This hint can be set anytime, but only takes effect when extended input * reports are enabled. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL "SDL_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL" -/** - * A variable controlling whether extended input reports should be used for - * PS4 controllers when using the HIDAPI driver. - * - * The variable can be set to the following values: - * - * - "0": extended reports are not enabled. (default) - * - "1": extended reports are enabled. - * - * 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. - * - * This hint can be enabled anytime. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE "SDL_JOYSTICK_HIDAPI_PS4_RUMBLE" - /** * A variable controlling whether the HIDAPI driver for PS5 controllers should * be used. @@ -1544,9 +1608,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS5 "SDL_JOYSTICK_HIDAPI_PS5" @@ -1559,35 +1623,10 @@ extern "C" { * - "0": player LEDs are not enabled. * - "1": player LEDs are enabled. (default) * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED "SDL_JOYSTICK_HIDAPI_PS5_PLAYER_LED" -/** - * A variable controlling whether extended input reports should be used for - * PS5 controllers when using the HIDAPI driver. - * - * The variable can be set to the following values: - * - * - "0": extended reports are not enabled. (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. - * - * This hint can be enabled anytime. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE "SDL_JOYSTICK_HIDAPI_PS5_RUMBLE" - /** * A variable controlling whether the HIDAPI driver for NVIDIA SHIELD * controllers should be used. @@ -1599,9 +1638,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SHIELD "SDL_JOYSTICK_HIDAPI_SHIELD" @@ -1616,7 +1655,7 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STADIA "SDL_JOYSTICK_HIDAPI_STADIA" @@ -1631,12 +1670,31 @@ extern "C" { * Bluetooth access and may prompt the user for permission on iOS and * Android. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STEAM "SDL_JOYSTICK_HIDAPI_STEAM" +/** + * A variable controlling whether the Steam button LED should be turned on + * when a Steam controller is opened. + * + * The variable can be set to the following values: + * + * - "0": Steam button LED is turned off. + * - "1": Steam button LED is turned on. + * + * By default the Steam 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 Steam button LED. + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_STEAM_HOME_LED "SDL_JOYSTICK_HIDAPI_STEAM_HOME_LED" + /** * A variable controlling whether the HIDAPI driver for the Steam Deck builtin * controller should be used. @@ -1648,12 +1706,23 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STEAMDECK "SDL_JOYSTICK_HIDAPI_STEAMDECK" +/** + * A variable controlling whether the HIDAPI driver for HORI licensed 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 + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_STEAM_HORI "SDL_JOYSTICK_HIDAPI_STEAM_HORI" + /** * A variable controlling whether the HIDAPI driver for Nintendo Switch * controllers should be used. @@ -1665,9 +1734,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH "SDL_JOYSTICK_HIDAPI_SWITCH" @@ -1686,7 +1755,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED "SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED" @@ -1701,7 +1770,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED "SDL_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED" @@ -1717,7 +1786,7 @@ extern "C" { * * This hint should be set before opening a Joy-Con controller. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS "SDL_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS" @@ -1730,12 +1799,12 @@ extern "C" { * - "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. + * This driver doesn't work with the dolphinbar, so the default is false for + * now. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_WII "SDL_JOYSTICK_HIDAPI_WII" @@ -1750,7 +1819,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED "SDL_JOYSTICK_HIDAPI_WII_PLAYER_LED" @@ -1766,9 +1835,9 @@ extern "C" { * The default is "0" on Windows, otherwise the value of * SDL_HINT_JOYSTICK_HIDAPI * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX "SDL_JOYSTICK_HIDAPI_XBOX" @@ -1783,9 +1852,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 "SDL_JOYSTICK_HIDAPI_XBOX_360" @@ -1800,7 +1869,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED "SDL_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED" @@ -1815,9 +1884,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS "SDL_JOYSTICK_HIDAPI_XBOX_360_WIRELESS" @@ -1832,9 +1901,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE "SDL_JOYSTICK_HIDAPI_XBOX_ONE" @@ -1853,7 +1922,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED "SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED" @@ -1868,7 +1937,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_IOKIT "SDL_JOYSTICK_IOKIT" @@ -1883,7 +1952,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_CLASSIC "SDL_JOYSTICK_LINUX_CLASSIC" @@ -1898,7 +1967,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_DEADZONES "SDL_JOYSTICK_LINUX_DEADZONES" @@ -1916,7 +1985,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS "SDL_JOYSTICK_LINUX_DIGITAL_HATS" @@ -1932,7 +2001,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES "SDL_JOYSTICK_LINUX_HAT_DEADZONES" @@ -1947,7 +2016,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_MFI "SDL_JOYSTICK_MFI" @@ -1962,7 +2031,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_RAWINPUT "SDL_JOYSTICK_RAWINPUT" @@ -1979,7 +2048,7 @@ extern "C" { * * This hint should be set before a gamepad is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT "SDL_JOYSTICK_RAWINPUT_CORRELATE_XINPUT" @@ -1994,7 +2063,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ROG_CHAKRAM "SDL_JOYSTICK_ROG_CHAKRAM" @@ -2004,12 +2073,12 @@ extern "C" { * * The variable can be set to the following values: * - * - "0": A separate thread is not used. (default) - * - "1": A separate thread is used for handling raw input messages. + * - "0": A separate thread is not used. + * - "1": A separate thread is used for handling raw input messages. (default) * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD" @@ -2026,7 +2095,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_THROTTLE_DEVICES "SDL_JOYSTICK_THROTTLE_DEVICES" @@ -2047,7 +2116,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_THROTTLE_DEVICES_EXCLUDED "SDL_JOYSTICK_THROTTLE_DEVICES_EXCLUDED" @@ -2062,7 +2131,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_WGI "SDL_JOYSTICK_WGI" @@ -2079,7 +2148,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_WHEEL_DEVICES "SDL_JOYSTICK_WHEEL_DEVICES" @@ -2100,7 +2169,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_WHEEL_DEVICES_EXCLUDED "SDL_JOYSTICK_WHEEL_DEVICES_EXCLUDED" @@ -2118,7 +2187,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ZERO_CENTERED_DEVICES "SDL_JOYSTICK_ZERO_CENTERED_DEVICES" @@ -2139,7 +2208,7 @@ extern "C" { * - "latin_letters": For keyboards using non-Latin letters, such as Russian * or Thai, the letter keys generate keycodes as though it had an en_US * layout. e.g. pressing the key associated with SDL_SCANCODE_A on a Russian - * keyboard would yield 'a' instead of 'ф'. + * keyboard would yield 'a' instead of a Cyrillic letter. * * The default value for this hint is "french_numbers,latin_letters" * @@ -2152,7 +2221,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_KEYCODE_OPTIONS "SDL_KEYCODE_OPTIONS" @@ -2166,7 +2235,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_KMSDRM_DEVICE_INDEX "SDL_KMSDRM_DEVICE_INDEX" @@ -2194,7 +2263,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER "SDL_KMSDRM_REQUIRE_DRM_MASTER" @@ -2220,7 +2289,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_LOGGING "SDL_LOGGING" @@ -2234,9 +2303,9 @@ extern "C" { * (default) * - "1": The application may remain in the background when launched. * - * This hint should be set before applicationDidFinishLaunching() is called. + * This hint needs to be set before SDL_Init(). * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAC_BACKGROUND_APP "SDL_MAC_BACKGROUND_APP" @@ -2252,7 +2321,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK" @@ -2275,25 +2344,73 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH "SDL_MAC_OPENGL_ASYNC_DISPATCH" +/** + * A variable controlling whether the Option (⌥) key on macOS should be + * remapped to act as the Alt key. + * + * The variable can be set to the following values: + * + * - "none": The Option key is not remapped to Alt. (default) + * - "only_left": Only the left Option key is remapped to Alt. + * - "only_right": Only the right Option key is remapped to Alt. + * - "both": Both Option keys are remapped to Alt. + * + * This will prevent the triggering of key compositions that rely on the + * Option key, but will still send the Alt modifier for keyboard events. In + * the case that both Alt and Option are pressed, the Option key will be + * ignored. This is particularly useful for applications like terminal + * emulators and graphical user interfaces (GUIs) that rely on Alt key + * functionality for shortcuts or navigation. This does not apply to + * SDL_GetKeyFromScancode and only has an effect if IME is enabled. + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_MAC_OPTION_AS_ALT "SDL_MAC_OPTION_AS_ALT" + +/** + * A variable controlling whether SDL_EVENT_MOUSE_WHEEL event values will have + * momentum on macOS. + * + * The variable can be set to the following values: + * + * - "0": The mouse wheel events will have no momentum. (default) + * - "1": The mouse wheel events will have momentum. + * + * This hint needs to be set before SDL_Init(). + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_MAC_SCROLL_MOMENTUM "SDL_MAC_SCROLL_MOMENTUM" + /** * Request SDL_AppIterate() be called at a specific rate. * - * This number is in Hz, so "60" means try to iterate 60 times per second. + * If this is set to a number, it represents Hz, so "60" means try to iterate + * 60 times per second. "0" means to iterate as fast as possible. Negative + * values are illegal, but reserved, in case they are useful in a future + * revision of SDL. + * + * There are other strings that have special meaning. If set to "waitevent", + * SDL_AppIterate will not be called until new event(s) have arrived (and been + * processed by SDL_AppEvent). This can be useful for apps that are completely + * idle except in response to input. * * On some platforms, or if you are using SDL_main instead of SDL_AppIterate, * this hint is ignored. When the hint can be used, it is allowed to be * changed at any time. * - * This defaults to 60, and specifying NULL for the hint's value will restore + * This defaults to 0, and specifying NULL for the hint's value will restore * the default. * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAIN_CALLBACK_RATE "SDL_MAIN_CALLBACK_RATE" @@ -2312,7 +2429,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_AUTO_CAPTURE "SDL_MOUSE_AUTO_CAPTURE" @@ -2321,7 +2438,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS "SDL_MOUSE_DOUBLE_CLICK_RADIUS" @@ -2330,10 +2447,22 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_DOUBLE_CLICK_TIME "SDL_MOUSE_DOUBLE_CLICK_TIME" +/** + * A variable setting which system cursor to use as the default cursor. + * + * This should be an integer corresponding to the SDL_SystemCursor enum. The + * default value is zero (SDL_SYSTEM_CURSOR_DEFAULT). + * + * This hint needs to be set before SDL_Init(). + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_MOUSE_DEFAULT_SYSTEM_CURSOR "SDL_MOUSE_DEFAULT_SYSTEM_CURSOR" + /** * A variable controlling whether warping a hidden mouse cursor will activate * relative mouse mode. @@ -2362,7 +2491,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_EMULATE_WARP_WITH_RELATIVE "SDL_MOUSE_EMULATE_WARP_WITH_RELATIVE" @@ -2376,7 +2505,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH "SDL_MOUSE_FOCUS_CLICKTHROUGH" @@ -2386,7 +2515,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_NORMAL_SPEED_SCALE "SDL_MOUSE_NORMAL_SPEED_SCALE" @@ -2407,32 +2536,17 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_MODE_CENTER "SDL_MOUSE_RELATIVE_MODE_CENTER" -/** - * A variable controlling whether relative mouse mode is implemented using - * mouse warping. - * - * The variable can be set to the following values: - * - * - "0": Relative mouse mode uses raw input. (default) - * - "1": Relative mouse mode uses mouse warping. - * - * This hint can be set anytime relative mode is not currently enabled. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_MOUSE_RELATIVE_MODE_WARP "SDL_MOUSE_RELATIVE_MODE_WARP" - /** * A variable setting the scale for mouse motion, in floating point, when the * mouse is in relative mode. * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE "SDL_MOUSE_RELATIVE_SPEED_SCALE" @@ -2446,12 +2560,12 @@ extern "C" { * - "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 + * If SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE is set, that will be applied after * system speed scale. * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE "SDL_MOUSE_RELATIVE_SYSTEM_SCALE" @@ -2470,7 +2584,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_WARP_MOTION "SDL_MOUSE_RELATIVE_WARP_MOTION" @@ -2478,9 +2592,10 @@ extern "C" { * A variable controlling whether the hardware cursor stays visible when * relative mode is active. * - * This variable can be set to the following values: "0" - The cursor will be - * hidden while relative mode is active (default) "1" - The cursor will remain - * visible while relative mode is active + * This variable can be set to the following values: + * + * - "0": The cursor will be hidden while relative mode is active (default) + * - "1": The cursor will remain visible while relative mode is active * * Note that for systems without raw hardware inputs, relative mode is * implemented using warping, so the hardware cursor will visibly warp between @@ -2488,27 +2603,10 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE "SDL_MOUSE_RELATIVE_CURSOR_VISIBLE" -/** - * Controls how often SDL issues cursor confinement commands to the operating - * system while relative mode is active, in case the desired confinement state - * became out-of-sync due to interference from other running programs. - * - * The variable can be integers representing miliseconds between each refresh. - * A value of zero means SDL will not automatically refresh the confinement. - * The default value varies depending on the operating system, this variable - * might not have any effects on inapplicable platforms such as those without - * a cursor. - * - * This hint can be set anytime. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_MOUSE_RELATIVE_CLIP_INTERVAL "SDL_MOUSE_RELATIVE_CLIP_INTERVAL" - /** * A variable controlling whether mouse events should generate synthetic touch * events. @@ -2522,7 +2620,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_TOUCH_EVENTS "SDL_MOUSE_TOUCH_EVENTS" @@ -2540,7 +2638,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MUTE_CONSOLE_KEYBOARD "SDL_MUTE_CONSOLE_KEYBOARD" @@ -2555,7 +2653,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_NO_SIGNAL_HANDLERS "SDL_NO_SIGNAL_HANDLERS" @@ -2563,12 +2661,25 @@ extern "C" { * Specify the OpenGL library to load. * * This hint should be set before creating an OpenGL window or creating an - * OpenGL context. + * OpenGL context. If this hint isn't set, SDL will choose a reasonable + * default. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_OPENGL_LIBRARY "SDL_OPENGL_LIBRARY" +/** + * Specify the EGL library to load. + * + * This hint should be set before creating an OpenGL window or creating an + * OpenGL context. This hint is only considered if SDL is using EGL to manage + * OpenGL contexts. If this hint isn't set, SDL will choose a reasonable + * default. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_EGL_LIBRARY "SDL_EGL_LIBRARY" + /** * A variable controlling what driver to use for OpenGL ES contexts. * @@ -2599,10 +2710,22 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_OPENGL_ES_DRIVER "SDL_OPENGL_ES_DRIVER" +/** + * Mechanism to specify openvr_api library location + * + * By default, when using the OpenVR driver, it will search for the API + * library in the current folder. But, if you wish to use a system API you can + * specify that by using this hint. This should be the full or relative path + * to a .dll on Windows or .so on Linux. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_OPENVR_LIBRARY "SDL_OPENVR_LIBRARY" + /** * A variable controlling which orientations are allowed on iOS/Android. * @@ -2618,7 +2741,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ORIENTATIONS "SDL_ORIENTATIONS" @@ -2638,7 +2761,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_POLL_SENTINEL "SDL_POLL_SENTINEL" @@ -2656,7 +2779,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_PREFERRED_LOCALES "SDL_PREFERRED_LOCALES" @@ -2673,9 +2796,13 @@ extern "C" { * - "1": SDL will send a quit event when the last window is requesting to * close. (default) * + * If there is at least one active system tray icon, SDL_EVENT_QUIT will + * instead be sent when both the last window will be closed and the last tray + * icon will be destroyed. + * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE "SDL_QUIT_ON_LAST_WINDOW_CLOSE" @@ -2690,7 +2817,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_DIRECT3D_THREADSAFE "SDL_RENDER_DIRECT3D_THREADSAFE" @@ -2706,7 +2833,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_RENDER_DIRECT3D11_DEBUG" @@ -2720,7 +2847,7 @@ extern "C" { * * By default, SDL does not use Vulkan Validation Layers. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_VULKAN_DEBUG "SDL_RENDER_VULKAN_DEBUG" @@ -2734,7 +2861,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_GPU_DEBUG "SDL_RENDER_GPU_DEBUG" @@ -2749,7 +2876,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_GPU_LOW_POWER "SDL_RENDER_GPU_LOW_POWER" @@ -2758,7 +2885,7 @@ extern "C" { * * 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. + * can't be initialized, creating a renderer will fail. * * This variable is case insensitive and can be set to the following values: * @@ -2770,14 +2897,19 @@ extern "C" { * - "opengles" * - "metal" * - "vulkan" + * - "gpu" * - "software" * + * This hint accepts a comma-separated list of driver names, and each will be + * tried in the order listed when creating a renderer until one succeeds or + * all of them fail. + * * The default varies by platform, but it's the first one in the list that is * available on the current platform. * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_DRIVER "SDL_RENDER_DRIVER" @@ -2795,7 +2927,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_LINE_METHOD "SDL_RENDER_LINE_METHOD" @@ -2810,7 +2942,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE "SDL_RENDER_METAL_PREFER_LOW_POWER_DEVICE" @@ -2827,7 +2959,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC" @@ -2844,7 +2976,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RETURN_KEY_HIDES_IME "SDL_RETURN_KEY_HIDES_IME" @@ -2861,7 +2993,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. * * \sa SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED */ @@ -2883,7 +3015,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED "SDL_ROG_GAMEPAD_MICE_EXCLUDED" @@ -2895,7 +3027,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RPI_VIDEO_LAYER "SDL_RPI_VIDEO_LAYER" @@ -2917,7 +3049,7 @@ extern "C" { * * This hint should be set before calling SDL_DisableScreenSaver() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME "SDL_SCREENSAVER_INHIBIT_ACTIVITY_NAME" @@ -2936,7 +3068,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_SHUTDOWN_DBUS_ON_QUIT "SDL_SHUTDOWN_DBUS_ON_QUIT" @@ -2950,7 +3082,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_STORAGE_TITLE_DRIVER "SDL_STORAGE_TITLE_DRIVER" @@ -2964,7 +3096,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_STORAGE_USER_DRIVER "SDL_STORAGE_USER_DRIVER" @@ -2991,32 +3123,32 @@ extern "C" { * - "1": Force SDL_THREAD_PRIORITY_TIME_CRITICAL to a realtime scheduling * policy * - * This hint should be set before calling SDL_SetThreadPriority() + * This hint should be set before calling SDL_SetCurrentThreadPriority() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL "SDL_THREAD_FORCE_REALTIME_TIME_CRITICAL" /** * A string specifying additional information to use with - * SDL_SetThreadPriority. + * SDL_SetCurrentThreadPriority. * - * 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. + * By default SDL_SetCurrentThreadPriority 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. * * 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(). + * through RLIMIT_RTTIME after calling SDL_SetCurrentThreadPriority(). * - * This hint should be set before calling SDL_SetThreadPriority() + * This hint should be set before calling SDL_SetCurrentThreadPriority() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_THREAD_PRIORITY_POLICY "SDL_THREAD_PRIORITY_POLICY" @@ -3036,7 +3168,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION" @@ -3051,7 +3183,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TOUCH_MOUSE_EVENTS "SDL_TOUCH_MOUSE_EVENTS" @@ -3072,7 +3204,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TRACKPAD_IS_TOUCH_ONLY "SDL_TRACKPAD_IS_TOUCH_ONLY" @@ -3087,7 +3219,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TV_REMOTE_AS_JOYSTICK "SDL_TV_REMOTE_AS_JOYSTICK" @@ -3101,10 +3233,35 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_ALLOW_SCREENSAVER "SDL_VIDEO_ALLOW_SCREENSAVER" +/** + * A comma separated list containing the names of the displays that SDL should + * sort to the front of the display list. + * + * When this hint is set, displays with matching name strings will be + * prioritized in the list of displays, as exposed by calling + * SDL_GetDisplays(), with the first listed becoming the primary display. The + * naming convention can vary depending on the environment, but it is usually + * a connector name (e.g. 'DP-1', 'DP-2', 'HDMI-A-1',etc...). + * + * On Wayland and X11 desktops, the connector names associated with displays + * can typically be found by using the `xrandr` utility. + * + * This hint is currently supported on the following drivers: + * + * - KMSDRM (kmsdrm) + * - Wayland (wayland) + * - X11 (x11) + * + * This hint should be set before SDL is initialized. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_VIDEO_DISPLAY_PRIORITY "SDL_VIDEO_DISPLAY_PRIORITY" + /** * Tell the video driver that we only want a double buffer. * @@ -3124,7 +3281,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_DOUBLE_BUFFER "SDL_VIDEO_DOUBLE_BUFFER" @@ -3136,9 +3293,13 @@ extern "C" { * force a specific target, such as "x11" if, say, you are on Wayland but want * to try talking to the X server instead. * + * This hint accepts a comma-separated list of driver names, and each will be + * tried in the order listed during init, until one succeeds or all of them + * fail. + * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_DRIVER "SDL_VIDEO_DRIVER" @@ -3151,7 +3312,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_DUMMY_SAVE_FRAMES "SDL_VIDEO_DUMMY_SAVE_FRAMES" @@ -3165,7 +3326,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK "SDL_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK" @@ -3181,7 +3342,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_FORCE_EGL "SDL_VIDEO_FORCE_EGL" @@ -3199,10 +3360,31 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES "SDL_VIDEO_MAC_FULLSCREEN_SPACES" +/** + * A variable that specifies the menu visibility when a window is fullscreen + * in Spaces on macOS. + * + * The variable can be set to the following values: + * + * - "0": The menu will be hidden when the window is in a fullscreen space, + * and not accessible by moving the mouse to the top of the screen. + * - "1": The menu will be accessible when the window is in a fullscreen + * space. + * - "auto": The menu will be hidden if fullscreen mode was toggled on + * programmatically via `SDL_SetWindowFullscreen()`, and accessible if + * fullscreen was entered via the "fullscreen" button on the window title + * bar. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY "SDL_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY" + /** * A variable controlling whether fullscreen windows are minimized when they * lose focus. @@ -3215,7 +3397,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS" @@ -3232,7 +3414,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_OFFSCREEN_SAVE_FRAMES "SDL_VIDEO_OFFSCREEN_SAVE_FRAMES" @@ -3258,7 +3440,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS "SDL_VIDEO_SYNC_WINDOW_OPERATIONS" @@ -3276,7 +3458,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR "SDL_VIDEO_WAYLAND_ALLOW_LIBDECOR" @@ -3296,7 +3478,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_MODE_EMULATION "SDL_VIDEO_WAYLAND_MODE_EMULATION" @@ -3318,7 +3500,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_MODE_SCALING "SDL_VIDEO_WAYLAND_MODE_SCALING" @@ -3338,7 +3520,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR "SDL_VIDEO_WAYLAND_PREFER_LIBDECOR" @@ -3357,6 +3539,8 @@ extern "C" { * * - Rounding errors can result with odd window sizes and/or desktop scales, * which can cause the window contents to appear slightly blurry. + * - Positioning the window may be imprecise due to unit conversions and + * rounding. * - The window may be unusably small on scaled desktops. * - The window may jump in size when moving between displays of different * scale factors. @@ -3375,7 +3559,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_SCALE_TO_DISPLAY "SDL_VIDEO_WAYLAND_SCALE_TO_DISPLAY" @@ -3397,7 +3581,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WIN_D3DCOMPILER "SDL_VIDEO_WIN_D3DCOMPILER" @@ -3412,7 +3596,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR "SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR" @@ -3431,7 +3615,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_NET_WM_PING "SDL_VIDEO_X11_NET_WM_PING" @@ -3445,7 +3629,7 @@ extern "C" { * * This hint should be set before initializing the video subsystem. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_NODIRECTCOLOR "SDL_VIDEO_X11_NODIRECTCOLOR" @@ -3456,7 +3640,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_SCALING_FACTOR "SDL_VIDEO_X11_SCALING_FACTOR" @@ -3465,7 +3649,7 @@ extern "C" { * * This hint should be set before initializing the video subsystem. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_VISUALID "SDL_VIDEO_X11_VISUALID" @@ -3474,7 +3658,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_WINDOW_VISUALID "SDL_VIDEO_X11_WINDOW_VISUALID" @@ -3488,7 +3672,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR" @@ -3503,7 +3687,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_ENABLE_BACK_TOUCH "SDL_VITA_ENABLE_BACK_TOUCH" @@ -3518,7 +3702,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_ENABLE_FRONT_TOUCH "SDL_VITA_ENABLE_FRONT_TOUCH" @@ -3529,7 +3713,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_MODULE_PATH "SDL_VITA_MODULE_PATH" @@ -3542,7 +3726,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_PVR_INIT "SDL_VITA_PVR_INIT" @@ -3557,7 +3741,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_RESOLUTION "SDL_VITA_RESOLUTION" @@ -3572,7 +3756,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_PVR_OPENGL "SDL_VITA_PVR_OPENGL" @@ -3588,7 +3772,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_TOUCH_MOUSE_DEVICE "SDL_VITA_TOUCH_MOUSE_DEVICE" @@ -3599,7 +3783,7 @@ extern "C" { * * This hint should be set before calling SDL_Vulkan_CreateSurface() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VULKAN_DISPLAY "SDL_VULKAN_DISPLAY" @@ -3609,7 +3793,7 @@ extern "C" { * This hint should be set before creating a Vulkan window or calling * SDL_Vulkan_LoadLibrary(). * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VULKAN_LIBRARY "SDL_VULKAN_LIBRARY" @@ -3641,7 +3825,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_FACT_CHUNK "SDL_WAVE_FACT_CHUNK" @@ -3653,7 +3837,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_CHUNK_LIMIT "SDL_WAVE_CHUNK_LIMIT" @@ -3681,7 +3865,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_RIFF_CHUNK_SIZE "SDL_WAVE_RIFF_CHUNK_SIZE" @@ -3701,7 +3885,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_TRUNCATION "SDL_WAVE_TRUNCATION" @@ -3718,7 +3902,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED "SDL_WINDOW_ACTIVATE_WHEN_RAISED" @@ -3735,7 +3919,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN "SDL_WINDOW_ACTIVATE_WHEN_SHOWN" @@ -3753,7 +3937,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_ALLOW_TOPMOST "SDL_WINDOW_ALLOW_TOPMOST" @@ -3769,7 +3953,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN" @@ -3785,7 +3969,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_CLOSE_ON_ALT_F4 "SDL_WINDOWS_CLOSE_ON_ALT_F4" @@ -3814,7 +3998,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS "SDL_WINDOWS_ENABLE_MENU_MNEMONICS" @@ -3829,7 +4013,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP "SDL_WINDOWS_ENABLE_MESSAGELOOP" @@ -3845,7 +4029,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_GAMEINPUT "SDL_WINDOWS_GAMEINPUT" @@ -3859,7 +4043,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_RAW_KEYBOARD "SDL_WINDOWS_RAW_KEYBOARD" @@ -3880,7 +4064,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL "SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL" @@ -3890,9 +4074,18 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_INTRESOURCE_ICON "SDL_WINDOWS_INTRESOURCE_ICON" + +/** + * A variable to specify custom icon resource id from RC file on Windows + * platform. + * + * This hint should be set before SDL is initialized. + * + * \since This hint is available since SDL 3.2.0. + */ #define SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL "SDL_WINDOWS_INTRESOURCE_ICON_SMALL" /** @@ -3917,7 +4110,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_USE_D3D9EX "SDL_WINDOWS_USE_D3D9EX" @@ -3934,123 +4127,10 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_ERASE_BACKGROUND_MODE "SDL_WINDOWS_ERASE_BACKGROUND_MODE" -/** - * A variable controlling whether 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_EVENT_KEY_DOWN - * and SDL_EVENT_KEY_UP), 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_EVENT_KEY_DOWN events that have a scancode of SDL_SCANCODE_AC_BACK. - * (Alternatively, SDL_EVENT_KEY_UP 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 - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_WINRT_HANDLE_BACK_BUTTON "SDL_WINRT_HANDLE_BACK_BUTTON" - -/** - * A variable specifying the 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". - * - * For additional information on linking to a privacy policy, see the - * documentation for SDL_HINT_WINRT_PRIVACY_POLICY_URL. - * - * This hint should be set before SDL is initialized. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_WINRT_PRIVACY_POLICY_LABEL "SDL_WINRT_PRIVACY_POLICY_LABEL" - -/** - * A variable specifying the 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 - * 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. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_WINRT_PRIVACY_POLICY_URL "SDL_WINRT_PRIVACY_POLICY_URL" - /** * A variable controlling whether X11 windows are marked as override-redirect. * @@ -4068,7 +4148,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_X11_FORCE_OVERRIDE_REDIRECT "SDL_X11_FORCE_OVERRIDE_REDIRECT" @@ -4085,18 +4165,18 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_X11_WINDOW_TYPE "SDL_X11_WINDOW_TYPE" /** * Specify the XCB library to load for the X11 driver. * - * This defaults to "libX11-xcb.so" + * The default is platform-specific, often "libX11-xcb.so.1". * * This hint should be set before initializing the video subsystem. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_X11_XCB_LIBRARY "SDL_X11_XCB_LIBRARY" @@ -4111,7 +4191,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED" @@ -4135,15 +4215,45 @@ extern "C" { * This hint should be set before an assertion failure is triggered and can be * changed at any time. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ASSERT "SDL_ASSERT" +/** + * A variable controlling whether pen events should generate synthetic mouse + * events. + * + * The variable can be set to the following values: + * + * - "0": Pen events will not generate mouse events. + * - "1": Pen events will generate mouse events. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_PEN_MOUSE_EVENTS "SDL_PEN_MOUSE_EVENTS" + +/** + * A variable controlling whether pen events should generate synthetic touch + * events. + * + * The variable can be set to the following values: + * + * - "0": Pen events will not generate touch events. + * - "1": Pen events will generate touch events. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_PEN_TOUCH_EVENTS "SDL_PEN_TOUCH_EVENTS" + /** * An enumeration of hint priorities. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_HintPriority { @@ -4162,18 +4272,18 @@ typedef enum SDL_HintPriority * \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 on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHint * \sa SDL_ResetHint * \sa SDL_SetHint */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name, const char *value, SDL_HintPriority priority); +extern SDL_DECLSPEC bool SDLCALL SDL_SetHintWithPriority(const char *name, const char *value, SDL_HintPriority priority); /** * Set a hint with normal priority. @@ -4184,18 +4294,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name, c * * \param name the hint to set. * \param value the value of the hint variable. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHint * \sa SDL_ResetHint * \sa SDL_SetHintWithPriority */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name, const char *value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetHint(const char *name, const char *value); /** * Reset a hint to the default value. @@ -4205,17 +4315,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name, const char *v * change. * * \param name the hint to set. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetHint * \sa SDL_ResetHints */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResetHint(const char *name); +extern SDL_DECLSPEC bool SDLCALL SDL_ResetHint(const char *name); /** * Reset all hints to the default values. @@ -4226,7 +4336,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResetHint(const char *name); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResetHint */ @@ -4245,7 +4355,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetHints(void); * callback instead is always thread-safe, as SDL holds a lock * on the thread subsystem during the callback. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetHint * \sa SDL_SetHintWithPriority @@ -4262,12 +4372,12 @@ extern SDL_DECLSPEC const char *SDLCALL SDL_GetHint(const char *name); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHint * \sa SDL_SetHint */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bool default_value); +extern SDL_DECLSPEC bool SDLCALL SDL_GetHintBoolean(const char *name, bool default_value); /** * A callback used to send notifications of hint value changes. @@ -4284,7 +4394,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bo * hint value. SDL holds a lock on the hint subsystem when * calling this callback. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_AddHintCallback */ @@ -4300,16 +4410,16 @@ typedef void(SDLCALL *SDL_HintCallback)(void *userdata, const char *name, const * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RemoveHintCallback */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddHintCallback(const char *name, SDL_HintCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_AddHintCallback(const char *name, SDL_HintCallback callback, void *userdata); /** * Remove a function watching a particular hint. @@ -4321,7 +4431,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddHintCallback(const char *name, SDL_H * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddHintCallback */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_init.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_init.h index 5a13947..adf0de8 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_init.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_init.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,10 +22,30 @@ /** * # CategoryInit * - * SDL subsystem init and quit functions. + * All SDL programs need to initialize the library before starting to work + * with it. + * + * Almost everything can simply call SDL_Init() near startup, with a handful + * of flags to specify subsystems to touch. These are here to make sure SDL + * does not even attempt to touch low-level pieces of the operating system + * that you don't intend to use. For example, you might be using SDL for video + * and input but chose an external library for audio, and in this case you + * would just need to leave off the `SDL_INIT_AUDIO` flag to make sure that + * external library has complete control. + * + * Most apps, when terminating, should call SDL_Quit(). This will clean up + * (nearly) everything that SDL might have allocated, and crucially, it'll + * make sure that the display's resolution is back to what the user expects if + * you had previously changed it for your game. + * + * SDL3 apps are strongly encouraged to call SDL_SetAppMetadata() at startup + * to fill in details about the program. This is completely optional, but it + * helps in small ways (we can provide an About dialog box for the macOS menu, + * we can name the app in the system's audio mixer, etc). Those that want to + * provide a _lot_ of information should look at the more-detailed + * SDL_SetAppMetadataProperty(). */ - #ifndef SDL_init_h_ #define SDL_init_h_ @@ -47,7 +67,7 @@ extern "C" { * These are the flags which may be passed to SDL_Init(). You should specify * the subsystems which you will be using in your application. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_Quit @@ -57,9 +77,8 @@ extern "C" { */ typedef Uint32 SDL_InitFlags; -#define SDL_INIT_TIMER 0x00000001u #define SDL_INIT_AUDIO 0x00000010u /**< `SDL_INIT_AUDIO` implies `SDL_INIT_EVENTS` */ -#define SDL_INIT_VIDEO 0x00000020u /**< `SDL_INIT_VIDEO` implies `SDL_INIT_EVENTS` */ +#define SDL_INIT_VIDEO 0x00000020u /**< `SDL_INIT_VIDEO` implies `SDL_INIT_EVENTS`, should be initialized on the main thread */ #define SDL_INIT_JOYSTICK 0x00000200u /**< `SDL_INIT_JOYSTICK` implies `SDL_INIT_EVENTS`, should be initialized on the same thread as SDL_INIT_VIDEO on Windows if you don't set SDL_HINT_JOYSTICK_THREAD */ #define SDL_INIT_HAPTIC 0x00001000u #define SDL_INIT_GAMEPAD 0x00002000u /**< `SDL_INIT_GAMEPAD` implies `SDL_INIT_JOYSTICK` */ @@ -85,7 +104,7 @@ typedef Uint32 SDL_InitFlags; * [Main callbacks in SDL3](https://wiki.libsdl.org/SDL3/README/main-functions#main-callbacks-in-sdl3) * for complete details. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_AppResult { @@ -94,10 +113,70 @@ typedef enum SDL_AppResult SDL_APP_FAILURE /**< Value that requests termination with error from the main callbacks. */ } SDL_AppResult; +/** + * Function pointer typedef for SDL_AppInit. + * + * These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind + * the scenes for apps using the optional main callbacks. Apps that want to + * use this should just implement SDL_AppInit directly. + * + * \param appstate a place where the app can optionally store a pointer for + * future use. + * \param argc the standard ANSI C main's argc; number of elements in `argv`. + * \param argv the standard ANSI C main's argv; array of command line + * arguments. + * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to + * terminate with success, SDL_APP_CONTINUE to continue. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef SDL_AppResult (SDLCALL *SDL_AppInit_func)(void **appstate, int argc, char *argv[]); + +/** + * Function pointer typedef for SDL_AppIterate. + * + * These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind + * the scenes for apps using the optional main callbacks. Apps that want to + * use this should just implement SDL_AppIterate directly. + * + * \param appstate an optional pointer, provided by the app in SDL_AppInit. + * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to + * terminate with success, SDL_APP_CONTINUE to continue. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef SDL_AppResult (SDLCALL *SDL_AppIterate_func)(void *appstate); -typedef SDL_AppResult (SDLCALL *SDL_AppEvent_func)(void *appstate, const SDL_Event *event); -typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate); + +/** + * Function pointer typedef for SDL_AppEvent. + * + * These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind + * the scenes for apps using the optional main callbacks. Apps that want to + * use this should just implement SDL_AppEvent directly. + * + * \param appstate an optional pointer, provided by the app in SDL_AppInit. + * \param event the new event for the app to examine. + * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to + * terminate with success, SDL_APP_CONTINUE to continue. + * + * \since This datatype is available since SDL 3.2.0. + */ +typedef SDL_AppResult (SDLCALL *SDL_AppEvent_func)(void *appstate, SDL_Event *event); + +/** + * Function pointer typedef for SDL_AppQuit. + * + * These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind + * the scenes for apps using the optional main callbacks. Apps that want to + * use this should just implement SDL_AppEvent directly. + * + * \param appstate an optional pointer, provided by the app in SDL_AppInit. + * \param result the result code that terminated the app (success or failure). + * + * \since This datatype is available since SDL 3.2.0. + */ +typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate, SDL_AppResult result); + /** * Initialize the SDL library. @@ -117,11 +196,10 @@ typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate); * * `flags` may be any of the following OR'd together: * - * - `SDL_INIT_TIMER`: timer subsystem * - `SDL_INIT_AUDIO`: audio subsystem; automatically initializes the events * subsystem * - `SDL_INIT_VIDEO`: video subsystem; automatically initializes the events - * subsystem + * subsystem, should be initialized on the main thread. * - `SDL_INIT_JOYSTICK`: joystick subsystem; automatically initializes the * events subsystem * - `SDL_INIT_HAPTIC`: haptic (force feedback) subsystem @@ -143,10 +221,10 @@ typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate); * SDL_SetAppMetadataProperty(). * * \param flags subsystem initialization flags. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAppMetadata * \sa SDL_SetAppMetadataProperty @@ -155,7 +233,7 @@ typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate); * \sa SDL_SetMainReady * \sa SDL_WasInit */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Init(SDL_InitFlags flags); +extern SDL_DECLSPEC bool SDLCALL SDL_Init(SDL_InitFlags flags); /** * Compatibility function to initialize the SDL library. @@ -163,16 +241,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Init(SDL_InitFlags flags); * This function and SDL_Init() are interchangeable. * * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_Quit * \sa SDL_QuitSubSystem */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_InitSubSystem(SDL_InitFlags flags); +extern SDL_DECLSPEC bool SDLCALL SDL_InitSubSystem(SDL_InitFlags flags); /** * Shut down specific SDL subsystems. @@ -182,7 +260,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_InitSubSystem(SDL_InitFlags flags); * * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_InitSubSystem * \sa SDL_Quit @@ -196,7 +274,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_QuitSubSystem(SDL_InitFlags flags); * \returns a mask of all initialized subsystems if `flags` is 0, otherwise it * returns the initialization status of the specified subsystems. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_InitSubSystem @@ -214,13 +292,70 @@ extern SDL_DECLSPEC SDL_InitFlags SDLCALL SDL_WasInit(SDL_InitFlags flags); * 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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_QuitSubSystem */ extern SDL_DECLSPEC void SDLCALL SDL_Quit(void); +/** + * Return whether this is the main thread. + * + * On Apple platforms, the main thread is the thread that runs your program's + * main() entry point. On other platforms, the main thread is the one that + * calls SDL_Init(SDL_INIT_VIDEO), which should usually be the one that runs + * your program's main() entry point. If you are using the main callbacks, + * SDL_AppInit(), SDL_AppIterate(), and SDL_AppQuit() are all called on the + * main thread. + * + * \returns true if this thread is the main thread, or false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_RunOnMainThread + */ +extern SDL_DECLSPEC bool SDLCALL SDL_IsMainThread(void); + +/** + * Callback run on the main thread. + * + * \param userdata an app-controlled pointer that is passed to the callback. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_RunOnMainThread + */ +typedef void (SDLCALL *SDL_MainThreadCallback)(void *userdata); + +/** + * Call a function on the main thread during event processing. + * + * If this is called on the main thread, the callback is executed immediately. + * If this is called on another thread, this callback is queued for execution + * on the main thread during event processing. + * + * Be careful of deadlocks when using this functionality. You should not have + * the main thread wait for the current thread while this function is being + * called with `wait_complete` true. + * + * \param callback the callback to call on the main thread. + * \param userdata a pointer that is passed to `callback`. + * \param wait_complete true to wait for the callback to complete, false to + * return immediately. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_IsMainThread + */ +extern SDL_DECLSPEC bool SDLCALL SDL_RunOnMainThread(SDL_MainThreadCallback callback, void *userdata, bool wait_complete); + /** * Specify basic metadata about your app. * @@ -248,16 +383,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_Quit(void); * hash, or whatever makes sense). * \param appidentifier A unique string in reverse-domain format that * identifies this app ("com.example.mygame2"). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAppMetadataProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAppMetadata(const char *appname, const char *appversion, const char *appidentifier); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAppMetadata(const char *appname, const char *appversion, const char *appidentifier); /** * Specify metadata about your app through a set of properties. @@ -274,7 +409,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAppMetadata(const char *appname, con * Multiple calls to this function are allowed, but various state might not * change once it has been set up with a previous call to this function. * - * Once set, this metadata can be read using SDL_GetMetadataProperty(). + * Once set, this metadata can be read using SDL_GetAppMetadataProperty(). * * These are the supported properties: * @@ -310,17 +445,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAppMetadata(const char *appname, con * * \param name the name of the metadata property to set. * \param value the value of the property, or NULL to remove that property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAppMetadataProperty * \sa SDL_SetAppMetadata */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAppMetadataProperty(const char *name, const char *value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAppMetadataProperty(const char *name, const char *value); #define SDL_PROP_APP_METADATA_NAME_STRING "SDL.app.metadata.name" #define SDL_PROP_APP_METADATA_VERSION_STRING "SDL.app.metadata.version" @@ -346,7 +481,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAppMetadataProperty(const char *name * freed if you call SDL_SetAppMetadataProperty() to set that * property from another thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAppMetadata * \sa SDL_SetAppMetadataProperty diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_intrin.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_intrin.h index efba11d..bac6d7a 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_intrin.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_intrin.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -19,8 +19,31 @@ 3. This notice may not be removed or altered from any source distribution. */ -/* - * Header file for CPU intrinsics for SDL +/* WIKI CATEGORY: Intrinsics */ + +/** + * # CategoryIntrinsics + * + * SDL does some preprocessor gymnastics to determine if any CPU-specific + * compiler intrinsics are available, as this is not necessarily an easy thing + * to calculate, and sometimes depends on quirks of a system, versions of + * build tools, and other external forces. + * + * Apps including SDL's headers will be able to check consistent preprocessor + * definitions to decide if it's safe to use compiler intrinsics for a + * specific CPU architecture. This check only tells you that the compiler is + * capable of using those intrinsics; at runtime, you should still check if + * they are available on the current system with the + * [CPU info functions](https://wiki.libsdl.org/SDL3/CategoryCPUInfo) + * , such as SDL_HasSSE() or SDL_HasNEON(). Otherwise, the process might crash + * for using an unsupported CPU instruction. + * + * SDL only sets preprocessor defines for CPU intrinsics if they are + * supported, so apps should check with `#ifdef` and not `#if`. + * + * SDL will also include the appropriate instruction-set-specific support + * headers, so if SDL decides to define SDL_SSE2_INTRINSICS, it will also + * `#include ` as well. */ #ifndef SDL_intrin_h_ @@ -28,6 +51,169 @@ #include +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Defined if (and only if) the compiler supports Loongarch LSX intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_LASX_INTRINSICS + */ +#define SDL_LSX_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Loongarch LSX intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_LASX_INTRINSICS + */ +#define SDL_LASX_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports ARM NEON intrinsics. + * + * If this macro is defined, SDL will have already included `` + * ``, ``, and ``, as appropriate. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_NEON_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports PowerPC Altivec intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ALTIVEC_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel MMX intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE_INTRINSICS + */ +#define SDL_MMX_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel SSE intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE2_INTRINSICS + * \sa SDL_SSE3_INTRINSICS + * \sa SDL_SSE4_1_INTRINSICS + * \sa SDL_SSE4_2_INTRINSICS + */ +#define SDL_SSE_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel SSE2 intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE_INTRINSICS + * \sa SDL_SSE3_INTRINSICS + * \sa SDL_SSE4_1_INTRINSICS + * \sa SDL_SSE4_2_INTRINSICS + */ +#define SDL_SSE2_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel SSE3 intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE_INTRINSICS + * \sa SDL_SSE2_INTRINSICS + * \sa SDL_SSE4_1_INTRINSICS + * \sa SDL_SSE4_2_INTRINSICS + */ +#define SDL_SSE3_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel SSE4.1 intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE_INTRINSICS + * \sa SDL_SSE2_INTRINSICS + * \sa SDL_SSE3_INTRINSICS + * \sa SDL_SSE4_2_INTRINSICS + */ +#define SDL_SSE4_1_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel SSE4.2 intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE_INTRINSICS + * \sa SDL_SSE2_INTRINSICS + * \sa SDL_SSE3_INTRINSICS + * \sa SDL_SSE4_1_INTRINSICS + */ +#define SDL_SSE4_2_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel AVX intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_AVX2_INTRINSICS + * \sa SDL_AVX512F_INTRINSICS + */ +#define SDL_AVX_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel AVX2 intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_AVX_INTRINSICS + * \sa SDL_AVX512F_INTRINSICS + */ +#define SDL_AVX2_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel AVX-512F intrinsics. + * + * AVX-512F is also sometimes referred to as "AVX-512 Foundation." + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_AVX_INTRINSICS + * \sa SDL_AVX2_INTRINSICS + */ +#define SDL_AVX512F_INTRINSICS 1 +#endif + /* 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)) @@ -81,7 +267,21 @@ _m_prefetch(void *__P) #endif #endif /* compiler version */ -#if defined(__clang__) && defined(__has_attribute) +#ifdef SDL_WIKI_DOCUMENTATION_SECTION +/** + * A macro to decide if the compiler supports `__attribute__((target))`. + * + * Even though this is defined in SDL's public headers, it is generally not + * used directly by apps. Apps should probably just use SDL_TARGETING + * directly, instead. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_TARGETING + */ +#define SDL_HAS_TARGET_ATTRIBS + +#elif defined(__clang__) && defined(__has_attribute) # if __has_attribute(target) # define SDL_HAS_TARGET_ATTRIBS # endif @@ -91,7 +291,55 @@ _m_prefetch(void *__P) # define SDL_HAS_TARGET_ATTRIBS #endif -#ifdef SDL_HAS_TARGET_ATTRIBS + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro to tag a function as targeting a specific CPU architecture. + * + * This is a hint to the compiler that a function should be built with support + * for a CPU instruction set that might be different than the rest of the + * program. + * + * The particulars of this are explained in the GCC documentation: + * + * https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-target-function-attribute + * + * An example of using this feature is to turn on SSE2 support for a specific + * function, even if the rest of the source code is not compiled to use SSE2 + * code: + * + * ```c + * #ifdef SDL_SSE2_INTRINSICS + * static void SDL_TARGETING("sse2") DoSomethingWithSSE2(char *x) { + * ...use SSE2 intrinsic functions, etc... + * } + * #endif + * + * // later... + * #ifdef SDL_SSE2_INTRINSICS + * if (SDL_HasSSE2()) { + * DoSomethingWithSSE2(str); + * } + * #endif + * ``` + * + * The application is, on a whole, built without SSE2 instructions, so it will + * run on Intel machines that don't support SSE2. But then at runtime, it + * checks if the system supports the instructions, and then calls into a + * function that uses SSE2 opcodes. The ifdefs make sure that this code isn't + * used on platforms that don't have SSE2 at all. + * + * On compilers without target support, this is defined to nothing. + * + * This symbol is used by SDL internally, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_TARGETING(x) __attribute__((target(x))) + +#elif defined(SDL_HAS_TARGET_ATTRIBS) # define SDL_TARGETING(x) __attribute__((target(x))) #else # define SDL_TARGETING(x) diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_iostream.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_iostream.h index a306deb..4ca1609 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_iostream.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_iostream.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -25,7 +25,7 @@ * # CategoryIOStream * * SDL provides an abstract interface for reading and writing data streams. It - * offers implementations for files, memory, etc, and the app can provideo + * offers implementations for files, memory, etc, and the app can provide * their own implementations, too. * * SDL_IOStream is not related to the standard C++ iostream class, other than @@ -48,7 +48,7 @@ extern "C" { /** * SDL_IOStream status, set by a read or write operation. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_IOStatus { @@ -66,13 +66,13 @@ typedef enum SDL_IOStatus * These map to the same "whence" concept that `fseek` or `lseek` use in the * standard C runtime. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_IOWhence { SDL_IO_SEEK_SET, /**< Seek from the beginning of data */ SDL_IO_SEEK_CUR, /**< Seek relative to current read point */ - SDL_IO_SEEK_END, /**< Seek relative to the end of data */ + SDL_IO_SEEK_END /**< Seek relative to the end of data */ } SDL_IOWhence; /** @@ -83,10 +83,17 @@ typedef enum SDL_IOWhence * already offers several common types of I/O streams, via functions like * SDL_IOFromFile() and SDL_IOFromMem(). * - * \since This struct is available since SDL 3.0.0. + * This structure should be initialized using SDL_INIT_INTERFACE() + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_INIT_INTERFACE */ typedef struct SDL_IOStreamInterface { + /* The version of this interface */ + Uint32 version; + /** * Return the number of bytes in this SDL_IOStream * @@ -126,18 +133,41 @@ typedef struct SDL_IOStreamInterface */ size_t (SDLCALL *write)(void *userdata, const void *ptr, size_t size, SDL_IOStatus *status); + /** + * If the stream is buffering, make sure the data is written out. + * + * On failure, you should set `*status` to a value from the + * SDL_IOStatus enum. You do not have to explicitly set this on + * a successful flush. + * + * \return true if successful or false on write error when flushing data. + */ + bool (SDLCALL *flush)(void *userdata, SDL_IOStatus *status); + /** * Close and free any allocated resources. * - * The SDL_IOStream is still destroyed even if this fails, so clean up anything - * even if flushing to disk returns an error. + * This does not guarantee file writes will sync to physical media; they + * can be in the system's file cache, waiting to go to disk. * - * \return SDL_TRUE if successful or SDL_FALSE on write error when flushing data. + * The SDL_IOStream is still destroyed even if this fails, so clean up anything + * even if flushing buffers, etc, returns an error. + * + * \return true if successful or false on write error when flushing data. */ - SDL_bool (SDLCALL *close)(void *userdata); + bool (SDLCALL *close)(void *userdata); } SDL_IOStreamInterface; +/* Check the size of SDL_IOStreamInterface + * + * If this assert fails, either the compiler is padding to an unexpected size, + * or the interface has been updated and this should be updated to match and + * the code using this interface should be updated to handle the old version. + */ +SDL_COMPILE_TIME_ASSERT(SDL_IOStreamInterface_SIZE, + (sizeof(void *) == 4 && sizeof(SDL_IOStreamInterface) == 28) || + (sizeof(void *) == 8 && sizeof(SDL_IOStreamInterface) == 56)); /** * The read/write operation structure. @@ -147,7 +177,7 @@ typedef struct SDL_IOStreamInterface * SDL_OpenIO() to provide their own stream implementation behind this * struct's abstract interface. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_IOStream SDL_IOStream; @@ -217,6 +247,8 @@ typedef struct SDL_IOStream SDL_IOStream; * than your app, trying to use this pointer will almost certainly result in * a crash! This is mostly a problem on Windows; make sure you build SDL and * your app with the same compiler and settings to avoid it. + * - `SDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER`: a file descriptor that this + * SDL_IOStream is using to access the filesystem. * - `SDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER`: a pointer, that can be cast * to an Android NDK `AAsset *`, that this SDL_IOStream is using to access * the filesystem. If SDL used some other method to access the filesystem, @@ -228,9 +260,12 @@ typedef struct SDL_IOStream SDL_IOStream; * \returns a pointer to the SDL_IOStream structure that is created or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseIO + * \sa SDL_FlushIO * \sa SDL_ReadIO * \sa SDL_SeekIO * \sa SDL_TellIO @@ -240,6 +275,7 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromFile(const char *file, cons #define SDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER "SDL.iostream.windows.handle" #define SDL_PROP_IOSTREAM_STDIO_FILE_POINTER "SDL.iostream.stdio.file" +#define SDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER "SDL.iostream.file_descriptor" #define SDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER "SDL.iostream.android.aasset" /** @@ -257,15 +293,25 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromFile(const char *file, cons * buffer, you should use SDL_IOFromConstMem() with a read-only buffer of * memory instead. * + * The following properties will be set at creation time by SDL: + * + * - `SDL_PROP_IOSTREAM_MEMORY_POINTER`: this will be the `mem` parameter that + * was passed to this function. + * - `SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER`: this will be the `size` parameter + * that was passed to this function. + * * \param mem a pointer to a buffer to feed an SDL_IOStream stream. * \param size the buffer size, in bytes. * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOFromConstMem * \sa SDL_CloseIO + * \sa SDL_FlushIO * \sa SDL_ReadIO * \sa SDL_SeekIO * \sa SDL_TellIO @@ -273,6 +319,9 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromFile(const char *file, cons */ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromMem(void *mem, size_t size); +#define SDL_PROP_IOSTREAM_MEMORY_POINTER "SDL.iostream.memory.base" +#define SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER "SDL.iostream.memory.size" + /** * Use this function to prepare a read-only memory buffer for use with * SDL_IOStream. @@ -290,12 +339,21 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromMem(void *mem, size_t size) * If you need to write to a memory buffer, you should use SDL_IOFromMem() * with a writable buffer of memory instead. * + * The following properties will be set at creation time by SDL: + * + * - `SDL_PROP_IOSTREAM_MEMORY_POINTER`: this will be the `mem` parameter that + * was passed to this function. + * - `SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER`: this will be the `size` parameter + * that was passed to this function. + * * \param mem a pointer to a read-only buffer to feed an SDL_IOStream stream. * \param size the buffer size, in bytes. * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOFromMem * \sa SDL_CloseIO @@ -323,7 +381,9 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromConstMem(const void *mem, s * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseIO * \sa SDL_ReadIO @@ -347,20 +407,21 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromDynamicMem(void); * read/write a common data source, you should use the built-in * implementations in SDL, like SDL_IOFromFile() or SDL_IOFromMem(), etc. * - * You must free the returned pointer with SDL_CloseIO(). - * * This function makes a copy of `iface` and the caller does not need to keep - * this data around after this call. + * it around after this call. * - * \param iface the function pointers that implement this SDL_IOStream. - * \param userdata the app-controlled pointer that is passed to iface's - * functions when called. + * \param iface the interface that implements this SDL_IOStream, initialized + * using SDL_INIT_INTERFACE(). + * \param userdata the pointer that will be passed to the interface functions. * \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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseIO + * \sa SDL_INIT_INTERFACE * \sa SDL_IOFromConstMem * \sa SDL_IOFromFile * \sa SDL_IOFromMem @@ -372,21 +433,32 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_OpenIO(const SDL_IOStreamInterfac * * SDL_CloseIO() closes and cleans up the SDL_IOStream stream. It releases any * resources used by the stream and frees the SDL_IOStream itself. This - * returns SDL_TRUE on success, or SDL_FALSE if the stream failed to flush to - * its output (e.g. to disk). + * returns true on success, or false 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_IOStream is still invalid once this function returns. + * Note that if this fails to flush the stream for any reason, this function + * reports an error, but the SDL_IOStream is still invalid once this function + * returns. + * + * This call flushes any buffered writes to the operating system, but there + * are no guarantees that those writes have gone to physical media; they might + * be in the OS's file cache, waiting to go to disk later. If it's absolutely + * crucial that writes go to disk immediately, so they are definitely stored + * even if the power fails before the file cache would have caught up, one + * should call SDL_FlushIO() before closing. Note that flushing takes time and + * makes the system and your app operate less efficiently, so do so sparingly. * * \param context SDL_IOStream structure to close. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenIO */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CloseIO(SDL_IOStream *context); +extern SDL_DECLSPEC bool SDLCALL SDL_CloseIO(SDL_IOStream *context); /** * Get the properties associated with an SDL_IOStream. @@ -395,7 +467,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CloseIO(SDL_IOStream *context); * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetIOProperties(SDL_IOStream *context); @@ -413,10 +487,9 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetIOProperties(SDL_IOStream *c * \param context the SDL_IOStream to query. * \returns an SDL_IOStatus enum with the current state. * - * \threadsafety This function should not be called at the same time that - * another thread is operating on the same SDL_IOStream. + * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_IOStatus SDLCALL SDL_GetIOStatus(SDL_IOStream *context); @@ -428,7 +501,9 @@ extern SDL_DECLSPEC SDL_IOStatus SDLCALL SDL_GetIOStatus(SDL_IOStream *context); * negative error code on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetIOSize(SDL_IOStream *context); @@ -450,10 +525,12 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetIOSize(SDL_IOStream *context); * negative. * \param whence any of `SDL_IO_SEEK_SET`, `SDL_IO_SEEK_CUR`, * `SDL_IO_SEEK_END`. - * \returns the final offset in the data stream after the seek or a negative - * error code on failure; call SDL_GetError() for more information. + * \returns the final offset in the data stream after the seek or -1 on + * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_TellIO */ @@ -471,7 +548,9 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_SeekIO(SDL_IOStream *context, Sint64 offs * \returns the current offset in the stream, or -1 if the information can not * be determined. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SeekIO */ @@ -481,10 +560,12 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_TellIO(SDL_IOStream *context); * Read from a data source. * * This function reads up `size` bytes from the data source to the area - * pointed at by `ptr`. This function may read less bytes than requested. It - * will return zero when the data stream is completely read, and - * SDL_GetIOStatus() will return SDL_IO_STATUS_EOF, or on error, and - * SDL_GetIOStatus() will return SDL_IO_STATUS_ERROR. + * pointed at by `ptr`. This function may read less bytes than requested. + * + * This function will return zero when the data stream is completely read, and + * SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If zero is returned and + * the stream is not at EOF, SDL_GetIOStatus() will return a different error + * value and SDL_GetError() will offer a human-readable message. * * \param context a pointer to an SDL_IOStream structure. * \param ptr a pointer to a buffer to read data into. @@ -492,7 +573,9 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_TellIO(SDL_IOStream *context); * \returns the number of bytes read, or 0 on end of file or other failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_WriteIO * \sa SDL_GetIOStatus @@ -519,11 +602,14 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_ReadIO(SDL_IOStream *context, void *ptr, * \returns the number of bytes written, which will be less than `size` on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOprintf * \sa SDL_ReadIO * \sa SDL_SeekIO + * \sa SDL_FlushIO * \sa SDL_GetIOStatus */ extern SDL_DECLSPEC size_t SDLCALL SDL_WriteIO(SDL_IOStream *context, const void *ptr, size_t size); @@ -540,7 +626,9 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_WriteIO(SDL_IOStream *context, const void * \returns the number of bytes written or 0 on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOvprintf * \sa SDL_WriteIO @@ -558,13 +646,35 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_IOprintf(SDL_IOStream *context, SDL_PRINT * \returns the number of bytes written or 0 on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOprintf * \sa SDL_WriteIO */ extern SDL_DECLSPEC size_t SDLCALL SDL_IOvprintf(SDL_IOStream *context, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2); +/** + * Flush any buffered data in the stream. + * + * This function makes sure that any buffered data is written to the stream. + * Normally this isn't necessary but if the stream is a pipe or socket it + * guarantees that any pending data is sent. + * + * \param context SDL_IOStream structure to flush. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_OpenIO + * \sa SDL_WriteIO + */ +extern SDL_DECLSPEC bool SDLCALL SDL_FlushIO(SDL_IOStream *context); + /** * Load all the data from an SDL data stream. * @@ -575,17 +685,21 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_IOvprintf(SDL_IOStream *context, SDL_PRIN * The data should be freed with SDL_free(). * * \param src the SDL_IOStream to read all available data from. - * \param datasize if not NULL, will store the number of bytes read. - * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning, - * even in the case of an error. + * \param datasize a pointer filled in with the number of bytes read, may be + * NULL. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. * \returns the data or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadFile + * \sa SDL_SaveFile_IO */ -extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile_IO(SDL_IOStream *src, size_t *datasize, SDL_bool closeio); +extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile_IO(SDL_IOStream *src, size_t *datasize, bool closeio); /** * Load all the data from a file path. @@ -601,12 +715,55 @@ extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile_IO(SDL_IOStream *src, size_t *da * \returns the data or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadFile_IO + * \sa SDL_SaveFile */ extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile(const char *file, size_t *datasize); +/** + * Save all the data into an SDL data stream. + * + * \param src the SDL_IOStream to write all data to. + * \param data the data to be written. If datasize is 0, may be NULL or a + * invalid pointer. + * \param datasize the number of bytes to be written. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SaveFile + * \sa SDL_LoadFile_IO + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SaveFile_IO(SDL_IOStream *src, const void *data, size_t datasize, bool closeio); + +/** + * Save all the data into a file path. + * + * \param file the path to write all available data into. + * \param data the data to be written. If datasize is 0, may be NULL or a + * invalid pointer. + * \param datasize the number of bytes to be written. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SaveFile_IO + * \sa SDL_LoadFile + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SaveFile(const char *file, const void *data, size_t datasize); + /** * \name Read endian functions * @@ -617,26 +774,63 @@ extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile(const char *file, size_t *datasi /** * Use this function to read a byte from an SDL_IOStream. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the SDL_IOStream to read from. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() + * \returns true on success or false on failure or EOF; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU8(SDL_IOStream *src, Uint8 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU8(SDL_IOStream *src, Uint8 *value); /** * Use this function to read a signed byte from an SDL_IOStream. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the SDL_IOStream to read from. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS8(SDL_IOStream *src, Sint8 *value); + +/** + * Use this function to read 16 bits of little-endian data from an + * SDL_IOStream and return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * + * \param src the stream from which to read data. + * \param value a pointer filled in with the data read. + * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS8(SDL_IOStream *src, Sint8 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU16LE(SDL_IOStream *src, Uint16 *value); /** * Use this function to read 16 bits of little-endian data from an @@ -645,30 +839,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS8(SDL_IOStream *src, Sint8 *value) * 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. - * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. - * - * \since This function is available since SDL 3.0.0. - */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU16LE(SDL_IOStream *src, Uint16 *value); - -/** - * Use this function to read 16 bits of little-endian data from an - * SDL_IOStream and return in native format. - * - * SDL byteswaps the data only if necessary, so the data returned will be in - * the native byte order. + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS16LE(SDL_IOStream *src, Sint16 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS16LE(SDL_IOStream *src, Sint16 *value); /** * Use this function to read 16 bits of big-endian data from an SDL_IOStream @@ -677,14 +862,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS16LE(SDL_IOStream *src, Sint16 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU16BE(SDL_IOStream *src, Uint16 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU16BE(SDL_IOStream *src, Uint16 *value); /** * Use this function to read 16 bits of big-endian data from an SDL_IOStream @@ -693,14 +885,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU16BE(SDL_IOStream *src, Uint16 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS16BE(SDL_IOStream *src, Sint16 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS16BE(SDL_IOStream *src, Sint16 *value); /** * Use this function to read 32 bits of little-endian data from an @@ -709,14 +908,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS16BE(SDL_IOStream *src, Sint16 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU32LE(SDL_IOStream *src, Uint32 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU32LE(SDL_IOStream *src, Uint32 *value); /** * Use this function to read 32 bits of little-endian data from an @@ -725,14 +931,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU32LE(SDL_IOStream *src, Uint32 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS32LE(SDL_IOStream *src, Sint32 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS32LE(SDL_IOStream *src, Sint32 *value); /** * Use this function to read 32 bits of big-endian data from an SDL_IOStream @@ -741,14 +954,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS32LE(SDL_IOStream *src, Sint32 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU32BE(SDL_IOStream *src, Uint32 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU32BE(SDL_IOStream *src, Uint32 *value); /** * Use this function to read 32 bits of big-endian data from an SDL_IOStream @@ -757,14 +977,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU32BE(SDL_IOStream *src, Uint32 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS32BE(SDL_IOStream *src, Sint32 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS32BE(SDL_IOStream *src, Sint32 *value); /** * Use this function to read 64 bits of little-endian data from an @@ -773,14 +1000,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS32BE(SDL_IOStream *src, Sint32 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU64LE(SDL_IOStream *src, Uint64 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU64LE(SDL_IOStream *src, Uint64 *value); /** * Use this function to read 64 bits of little-endian data from an @@ -789,14 +1023,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU64LE(SDL_IOStream *src, Uint64 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS64LE(SDL_IOStream *src, Sint64 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS64LE(SDL_IOStream *src, Sint64 *value); /** * Use this function to read 64 bits of big-endian data from an SDL_IOStream @@ -805,14 +1046,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS64LE(SDL_IOStream *src, Sint64 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU64BE(SDL_IOStream *src, Uint64 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU64BE(SDL_IOStream *src, Uint64 *value); /** * Use this function to read 64 bits of big-endian data from an SDL_IOStream @@ -821,14 +1069,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU64BE(SDL_IOStream *src, Uint64 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS64BE(SDL_IOStream *src, Sint64 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS64BE(SDL_IOStream *src, Sint64 *value); /* @} *//* Read endian functions */ /** @@ -843,24 +1098,28 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS64BE(SDL_IOStream *src, Sint64 *va * * \param dst the SDL_IOStream to write to. * \param value the byte value to write. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU8(SDL_IOStream *dst, Uint8 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU8(SDL_IOStream *dst, Uint8 value); /** * Use this function to write a signed byte to an SDL_IOStream. * * \param dst the SDL_IOStream to write to. * \param value the byte value to write. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS8(SDL_IOStream *dst, Sint8 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS8(SDL_IOStream *dst, Sint8 value); /** * Use this function to write 16 bits in native format to an SDL_IOStream as @@ -872,12 +1131,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS8(SDL_IOStream *dst, Sint8 value) * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU16LE(SDL_IOStream *dst, Uint16 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU16LE(SDL_IOStream *dst, Uint16 value); /** * Use this function to write 16 bits in native format to an SDL_IOStream as @@ -889,12 +1150,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU16LE(SDL_IOStream *dst, Uint16 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS16LE(SDL_IOStream *dst, Sint16 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS16LE(SDL_IOStream *dst, Sint16 value); /** * Use this function to write 16 bits in native format to an SDL_IOStream as @@ -905,12 +1168,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS16LE(SDL_IOStream *dst, Sint16 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU16BE(SDL_IOStream *dst, Uint16 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU16BE(SDL_IOStream *dst, Uint16 value); /** * Use this function to write 16 bits in native format to an SDL_IOStream as @@ -921,12 +1186,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU16BE(SDL_IOStream *dst, Uint16 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS16BE(SDL_IOStream *dst, Sint16 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS16BE(SDL_IOStream *dst, Sint16 value); /** * Use this function to write 32 bits in native format to an SDL_IOStream as @@ -938,12 +1205,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS16BE(SDL_IOStream *dst, Sint16 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU32LE(SDL_IOStream *dst, Uint32 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU32LE(SDL_IOStream *dst, Uint32 value); /** * Use this function to write 32 bits in native format to an SDL_IOStream as @@ -955,12 +1224,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU32LE(SDL_IOStream *dst, Uint32 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS32LE(SDL_IOStream *dst, Sint32 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS32LE(SDL_IOStream *dst, Sint32 value); /** * Use this function to write 32 bits in native format to an SDL_IOStream as @@ -971,12 +1242,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS32LE(SDL_IOStream *dst, Sint32 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU32BE(SDL_IOStream *dst, Uint32 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU32BE(SDL_IOStream *dst, Uint32 value); /** * Use this function to write 32 bits in native format to an SDL_IOStream as @@ -987,12 +1260,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU32BE(SDL_IOStream *dst, Uint32 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS32BE(SDL_IOStream *dst, Sint32 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS32BE(SDL_IOStream *dst, Sint32 value); /** * Use this function to write 64 bits in native format to an SDL_IOStream as @@ -1004,12 +1279,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS32BE(SDL_IOStream *dst, Sint32 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU64LE(SDL_IOStream *dst, Uint64 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU64LE(SDL_IOStream *dst, Uint64 value); /** * Use this function to write 64 bits in native format to an SDL_IOStream as @@ -1021,12 +1298,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU64LE(SDL_IOStream *dst, Uint64 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS64LE(SDL_IOStream *dst, Sint64 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS64LE(SDL_IOStream *dst, Sint64 value); /** * Use this function to write 64 bits in native format to an SDL_IOStream as @@ -1037,12 +1316,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS64LE(SDL_IOStream *dst, Sint64 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU64BE(SDL_IOStream *dst, Uint64 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU64BE(SDL_IOStream *dst, Uint64 value); /** * Use this function to write 64 bits in native format to an SDL_IOStream as @@ -1053,12 +1334,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU64BE(SDL_IOStream *dst, Uint64 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS64BE(SDL_IOStream *dst, Sint64 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS64BE(SDL_IOStream *dst, Sint64 value); /* @} *//* Write endian functions */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_joystick.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_joystick.h index 43bc1e9..d15668b 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_joystick.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_joystick.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -25,8 +25,8 @@ * SDL joystick support. * * This is the lower-level joystick handling. If you want the simpler option, - * where what buttons does what is well-defined, you should use the gamepad - * API instead. + * where what each button does is well-defined, you should use the gamepad API + * instead. * * 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 @@ -81,7 +81,7 @@ extern SDL_Mutex *SDL_joystick_lock; * * This is opaque data. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Joystick SDL_Joystick; @@ -93,7 +93,7 @@ typedef struct SDL_Joystick SDL_Joystick; * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_JoystickID; @@ -107,7 +107,7 @@ typedef Uint32 SDL_JoystickID; * This is by no means a complete list of everything that can be plugged into * a computer. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_JoystickType { @@ -120,7 +120,8 @@ typedef enum SDL_JoystickType SDL_JOYSTICK_TYPE_GUITAR, SDL_JOYSTICK_TYPE_DRUM_KIT, SDL_JOYSTICK_TYPE_ARCADE_PAD, - SDL_JOYSTICK_TYPE_THROTTLE + SDL_JOYSTICK_TYPE_THROTTLE, + SDL_JOYSTICK_TYPE_COUNT } SDL_JoystickType; /** @@ -129,7 +130,7 @@ typedef enum SDL_JoystickType * This is used by SDL_GetJoystickConnectionState to report how a device is * connected to the system. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_JoystickConnectionState { @@ -142,7 +143,7 @@ typedef enum SDL_JoystickConnectionState /** * The largest value an SDL_Joystick's axis can report. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_JOYSTICK_AXIS_MIN */ @@ -153,19 +154,13 @@ typedef enum SDL_JoystickConnectionState * * This is a negative number! * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_JOYSTICK_AXIS_MAX */ #define SDL_JOYSTICK_AXIS_MIN -32768 -/* 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 */ /** @@ -175,27 +170,27 @@ typedef enum SDL_JoystickConnectionState * joysticks while processing to guarantee that the joystick list won't change * and joystick and gamepad events will not be delivered. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_LockJoysticks(void) SDL_ACQUIRE(SDL_joystick_lock); /** * Unlocking for atomic access to the joystick API. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnlockJoysticks(void) SDL_RELEASE(SDL_joystick_lock); /** * Return whether a joystick is currently connected. * - * \returns SDL_TRUE if a joystick is connected, SDL_FALSE otherwise. + * \returns true if a joystick is connected, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoysticks */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasJoystick(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasJoystick(void); /** * Get a list of currently connected joysticks. @@ -206,7 +201,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasJoystick(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasJoystick * \sa SDL_OpenJoystick @@ -222,7 +217,7 @@ extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetJoysticks(int *count); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickName * \sa SDL_GetJoysticks @@ -238,7 +233,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickNameForID(SDL_JoystickID * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPath * \sa SDL_GetJoysticks @@ -253,7 +248,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPathForID(SDL_JoystickID * \param instance_id the joystick instance ID. * \returns the player index of a joystick, or -1 if it's not available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex * \sa SDL_GetJoysticks @@ -269,7 +264,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickPlayerIndexForID(SDL_JoystickID i * \returns the GUID of the selected joystick. If called with an invalid * instance_id, this function returns a zero GUID. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUID * \sa SDL_GUIDToString @@ -286,7 +281,7 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetJoystickGUIDForID(SDL_JoystickID ins * \returns the USB vendor ID of the selected joystick. If called with an * invalid instance_id, this function returns 0. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickVendor * \sa SDL_GetJoysticks @@ -303,7 +298,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickVendorForID(SDL_JoystickID ins * \returns the USB product ID of the selected joystick. If called with an * invalid instance_id, this function returns 0. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProduct * \sa SDL_GetJoysticks @@ -320,7 +315,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductForID(SDL_JoystickID in * \returns the product version of the selected joystick. If called with an * invalid instance_id, this function returns 0. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductVersion * \sa SDL_GetJoysticks @@ -337,7 +332,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductVersionForID(SDL_Joysti * invalid instance_id, this function returns * `SDL_JOYSTICK_TYPE_UNKNOWN`. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickType * \sa SDL_GetJoysticks @@ -354,7 +349,7 @@ extern SDL_DECLSPEC SDL_JoystickType SDLCALL SDL_GetJoystickTypeForID(SDL_Joysti * \returns a joystick identifier or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseJoystick */ @@ -367,7 +362,7 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_OpenJoystick(SDL_JoystickID insta * \returns an SDL_Joystick on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromID(SDL_JoystickID instance_id); @@ -378,7 +373,7 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromID(SDL_JoystickID * \returns an SDL_Joystick on success or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex * \sa SDL_SetJoystickPlayerIndex @@ -388,7 +383,7 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromPlayerIndex(int pl /** * The structure that describes a virtual joystick touchpad. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_VirtualJoystickDesc */ @@ -401,7 +396,7 @@ typedef struct SDL_VirtualJoystickTouchpadDesc /** * The structure that describes a virtual joystick sensor. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_VirtualJoystickDesc */ @@ -414,16 +409,19 @@ typedef struct SDL_VirtualJoystickSensorDesc /** * The structure that describes a virtual joystick. * - * All elements of this structure are optional and can be left 0. + * This structure should be initialized using SDL_INIT_INTERFACE(). All + * elements of this structure are optional. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_AttachVirtualJoystick + * \sa SDL_INIT_INTERFACE * \sa SDL_VirtualJoystickSensorDesc * \sa SDL_VirtualJoystickTouchpadDesc */ typedef struct SDL_VirtualJoystickDesc { + Uint32 version; /**< the version of this interface */ Uint16 type; /**< `SDL_JoystickType` */ Uint16 padding; /**< unused */ Uint16 vendor_id; /**< the USB vendor ID of this joystick */ @@ -446,22 +444,32 @@ typedef struct SDL_VirtualJoystickDesc 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 */ - SDL_bool (SDLCALL *Rumble)(void *userdata, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble); /**< Implements SDL_RumbleJoystick() */ - SDL_bool (SDLCALL *RumbleTriggers)(void *userdata, Uint16 left_rumble, Uint16 right_rumble); /**< Implements SDL_RumbleJoystickTriggers() */ - SDL_bool (SDLCALL *SetLED)(void *userdata, Uint8 red, Uint8 green, Uint8 blue); /**< Implements SDL_SetJoystickLED() */ - SDL_bool (SDLCALL *SendEffect)(void *userdata, const void *data, int size); /**< Implements SDL_SendJoystickEffect() */ - SDL_bool (SDLCALL *SetSensorsEnabled)(void *userdata, SDL_bool enabled); /**< Implements SDL_SetGamepadSensorEnabled() */ + bool (SDLCALL *Rumble)(void *userdata, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble); /**< Implements SDL_RumbleJoystick() */ + bool (SDLCALL *RumbleTriggers)(void *userdata, Uint16 left_rumble, Uint16 right_rumble); /**< Implements SDL_RumbleJoystickTriggers() */ + bool (SDLCALL *SetLED)(void *userdata, Uint8 red, Uint8 green, Uint8 blue); /**< Implements SDL_SetJoystickLED() */ + bool (SDLCALL *SendEffect)(void *userdata, const void *data, int size); /**< Implements SDL_SendJoystickEffect() */ + bool (SDLCALL *SetSensorsEnabled)(void *userdata, bool enabled); /**< Implements SDL_SetGamepadSensorEnabled() */ void (SDLCALL *Cleanup)(void *userdata); /**< Cleans up the userdata when the joystick is detached */ } SDL_VirtualJoystickDesc; +/* Check the size of SDL_VirtualJoystickDesc + * + * If this assert fails, either the compiler is padding to an unexpected size, + * or the interface has been updated and this should be updated to match and + * the code using this interface should be updated to handle the old version. + */ +SDL_COMPILE_TIME_ASSERT(SDL_VirtualJoystickDesc_SIZE, + (sizeof(void *) == 4 && sizeof(SDL_VirtualJoystickDesc) == 84) || + (sizeof(void *) == 8 && sizeof(SDL_VirtualJoystickDesc) == 136)); + /** * Attach a new virtual joystick. * - * \param desc joystick description. + * \param desc joystick description, initialized using SDL_INIT_INTERFACE(). * \returns the joystick instance ID, or 0 on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DetachVirtualJoystick */ @@ -472,24 +480,24 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_AttachVirtualJoystick(const SDL_V * * \param instance_id the joystick instance ID, previously returned from * SDL_AttachVirtualJoystick(). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AttachVirtualJoystick */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DetachVirtualJoystick(SDL_JoystickID instance_id); +extern SDL_DECLSPEC bool SDLCALL SDL_DetachVirtualJoystick(SDL_JoystickID instance_id); /** * Query whether or not a joystick is virtual. * * \param instance_id the joystick instance ID. - * \returns SDL_TRUE if the joystick is virtual, SDL_FALSE otherwise. + * \returns true if the joystick is virtual, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instance_id); +extern SDL_DECLSPEC bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instance_id); /** * Set the state of an axis on an opened virtual joystick. @@ -507,12 +515,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instan * \param joystick the virtual joystick on which to set state. * \param axis the index of the axis on the virtual joystick to update. * \param value the new value for the specified axis. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value); /** * Generate ball motion on an opened virtual joystick. @@ -527,12 +535,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *jo * \param ball the index of the ball on the virtual joystick to update. * \param xrel the relative motion on the X axis. * \param yrel the relative motion on the Y axis. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *joystick, int ball, Sint16 xrel, Sint16 yrel); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *joystick, int ball, Sint16 xrel, Sint16 yrel); /** * Set the state of a button on an opened virtual joystick. @@ -545,13 +553,13 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *jo * * \param joystick the virtual joystick on which to set state. * \param button the index of the button on the virtual joystick to update. - * \param value the new value for the specified button. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param down true if the button is pressed, false otherwise. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick *joystick, int button, Uint8 value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick *joystick, int button, bool down); /** * Set the state of a hat on an opened virtual joystick. @@ -565,12 +573,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick * * \param joystick the virtual joystick on which to set state. * \param hat the index of the hat on the virtual joystick to update. * \param value the new value for the specified hat. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value); /** * Set touchpad finger state on an opened virtual joystick. @@ -585,19 +593,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joy * \param touchpad the index of the touchpad on the virtual joystick to * update. * \param finger the index of the finger on the touchpad to set. - * \param state `SDL_PRESSED` if the finger is pressed, `SDL_RELEASED` if the - * finger is released. + * \param down true if the finger is pressed, false if the finger is released. * \param x the x coordinate of the finger on the touchpad, normalized 0 to 1, * with the origin in the upper left. * \param y the y coordinate of the finger on the touchpad, normalized 0 to 1, * with the origin in the upper left. * \param pressure the pressure of the finger. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick *joystick, int touchpad, int finger, Uint8 state, float x, float y, float pressure); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick *joystick, int touchpad, int finger, bool down, float x, float y, float pressure); /** * Send a sensor update for an opened virtual joystick. @@ -614,12 +621,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick * the sensor reading. * \param data the data associated with the sensor reading. * \param num_values the number of values pointed to by `data`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joystick *joystick, SDL_SensorType type, Uint64 sensor_timestamp, const float *data, int num_values); +extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joystick *joystick, SDL_SensorType type, Uint64 sensor_timestamp, const float *data, int num_values); /** * Get the properties associated with a joystick. @@ -641,7 +648,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joyst * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetJoystickProperties(SDL_Joystick *joystick); @@ -658,7 +665,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetJoystickProperties(SDL_Joyst * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickNameForID */ @@ -671,7 +678,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickName(SDL_Joystick *joyst * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPathForID */ @@ -686,7 +693,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPath(SDL_Joystick *joyst * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the player index, or -1 if it's not available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetJoystickPlayerIndex */ @@ -698,14 +705,14 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickPlayerIndex(SDL_Joystick *joystic * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \param player_index player index to assign to this joystick, or -1 to clear * the player index and turn off player LEDs. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickPlayerIndex(SDL_Joystick *joystick, int player_index); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickPlayerIndex(SDL_Joystick *joystick, int player_index); /** * Get the implementation-dependent GUID for the joystick. @@ -717,7 +724,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickPlayerIndex(SDL_Joystick *jo * this function returns a zero GUID; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID * \sa SDL_GUIDToString @@ -732,7 +739,7 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetJoystickGUID(SDL_Joystick *joystick) * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the USB vendor ID of the selected joystick, or 0 if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickVendorForID */ @@ -746,7 +753,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickVendor(SDL_Joystick *joystick) * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the USB product ID of the selected joystick, or 0 if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductForID */ @@ -760,7 +767,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProduct(SDL_Joystick *joystick * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the product version of the selected joystick, or 0 if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductVersionForID */ @@ -775,7 +782,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductVersion(SDL_Joystick *j * \returns the firmware version of the selected joystick, or 0 if * unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickFirmwareVersion(SDL_Joystick *joystick); @@ -788,7 +795,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickFirmwareVersion(SDL_Joystick * * \returns the serial number of the selected joystick, or NULL if * unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joystick); @@ -798,7 +805,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joy * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the SDL_JoystickType of the selected joystick. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickTypeForID */ @@ -817,7 +824,7 @@ extern SDL_DECLSPEC SDL_JoystickType SDLCALL SDL_GetJoystickType(SDL_Joystick *j * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID */ @@ -827,12 +834,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetJoystickGUIDInfo(SDL_GUID guid, Uint16 * * 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. + * \returns true if the joystick has been opened, false if it has not; call + * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystick); +extern SDL_DECLSPEC bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystick); /** * Get the instance ID of an opened joystick. @@ -841,7 +848,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystic * \returns the instance ID of the specified joystick on success or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetJoystickID(SDL_Joystick *joystick); @@ -856,7 +863,7 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetJoystickID(SDL_Joystick *joyst * \returns the number of axis controls/number of axes on success or -1 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickAxis * \sa SDL_GetNumJoystickBalls @@ -877,7 +884,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickAxes(SDL_Joystick *joystick); * \returns the number of trackballs on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickBall * \sa SDL_GetNumJoystickAxes @@ -893,7 +900,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickBalls(SDL_Joystick *joystick); * \returns the number of POV hats on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickHat * \sa SDL_GetNumJoystickAxes @@ -909,7 +916,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickHats(SDL_Joystick *joystick); * \returns the number of buttons on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickButton * \sa SDL_GetNumJoystickAxes @@ -927,12 +934,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickButtons(SDL_Joystick *joystick * * \param enabled whether to process joystick events or not. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_JoystickEventsEnabled * \sa SDL_UpdateJoysticks */ -extern SDL_DECLSPEC void SDLCALL SDL_SetJoystickEventsEnabled(SDL_bool enabled); +extern SDL_DECLSPEC void SDLCALL SDL_SetJoystickEventsEnabled(bool enabled); /** * Query the state of joystick event processing. @@ -941,14 +948,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetJoystickEventsEnabled(SDL_bool enabled); * yourself and check the state of the joystick when you want joystick * information. * - * \returns SDL_TRUE if joystick events are being processed, SDL_FALSE - * otherwise. + * \returns true if joystick events are being processed, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetJoystickEventsEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_JoystickEventsEnabled(void); +extern SDL_DECLSPEC bool SDLCALL SDL_JoystickEventsEnabled(void); /** * Update the current state of the open joysticks. @@ -956,7 +962,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_JoystickEventsEnabled(void); * This is called automatically by the event loop if any joystick events are * enabled. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateJoysticks(void); @@ -978,7 +984,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UpdateJoysticks(void); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickAxes */ @@ -994,11 +1000,11 @@ extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetJoystickAxis(SDL_Joystick *joystick, i * \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. - * \returns SDL_TRUE if this axis has any initial value, or SDL_FALSE if not. + * \returns true if this axis has any initial value, or false if not. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystick *joystick, int axis, Sint16 *state); +extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystick *joystick, int axis, Sint16 *state); /** * Get the ball axis change since the last poll. @@ -1012,14 +1018,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystic * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickBalls */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetJoystickBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); +extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); /** * Get the current state of a POV hat on a joystick. @@ -1030,7 +1036,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetJoystickBall(SDL_Joystick *joystick, * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickHats */ @@ -1052,13 +1058,13 @@ extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetJoystickHat(SDL_Joystick *joystick, int * \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. + * \returns true if the button is pressed, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickButtons */ -extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetJoystickButton(SDL_Joystick *joystick, int button); +extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickButton(SDL_Joystick *joystick, int button); /** * Start a rumble effect. @@ -1075,11 +1081,11 @@ extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetJoystickButton(SDL_Joystick *joystick, * \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 SDL_TRUE, or SDL_FALSE if rumble isn't supported on this joystick. + * \returns true, or false if rumble isn't supported on this joystick. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); +extern SDL_DECLSPEC bool SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); /** * Start a rumble effect in the joystick's triggers. @@ -1101,14 +1107,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RumbleJoystick */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleJoystickTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); +extern SDL_DECLSPEC bool SDLCALL SDL_RumbleJoystickTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); /** * Update a joystick's LED color. @@ -1123,12 +1129,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleJoystickTriggers(SDL_Joystick *jo * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue); /** * Send a joystick specific effect packet. @@ -1136,19 +1142,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendJoystickEffect(SDL_Joystick *joystick, const void *data, int size); +extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickEffect(SDL_Joystick *joystick, const void *data, int size); /** * Close a joystick previously opened with SDL_OpenJoystick(). * * \param joystick the joystick device to close. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenJoystick */ @@ -1162,7 +1168,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseJoystick(SDL_Joystick *joystick); * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetJoystickConnectionState(SDL_Joystick *joystick); @@ -1183,7 +1189,7 @@ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetJoystickConnectio * \returns the current battery state or `SDL_POWERSTATE_ERROR` on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetJoystickPowerInfo(SDL_Joystick *joystick, int *percent); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keyboard.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keyboard.h index ec6c3f2..afa77b6 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keyboard.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,11 @@ * # CategoryKeyboard * * SDL keyboard management. + * + * Please refer to the Best Keyboard Practices document for details on how + * best to accept keyboard input in various types of programs: + * + * https://wiki.libsdl.org/SDL3/BestKeyboardPractices */ #ifndef SDL_keyboard_h_ @@ -31,6 +36,9 @@ #include #include #include +#include +#include +#include #include #include @@ -47,7 +55,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_KeyboardID; @@ -56,13 +64,15 @@ typedef Uint32 SDL_KeyboardID; /** * Return whether a keyboard is currently connected. * - * \returns SDL_TRUE if a keyboard is connected, SDL_FALSE otherwise. + * \returns true if a keyboard is connected, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboards */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasKeyboard(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasKeyboard(void); /** * Get a list of currently connected keyboards. @@ -78,7 +88,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasKeyboard(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboardNameForID * \sa SDL_HasKeyboard @@ -94,7 +106,9 @@ extern SDL_DECLSPEC SDL_KeyboardID * SDLCALL SDL_GetKeyboards(int *count); * \returns the name of the selected keyboard or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboards */ @@ -105,7 +119,9 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyboardNameForID(SDL_KeyboardID * * \returns the window with keyboard focus. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); @@ -116,9 +132,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); * 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. + * A array element with a value of true means that the key is pressed and a + * value of false means that it is not. Indexes into this array are obtained + * by using SDL_Scancode values. * * Use SDL_PumpEvents() to update the state array. * @@ -133,19 +149,23 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); * \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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PumpEvents * \sa SDL_ResetKeyboard */ -extern SDL_DECLSPEC const Uint8 * SDLCALL SDL_GetKeyboardState(int *numkeys); +extern SDL_DECLSPEC const bool * 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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboardState */ @@ -157,7 +177,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetKeyboard(void); * \returns an OR'd combination of the modifier keys for the keyboard. See * SDL_Keymod for details. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboardState * \sa SDL_SetModState @@ -177,7 +199,9 @@ extern SDL_DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void); * * \param modstate the desired SDL_Keymod for the keyboard. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetModState */ @@ -189,21 +213,23 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate); * * If you want to get the keycode as it would be delivered in key events, * including options specified in SDL_HINT_KEYCODE_OPTIONS, then you should - * pass `key_event` as SDL_TRUE. Otherwise this function simply translates the + * pass `key_event` as true. Otherwise this function simply translates the * scancode based on the given modifier state. * * \param scancode the desired SDL_Scancode to query. * \param modstate the modifier state to use when translating the scancode to * a keycode. - * \param key_event SDL_TRUE if the keycode will be used in key events. + * \param key_event true if the keycode will be used in key events. * \returns the SDL_Keycode that corresponds to the given SDL_Scancode. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyName * \sa SDL_GetScancodeFromKey */ -extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode, SDL_Keymod modstate, SDL_bool key_event); +extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode, SDL_Keymod modstate, bool key_event); /** * Get the scancode corresponding to the given key code according to the @@ -217,7 +243,9 @@ extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scan * scancode generates this key, may be NULL. * \returns the SDL_Scancode that corresponds to the given SDL_Keycode. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromScancode * \sa SDL_GetScancodeName @@ -231,14 +259,16 @@ extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key, * \param name the name to use for the scancode, encoded as UTF-8. The string * is not copied, so the pointer given to this function must stay * valid while SDL is being used. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetScancodeName */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetScancodeName(SDL_Scancode scancode, const char *name); +extern SDL_DECLSPEC bool SDLCALL SDL_SetScancodeName(SDL_Scancode scancode, const char *name); /** * Get a human-readable name for a scancode. @@ -256,7 +286,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetScancodeName(SDL_Scancode scancode, * \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 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetScancodeFromKey * \sa SDL_GetScancodeFromName @@ -271,7 +303,9 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetScancodeName(SDL_Scancode scanco * \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 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromName * \sa SDL_GetScancodeFromKey @@ -284,10 +318,14 @@ extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *nam * * If the key doesn't have a name, this function returns an empty string (""). * + * Letters will be presented in their uppercase form, if applicable. + * * \param key the desired SDL_Keycode to query. * \returns a UTF-8 encoded string of the key name. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromName * \sa SDL_GetKeyFromScancode @@ -302,7 +340,9 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyName(SDL_Keycode key); * \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 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromScancode * \sa SDL_GetKeyName @@ -319,20 +359,24 @@ extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name); * * Text input events are not received by default. * - * On some platforms using this function shows the screen keyboard. + * On some platforms using this function shows the screen keyboard and/or + * activates an IME, which can prevent some key press events from being passed + * through. * * \param window the window to enable text input. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextInputArea * \sa SDL_StartTextInputWithProperties * \sa SDL_StopTextInput * \sa SDL_TextInputActive */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StartTextInput(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_StartTextInput(SDL_Window *window); /** * Text input type. @@ -341,7 +385,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StartTextInput(SDL_Window *window); * value is valid on every platform, but where a value isn't supported, a * reasonable fallback will be used. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_StartTextInputWithProperties */ @@ -361,12 +405,11 @@ typedef enum SDL_TextInputType /** * Auto capitalization type. * - * These are the valid values for - * SDL_PROP_TEXTINPUT_AUTOCAPITALIZATION_NUMBER. Not every value is valid on - * every platform, but where a value isn't supported, a reasonable fallback - * will be used. + * These are the valid values for SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER. + * Not every value is valid on every platform, but where a value isn't + * supported, a reasonable fallback will be used. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_StartTextInputWithProperties */ @@ -388,7 +431,9 @@ typedef enum SDL_Capitalization * * Text input events are not received by default. * - * On some platforms using this function shows the screen keyboard. + * On some platforms using this function shows the screen keyboard and/or + * activates an IME, which can prevent some key press events from being passed + * through. * * These are the supported properties: * @@ -400,11 +445,11 @@ typedef enum SDL_Capitalization * SDL_TEXTINPUT_TYPE_TEXT_NAME, and SDL_CAPITALIZE_NONE for e-mail * addresses, usernames, and passwords. * - `SDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN` - true to enable auto completion - * and auto correction, defaults to SDL_TRUE. + * and auto correction, defaults to true. * - `SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN` - true if multiple lines of text - * are allowed. This defaults to SDL_TRUE if SDL_HINT_RETURN_KEY_HIDES_IME - * is "0" or is not set, and defaults to SDL_FALSE if - * SDL_HINT_RETURN_KEY_HIDES_IME is "1". + * are allowed. This defaults to true if SDL_HINT_RETURN_KEY_HIDES_IME is + * "0" or is not set, and defaults to false if SDL_HINT_RETURN_KEY_HIDES_IME + * is "1". * * On Android you can directly specify the input type: * @@ -414,17 +459,19 @@ typedef enum SDL_Capitalization * * \param window the window to enable text input. * \param props the properties to use. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextInputArea * \sa SDL_StartTextInput * \sa SDL_StopTextInput * \sa SDL_TextInputActive */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StartTextInputWithProperties(SDL_Window *window, SDL_PropertiesID props); +extern SDL_DECLSPEC bool SDLCALL SDL_StartTextInputWithProperties(SDL_Window *window, SDL_PropertiesID props); #define SDL_PROP_TEXTINPUT_TYPE_NUMBER "SDL.textinput.type" #define SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER "SDL.textinput.capitalization" @@ -436,13 +483,15 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StartTextInputWithProperties(SDL_Window * Check whether or not Unicode text input events are enabled for a window. * * \param window the window to check. - * \returns SDL_TRUE if text input events are enabled else SDL_FALSE. + * \returns true if text input events are enabled else false. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TextInputActive(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_TextInputActive(SDL_Window *window); /** * Stop receiving any text input events in a window. @@ -451,28 +500,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TextInputActive(SDL_Window *window); * it. * * \param window the window to disable text input. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StopTextInput(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_StopTextInput(SDL_Window *window); /** * Dismiss the composition window/IME without disabling the subsystem. * * \param window the window to affect. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput * \sa SDL_StopTextInput */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearComposition(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearComposition(SDL_Window *window); /** * Set the area used to type Unicode text input. @@ -485,15 +538,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearComposition(SDL_Window *window); * coordinates, or NULL to clear it. * \param cursor the offset of the current cursor location relative to * `rect->x`, in window coordinates. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextInputArea * \sa SDL_StartTextInput */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextInputArea(SDL_Window *window, const SDL_Rect *rect, int cursor); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTextInputArea(SDL_Window *window, const SDL_Rect *rect, int cursor); /** * Get the area used to type Unicode text input. @@ -505,39 +560,45 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextInputArea(SDL_Window *window, co * may be NULL. * \param cursor a pointer to the offset of the current cursor location * relative to `rect->x`, may be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextInputArea */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextInputArea(SDL_Window *window, SDL_Rect *rect, int *cursor); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextInputArea(SDL_Window *window, SDL_Rect *rect, int *cursor); /** * Check whether the platform has screen keyboard support. * - * \returns SDL_TRUE if the platform has some screen keyboard support or - * SDL_FALSE if not. + * \returns true if the platform has some screen keyboard support or false if + * not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput * \sa SDL_ScreenKeyboardShown */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasScreenKeyboardSupport(void); +extern SDL_DECLSPEC 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. + * \returns true if screen keyboard is shown or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasScreenKeyboardSupport */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ScreenKeyboardShown(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_ScreenKeyboardShown(SDL_Window *window); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keycode.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keycode.h index 2d03a3d..61b68e7 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keycode.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keycode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,11 @@ * # CategoryKeycode * * Defines constants which identify keyboard keys and modifiers. + * + * Please refer to the Best Keyboard Practices document for details on what + * this information means and how best to use it. + * + * https://wiki.libsdl.org/SDL3/BestKeyboardPractices */ #ifndef SDL_keycode_h_ @@ -42,272 +47,284 @@ * A special exception is the number keys at the top of the keyboard which map * to SDLK_0...SDLK_9 on AZERTY layouts. * - * \since This datatype is available since SDL 3.0.0. + * Keys with the `SDLK_EXTENDED_MASK` bit set do not map to a scancode or + * unicode code point. + * + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_Keycode; -#define SDLK_SCANCODE_MASK (1u<<30) +#define SDLK_EXTENDED_MASK (1u << 29) +#define SDLK_SCANCODE_MASK (1u << 30) #define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK) -#define SDLK_UNKNOWN 0x00000000u /* 0 */ -#define SDLK_RETURN 0x0000000du /* '\r' */ -#define SDLK_ESCAPE 0x0000001bu /* '\x1B' */ -#define SDLK_BACKSPACE 0x00000008u /* '\b' */ -#define SDLK_TAB 0x00000009u /* '\t' */ -#define SDLK_SPACE 0x00000020u /* ' ' */ -#define SDLK_EXCLAIM 0x00000021u /* '!' */ -#define SDLK_DBLAPOSTROPHE 0x00000022u /* '"' */ -#define SDLK_HASH 0x00000023u /* '#' */ -#define SDLK_DOLLAR 0x00000024u /* '$' */ -#define SDLK_PERCENT 0x00000025u /* '%' */ -#define SDLK_AMPERSAND 0x00000026u /* '&' */ -#define SDLK_APOSTROPHE 0x00000027u /* '\'' */ -#define SDLK_LEFTPAREN 0x00000028u /* '(' */ -#define SDLK_RIGHTPAREN 0x00000029u /* ')' */ -#define SDLK_ASTERISK 0x0000002au /* '*' */ -#define SDLK_PLUS 0x0000002bu /* '+' */ -#define SDLK_COMMA 0x0000002cu /* ',' */ -#define SDLK_MINUS 0x0000002du /* '-' */ -#define SDLK_PERIOD 0x0000002eu /* '.' */ -#define SDLK_SLASH 0x0000002fu /* '/' */ -#define SDLK_0 0x00000030u /* '0' */ -#define SDLK_1 0x00000031u /* '1' */ -#define SDLK_2 0x00000032u /* '2' */ -#define SDLK_3 0x00000033u /* '3' */ -#define SDLK_4 0x00000034u /* '4' */ -#define SDLK_5 0x00000035u /* '5' */ -#define SDLK_6 0x00000036u /* '6' */ -#define SDLK_7 0x00000037u /* '7' */ -#define SDLK_8 0x00000038u /* '8' */ -#define SDLK_9 0x00000039u /* '9' */ -#define SDLK_COLON 0x0000003au /* ':' */ -#define SDLK_SEMICOLON 0x0000003bu /* ';' */ -#define SDLK_LESS 0x0000003cu /* '<' */ -#define SDLK_EQUALS 0x0000003du /* '=' */ -#define SDLK_GREATER 0x0000003eu /* '>' */ -#define SDLK_QUESTION 0x0000003fu /* '?' */ -#define SDLK_AT 0x00000040u /* '@' */ -#define SDLK_LEFTBRACKET 0x0000005bu /* '[' */ -#define SDLK_BACKSLASH 0x0000005cu /* '\\' */ -#define SDLK_RIGHTBRACKET 0x0000005du /* ']' */ -#define SDLK_CARET 0x0000005eu /* '^' */ -#define SDLK_UNDERSCORE 0x0000005fu /* '_' */ -#define SDLK_GRAVE 0x00000060u /* '`' */ -#define SDLK_A 0x00000061u /* 'a' */ -#define SDLK_B 0x00000062u /* 'b' */ -#define SDLK_C 0x00000063u /* 'c' */ -#define SDLK_D 0x00000064u /* 'd' */ -#define SDLK_E 0x00000065u /* 'e' */ -#define SDLK_F 0x00000066u /* 'f' */ -#define SDLK_G 0x00000067u /* 'g' */ -#define SDLK_H 0x00000068u /* 'h' */ -#define SDLK_I 0x00000069u /* 'i' */ -#define SDLK_J 0x0000006au /* 'j' */ -#define SDLK_K 0x0000006bu /* 'k' */ -#define SDLK_L 0x0000006cu /* 'l' */ -#define SDLK_M 0x0000006du /* 'm' */ -#define SDLK_N 0x0000006eu /* 'n' */ -#define SDLK_O 0x0000006fu /* 'o' */ -#define SDLK_P 0x00000070u /* 'p' */ -#define SDLK_Q 0x00000071u /* 'q' */ -#define SDLK_R 0x00000072u /* 'r' */ -#define SDLK_S 0x00000073u /* 's' */ -#define SDLK_T 0x00000074u /* 't' */ -#define SDLK_U 0x00000075u /* 'u' */ -#define SDLK_V 0x00000076u /* 'v' */ -#define SDLK_W 0x00000077u /* 'w' */ -#define SDLK_X 0x00000078u /* 'x' */ -#define SDLK_Y 0x00000079u /* 'y' */ -#define SDLK_Z 0x0000007au /* 'z' */ -#define SDLK_LEFTBRACE 0x0000007bu /* '{' */ -#define SDLK_PIPE 0x0000007cu /* '|' */ -#define SDLK_RIGHTBRACE 0x0000007du /* '}' */ -#define SDLK_TILDE 0x0000007eu /* '~' */ -#define SDLK_DELETE 0x0000007fu /* '\x7F' */ -#define SDLK_PLUSMINUS 0x000000b1u /* '±' */ -#define SDLK_CAPSLOCK 0x40000039u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK) */ -#define SDLK_F1 0x4000003au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1) */ -#define SDLK_F2 0x4000003bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2) */ -#define SDLK_F3 0x4000003cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3) */ -#define SDLK_F4 0x4000003du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4) */ -#define SDLK_F5 0x4000003eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5) */ -#define SDLK_F6 0x4000003fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6) */ -#define SDLK_F7 0x40000040u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7) */ -#define SDLK_F8 0x40000041u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8) */ -#define SDLK_F9 0x40000042u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9) */ -#define SDLK_F10 0x40000043u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10) */ -#define SDLK_F11 0x40000044u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11) */ -#define SDLK_F12 0x40000045u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12) */ -#define SDLK_PRINTSCREEN 0x40000046u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN) */ -#define SDLK_SCROLLLOCK 0x40000047u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK) */ -#define SDLK_PAUSE 0x40000048u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE) */ -#define SDLK_INSERT 0x40000049u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT) */ -#define SDLK_HOME 0x4000004au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME) */ -#define SDLK_PAGEUP 0x4000004bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP) */ -#define SDLK_END 0x4000004du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END) */ -#define SDLK_PAGEDOWN 0x4000004eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN) */ -#define SDLK_RIGHT 0x4000004fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT) */ -#define SDLK_LEFT 0x40000050u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT) */ -#define SDLK_DOWN 0x40000051u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN) */ -#define SDLK_UP 0x40000052u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP) */ -#define SDLK_NUMLOCKCLEAR 0x40000053u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR) */ -#define SDLK_KP_DIVIDE 0x40000054u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE) */ -#define SDLK_KP_MULTIPLY 0x40000055u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY) */ -#define SDLK_KP_MINUS 0x40000056u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS) */ -#define SDLK_KP_PLUS 0x40000057u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS) */ -#define SDLK_KP_ENTER 0x40000058u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER) */ -#define SDLK_KP_1 0x40000059u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1) */ -#define SDLK_KP_2 0x4000005au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2) */ -#define SDLK_KP_3 0x4000005bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3) */ -#define SDLK_KP_4 0x4000005cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4) */ -#define SDLK_KP_5 0x4000005du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5) */ -#define SDLK_KP_6 0x4000005eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6) */ -#define SDLK_KP_7 0x4000005fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7) */ -#define SDLK_KP_8 0x40000060u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8) */ -#define SDLK_KP_9 0x40000061u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9) */ -#define SDLK_KP_0 0x40000062u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0) */ -#define SDLK_KP_PERIOD 0x40000063u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD) */ -#define SDLK_APPLICATION 0x40000065u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION) */ -#define SDLK_POWER 0x40000066u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER) */ -#define SDLK_KP_EQUALS 0x40000067u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS) */ -#define SDLK_F13 0x40000068u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13) */ -#define SDLK_F14 0x40000069u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14) */ -#define SDLK_F15 0x4000006au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15) */ -#define SDLK_F16 0x4000006bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16) */ -#define SDLK_F17 0x4000006cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17) */ -#define SDLK_F18 0x4000006du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18) */ -#define SDLK_F19 0x4000006eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19) */ -#define SDLK_F20 0x4000006fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20) */ -#define SDLK_F21 0x40000070u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21) */ -#define SDLK_F22 0x40000071u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22) */ -#define SDLK_F23 0x40000072u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23) */ -#define SDLK_F24 0x40000073u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24) */ -#define SDLK_EXECUTE 0x40000074u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE) */ -#define SDLK_HELP 0x40000075u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP) */ -#define SDLK_MENU 0x40000076u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU) */ -#define SDLK_SELECT 0x40000077u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT) */ -#define SDLK_STOP 0x40000078u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP) */ -#define SDLK_AGAIN 0x40000079u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN) */ -#define SDLK_UNDO 0x4000007au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO) */ -#define SDLK_CUT 0x4000007bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT) */ -#define SDLK_COPY 0x4000007cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY) */ -#define SDLK_PASTE 0x4000007du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE) */ -#define SDLK_FIND 0x4000007eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND) */ -#define SDLK_MUTE 0x4000007fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE) */ -#define SDLK_VOLUMEUP 0x40000080u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP) */ -#define SDLK_VOLUMEDOWN 0x40000081u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN) */ -#define SDLK_KP_COMMA 0x40000085u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA) */ -#define SDLK_KP_EQUALSAS400 0x40000086u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400) */ -#define SDLK_ALTERASE 0x40000099u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE) */ -#define SDLK_SYSREQ 0x4000009au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ) */ -#define SDLK_CANCEL 0x4000009bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL) */ -#define SDLK_CLEAR 0x4000009cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR) */ -#define SDLK_PRIOR 0x4000009du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR) */ -#define SDLK_RETURN2 0x4000009eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2) */ -#define SDLK_SEPARATOR 0x4000009fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR) */ -#define SDLK_OUT 0x400000a0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT) */ -#define SDLK_OPER 0x400000a1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER) */ -#define SDLK_CLEARAGAIN 0x400000a2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN) */ -#define SDLK_CRSEL 0x400000a3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL) */ -#define SDLK_EXSEL 0x400000a4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL) */ -#define SDLK_KP_00 0x400000b0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00) */ -#define SDLK_KP_000 0x400000b1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000) */ -#define SDLK_THOUSANDSSEPARATOR 0x400000b2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR) */ -#define SDLK_DECIMALSEPARATOR 0x400000b3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR) */ -#define SDLK_CURRENCYUNIT 0x400000b4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT) */ -#define SDLK_CURRENCYSUBUNIT 0x400000b5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT) */ -#define SDLK_KP_LEFTPAREN 0x400000b6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN) */ -#define SDLK_KP_RIGHTPAREN 0x400000b7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN) */ -#define SDLK_KP_LEFTBRACE 0x400000b8u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE) */ -#define SDLK_KP_RIGHTBRACE 0x400000b9u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE) */ -#define SDLK_KP_TAB 0x400000bau /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB) */ -#define SDLK_KP_BACKSPACE 0x400000bbu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE) */ -#define SDLK_KP_A 0x400000bcu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A) */ -#define SDLK_KP_B 0x400000bdu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B) */ -#define SDLK_KP_C 0x400000beu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C) */ -#define SDLK_KP_D 0x400000bfu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D) */ -#define SDLK_KP_E 0x400000c0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E) */ -#define SDLK_KP_F 0x400000c1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F) */ -#define SDLK_KP_XOR 0x400000c2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR) */ -#define SDLK_KP_POWER 0x400000c3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER) */ -#define SDLK_KP_PERCENT 0x400000c4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT) */ -#define SDLK_KP_LESS 0x400000c5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS) */ -#define SDLK_KP_GREATER 0x400000c6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER) */ -#define SDLK_KP_AMPERSAND 0x400000c7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND) */ -#define SDLK_KP_DBLAMPERSAND 0x400000c8u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND) */ -#define SDLK_KP_VERTICALBAR 0x400000c9u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR) */ -#define SDLK_KP_DBLVERTICALBAR 0x400000cau /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR) */ -#define SDLK_KP_COLON 0x400000cbu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON) */ -#define SDLK_KP_HASH 0x400000ccu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH) */ -#define SDLK_KP_SPACE 0x400000cdu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE) */ -#define SDLK_KP_AT 0x400000ceu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT) */ -#define SDLK_KP_EXCLAM 0x400000cfu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM) */ -#define SDLK_KP_MEMSTORE 0x400000d0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE) */ -#define SDLK_KP_MEMRECALL 0x400000d1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL) */ -#define SDLK_KP_MEMCLEAR 0x400000d2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR) */ -#define SDLK_KP_MEMADD 0x400000d3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD) */ -#define SDLK_KP_MEMSUBTRACT 0x400000d4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT) */ -#define SDLK_KP_MEMMULTIPLY 0x400000d5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY) */ -#define SDLK_KP_MEMDIVIDE 0x400000d6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE) */ -#define SDLK_KP_PLUSMINUS 0x400000d7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS) */ -#define SDLK_KP_CLEAR 0x400000d8u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR) */ -#define SDLK_KP_CLEARENTRY 0x400000d9u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY) */ -#define SDLK_KP_BINARY 0x400000dau /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY) */ -#define SDLK_KP_OCTAL 0x400000dbu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL) */ -#define SDLK_KP_DECIMAL 0x400000dcu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL) */ -#define SDLK_KP_HEXADECIMAL 0x400000ddu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL) */ -#define SDLK_LCTRL 0x400000e0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL) */ -#define SDLK_LSHIFT 0x400000e1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT) */ -#define SDLK_LALT 0x400000e2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT) */ -#define SDLK_LGUI 0x400000e3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI) */ -#define SDLK_RCTRL 0x400000e4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL) */ -#define SDLK_RSHIFT 0x400000e5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT) */ -#define SDLK_RALT 0x400000e6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT) */ -#define SDLK_RGUI 0x400000e7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI) */ -#define SDLK_MODE 0x40000101u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE) */ -#define SDLK_SLEEP 0x40000102u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP) */ -#define SDLK_WAKE 0x40000103u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WAKE) */ -#define SDLK_CHANNEL_INCREMENT 0x40000104u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_INCREMENT) */ -#define SDLK_CHANNEL_DECREMENT 0x40000105u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_DECREMENT) */ -#define SDLK_MEDIA_PLAY 0x40000106u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY) */ -#define SDLK_MEDIA_PAUSE 0x40000107u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PAUSE) */ -#define SDLK_MEDIA_RECORD 0x40000108u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_RECORD) */ -#define SDLK_MEDIA_FAST_FORWARD 0x40000109u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_FAST_FORWARD) */ -#define SDLK_MEDIA_REWIND 0x4000010au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_REWIND) */ -#define SDLK_MEDIA_NEXT_TRACK 0x4000010bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_NEXT_TRACK) */ -#define SDLK_MEDIA_PREVIOUS_TRACK 0x4000010cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PREVIOUS_TRACK) */ -#define SDLK_MEDIA_STOP 0x4000010du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_STOP) */ -#define SDLK_MEDIA_EJECT 0x4000010eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_EJECT) */ -#define SDLK_MEDIA_PLAY_PAUSE 0x4000010fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY_PAUSE) */ -#define SDLK_MEDIA_SELECT 0x40000110u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_SELECT) */ -#define SDLK_AC_NEW 0x40000111u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_NEW) */ -#define SDLK_AC_OPEN 0x40000112u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_OPEN) */ -#define SDLK_AC_CLOSE 0x40000113u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_CLOSE) */ -#define SDLK_AC_EXIT 0x40000114u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_EXIT) */ -#define SDLK_AC_SAVE 0x40000115u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SAVE) */ -#define SDLK_AC_PRINT 0x40000116u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PRINT) */ -#define SDLK_AC_PROPERTIES 0x40000117u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PROPERTIES) */ -#define SDLK_AC_SEARCH 0x40000118u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH) */ -#define SDLK_AC_HOME 0x40000119u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME) */ -#define SDLK_AC_BACK 0x4000011au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK) */ -#define SDLK_AC_FORWARD 0x4000011bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD) */ -#define SDLK_AC_STOP 0x4000011cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP) */ -#define SDLK_AC_REFRESH 0x4000011du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH) */ -#define SDLK_AC_BOOKMARKS 0x4000011eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS) */ -#define SDLK_SOFTLEFT 0x4000011fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTLEFT) */ -#define SDLK_SOFTRIGHT 0x40000120u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT) */ -#define SDLK_CALL 0x40000121u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL) */ -#define SDLK_ENDCALL 0x40000122u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL) */ +#define SDLK_UNKNOWN 0x00000000u /**< 0 */ +#define SDLK_RETURN 0x0000000du /**< '\r' */ +#define SDLK_ESCAPE 0x0000001bu /**< '\x1B' */ +#define SDLK_BACKSPACE 0x00000008u /**< '\b' */ +#define SDLK_TAB 0x00000009u /**< '\t' */ +#define SDLK_SPACE 0x00000020u /**< ' ' */ +#define SDLK_EXCLAIM 0x00000021u /**< '!' */ +#define SDLK_DBLAPOSTROPHE 0x00000022u /**< '"' */ +#define SDLK_HASH 0x00000023u /**< '#' */ +#define SDLK_DOLLAR 0x00000024u /**< '$' */ +#define SDLK_PERCENT 0x00000025u /**< '%' */ +#define SDLK_AMPERSAND 0x00000026u /**< '&' */ +#define SDLK_APOSTROPHE 0x00000027u /**< '\'' */ +#define SDLK_LEFTPAREN 0x00000028u /**< '(' */ +#define SDLK_RIGHTPAREN 0x00000029u /**< ')' */ +#define SDLK_ASTERISK 0x0000002au /**< '*' */ +#define SDLK_PLUS 0x0000002bu /**< '+' */ +#define SDLK_COMMA 0x0000002cu /**< ',' */ +#define SDLK_MINUS 0x0000002du /**< '-' */ +#define SDLK_PERIOD 0x0000002eu /**< '.' */ +#define SDLK_SLASH 0x0000002fu /**< '/' */ +#define SDLK_0 0x00000030u /**< '0' */ +#define SDLK_1 0x00000031u /**< '1' */ +#define SDLK_2 0x00000032u /**< '2' */ +#define SDLK_3 0x00000033u /**< '3' */ +#define SDLK_4 0x00000034u /**< '4' */ +#define SDLK_5 0x00000035u /**< '5' */ +#define SDLK_6 0x00000036u /**< '6' */ +#define SDLK_7 0x00000037u /**< '7' */ +#define SDLK_8 0x00000038u /**< '8' */ +#define SDLK_9 0x00000039u /**< '9' */ +#define SDLK_COLON 0x0000003au /**< ':' */ +#define SDLK_SEMICOLON 0x0000003bu /**< ';' */ +#define SDLK_LESS 0x0000003cu /**< '<' */ +#define SDLK_EQUALS 0x0000003du /**< '=' */ +#define SDLK_GREATER 0x0000003eu /**< '>' */ +#define SDLK_QUESTION 0x0000003fu /**< '?' */ +#define SDLK_AT 0x00000040u /**< '@' */ +#define SDLK_LEFTBRACKET 0x0000005bu /**< '[' */ +#define SDLK_BACKSLASH 0x0000005cu /**< '\\' */ +#define SDLK_RIGHTBRACKET 0x0000005du /**< ']' */ +#define SDLK_CARET 0x0000005eu /**< '^' */ +#define SDLK_UNDERSCORE 0x0000005fu /**< '_' */ +#define SDLK_GRAVE 0x00000060u /**< '`' */ +#define SDLK_A 0x00000061u /**< 'a' */ +#define SDLK_B 0x00000062u /**< 'b' */ +#define SDLK_C 0x00000063u /**< 'c' */ +#define SDLK_D 0x00000064u /**< 'd' */ +#define SDLK_E 0x00000065u /**< 'e' */ +#define SDLK_F 0x00000066u /**< 'f' */ +#define SDLK_G 0x00000067u /**< 'g' */ +#define SDLK_H 0x00000068u /**< 'h' */ +#define SDLK_I 0x00000069u /**< 'i' */ +#define SDLK_J 0x0000006au /**< 'j' */ +#define SDLK_K 0x0000006bu /**< 'k' */ +#define SDLK_L 0x0000006cu /**< 'l' */ +#define SDLK_M 0x0000006du /**< 'm' */ +#define SDLK_N 0x0000006eu /**< 'n' */ +#define SDLK_O 0x0000006fu /**< 'o' */ +#define SDLK_P 0x00000070u /**< 'p' */ +#define SDLK_Q 0x00000071u /**< 'q' */ +#define SDLK_R 0x00000072u /**< 'r' */ +#define SDLK_S 0x00000073u /**< 's' */ +#define SDLK_T 0x00000074u /**< 't' */ +#define SDLK_U 0x00000075u /**< 'u' */ +#define SDLK_V 0x00000076u /**< 'v' */ +#define SDLK_W 0x00000077u /**< 'w' */ +#define SDLK_X 0x00000078u /**< 'x' */ +#define SDLK_Y 0x00000079u /**< 'y' */ +#define SDLK_Z 0x0000007au /**< 'z' */ +#define SDLK_LEFTBRACE 0x0000007bu /**< '{' */ +#define SDLK_PIPE 0x0000007cu /**< '|' */ +#define SDLK_RIGHTBRACE 0x0000007du /**< '}' */ +#define SDLK_TILDE 0x0000007eu /**< '~' */ +#define SDLK_DELETE 0x0000007fu /**< '\x7F' */ +#define SDLK_PLUSMINUS 0x000000b1u /**< '\xB1' */ +#define SDLK_CAPSLOCK 0x40000039u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK) */ +#define SDLK_F1 0x4000003au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1) */ +#define SDLK_F2 0x4000003bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2) */ +#define SDLK_F3 0x4000003cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3) */ +#define SDLK_F4 0x4000003du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4) */ +#define SDLK_F5 0x4000003eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5) */ +#define SDLK_F6 0x4000003fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6) */ +#define SDLK_F7 0x40000040u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7) */ +#define SDLK_F8 0x40000041u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8) */ +#define SDLK_F9 0x40000042u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9) */ +#define SDLK_F10 0x40000043u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10) */ +#define SDLK_F11 0x40000044u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11) */ +#define SDLK_F12 0x40000045u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12) */ +#define SDLK_PRINTSCREEN 0x40000046u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN) */ +#define SDLK_SCROLLLOCK 0x40000047u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK) */ +#define SDLK_PAUSE 0x40000048u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE) */ +#define SDLK_INSERT 0x40000049u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT) */ +#define SDLK_HOME 0x4000004au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME) */ +#define SDLK_PAGEUP 0x4000004bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP) */ +#define SDLK_END 0x4000004du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END) */ +#define SDLK_PAGEDOWN 0x4000004eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN) */ +#define SDLK_RIGHT 0x4000004fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT) */ +#define SDLK_LEFT 0x40000050u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT) */ +#define SDLK_DOWN 0x40000051u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN) */ +#define SDLK_UP 0x40000052u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP) */ +#define SDLK_NUMLOCKCLEAR 0x40000053u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR) */ +#define SDLK_KP_DIVIDE 0x40000054u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE) */ +#define SDLK_KP_MULTIPLY 0x40000055u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY) */ +#define SDLK_KP_MINUS 0x40000056u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS) */ +#define SDLK_KP_PLUS 0x40000057u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS) */ +#define SDLK_KP_ENTER 0x40000058u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER) */ +#define SDLK_KP_1 0x40000059u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1) */ +#define SDLK_KP_2 0x4000005au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2) */ +#define SDLK_KP_3 0x4000005bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3) */ +#define SDLK_KP_4 0x4000005cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4) */ +#define SDLK_KP_5 0x4000005du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5) */ +#define SDLK_KP_6 0x4000005eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6) */ +#define SDLK_KP_7 0x4000005fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7) */ +#define SDLK_KP_8 0x40000060u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8) */ +#define SDLK_KP_9 0x40000061u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9) */ +#define SDLK_KP_0 0x40000062u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0) */ +#define SDLK_KP_PERIOD 0x40000063u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD) */ +#define SDLK_APPLICATION 0x40000065u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION) */ +#define SDLK_POWER 0x40000066u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER) */ +#define SDLK_KP_EQUALS 0x40000067u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS) */ +#define SDLK_F13 0x40000068u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13) */ +#define SDLK_F14 0x40000069u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14) */ +#define SDLK_F15 0x4000006au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15) */ +#define SDLK_F16 0x4000006bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16) */ +#define SDLK_F17 0x4000006cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17) */ +#define SDLK_F18 0x4000006du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18) */ +#define SDLK_F19 0x4000006eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19) */ +#define SDLK_F20 0x4000006fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20) */ +#define SDLK_F21 0x40000070u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21) */ +#define SDLK_F22 0x40000071u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22) */ +#define SDLK_F23 0x40000072u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23) */ +#define SDLK_F24 0x40000073u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24) */ +#define SDLK_EXECUTE 0x40000074u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE) */ +#define SDLK_HELP 0x40000075u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP) */ +#define SDLK_MENU 0x40000076u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU) */ +#define SDLK_SELECT 0x40000077u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT) */ +#define SDLK_STOP 0x40000078u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP) */ +#define SDLK_AGAIN 0x40000079u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN) */ +#define SDLK_UNDO 0x4000007au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO) */ +#define SDLK_CUT 0x4000007bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT) */ +#define SDLK_COPY 0x4000007cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY) */ +#define SDLK_PASTE 0x4000007du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE) */ +#define SDLK_FIND 0x4000007eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND) */ +#define SDLK_MUTE 0x4000007fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE) */ +#define SDLK_VOLUMEUP 0x40000080u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP) */ +#define SDLK_VOLUMEDOWN 0x40000081u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN) */ +#define SDLK_KP_COMMA 0x40000085u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA) */ +#define SDLK_KP_EQUALSAS400 0x40000086u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400) */ +#define SDLK_ALTERASE 0x40000099u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE) */ +#define SDLK_SYSREQ 0x4000009au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ) */ +#define SDLK_CANCEL 0x4000009bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL) */ +#define SDLK_CLEAR 0x4000009cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR) */ +#define SDLK_PRIOR 0x4000009du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR) */ +#define SDLK_RETURN2 0x4000009eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2) */ +#define SDLK_SEPARATOR 0x4000009fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR) */ +#define SDLK_OUT 0x400000a0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT) */ +#define SDLK_OPER 0x400000a1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER) */ +#define SDLK_CLEARAGAIN 0x400000a2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN) */ +#define SDLK_CRSEL 0x400000a3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL) */ +#define SDLK_EXSEL 0x400000a4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL) */ +#define SDLK_KP_00 0x400000b0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00) */ +#define SDLK_KP_000 0x400000b1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000) */ +#define SDLK_THOUSANDSSEPARATOR 0x400000b2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR) */ +#define SDLK_DECIMALSEPARATOR 0x400000b3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR) */ +#define SDLK_CURRENCYUNIT 0x400000b4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT) */ +#define SDLK_CURRENCYSUBUNIT 0x400000b5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT) */ +#define SDLK_KP_LEFTPAREN 0x400000b6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN) */ +#define SDLK_KP_RIGHTPAREN 0x400000b7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN) */ +#define SDLK_KP_LEFTBRACE 0x400000b8u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE) */ +#define SDLK_KP_RIGHTBRACE 0x400000b9u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE) */ +#define SDLK_KP_TAB 0x400000bau /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB) */ +#define SDLK_KP_BACKSPACE 0x400000bbu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE) */ +#define SDLK_KP_A 0x400000bcu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A) */ +#define SDLK_KP_B 0x400000bdu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B) */ +#define SDLK_KP_C 0x400000beu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C) */ +#define SDLK_KP_D 0x400000bfu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D) */ +#define SDLK_KP_E 0x400000c0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E) */ +#define SDLK_KP_F 0x400000c1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F) */ +#define SDLK_KP_XOR 0x400000c2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR) */ +#define SDLK_KP_POWER 0x400000c3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER) */ +#define SDLK_KP_PERCENT 0x400000c4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT) */ +#define SDLK_KP_LESS 0x400000c5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS) */ +#define SDLK_KP_GREATER 0x400000c6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER) */ +#define SDLK_KP_AMPERSAND 0x400000c7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND) */ +#define SDLK_KP_DBLAMPERSAND 0x400000c8u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND) */ +#define SDLK_KP_VERTICALBAR 0x400000c9u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR) */ +#define SDLK_KP_DBLVERTICALBAR 0x400000cau /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR) */ +#define SDLK_KP_COLON 0x400000cbu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON) */ +#define SDLK_KP_HASH 0x400000ccu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH) */ +#define SDLK_KP_SPACE 0x400000cdu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE) */ +#define SDLK_KP_AT 0x400000ceu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT) */ +#define SDLK_KP_EXCLAM 0x400000cfu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM) */ +#define SDLK_KP_MEMSTORE 0x400000d0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE) */ +#define SDLK_KP_MEMRECALL 0x400000d1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL) */ +#define SDLK_KP_MEMCLEAR 0x400000d2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR) */ +#define SDLK_KP_MEMADD 0x400000d3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD) */ +#define SDLK_KP_MEMSUBTRACT 0x400000d4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT) */ +#define SDLK_KP_MEMMULTIPLY 0x400000d5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY) */ +#define SDLK_KP_MEMDIVIDE 0x400000d6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE) */ +#define SDLK_KP_PLUSMINUS 0x400000d7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS) */ +#define SDLK_KP_CLEAR 0x400000d8u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR) */ +#define SDLK_KP_CLEARENTRY 0x400000d9u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY) */ +#define SDLK_KP_BINARY 0x400000dau /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY) */ +#define SDLK_KP_OCTAL 0x400000dbu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL) */ +#define SDLK_KP_DECIMAL 0x400000dcu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL) */ +#define SDLK_KP_HEXADECIMAL 0x400000ddu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL) */ +#define SDLK_LCTRL 0x400000e0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL) */ +#define SDLK_LSHIFT 0x400000e1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT) */ +#define SDLK_LALT 0x400000e2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT) */ +#define SDLK_LGUI 0x400000e3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI) */ +#define SDLK_RCTRL 0x400000e4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL) */ +#define SDLK_RSHIFT 0x400000e5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT) */ +#define SDLK_RALT 0x400000e6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT) */ +#define SDLK_RGUI 0x400000e7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI) */ +#define SDLK_MODE 0x40000101u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE) */ +#define SDLK_SLEEP 0x40000102u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP) */ +#define SDLK_WAKE 0x40000103u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WAKE) */ +#define SDLK_CHANNEL_INCREMENT 0x40000104u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_INCREMENT) */ +#define SDLK_CHANNEL_DECREMENT 0x40000105u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_DECREMENT) */ +#define SDLK_MEDIA_PLAY 0x40000106u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY) */ +#define SDLK_MEDIA_PAUSE 0x40000107u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PAUSE) */ +#define SDLK_MEDIA_RECORD 0x40000108u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_RECORD) */ +#define SDLK_MEDIA_FAST_FORWARD 0x40000109u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_FAST_FORWARD) */ +#define SDLK_MEDIA_REWIND 0x4000010au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_REWIND) */ +#define SDLK_MEDIA_NEXT_TRACK 0x4000010bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_NEXT_TRACK) */ +#define SDLK_MEDIA_PREVIOUS_TRACK 0x4000010cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PREVIOUS_TRACK) */ +#define SDLK_MEDIA_STOP 0x4000010du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_STOP) */ +#define SDLK_MEDIA_EJECT 0x4000010eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_EJECT) */ +#define SDLK_MEDIA_PLAY_PAUSE 0x4000010fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY_PAUSE) */ +#define SDLK_MEDIA_SELECT 0x40000110u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_SELECT) */ +#define SDLK_AC_NEW 0x40000111u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_NEW) */ +#define SDLK_AC_OPEN 0x40000112u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_OPEN) */ +#define SDLK_AC_CLOSE 0x40000113u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_CLOSE) */ +#define SDLK_AC_EXIT 0x40000114u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_EXIT) */ +#define SDLK_AC_SAVE 0x40000115u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SAVE) */ +#define SDLK_AC_PRINT 0x40000116u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PRINT) */ +#define SDLK_AC_PROPERTIES 0x40000117u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PROPERTIES) */ +#define SDLK_AC_SEARCH 0x40000118u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH) */ +#define SDLK_AC_HOME 0x40000119u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME) */ +#define SDLK_AC_BACK 0x4000011au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK) */ +#define SDLK_AC_FORWARD 0x4000011bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD) */ +#define SDLK_AC_STOP 0x4000011cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP) */ +#define SDLK_AC_REFRESH 0x4000011du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH) */ +#define SDLK_AC_BOOKMARKS 0x4000011eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS) */ +#define SDLK_SOFTLEFT 0x4000011fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTLEFT) */ +#define SDLK_SOFTRIGHT 0x40000120u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT) */ +#define SDLK_CALL 0x40000121u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL) */ +#define SDLK_ENDCALL 0x40000122u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL) */ +#define SDLK_LEFT_TAB 0x20000001u /**< Extended key Left Tab */ +#define SDLK_LEVEL5_SHIFT 0x20000002u /**< Extended key Level 5 Shift */ +#define SDLK_MULTI_KEY_COMPOSE 0x20000003u /**< Extended key Multi-key Compose */ +#define SDLK_LMETA 0x20000004u /**< Extended key Left Meta */ +#define SDLK_RMETA 0x20000005u /**< Extended key Right Meta */ +#define SDLK_LHYPER 0x20000006u /**< Extended key Left Hyper */ +#define SDLK_RHYPER 0x20000007u /**< Extended key Right Hyper */ /** * Valid key modifiers (possibly OR'd together). * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint16 SDL_Keymod; #define SDL_KMOD_NONE 0x0000u /**< no modifier is applicable. */ #define SDL_KMOD_LSHIFT 0x0001u /**< the left Shift key is down. */ #define SDL_KMOD_RSHIFT 0x0002u /**< the right Shift key is down. */ +#define SDL_KMOD_LEVEL5 0x0004u /**< the Level 5 Shift key is down. */ #define SDL_KMOD_LCTRL 0x0040u /**< the left Ctrl (Control) key is down. */ #define SDL_KMOD_RCTRL 0x0080u /**< the right Ctrl (Control) key is down. */ #define SDL_KMOD_LALT 0x0100u /**< the left Alt key is down. */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_loadso.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_loadso.h index ab34a38..f8649d7 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_loadso.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_loadso.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -26,6 +26,14 @@ * * System-dependent library loading routines. * + * Shared objects are code that is programmatically loadable at runtime. + * Windows calls these "DLLs", Linux calls them "shared libraries", etc. + * + * To use them, build such a library, then call SDL_LoadObject() on it. Once + * loaded, you can use SDL_LoadFunction() on that object to find the address + * of its exported symbols. When done with the object, call SDL_UnloadObject() + * to dispose of it. + * * Some things to keep in mind: * * - These functions only work on C function names. Other languages may have @@ -38,6 +46,11 @@ * 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. :) + * - Once a library is unloaded, all pointers into it obtained through + * SDL_LoadFunction() become invalid, even if the library is later reloaded. + * Don't unload a library if you plan to use these pointers in the future. + * Notably: beware of giving one of these pointers to atexit(), since it may + * call that pointer after the library unloads. */ #ifndef SDL_loadso_h_ @@ -52,6 +65,17 @@ extern "C" { #endif +/** + * An opaque datatype that represents a loaded shared object. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_LoadObject + * \sa SDL_LoadFunction + * \sa SDL_UnloadObject + */ +typedef struct SDL_SharedObject SDL_SharedObject; + /** * Dynamically load a shared object. * @@ -59,12 +83,14 @@ extern "C" { * \returns an opaque pointer to the object handle or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadFunction * \sa SDL_UnloadObject */ -extern SDL_DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); +extern SDL_DECLSPEC SDL_SharedObject * SDLCALL SDL_LoadObject(const char *sofile); /** * Look up the address of the named function in a shared object. @@ -86,22 +112,29 @@ extern SDL_DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); * \returns a pointer to the function or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadObject */ -extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_LoadFunction(void *handle, const char *name); +extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_LoadFunction(SDL_SharedObject *handle, const char *name); /** * Unload a shared object from memory. * + * Note that any pointers from this object looked up through + * SDL_LoadFunction() will no longer be valid. + * * \param handle a valid shared object handle returned by SDL_LoadObject(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadObject */ -extern SDL_DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); +extern SDL_DECLSPEC void SDLCALL SDL_UnloadObject(SDL_SharedObject *handle); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_locale.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_locale.h index 85d7750..902843e 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_locale.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_locale.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,12 @@ * # CategoryLocale * * SDL locale services. + * + * This provides a way to get a list of preferred locales (language plus + * country) for the user. There is exactly one function: + * SDL_GetPreferredLocales(), which handles all the heavy lifting, and offers + * documentation on all the strange ways humans might have configured their + * language settings. */ #ifndef SDL_locale_h @@ -47,7 +53,7 @@ extern "C" { * would be "en"), and the country, if not NULL, will be an ISO-3166 country * code (so Canada would be "CA"). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPreferredLocales */ @@ -96,7 +102,7 @@ typedef struct SDL_Locale * allocation that should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Locale ** SDLCALL SDL_GetPreferredLocales(int *count); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_log.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_log.h index deda238..a56476c 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_log.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_log.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,7 @@ /** * # CategoryLog * - * Simple log messages with priorities and categories. A message’s + * Simple log messages with priorities and categories. A message's * SDL_LogPriority signifies how important the message is. A message's * SDL_LogCategory signifies from what domain it belongs to. Every category * has a minimum priority specified: when a message belongs to that category, @@ -76,7 +76,7 @@ extern "C" { * 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 ERROR level. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_LogCategory { @@ -87,12 +87,11 @@ typedef enum SDL_LogCategory SDL_LOG_CATEGORY_AUDIO, SDL_LOG_CATEGORY_VIDEO, SDL_LOG_CATEGORY_RENDER, - SDL_LOG_CATEGORY_GPU, SDL_LOG_CATEGORY_INPUT, SDL_LOG_CATEGORY_TEST, + SDL_LOG_CATEGORY_GPU, /* Reserved for future SDL library use */ - SDL_LOG_CATEGORY_RESERVED1, SDL_LOG_CATEGORY_RESERVED2, SDL_LOG_CATEGORY_RESERVED3, SDL_LOG_CATEGORY_RESERVED4, @@ -117,17 +116,19 @@ typedef enum SDL_LogCategory /** * The predefined log priorities * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_LogPriority { - SDL_LOG_PRIORITY_VERBOSE = 1, + SDL_LOG_PRIORITY_INVALID, + SDL_LOG_PRIORITY_TRACE, + SDL_LOG_PRIORITY_VERBOSE, 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_LOG_PRIORITY_COUNT } SDL_LogPriority; @@ -136,7 +137,9 @@ typedef enum SDL_LogPriority * * \param priority the SDL_LogPriority to assign. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResetLogPriorities * \sa SDL_SetLogPriority @@ -149,14 +152,15 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriorities(SDL_LogPriority priority); * \param category the category to assign a priority to. * \param priority the SDL_LogPriority to assign. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetLogPriority * \sa SDL_ResetLogPriorities * \sa SDL_SetLogPriorities */ -extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriority(int category, - SDL_LogPriority priority); +extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriority(int category, SDL_LogPriority priority); /** * Get the priority of a particular log category. @@ -164,7 +168,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriority(int category, * \param category the category to query. * \returns the SDL_LogPriority for the requested category. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetLogPriority */ @@ -175,7 +181,9 @@ extern SDL_DECLSPEC SDL_LogPriority SDLCALL SDL_GetLogPriority(int category); * * This is called by SDL_Quit(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetLogPriorities * \sa SDL_SetLogPriority @@ -192,15 +200,17 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetLogPriorities(void); * \param priority the SDL_LogPriority to modify. * \param prefix the prefix to use for that log priority, or NULL to use no * prefix. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetLogPriorities * \sa SDL_SetLogPriority */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLogPriorityPrefix(SDL_LogPriority priority, const char *prefix); +extern SDL_DECLSPEC bool SDLCALL SDL_SetLogPriorityPrefix(SDL_LogPriority priority, const char *prefix); /** * Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO. @@ -209,7 +219,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLogPriorityPrefix(SDL_LogPriority pr * \param ... additional parameters matching % tokens in the `fmt` string, if * any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LogCritical * \sa SDL_LogDebug @@ -217,11 +229,37 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLogPriorityPrefix(SDL_LogPriority pr * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ extern SDL_DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); +/** + * Log a message with SDL_LOG_PRIORITY_TRACE. + * + * \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. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogTrace + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern SDL_DECLSPEC void SDLCALL SDL_LogTrace(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + /** * Log a message with SDL_LOG_PRIORITY_VERBOSE. * @@ -230,7 +268,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fm * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -251,7 +291,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_ * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -259,6 +301,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_ * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -272,7 +315,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogDebug(int category, SDL_PRINTF_FORMAT_ST * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -280,6 +325,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogDebug(int category, SDL_PRINTF_FORMAT_ST * \sa SDL_LogError * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -293,7 +339,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STR * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -302,6 +350,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STR * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose */ extern SDL_DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); @@ -314,7 +363,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STR * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -322,6 +373,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STR * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -335,7 +387,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogError(int category, SDL_PRINTF_FORMAT_ST * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogDebug @@ -343,6 +397,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogError(int category, SDL_PRINTF_FORMAT_ST * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -357,7 +412,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogCritical(int category, SDL_PRINTF_FORMAT * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -365,6 +422,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogCritical(int category, SDL_PRINTF_FORMAT * \sa SDL_LogError * \sa SDL_LogInfo * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -380,7 +438,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogMessage(int category, * \param fmt a printf() style message format string. * \param ap a variable argument list. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -388,6 +448,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogMessage(int category, * \sa SDL_LogError * \sa SDL_LogInfo * \sa SDL_LogMessage + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -398,7 +459,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogMessageV(int category, /** * The prototype for the log output callback function. * - * This function is called by SDL when there is new text to be logged. + * This function is called by SDL when there is new text to be logged. A mutex + * is held so that this function is never called by more than one thread at + * once. * * \param userdata what was passed as `userdata` to * SDL_SetLogOutputFunction(). @@ -406,10 +469,24 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogMessageV(int category, * \param priority the priority of the message. * \param message the message being output. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef void (SDLCALL *SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message); +/** + * Get the default log output function. + * + * \returns the default log output callback. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetLogOutputFunction + * \sa SDL_GetLogOutputFunction + */ +extern SDL_DECLSPEC SDL_LogOutputFunction SDLCALL SDL_GetDefaultLogOutputFunction(void); + /** * Get the current log output function. * @@ -418,8 +495,11 @@ typedef void (SDLCALL *SDL_LogOutputFunction)(void *userdata, int category, SDL_ * \param userdata a pointer filled in with the pointer that is passed to * `callback`. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetDefaultLogOutputFunction * \sa SDL_SetLogOutputFunction */ extern SDL_DECLSPEC void SDLCALL SDL_GetLogOutputFunction(SDL_LogOutputFunction *callback, void **userdata); @@ -430,8 +510,11 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetLogOutputFunction(SDL_LogOutputFunction * \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 3.0.0. + * \threadsafety It is safe to call this function from any thread. * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetDefaultLogOutputFunction * \sa SDL_GetLogOutputFunction */ extern SDL_DECLSPEC void SDLCALL SDL_SetLogOutputFunction(SDL_LogOutputFunction callback, void *userdata); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_main.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_main.h index de3c187..2e7a2eb 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_main.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_main.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,13 +22,29 @@ /** * # CategoryMain * - * Redefine main() on some platforms so that it is called by SDL. + * Redefine main() if necessary so that it is called by SDL. * - * For details on how SDL_main works, and how to use it, please refer to: + * In order to make this consistent on all platforms, the application's main() + * should look like this: + * + * ```c + * int main(int argc, char *argv[]) + * { + * } + * ``` + * + * SDL will take care of platform specific details on how it gets called. + * + * This is also where an app can be configured to use the main callbacks, via + * the SDL_MAIN_USE_CALLBACKS macro. + * + * This is a "single-header library," which is to say that including this + * header inserts code into your program, and you should only include it once + * in most cases. SDL.h does not include this header automatically. + * + * For more information, see: * * https://wiki.libsdl.org/SDL3/README/main-functions - * - * (or docs/README-main-functions.md in the SDL source tree) */ #ifndef SDL_main_h_ @@ -39,8 +55,96 @@ #include #include +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Inform SDL that the app is providing an entry point instead of SDL. + * + * SDL does not define this macro, but will check if it is defined when + * including `SDL_main.h`. If defined, SDL will expect the app to provide the + * proper entry point for the platform, and all the other magic details + * needed, like manually calling SDL_SetMainReady. + * + * Please see [README/main-functions](README/main-functions), (or + * docs/README-main-functions.md in the source tree) for a more detailed + * explanation. + * + * \since This macro is used by the headers since SDL 3.2.0. + */ +#define SDL_MAIN_HANDLED 1 + +/** + * Inform SDL to use the main callbacks instead of main. + * + * SDL does not define this macro, but will check if it is defined when + * including `SDL_main.h`. If defined, SDL will expect the app to provide + * several functions: SDL_AppInit, SDL_AppEvent, SDL_AppIterate, and + * SDL_AppQuit. The app should not provide a `main` function in this case, and + * doing so will likely cause the build to fail. + * + * Please see [README/main-functions](README/main-functions), (or + * docs/README-main-functions.md in the source tree) for a more detailed + * explanation. + * + * \since This macro is used by the headers since SDL 3.2.0. + * + * \sa SDL_AppInit + * \sa SDL_AppEvent + * \sa SDL_AppIterate + * \sa SDL_AppQuit + */ +#define SDL_MAIN_USE_CALLBACKS 1 + +/** + * Defined if the target platform offers a special mainline through SDL. + * + * This won't be defined otherwise. If defined, SDL's headers will redefine + * `main` to `SDL_main`. + * + * This macro is defined by `SDL_main.h`, which is not automatically included + * by `SDL.h`. + * + * Even if available, an app can define SDL_MAIN_HANDLED and provide their + * own, if they know what they're doing. + * + * This macro is used internally by SDL, and apps probably shouldn't rely on it. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_MAIN_AVAILABLE + +/** + * Defined if the target platform _requires_ a special mainline through SDL. + * + * This won't be defined otherwise. If defined, SDL's headers will redefine + * `main` to `SDL_main`. + * + * This macro is defined by `SDL_main.h`, which is not automatically included + * by `SDL.h`. + * + * Even if required, an app can define SDL_MAIN_HANDLED and provide their + * own, if they know what they're doing. + * + * This macro is used internally by SDL, and apps probably shouldn't rely on it. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_MAIN_NEEDED + +#endif + +#if defined(__has_include) + #if __has_include("SDL_main_private.h") && __has_include("SDL_main_impl_private.h") + #define SDL_PLATFORM_PRIVATE_MAIN + #endif +#endif + #ifndef SDL_MAIN_HANDLED - #ifdef SDL_PLATFORM_WIN32 + #if defined(SDL_PLATFORM_PRIVATE_MAIN) + /* Private platforms may have their own ideas about entry points. */ + #include "SDL_main_private.h" + + #elif defined(SDL_PLATFORM_WIN32) /* On Windows SDL provides WinMain(), which parses the command line and passes the arguments to your main function. @@ -48,20 +152,6 @@ */ #define SDL_MAIN_AVAILABLE - #elif defined(SDL_PLATFORM_WINRT) - /* On WinRT, SDL provides a main function that initializes CoreApplication, - creating an instance of IFrameworkView in the process. - - Ideally, #include'ing SDL_main.h is enough to get a main() function working. - However, that requires the source file your main() is in to be compiled - as C++ *and* with the /ZW compiler flag. If that's not feasible, add an - otherwise empty .cpp file that only contains `#include ` - and build that with /ZW (still include SDL_main.h in your other file with main()!). - In XAML apps, instead the function SDL_RunApp() must be called with a pointer - to the Direct3D-hosted XAML control passed in as the "reserved" argument. - */ - #define SDL_MAIN_NEEDED - #elif defined(SDL_PLATFORM_GDK) /* On GDK, SDL provides a main function that initializes the game runtime. @@ -91,8 +181,14 @@ */ #define SDL_MAIN_NEEDED - /* We need to export SDL_main so it can be launched from Java */ - #define SDLMAIN_DECLSPEC SDL_DECLSPEC + /* As this is launched from Java, the real entry point (main() function) + is outside of the the binary built from this code. + This define makes sure that, unlike on other platforms, SDL_main.h + and SDL_main_impl.h export an `SDL_main()` function (to be called + from Java), but don't implement a native `int main(int argc, char* argv[])` + or similar. + */ + #define SDL_MAIN_EXPORTED #elif defined(SDL_PLATFORM_EMSCRIPTEN) /* On Emscripten, SDL provides a main function that converts URL @@ -129,60 +225,36 @@ */ #define SDL_MAIN_AVAILABLE - #elif defined(SDL_PLATFORM_NGAGE) - /* - TODO: not sure if it should be SDL_MAIN_NEEDED, in SDL2 ngage had a - main implementation, but wasn't mentioned in SDL_main.h - */ - #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: - * - * ```c - * #ifdef __cplusplus - * extern "C" - * #endif - * int main(int argc, char *argv[]) - * { - * } - * ``` - */ #ifdef SDL_WIKI_DOCUMENTATION_SECTION /** - * Inform SDL to use the main callbacks instead of main. + * A macro to tag a main entry point function as exported. * - * SDL does not define this macro, but will check if it is defined when - * including `SDL_main.h`. If defined, SDL will expect the app to provide - * several functions: SDL_AppInit, SDL_AppEvent, SDL_AppIterate, and - * SDL_AppQuit. The app should not provide a `main` function in this case, and - * doing so will likely cause the build to fail. + * Most platforms don't need this, and the macro will be defined to nothing. + * Some, like Android, keep the entry points in a shared library and need to + * explicitly export the symbols. * - * Please see [README/main-functions](README/main-functions), (or - * docs/README-main-functions.md in the source tree) for a more detailed - * explanation. + * External code rarely needs this, and if it needs something, it's almost + * always SDL_DECLSPEC instead. * - * \since This macro is used by the headers since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * - * \sa SDL_AppInit - * \sa SDL_AppEvent - * \sa SDL_AppIterate - * \sa SDL_AppQuit + * \sa SDL_DECLSPEC */ -#define SDL_MAIN_USE_CALLBACKS 1 -#endif +#define SDLMAIN_DECLSPEC + +#elif defined(SDL_MAIN_EXPORTED) +/* We need to export SDL_main so it can be launched from external code, + like SDLActivity.java on Android */ +#define SDLMAIN_DECLSPEC SDL_DECLSPEC +#else +/* usually this is empty */ +#define SDLMAIN_DECLSPEC +#endif /* SDL_MAIN_EXPORTED */ #if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) || defined(SDL_MAIN_USE_CALLBACKS) #define main SDL_main @@ -248,6 +320,8 @@ extern "C" { * SDL_APP_SUCCESS, SDL calls SDL_AppQuit and terminates with an exit code * that reports success to the platform. * + * This function is called by SDL on the main thread. + * * \param appstate a place where the app can optionally store a pointer for * future use. * \param argc the standard ANSI C main's argc; number of elements in `argv`. @@ -256,9 +330,7 @@ extern "C" { * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * - * \threadsafety This function is not thread safe. - * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppIterate * \sa SDL_AppEvent @@ -301,13 +373,16 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppInit(void **appstate, int a * SDL_AppQuit and terminates with an exit code that reports success to the * platform. * + * This function is called by SDL on the main thread. + * * \param appstate an optional pointer, provided by the app in SDL_AppInit. * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * - * \threadsafety This function is not thread safe. + * \threadsafety This function may get called concurrently with SDL_AppEvent() + * for events not pushed on the main thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppInit * \sa SDL_AppEvent @@ -320,15 +395,15 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppIterate(void *appstate); * Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a * standard "main" function, you should not supply this. * - * This function is called as needed by SDL after SDL_AppInit returns 0; It is - * called once for each new event. + * This function is called as needed by SDL after SDL_AppInit returns + * SDL_APP_CONTINUE. It is called once for each new event. * * There is (currently) no guarantee about what thread this will be called * from; whatever thread pushes an event onto SDL's queue will trigger this * function. SDL is responsible for pumping the event queue between each call * to SDL_AppIterate, so in normal operation one should only get events in a * serial fashion, but be careful if you have a thread that explicitly calls - * SDL_PushEvent. + * SDL_PushEvent. SDL itself will push events to the queue on the main thread. * * Events sent to this function are not owned by the app; if you need to save * the data, you should copy it. @@ -352,14 +427,16 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppIterate(void *appstate); * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * - * \threadsafety This function is not thread safe. + * \threadsafety This function may get called concurrently with + * SDL_AppIterate() or SDL_AppQuit() for events not pushed from + * the main thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppInit * \sa SDL_AppIterate */ -extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, const SDL_Event *event); +extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, SDL_Event *event); /** * App-implemented deinit entry point for SDL_MAIN_USE_CALLBACKS apps. @@ -385,15 +462,19 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, const * function call is the last time this pointer will be provided, so any * resources to it should be cleaned up here. * + * This function is called by SDL on the main thread. + * * \param appstate an optional pointer, provided by the app in SDL_AppInit. + * \param result the result code that terminated the app (success or failure). * - * \threadsafety This function is not thread safe. + * \threadsafety SDL_AppEvent() may get called concurrently with this function + * if other threads that push events are still active. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppInit */ -extern SDLMAIN_DECLSPEC void SDLCALL SDL_AppQuit(void *appstate); +extern SDLMAIN_DECLSPEC void SDLCALL SDL_AppQuit(void *appstate, SDL_AppResult result); #endif /* SDL_MAIN_USE_CALLBACKS */ @@ -407,7 +488,7 @@ extern SDLMAIN_DECLSPEC void SDLCALL SDL_AppQuit(void *appstate); * program completion, and small non-zero values are considered * errors. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef int (SDLCALL *SDL_main_func)(int argc, char *argv[]); @@ -440,7 +521,7 @@ typedef int (SDLCALL *SDL_main_func)(int argc, char *argv[]); * * \threadsafety This is the program entry point. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDLMAIN_DECLSPEC int SDLCALL SDL_main(int argc, char *argv[]); @@ -453,7 +534,7 @@ extern SDLMAIN_DECLSPEC int SDLCALL SDL_main(int argc, char *argv[]); * will not be changed it is necessary to define SDL_MAIN_HANDLED before * including SDL.h. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init */ @@ -485,7 +566,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetMainReady(void); * \threadsafety Generally this is called once, near startup, from the * process's initial thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_RunApp(int argc, char *argv[], SDL_main_func mainFunction, void *reserved); @@ -512,12 +593,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_RunApp(int argc, char *argv[], SDL_main_func * \threadsafety It is not safe to call this anywhere except as the only * function call in SDL_main. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_EnterAppMainCallbacks(int argc, char *argv[], SDL_AppInit_func appinit, SDL_AppIterate_func appiter, SDL_AppEvent_func appevent, SDL_AppQuit_func appquit); -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) /** * Register a win32 window class for SDL's use. @@ -538,12 +619,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_EnterAppMainCallbacks(int argc, char *argv[] * what is specified here. * \param hInst the HINSTANCE to use in WNDCLASSEX::hInstance. If zero, SDL * will use `GetModuleHandle(NULL)` instead. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst); +extern SDL_DECLSPEC bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst); /** * Deregister the win32 window class from an SDL_RegisterApp call. @@ -558,23 +639,22 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RegisterApp(const char *name, Uint32 st * deregistered when the registration counter in SDL_RegisterApp decrements to * zero through calls to this function. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnregisterApp(void); -#endif /* defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) */ - -#ifdef SDL_PLATFORM_GDK +#endif /* defined(SDL_PLATFORM_WINDOWS) */ /** * Callback from the application to let the suspend continue. * - * \since This function is available since SDL 3.0.0. + * This function is only needed for Xbox GDK support; all other platforms will + * do nothing and set an "unsupported" error message. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void); -#endif /* SDL_PLATFORM_GDK */ - #ifdef __cplusplus } #endif @@ -583,29 +663,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void); #if !defined(SDL_MAIN_HANDLED) && !defined(SDL_MAIN_NOIMPL) /* include header-only SDL_main implementations */ - #if defined(SDL_MAIN_USE_CALLBACKS) \ - || defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) || defined(SDL_PLATFORM_IOS) || defined(SDL_PLATFORM_TVOS) \ - || defined(SDL_PLATFORM_3DS) || defined(SDL_PLATFORM_NGAGE) || defined(SDL_PLATFORM_PS2) || defined(SDL_PLATFORM_PSP) \ - || defined(SDL_PLATFORM_EMSCRIPTEN) - + #if defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) /* platforms which main (-equivalent) can be implemented in plain C */ #include - - #elif defined(SDL_PLATFORM_WINRT) /* C++ platforms */ - #ifdef __cplusplus - #include - #else - /* Note: to get rid of the following warning, you can #define SDL_MAIN_NOIMPL before including SDL_main.h - * in your C sourcefile that contains the standard main. Do *not* use SDL_MAIN_HANDLED for that, then SDL_main won't find your main()! - */ - #ifdef _MSC_VER - #pragma message("Note: Your platform needs the SDL_main implementation in a C++ source file. You can keep your main() in plain C (then continue including SDL_main.h there!) and create a fresh .cpp file that only contains #include ") - #elif defined(__GNUC__) /* gcc, clang, mingw and compatible are matched by this and have #warning */ - #warning "Note: Your platform needs the SDL_main implementation in a C++ source file. You can keep your main() in plain C and create a fresh .cpp file that only contains #include " - #endif /* __GNUC__ */ - #endif /* __cplusplus */ - - #endif /* C++ platforms like SDL_PLATFORM_WINRT etc */ + #endif #endif #endif /* SDL_main_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_main_impl.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_main_impl.h index ad122df..14ebb42 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_main_impl.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_main_impl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -29,7 +29,7 @@ #endif /* if someone wants to include SDL_main.h but doesn't want the main handing magic, - (maybe to call SDL_RegisterApp()) they can #define SDL_MAIN_HANDLED first + (maybe to call SDL_RegisterApp()) they can #define SDL_MAIN_HANDLED first. SDL_MAIN_NOIMPL is for SDL-internal usage (only affects implementation, not definition of SDL_MAIN_AVAILABLE etc in SDL_main.h) and if the user wants to have the SDL_main implementation (from this header) in another source file @@ -64,10 +64,15 @@ #endif /* SDL_MAIN_USE_CALLBACKS */ - /* set up the usual SDL_main stuff if we're not using callbacks or if we are but need the normal entry point. */ - #if !defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_CALLBACK_STANDARD) + /* set up the usual SDL_main stuff if we're not using callbacks or if we are but need the normal entry point, + unless the real entry point needs to be somewhere else entirely, like Android where it's in Java code */ + #if (!defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_CALLBACK_STANDARD)) && !defined(SDL_MAIN_EXPORTED) - #if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) + #if defined(SDL_PLATFORM_PRIVATE_MAIN) + /* Private platforms may have their own ideas about entry points. */ + #include "SDL_main_impl_private.h" + + #elif defined(SDL_PLATFORM_WINDOWS) /* these defines/typedefs are needed for the WinMain() definition */ #ifndef WINAPI @@ -82,7 +87,7 @@ #if defined(_MSC_VER) && !defined(SDL_PLATFORM_GDK) /* This is where execution begins [console apps] */ - #if defined( UNICODE ) && UNICODE + #if defined(UNICODE) && UNICODE int wmain(int argc, wchar_t *wargv[], wchar_t *wenvp) { (void)argc; @@ -107,7 +112,7 @@ extern "C" { #endif - #if defined( UNICODE ) && UNICODE + #if defined(UNICODE) && UNICODE int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrev, PWSTR szCmdLine, int sw) #else /* ANSI */ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) @@ -124,83 +129,7 @@ } /* extern "C" */ #endif - /* end of SDL_PLATFORM_WIN32 and SDL_PLATFORM_GDK impls */ - - #elif defined(SDL_PLATFORM_WINRT) - - /* WinRT main based on SDL_winrt_main_NonXAML.cpp, placed in the public domain by David Ludwig 3/13/14 */ - - #include - - /* At least one file in any SDL/WinRT app appears to require compilation - with C++/CX, otherwise a Windows Metadata file won't get created, and - an APPX0702 build error can appear shortly after linking. - - The following set of preprocessor code forces this file to be compiled - as C++/CX, which appears to cause Visual C++ 2012's build tools to - create this .winmd file, and will help allow builds of SDL/WinRT apps - to proceed without error. - - If other files in an app's project enable C++/CX compilation, then it might - be possible for the .cpp file including SDL_main.h to be compiled without /ZW, - for Visual C++'s build tools to create a winmd file, and for the app to - build without APPX0702 errors. In this case, if - SDL_WINRT_METADATA_FILE_AVAILABLE is defined as a C/C++ macro, then - the #error (to force C++/CX compilation) will be disabled. - - Please note that /ZW can be specified on a file-by-file basis. To do this, - right click on the file in Visual C++, click Properties, then change the - setting through the dialog that comes up. - */ - #ifndef SDL_WINRT_METADATA_FILE_AVAILABLE - #if !defined(__cplusplus) || (!defined(__cplusplus_winrt) && _MSVC_LANG < 202002L) - #error The C++ file that includes SDL_main.h must be compiled as C++ code with /ZW, otherwise build errors due to missing .winmd files can occur. - #endif - #endif - - /* Prevent MSVC++ from warning about threading models when defining our - custom WinMain. The threading model will instead be set via a direct - call to Windows::Foundation::Initialize (rather than via an attributed - function). - - To note, this warning (C4447) does not seem to come up unless this file - is compiled with C++/CX enabled (via the /ZW compiler flag). - */ - #ifdef _MSC_VER - #pragma warning(disable : 4447) - /* Make sure the function to initialize the Windows Runtime gets linked in. */ - #pragma comment(lib, "runtimeobject.lib") - #endif - - #ifdef __cplusplus - extern "C" { - #endif - int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int) - { - return SDL_RunApp(0, NULL, SDL_main, NULL); - } - #if _MSVC_LANG >= 202002L - int main(int argc, char** argv) { - return SDL_RunApp(argc, argv, SDL_main, NULL); - } - #endif - #ifdef __cplusplus - } /* extern "C" */ - #endif - - /* end of WinRT impl */ - - #elif defined(SDL_PLATFORM_NGAGE) - /* same typedef as in ngage SDKs e32def.h */ - typedef signed int TInt; - /* TODO: if it turns out that this only works when built as C++, - move SDL_PLATFORM_NGAGE into the C++ section in SDL_main.h */ - TInt E32Main() - { - return SDL_RunApp(0, NULL, SDL_main, NULL); - } - - /* end of SDL_PLATFORM_NGAGE impl */ + /* end of SDL_PLATFORM_WINDOWS impls */ #else /* platforms that use a standard main() and just call SDL_RunApp(), like iOS and 3DS */ int main(int argc, char *argv[]) diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_messagebox.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_messagebox.h index c626b22..365ae36 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_messagebox.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_messagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,18 @@ /** * # CategoryMessagebox * - * Message box support routines. + * SDL offers a simple message box API, which is useful for simple alerts, + * such as informing the user when something fatal happens at startup without + * the need to build a UI for it (or informing the user _before_ your UI is + * ready). + * + * These message boxes are native system dialogs where possible. + * + * There is both a customizable function (SDL_ShowMessageBox()) that offers + * lots of options for what to display and reports on what choice the user + * made, and also a much-simplified version (SDL_ShowSimpleMessageBox()), + * merely takes a text message and title, and waits until the user presses a + * single "OK" UI button. Often, this is all that is necessary. */ #ifndef SDL_messagebox_h_ @@ -39,11 +50,11 @@ extern "C" { #endif /** - * SDL_MessageBox flags. + * Message box flags. * * If supported will display warning icon, etc. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_MessageBoxFlags; @@ -56,7 +67,7 @@ typedef Uint32 SDL_MessageBoxFlags; /** * SDL_MessageBoxButtonData flags. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_MessageBoxButtonFlags; @@ -66,7 +77,7 @@ typedef Uint32 SDL_MessageBoxButtonFlags; /** * Individual button data. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxButtonData { @@ -78,7 +89,7 @@ typedef struct SDL_MessageBoxButtonData /** * RGB value used in a message box color scheme * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxColor { @@ -96,23 +107,23 @@ typedef enum SDL_MessageBoxColorType SDL_MESSAGEBOX_COLOR_BUTTON_BORDER, SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND, SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED, - SDL_MESSAGEBOX_COLOR_MAX /**< Size of the colors array of SDL_MessageBoxColorScheme. */ + SDL_MESSAGEBOX_COLOR_COUNT /**< Size of the colors array of SDL_MessageBoxColorScheme. */ } SDL_MessageBoxColorType; /** * A set of colors to use for message box dialogs * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxColorScheme { - SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_MAX]; + SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_COUNT]; } SDL_MessageBoxColorScheme; /** * MessageBox structure containing title, text, window, etc. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxData { @@ -154,14 +165,14 @@ typedef struct SDL_MessageBoxData * other options. * \param buttonid the pointer to which user id of hit button should be * copied. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowSimpleMessageBox */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); /** * Display a simple modal message box. @@ -193,17 +204,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData * to stderr if you can. * * \param flags an SDL_MessageBoxFlags value. - * \param title uTF-8 title text. - * \param message uTF-8 message text. + * \param title UTF-8 title text. + * \param message UTF-8 message text. * \param window the parent window, or NULL for no parent. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowMessageBox */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowSimpleMessageBox(SDL_MessageBoxFlags flags, const char *title, const char *message, SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowSimpleMessageBox(SDL_MessageBoxFlags flags, const char *title, const char *message, SDL_Window *window); /* Ends C function definitions when using C++ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_metal.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_metal.h index 7c9aece..14b1bc8 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_metal.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_metal.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,10 @@ * # CategoryMetal * * Functions to creating Metal layers and views on SDL windows. + * + * This provides some platform-specific glue for Apple platforms. Most macOS + * and iOS apps can use SDL without these functions, but this API they can be + * useful for specific OS-level integration tasks. */ #ifndef SDL_metal_h_ @@ -39,7 +43,7 @@ extern "C" { /** * A handle to a CAMetalLayer-backed NSView (macOS) or UIView (iOS/tvOS). * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef void *SDL_MetalView; @@ -61,7 +65,7 @@ typedef void *SDL_MetalView; * \param window the window. * \returns handle NSView or UIView. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Metal_DestroyView * \sa SDL_Metal_GetLayer @@ -76,7 +80,7 @@ extern SDL_DECLSPEC SDL_MetalView SDLCALL SDL_Metal_CreateView(SDL_Window *windo * * \param view the SDL_MetalView object. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Metal_CreateView */ @@ -88,7 +92,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_Metal_DestroyView(SDL_MetalView view); * \param view the SDL_MetalView object. * \returns a pointer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void * SDLCALL SDL_Metal_GetLayer(SDL_MetalView view); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_misc.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_misc.h index 23317e0..3dd6fcd 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_misc.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_misc.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -62,12 +62,12 @@ extern "C" { * * \param url a valid URL/URI to open. Use `file:///full/path/to/file` for * local files, if supported. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_OpenURL(const char *url); +extern SDL_DECLSPEC bool SDLCALL SDL_OpenURL(const char *url); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_mouse.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_mouse.h index 90c8560..18856e2 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_mouse.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_mouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,36 @@ /** * # CategoryMouse * - * SDL mouse handling. + * Any GUI application has to deal with the mouse, and SDL provides functions + * to manage mouse input and the displayed cursor. + * + * Most interactions with the mouse will come through the event subsystem. + * Moving a mouse generates an SDL_EVENT_MOUSE_MOTION event, pushing a button + * generates SDL_EVENT_MOUSE_BUTTON_DOWN, etc, but one can also query the + * current state of the mouse at any time with SDL_GetMouseState(). + * + * For certain games, it's useful to disassociate the mouse cursor from mouse + * input. An FPS, for example, would not want the player's motion to stop as + * the mouse hits the edge of the window. For these scenarios, use + * SDL_SetWindowRelativeMouseMode(), which hides the cursor, grabs mouse input + * to the window, and reads mouse input no matter how far it moves. + * + * Games that want the system to track the mouse but want to draw their own + * cursor can use SDL_HideCursor() and SDL_ShowCursor(). It might be more + * efficient to let the system manage the cursor, if possible, using + * SDL_SetCursor() with a custom image made through SDL_CreateColorCursor(), + * or perhaps just a specific system cursor from SDL_CreateSystemCursor(). + * + * SDL can, on many platforms, differentiate between multiple connected mice, + * allowing for interesting input scenarios and multiplayer games. They can be + * enumerated with SDL_GetMice(), and SDL will send SDL_EVENT_MOUSE_ADDED and + * SDL_EVENT_MOUSE_REMOVED events as they are connected and unplugged. + * + * Since many apps only care about basic mouse input, SDL offers a virtual + * mouse device for touch and pen input, which often can make a desktop + * application work on a touchscreen phone without any code changes. Apps that + * care about touch/pen separately from mouse input should filter out events + * with a `which` field of SDL_TOUCH_MOUSEID/SDL_PEN_MOUSEID. */ #ifndef SDL_mouse_h_ @@ -30,6 +59,7 @@ #include #include +#include #include #include @@ -46,7 +76,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_MouseID; @@ -55,14 +85,14 @@ typedef Uint32 SDL_MouseID; * * This is opaque data. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Cursor SDL_Cursor; /** * Cursor types for SDL_CreateSystemCursor(). * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_SystemCursor { @@ -86,13 +116,13 @@ typedef enum SDL_SystemCursor SDL_SYSTEM_CURSOR_S_RESIZE, /**< Window resize bottom. May be NS_RESIZE. */ SDL_SYSTEM_CURSOR_SW_RESIZE, /**< Window resize bottom-left. May be NESW_RESIZE. */ SDL_SYSTEM_CURSOR_W_RESIZE, /**< Window resize left. May be EW_RESIZE. */ - SDL_NUM_SYSTEM_CURSORS + SDL_SYSTEM_CURSOR_COUNT } SDL_SystemCursor; /** * Scroll direction types for the Scroll event * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_MouseWheelDirection { @@ -109,7 +139,7 @@ typedef enum SDL_MouseWheelDirection * - Button 4: Side mouse button 1 * - Button 5: Side mouse button 2 * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetMouseState * \sa SDL_GetGlobalMouseState @@ -123,12 +153,12 @@ typedef Uint32 SDL_MouseButtonFlags; #define SDL_BUTTON_X1 4 #define SDL_BUTTON_X2 5 -#define SDL_BUTTON(X) (1u << ((X)-1)) -#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) +#define SDL_BUTTON_MASK(X) (1u << ((X)-1)) +#define SDL_BUTTON_LMASK SDL_BUTTON_MASK(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON_MASK(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON_MASK(SDL_BUTTON_RIGHT) +#define SDL_BUTTON_X1MASK SDL_BUTTON_MASK(SDL_BUTTON_X1) +#define SDL_BUTTON_X2MASK SDL_BUTTON_MASK(SDL_BUTTON_X2) /* Function prototypes */ @@ -136,13 +166,15 @@ typedef Uint32 SDL_MouseButtonFlags; /** * Return whether a mouse is currently connected. * - * \returns SDL_TRUE if a mouse is connected, SDL_FALSE otherwise. + * \returns true if a mouse is connected, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasMouse(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasMouse(void); /** * Get a list of currently connected mice. @@ -158,7 +190,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasMouse(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMouseNameForID * \sa SDL_HasMouse @@ -174,7 +208,9 @@ extern SDL_DECLSPEC SDL_MouseID * SDLCALL SDL_GetMice(int *count); * \returns the name of the selected mouse, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMice */ @@ -185,26 +221,39 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetMouseNameForID(SDL_MouseID insta * * \returns the window with mouse focus. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); /** - * Retrieve the current state of the mouse. + * Query SDL's cache for the synchronous mouse button state and the + * window-relative SDL-cursor position. * - * The current button state is returned as a button bitmask, which can be - * tested using the SDL_BUTTON(X) macro (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`. + * This function returns the cached synchronous state as SDL understands it + * from the last pump of the event queue. * - * \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. + * To query the platform for immediate asynchronous state, use + * SDL_GetGlobalMouseState. * - * \since This function is available since SDL 3.0.0. + * Passing non-NULL pointers to `x` or `y` will write the destination with + * respective x or y coordinates relative to the focused window. + * + * In Relative Mode, the SDL-cursor's position usually contradicts the + * platform-cursor's position as manually calculated from + * SDL_GetGlobalMouseState() and SDL_GetWindowPosition. + * + * \param x a pointer to receive the SDL-cursor's x-position from the focused + * window's top left corner, can be NULL if unused. + * \param y a pointer to receive the SDL-cursor's y-position from the focused + * window's top left corner, can be NULL if unused. + * \returns a 32-bit bitmask of the button state that can be bitwise-compared + * against the SDL_BUTTON_MASK(X) macro. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGlobalMouseState * \sa SDL_GetRelativeMouseState @@ -212,51 +261,74 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetMouseState(float *x, float *y); /** - * Get the current state of the mouse in relation to the desktop. + * Query the platform for the asynchronous mouse button state and the + * desktop-relative platform-cursor position. * - * 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. + * This function immediately queries the platform for the most recent + * asynchronous state, more costly than retrieving SDL's cached state in + * SDL_GetMouseState(). * - * 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. + * Passing non-NULL pointers to `x` or `y` will write the destination with + * respective x or y coordinates relative to the desktop. * - * \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. + * In Relative Mode, the platform-cursor's position usually contradicts the + * SDL-cursor's position as manually calculated from SDL_GetMouseState() and + * SDL_GetWindowPosition. * - * \since This function is available since SDL 3.0.0. + * This function 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. + * + * \param x a pointer to receive the platform-cursor's x-position from the + * desktop's top left corner, can be NULL if unused. + * \param y a pointer to receive the platform-cursor's y-position from the + * desktop's top left corner, can be NULL if unused. + * \returns a 32-bit bitmask of the button state that can be bitwise-compared + * against the SDL_BUTTON_MASK(X) macro. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CaptureMouse * \sa SDL_GetMouseState + * \sa SDL_GetGlobalMouseState */ extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetGlobalMouseState(float *x, float *y); /** - * Retrieve the relative state of the mouse. + * Query SDL's cache for the synchronous mouse button state and accumulated + * mouse delta since last call. * - * 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`. + * This function returns the cached synchronous state as SDL understands it + * from the last pump of the event queue. * - * \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. + * To query the platform for immediate asynchronous state, use + * SDL_GetGlobalMouseState. * - * \since This function is available since SDL 3.0.0. + * Passing non-NULL pointers to `x` or `y` will write the destination with + * respective x or y deltas accumulated since the last call to this function + * (or since event initialization). + * + * This function is useful for reducing overhead by processing relative mouse + * inputs in one go per-frame instead of individually per-event, at the + * expense of losing the order between events within the frame (e.g. quickly + * pressing and releasing a button within the same frame). + * + * \param x a pointer to receive the x mouse delta accumulated since last + * call, can be NULL if unused. + * \param y a pointer to receive the y mouse delta accumulated since last + * call, can be NULL if unused. + * \returns a 32-bit bitmask of the button state that can be bitwise-compared + * against the SDL_BUTTON_MASK(X) macro. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMouseState + * \sa SDL_GetGlobalMouseState */ extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetRelativeMouseState(float *x, float *y); @@ -275,7 +347,9 @@ extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetRelativeMouseState(float * \param x the x coordinate within the window. * \param y the y coordinate within the window. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_WarpMouseGlobal */ @@ -295,14 +369,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, * * \param x the x coordinate. * \param y the y coordinate. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_WarpMouseInWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WarpMouseGlobal(float x, float y); +extern SDL_DECLSPEC bool SDLCALL SDL_WarpMouseGlobal(float x, float y); /** * Set relative mouse mode for a window. @@ -312,31 +388,39 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WarpMouseGlobal(float x, float y); * report continuous relative mouse motion even if the mouse is at the edge of * the window. * + * If you'd like to keep the mouse position fixed while in relative mode you + * can use SDL_SetWindowMouseRect(). If you'd like the cursor to be at a + * specific location when relative mode ends, you should use + * SDL_WarpMouseInWindow() before disabling relative mode. + * * This function will flush any pending mouse motion for this window. * * \param window the window to change. - * \param enabled SDL_TRUE to enable relative mode, SDL_FALSE to disable. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param enabled true to enable relative mode, false to disable. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowRelativeMouseMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowRelativeMouseMode(SDL_Window *window, SDL_bool enabled); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowRelativeMouseMode(SDL_Window *window, bool enabled); /** * Query whether relative mouse mode is enabled for a window. * * \param window the window to query. - * \returns SDL_TRUE if relative mode is enabled for a window or SDL_FALSE - * otherwise. + * \returns true if relative mode is enabled for a window or false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowRelativeMouseMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowRelativeMouseMode(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowRelativeMouseMode(SDL_Window *window); /** * Capture the mouse and to track input outside an SDL window. @@ -374,15 +458,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowRelativeMouseMode(SDL_Window * * 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param enabled true to enable capturing, false to disable. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGlobalMouseState */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CaptureMouse(SDL_bool enabled); +extern SDL_DECLSPEC bool SDLCALL SDL_CaptureMouse(bool enabled); /** * Create a cursor using the specified bitmap data and mask (in MSB format). @@ -419,7 +505,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CaptureMouse(SDL_bool enabled); * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateColorCursor * \sa SDL_CreateSystemCursor @@ -450,7 +538,9 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor(const Uint8 * data, * \returns the new cursor on success or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateCursor * \sa SDL_CreateSystemCursor @@ -468,7 +558,9 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateColorCursor(SDL_Surface *surf * \returns a cursor on success or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyCursor */ @@ -483,14 +575,16 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateSystemCursor(SDL_SystemCursor * this is desired for any reason. * * \param cursor a cursor to make active. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCursor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetCursor(SDL_Cursor *cursor); +extern SDL_DECLSPEC bool SDLCALL SDL_SetCursor(SDL_Cursor *cursor); /** * Get the active cursor. @@ -500,7 +594,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetCursor(SDL_Cursor *cursor); * * \returns the active cursor or NULL if there is no mouse. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetCursor */ @@ -515,7 +611,9 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void); * \returns the default cursor on success or NULL on failuree; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetDefaultCursor(void); @@ -527,7 +625,9 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetDefaultCursor(void); * * \param cursor the cursor to free. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateColorCursor * \sa SDL_CreateCursor @@ -538,41 +638,47 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyCursor(SDL_Cursor *cursor); /** * Show the cursor. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CursorVisible * \sa SDL_HideCursor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowCursor(void); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowCursor(void); /** * Hide the cursor. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CursorVisible * \sa SDL_ShowCursor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HideCursor(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HideCursor(void); /** * Return whether the cursor is currently being shown. * - * \returns `SDL_TRUE` if the cursor is being shown, or `SDL_FALSE` if the - * cursor is hidden. + * \returns `true` if the cursor is being shown, or `false` if the cursor is + * hidden. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HideCursor * \sa SDL_ShowCursor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CursorVisible(void); +extern SDL_DECLSPEC bool SDLCALL SDL_CursorVisible(void); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_mutex.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_mutex.h index 3a7ce56..c88ec15 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_mutex.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_mutex.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -25,84 +25,245 @@ /** * # CategoryMutex * - * Functions to provide thread synchronization primitives. + * SDL offers several thread synchronization primitives. This document can't + * cover the complicated topic of thread safety, but reading up on what each + * of these primitives are, why they are useful, and how to correctly use them + * is vital to writing correct and safe multithreaded programs. + * + * - Mutexes: SDL_CreateMutex() + * - Read/Write locks: SDL_CreateRWLock() + * - Semaphores: SDL_CreateSemaphore() + * - Condition variables: SDL_CreateCondition() + * + * SDL also offers a datatype, SDL_InitState, which can be used to make sure + * only one thread initializes/deinitializes some resource that several + * threads might try to use for the first time simultaneously. */ #include +#include #include +#include -/******************************************************************************/ -/* Enable thread safety attributes only with clang. +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Enable thread safety attributes, only with clang. + * * The attributes can be safely erased when compiling with other compilers. * * To enable analysis, set these environment variables before running cmake: - * export CC=clang - * export CFLAGS="-DSDL_THREAD_SAFETY_ANALYSIS -Wthread-safety" + * + * ```bash + * export CC=clang + * export CFLAGS="-DSDL_THREAD_SAFETY_ANALYSIS -Wthread-safety" + * ``` */ -#if defined(SDL_THREAD_SAFETY_ANALYSIS) && \ - defined(__clang__) && (!defined(SWIG)) +#define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) + +#elif defined(SDL_THREAD_SAFETY_ANALYSIS) && defined(__clang__) && (!defined(SWIG)) #define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) #else #define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) /* no-op */ #endif +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_SCOPED_CAPABILITY \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_GUARDED_BY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PT_GUARDED_BY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ACQUIRED_BEFORE(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ACQUIRED_AFTER(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_REQUIRES(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_REQUIRES_SHARED(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ACQUIRE(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ACQUIRE_SHARED(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_RELEASE(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_RELEASE_SHARED(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_RELEASE_GENERIC(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_generic_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_TRY_ACQUIRE(x, y) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(x, y)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_TRY_ACQUIRE_SHARED(x, y) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(x, y)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_EXCLUDES(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ASSERT_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ASSERT_SHARED_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_RETURN_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NO_THREAD_SAFETY_ANALYSIS \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) @@ -130,7 +291,7 @@ extern "C" { * * https://en.wikipedia.org/wiki/Mutex * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Mutex SDL_Mutex; @@ -147,7 +308,7 @@ typedef struct SDL_Mutex SDL_Mutex; * \returns the initialized and unlocked mutex or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyMutex * \sa SDL_LockMutex @@ -173,7 +334,7 @@ extern SDL_DECLSPEC SDL_Mutex * SDLCALL SDL_CreateMutex(void); * * \param mutex the mutex to lock. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_TryLockMutex * \sa SDL_UnlockMutex @@ -184,22 +345,22 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockMutex(SDL_Mutex *mutex) SDL_ACQUIRE(mut * Try to lock a mutex without blocking. * * This works just like SDL_LockMutex(), but if the mutex is not available, - * this function returns SDL_FALSE immediately. + * this function returns false 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. * - * This function returns SDL_TRUE if passed a NULL mutex. + * This function returns true if passed a NULL mutex. * * \param mutex the mutex to try to lock. - * \returns SDL_TRUE on success, SDL_FALSE if the mutex would block. + * \returns true on success, false if the mutex would block. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockMutex * \sa SDL_UnlockMutex */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ACQUIRE(0, mutex); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ACQUIRE(0, mutex); /** * Unlock the mutex. @@ -213,7 +374,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ * * \param mutex the mutex to unlock. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockMutex * \sa SDL_TryLockMutex @@ -231,7 +392,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockMutex(SDL_Mutex *mutex) SDL_RELEASE(m * * \param mutex the mutex to destroy. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateMutex */ @@ -261,7 +422,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_Mutex *mutex); * about how threads are scheduled and when they can be recursively locked. * These are documented in the other rwlock functions. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_RWLock SDL_RWLock; @@ -296,7 +457,7 @@ typedef struct SDL_RWLock SDL_RWLock; * \returns the initialized and unlocked read/write lock or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyRWLock * \sa SDL_LockRWLockForReading @@ -336,7 +497,7 @@ extern SDL_DECLSPEC SDL_RWLock * SDLCALL SDL_CreateRWLock(void); * * \param rwlock the read/write lock to lock. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForWriting * \sa SDL_TryLockRWLockForReading @@ -367,7 +528,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForReading(SDL_RWLock *rwlock) SD * * \param rwlock the read/write lock to lock. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading * \sa SDL_TryLockRWLockForWriting @@ -379,7 +540,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForWriting(SDL_RWLock *rwlock) SD * Try to lock a read/write lock _for reading_ without blocking. * * This works just like SDL_LockRWLockForReading(), but if the rwlock is not - * available, then this function returns SDL_FALSE immediately. + * available, then this function returns false immediately. * * This technique is useful if you need access to a resource but don't want to * wait for it, and will return to it to try again later. @@ -387,24 +548,24 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForWriting(SDL_RWLock *rwlock) SD * Trying to lock for read-only access can succeed if other threads are * holding read-only locks, as this won't prevent access. * - * This function returns SDL_TRUE if passed a NULL rwlock. + * This function returns true if passed a NULL rwlock. * * \param rwlock the rwlock to try to lock. - * \returns SDL_TRUE on success, SDL_FALSE if the lock would block. + * \returns true on success, false if the lock would block. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading * \sa SDL_TryLockRWLockForWriting * \sa SDL_UnlockRWLock */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE_SHARED(0, rwlock); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE_SHARED(0, rwlock); /** * Try to lock a read/write lock _for writing_ without blocking. * * This works just like SDL_LockRWLockForWriting(), but if the rwlock is not - * available, then this function returns SDL_FALSE immediately. + * available, then this function returns false 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. @@ -417,18 +578,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwl * read-only lock. Doing so results in undefined behavior. Unlock the * read-only lock before requesting a write lock. * - * This function returns SDL_TRUE if passed a NULL rwlock. + * This function returns true if passed a NULL rwlock. * * \param rwlock the rwlock to try to lock. - * \returns SDL_TRUE on success, SDL_FALSE if the lock would block. + * \returns true on success, false if the lock would block. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForWriting * \sa SDL_TryLockRWLockForReading * \sa SDL_UnlockRWLock */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE(0, rwlock); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE(0, rwlock); /** * Unlock the read/write lock. @@ -446,7 +607,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwl * * \param rwlock the rwlock to unlock. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading * \sa SDL_LockRWLockForWriting @@ -466,7 +627,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockRWLock(SDL_RWLock *rwlock) SDL_RELEAS * * \param rwlock the rwlock to destroy. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRWLock */ @@ -492,7 +653,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyRWLock(SDL_RWLock *rwlock); * * https://en.wikipedia.org/wiki/Semaphore_(programming) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Semaphore SDL_Semaphore; @@ -509,7 +670,7 @@ typedef struct SDL_Semaphore SDL_Semaphore; * \returns a new semaphore or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySemaphore * \sa SDL_SignalSemaphore @@ -528,7 +689,7 @@ extern SDL_DECLSPEC SDL_Semaphore * SDLCALL SDL_CreateSemaphore(Uint32 initial_v * * \param sem the semaphore to destroy. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSemaphore */ @@ -546,7 +707,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_Semaphore *sem); * * \param sem the semaphore wait on. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore * \sa SDL_TryWaitSemaphore @@ -560,18 +721,18 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitSemaphore(SDL_Semaphore *sem); * 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_FALSE. + * returns false. * * \param sem the semaphore to wait on. - * \returns SDL_TRUE if the wait succeeds, SDL_FALSE if the wait would block. + * \returns true if the wait succeeds, false if the wait would block. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore * \sa SDL_WaitSemaphore * \sa SDL_WaitSemaphoreTimeout */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryWaitSemaphore(SDL_Semaphore *sem); +extern SDL_DECLSPEC bool SDLCALL SDL_TryWaitSemaphore(SDL_Semaphore *sem); /** * Wait until a semaphore has a positive value and then decrements it. @@ -583,22 +744,22 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryWaitSemaphore(SDL_Semaphore *sem); * \param sem the semaphore to wait on. * \param timeoutMS the length of the timeout, in milliseconds, or -1 to wait * indefinitely. - * \returns SDL_TRUE if the wait succeeds or SDL_FALSE if the wait times out. + * \returns true if the wait succeeds or false if the wait times out. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore * \sa SDL_TryWaitSemaphore * \sa SDL_WaitSemaphore */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitSemaphoreTimeout(SDL_Semaphore *sem, Sint32 timeoutMS); +extern SDL_DECLSPEC bool SDLCALL SDL_WaitSemaphoreTimeout(SDL_Semaphore *sem, Sint32 timeoutMS); /** * Atomically increment a semaphore's value and wake waiting threads. * * \param sem the semaphore to increment. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_TryWaitSemaphore * \sa SDL_WaitSemaphore @@ -612,7 +773,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SignalSemaphore(SDL_Semaphore *sem); * \param sem the semaphore to query. * \returns the current value of the semaphore. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetSemaphoreValue(SDL_Semaphore *sem); @@ -635,7 +796,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetSemaphoreValue(SDL_Semaphore *sem); * * https://en.wikipedia.org/wiki/Condition_variable * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Condition SDL_Condition; @@ -645,7 +806,7 @@ typedef struct SDL_Condition SDL_Condition; * \returns a new condition variable or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_SignalCondition @@ -660,7 +821,7 @@ extern SDL_DECLSPEC SDL_Condition * SDLCALL SDL_CreateCondition(void); * * \param cond the condition variable to destroy. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateCondition */ @@ -673,7 +834,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyCondition(SDL_Condition *cond); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_WaitCondition @@ -688,7 +849,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SignalCondition(SDL_Condition *cond); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalCondition * \sa SDL_WaitCondition @@ -716,7 +877,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BroadcastCondition(SDL_Condition *cond); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_SignalCondition @@ -741,22 +902,167 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitCondition(SDL_Condition *cond, SDL_Mute * \param mutex the mutex used to coordinate thread access. * \param timeoutMS the maximum time to wait, in milliseconds, or -1 to wait * indefinitely. - * \returns SDL_TRUE if the condition variable is signaled, SDL_FALSE if the - * condition is not signaled in the allotted time. + * \returns true if the condition variable is signaled, false if the condition + * is not signaled in the allotted time. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_SignalCondition * \sa SDL_WaitCondition */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitConditionTimeout(SDL_Condition *cond, +extern SDL_DECLSPEC bool SDLCALL SDL_WaitConditionTimeout(SDL_Condition *cond, SDL_Mutex *mutex, Sint32 timeoutMS); /* @} *//* Condition variable functions */ +/** + * \name Thread-safe initialization state functions + */ +/* @{ */ + +/** + * The current status of an SDL_InitState structure. + * + * \since This enum is available since SDL 3.2.0. + */ +typedef enum SDL_InitStatus +{ + SDL_INIT_STATUS_UNINITIALIZED, + SDL_INIT_STATUS_INITIALIZING, + SDL_INIT_STATUS_INITIALIZED, + SDL_INIT_STATUS_UNINITIALIZING +} SDL_InitStatus; + +/** + * A structure used for thread-safe initialization and shutdown. + * + * Here is an example of using this: + * + * ```c + * static SDL_AtomicInitState init; + * + * bool InitSystem(void) + * { + * if (!SDL_ShouldInit(&init)) { + * // The system is initialized + * return true; + * } + * + * // At this point, you should not leave this function without calling SDL_SetInitialized() + * + * bool initialized = DoInitTasks(); + * SDL_SetInitialized(&init, initialized); + * return initialized; + * } + * + * bool UseSubsystem(void) + * { + * if (SDL_ShouldInit(&init)) { + * // Error, the subsystem isn't initialized + * SDL_SetInitialized(&init, false); + * return false; + * } + * + * // Do work using the initialized subsystem + * + * return true; + * } + * + * void QuitSystem(void) + * { + * if (!SDL_ShouldQuit(&init)) { + * // The system is not initialized + * return; + * } + * + * // At this point, you should not leave this function without calling SDL_SetInitialized() + * + * DoQuitTasks(); + * SDL_SetInitialized(&init, false); + * } + * ``` + * + * Note that this doesn't protect any resources created during initialization, + * or guarantee that nobody is using those resources during cleanup. You + * should use other mechanisms to protect those, if that's a concern for your + * code. + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_InitState +{ + SDL_AtomicInt status; + SDL_ThreadID thread; + void *reserved; +} SDL_InitState; + +/** + * Return whether initialization should be done. + * + * This function checks the passed in state and if initialization should be + * done, sets the status to `SDL_INIT_STATUS_INITIALIZING` and returns true. + * If another thread is already modifying this state, it will wait until + * that's done before returning. + * + * If this function returns true, the calling code must call + * SDL_SetInitialized() to complete the initialization. + * + * \param state the initialization state to check. + * \returns true if initialization needs to be done, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetInitialized + * \sa SDL_ShouldQuit + */ +extern SDL_DECLSPEC bool SDLCALL SDL_ShouldInit(SDL_InitState *state); + +/** + * Return whether cleanup should be done. + * + * This function checks the passed in state and if cleanup should be done, + * sets the status to `SDL_INIT_STATUS_UNINITIALIZING` and returns true. + * + * If this function returns true, the calling code must call + * SDL_SetInitialized() to complete the cleanup. + * + * \param state the initialization state to check. + * \returns true if cleanup needs to be done, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetInitialized + * \sa SDL_ShouldInit + */ +extern SDL_DECLSPEC bool SDLCALL SDL_ShouldQuit(SDL_InitState *state); + +/** + * Finish an initialization state transition. + * + * This function sets the status of the passed in state to + * `SDL_INIT_STATUS_INITIALIZED` or `SDL_INIT_STATUS_UNINITIALIZED` and allows + * any threads waiting for the status to proceed. + * + * \param state the initialization state to check. + * \param initialized the new initialization state. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ShouldInit + * \sa SDL_ShouldQuit + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetInitialized(SDL_InitState *state, bool initialized); + +/* @} *//* Thread-safe initialization state functions */ /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_oldnames.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_oldnames.h index 02c881c..c93607e 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_oldnames.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_oldnames.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -38,11 +38,14 @@ #ifdef SDL_ENABLE_OLD_NAMES /* ##SDL_atomic.h */ -#define SDL_AtomicCAS SDL_AtomicCompareAndSwap -#define SDL_AtomicCASPtr SDL_AtomicCompareAndSwapPointer -#define SDL_AtomicGetPtr SDL_AtomicGetPointer +#define SDL_AtomicAdd SDL_AddAtomicInt +#define SDL_AtomicCAS SDL_CompareAndSwapAtomicInt +#define SDL_AtomicCASPtr SDL_CompareAndSwapAtomicPointer +#define SDL_AtomicGet SDL_GetAtomicInt +#define SDL_AtomicGetPtr SDL_GetAtomicPointer #define SDL_AtomicLock SDL_LockSpinlock -#define SDL_AtomicSetPtr SDL_AtomicSetPointer +#define SDL_AtomicSet SDL_SetAtomicInt +#define SDL_AtomicSetPtr SDL_SetAtomicPointer #define SDL_AtomicTryLock SDL_TryLockSpinlock #define SDL_AtomicUnlock SDL_UnlockSpinlock #define SDL_atomic_t SDL_AtomicInt @@ -74,6 +77,7 @@ #define SDL_NewAudioStream SDL_CreateAudioStream /* ##SDL_cpuinfo.h */ +#define SDL_GetCPUCount SDL_GetNumLogicalCPUCores #define SDL_SIMDGetAlignment SDL_GetSIMDAlignment /* ##SDL_endian.h */ @@ -166,14 +170,13 @@ #define SDL_WINDOWEVENT_RESTORED SDL_EVENT_WINDOW_RESTORED #define SDL_WINDOWEVENT_SHOWN SDL_EVENT_WINDOW_SHOWN #define SDL_WINDOWEVENT_SIZE_CHANGED SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED -#define SDL_WINDOWEVENT_TAKE_FOCUS SDL_EVENT_WINDOW_TAKE_FOCUS #define SDL_eventaction SDL_EventAction /* ##SDL_gamecontroller.h */ #define SDL_CONTROLLER_AXIS_INVALID SDL_GAMEPAD_AXIS_INVALID #define SDL_CONTROLLER_AXIS_LEFTX SDL_GAMEPAD_AXIS_LEFTX #define SDL_CONTROLLER_AXIS_LEFTY SDL_GAMEPAD_AXIS_LEFTY -#define SDL_CONTROLLER_AXIS_MAX SDL_GAMEPAD_AXIS_MAX +#define SDL_CONTROLLER_AXIS_MAX SDL_GAMEPAD_AXIS_COUNT #define SDL_CONTROLLER_AXIS_RIGHTX SDL_GAMEPAD_AXIS_RIGHTX #define SDL_CONTROLLER_AXIS_RIGHTY SDL_GAMEPAD_AXIS_RIGHTY #define SDL_CONTROLLER_AXIS_TRIGGERLEFT SDL_GAMEPAD_AXIS_LEFT_TRIGGER @@ -193,7 +196,7 @@ #define SDL_CONTROLLER_BUTTON_INVALID SDL_GAMEPAD_BUTTON_INVALID #define SDL_CONTROLLER_BUTTON_LEFTSHOULDER SDL_GAMEPAD_BUTTON_LEFT_SHOULDER #define SDL_CONTROLLER_BUTTON_LEFTSTICK SDL_GAMEPAD_BUTTON_LEFT_STICK -#define SDL_CONTROLLER_BUTTON_MAX SDL_GAMEPAD_BUTTON_MAX +#define SDL_CONTROLLER_BUTTON_MAX SDL_GAMEPAD_BUTTON_COUNT #define SDL_CONTROLLER_BUTTON_MISC1 SDL_GAMEPAD_BUTTON_MISC1 #define SDL_CONTROLLER_BUTTON_PADDLE1 SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1 #define SDL_CONTROLLER_BUTTON_PADDLE2 SDL_GAMEPAD_BUTTON_LEFT_PADDLE1 @@ -304,6 +307,8 @@ #define SDL_HINT_DIRECTINPUT_ENABLED SDL_HINT_JOYSTICK_DIRECTINPUT #define SDL_HINT_GDK_TEXTINPUT_DEFAULT SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT #define SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE +#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE SDL_HINT_JOYSTICK_ENHANCED_REPORTS +#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE SDL_HINT_JOYSTICK_ENHANCED_REPORTS #define SDL_HINT_LINUX_DIGITAL_HATS SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS #define SDL_HINT_LINUX_HAT_DEADZONES SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES #define SDL_HINT_LINUX_JOYSTICK_CLASSIC SDL_HINT_JOYSTICK_LINUX_CLASSIC @@ -419,9 +424,15 @@ #define SDL_LogSetAllPriority SDL_SetLogPriorities #define SDL_LogSetOutputFunction SDL_SetLogOutputFunction #define SDL_LogSetPriority SDL_SetLogPriority +#define SDL_NUM_LOG_PRIORITIES SDL_LOG_PRIORITY_COUNT + +/* ##SDL_messagebox.h */ +#define SDL_MESSAGEBOX_COLOR_MAX SDL_MESSAGEBOX_COLOR_COUNT /* ##SDL_mouse.h */ +#define SDL_BUTTON SDL_BUTTON_MASK #define SDL_FreeCursor SDL_DestroyCursor +#define SDL_NUM_SYSTEM_CURSORS SDL_SYSTEM_CURSOR_COUNT #define SDL_SYSTEM_CURSOR_ARROW SDL_SYSTEM_CURSOR_DEFAULT #define SDL_SYSTEM_CURSOR_HAND SDL_SYSTEM_CURSOR_POINTER #define SDL_SYSTEM_CURSOR_IBEAM SDL_SYSTEM_CURSOR_TEXT @@ -558,6 +569,7 @@ #define SDL_WriteLE64 SDL_WriteU64LE /* ##SDL_scancode.h */ +#define SDL_NUM_SCANCODES SDL_SCANCODE_COUNT #define SDL_SCANCODE_AUDIOFASTFORWARD SDL_SCANCODE_MEDIA_FAST_FORWARD #define SDL_SCANCODE_AUDIOMUTE SDL_SCANCODE_MUTE #define SDL_SCANCODE_AUDIONEXT SDL_SCANCODE_MEDIA_NEXT_TRACK @@ -580,7 +592,12 @@ #define SDL_SensorUpdate SDL_UpdateSensors /* ##SDL_stdinc.h */ +#define SDL_FALSE false #define SDL_TABLESIZE SDL_arraysize +#define SDL_TRUE true +#define SDL_bool bool +#define SDL_size_add_overflow SDL_size_add_check_overflow +#define SDL_size_mul_overflow SDL_size_mul_check_overflow #define SDL_strtokr SDL_strtok_r /* ##SDL_surface.h */ @@ -623,14 +640,13 @@ #define SDL_LinuxSetThreadPriorityAndPolicy SDL_SetLinuxThreadPriorityAndPolicy #define SDL_OnApplicationDidBecomeActive SDL_OnApplicationDidEnterForeground #define SDL_OnApplicationWillResignActive SDL_OnApplicationWillEnterBackground -#define SDL_WinRTGetDeviceFamily SDL_GetWinRTDeviceFamily -#define SDL_GetWinRTFSPathUTF8 SDL_GetWinRTFSPath #define SDL_iOSSetAnimationCallback SDL_SetiOSAnimationCallback #define SDL_iOSSetEventPump SDL_SetiOSEventPump #define SDL_iPhoneSetAnimationCallback SDL_SetiOSAnimationCallback #define SDL_iPhoneSetEventPump SDL_SetiOSEventPump /* ##SDL_thread.h */ +#define SDL_SetThreadPriority SDL_SetCurrentThreadPriority #define SDL_TLSCleanup SDL_CleanupTLS #define SDL_TLSGet SDL_GetTLS #define SDL_TLSSet SDL_SetTLS @@ -645,6 +661,10 @@ /* ##SDL_video.h */ #define SDL_GL_DeleteContext SDL_GL_DestroyContext +#define SDL_GLattr SDL_GLAttr +#define SDL_GLcontextFlag SDL_GLContextFlag +#define SDL_GLcontextReleaseFlag SDL_GLContextReleaseFlag +#define SDL_GLprofile SDL_GLProfile #define SDL_GetClosestDisplayMode SDL_GetClosestFullscreenDisplayMode #define SDL_GetDisplayOrientation SDL_GetCurrentDisplayOrientation #define SDL_GetPointDisplayIndex SDL_GetDisplayForPoint @@ -661,11 +681,14 @@ #elif !defined(SDL_DISABLE_OLD_NAMES) /* ##SDL_atomic.h */ -#define SDL_AtomicCAS SDL_AtomicCAS_renamed_SDL_AtomicCompareAndSwap -#define SDL_AtomicCASPtr SDL_AtomicCASPtr_renamed_SDL_AtomicCompareAndSwapPointer -#define SDL_AtomicGetPtr SDL_AtomicGetPtr_renamed_SDL_AtomicGetPointer +#define SDL_AtomicAdd SDL_AtomicAdd_renamed_SDL_AddAtomicInt +#define SDL_AtomicCAS SDL_AtomicCAS_renamed_SDL_CompareAndSwapAtomicInt +#define SDL_AtomicCASPtr SDL_AtomicCASPtr_renamed_SDL_CompareAndSwapAtomicPointer +#define SDL_AtomicGet SDL_AtomicGet_renamed_SDL_GetAtomicInt +#define SDL_AtomicGetPtr SDL_AtomicGetPtr_renamed_SDL_GetAtomicPointer #define SDL_AtomicLock SDL_AtomicLock_renamed_SDL_LockSpinlock -#define SDL_AtomicSetPtr SDL_AtomicSetPtr_renamed_SDL_AtomicSetPointer +#define SDL_AtomicSet SDL_AtomicSet_renamed_SDL_SetAtomicInt +#define SDL_AtomicSetPtr SDL_AtomicSetPtr_renamed_SDL_SetAtomicPointer #define SDL_AtomicTryLock SDL_AtomicTryLock_renamed_SDL_TryLockSpinlock #define SDL_AtomicUnlock SDL_AtomicUnlock_renamed_SDL_UnlockSpinlock #define SDL_atomic_t SDL_atomic_t_renamed_SDL_AtomicInt @@ -697,6 +720,7 @@ #define SDL_NewAudioStream SDL_NewAudioStream_renamed_SDL_CreateAudioStream /* ##SDL_cpuinfo.h */ +#define SDL_GetCPUCount SDL_GetCPUCount_renamed_SDL_GetNumLogicalCPUCores #define SDL_SIMDGetAlignment SDL_SIMDGetAlignment_renamed_SDL_GetSIMDAlignment /* ##SDL_endian.h */ @@ -789,14 +813,13 @@ #define SDL_WINDOWEVENT_RESTORED SDL_WINDOWEVENT_RESTORED_renamed_SDL_EVENT_WINDOW_RESTORED #define SDL_WINDOWEVENT_SHOWN SDL_WINDOWEVENT_SHOWN_renamed_SDL_EVENT_WINDOW_SHOWN #define SDL_WINDOWEVENT_SIZE_CHANGED SDL_WINDOWEVENT_SIZE_CHANGED_renamed_SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED -#define SDL_WINDOWEVENT_TAKE_FOCUS SDL_WINDOWEVENT_TAKE_FOCUS_renamed_SDL_EVENT_WINDOW_TAKE_FOCUS #define SDL_eventaction SDL_eventaction_renamed_SDL_EventAction /* ##SDL_gamecontroller.h */ #define SDL_CONTROLLER_AXIS_INVALID SDL_CONTROLLER_AXIS_INVALID_renamed_SDL_GAMEPAD_AXIS_INVALID #define SDL_CONTROLLER_AXIS_LEFTX SDL_CONTROLLER_AXIS_LEFTX_renamed_SDL_GAMEPAD_AXIS_LEFTX #define SDL_CONTROLLER_AXIS_LEFTY SDL_CONTROLLER_AXIS_LEFTY_renamed_SDL_GAMEPAD_AXIS_LEFTY -#define SDL_CONTROLLER_AXIS_MAX SDL_CONTROLLER_AXIS_MAX_renamed_SDL_GAMEPAD_AXIS_MAX +#define SDL_CONTROLLER_AXIS_MAX SDL_CONTROLLER_AXIS_MAX_renamed_SDL_GAMEPAD_AXIS_COUNT #define SDL_CONTROLLER_AXIS_RIGHTX SDL_CONTROLLER_AXIS_RIGHTX_renamed_SDL_GAMEPAD_AXIS_RIGHTX #define SDL_CONTROLLER_AXIS_RIGHTY SDL_CONTROLLER_AXIS_RIGHTY_renamed_SDL_GAMEPAD_AXIS_RIGHTY #define SDL_CONTROLLER_AXIS_TRIGGERLEFT SDL_CONTROLLER_AXIS_TRIGGERLEFT_renamed_SDL_GAMEPAD_AXIS_LEFT_TRIGGER @@ -816,7 +839,7 @@ #define SDL_CONTROLLER_BUTTON_INVALID SDL_CONTROLLER_BUTTON_INVALID_renamed_SDL_GAMEPAD_BUTTON_INVALID #define SDL_CONTROLLER_BUTTON_LEFTSHOULDER SDL_CONTROLLER_BUTTON_LEFTSHOULDER_renamed_SDL_GAMEPAD_BUTTON_LEFT_SHOULDER #define SDL_CONTROLLER_BUTTON_LEFTSTICK SDL_CONTROLLER_BUTTON_LEFTSTICK_renamed_SDL_GAMEPAD_BUTTON_LEFT_STICK -#define SDL_CONTROLLER_BUTTON_MAX SDL_CONTROLLER_BUTTON_MAX_renamed_SDL_GAMEPAD_BUTTON_MAX +#define SDL_CONTROLLER_BUTTON_MAX SDL_CONTROLLER_BUTTON_MAX_renamed_SDL_GAMEPAD_BUTTON_COUNT #define SDL_CONTROLLER_BUTTON_MISC1 SDL_CONTROLLER_BUTTON_MISC1_renamed_SDL_GAMEPAD_BUTTON_MISC1 #define SDL_CONTROLLER_BUTTON_PADDLE1 SDL_CONTROLLER_BUTTON_PADDLE1_renamed_SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1 #define SDL_CONTROLLER_BUTTON_PADDLE2 SDL_CONTROLLER_BUTTON_PADDLE2_renamed_SDL_GAMEPAD_BUTTON_LEFT_PADDLE1 @@ -928,6 +951,8 @@ #define SDL_HINT_DIRECTINPUT_ENABLED SDL_HINT_DIRECTINPUT_ENABLED_renamed_SDL_HINT_JOYSTICK_DIRECTINPUT #define SDL_HINT_GDK_TEXTINPUT_DEFAULT SDL_HINT_GDK_TEXTINPUT_DEFAULT_renamed_SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT #define SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE_renamed_SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE +#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE_renamed_SDL_HINT_JOYSTICK_ENHANCED_REPORTS +#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE_renamed_SDL_HINT_JOYSTICK_ENHANCED_REPORTS #define SDL_HINT_LINUX_DIGITAL_HATS SDL_HINT_LINUX_DIGITAL_HATS_renamed_SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS #define SDL_HINT_LINUX_HAT_DEADZONES SDL_HINT_LINUX_HAT_DEADZONES_renamed_SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES #define SDL_HINT_LINUX_JOYSTICK_CLASSIC SDL_HINT_LINUX_JOYSTICK_CLASSIC_renamed_SDL_HINT_JOYSTICK_LINUX_CLASSIC @@ -1043,9 +1068,15 @@ #define SDL_LogSetAllPriority SDL_LogSetAllPriority_renamed_SDL_SetLogPriorities #define SDL_LogSetOutputFunction SDL_LogSetOutputFunction_renamed_SDL_SetLogOutputFunction #define SDL_LogSetPriority SDL_LogSetPriority_renamed_SDL_SetLogPriority +#define SDL_NUM_LOG_PRIORITIES SDL_NUM_LOG_PRIORITIES_renamed_SDL_LOG_PRIORITY_COUNT + +/* ##SDL_messagebox.h */ +#define SDL_MESSAGEBOX_COLOR_MAX SDL_MESSAGEBOX_COLOR_MAX_renamed_SDL_MESSAGEBOX_COLOR_COUNT /* ##SDL_mouse.h */ +#define SDL_BUTTON SDL_BUTTON_renamed_SDL_BUTTON_MASK #define SDL_FreeCursor SDL_FreeCursor_renamed_SDL_DestroyCursor +#define SDL_NUM_SYSTEM_CURSORS SDL_NUM_SYSTEM_CURSORS_renamed_SDL_SYSTEM_CURSOR_COUNT #define SDL_SYSTEM_CURSOR_ARROW SDL_SYSTEM_CURSOR_ARROW_renamed_SDL_SYSTEM_CURSOR_DEFAULT #define SDL_SYSTEM_CURSOR_HAND SDL_SYSTEM_CURSOR_HAND_renamed_SDL_SYSTEM_CURSOR_POINTER #define SDL_SYSTEM_CURSOR_IBEAM SDL_SYSTEM_CURSOR_IBEAM_renamed_SDL_SYSTEM_CURSOR_TEXT @@ -1182,6 +1213,7 @@ #define SDL_WriteLE64 SDL_WriteLE64_renamed_SDL_WriteU64LE /* ##SDL_scancode.h */ +#define SDL_NUM_SCANCODES SDL_NUM_SCANCODES_renamed_SDL_SCANCODE_COUNT #define SDL_SCANCODE_AUDIOFASTFORWARD SDL_SCANCODE_AUDIOFASTFORWARD_renamed_SDL_SCANCODE_MEDIA_FAST_FORWARD #define SDL_SCANCODE_AUDIOMUTE SDL_SCANCODE_AUDIOMUTE_renamed_SDL_SCANCODE_MUTE #define SDL_SCANCODE_AUDIONEXT SDL_SCANCODE_AUDIONEXT_renamed_SDL_SCANCODE_MEDIA_NEXT_TRACK @@ -1204,7 +1236,12 @@ #define SDL_SensorUpdate SDL_SensorUpdate_renamed_SDL_UpdateSensors /* ##SDL_stdinc.h */ +#define SDL_FALSE SDL_FALSE_renamed_false #define SDL_TABLESIZE SDL_TABLESIZE_renamed_SDL_arraysize +#define SDL_TRUE SDL_TRUE_renamed_true +#define SDL_bool SDL_bool_renamed_bool +#define SDL_size_add_overflow SDL_size_add_overflow_renamed_SDL_size_add_check_overflow +#define SDL_size_mul_overflow SDL_size_mul_overflow_renamed_SDL_size_mul_check_overflow #define SDL_strtokr SDL_strtokr_renamed_SDL_strtok_r /* ##SDL_surface.h */ @@ -1247,14 +1284,13 @@ #define SDL_LinuxSetThreadPriorityAndPolicy SDL_LinuxSetThreadPriorityAndPolicy_renamed_SDL_SetLinuxThreadPriorityAndPolicy #define SDL_OnApplicationDidBecomeActive SDL_OnApplicationDidBecomeActive_renamed_SDL_OnApplicationDidEnterForeground #define SDL_OnApplicationWillResignActive SDL_OnApplicationWillResignActive_renamed_SDL_OnApplicationWillEnterBackground -#define SDL_WinRTGetDeviceFamily SDL_WinRTGetDeviceFamily_renamed_SDL_GetWinRTDeviceFamily -#define SDL_GetWinRTFSPathUTF8 SDL_GetWinRTFSPathUTF8_renamed_SDL_GetWinRTFSPath #define SDL_iOSSetAnimationCallback SDL_iOSSetAnimationCallback_renamed_SDL_SetiOSAnimationCallback #define SDL_iOSSetEventPump SDL_iOSSetEventPump_renamed_SDL_SetiOSEventPump #define SDL_iPhoneSetAnimationCallback SDL_iPhoneSetAnimationCallback_renamed_SDL_iOSSetAnimationCallback #define SDL_iPhoneSetEventPump SDL_iPhoneSetEventPump_renamed_SDL_iOSSetEventPump /* ##SDL_thread.h */ +#define SDL_SetThreadPriority SDL_SetThreadPriority_renamed_SDL_SetCurrentThreadPriority #define SDL_TLSCleanup SDL_TLSCleanup_renamed_SDL_CleanupTLS #define SDL_TLSGet SDL_TLSGet_renamed_SDL_GetTLS #define SDL_TLSSet SDL_TLSSet_renamed_SDL_SetTLS @@ -1269,6 +1305,10 @@ /* ##SDL_video.h */ #define SDL_GL_DeleteContext SDL_GL_DeleteContext_renamed_SDL_GL_DestroyContext +#define SDL_GLattr SDL_GLattr_renamed_SDL_GLAttr +#define SDL_GLcontextFlag SDL_GLcontextFlag_renamed_SDL_GLContextFlag +#define SDL_GLcontextReleaseFlag SDL_GLcontextReleaseFlag_renamed_SDL_GLContextReleaseFlag +#define SDL_GLprofile SDL_GLprofile_renamed_SDL_GLProfile #define SDL_GetClosestDisplayMode SDL_GetClosestDisplayMode_renamed_SDL_GetClosestFullscreenDisplayMode #define SDL_GetDisplayOrientation SDL_GetDisplayOrientation_renamed_SDL_GetCurrentDisplayOrientation #define SDL_GetPointDisplayIndex SDL_GetPointDisplayIndex_renamed_SDL_GetDisplayForPoint diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengl.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengl.h index 6bdcbe0..d1b8b02 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengl.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -783,6 +783,7 @@ typedef double GLclampd; /* double precision float in [0,1] */ * Miscellaneous */ +#ifndef SDL_OPENGL_1_NO_PROTOTYPES GLAPI void GLAPIENTRY glClearIndex( GLfloat c ); GLAPI void GLAPIENTRY glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); @@ -1480,6 +1481,706 @@ GLAPI void GLAPIENTRY glPushName( GLuint name ); GLAPI void GLAPIENTRY glPopName( void ); +#endif +#ifdef SDL_OPENGL_1_FUNCTION_TYPEDEFS + +typedef void (APIENTRYP PFNGLCLEARINDEXPROC) ( GLfloat c ); + +typedef void (APIENTRYP PFNGLCLEARCOLORPROC) ( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); + +typedef void (APIENTRYP PFNGLCLEARPROC) ( GLbitfield mask ); + +typedef void (APIENTRYP PFNGLINDEXMASKPROC) ( GLuint mask ); + +typedef void (APIENTRYP PFNGLCOLORMASKPROC) ( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ); + +typedef void (APIENTRYP PFNGLALPHAFUNCPROC) ( GLenum func, GLclampf ref ); + +typedef void (APIENTRYP PFNGLBLENDFUNCPROC) ( GLenum sfactor, GLenum dfactor ); + +typedef void (APIENTRYP PFNGLLOGICOPPROC) ( GLenum opcode ); + +typedef void (APIENTRYP PFNGLCULLFACEPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLFRONTFACEPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLPOINTSIZEPROC) ( GLfloat size ); + +typedef void (APIENTRYP PFNGLLINEWIDTHPROC) ( GLfloat width ); + +typedef void (APIENTRYP PFNGLLINESTIPPLEPROC) ( GLint factor, GLushort pattern ); + +typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) ( GLenum face, GLenum mode ); + +typedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC) ( GLfloat factor, GLfloat units ); + +typedef void (APIENTRYP PFNGLPOLYGONSTIPPLEPROC) ( const GLubyte *mask ); + +typedef void (APIENTRYP PFNGLGETPOLYGONSTIPPLEPROC) ( GLubyte *mask ); + +typedef void (APIENTRYP PFNGLEDGEFLAGPROC) ( GLboolean flag ); + +typedef void (APIENTRYP PFNGLEDGEFLAGVPROC) ( const GLboolean *flag ); + +typedef void (APIENTRYP PFNGLSCISSORPROC) ( GLint x, GLint y, GLsizei width, GLsizei height); + +typedef void (APIENTRYP PFNGLCLIPPLANEPROC) ( GLenum plane, const GLdouble *equation ); + +typedef void (APIENTRYP PFNGLGETCLIPPLANEPROC) ( GLenum plane, GLdouble *equation ); + +typedef void (APIENTRYP PFNGLDRAWBUFFERPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLREADBUFFERPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLENABLEPROC) ( GLenum cap ); + +typedef void (APIENTRYP PFNGLDISABLEPROC) ( GLenum cap ); + +typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) ( GLenum cap ); + + +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEPROC) ( GLenum cap ); /* 1.1 */ + +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEPROC) ( GLenum cap ); /* 1.1 */ + + +typedef void (APIENTRYP PFNGLGETBOOLEANVPROC) ( GLenum pname, GLboolean *params ); + +typedef void (APIENTRYP PFNGLGETDOUBLEVPROC) ( GLenum pname, GLdouble *params ); + +typedef void (APIENTRYP PFNGLGETFLOATVPROC) ( GLenum pname, GLfloat *params ); + +typedef void (APIENTRYP PFNGLGETINTEGERVPROC) ( GLenum pname, GLint *params ); + + +typedef void (APIENTRYP PFNGLPUSHATTRIBPROC) ( GLbitfield mask ); + +typedef void (APIENTRYP PFNGLPOPATTRIBPROC) ( void ); + + +typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBPROC) ( GLbitfield mask ); /* 1.1 */ + +typedef void (APIENTRYP PFNGLPOPCLIENTATTRIBPROC) ( void ); /* 1.1 */ + + +typedef GLint (APIENTRYP PFNGLRENDERMODEPROC) ( GLenum mode ); + +typedef GLenum (APIENTRYP PFNGLGETERRORPROC) ( void ); + +typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) ( GLenum name ); + +typedef void (APIENTRYP PFNGLFINISHPROC) ( void ); + +typedef void (APIENTRYP PFNGLFLUSHPROC) ( void ); + +typedef void (APIENTRYP PFNGLHINTPROC) ( GLenum target, GLenum mode ); + + +/* + * Depth Buffer + */ + +typedef void (APIENTRYP PFNGLCLEARDEPTHPROC) ( GLclampd depth ); + +typedef void (APIENTRYP PFNGLDEPTHFUNCPROC) ( GLenum func ); + +typedef void (APIENTRYP PFNGLDEPTHMASKPROC) ( GLboolean flag ); + +typedef void (APIENTRYP PFNGLDEPTHRANGEPROC) ( GLclampd near_val, GLclampd far_val ); + + +/* + * Accumulation Buffer + */ + +typedef void (APIENTRYP PFNGLCLEARACCUMPROC) ( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); + +typedef void (APIENTRYP PFNGLACCUMPROC) ( GLenum op, GLfloat value ); + + +/* + * Transformation + */ + +typedef void (APIENTRYP PFNGLMATRIXMODEPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLORTHOPROC) ( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); + +typedef void (APIENTRYP PFNGLFRUSTUMPROC) ( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); + +typedef void (APIENTRYP PFNGLVIEWPORTPROC) ( GLint x, GLint y, + GLsizei width, GLsizei height ); + +typedef void (APIENTRYP PFNGLPUSHMATRIXPROC) ( void ); + +typedef void (APIENTRYP PFNGLPOPMATRIXPROC) ( void ); + +typedef void (APIENTRYP PFNGLLOADIDENTITYPROC) ( void ); + +typedef void (APIENTRYP PFNGLLOADMATRIXDPROC) ( const GLdouble *m ); +typedef void (APIENTRYP PFNGLLOADMATRIXFPROC) ( const GLfloat *m ); + +typedef void (APIENTRYP PFNGLMULTMATRIXDPROC) ( const GLdouble *m ); +typedef void (APIENTRYP PFNGLMULTMATRIXFPROC) ( const GLfloat *m ); + +typedef void (APIENTRYP PFNGLROTATEDPROC) ( GLdouble angle, + GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP PFNGLROTATEFPROC) ( GLfloat angle, + GLfloat x, GLfloat y, GLfloat z ); + +typedef void (APIENTRYP PFNGLSCALEDPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP PFNGLSCALEFPROC) ( GLfloat x, GLfloat y, GLfloat z ); + +typedef void (APIENTRYP PFNGLTRANSLATEDPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP PFNGLTRANSLATEFPROC) ( GLfloat x, GLfloat y, GLfloat z ); + + +/* + * Display Lists + */ + +typedef GLboolean (APIENTRYP PFNGLISLISTPROC) ( GLuint list ); + +typedef void (APIENTRYP PFNGLDELETELISTSPROC) ( GLuint list, GLsizei range ); + +typedef GLuint (APIENTRYP PFNGLGENLISTSPROC) ( GLsizei range ); + +typedef void (APIENTRYP PFNGLNEWLISTPROC) ( GLuint list, GLenum mode ); + +typedef void (APIENTRYP PFNGLENDLISTPROC) ( void ); + +typedef void (APIENTRYP PFNGLCALLLISTPROC) ( GLuint list ); + +typedef void (APIENTRYP PFNGLCALLLISTSPROC) ( GLsizei n, GLenum type, + const GLvoid *lists ); + +typedef void (APIENTRYP PFNGLLISTBASEPROC) ( GLuint base ); + + +/* + * Drawing Functions + */ + +typedef void (APIENTRYP PFNGLBEGINPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLENDPROC) ( void ); + + +typedef void (APIENTRYP PFNGLVERTEX2DPROC) ( GLdouble x, GLdouble y ); +typedef void (APIENTRYP PFNGLVERTEX2FPROC) ( GLfloat x, GLfloat y ); +typedef void (APIENTRYP PFNGLVERTEX2IPROC) ( GLint x, GLint y ); +typedef void (APIENTRYP PFNGLVERTEX2SPROC) ( GLshort x, GLshort y ); + +typedef void (APIENTRYP PFNGLVERTEX3DPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP PFNGLVERTEX3FPROC) ( GLfloat x, GLfloat y, GLfloat z ); +typedef void (APIENTRYP PFNGLVERTEX3IPROC) ( GLint x, GLint y, GLint z ); +typedef void (APIENTRYP PFNGLVERTEX3SPROC) ( GLshort x, GLshort y, GLshort z ); + +typedef void (APIENTRYP PFNGLVERTEX4DPROC) ( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +typedef void (APIENTRYP PFNGLVERTEX4FPROC) ( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +typedef void (APIENTRYP PFNGLVERTEX4IPROC) ( GLint x, GLint y, GLint z, GLint w ); +typedef void (APIENTRYP PFNGLVERTEX4SPROC) ( GLshort x, GLshort y, GLshort z, GLshort w ); + +typedef void (APIENTRYP PFNGLVERTEX2DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLVERTEX2FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLVERTEX2IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLVERTEX2SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLVERTEX3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLVERTEX3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLVERTEX3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLVERTEX3SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLVERTEX4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLVERTEX4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLVERTEX4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLVERTEX4SVPROC) ( const GLshort *v ); + + +typedef void (APIENTRYP PFNGLNORMAL3BPROC) ( GLbyte nx, GLbyte ny, GLbyte nz ); +typedef void (APIENTRYP PFNGLNORMAL3DPROC) ( GLdouble nx, GLdouble ny, GLdouble nz ); +typedef void (APIENTRYP PFNGLNORMAL3FPROC) ( GLfloat nx, GLfloat ny, GLfloat nz ); +typedef void (APIENTRYP PFNGLNORMAL3IPROC) ( GLint nx, GLint ny, GLint nz ); +typedef void (APIENTRYP PFNGLNORMAL3SPROC) ( GLshort nx, GLshort ny, GLshort nz ); + +typedef void (APIENTRYP PFNGLNORMAL3BVPROC) ( const GLbyte *v ); +typedef void (APIENTRYP PFNGLNORMAL3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLNORMAL3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLNORMAL3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLNORMAL3SVPROC) ( const GLshort *v ); + + +typedef void (APIENTRYP PFNGLINDEXDPROC) ( GLdouble c ); +typedef void (APIENTRYP PFNGLINDEXFPROC) ( GLfloat c ); +typedef void (APIENTRYP PFNGLINDEXIPROC) ( GLint c ); +typedef void (APIENTRYP PFNGLINDEXSPROC) ( GLshort c ); +typedef void (APIENTRYP PFNGLINDEXUBPROC) ( GLubyte c ); /* 1.1 */ + +typedef void (APIENTRYP PFNGLINDEXDVPROC) ( const GLdouble *c ); +typedef void (APIENTRYP PFNGLINDEXFVPROC) ( const GLfloat *c ); +typedef void (APIENTRYP PFNGLINDEXIVPROC) ( const GLint *c ); +typedef void (APIENTRYP PFNGLINDEXSVPROC) ( const GLshort *c ); +typedef void (APIENTRYP PFNGLINDEXUBVPROC) ( const GLubyte *c ); /* 1.1 */ + +typedef void (APIENTRYP PFNGLCOLOR3BPROC) ( GLbyte red, GLbyte green, GLbyte blue ); +typedef void (APIENTRYP PFNGLCOLOR3DPROC) ( GLdouble red, GLdouble green, GLdouble blue ); +typedef void (APIENTRYP PFNGLCOLOR3FPROC) ( GLfloat red, GLfloat green, GLfloat blue ); +typedef void (APIENTRYP PFNGLCOLOR3IPROC) ( GLint red, GLint green, GLint blue ); +typedef void (APIENTRYP PFNGLCOLOR3SPROC) ( GLshort red, GLshort green, GLshort blue ); +typedef void (APIENTRYP PFNGLCOLOR3UBPROC) ( GLubyte red, GLubyte green, GLubyte blue ); +typedef void (APIENTRYP PFNGLCOLOR3UIPROC) ( GLuint red, GLuint green, GLuint blue ); +typedef void (APIENTRYP PFNGLCOLOR3USPROC) ( GLushort red, GLushort green, GLushort blue ); + +typedef void (APIENTRYP PFNGLCOLOR4BPROC) ( GLbyte red, GLbyte green, + GLbyte blue, GLbyte alpha ); +typedef void (APIENTRYP PFNGLCOLOR4DPROC) ( GLdouble red, GLdouble green, + GLdouble blue, GLdouble alpha ); +typedef void (APIENTRYP PFNGLCOLOR4FPROC) ( GLfloat red, GLfloat green, + GLfloat blue, GLfloat alpha ); +typedef void (APIENTRYP PFNGLCOLOR4IPROC) ( GLint red, GLint green, + GLint blue, GLint alpha ); +typedef void (APIENTRYP PFNGLCOLOR4SPROC) ( GLshort red, GLshort green, + GLshort blue, GLshort alpha ); +typedef void (APIENTRYP PFNGLCOLOR4UBPROC) ( GLubyte red, GLubyte green, + GLubyte blue, GLubyte alpha ); +typedef void (APIENTRYP PFNGLCOLOR4UIPROC) ( GLuint red, GLuint green, + GLuint blue, GLuint alpha ); +typedef void (APIENTRYP PFNGLCOLOR4USPROC) ( GLushort red, GLushort green, + GLushort blue, GLushort alpha ); + + +typedef void (APIENTRYP PFNGLCOLOR3BVPROC) ( const GLbyte *v ); +typedef void (APIENTRYP PFNGLCOLOR3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLCOLOR3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLCOLOR3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLCOLOR3SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP PFNGLCOLOR3UBVPROC) ( const GLubyte *v ); +typedef void (APIENTRYP PFNGLCOLOR3UIVPROC) ( const GLuint *v ); +typedef void (APIENTRYP PFNGLCOLOR3USVPROC) ( const GLushort *v ); + +typedef void (APIENTRYP PFNGLCOLOR4BVPROC) ( const GLbyte *v ); +typedef void (APIENTRYP PFNGLCOLOR4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLCOLOR4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLCOLOR4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLCOLOR4SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP PFNGLCOLOR4UBVPROC) ( const GLubyte *v ); +typedef void (APIENTRYP PFNGLCOLOR4UIVPROC) ( const GLuint *v ); +typedef void (APIENTRYP PFNGLCOLOR4USVPROC) ( const GLushort *v ); + + +typedef void (APIENTRYP PFNGLTEXCOORD1DPROC) ( GLdouble s ); +typedef void (APIENTRYP PFNGLTEXCOORD1FPROC) ( GLfloat s ); +typedef void (APIENTRYP PFNGLTEXCOORD1IPROC) ( GLint s ); +typedef void (APIENTRYP PFNGLTEXCOORD1SPROC) ( GLshort s ); + +typedef void (APIENTRYP PFNGLTEXCOORD2DPROC) ( GLdouble s, GLdouble t ); +typedef void (APIENTRYP PFNGLTEXCOORD2FPROC) ( GLfloat s, GLfloat t ); +typedef void (APIENTRYP PFNGLTEXCOORD2IPROC) ( GLint s, GLint t ); +typedef void (APIENTRYP PFNGLTEXCOORD2SPROC) ( GLshort s, GLshort t ); + +typedef void (APIENTRYP PFNGLTEXCOORD3DPROC) ( GLdouble s, GLdouble t, GLdouble r ); +typedef void (APIENTRYP PFNGLTEXCOORD3FPROC) ( GLfloat s, GLfloat t, GLfloat r ); +typedef void (APIENTRYP PFNGLTEXCOORD3IPROC) ( GLint s, GLint t, GLint r ); +typedef void (APIENTRYP PFNGLTEXCOORD3SPROC) ( GLshort s, GLshort t, GLshort r ); + +typedef void (APIENTRYP PFNGLTEXCOORD4DPROC) ( GLdouble s, GLdouble t, GLdouble r, GLdouble q ); +typedef void (APIENTRYP PFNGLTEXCOORD4FPROC) ( GLfloat s, GLfloat t, GLfloat r, GLfloat q ); +typedef void (APIENTRYP PFNGLTEXCOORD4IPROC) ( GLint s, GLint t, GLint r, GLint q ); +typedef void (APIENTRYP PFNGLTEXCOORD4SPROC) ( GLshort s, GLshort t, GLshort r, GLshort q ); + +typedef void (APIENTRYP PFNGLTEXCOORD1DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLTEXCOORD1FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLTEXCOORD1IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLTEXCOORD1SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLTEXCOORD2DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLTEXCOORD2FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLTEXCOORD2IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLTEXCOORD2SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLTEXCOORD3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLTEXCOORD3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLTEXCOORD3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLTEXCOORD3SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLTEXCOORD4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLTEXCOORD4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLTEXCOORD4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLTEXCOORD4SVPROC) ( const GLshort *v ); + + +typedef void (APIENTRYP PFNGLRASTERPOS2DPROC) ( GLdouble x, GLdouble y ); +typedef void (APIENTRYP PFNGLRASTERPOS2FPROC) ( GLfloat x, GLfloat y ); +typedef void (APIENTRYP PFNGLRASTERPOS2IPROC) ( GLint x, GLint y ); +typedef void (APIENTRYP PFNGLRASTERPOS2SPROC) ( GLshort x, GLshort y ); + +typedef void (APIENTRYP PFNGLRASTERPOS3DPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP PFNGLRASTERPOS3FPROC) ( GLfloat x, GLfloat y, GLfloat z ); +typedef void (APIENTRYP PFNGLRASTERPOS3IPROC) ( GLint x, GLint y, GLint z ); +typedef void (APIENTRYP PFNGLRASTERPOS3SPROC) ( GLshort x, GLshort y, GLshort z ); + +typedef void (APIENTRYP PFNGLRASTERPOS4DPROC) ( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +typedef void (APIENTRYP PFNGLRASTERPOS4FPROC) ( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +typedef void (APIENTRYP PFNGLRASTERPOS4IPROC) ( GLint x, GLint y, GLint z, GLint w ); +typedef void (APIENTRYP PFNGLRASTERPOS4SPROC) ( GLshort x, GLshort y, GLshort z, GLshort w ); + +typedef void (APIENTRYP PFNGLRASTERPOS2DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLRASTERPOS2FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLRASTERPOS2IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLRASTERPOS2SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLRASTERPOS3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLRASTERPOS3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLRASTERPOS3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLRASTERPOS3SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLRASTERPOS4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLRASTERPOS4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLRASTERPOS4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLRASTERPOS4SVPROC) ( const GLshort *v ); + + +typedef void (APIENTRYP PFNGLRECTDPROC) ( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ); +typedef void (APIENTRYP PFNGLRECTFPROC) ( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ); +typedef void (APIENTRYP PFNGLRECTIPROC) ( GLint x1, GLint y1, GLint x2, GLint y2 ); +typedef void (APIENTRYP PFNGLRECTSPROC) ( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ); + + +typedef void (APIENTRYP PFNGLRECTDVPROC) ( const GLdouble *v1, const GLdouble *v2 ); +typedef void (APIENTRYP PFNGLRECTFVPROC) ( const GLfloat *v1, const GLfloat *v2 ); +typedef void (APIENTRYP PFNGLRECTIVPROC) ( const GLint *v1, const GLint *v2 ); +typedef void (APIENTRYP PFNGLRECTSVPROC) ( const GLshort *v1, const GLshort *v2 ); + + +/* + * Vertex Arrays (1.1) + */ + +typedef void (APIENTRYP PFNGLVERTEXPOINTERPROC) ( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLNORMALPOINTERPROC) ( GLenum type, GLsizei stride, + const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLCOLORPOINTERPROC) ( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLINDEXPOINTERPROC) ( GLenum type, GLsizei stride, + const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERPROC) ( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERPROC) ( GLsizei stride, const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLGETPOINTERVPROC) ( GLenum pname, GLvoid **params ); + +typedef void (APIENTRYP PFNGLARRAYELEMENTPROC) ( GLint i ); + +typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) ( GLenum mode, GLint first, GLsizei count ); + +typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) ( GLenum mode, GLsizei count, + GLenum type, const GLvoid *indices ); + +typedef void (APIENTRYP PFNGLINTERLEAVEDARRAYSPROC) ( GLenum format, GLsizei stride, + const GLvoid *pointer ); + +/* + * Lighting + */ + +typedef void (APIENTRYP PFNGLSHADEMODELPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLLIGHTFPROC) ( GLenum light, GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLLIGHTIPROC) ( GLenum light, GLenum pname, GLint param ); +typedef void (APIENTRYP PFNGLLIGHTFVPROC) ( GLenum light, GLenum pname, + const GLfloat *params ); +typedef void (APIENTRYP PFNGLLIGHTIVPROC) ( GLenum light, GLenum pname, + const GLint *params ); + +typedef void (APIENTRYP PFNGLGETLIGHTFVPROC) ( GLenum light, GLenum pname, + GLfloat *params ); +typedef void (APIENTRYP PFNGLGETLIGHTIVPROC) ( GLenum light, GLenum pname, + GLint *params ); + +typedef void (APIENTRYP PFNGLLIGHTMODELFPROC) ( GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLLIGHTMODELIPROC) ( GLenum pname, GLint param ); +typedef void (APIENTRYP PFNGLLIGHTMODELFVPROC) ( GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP PFNGLLIGHTMODELIVPROC) ( GLenum pname, const GLint *params ); + +typedef void (APIENTRYP PFNGLMATERIALFPROC) ( GLenum face, GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLMATERIALIPROC) ( GLenum face, GLenum pname, GLint param ); +typedef void (APIENTRYP PFNGLMATERIALFVPROC) ( GLenum face, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP PFNGLMATERIALIVPROC) ( GLenum face, GLenum pname, const GLint *params ); + +typedef void (APIENTRYP PFNGLGETMATERIALFVPROC) ( GLenum face, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP PFNGLGETMATERIALIVPROC) ( GLenum face, GLenum pname, GLint *params ); + +typedef void (APIENTRYP PFNGLCOLORMATERIALPROC) ( GLenum face, GLenum mode ); + + +/* + * Raster functions + */ + +typedef void (APIENTRYP PFNGLPIXELZOOMPROC) ( GLfloat xfactor, GLfloat yfactor ); + +typedef void (APIENTRYP PFNGLPIXELSTOREFPROC) ( GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) ( GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLPIXELTRANSFERFPROC) ( GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLPIXELTRANSFERIPROC) ( GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLPIXELMAPFVPROC) ( GLenum map, GLsizei mapsize, + const GLfloat *values ); +typedef void (APIENTRYP PFNGLPIXELMAPUIVPROC) ( GLenum map, GLsizei mapsize, + const GLuint *values ); +typedef void (APIENTRYP PFNGLPIXELMAPUSVPROC) ( GLenum map, GLsizei mapsize, + const GLushort *values ); + +typedef void (APIENTRYP PFNGLGETPIXELMAPFVPROC) ( GLenum map, GLfloat *values ); +typedef void (APIENTRYP PFNGLGETPIXELMAPUIVPROC) ( GLenum map, GLuint *values ); +typedef void (APIENTRYP PFNGLGETPIXELMAPUSVPROC) ( GLenum map, GLushort *values ); + +typedef void (APIENTRYP PFNGLBITMAPPROC) ( GLsizei width, GLsizei height, + GLfloat xorig, GLfloat yorig, + GLfloat xmove, GLfloat ymove, + const GLubyte *bitmap ); + +typedef void (APIENTRYP PFNGLREADPIXELSPROC) ( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + GLvoid *pixels ); + +typedef void (APIENTRYP PFNGLDRAWPIXELSPROC) ( GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); + +typedef void (APIENTRYP PFNGLCOPYPIXELSPROC) ( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum type ); + +/* + * Stenciling + */ + +typedef void (APIENTRYP PFNGLSTENCILFUNCPROC) ( GLenum func, GLint ref, GLuint mask ); + +typedef void (APIENTRYP PFNGLSTENCILMASKPROC) ( GLuint mask ); + +typedef void (APIENTRYP PFNGLSTENCILOPPROC) ( GLenum fail, GLenum zfail, GLenum zpass ); + +typedef void (APIENTRYP PFNGLCLEARSTENCILPROC) ( GLint s ); + + + +/* + * Texture mapping + */ + +typedef void (APIENTRYP PFNGLTEXGENDPROC) ( GLenum coord, GLenum pname, GLdouble param ); +typedef void (APIENTRYP PFNGLTEXGENFPROC) ( GLenum coord, GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLTEXGENIPROC) ( GLenum coord, GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLTEXGENDVPROC) ( GLenum coord, GLenum pname, const GLdouble *params ); +typedef void (APIENTRYP PFNGLTEXGENFVPROC) ( GLenum coord, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP PFNGLTEXGENIVPROC) ( GLenum coord, GLenum pname, const GLint *params ); + +typedef void (APIENTRYP PFNGLGETTEXGENDVPROC) ( GLenum coord, GLenum pname, GLdouble *params ); +typedef void (APIENTRYP PFNGLGETTEXGENFVPROC) ( GLenum coord, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP PFNGLGETTEXGENIVPROC) ( GLenum coord, GLenum pname, GLint *params ); + + +typedef void (APIENTRYP PFNGLTEXENVFPROC) ( GLenum target, GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLTEXENVIPROC) ( GLenum target, GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLTEXENVFVPROC) ( GLenum target, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP PFNGLTEXENVIVPROC) ( GLenum target, GLenum pname, const GLint *params ); + +typedef void (APIENTRYP PFNGLGETTEXENVFVPROC) ( GLenum target, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP PFNGLGETTEXENVIVPROC) ( GLenum target, GLenum pname, GLint *params ); + + +typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC) ( GLenum target, GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) ( GLenum target, GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC) ( GLenum target, GLenum pname, + const GLfloat *params ); +typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC) ( GLenum target, GLenum pname, + const GLint *params ); + +typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC) ( GLenum target, + GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC) ( GLenum target, + GLenum pname, GLint *params ); + +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) ( GLenum target, GLint level, + GLenum pname, GLfloat *params ); +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) ( GLenum target, GLint level, + GLenum pname, GLint *params ); + + +typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC) ( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels ); + +typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) ( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, + GLint border, GLenum format, GLenum type, + const GLvoid *pixels ); + +typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC) ( GLenum target, GLint level, + GLenum format, GLenum type, + GLvoid *pixels ); + + +/* 1.1 functions */ + +typedef void (APIENTRYP PFNGLGENTEXTURESPROC) ( GLsizei n, GLuint *textures ); + +typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) ( GLsizei n, const GLuint *textures); + +typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) ( GLenum target, GLuint texture ); + +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESPROC) ( GLsizei n, + const GLuint *textures, + const GLclampf *priorities ); + +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTPROC) ( GLsizei n, + const GLuint *textures, + GLboolean *residences ); + +typedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC) ( GLuint texture ); + + +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC) ( GLenum target, GLint level, + GLint xoffset, + GLsizei width, GLenum format, + GLenum type, const GLvoid *pixels ); + + +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) ( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); + + +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC) ( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLint border ); + + +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) ( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLsizei height, + GLint border ); + + +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC) ( GLenum target, GLint level, + GLint xoffset, GLint x, GLint y, + GLsizei width ); + + +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) ( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint x, GLint y, + GLsizei width, GLsizei height ); + + +/* + * Evaluators + */ + +typedef void (APIENTRYP PFNGLMAP1DPROC) ( GLenum target, GLdouble u1, GLdouble u2, + GLint stride, + GLint order, const GLdouble *points ); +typedef void (APIENTRYP PFNGLMAP1FPROC) ( GLenum target, GLfloat u1, GLfloat u2, + GLint stride, + GLint order, const GLfloat *points ); + +typedef void (APIENTRYP PFNGLMAP2DPROC) ( GLenum target, + GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, + GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, + const GLdouble *points ); +typedef void (APIENTRYP PFNGLMAP2FPROC) ( GLenum target, + GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, + GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, + const GLfloat *points ); + +typedef void (APIENTRYP PFNGLGETMAPDVPROC) ( GLenum target, GLenum query, GLdouble *v ); +typedef void (APIENTRYP PFNGLGETMAPFVPROC) ( GLenum target, GLenum query, GLfloat *v ); +typedef void (APIENTRYP PFNGLGETMAPIVPROC) ( GLenum target, GLenum query, GLint *v ); + +typedef void (APIENTRYP PFNGLEVALCOORD1DPROC) ( GLdouble u ); +typedef void (APIENTRYP PFNGLEVALCOORD1FPROC) ( GLfloat u ); + +typedef void (APIENTRYP PFNGLEVALCOORD1DVPROC) ( const GLdouble *u ); +typedef void (APIENTRYP PFNGLEVALCOORD1FVPROC) ( const GLfloat *u ); + +typedef void (APIENTRYP PFNGLEVALCOORD2DPROC) ( GLdouble u, GLdouble v ); +typedef void (APIENTRYP PFNGLEVALCOORD2FPROC) ( GLfloat u, GLfloat v ); + +typedef void (APIENTRYP PFNGLEVALCOORD2DVPROC) ( const GLdouble *u ); +typedef void (APIENTRYP PFNGLEVALCOORD2FVPROC) ( const GLfloat *u ); + +typedef void (APIENTRYP PFNGLMAPGRID1DPROC) ( GLint un, GLdouble u1, GLdouble u2 ); +typedef void (APIENTRYP PFNGLMAPGRID1FPROC) ( GLint un, GLfloat u1, GLfloat u2 ); + +typedef void (APIENTRYP PFNGLMAPGRID2DPROC) ( GLint un, GLdouble u1, GLdouble u2, + GLint vn, GLdouble v1, GLdouble v2 ); +typedef void (APIENTRYP PFNGLMAPGRID2FPROC) ( GLint un, GLfloat u1, GLfloat u2, + GLint vn, GLfloat v1, GLfloat v2 ); + +typedef void (APIENTRYP PFNGLEVALPOINT1PROC) ( GLint i ); + +typedef void (APIENTRYP PFNGLEVALPOINT2PROC) ( GLint i, GLint j ); + +typedef void (APIENTRYP PFNGLEVALMESH1PROC) ( GLenum mode, GLint i1, GLint i2 ); + +typedef void (APIENTRYP PFNGLEVALMESH2PROC) ( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); + + +/* + * Fog + */ + +typedef void (APIENTRYP PFNGLFOGFPROC) ( GLenum pname, GLfloat param ); + +typedef void (APIENTRYP PFNGLFOGIPROC) ( GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLFOGFVPROC) ( GLenum pname, const GLfloat *params ); + +typedef void (APIENTRYP PFNGLFOGIVPROC) ( GLenum pname, const GLint *params ); + + +/* + * Selection and Feedback + */ + +typedef void (APIENTRYP PFNGLFEEDBACKBUFFERPROC) ( GLsizei size, GLenum type, GLfloat *buffer ); + +typedef void (APIENTRYP PFNGLPASSTHROUGHPROC) ( GLfloat token ); + +typedef void (APIENTRYP PFNGLSELECTBUFFERPROC) ( GLsizei size, GLuint *buffer ); + +typedef void (APIENTRYP PFNGLINITNAMESPROC) ( void ); + +typedef void (APIENTRYP PFNGLLOADNAMEPROC) ( GLuint name ); + +typedef void (APIENTRYP PFNGLPUSHNAMEPROC) ( GLuint name ); + +typedef void (APIENTRYP PFNGLPOPNAMEPROC) ( void ); +#endif /* @@ -1528,6 +2229,8 @@ GLAPI void GLAPIENTRY glPopName( void ); #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_TEXTURE_BINDING_3D 0x806A +#ifndef SDL_OPENGL_1_NO_PROTOTYPES + GLAPI void GLAPIENTRY glDrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); @@ -1551,6 +2254,34 @@ GLAPI void GLAPIENTRY glCopyTexSubImage3D( GLenum target, GLint level, GLint y, GLsizei width, GLsizei height ); +#endif +#ifdef SDL_OPENGL_1_FUNCTION_TYPEDEFS + +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 ); + +#endif + 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); @@ -1638,6 +2369,8 @@ typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, #define GL_BLEND_COLOR 0x8005 +#ifndef SDL_OPENGL_1_NO_PROTOTYPES + GLAPI void GLAPIENTRY glColorTable( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table ); @@ -1746,6 +2479,119 @@ GLAPI void GLAPIENTRY glSeparableFilter2D( GLenum target, GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); +#endif +#ifdef SDL_OPENGL_1_FUNCTION_TYPEDEFS + +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) ( GLenum target, GLenum internalformat, + GLsizei width, GLenum format, + GLenum type, const GLvoid *table ); + +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) ( GLenum target, + GLsizei start, GLsizei count, + GLenum format, GLenum type, + const GLvoid *data ); + +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, + const GLint *params); + +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, + const GLfloat *params); + +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) ( GLenum target, GLsizei start, + GLint x, GLint y, GLsizei width ); + +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) ( GLenum target, GLenum internalformat, + GLint x, GLint y, GLsizei width ); + +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) ( GLenum target, GLenum format, + GLenum type, GLvoid *table ); + +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) ( GLenum target, GLenum pname, + GLfloat *params ); + +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) ( GLenum target, GLenum pname, + GLint *params ); + +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) ( GLclampf red, GLclampf green, + GLclampf blue, GLclampf alpha ); + +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) ( GLenum target, GLsizei width, + GLenum internalformat, GLboolean sink ); + +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) ( GLenum target ); + +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) ( GLenum target, GLboolean reset, + GLenum format, GLenum type, + GLvoid *values ); + +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) ( GLenum target, GLenum pname, + GLfloat *params ); + +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) ( GLenum target, GLenum pname, + GLint *params ); + +typedef void (APIENTRYP PFNGLMINMAXPROC) ( GLenum target, GLenum internalformat, + GLboolean sink ); + +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) ( GLenum target ); + +typedef void (APIENTRYP PFNGLGETMINMAXPROC) ( GLenum target, GLboolean reset, + GLenum format, GLenum types, + GLvoid *values ); + +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) ( GLenum target, GLenum pname, + GLfloat *params ); + +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) ( GLenum target, GLenum pname, + GLint *params ); + +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) ( GLenum target, + GLenum internalformat, GLsizei width, GLenum format, GLenum type, + const GLvoid *image ); + +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) ( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *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, GLvoid *image ); + +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) ( GLenum target, GLenum pname, + GLfloat *params ); + +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) ( GLenum target, GLenum pname, + GLint *params ); + +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) ( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *row, const GLvoid *column ); + +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) ( GLenum target, GLenum format, + GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); + +#endif + @@ -1858,6 +2704,8 @@ GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format, /* texture_border_clamp */ #define GL_CLAMP_TO_BORDER 0x812D +#ifndef SDL_OPENGL_1_NO_PROTOTYPES + GLAPI void GLAPIENTRY glActiveTexture( GLenum texture ); GLAPI void GLAPIENTRY glClientActiveTexture( GLenum texture ); @@ -1951,6 +2799,104 @@ GLAPI void GLAPIENTRY glMultTransposeMatrixf( const GLfloat m[16] ); GLAPI void GLAPIENTRY glSampleCoverage( GLclampf value, GLboolean invert ); +#endif +#ifdef SDL_OPENGL_1_FUNCTION_TYPEDEFS + +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) ( GLenum texture ); + +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) ( GLenum texture ); + +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) ( GLenum target, GLint level, GLenum internalformat, GLsizei width, 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 PFNGLCOMPRESSEDTEXIMAGE3DPROC) ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, 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 PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, 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 PFNGLGETCOMPRESSEDTEXIMAGEPROC) ( GLenum target, GLint lod, GLvoid *img ); + +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 PFNGLLOADTRANSPOSEMATRIXDPROC) ( const GLdouble m[16] ); + +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) ( const GLfloat m[16] ); + +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) ( const GLdouble m[16] ); + +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) ( const GLfloat m[16] ); + +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) ( GLclampf value, GLboolean invert ); + +#endif + typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); @@ -2006,6 +2952,8 @@ typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint le #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#ifndef SDL_OPENGL_1_NO_PROTOTYPES + GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture); GLAPI void GLAPIENTRY glClientActiveTextureARB(GLenum texture); GLAPI void GLAPIENTRY glMultiTexCoord1dARB(GLenum target, GLdouble s); @@ -2041,6 +2989,46 @@ 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); +#endif +#ifdef SDL_OPENGL_1_FUNCTION_TYPEDEFS + +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 + typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengles.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengles.h index bde4d74..4fb9a4b 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengles.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengles2.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengles2.h index ba19601..365898a 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengles2.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_opengles2.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_pen.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_pen.h index cda4f0f..5182eeb 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_pen.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_pen.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -39,7 +39,9 @@ #ifndef SDL_pen_h_ #define SDL_pen_h_ -#include +#include +#include +#include /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus @@ -55,24 +57,39 @@ extern "C" { * consistent as long as SDL can recognize a tool to be the same pen; but if a * pen physically leaves the area and returns, it might get a new ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_PenID; +/** + * The SDL_MouseID for mouse events simulated with pen input. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PEN_MOUSEID ((SDL_MouseID)-2) + +/** + * The SDL_TouchID for touch events simulated with pen input. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PEN_TOUCHID ((SDL_TouchID)-2) + /** * Pen input flags, as reported by various pen events' `pen_state` field. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_PenInputFlags; -#define SDL_PEN_INPUT_DOWN (1u << 0) /**< & to see if pen is pressed down */ -#define SDL_PEN_INPUT_BUTTON_1 (1u << 1) /**< & to see if button 1 is pressed */ -#define SDL_PEN_INPUT_BUTTON_2 (1u << 2) /**< & to see if button 2 is pressed */ -#define SDL_PEN_INPUT_BUTTON_3 (1u << 3) /**< & to see if button 3 is pressed */ -#define SDL_PEN_INPUT_BUTTON_4 (1u << 4) /**< & to see if button 4 is pressed */ -#define SDL_PEN_INPUT_BUTTON_5 (1u << 5) /**< & to see if button 5 is pressed */ -#define SDL_PEN_INPUT_ERASER_TIP (1u << 30) /**< & to see if eraser tip is used */ + +#define SDL_PEN_INPUT_DOWN (1u << 0) /**< pen is pressed down */ +#define SDL_PEN_INPUT_BUTTON_1 (1u << 1) /**< button 1 is pressed */ +#define SDL_PEN_INPUT_BUTTON_2 (1u << 2) /**< button 2 is pressed */ +#define SDL_PEN_INPUT_BUTTON_3 (1u << 3) /**< button 3 is pressed */ +#define SDL_PEN_INPUT_BUTTON_4 (1u << 4) /**< button 4 is pressed */ +#define SDL_PEN_INPUT_BUTTON_5 (1u << 5) /**< button 5 is pressed */ +#define SDL_PEN_INPUT_ERASER_TIP (1u << 30) /**< eraser tip is used */ /** * Pen axis indices. @@ -87,20 +104,18 @@ typedef Uint32 SDL_PenInputFlags; * * `SDL_sinf(xtilt * SDL_PI_F / 180.0)`. * - * \since This enum is available since SDL 3.0.0 + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PenAxis { SDL_PEN_AXIS_PRESSURE, /**< Pen pressure. Unidirectional: 0 to 1.0 */ - SDL_PEN_AXIS_XTILT, /**< Pen horizontal tilt angle. Bidirectional: -90.0 to 90.0 (left-to-right). - The physical max/min tilt may be smaller than -90.0 / 90.0, check SDL_PenCapabilityInfo */ - SDL_PEN_AXIS_YTILT, /**< Pen vertical tilt angle. Bidirectional: -90.0 to 90.0 (top-to-down). - The physical max/min tilt may be smaller than -90.0 / 90.0 check SDL_PenCapabilityInfo */ + SDL_PEN_AXIS_XTILT, /**< Pen horizontal tilt angle. Bidirectional: -90.0 to 90.0 (left-to-right). */ + SDL_PEN_AXIS_YTILT, /**< Pen vertical tilt angle. Bidirectional: -90.0 to 90.0 (top-to-down). */ SDL_PEN_AXIS_DISTANCE, /**< Pen distance to drawing surface. Unidirectional: 0.0 to 1.0 */ SDL_PEN_AXIS_ROTATION, /**< Pen barrel rotation. Bidirectional: -180 to 179.9 (clockwise, 0 is facing up, -180.0 is facing down). */ SDL_PEN_AXIS_SLIDER, /**< Pen finger wheel or slider (e.g., Airbrush Pen). Unidirectional: 0 to 1.0 */ SDL_PEN_AXIS_TANGENTIAL_PRESSURE, /**< Pressure from squeezing the pen ("barrel pressure"). */ - SDL_PEN_NUM_AXES /**< Total known pen axis types in this version of SDL. This number may grow in future releases! */ + SDL_PEN_AXIS_COUNT /**< Total known pen axis types in this version of SDL. This number may grow in future releases! */ } SDL_PenAxis; /* Ends C function definitions when using C++ */ @@ -110,4 +125,3 @@ typedef enum SDL_PenAxis #endif /* SDL_pen_h_ */ -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_pixels.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_pixels.h index 3825dd5..b6f38ac 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_pixels.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_pixels.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,59 @@ /** * # CategoryPixels * - * Pixel management. + * SDL offers facilities for pixel management. + * + * Largely these facilities deal with pixel _format_: what does this set of + * bits represent? + * + * If you mostly want to think of a pixel as some combination of red, green, + * blue, and maybe alpha intensities, this is all pretty straightforward, and + * in many cases, is enough information to build a perfectly fine game. + * + * However, the actual definition of a pixel is more complex than that: + * + * Pixels are a representation of a color in a particular color space. + * + * The first characteristic of a color space is the color type. SDL + * understands two different color types, RGB and YCbCr, or in SDL also + * referred to as YUV. + * + * RGB colors consist of red, green, and blue channels of color that are added + * together to represent the colors we see on the screen. + * + * https://en.wikipedia.org/wiki/RGB_color_model + * + * YCbCr colors represent colors as a Y luma brightness component and red and + * blue chroma color offsets. This color representation takes advantage of the + * fact that the human eye is more sensitive to brightness than the color in + * an image. The Cb and Cr components are often compressed and have lower + * resolution than the luma component. + * + * https://en.wikipedia.org/wiki/YCbCr + * + * When the color information in YCbCr is compressed, the Y pixels are left at + * full resolution and each Cr and Cb pixel represents an average of the color + * information in a block of Y pixels. The chroma location determines where in + * that block of pixels the color information is coming from. + * + * The color range defines how much of the pixel to use when converting a + * pixel into a color on the display. When the full color range is used, the + * entire numeric range of the pixel bits is significant. When narrow color + * range is used, for historical reasons, the pixel uses only a portion of the + * numeric range to represent colors. + * + * The color primaries and white point are a definition of the colors in the + * color space relative to the standard XYZ color space. + * + * https://en.wikipedia.org/wiki/CIE_1931_color_space + * + * The transfer characteristic, or opto-electrical transfer function (OETF), + * is the way a color is converted from mathematically linear space into a + * non-linear output signals. + * + * https://en.wikipedia.org/wiki/Rec._709#Transfer_characteristics + * + * The matrix coefficients are used to convert between YCbCr and RGB colors. */ #ifndef SDL_pixels_h_ @@ -41,22 +93,44 @@ extern "C" { /** * A fully opaque 8-bit alpha value. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_ALPHA_TRANSPARENT */ #define SDL_ALPHA_OPAQUE 255 +/** + * A fully opaque floating point alpha value. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_ALPHA_TRANSPARENT_FLOAT + */ +#define SDL_ALPHA_OPAQUE_FLOAT 1.0f + /** * A fully transparent 8-bit alpha value. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_ALPHA_OPAQUE */ #define SDL_ALPHA_TRANSPARENT 0 -/** Pixel type. */ +/** + * A fully transparent floating point alpha value. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_ALPHA_OPAQUE_FLOAT + */ +#define SDL_ALPHA_TRANSPARENT_FLOAT 0.0f + +/** + * Pixel type. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_PixelType { SDL_PIXELTYPE_UNKNOWN, @@ -75,7 +149,11 @@ typedef enum SDL_PixelType SDL_PIXELTYPE_INDEX2 } SDL_PixelType; -/** Bitmap pixel order, high bit -> low bit. */ +/** + * Bitmap pixel order, high bit -> low bit. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_BitmapOrder { SDL_BITMAPORDER_NONE, @@ -83,7 +161,11 @@ typedef enum SDL_BitmapOrder SDL_BITMAPORDER_1234 } SDL_BitmapOrder; -/** Packed component order, high bit -> low bit. */ +/** + * Packed component order, high bit -> low bit. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_PackedOrder { SDL_PACKEDORDER_NONE, @@ -97,7 +179,11 @@ typedef enum SDL_PackedOrder SDL_PACKEDORDER_BGRA } SDL_PackedOrder; -/** Array component order, low byte -> high byte. */ +/** + * Array component order, low byte -> high byte. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_ArrayOrder { SDL_ARRAYORDER_NONE, @@ -109,7 +195,11 @@ typedef enum SDL_ArrayOrder SDL_ARRAYORDER_ABGR } SDL_ArrayOrder; -/** Packed component layout. */ +/** + * Packed component layout. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_PackedLayout { SDL_PACKEDLAYOUT_NONE, @@ -123,25 +213,172 @@ typedef enum SDL_PackedLayout SDL_PACKEDLAYOUT_1010102 } SDL_PackedLayout; +/** + * A macro for defining custom FourCC pixel formats. + * + * For example, defining SDL_PIXELFORMAT_YV12 looks like this: + * + * ```c + * SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2') + * ``` + * + * \param A the first character of the FourCC code. + * \param B the second character of the FourCC code. + * \param C the third character of the FourCC code. + * \param D the fourth character of the FourCC code. + * \returns a format value in the style of SDL_PixelFormat. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_DEFINE_PIXELFOURCC(A, B, C, D) SDL_FOURCC(A, B, C, D) +/** + * A macro for defining custom non-FourCC pixel formats. + * + * For example, defining SDL_PIXELFORMAT_RGBA8888 looks like this: + * + * ```c + * SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA, SDL_PACKEDLAYOUT_8888, 32, 4) + * ``` + * + * \param type the type of the new format, probably a SDL_PixelType value. + * \param order the order of the new format, probably a SDL_BitmapOrder, + * SDL_PackedOrder, or SDL_ArrayOrder value. + * \param layout the layout of the new format, probably an SDL_PackedLayout + * value or zero. + * \param bits the number of bits per pixel of the new format. + * \param bytes the number of bytes per pixel of the new format. + * \returns a format value in the style of SDL_PixelFormat. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #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) \ - (SDL_ISPIXELFORMAT_FOURCC(X) ? 0 : (((X) >> 8) & 0xFF)) -#define SDL_BYTESPERPIXEL(X) \ - (SDL_ISPIXELFORMAT_FOURCC(X) ? \ - ((((X) == SDL_PIXELFORMAT_YUY2) || \ - ((X) == SDL_PIXELFORMAT_UYVY) || \ - ((X) == SDL_PIXELFORMAT_YVYU) || \ - ((X) == SDL_PIXELFORMAT_P010)) ? 2 : 1) : (((X) >> 0) & 0xFF)) +/** + * A macro to retrieve the flags of an SDL_PixelFormat. + * + * This macro is generally not needed directly by an app, which should use + * specific tests, like SDL_ISPIXELFORMAT_FOURCC, instead. + * + * \param format an SDL_PixelFormat to check. + * \returns the flags of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PIXELFLAG(format) (((format) >> 28) & 0x0F) +/** + * A macro to retrieve the type of an SDL_PixelFormat. + * + * This is usually a value from the SDL_PixelType enumeration. + * + * \param format an SDL_PixelFormat to check. + * \returns the type of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PIXELTYPE(format) (((format) >> 24) & 0x0F) + +/** + * A macro to retrieve the order of an SDL_PixelFormat. + * + * This is usually a value from the SDL_BitmapOrder, SDL_PackedOrder, or + * SDL_ArrayOrder enumerations, depending on the format type. + * + * \param format an SDL_PixelFormat to check. + * \returns the order of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PIXELORDER(format) (((format) >> 20) & 0x0F) + +/** + * A macro to retrieve the layout of an SDL_PixelFormat. + * + * This is usually a value from the SDL_PackedLayout enumeration, or zero if a + * layout doesn't make sense for the format type. + * + * \param format an SDL_PixelFormat to check. + * \returns the layout of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PIXELLAYOUT(format) (((format) >> 16) & 0x0F) + +/** + * A macro to determine an SDL_PixelFormat's bits per pixel. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * FourCC formats will report zero here, as it rarely makes sense to measure + * them per-pixel. + * + * \param format an SDL_PixelFormat to check. + * \returns the bits-per-pixel of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_BYTESPERPIXEL + */ +#define SDL_BITSPERPIXEL(format) \ + (SDL_ISPIXELFORMAT_FOURCC(format) ? 0 : (((format) >> 8) & 0xFF)) + +/** + * A macro to determine an SDL_PixelFormat's bytes per pixel. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * FourCC formats do their best here, but many of them don't have a meaningful + * measurement of bytes per pixel. + * + * \param format an SDL_PixelFormat to check. + * \returns the bytes-per-pixel of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_BITSPERPIXEL + */ +#define SDL_BYTESPERPIXEL(format) \ + (SDL_ISPIXELFORMAT_FOURCC(format) ? \ + ((((format) == SDL_PIXELFORMAT_YUY2) || \ + ((format) == SDL_PIXELFORMAT_UYVY) || \ + ((format) == SDL_PIXELFORMAT_YVYU) || \ + ((format) == SDL_PIXELFORMAT_P010)) ? 2 : 1) : (((format) >> 0) & 0xFF)) + + +/** + * A macro to determine if an SDL_PixelFormat is an indexed format. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format is indexed, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ISPIXELFORMAT_INDEXED(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \ @@ -149,12 +386,38 @@ typedef enum SDL_PackedLayout (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \ (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8))) +/** + * A macro to determine if an SDL_PixelFormat is a packed format. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format is packed, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #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))) +/** + * A macro to determine if an SDL_PixelFormat is an array format. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format is an array, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ISPIXELFORMAT_ARRAY(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8) || \ @@ -163,25 +426,84 @@ typedef enum SDL_PackedLayout (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)))) - +/** + * A macro to determine if an SDL_PixelFormat is a 10-bit format. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format is 10-bit, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ISPIXELFORMAT_10BIT(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32) && \ (SDL_PIXELLAYOUT(format) == SDL_PACKEDLAYOUT_2101010))) +/** + * A macro to determine if an SDL_PixelFormat is a floating point format. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format is 10-bit, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ISPIXELFORMAT_FLOAT(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16) || \ (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32))) -/* The flag is set to 1 because 0x1? is not in the printable ASCII range */ -#define SDL_ISPIXELFORMAT_FOURCC(format) \ +/** + * A macro to determine if an SDL_PixelFormat has an alpha channel. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format has alpha, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#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)))) + + +/** + * A macro to determine if an SDL_PixelFormat is a "FourCC" format. + * + * This covers custom and other unusual formats. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format has alpha, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISPIXELFORMAT_FOURCC(format) /* The flag is set to 1 because 0x1? is not in the printable ASCII range */ \ ((format) && (SDL_PIXELFLAG(format) != 1)) /* Note: If you modify this enum, update SDL_GetPixelFormatName() */ @@ -221,7 +543,7 @@ typedef enum SDL_PackedLayout * an alias for ABGR8888 on little-endian CPUs like x86, or an alias for * RGBA8888 on big-endian CPUs. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PixelFormat { @@ -351,59 +673,35 @@ typedef enum SDL_PixelFormat /* SDL_DEFINE_PIXELFOURCC('N', 'V', '2', '1'), */ SDL_PIXELFORMAT_P010 = 0x30313050u, /**< Planar mode: Y + U/V interleaved (2 planes) */ /* SDL_DEFINE_PIXELFOURCC('P', '0', '1', '0'), */ - SDL_PIXELFORMAT_EXTERNAL_OES = 0x2053454fu /**< Android video texture format */ + SDL_PIXELFORMAT_EXTERNAL_OES = 0x2053454fu, /**< Android video texture format */ /* SDL_DEFINE_PIXELFOURCC('O', 'E', 'S', ' ') */ + + /* 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, + SDL_PIXELFORMAT_RGBX32 = SDL_PIXELFORMAT_RGBX8888, + SDL_PIXELFORMAT_XRGB32 = SDL_PIXELFORMAT_XRGB8888, + SDL_PIXELFORMAT_BGRX32 = SDL_PIXELFORMAT_BGRX8888, + SDL_PIXELFORMAT_XBGR32 = SDL_PIXELFORMAT_XBGR8888 + #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, + SDL_PIXELFORMAT_RGBX32 = SDL_PIXELFORMAT_XBGR8888, + SDL_PIXELFORMAT_XRGB32 = SDL_PIXELFORMAT_BGRX8888, + SDL_PIXELFORMAT_BGRX32 = SDL_PIXELFORMAT_XRGB8888, + SDL_PIXELFORMAT_XBGR32 = SDL_PIXELFORMAT_RGBX8888 + #endif } SDL_PixelFormat; -/* Aliases for RGBA byte arrays of color data, for the current platform */ -#if SDL_BYTEORDER == SDL_BIG_ENDIAN -#define SDL_PIXELFORMAT_RGBA32 SDL_PIXELFORMAT_RGBA8888 -#define SDL_PIXELFORMAT_ARGB32 SDL_PIXELFORMAT_ARGB8888 -#define SDL_PIXELFORMAT_BGRA32 SDL_PIXELFORMAT_BGRA8888 -#define SDL_PIXELFORMAT_ABGR32 SDL_PIXELFORMAT_ABGR8888 -#define SDL_PIXELFORMAT_RGBX32 SDL_PIXELFORMAT_RGBX8888 -#define SDL_PIXELFORMAT_XRGB32 SDL_PIXELFORMAT_XRGB8888 -#define SDL_PIXELFORMAT_BGRX32 SDL_PIXELFORMAT_BGRX8888 -#define SDL_PIXELFORMAT_XBGR32 SDL_PIXELFORMAT_XBGR8888 -#else -#define SDL_PIXELFORMAT_RGBA32 SDL_PIXELFORMAT_ABGR8888 -#define SDL_PIXELFORMAT_ARGB32 SDL_PIXELFORMAT_BGRA8888 -#define SDL_PIXELFORMAT_BGRA32 SDL_PIXELFORMAT_ARGB8888 -#define SDL_PIXELFORMAT_ABGR32 SDL_PIXELFORMAT_RGBA8888 -#define SDL_PIXELFORMAT_RGBX32 SDL_PIXELFORMAT_XBGR8888 -#define SDL_PIXELFORMAT_XRGB32 SDL_PIXELFORMAT_BGRX8888 -#define SDL_PIXELFORMAT_BGRX32 SDL_PIXELFORMAT_XRGB8888 -#define SDL_PIXELFORMAT_XBGR32 SDL_PIXELFORMAT_RGBX8888 -#endif - -/** - * Pixels are a representation of a color in a particular color space. - * - * The first characteristic of a color space is the color type. SDL understands two different color types, RGB and YCbCr, or in SDL also referred to as YUV. - * - * RGB colors consist of red, green, and blue channels of color that are added together to represent the colors we see on the screen. - * https://en.wikipedia.org/wiki/RGB_color_model - * - * YCbCr colors represent colors as a Y luma brightness component and red and blue chroma color offsets. This color representation takes advantage of the fact that the human eye is more sensitive to brightness than the color in an image. The Cb and Cr components are often compressed and have lower resolution than the luma component. - * https://en.wikipedia.org/wiki/YCbCr - * - * When the color information in YCbCr is compressed, the Y pixels are left at full resolution and each Cr and Cb pixel represents an average of the color information in a block of Y pixels. The chroma location determines where in that block of pixels the color information is coming from. - * - * The color range defines how much of the pixel to use when converting a pixel into a color on the display. When the full color range is used, the entire numeric range of the pixel bits is significant. When narrow color range is used, for historical reasons, the pixel uses only a portion of the numeric range to represent colors. - * - * The color primaries and white point are a definition of the colors in the color space relative to the standard XYZ color space. - * https://en.wikipedia.org/wiki/CIE_1931_color_space - * - * The transfer characteristic, or opto-electrical transfer function (OETF), is the way a color is converted from mathematically linear space into a non-linear output signals. - * https://en.wikipedia.org/wiki/Rec._709#Transfer_characteristics - * - * The matrix coefficients are used to convert between YCbCr and RGB colors. - */ - /** * Colorspace color type. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ColorType { @@ -416,7 +714,7 @@ typedef enum SDL_ColorType * Colorspace color range, as described by * https://www.itu.int/rec/R-REC-BT.2100-2-201807-I/en * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ColorRange { @@ -429,7 +727,7 @@ typedef enum SDL_ColorRange * Colorspace color primaries, as described by * https://www.itu.int/rec/T-REC-H.273-201612-S/en * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ColorPrimaries { @@ -454,7 +752,7 @@ typedef enum SDL_ColorPrimaries * * These are as described by https://www.itu.int/rec/T-REC-H.273-201612-S/en * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_TransferCharacteristics { @@ -484,7 +782,7 @@ typedef enum SDL_TransferCharacteristics * * These are as described by https://www.itu.int/rec/T-REC-H.273-201612-S/en * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_MatrixCoefficients { @@ -508,7 +806,7 @@ typedef enum SDL_MatrixCoefficients /** * Colorspace chroma sample location. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ChromaLocation { @@ -520,22 +818,177 @@ typedef enum SDL_ChromaLocation /* Colorspace definition */ + +/** + * A macro for defining custom SDL_Colorspace formats. + * + * For example, defining SDL_COLORSPACE_SRGB looks like this: + * + * ```c + * SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_RGB, + * SDL_COLOR_RANGE_FULL, + * SDL_COLOR_PRIMARIES_BT709, + * SDL_TRANSFER_CHARACTERISTICS_SRGB, + * SDL_MATRIX_COEFFICIENTS_IDENTITY, + * SDL_CHROMA_LOCATION_NONE) + * ``` + * + * \param type the type of the new format, probably an SDL_ColorType value. + * \param range the range of the new format, probably a SDL_ColorRange value. + * \param primaries the primaries of the new format, probably an + * SDL_ColorPrimaries value. + * \param transfer the transfer characteristics of the new format, probably an + * SDL_TransferCharacteristics value. + * \param matrix the matrix coefficients of the new format, probably an + * SDL_MatrixCoefficients value. + * \param chroma the chroma sample location of the new format, probably an + * SDL_ChromaLocation value. + * \returns a format value in the style of SDL_Colorspace. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_DEFINE_COLORSPACE(type, range, primaries, transfer, matrix, chroma) \ (((Uint32)(type) << 28) | ((Uint32)(range) << 24) | ((Uint32)(chroma) << 20) | \ ((Uint32)(primaries) << 10) | ((Uint32)(transfer) << 5) | ((Uint32)(matrix) << 0)) -#define SDL_COLORSPACETYPE(X) (SDL_ColorType)(((X) >> 28) & 0x0F) -#define SDL_COLORSPACERANGE(X) (SDL_ColorRange)(((X) >> 24) & 0x0F) -#define SDL_COLORSPACECHROMA(X) (SDL_ChromaLocation)(((X) >> 20) & 0x0F) -#define SDL_COLORSPACEPRIMARIES(X) (SDL_ColorPrimaries)(((X) >> 10) & 0x1F) -#define SDL_COLORSPACETRANSFER(X) (SDL_TransferCharacteristics)(((X) >> 5) & 0x1F) -#define SDL_COLORSPACEMATRIX(X) (SDL_MatrixCoefficients)((X) & 0x1F) +/** + * A macro to retrieve the type of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_ColorType for `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACETYPE(cspace) (SDL_ColorType)(((cspace) >> 28) & 0x0F) -#define SDL_ISCOLORSPACE_MATRIX_BT601(X) (SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT601 || SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT470BG) -#define SDL_ISCOLORSPACE_MATRIX_BT709(X) (SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT709) -#define SDL_ISCOLORSPACE_MATRIX_BT2020_NCL(X) (SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT2020_NCL) -#define SDL_ISCOLORSPACE_LIMITED_RANGE(X) (SDL_COLORSPACERANGE(X) != SDL_COLOR_RANGE_FULL) -#define SDL_ISCOLORSPACE_FULL_RANGE(X) (SDL_COLORSPACERANGE(X) == SDL_COLOR_RANGE_FULL) +/** + * A macro to retrieve the range of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_ColorRange of `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACERANGE(cspace) (SDL_ColorRange)(((cspace) >> 24) & 0x0F) + +/** + * A macro to retrieve the chroma sample location of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_ChromaLocation of `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACECHROMA(cspace) (SDL_ChromaLocation)(((cspace) >> 20) & 0x0F) + +/** + * A macro to retrieve the primaries of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_ColorPrimaries of `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACEPRIMARIES(cspace) (SDL_ColorPrimaries)(((cspace) >> 10) & 0x1F) + +/** + * A macro to retrieve the transfer characteristics of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_TransferCharacteristics of `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACETRANSFER(cspace) (SDL_TransferCharacteristics)(((cspace) >> 5) & 0x1F) + +/** + * A macro to retrieve the matrix coefficients of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_MatrixCoefficients of `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACEMATRIX(cspace) (SDL_MatrixCoefficients)((cspace) & 0x1F) + +/** + * A macro to determine if an SDL_Colorspace uses BT601 (or BT470BG) matrix + * coefficients. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param cspace an SDL_Colorspace to check. + * \returns true if BT601 or BT470BG, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISCOLORSPACE_MATRIX_BT601(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT601 || SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT470BG) + +/** + * A macro to determine if an SDL_Colorspace uses BT709 matrix coefficients. + * + * \param cspace an SDL_Colorspace to check. + * \returns true if BT709, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISCOLORSPACE_MATRIX_BT709(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT709) + +/** + * A macro to determine if an SDL_Colorspace uses BT2020_NCL matrix + * coefficients. + * + * \param cspace an SDL_Colorspace to check. + * \returns true if BT2020_NCL, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISCOLORSPACE_MATRIX_BT2020_NCL(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT2020_NCL) + +/** + * A macro to determine if an SDL_Colorspace has a limited range. + * + * \param cspace an SDL_Colorspace to check. + * \returns true if limited range, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISCOLORSPACE_LIMITED_RANGE(cspace) (SDL_COLORSPACERANGE(cspace) != SDL_COLOR_RANGE_FULL) + +/** + * A macro to determine if an SDL_Colorspace has a full range. + * + * \param cspace an SDL_Colorspace to check. + * \returns true if full range, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISCOLORSPACE_FULL_RANGE(cspace) (SDL_COLORSPACERANGE(cspace) == SDL_COLOR_RANGE_FULL) /** * Colorspace definitions. @@ -544,7 +997,7 @@ typedef enum SDL_ChromaLocation * function, etc.), this is not an exhaustive list, but rather a * representative sample of the kinds of colorspaces supported in SDL. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_ColorPrimaries * \sa SDL_ColorRange @@ -631,7 +1084,7 @@ typedef enum SDL_Colorspace SDL_MATRIX_COEFFICIENTS_BT2020_NCL, SDL_CHROMA_LOCATION_LEFT), */ - SDL_COLORSPACE_BT2020_FULL = 0x22102609u /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 */ + SDL_COLORSPACE_BT2020_FULL = 0x22102609u, /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 */ /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_YCBCR, SDL_COLOR_RANGE_FULL, SDL_COLOR_PRIMARIES_BT2020, @@ -639,15 +1092,10 @@ typedef enum SDL_Colorspace SDL_MATRIX_COEFFICIENTS_BT2020_NCL, SDL_CHROMA_LOCATION_LEFT), */ + SDL_COLORSPACE_RGB_DEFAULT = SDL_COLORSPACE_SRGB, /**< The default colorspace for RGB surfaces if no colorspace is specified */ + SDL_COLORSPACE_YUV_DEFAULT = SDL_COLORSPACE_JPEG /**< The default colorspace for YUV surfaces if no colorspace is specified */ } SDL_Colorspace; - -/* The default colorspace for RGB surfaces if no colorspace is specified */ -#define SDL_COLORSPACE_RGB_DEFAULT SDL_COLORSPACE_SRGB - -/* The default colorspace for YUV surfaces if no colorspace is specified */ -#define SDL_COLORSPACE_YUV_DEFAULT SDL_COLORSPACE_JPEG - /** * A structure that represents a color as RGBA components. * @@ -656,7 +1104,7 @@ typedef enum SDL_Colorspace * (SDL_PIXELFORMAT_ABGR8888 on little-endian systems and * SDL_PIXELFORMAT_RGBA8888 on big-endian systems). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Color { @@ -670,7 +1118,7 @@ typedef struct SDL_Color * The bits of this structure can be directly reinterpreted as a float-packed * color which uses the SDL_PIXELFORMAT_RGBA128_FLOAT format * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_FColor { @@ -683,7 +1131,7 @@ typedef struct SDL_FColor /** * A set of indexed colors representing a palette. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_SetPaletteColors */ @@ -698,7 +1146,7 @@ typedef struct SDL_Palette /** * Details about the format of a pixel. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PixelFormatDetails { @@ -729,7 +1177,7 @@ typedef struct SDL_PixelFormatDetails * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetPixelFormatName(SDL_PixelFormat format); @@ -742,16 +1190,16 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetPixelFormatName(SDL_PixelFormat * \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 on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatForMasks */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetMasksForPixelFormat(SDL_PixelFormat format, int *bpp, Uint32 *Rmask, Uint32 *Gmask, Uint32 *Bmask, Uint32 *Amask); +extern SDL_DECLSPEC bool SDLCALL SDL_GetMasksForPixelFormat(SDL_PixelFormat format, int *bpp, Uint32 *Rmask, Uint32 *Gmask, Uint32 *Bmask, Uint32 *Amask); /** * Convert a bpp value and RGBA masks to an enumerated pixel format. @@ -769,7 +1217,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetMasksForPixelFormat(SDL_PixelFormat * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMasksForPixelFormat */ @@ -788,7 +1236,7 @@ extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetPixelFormatForMasks(int bpp, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const SDL_PixelFormatDetails * SDLCALL SDL_GetPixelFormatDetails(SDL_PixelFormat format); @@ -804,7 +1252,7 @@ extern SDL_DECLSPEC const SDL_PixelFormatDetails * SDLCALL SDL_GetPixelFormatDet * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyPalette * \sa SDL_SetPaletteColors @@ -819,15 +1267,15 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_CreatePalette(int ncolors); * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified or destroyed in another thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPaletteColors(SDL_Palette *palette, const SDL_Color *colors, int firstcolor, int ncolors); +extern SDL_DECLSPEC bool SDLCALL SDL_SetPaletteColors(SDL_Palette *palette, const SDL_Color *colors, int firstcolor, int ncolors); /** * Free a palette created with SDL_CreatePalette(). @@ -837,7 +1285,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPaletteColors(SDL_Palette *palette, * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified or destroyed in another thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePalette */ @@ -872,7 +1320,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyPalette(SDL_Palette *palette); * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGB @@ -911,7 +1359,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapRGB(const SDL_PixelFormatDetails *form * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGBA @@ -939,7 +1387,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormatDetails *for * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGBA @@ -971,7 +1419,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, const SDL_PixelFormatD * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGB diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_platform.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_platform.h index bfdfa3a..e40f009 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_platform.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_platform.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -51,7 +51,7 @@ extern "C" { * \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 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetPlatform(void); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_platform_defines.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_platform_defines.h index e7f91cf..7e9a0a9 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_platform_defines.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_platform_defines.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -29,180 +29,450 @@ #define SDL_platform_defines_h_ #ifdef _AIX -#define SDL_PLATFORM_AIX 1 + +/** + * A preprocessor macro that is only defined if compiling for AIX. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_AIX 1 #endif + #ifdef __HAIKU__ -#define SDL_PLATFORM_HAIKU 1 + +/** + * A preprocessor macro that is only defined if compiling for Haiku OS. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_HAIKU 1 #endif + #if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) -#define SDL_PLATFORM_BSDI 1 + +/** + * A preprocessor macro that is only defined if compiling for BSDi + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_BSDI 1 #endif + #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) + +/** + * A preprocessor macro that is only defined if compiling for FreeBSD. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_FREEBSD 1 #endif + #if defined(hpux) || defined(__hpux) || defined(__hpux__) -#define SDL_PLATFORM_HPUX 1 + +/** + * A preprocessor macro that is only defined if compiling for HP-UX. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_HPUX 1 #endif + #if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) -#define SDL_PLATFORM_IRIX 1 + +/** + * A preprocessor macro that is only defined if compiling for IRIX. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_IRIX 1 #endif + #if (defined(linux) || defined(__linux) || defined(__linux__)) -#define SDL_PLATFORM_LINUX 1 + +/** + * A preprocessor macro that is only defined if compiling for Linux. + * + * Note that Android, although ostensibly a Linux-based system, will not + * define this. It defines SDL_PLATFORM_ANDROID instead. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_LINUX 1 #endif + #if defined(ANDROID) || defined(__ANDROID__) -#undef SDL_PLATFORM_LINUX /* do we need to do this? */ -#define SDL_PLATFORM_ANDROID 1 -#endif -#ifdef __NGAGE__ -#define SDL_PLATFORM_NGAGE 1 + +/** + * A preprocessor macro that is only defined if compiling for Android. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_ANDROID 1 +#undef SDL_PLATFORM_LINUX #endif #if defined(__unix__) || defined(__unix) || defined(unix) -#define SDL_PLATFORM_UNIX 1 + +/** + * A preprocessor macro that is only defined if compiling for a Unix-like + * system. + * + * Other platforms, like Linux, might define this in addition to their primary + * define. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_UNIX 1 #endif #ifdef __APPLE__ -#define SDL_PLATFORM_APPLE 1 + +/** + * A preprocessor macro that is only defined if compiling for Apple platforms. + * + * iOS, macOS, etc will additionally define a more specific platform macro. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_MACOS + * \sa SDL_PLATFORM_IOS + * \sa SDL_PLATFORM_TVOS + * \sa SDL_PLATFORM_VISIONOS + */ +#define SDL_PLATFORM_APPLE 1 + /* lets us know what version of macOS we're compiling on */ #include #ifndef __has_extension /* Older compilers don't support this */ -#define __has_extension(x) 0 -#include -#undef __has_extension + #define __has_extension(x) 0 + #include + #undef __has_extension #else -#include + #include #endif /* 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 + 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 + #define TARGET_OS_MACCATALYST 0 #endif #ifndef TARGET_OS_IOS -#define TARGET_OS_IOS 0 + #define TARGET_OS_IOS 0 #endif #ifndef TARGET_OS_IPHONE -#define TARGET_OS_IPHONE 0 + #define TARGET_OS_IPHONE 0 #endif #ifndef TARGET_OS_TV -#define TARGET_OS_TV 0 + #define TARGET_OS_TV 0 #endif #ifndef TARGET_OS_SIMULATOR -#define TARGET_OS_SIMULATOR 0 + #define TARGET_OS_SIMULATOR 0 #endif #ifndef TARGET_OS_VISION -#define TARGET_OS_VISION 0 + #define TARGET_OS_VISION 0 #endif #if TARGET_OS_TV -#define SDL_PLATFORM_TVOS 1 + +/** + * A preprocessor macro that is only defined if compiling for tvOS. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_APPLE + */ +#define SDL_PLATFORM_TVOS 1 #endif + #if TARGET_OS_VISION + +/** + * A preprocessor macro that is only defined if compiling for VisionOS. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_APPLE + */ #define SDL_PLATFORM_VISIONOS 1 #endif + #if TARGET_OS_IPHONE -#define SDL_PLATFORM_IOS 1 + +/** + * A preprocessor macro that is only defined if compiling for iOS. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_APPLE + */ +#define SDL_PLATFORM_IOS 1 + #else -#define SDL_PLATFORM_MACOS 1 + +/** + * A preprocessor macro that is only defined if compiling for macOS. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_APPLE + */ +#define SDL_PLATFORM_MACOS 1 + #if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 -# error SDL for macOS only supports deploying on 10.7 and above. + #error SDL for macOS only supports deploying on 10.7 and above. #endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1070 */ #endif /* TARGET_OS_IPHONE */ -#endif /* defined(SDL_PLATFORM_APPLE) */ +#endif /* defined(__APPLE__) */ #ifdef __EMSCRIPTEN__ + +/** + * A preprocessor macro that is only defined if compiling for Emscripten. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_EMSCRIPTEN 1 #endif + #ifdef __NetBSD__ + +/** + * A preprocessor macro that is only defined if compiling for NetBSD. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_NETBSD 1 #endif + #ifdef __OpenBSD__ -#define SDL_PLATFORM_OPENBSD 1 + +/** + * A preprocessor macro that is only defined if compiling for OpenBSD. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_OPENBSD 1 #endif + #if defined(__OS2__) || defined(__EMX__) -#define SDL_PLATFORM_OS2 1 + +/** + * A preprocessor macro that is only defined if compiling for OS/2. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_OS2 1 #endif + #if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) -#define SDL_PLATFORM_OSF 1 + +/** + * A preprocessor macro that is only defined if compiling for Tru64 (OSF/1). + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_OSF 1 #endif + #ifdef __QNXNTO__ + +/** + * A preprocessor macro that is only defined if compiling for QNX Neutrino. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_QNXNTO 1 #endif + #if defined(riscos) || defined(__riscos) || defined(__riscos__) + +/** + * A preprocessor macro that is only defined if compiling for RISC OS. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_RISCOS 1 #endif + #if defined(__sun) && defined(__SVR4) -#define SDL_PLATFORM_SOLARIS 1 + +/** + * A preprocessor macro that is only defined if compiling for SunOS/Solaris. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_SOLARIS 1 #endif #if defined(__CYGWIN__) + +/** + * A preprocessor macro that is only defined if compiling for Cygwin. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_CYGWIN 1 #endif #if defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN) -#define SDL_PLATFORM_WINDOWS 1 /* Win32 api and Windows-based OSs */ + +/** + * A preprocessor macro that is only defined if compiling for Windows. + * + * This also covers several other platforms, like Microsoft GDK, Xbox, WinRT, + * etc. Each will have their own more-specific platform macros, too. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_WIN32 + * \sa SDL_PLATFORM_XBOXONE + * \sa SDL_PLATFORM_XBOXSERIES + * \sa SDL_PLATFORM_WINGDK + * \sa SDL_PLATFORM_GDK + */ +#define SDL_PLATFORM_WINDOWS 1 /* 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 __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. */ + /* 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 + #define HAVE_WINAPIFAMILY_H 1 #else -#define HAVE_WINAPIFAMILY_H 0 + #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)) + #include + #define WINAPI_FAMILY_WINRT (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)) #else -#define WINAPI_FAMILY_WINRT 0 + #define WINAPI_FAMILY_WINRT 0 #endif /* HAVE_WINAPIFAMILY_H */ -#if HAVE_WINAPIFAMILY_H && HAVE_WINAPIFAMILY_H +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A preprocessor macro that defined to 1 if compiling for Windows Phone. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_WINAPI_FAMILY_PHONE (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) + +#elif defined(HAVE_WINAPIFAMILY_H) && HAVE_WINAPIFAMILY_H + #define SDL_WINAPI_FAMILY_PHONE (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) #else -#define SDL_WINAPI_FAMILY_PHONE 0 + #define SDL_WINAPI_FAMILY_PHONE 0 #endif #if WINAPI_FAMILY_WINRT -#define SDL_PLATFORM_WINRT 1 +#error Windows RT/UWP is no longer supported in SDL + #elif defined(_GAMING_DESKTOP) /* GDK project configuration always defines _GAMING_XXX */ + +/** + * A preprocessor macro that is only defined if compiling for Microsoft GDK + * for Windows. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_WINGDK 1 + #elif defined(_GAMING_XBOX_XBOXONE) -#define SDL_PLATFORM_XBOXONE 1 + +/** + * A preprocessor macro that is only defined if compiling for Xbox One. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_XBOXONE 1 + #elif defined(_GAMING_XBOX_SCARLETT) + +/** + * A preprocessor macro that is only defined if compiling for Xbox Series. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_XBOXSERIES 1 + #else -#define SDL_PLATFORM_WIN32 1 + +/** + * A preprocessor macro that is only defined if compiling for desktop Windows. + * + * Despite the "32", this also covers 64-bit Windows; as an informal + * convention, its system layer tends to still be referred to as "the Win32 + * API." + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_WIN32 1 + #endif -#endif /* defined(WIN32) || defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN) */ +#endif /* defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN) */ + /* This is to support generic "any GDK" separate from a platform-specific GDK */ #if defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES) -#define SDL_PLATFORM_GDK 1 + +/** + * A preprocessor macro that is only defined if compiling for Microsoft GDK on + * any platform. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_GDK 1 #endif + #if defined(__PSP__) || defined(__psp__) -#define SDL_PLATFORM_PSP 1 + +/** + * A preprocessor macro that is only defined if compiling for Sony PSP. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_PSP 1 #endif + #if defined(__PS2__) || defined(PS2) -#define SDL_PLATFORM_PS2 1 + +/** + * A preprocessor macro that is only defined if compiling for Sony PlayStation + * 2. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_PS2 1 #endif #if defined(__vita__) || defined(__psp2__) -#define SDL_PLATFORM_VITA 1 + +/** + * A preprocessor macro that is only defined if compiling for Sony Vita. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_VITA 1 #endif #ifdef __3DS__ + +/** + * A preprocessor macro that is only defined if compiling for Nintendo 3DS. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_3DS 1 + #undef __3DS__ -#define SDL_PLATFORM_3DS 1 #endif #endif /* SDL_platform_defines_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_power.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_power.h index 1fdef78..4056ce3 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_power.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_power.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -26,6 +26,15 @@ * # CategoryPower * * SDL power management routines. + * + * There is a single function in this category: SDL_GetPowerInfo(). + * + * This function is useful for games on the go. This allows an app to know if + * it's running on a draining battery, which can be useful if the app wants to + * reduce processing, or perhaps framerate, to extend the duration of the + * battery's charge. Perhaps the app just wants to show a battery meter when + * fullscreen, or alert the user when the power is getting extremely low, so + * they can save their game. */ #include @@ -42,7 +51,7 @@ extern "C" { * * These are results returned by SDL_GetPowerInfo(). * - * \since This enum is available since SDL 3.0.0 + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PowerState { @@ -80,7 +89,7 @@ typedef enum SDL_PowerState * \returns the current battery state or `SDL_POWERSTATE_ERROR` on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetPowerInfo(int *seconds, int *percent); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_process.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_process.h new file mode 100644 index 0000000..2cc7739 --- /dev/null +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_process.h @@ -0,0 +1,430 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 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. +*/ + +/** + * # CategoryProcess + * + * Process control support. + * + * These functions provide a cross-platform way to spawn and manage OS-level + * processes. + * + * You can create a new subprocess with SDL_CreateProcess() and optionally + * read and write to it using SDL_ReadProcess() or SDL_GetProcessInput() and + * SDL_GetProcessOutput(). If more advanced functionality like chaining input + * between processes is necessary, you can use + * SDL_CreateProcessWithProperties(). + * + * You can get the status of a created process with SDL_WaitProcess(), or + * terminate the process with SDL_KillProcess(). + * + * Don't forget to call SDL_DestroyProcess() to clean up, whether the process + * process was killed, terminated on its own, or is still running! + */ + +#ifndef SDL_process_h_ +#define SDL_process_h_ + +#include +#include +#include +#include + +#include +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * An opaque handle representing a system process. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + */ +typedef struct SDL_Process SDL_Process; + +/** + * Create a new process. + * + * The path to the executable is supplied in args[0]. args[1..N] are + * additional arguments passed on the command line of the new process, and the + * argument list should be terminated with a NULL, e.g.: + * + * ```c + * const char *args[] = { "myprogram", "argument", NULL }; + * ``` + * + * Setting pipe_stdio to true is equivalent to setting + * `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER` and + * `SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER` to `SDL_PROCESS_STDIO_APP`, and + * will allow the use of SDL_ReadProcess() or SDL_GetProcessInput() and + * SDL_GetProcessOutput(). + * + * See SDL_CreateProcessWithProperties() for more details. + * + * \param args the path and arguments for the new process. + * \param pipe_stdio true to create pipes to the process's standard input and + * from the process's standard output, false for the process + * to have no input and inherit the application's standard + * output. + * \returns the newly created and running process, or NULL if the process + * couldn't be created. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcessWithProperties + * \sa SDL_GetProcessProperties + * \sa SDL_ReadProcess + * \sa SDL_GetProcessInput + * \sa SDL_GetProcessOutput + * \sa SDL_KillProcess + * \sa SDL_WaitProcess + * \sa SDL_DestroyProcess + */ +extern SDL_DECLSPEC SDL_Process *SDLCALL SDL_CreateProcess(const char * const *args, bool pipe_stdio); + +/** + * Description of where standard I/O should be directed when creating a + * process. + * + * If a standard I/O stream is set to SDL_PROCESS_STDIO_INHERITED, it will go + * to the same place as the application's I/O stream. This is the default for + * standard output and standard error. + * + * If a standard I/O stream is set to SDL_PROCESS_STDIO_NULL, it is connected + * to `NUL:` on Windows and `/dev/null` on POSIX systems. This is the default + * for standard input. + * + * If a standard I/O stream is set to SDL_PROCESS_STDIO_APP, it is connected + * to a new SDL_IOStream that is available to the application. Standard input + * will be available as `SDL_PROP_PROCESS_STDIN_POINTER` and allows + * SDL_GetProcessInput(), standard output will be available as + * `SDL_PROP_PROCESS_STDOUT_POINTER` and allows SDL_ReadProcess() and + * SDL_GetProcessOutput(), and standard error will be available as + * `SDL_PROP_PROCESS_STDERR_POINTER` in the properties for the created + * process. + * + * If a standard I/O stream is set to SDL_PROCESS_STDIO_REDIRECT, it is + * connected to an existing SDL_IOStream provided by the application. Standard + * input is provided using `SDL_PROP_PROCESS_CREATE_STDIN_POINTER`, standard + * output is provided using `SDL_PROP_PROCESS_CREATE_STDOUT_POINTER`, and + * standard error is provided using `SDL_PROP_PROCESS_CREATE_STDERR_POINTER` + * in the creation properties. These existing streams should be closed by the + * application once the new process is created. + * + * In order to use an SDL_IOStream with SDL_PROCESS_STDIO_REDIRECT, it must + * have `SDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER` or + * `SDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER` set. This is true for streams + * representing files and process I/O. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateProcessWithProperties + * \sa SDL_GetProcessProperties + * \sa SDL_ReadProcess + * \sa SDL_GetProcessInput + * \sa SDL_GetProcessOutput + */ +typedef enum SDL_ProcessIO +{ + SDL_PROCESS_STDIO_INHERITED, /**< The I/O stream is inherited from the application. */ + SDL_PROCESS_STDIO_NULL, /**< The I/O stream is ignored. */ + SDL_PROCESS_STDIO_APP, /**< The I/O stream is connected to a new SDL_IOStream that the application can read or write */ + SDL_PROCESS_STDIO_REDIRECT /**< The I/O stream is redirected to an existing SDL_IOStream. */ +} SDL_ProcessIO; + +/** + * Create a new process with the specified properties. + * + * These are the supported properties: + * + * - `SDL_PROP_PROCESS_CREATE_ARGS_POINTER`: an array of strings containing + * the program to run, any arguments, and a NULL pointer, e.g. const char + * *args[] = { "myprogram", "argument", NULL }. This is a required property. + * - `SDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER`: an SDL_Environment + * pointer. If this property is set, it will be the entire environment for + * the process, otherwise the current environment is used. + * - `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER`: an SDL_ProcessIO value describing + * where standard input for the process comes from, defaults to + * `SDL_PROCESS_STDIO_NULL`. + * - `SDL_PROP_PROCESS_CREATE_STDIN_POINTER`: an SDL_IOStream pointer used for + * standard input when `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER` is set to + * `SDL_PROCESS_STDIO_REDIRECT`. + * - `SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER`: an SDL_ProcessIO value + * describing where standard output for the process goes go, defaults to + * `SDL_PROCESS_STDIO_INHERITED`. + * - `SDL_PROP_PROCESS_CREATE_STDOUT_POINTER`: an SDL_IOStream pointer used + * for standard output when `SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER` is set + * to `SDL_PROCESS_STDIO_REDIRECT`. + * - `SDL_PROP_PROCESS_CREATE_STDERR_NUMBER`: an SDL_ProcessIO value + * describing where standard error for the process goes go, defaults to + * `SDL_PROCESS_STDIO_INHERITED`. + * - `SDL_PROP_PROCESS_CREATE_STDERR_POINTER`: an SDL_IOStream pointer used + * for standard error when `SDL_PROP_PROCESS_CREATE_STDERR_NUMBER` is set to + * `SDL_PROCESS_STDIO_REDIRECT`. + * - `SDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN`: true if the error + * output of the process should be redirected into the standard output of + * the process. This property has no effect if + * `SDL_PROP_PROCESS_CREATE_STDERR_NUMBER` is set. + * - `SDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN`: true if the process should + * run in the background. In this case the default input and output is + * `SDL_PROCESS_STDIO_NULL` and the exitcode of the process is not + * available, and will always be 0. + * + * On POSIX platforms, wait() and waitpid(-1, ...) should not be called, and + * SIGCHLD should not be ignored or handled because those would prevent SDL + * from properly tracking the lifetime of the underlying process. You should + * use SDL_WaitProcess() instead. + * + * \param props the properties to use. + * \returns the newly created and running process, or NULL if the process + * couldn't be created. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_GetProcessProperties + * \sa SDL_ReadProcess + * \sa SDL_GetProcessInput + * \sa SDL_GetProcessOutput + * \sa SDL_KillProcess + * \sa SDL_WaitProcess + * \sa SDL_DestroyProcess + */ +extern SDL_DECLSPEC SDL_Process *SDLCALL SDL_CreateProcessWithProperties(SDL_PropertiesID props); + +#define SDL_PROP_PROCESS_CREATE_ARGS_POINTER "SDL.process.create.args" +#define SDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER "SDL.process.create.environment" +#define SDL_PROP_PROCESS_CREATE_STDIN_NUMBER "SDL.process.create.stdin_option" +#define SDL_PROP_PROCESS_CREATE_STDIN_POINTER "SDL.process.create.stdin_source" +#define SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER "SDL.process.create.stdout_option" +#define SDL_PROP_PROCESS_CREATE_STDOUT_POINTER "SDL.process.create.stdout_source" +#define SDL_PROP_PROCESS_CREATE_STDERR_NUMBER "SDL.process.create.stderr_option" +#define SDL_PROP_PROCESS_CREATE_STDERR_POINTER "SDL.process.create.stderr_source" +#define SDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN "SDL.process.create.stderr_to_stdout" +#define SDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN "SDL.process.create.background" + +/** + * Get the properties associated with a process. + * + * The following read-only properties are provided by SDL: + * + * - `SDL_PROP_PROCESS_PID_NUMBER`: the process ID of the process. + * - `SDL_PROP_PROCESS_STDIN_POINTER`: an SDL_IOStream that can be used to + * write input to the process, if it was created with + * `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER` set to `SDL_PROCESS_STDIO_APP`. + * - `SDL_PROP_PROCESS_STDOUT_POINTER`: a non-blocking SDL_IOStream that can + * be used to read output from the process, if it was created with + * `SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER` set to `SDL_PROCESS_STDIO_APP`. + * - `SDL_PROP_PROCESS_STDERR_POINTER`: a non-blocking SDL_IOStream that can + * be used to read error output from the process, if it was created with + * `SDL_PROP_PROCESS_CREATE_STDERR_NUMBER` set to `SDL_PROCESS_STDIO_APP`. + * - `SDL_PROP_PROCESS_BACKGROUND_BOOLEAN`: true if the process is running in + * the background. + * + * \param process the process to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetProcessProperties(SDL_Process *process); + +#define SDL_PROP_PROCESS_PID_NUMBER "SDL.process.pid" +#define SDL_PROP_PROCESS_STDIN_POINTER "SDL.process.stdin" +#define SDL_PROP_PROCESS_STDOUT_POINTER "SDL.process.stdout" +#define SDL_PROP_PROCESS_STDERR_POINTER "SDL.process.stderr" +#define SDL_PROP_PROCESS_BACKGROUND_BOOLEAN "SDL.process.background" + +/** + * Read all the output from a process. + * + * If a process was created with I/O enabled, you can use this function to + * read the output. This function blocks until the process is complete, + * capturing all output, and providing the process exit code. + * + * 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 process The process to read. + * \param datasize a pointer filled in with the number of bytes read, may be + * NULL. + * \param exitcode a pointer filled in with the process exit code if the + * process has exited, may be NULL. + * \returns the data or NULL on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_DestroyProcess + */ +extern SDL_DECLSPEC void * SDLCALL SDL_ReadProcess(SDL_Process *process, size_t *datasize, int *exitcode); + +/** + * Get the SDL_IOStream associated with process standard input. + * + * The process must have been created with SDL_CreateProcess() and pipe_stdio + * set to true, or with SDL_CreateProcessWithProperties() and + * `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER` set to `SDL_PROCESS_STDIO_APP`. + * + * Writing to this stream can return less data than expected if the process + * hasn't read its input. It may be blocked waiting for its output to be read, + * if so you may need to call SDL_GetProcessOutput() and read the output in + * parallel with writing input. + * + * \param process The process to get the input stream for. + * \returns the input stream or NULL on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_GetProcessOutput + */ +extern SDL_DECLSPEC SDL_IOStream *SDLCALL SDL_GetProcessInput(SDL_Process *process); + +/** + * Get the SDL_IOStream associated with process standard output. + * + * The process must have been created with SDL_CreateProcess() and pipe_stdio + * set to true, or with SDL_CreateProcessWithProperties() and + * `SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER` set to `SDL_PROCESS_STDIO_APP`. + * + * Reading from this stream can return 0 with SDL_GetIOStatus() returning + * SDL_IO_STATUS_NOT_READY if no output is available yet. + * + * \param process The process to get the output stream for. + * \returns the output stream or NULL on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_GetProcessInput + */ +extern SDL_DECLSPEC SDL_IOStream *SDLCALL SDL_GetProcessOutput(SDL_Process *process); + +/** + * Stop a process. + * + * \param process The process to stop. + * \param force true to terminate the process immediately, false to try to + * stop the process gracefully. In general you should try to stop + * the process gracefully first as terminating a process may + * leave it with half-written data or in some other unstable + * state. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_WaitProcess + * \sa SDL_DestroyProcess + */ +extern SDL_DECLSPEC bool SDLCALL SDL_KillProcess(SDL_Process *process, bool force); + +/** + * Wait for a process to finish. + * + * This can be called multiple times to get the status of a process. + * + * The exit code will be the exit code of the process if it terminates + * normally, a negative signal if it terminated due to a signal, or -255 + * otherwise. It will not be changed if the process is still running. + * + * If you create a process with standard output piped to the application + * (`pipe_stdio` being true) then you should read all of the process output + * before calling SDL_WaitProcess(). If you don't do this the process might be + * blocked indefinitely waiting for output to be read and SDL_WaitProcess() + * will never return true; + * + * \param process The process to wait for. + * \param block If true, block until the process finishes; otherwise, report + * on the process' status. + * \param exitcode a pointer filled in with the process exit code if the + * process has exited, may be NULL. + * \returns true if the process exited, false otherwise. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_KillProcess + * \sa SDL_DestroyProcess + */ +extern SDL_DECLSPEC bool SDLCALL SDL_WaitProcess(SDL_Process *process, bool block, int *exitcode); + +/** + * Destroy a previously created process object. + * + * Note that this does not stop the process, just destroys the SDL object used + * to track it. If you want to stop the process you should use + * SDL_KillProcess(). + * + * \param process The process object to destroy. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_KillProcess + */ +extern SDL_DECLSPEC void SDLCALL SDL_DestroyProcess(SDL_Process *process); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include + +#endif /* SDL_process_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_properties.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_properties.h index c3a2c82..1f47d5f 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_properties.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_properties.h @@ -1,6 +1,6 @@ /* - Simple DiretMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2025 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 @@ -61,14 +61,14 @@ extern "C" { /** * SDL properties ID * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_PropertiesID; /** * SDL property type * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PropertyType { @@ -86,7 +86,7 @@ typedef enum SDL_PropertyType * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGlobalProperties(void); @@ -100,7 +100,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGlobalProperties(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyProperties */ @@ -116,14 +116,14 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_CreateProperties(void); * * \param src the properties to copy. * \param dst the destination properties. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyProperties(SDL_PropertiesID src, SDL_PropertiesID dst); +extern SDL_DECLSPEC bool SDLCALL SDL_CopyProperties(SDL_PropertiesID src, SDL_PropertiesID dst); /** * Lock a group of properties. @@ -138,16 +138,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyProperties(SDL_PropertiesID src, SD * thread. * * \param props the properties to lock. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UnlockProperties */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockProperties(SDL_PropertiesID props); +extern SDL_DECLSPEC bool SDLCALL SDL_LockProperties(SDL_PropertiesID props); /** * Unlock a group of properties. @@ -156,7 +156,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockProperties(SDL_PropertiesID props); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockProperties */ @@ -180,7 +180,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockProperties(SDL_PropertiesID props); * \threadsafety This callback may fire without any locks held; if this is a * concern, the app should provide its own locking. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetPointerPropertyWithCleanup */ @@ -204,18 +204,18 @@ typedef void (SDLCALL *SDL_CleanupPropertyCallback)(void *userdata, void *value) * \param cleanup the function to call when this property is deleted, or NULL * if no cleanup is necessary. * \param userdata a pointer that is passed to the cleanup function. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPointerProperty * \sa SDL_SetPointerProperty * \sa SDL_CleanupPropertyCallback */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPointerPropertyWithCleanup(SDL_PropertiesID props, const char *name, void *value, SDL_CleanupPropertyCallback cleanup, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_SetPointerPropertyWithCleanup(SDL_PropertiesID props, const char *name, void *value, SDL_CleanupPropertyCallback cleanup, void *userdata); /** * Set a pointer property in a group of properties. @@ -223,12 +223,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPointerPropertyWithCleanup(SDL_Prope * \param props the properties to modify. * \param name the name of the property to modify. * \param value the new value of the property, or NULL to delete the property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPointerProperty * \sa SDL_HasProperty @@ -238,7 +238,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPointerPropertyWithCleanup(SDL_Prope * \sa SDL_SetPointerPropertyWithCleanup * \sa SDL_SetStringProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPointerProperty(SDL_PropertiesID props, const char *name, void *value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetPointerProperty(SDL_PropertiesID props, const char *name, void *value); /** * Set a string property in a group of properties. @@ -249,16 +249,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPointerProperty(SDL_PropertiesID pro * \param props the properties to modify. * \param name the name of the property to modify. * \param value the new value of the property, or NULL to delete the property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetStringProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetStringProperty(SDL_PropertiesID props, const char *name, const char *value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetStringProperty(SDL_PropertiesID props, const char *name, const char *value); /** * Set an integer property in a group of properties. @@ -266,16 +266,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetStringProperty(SDL_PropertiesID prop * \param props the properties to modify. * \param name the name of the property to modify. * \param value the new value of the property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumberProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetNumberProperty(SDL_PropertiesID props, const char *name, Sint64 value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetNumberProperty(SDL_PropertiesID props, const char *name, Sint64 value); /** * Set a floating point property in a group of properties. @@ -283,16 +283,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetNumberProperty(SDL_PropertiesID prop * \param props the properties to modify. * \param name the name of the property to modify. * \param value the new value of the property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetFloatProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetFloatProperty(SDL_PropertiesID props, const char *name, float value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetFloatProperty(SDL_PropertiesID props, const char *name, float value); /** * Set a boolean property in a group of properties. @@ -300,31 +300,31 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetFloatProperty(SDL_PropertiesID props * \param props the properties to modify. * \param name the name of the property to modify. * \param value the new value of the property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetBooleanProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetBooleanProperty(SDL_PropertiesID props, const char *name, SDL_bool value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetBooleanProperty(SDL_PropertiesID props, const char *name, bool value); /** * Return whether a property exists in a group of properties. * * \param props the properties to query. * \param name the name of the property to query. - * \returns SDL_TRUE if the property exists, or SDL_FALSE if it doesn't. + * \returns true if the property exists, or false if it doesn't. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasProperty(SDL_PropertiesID props, const char *name); +extern SDL_DECLSPEC bool SDLCALL SDL_HasProperty(SDL_PropertiesID props, const char *name); /** * Get the type of a property in a group of properties. @@ -336,7 +336,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasProperty(SDL_PropertiesID props, con * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasProperty */ @@ -363,7 +363,7 @@ extern SDL_DECLSPEC SDL_PropertyType SDLCALL SDL_GetPropertyType(SDL_PropertiesI * If you need to avoid this, use SDL_LockProperties() and * SDL_UnlockProperties(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetBooleanProperty * \sa SDL_GetFloatProperty @@ -391,7 +391,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetPointerProperty(SDL_PropertiesID props * If you need to avoid this, use SDL_LockProperties() and * SDL_UnlockProperties(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty @@ -413,7 +413,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetStringProperty(SDL_PropertiesID * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty @@ -435,7 +435,7 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetNumberProperty(SDL_PropertiesID props, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty @@ -457,27 +457,27 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetFloatProperty(SDL_PropertiesID props, c * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty * \sa SDL_SetBooleanProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetBooleanProperty(SDL_PropertiesID props, const char *name, SDL_bool default_value); +extern SDL_DECLSPEC bool SDLCALL SDL_GetBooleanProperty(SDL_PropertiesID props, const char *name, bool default_value); /** * Clear a property from a group of properties. * * \param props the properties to modify. * \param name the name of the property to clear. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearProperty(SDL_PropertiesID props, const char *name); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearProperty(SDL_PropertiesID props, const char *name); /** * A callback used to enumerate all the properties in a group of properties. @@ -492,7 +492,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearProperty(SDL_PropertiesID props, c * \threadsafety SDL_EnumerateProperties holds a lock on `props` during this * callback. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_EnumerateProperties */ @@ -507,14 +507,14 @@ typedef void (SDLCALL *SDL_EnumeratePropertiesCallback)(void *userdata, SDL_Prop * \param props the properties to query. * \param callback the function to call for each property. * \param userdata a pointer that is passed to `callback`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnumerateProperties(SDL_PropertiesID props, SDL_EnumeratePropertiesCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateProperties(SDL_PropertiesID props, SDL_EnumeratePropertiesCallback callback, void *userdata); /** * Destroy a group of properties. @@ -528,7 +528,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnumerateProperties(SDL_PropertiesID pr * locked or other threads might be setting or getting values * from these properties. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_rect.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_rect.h index ea97df9..8998de6 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_rect.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_rect.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,7 +23,7 @@ * # CategoryRect * * Some helper functions for managing rectangles and 2D points, in both - * interger and floating point versions. + * integer and floating point versions. */ #ifndef SDL_rect_h_ @@ -41,7 +41,7 @@ extern "C" { /** * The structure that defines a point (using integers). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetRectEnclosingPoints * \sa SDL_PointInRect @@ -55,7 +55,7 @@ typedef struct SDL_Point /** * The structure that defines a point (using floating point values). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetRectEnclosingPointsFloat * \sa SDL_PointInRectFloat @@ -70,7 +70,7 @@ typedef struct SDL_FPoint /** * A rectangle, with the origin at the upper left (using integers). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_RectEmpty * \sa SDL_RectsEqual @@ -91,7 +91,7 @@ typedef struct SDL_Rect * A rectangle, with the origin at the upper left (using floating point * values). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_RectEmptyFloat * \sa SDL_RectsEqualFloat @@ -121,7 +121,7 @@ typedef struct SDL_FRect * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE void SDL_RectToFRect(const SDL_Rect *rect, SDL_FRect *frect) { @@ -146,16 +146,16 @@ SDL_FORCE_INLINE void SDL_RectToFRect(const SDL_Rect *rect, SDL_FRect *frect) * * \param p the point to test. * \param r the rectangle to test. - * \returns SDL_TRUE if `p` is contained by `r`, SDL_FALSE otherwise. + * \returns true if `p` is contained by `r`, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) +SDL_FORCE_INLINE bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) { return ( p && r && (p->x >= r->x) && (p->x < (r->x + r->w)) && - (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? SDL_TRUE : SDL_FALSE; + (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? true : false; } /** @@ -170,15 +170,15 @@ SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) * be able to find this function inside SDL itself). * * \param r the rectangle to test. - * \returns SDL_TRUE if the rectangle is "empty", SDL_FALSE otherwise. + * \returns true if the rectangle is "empty", false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r) +SDL_FORCE_INLINE bool SDL_RectEmpty(const SDL_Rect *r) { - return ((!r) || (r->w <= 0) || (r->h <= 0)) ? SDL_TRUE : SDL_FALSE; + return ((!r) || (r->w <= 0) || (r->h <= 0)) ? true : false; } /** @@ -194,51 +194,51 @@ SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r) * * \param a the first rectangle to test. * \param b the second rectangle to test. - * \returns SDL_TRUE if the rectangles are equal, SDL_FALSE otherwise. + * \returns true if the rectangles are equal, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_RectsEqual(const SDL_Rect *a, const SDL_Rect *b) +SDL_FORCE_INLINE bool SDL_RectsEqual(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; + (a->w == b->w) && (a->h == b->h)) ? true : false; } /** * Determine whether two rectangles intersect. * - * If either pointer is NULL the function will return SDL_FALSE. + * If either pointer is NULL the function will return 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. + * \returns true if there is an intersection, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRectIntersection */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasRectIntersection(const SDL_Rect *A, const SDL_Rect *B); +extern SDL_DECLSPEC bool SDLCALL SDL_HasRectIntersection(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. + * If `result` is NULL then this function will return 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. + * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasRectIntersection */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectIntersection(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectIntersection(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result); /** * Calculate the union of two rectangles. @@ -247,12 +247,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectIntersection(const SDL_Rect *A, * \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`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result); /** * Calculate a minimal rectangle enclosing a set of points. @@ -266,12 +266,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const S * \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. + * \returns true if any points were enclosed or false if all the points were + * outside of the clipping rectangle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point *points, int count, const SDL_Rect *clip, SDL_Rect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point *points, int count, const SDL_Rect *clip, SDL_Rect *result); /** * Calculate the intersection of a rectangle and line segment. @@ -287,11 +287,11 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point * \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. + * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectAndLineIntersection(const SDL_Rect *rect, int *X1, int *Y1, int *X2, int *Y2); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersection(const SDL_Rect *rect, int *X1, int *Y1, int *X2, int *Y2); /* SDL_FRect versions... */ @@ -311,16 +311,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectAndLineIntersection(const SDL_Re * * \param p the point to test. * \param r the rectangle to test. - * \returns SDL_TRUE if `p` is contained by `r`, SDL_FALSE otherwise. + * \returns true if `p` is contained by `r`, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_PointInRectFloat(const SDL_FPoint *p, const SDL_FRect *r) +SDL_FORCE_INLINE bool SDL_PointInRectFloat(const SDL_FPoint *p, const SDL_FRect *r) { return ( p && r && (p->x >= r->x) && (p->x <= (r->x + r->w)) && - (p->y >= r->y) && (p->y <= (r->y + r->h)) ) ? SDL_TRUE : SDL_FALSE; + (p->y >= r->y) && (p->y <= (r->y + r->h)) ) ? true : false; } /** @@ -335,15 +335,15 @@ SDL_FORCE_INLINE SDL_bool SDL_PointInRectFloat(const SDL_FPoint *p, const SDL_FR * be able to find this function inside SDL itself). * * \param r the rectangle to test. - * \returns SDL_TRUE if the rectangle is "empty", SDL_FALSE otherwise. + * \returns true if the rectangle is "empty", false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_RectEmptyFloat(const SDL_FRect *r) +SDL_FORCE_INLINE bool SDL_RectEmptyFloat(const SDL_FRect *r) { - return ((!r) || (r->w < 0.0f) || (r->h < 0.0f)) ? SDL_TRUE : SDL_FALSE; + return ((!r) || (r->w < 0.0f) || (r->h < 0.0f)) ? true : false; } /** @@ -363,22 +363,22 @@ SDL_FORCE_INLINE SDL_bool SDL_RectEmptyFloat(const SDL_FRect *r) * \param a the first rectangle to test. * \param b the second rectangle to test. * \param epsilon the epsilon value for comparison. - * \returns SDL_TRUE if the rectangles are equal, SDL_FALSE otherwise. + * \returns true if the rectangles are equal, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RectsEqualFloat */ -SDL_FORCE_INLINE SDL_bool SDL_RectsEqualEpsilon(const SDL_FRect *a, const SDL_FRect *b, const float epsilon) +SDL_FORCE_INLINE bool SDL_RectsEqualEpsilon(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; + ? true : false; } /** @@ -398,15 +398,15 @@ SDL_FORCE_INLINE SDL_bool SDL_RectsEqualEpsilon(const SDL_FRect *a, const SDL_FR * * \param a the first rectangle to test. * \param b the second rectangle to test. - * \returns SDL_TRUE if the rectangles are equal, SDL_FALSE otherwise. + * \returns true if the rectangles are equal, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RectsEqualEpsilon */ -SDL_FORCE_INLINE SDL_bool SDL_RectsEqualFloat(const SDL_FRect *a, const SDL_FRect *b) +SDL_FORCE_INLINE bool SDL_RectsEqualFloat(const SDL_FRect *a, const SDL_FRect *b) { return SDL_RectsEqualEpsilon(a, b, SDL_FLT_EPSILON); } @@ -414,34 +414,34 @@ SDL_FORCE_INLINE SDL_bool SDL_RectsEqualFloat(const SDL_FRect *a, const SDL_FRec /** * Determine whether two rectangles intersect with float precision. * - * If either pointer is NULL the function will return SDL_FALSE. + * If either pointer is NULL the function will return 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. + * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRectIntersection */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasRectIntersectionFloat(const SDL_FRect *A, const SDL_FRect *B); +extern SDL_DECLSPEC bool SDLCALL SDL_HasRectIntersectionFloat(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. + * If `result` is NULL then this function will return 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. + * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasRectIntersectionFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectIntersectionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectIntersectionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result); /** * Calculate the union of two rectangles with float precision. @@ -450,12 +450,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectIntersectionFloat(const SDL_FRec * \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`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result); /** * Calculate a minimal rectangle enclosing a set of points with float @@ -470,12 +470,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, c * \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. + * \returns true if any points were enclosed or false if all the points were + * outside of the clipping rectangle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_FPoint *points, int count, const SDL_FRect *clip, SDL_FRect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_FPoint *points, int count, const SDL_FRect *clip, SDL_FRect *result); /** * Calculate the intersection of a rectangle and line segment with float @@ -492,11 +492,11 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_F * \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. + * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectAndLineIntersectionFloat(const SDL_FRect *rect, float *X1, float *Y1, float *X2, float *Y2); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersectionFloat(const SDL_FRect *rect, float *X1, float *Y1, float *X2, float *Y2); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_render.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_render.h index 706308c..891e994 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_render.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_render.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -40,8 +40,8 @@ * * 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. + * should use SDL's OpenGL/Direct3D support, the SDL3 GPU API, or one of the + * many good 3D engines. * * These functions must be called from the main thread. See this bug for * details: https://github.com/libsdl-org/SDL/issues/986 @@ -51,10 +51,13 @@ #define SDL_render_h_ #include +#include #include #include +#include #include #include +#include #include #include @@ -66,14 +69,14 @@ extern "C" { /** * The name of the software renderer. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SOFTWARE_RENDERER "software" /** * Vertex structure. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Vertex { @@ -85,7 +88,7 @@ typedef struct SDL_Vertex /** * The access pattern allowed for a texture. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_TextureAccess { @@ -97,7 +100,7 @@ typedef enum SDL_TextureAccess /** * How the logical size is mapped to the output. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_RendererLogicalPresentation { @@ -111,15 +114,32 @@ typedef enum SDL_RendererLogicalPresentation /** * A structure representing rendering state * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Renderer SDL_Renderer; +#ifndef SDL_INTERNAL + /** * An efficient driver-specific representation of pixel data * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateTexture + * \sa SDL_CreateTextureFromSurface + * \sa SDL_CreateTextureWithProperties + * \sa SDL_DestroyTexture */ +struct SDL_Texture +{ + SDL_PixelFormat format; /**< The format of the texture, read-only */ + int w; /**< The width of the texture, read-only. */ + int h; /**< The height of the texture, read-only. */ + + int refcount; /**< Application reference count, used when freeing texture */ +}; +#endif /* !SDL_INTERNAL */ + typedef struct SDL_Texture SDL_Texture; /* Function prototypes */ @@ -135,7 +155,9 @@ typedef struct SDL_Texture SDL_Texture; * * \returns the number of built in render drivers. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_GetRenderDriver @@ -158,7 +180,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumRenderDrivers(void); * \returns the name of the rendering driver at the requested index, or NULL * if an invalid index was specified. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumRenderDrivers */ @@ -174,36 +198,43 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetRenderDriver(int index); * 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_CreateWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CreateWindowAndRenderer(const char *title, int width, int height, SDL_WindowFlags window_flags, SDL_Window **window, SDL_Renderer **renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_CreateWindowAndRenderer(const char *title, int width, int height, SDL_WindowFlags window_flags, SDL_Window **window, SDL_Renderer **renderer); /** * Create a 2D rendering context for a window. * * If you want a specific renderer, you can specify its name here. A list of - * available renderers can be obtained by calling SDL_GetRenderDriver multiple - * times, with indices from 0 to SDL_GetNumRenderDrivers()-1. If you don't - * need a specific renderer, specify NULL and SDL will attempt to choose the - * best option for you, based on what is available on the user's system. + * available renderers can be obtained by calling SDL_GetRenderDriver() + * multiple times, with indices from 0 to SDL_GetNumRenderDrivers()-1. If you + * don't need a specific renderer, specify NULL and SDL will attempt to choose + * the best option for you, based on what is available on the user's system. + * + * If `name` is a comma-separated list, SDL will try each name, in the order + * listed, until one succeeds or all of them fail. * * By default the rendering size matches the window size in pixels, but you * can call SDL_SetRenderLogicalPresentation() to change the content size and * scaling options. * * \param window the window where rendering is displayed. - * \param name the name of the rendering driver to initialize, or NULL to - * initialize the first one supporting the requested flags. + * \param name the name of the rendering driver to initialize, or NULL to let + * SDL choose one. * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRendererWithProperties * \sa SDL_CreateSoftwareRenderer @@ -225,7 +256,7 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window *window * displayed, required if this isn't a software renderer using a surface * - `SDL_PROP_RENDERER_CREATE_SURFACE_POINTER`: the surface where rendering * is displayed, if you want a software renderer without a window - * - `SDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER`: an SDL_ColorSpace + * - `SDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER`: an SDL_Colorspace * value describing the colorspace for output to the display, defaults to * SDL_COLORSPACE_SRGB. The direct3d11, direct3d12, and metal renderers * support SDL_COLORSPACE_SRGB_LINEAR, which is a linear color space and @@ -255,7 +286,9 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window *window * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties * \sa SDL_CreateRenderer @@ -290,7 +323,9 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRendererWithProperties(SDL_ * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyRenderer */ @@ -303,7 +338,9 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surfac * \returns the rendering context on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window *window); @@ -314,7 +351,9 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window *window); * \returns the window on success or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetRenderWindow(SDL_Renderer *renderer); @@ -325,7 +364,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetRenderWindow(SDL_Renderer *rende * \returns the name of the selected renderer, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_CreateRendererWithProperties @@ -348,21 +389,21 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetRendererName(SDL_Renderer *rende * - `SDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER`: a (const SDL_PixelFormat *) * array of pixel formats, terminated with SDL_PIXELFORMAT_UNKNOWN, * representing the available texture formats for this renderer. - * - `SDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER`: an SDL_ColorSpace value + * - `SDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER`: an SDL_Colorspace value * describing the colorspace for output to the display, defaults to * SDL_COLORSPACE_SRGB. * - `SDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN`: true if the output colorspace is * SDL_COLORSPACE_SRGB_LINEAR and the renderer is showing on a display with * HDR enabled. This property can change dynamically when - * SDL_EVENT_DISPLAY_HDR_STATE_CHANGED is sent. + * SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent. * - `SDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT`: the value of SDR white in the * SDL_COLORSPACE_SRGB_LINEAR colorspace. When HDR is enabled, this value is * automatically multiplied into the color scale. This property can change - * dynamically when SDL_EVENT_DISPLAY_HDR_STATE_CHANGED is sent. + * dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent. * - `SDL_PROP_RENDERER_HDR_HEADROOM_FLOAT`: the additional high dynamic range * that can be displayed, in terms of the SDR white point. When HDR is not * enabled, this will be 1.0. This property can change dynamically when - * SDL_EVENT_DISPLAY_HDR_STATE_CHANGED is sent. + * SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent. * * With the direct3d renderer: * @@ -403,11 +444,18 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetRendererName(SDL_Renderer *rende * swapchain images, or potential frames in flight, used by the Vulkan * renderer * + * With the gpu renderer: + * + * - `SDL_PROP_RENDERER_GPU_DEVICE_POINTER`: the SDL_GPUDevice associated with + * the renderer + * * \param renderer the rendering context. * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetRendererProperties(SDL_Renderer *renderer); @@ -434,6 +482,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetRendererProperties(SDL_Rende #define SDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER "SDL.renderer.vulkan.graphics_queue_family_index" #define SDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER "SDL.renderer.vulkan.present_queue_family_index" #define SDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER "SDL.renderer.vulkan.swapchain_image_count" +#define SDL_PROP_RENDERER_GPU_DEVICE_POINTER "SDL.renderer.gpu.device" /** * Get the output size in pixels of a rendering context. @@ -444,14 +493,16 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetRendererProperties(SDL_Rende * \param renderer the rendering context. * \param w a pointer filled in with the width in pixels. * \param h a pointer filled in with the height in pixels. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCurrentRenderOutputSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderOutputSize(SDL_Renderer *renderer, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderOutputSize(SDL_Renderer *renderer, int *w, int *h); /** * Get the current output size in pixels of a rendering context. @@ -464,28 +515,33 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderOutputSize(SDL_Renderer *rende * \param renderer the rendering context. * \param w a pointer filled in with the current width. * \param h a pointer filled in with the current height. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderOutputSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCurrentRenderOutputSize(SDL_Renderer *renderer, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetCurrentRenderOutputSize(SDL_Renderer *renderer, int *w, int *h); /** * Create a texture for a rendering context. * + * The contents of a texture when first created are not defined. + * * \param renderer the rendering context. * \param format one of the enumerated values in SDL_PixelFormat. * \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. + * \returns the created texture or NULL on failure; call SDL_GetError() for + * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTextureFromSurface * \sa SDL_CreateTextureWithProperties @@ -513,7 +569,9 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer *render * \returns the created texture or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTexture * \sa SDL_CreateTextureWithProperties @@ -526,7 +584,7 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Rende * * These are the supported properties: * - * - `SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER`: an SDL_ColorSpace value + * - `SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER`: an SDL_Colorspace value * describing the texture colorspace, defaults to SDL_COLORSPACE_SRGB_LINEAR * for floating point textures, SDL_COLORSPACE_HDR10 for 10-bit textures, * SDL_COLORSPACE_SRGB for other RGB textures and SDL_COLORSPACE_JPEG for @@ -617,11 +675,12 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Rende * * \param renderer the rendering context. * \param props the properties to use. - * \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. + * \returns the created texture or NULL on failure; call SDL_GetError() for + * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties * \sa SDL_CreateTexture @@ -661,7 +720,7 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureWithProperties(SDL_Re * * The following read-only properties are provided by SDL: * - * - `SDL_PROP_TEXTURE_COLORSPACE_NUMBER`: an SDL_ColorSpace value describing + * - `SDL_PROP_TEXTURE_COLORSPACE_NUMBER`: an SDL_Colorspace value describing * the texture colorspace. * - `SDL_PROP_TEXTURE_FORMAT_NUMBER`: one of the enumerated values in * SDL_PixelFormat. @@ -701,14 +760,8 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureWithProperties(SDL_Re * * With the vulkan renderer: * - * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_POINTER`: the VkImage associated with - * the texture - * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_U_POINTER`: the VkImage associated with - * the U plane of a YUV texture - * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_V_POINTER`: the VkImage associated with - * the V plane of a YUV texture - * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_UV_POINTER`: the VkImage associated with - * the UV plane of a NV12/NV21 texture + * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER`: the VkImage associated with the + * texture * * With the opengl renderer: * @@ -740,16 +793,13 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureWithProperties(SDL_Re * - `SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER`: the GLenum for the * texture target (`GL_TEXTURE_2D`, `GL_TEXTURE_EXTERNAL_OES`, etc) * - * With the vulkan renderer: - * - * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER`: the VkImage associated with the - * texture - * * \param texture the texture to query. * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetTextureProperties(SDL_Texture *texture); @@ -789,7 +839,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetTextureProperties(SDL_Textur * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRendererFromTexture(SDL_Texture *texture); @@ -801,12 +851,14 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRendererFromTexture(SDL_Textur * 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureSize(SDL_Texture *texture, float *w, float *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureSize(SDL_Texture *texture, float *w, float *h); /** * Set an additional color value multiplied into render copy operations. @@ -818,22 +870,24 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureSize(SDL_Texture *texture, fl * `srcC = srcC * (color / 255)` * * Color modulation is not always supported by the renderer; it will return - * SDL_FALSE if color modulation is not supported. + * false 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureColorMod * \sa SDL_SetTextureAlphaMod * \sa SDL_SetTextureColorModFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureColorMod(SDL_Texture *texture, Uint8 r, Uint8 g, Uint8 b); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureColorMod(SDL_Texture *texture, Uint8 r, Uint8 g, Uint8 b); /** @@ -846,22 +900,24 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureColorMod(SDL_Texture *texture * `srcC = srcC * color` * * Color modulation is not always supported by the renderer; it will return - * SDL_FALSE if color modulation is not supported. + * false 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureColorModFloat * \sa SDL_SetTextureAlphaModFloat * \sa SDL_SetTextureColorMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureColorModFloat(SDL_Texture *texture, float r, float g, float b); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureColorModFloat(SDL_Texture *texture, float r, float g, float b); /** @@ -871,16 +927,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureColorModFloat(SDL_Texture *te * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaMod * \sa SDL_GetTextureColorModFloat * \sa SDL_SetTextureColorMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureColorMod(SDL_Texture *texture, Uint8 *r, Uint8 *g, Uint8 *b); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureColorMod(SDL_Texture *texture, Uint8 *r, Uint8 *g, Uint8 *b); /** * Get the additional color value multiplied into render copy operations. @@ -889,16 +947,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureColorMod(SDL_Texture *texture * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaModFloat * \sa SDL_GetTextureColorMod * \sa SDL_SetTextureColorModFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureColorModFloat(SDL_Texture *texture, float *r, float *g, float *b); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureColorModFloat(SDL_Texture *texture, float *r, float *g, float *b); /** * Set an additional alpha value multiplied into render copy operations. @@ -909,20 +969,22 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureColorModFloat(SDL_Texture *te * `srcA = srcA * (alpha / 255)` * * Alpha modulation is not always supported by the renderer; it will return - * SDL_FALSE if alpha modulation is not supported. + * false if alpha modulation is not supported. * * \param texture the texture to update. * \param alpha the source alpha value multiplied into copy operations. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaMod * \sa SDL_SetTextureAlphaModFloat * \sa SDL_SetTextureColorMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureAlphaMod(SDL_Texture *texture, Uint8 alpha); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureAlphaMod(SDL_Texture *texture, Uint8 alpha); /** * Set an additional alpha value multiplied into render copy operations. @@ -933,83 +995,93 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureAlphaMod(SDL_Texture *texture * `srcA = srcA * alpha` * * Alpha modulation is not always supported by the renderer; it will return - * SDL_FALSE if alpha modulation is not supported. + * false if alpha modulation is not supported. * * \param texture the texture to update. * \param alpha the source alpha value multiplied into copy operations. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaModFloat * \sa SDL_SetTextureAlphaMod * \sa SDL_SetTextureColorModFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureAlphaModFloat(SDL_Texture *texture, float alpha); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureAlphaModFloat(SDL_Texture *texture, float 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaModFloat * \sa SDL_GetTextureColorMod * \sa SDL_SetTextureAlphaMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureAlphaMod(SDL_Texture *texture, Uint8 *alpha); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureAlphaMod(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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaMod * \sa SDL_GetTextureColorModFloat * \sa SDL_SetTextureAlphaModFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureAlphaModFloat(SDL_Texture *texture, float *alpha); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureAlphaModFloat(SDL_Texture *texture, float *alpha); /** * Set the blend mode for a texture, used by SDL_RenderTexture(). * * If the blend mode is not supported, the closest supported mode is chosen - * and this function returns -1. + * and this function returns false. * * \param texture the texture to update. * \param blendMode the SDL_BlendMode to use for texture blending. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureBlendMode(SDL_Texture *texture, SDL_BlendMode blendMode); +extern SDL_DECLSPEC bool 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextureBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureBlendMode(SDL_Texture *texture, SDL_BlendMode *blendMode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureBlendMode(SDL_Texture *texture, SDL_BlendMode *blendMode); /** * Set the scale mode used for texture scale operations. @@ -1020,28 +1092,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureBlendMode(SDL_Texture *textur * * \param texture the texture to update. * \param scaleMode the SDL_ScaleMode to use for texture scaling. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureScaleMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureScaleMode(SDL_Texture *texture, SDL_ScaleMode scaleMode); +extern SDL_DECLSPEC bool 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextureScaleMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureScaleMode(SDL_Texture *texture, SDL_ScaleMode *scaleMode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureScaleMode(SDL_Texture *texture, SDL_ScaleMode *scaleMode); /** * Update the given texture rectangle with new pixel data. @@ -1063,17 +1139,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureScaleMode(SDL_Texture *textur * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTexture * \sa SDL_UnlockTexture * \sa SDL_UpdateNVTexture * \sa SDL_UpdateYUVTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateTexture(SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch); +extern SDL_DECLSPEC bool 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 @@ -1095,15 +1173,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateTexture(SDL_Texture *texture, con * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_UpdateNVTexture * \sa SDL_UpdateTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateYUVTexture(SDL_Texture *texture, +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateYUVTexture(SDL_Texture *texture, const SDL_Rect *rect, const Uint8 *Yplane, int Ypitch, const Uint8 *Uplane, int Upitch, @@ -1125,15 +1205,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateYUVTexture(SDL_Texture *texture, * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_UpdateTexture * \sa SDL_UpdateYUVTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateNVTexture(SDL_Texture *texture, +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateNVTexture(SDL_Texture *texture, const SDL_Rect *rect, const Uint8 *Yplane, int Ypitch, const Uint8 *UVplane, int UVpitch); @@ -1157,16 +1239,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateNVTexture(SDL_Texture *texture, * 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 SDL_TRUE on success or SDL_FALSE if the texture is not valid or - * was not created with `SDL_TEXTUREACCESS_STREAMING`; call - * SDL_GetError() for more information. + * \returns true on success or false 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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTextureToSurface * \sa SDL_UnlockTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockTexture(SDL_Texture *texture, +extern SDL_DECLSPEC bool SDLCALL SDL_LockTexture(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch); @@ -1192,17 +1276,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockTexture(SDL_Texture *texture, * `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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param surface a pointer to an SDL surface of size **rect**. Don't assume + * any specific pixel content. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTexture * \sa SDL_UnlockTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockTextureToSurface(SDL_Texture *texture, const SDL_Rect *rect, SDL_Surface **surface); +extern SDL_DECLSPEC bool SDLCALL SDL_LockTextureToSurface(SDL_Texture *texture, const SDL_Rect *rect, SDL_Surface **surface); /** * Unlock a texture, uploading the changes to video memory, if needed. @@ -1217,7 +1303,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockTextureToSurface(SDL_Texture *textu * * \param texture a texture locked by SDL_LockTexture(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTexture */ @@ -1234,14 +1322,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_Texture *texture); * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderTarget */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture); /** * Get the current render target. @@ -1252,7 +1342,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, * \param renderer the rendering context. * \returns the current render target or NULL for the default render target. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderTarget */ @@ -1261,13 +1353,23 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *rend /** * Set a device independent resolution and presentation mode for rendering. * - * This function sets the width and height of the logical rendering output. A - * render target is created at the specified size and used for rendering and - * then copied to the output during presentation. + * This function sets the width and height of the logical rendering output. + * The renderer will act as if the window is always the requested dimensions, + * scaling to the actual window resolution as necessary. + * + * This can be useful for games that expect a fixed size, but would like to + * scale the output to whatever is available, regardless of how a user resizes + * a window, or if the display is high DPI. * * You can disable logical coordinates by setting the mode to * SDL_LOGICAL_PRESENTATION_DISABLED, and in that case you get the full pixel - * resolution of the output window. + * resolution of the output window; it is safe to toggle logical presentation + * during the rendering of a frame: perhaps most of the rendering is done to + * specific dimensions but to make fonts look sharp, the app turns off logical + * presentation while drawing text. + * + * Letterboxing will only happen if logical presentation is enabled during + * SDL_RenderPresent; be sure to reenable it first if you were using it. * * You can convert coordinates in an event into rendering coordinates using * SDL_ConvertEventToRenderCoordinates(). @@ -1276,17 +1378,18 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *rend * \param w the width of the logical resolution. * \param h the height of the logical resolution. * \param mode the presentation mode used. - * \param scale_mode the scale mode used. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertEventToRenderCoordinates * \sa SDL_GetRenderLogicalPresentation * \sa SDL_GetRenderLogicalPresentationRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderLogicalPresentation(SDL_Renderer *renderer, int w, int h, SDL_RendererLogicalPresentation mode, SDL_ScaleMode scale_mode); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderLogicalPresentation(SDL_Renderer *renderer, int w, int h, SDL_RendererLogicalPresentation mode); /** * Get device independent resolution and presentation mode for rendering. @@ -1297,16 +1400,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderLogicalPresentation(SDL_Render * \param renderer the rendering context. * \param w an int to be filled with the width. * \param h an int to be filled with the height. - * \param mode a pointer filled in with the presentation mode. - * \param scale_mode a pointer filled in with the scale mode. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param mode the presentation mode used. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderLogicalPresentation(SDL_Renderer *renderer, int *w, int *h, SDL_RendererLogicalPresentation *mode, SDL_ScaleMode *scale_mode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderLogicalPresentation(SDL_Renderer *renderer, int *w, int *h, SDL_RendererLogicalPresentation *mode); /** * Get the final presentation rectangle for rendering. @@ -1319,36 +1423,54 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderLogicalPresentation(SDL_Render * \param renderer the rendering context. * \param rect a pointer filled in with the final presentation rectangle, may * be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderLogicalPresentationRect(SDL_Renderer *renderer, SDL_FRect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderLogicalPresentationRect(SDL_Renderer *renderer, SDL_FRect *rect); /** * Get a point in render coordinates when given a point in window coordinates. * + * This takes into account several states: + * + * - The window dimensions. + * - The logical presentation settings (SDL_SetRenderLogicalPresentation) + * - The scale (SDL_SetRenderScale) + * - The viewport (SDL_SetRenderViewport) + * * \param renderer the rendering context. * \param window_x the x coordinate in window coordinates. * \param window_y the y coordinate in window coordinates. * \param x a pointer filled with the x coordinate in render coordinates. * \param y a pointer filled with the y coordinate in render coordinates. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation * \sa SDL_SetRenderScale */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderCoordinatesFromWindow(SDL_Renderer *renderer, float window_x, float window_y, float *x, float *y); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderCoordinatesFromWindow(SDL_Renderer *renderer, float window_x, float window_y, float *x, float *y); /** * Get a point in window coordinates when given a point in render coordinates. * + * This takes into account several states: + * + * - The window dimensions. + * - The logical presentation settings (SDL_SetRenderLogicalPresentation) + * - The scale (SDL_SetRenderScale) + * - The viewport (SDL_SetRenderViewport) + * * \param renderer the rendering context. * \param x the x coordinate in render coordinates. * \param y the y coordinate in render coordinates. @@ -1356,65 +1478,95 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderCoordinatesFromWindow(SDL_Rendere * coordinates. * \param window_y a pointer filled with the y coordinate in window * coordinates. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation * \sa SDL_SetRenderScale + * \sa SDL_SetRenderViewport */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderCoordinatesToWindow(SDL_Renderer *renderer, float x, float y, float *window_x, float *window_y); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderCoordinatesToWindow(SDL_Renderer *renderer, float x, float y, float *window_x, float *window_y); /** * Convert the coordinates in an event to render coordinates. * + * This takes into account several states: + * + * - The window dimensions. + * - The logical presentation settings (SDL_SetRenderLogicalPresentation) + * - The scale (SDL_SetRenderScale) + * - The viewport (SDL_SetRenderViewport) + * + * Various event types are converted with this function: mouse, touch, pen, + * etc. + * * Touch coordinates are converted from normalized coordinates in the window * to non-normalized rendering coordinates. * - * Once converted, the coordinates may be outside the rendering area. + * Relative mouse coordinates (xrel and yrel event fields) are _also_ + * converted. Applications that do not want these fields converted should use + * SDL_RenderCoordinatesFromWindow() on the specific event fields instead of + * converting the entire event structure. + * + * Once converted, coordinates may be outside the rendering area. * * \param renderer the rendering context. * \param event the event to modify. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderCoordinatesFromWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertEventToRenderCoordinates(SDL_Renderer *renderer, SDL_Event *event); +extern SDL_DECLSPEC bool SDLCALL SDL_ConvertEventToRenderCoordinates(SDL_Renderer *renderer, SDL_Event *event); /** * Set the drawing area for rendering on the current target. * + * Drawing will clip to this area (separately from any clipping done with + * SDL_SetRenderClipRect), and the top left of the area will become coordinate + * (0, 0) for future drawing commands. + * + * The area's width and height must be >= 0. + * * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderViewport * \sa SDL_RenderViewportSet */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderViewport(SDL_Renderer *renderer, const SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderViewport(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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderViewportSet * \sa SDL_SetRenderViewport */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderViewport(SDL_Renderer *renderer, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderViewport(SDL_Renderer *renderer, SDL_Rect *rect); /** * Return whether an explicit rectangle was set as the viewport. @@ -1424,15 +1576,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderViewport(SDL_Renderer *rendere * viewport is always reset when changing rendering targets. * * \param renderer the rendering context. - * \returns SDL_TRUE if the viewport was set to a specific rectangle, or - * SDL_FALSE if it was set to NULL (the entire target). + * \returns true if the viewport was set to a specific rectangle, or false if + * it was set to NULL (the entire target). * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderViewport * \sa SDL_SetRenderViewport */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderViewportSet(SDL_Renderer *renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderViewportSet(SDL_Renderer *renderer); /** * Get the safe area for rendering within the current viewport. @@ -1447,12 +1601,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderViewportSet(SDL_Renderer *rendere * \param renderer the rendering context. * \param rect a pointer filled in with the area that is safe for interactive * content. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderSafeArea(SDL_Renderer *renderer, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderSafeArea(SDL_Renderer *renderer, SDL_Rect *rect); /** * Set the clip rectangle for rendering on the specified target. @@ -1460,15 +1616,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderSafeArea(SDL_Renderer *rendere * \param renderer the rendering context. * \param rect an SDL_Rect structure representing the clip area, relative to * the viewport, or NULL to disable clipping. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderClipRect * \sa SDL_RenderClipEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderClipRect(SDL_Renderer *renderer, const SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderClipRect(SDL_Renderer *renderer, const SDL_Rect *rect); /** * Get the clip rectangle for the current target. @@ -1476,29 +1634,33 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderClipRect(SDL_Renderer *rendere * \param renderer the rendering context. * \param rect an SDL_Rect structure filled in with the current clipping area * or an empty rectangle if clipping is disabled. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderClipEnabled * \sa SDL_SetRenderClipRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderClipRect(SDL_Renderer *renderer, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderClipRect(SDL_Renderer *renderer, SDL_Rect *rect); /** * Get whether clipping is enabled on the given renderer. * * \param renderer the rendering context. - * \returns SDL_TRUE if clipping is enabled or SDL_FALSE if not; call - * SDL_GetError() for more information. + * \returns true if clipping is enabled or false if not; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderClipRect * \sa SDL_SetRenderClipRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderClipEnabled(SDL_Renderer *renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderClipEnabled(SDL_Renderer *renderer); /** * Set the drawing scale for rendering on the current target. @@ -1514,14 +1676,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderClipEnabled(SDL_Renderer *rendere * \param renderer the rendering context. * \param scaleX the horizontal scaling factor. * \param scaleY the vertical scaling factor. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderScale */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderScale(SDL_Renderer *renderer, float scaleX, float scaleY); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderScale(SDL_Renderer *renderer, float scaleX, float scaleY); /** * Get the drawing scale for the current target. @@ -1529,14 +1693,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderScale(SDL_Renderer *renderer, * \param renderer the rendering context. * \param scaleX a pointer filled in with the horizontal scaling factor. * \param scaleY a pointer filled in with the vertical scaling factor. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderScale */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderScale(SDL_Renderer *renderer, float *scaleX, float *scaleY); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderScale(SDL_Renderer *renderer, float *scaleX, float *scaleY); /** * Set the color used for drawing operations. @@ -1551,15 +1717,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderScale(SDL_Renderer *renderer, * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawColor * \sa SDL_SetRenderDrawColorFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderDrawColor(SDL_Renderer *renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderDrawColor(SDL_Renderer *renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /** * Set the color used for drawing operations (Rect, Line and Clear). @@ -1574,15 +1742,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderDrawColor(SDL_Renderer *render * \param a the alpha value used to draw on the rendering target. Use * SDL_SetRenderDrawBlendMode to specify how the alpha channel is * used. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawColorFloat * \sa SDL_SetRenderDrawColor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderDrawColorFloat(SDL_Renderer *renderer, float r, float g, float b, float a); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderDrawColorFloat(SDL_Renderer *renderer, float r, float g, float b, float a); /** * Get the color used for drawing operations (Rect, Line and Clear). @@ -1596,15 +1766,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderDrawColorFloat(SDL_Renderer *r * 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawColorFloat * \sa SDL_SetRenderDrawColor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawColor(SDL_Renderer *renderer, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderDrawColor(SDL_Renderer *renderer, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); /** * Get the color used for drawing operations (Rect, Line and Clear). @@ -1618,15 +1790,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawColor(SDL_Renderer *render * rendering target. * \param a a pointer filled in with the alpha value used to draw on the * rendering target. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawColorFloat * \sa SDL_GetRenderDrawColor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawColorFloat(SDL_Renderer *renderer, float *r, float *g, float *b, float *a); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderDrawColorFloat(SDL_Renderer *renderer, float *r, float *g, float *b, float *a); /** * Set the color scale used for render operations. @@ -1641,28 +1815,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawColorFloat(SDL_Renderer *r * * \param renderer the rendering context. * \param scale the color scale value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderColorScale */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderColorScale(SDL_Renderer *renderer, float scale); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderColorScale(SDL_Renderer *renderer, float scale); /** * Get the color scale used for render operations. * * \param renderer the rendering context. * \param scale a pointer filled in with the current color scale value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderColorScale */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderColorScale(SDL_Renderer *renderer, float *scale); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderColorScale(SDL_Renderer *renderer, float *scale); /** * Set the blend mode used for drawing operations (Fill and Line). @@ -1671,28 +1849,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderColorScale(SDL_Renderer *rende * * \param renderer the rendering context. * \param blendMode the SDL_BlendMode to use for blending. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderDrawBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode); +extern SDL_DECLSPEC bool 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer *renderer, SDL_BlendMode *blendMode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer *renderer, SDL_BlendMode *blendMode); /** * Clear the current rendering target with the drawing color. @@ -1703,14 +1885,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer *re * SDL_SetRenderDrawColor() when needed. * * \param renderer the rendering context. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawColor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderClear(SDL_Renderer *renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderClear(SDL_Renderer *renderer); /** * Draw a point on the current rendering target at subpixel precision. @@ -1718,14 +1902,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderClear(SDL_Renderer *renderer); * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderPoints */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPoint(SDL_Renderer *renderer, float x, float y); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderPoint(SDL_Renderer *renderer, float x, float y); /** * Draw multiple points on the current rendering target at subpixel precision. @@ -1733,14 +1919,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPoint(SDL_Renderer *renderer, flo * \param renderer the renderer which should draw multiple points. * \param points the points to draw. * \param count the number of points to draw. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderPoint */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPoints(SDL_Renderer *renderer, const SDL_FPoint *points, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderPoints(SDL_Renderer *renderer, const SDL_FPoint *points, int count); /** * Draw a line on the current rendering target at subpixel precision. @@ -1750,14 +1938,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPoints(SDL_Renderer *renderer, co * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderLines */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderLine(SDL_Renderer *renderer, float x1, float y1, float x2, float y2); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderLine(SDL_Renderer *renderer, float x1, float y1, float x2, float y2); /** * Draw a series of connected lines on the current rendering target at @@ -1766,14 +1956,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderLine(SDL_Renderer *renderer, floa * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderLine */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderLines(SDL_Renderer *renderer, const SDL_FPoint *points, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderLines(SDL_Renderer *renderer, const SDL_FPoint *points, int count); /** * Draw a rectangle on the current rendering target at subpixel precision. @@ -1781,14 +1973,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderLines(SDL_Renderer *renderer, con * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderRects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderRect(SDL_Renderer *renderer, const SDL_FRect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderRect(SDL_Renderer *renderer, const SDL_FRect *rect); /** * Draw some number of rectangles on the current rendering target at subpixel @@ -1797,14 +1991,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderRect(SDL_Renderer *renderer, cons * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count); /** * Fill a rectangle on the current rendering target with the drawing color at @@ -1813,14 +2009,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderRects(SDL_Renderer *renderer, con * \param renderer the renderer which should fill a rectangle. * \param rect a pointer to the destination rectangle, or NULL for the entire * rendering target. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderFillRects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderFillRect(SDL_Renderer *renderer, const SDL_FRect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderFillRect(SDL_Renderer *renderer, const SDL_FRect *rect); /** * Fill some number of rectangles on the current rendering target with the @@ -1829,14 +2027,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderFillRect(SDL_Renderer *renderer, * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderFillRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderFillRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderFillRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count); /** * Copy a portion of the texture to the current rendering target at subpixel @@ -1848,15 +2048,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderFillRects(SDL_Renderer *renderer, * texture. * \param dstrect a pointer to the destination rectangle, or NULL for the * entire rendering target. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTextureRotated * \sa SDL_RenderTextureTiled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect); /** * Copy a portion of the source texture to the current rendering target, with @@ -1875,17 +2077,49 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTexture(SDL_Renderer *renderer, S * around dstrect.w/2, dstrect.h/2). * \param flip an SDL_FlipMode value stating which flipping actions should be * performed on the texture. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture, +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect, - const double angle, const SDL_FPoint *center, - const SDL_FlipMode flip); + double angle, const SDL_FPoint *center, + SDL_FlipMode flip); + +/** + * Copy a portion of the source texture to the current rendering target, with + * affine transform, 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 origin a pointer to a point indicating where the top-left corner of + * srcrect should be mapped to, or NULL for the rendering + * target's origin. + * \param right a pointer to a point indicating where the top-right corner of + * srcrect should be mapped to, or NULL for the rendering + * target's top-right corner. + * \param down a pointer to a point indicating where the bottom-left corner of + * srcrect should be mapped to, or NULL for the rendering target's + * bottom-left corner. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety You may only call this function from the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_RenderTexture + */ +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTextureAffine(SDL_Renderer *renderer, SDL_Texture *texture, + const SDL_FRect *srcrect, const SDL_FPoint *origin, + const SDL_FPoint *right, const SDL_FPoint *down); /** * Tile a portion of the texture to the current rendering target at subpixel @@ -1903,14 +2137,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTextureRotated(SDL_Renderer *rend * 64x64 tiles. * \param dstrect a pointer to the destination rectangle, or NULL for the * entire rendering target. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTextureTiled(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float scale, const SDL_FRect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTextureTiled(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float scale, const SDL_FRect *dstrect); /** * Perform a scaled copy using the 9-grid algorithm to the current rendering @@ -1935,14 +2171,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTextureTiled(SDL_Renderer *render * corner of `dstrect`, or 0.0f for an unscaled copy. * \param dstrect a pointer to the destination rectangle, or NULL for the * entire rendering target. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTexture9Grid(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float left_width, float right_width, float top_height, float bottom_height, float scale, const SDL_FRect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTexture9Grid(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float left_width, float right_width, float top_height, float bottom_height, float scale, const SDL_FRect *dstrect); /** * Render a list of triangles, optionally using a texture and indices into the @@ -1957,14 +2195,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTexture9Grid(SDL_Renderer *render * array, if NULL all vertices will be rendered in sequential * order. * \param num_indices number of indices. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderGeometryRaw */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, +extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Vertex *vertices, int num_vertices, const int *indices, int num_indices); @@ -1987,14 +2227,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, * 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). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderGeometry */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, +extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, SDL_Texture *texture, const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, @@ -2017,7 +2259,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *rendere * \returns a new SDL_Surface on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect); @@ -2041,18 +2285,20 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RenderReadPixels(SDL_Renderer *ren * pixel. * * Please note, that in case of rendering to a texture - there is **no need** - * to call `SDL_RenderPresent` after drawing needed objects to a texture, you - * are only required to change back the rendering target to default via - * `SDL_SetRenderTarget(renderer, NULL)` afterwards, as textures by themselves - * do not have a concept of backbuffers. + * to call `SDL_RenderPresent` after drawing needed objects to a texture, and + * should not be done; you are only required to change back the rendering + * target to default via `SDL_SetRenderTarget(renderer, NULL)` afterwards, as + * textures by themselves do not have a concept of backbuffers. Calling + * SDL_RenderPresent while rendering to a texture will still update the screen + * with any current drawing that has been done _to the window itself_. * * \param renderer the rendering context. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \threadsafety You may only call this function on the main thread. + * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_RenderClear @@ -2067,7 +2313,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RenderReadPixels(SDL_Renderer *ren * \sa SDL_SetRenderDrawBlendMode * \sa SDL_SetRenderDrawColor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPresent(SDL_Renderer *renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderPresent(SDL_Renderer *renderer); /** * Destroy the specified texture. @@ -2077,7 +2323,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPresent(SDL_Renderer *renderer); * * \param texture the texture to destroy. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTexture * \sa SDL_CreateTextureFromSurface @@ -2092,7 +2340,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture *texture); * * \param renderer the rendering context. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer */ @@ -2122,12 +2372,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_Renderer *renderer); * be prepared to make changes if specific state needs to be protected. * * \param renderer the rendering context. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlushRenderer(SDL_Renderer *renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_FlushRenderer(SDL_Renderer *renderer); /** * Get the CAMetalLayer associated with the given Metal renderer. @@ -2139,7 +2391,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlushRenderer(SDL_Renderer *renderer); * \returns a `CAMetalLayer *` on success, or NULL if the renderer isn't a * Metal renderer. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderMetalCommandEncoder */ @@ -2160,7 +2414,9 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetRenderMetalLayer(SDL_Renderer *rendere * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderMetalLayer */ @@ -2187,15 +2443,15 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetRenderMetalCommandEncoder(SDL_Renderer * \param signal_semaphore a VkSempahore that SDL will signal when rendering * for the current frame is complete, or 0 if not * needed. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is **NOT** safe to call this function from two threads at * once. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddVulkanRenderSemaphores(SDL_Renderer *renderer, Uint32 wait_stage_mask, Sint64 wait_semaphore, Sint64 signal_semaphore); +extern SDL_DECLSPEC bool SDLCALL SDL_AddVulkanRenderSemaphores(SDL_Renderer *renderer, Uint32 wait_stage_mask, Sint64 wait_semaphore, Sint64 signal_semaphore); /** * Toggle VSync of the given renderer. @@ -2204,21 +2460,23 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddVulkanRenderSemaphores(SDL_Renderer * * The `vsync` parameter can be 1 to synchronize present with every vertical * refresh, 2 to synchronize present with every second vertical refresh, etc., - * SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), - * or SDL_WINDOW_SURFACE_VSYNC_DISABLED to disable. Not every value is - * supported by every driver, so you should check the return value to see - * whether the requested setting is supported. + * SDL_RENDERER_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or + * SDL_RENDERER_VSYNC_DISABLED to disable. Not every value is supported by + * every driver, so you should check the return value to see whether the + * requested setting is supported. * * \param renderer the renderer to toggle. * \param vsync the vertical refresh sync interval. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderVSync */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderVSync(SDL_Renderer *renderer, int vsync); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderVSync(SDL_Renderer *renderer, int vsync); #define SDL_RENDERER_VSYNC_DISABLED 0 #define SDL_RENDERER_VSYNC_ADAPTIVE (-1) @@ -2229,14 +2487,96 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderVSync(SDL_Renderer *renderer, * \param renderer the renderer to toggle. * \param vsync an int filled with the current vertical refresh sync interval. * See SDL_SetRenderVSync() for the meaning of the value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderVSync */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderVSync(SDL_Renderer *renderer, int *vsync); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderVSync(SDL_Renderer *renderer, int *vsync); + +/** + * The size, in pixels, of a single SDL_RenderDebugText() character. + * + * The font is monospaced and square, so this applies to all characters. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_RenderDebugText + */ +#define SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE 8 + +/** + * Draw debug text to an SDL_Renderer. + * + * This function will render a string of text to an SDL_Renderer. Note that + * this is a convenience function for debugging, with severe limitations, and + * not intended to be used for production apps and games. + * + * Among these limitations: + * + * - It accepts UTF-8 strings, but will only renders ASCII characters. + * - It has a single, tiny size (8x8 pixels). One can use logical presentation + * or scaling to adjust it, but it will be blurry. + * - It uses a simple, hardcoded bitmap font. It does not allow different font + * selections and it does not support truetype, for proper scaling. + * - It does no word-wrapping and does not treat newline characters as a line + * break. If the text goes out of the window, it's gone. + * + * For serious text rendering, there are several good options, such as + * SDL_ttf, stb_truetype, or other external libraries. + * + * On first use, this will create an internal texture for rendering glyphs. + * This texture will live until the renderer is destroyed. + * + * The text is drawn in the color specified by SDL_SetRenderDrawColor(). + * + * \param renderer the renderer which should draw a line of text. + * \param x the x coordinate where the top-left corner of the text will draw. + * \param y the y coordinate where the top-left corner of the text will draw. + * \param str the string to render. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_RenderDebugTextFormat + * \sa SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE + */ +extern SDL_DECLSPEC bool SDLCALL SDL_RenderDebugText(SDL_Renderer *renderer, float x, float y, const char *str); + +/** + * Draw debug text to an SDL_Renderer. + * + * This function will render a printf()-style format string to a renderer. + * Note that this is a convinence function for debugging, with severe + * limitations, and is not intended to be used for production apps and games. + * + * For the full list of limitations and other useful information, see + * SDL_RenderDebugText. + * + * \param renderer the renderer which should draw the text. + * \param x the x coordinate where the top-left corner of the text will draw. + * \param y the y coordinate where the top-left corner of the text will draw. + * \param fmt the format string to draw. + * \param ... additional parameters matching % tokens in the `fmt` string, if + * any. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_RenderDebugText + * \sa SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE + */ +extern SDL_DECLSPEC bool SDLCALL SDL_RenderDebugTextFormat(SDL_Renderer *renderer, float x, float y, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(4); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_revision.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_revision.h index f78e5d9..18f7c4d 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_revision.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_revision.h @@ -1,22 +1,22 @@ /* - Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2025 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. + 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: + 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. + 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. */ /* WIKI CATEGORY: Version */ @@ -48,9 +48,9 @@ */ #define SDL_REVISION "Some arbitrary string decided at SDL build time" #elif defined(SDL_VENDOR_INFO) -#define SDL_REVISION SDL_VENDOR_INFO +#define SDL_REVISION "release-3.2.0-0-g535d80bad (" SDL_VENDOR_INFO ")" #else -#define SDL_REVISION "" +#define SDL_REVISION "release-3.2.0-0-g535d80bad" #endif #endif /* SDL_revision_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_scancode.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_scancode.h index ccf8bb5..9650a6c 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_scancode.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_scancode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,11 @@ * # CategoryScancode * * Defines keyboard scancodes. + * + * Please refer to the Best Keyboard Practices document for details on what + * this information means and how best to use it. + * + * https://wiki.libsdl.org/SDL3/BestKeyboardPractices */ #ifndef SDL_scancode_h_ @@ -42,7 +47,7 @@ * The values in this enumeration are based on the USB usage page standard: * https://usb.org/sites/default/files/hut1_5.pdf * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_Scancode { @@ -417,8 +422,8 @@ typedef enum SDL_Scancode SDL_SCANCODE_RESERVED = 400, /**< 400-500 reserved for dynamic keycodes */ - SDL_NUM_SCANCODES = 512 /**< not a key, just marks the number of scancodes - for array bounds */ + SDL_SCANCODE_COUNT = 512 /**< not a key, just marks the number of scancodes for array bounds */ + } SDL_Scancode; #endif /* SDL_scancode_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_sensor.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_sensor.h index 3ae4856..b220f05 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_sensor.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_sensor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,12 @@ * # CategorySensor * * SDL sensor management. + * + * These APIs grant access to gyros and accelerometers on various platforms. + * + * 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. */ #ifndef SDL_sensor_h_ @@ -41,14 +47,10 @@ extern "C" { #endif /** - * SDL_sensor.h + * The opaque structure used to identify an opened SDL sensor. * - * 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. + * \since This struct is available since SDL 3.2.0. */ - -struct SDL_Sensor; typedef struct SDL_Sensor SDL_Sensor; /** @@ -57,7 +59,7 @@ typedef struct SDL_Sensor SDL_Sensor; * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_SensorID; @@ -69,7 +71,7 @@ typedef Uint32 SDL_SensorID; * rest will have an value of SDL_STANDARD_GRAVITY away from the center of the * earth, which is a positive Y value. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_STANDARD_GRAVITY 9.80665f @@ -123,7 +125,7 @@ typedef Uint32 SDL_SensorID; * * The gyroscope axis data is not changed when the device is rotated. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetCurrentDisplayOrientation */ @@ -151,7 +153,7 @@ typedef enum SDL_SensorType * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorID * SDLCALL SDL_GetSensors(int *count); @@ -163,7 +165,7 @@ extern SDL_DECLSPEC SDL_SensorID * SDLCALL SDL_GetSensors(int *count); * \param instance_id the sensor instance ID. * \returns the sensor name, or NULL if `instance_id` is not valid. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorNameForID(SDL_SensorID instance_id); @@ -176,7 +178,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorNameForID(SDL_SensorID ins * \returns the SDL_SensorType, or `SDL_SENSOR_INVALID` if `instance_id` is * not valid. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorTypeForID(SDL_SensorID instance_id); @@ -189,7 +191,7 @@ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorTypeForID(SDL_SensorID i * \returns the sensor platform dependent type, or -1 if `instance_id` is not * valid. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableTypeForID(SDL_SensorID instance_id); @@ -200,7 +202,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableTypeForID(SDL_SensorID i * \returns an SDL_Sensor object or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_OpenSensor(SDL_SensorID instance_id); @@ -211,7 +213,7 @@ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_OpenSensor(SDL_SensorID instance_id * \returns an SDL_Sensor object or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_GetSensorFromID(SDL_SensorID instance_id); @@ -222,7 +224,7 @@ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_GetSensorFromID(SDL_SensorID instan * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSensorProperties(SDL_Sensor *sensor); @@ -233,7 +235,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSensorProperties(SDL_Sensor * \returns the sensor name or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorName(SDL_Sensor *sensor); @@ -244,7 +246,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorName(SDL_Sensor *sensor); * \returns the SDL_SensorType type, or `SDL_SENSOR_INVALID` if `sensor` is * NULL. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorType(SDL_Sensor *sensor); @@ -254,7 +256,7 @@ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorType(SDL_Sensor *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 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableType(SDL_Sensor *sensor); @@ -265,7 +267,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableType(SDL_Sensor *sensor) * \returns the sensor instance ID, or 0 on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorID SDLCALL SDL_GetSensorID(SDL_Sensor *sensor); @@ -277,19 +279,19 @@ extern SDL_DECLSPEC SDL_SensorID SDLCALL SDL_GetSensorID(SDL_Sensor *sensor); * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSensorData(SDL_Sensor *sensor, float *data, int num_values); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSensorData(SDL_Sensor *sensor, float *data, int num_values); /** * Close a sensor previously opened with SDL_OpenSensor(). * * \param sensor the SDL_Sensor object to close. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CloseSensor(SDL_Sensor *sensor); @@ -302,7 +304,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseSensor(SDL_Sensor *sensor); * This needs to be called from the thread that initialized the sensor * subsystem. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateSensors(void); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_stdinc.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_stdinc.h index 5539f2a..4e15a3c 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_stdinc.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_stdinc.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,9 +22,25 @@ /** * # CategoryStdinc * - * This is a general header that includes C language support. It implements a - * subset of the C runtime: these should all behave the same way as their C - * runtime equivalents, but with an SDL_ prefix. + * SDL provides its own implementation of some of the most important C runtime + * functions. + * + * Using these functions allows an app to have access to common C + * functionality without depending on a specific C runtime (or a C runtime at + * all). More importantly, the SDL implementations work identically across + * platforms, so apps can avoid surprises like snprintf() behaving differently + * between Windows and Linux builds, or itoa() only existing on some + * platforms. + * + * For many of the most common functions, like SDL_memcpy, SDL might just call + * through to the usual C runtime behind the scenes, if it makes sense to do + * so (if it's faster and always available/reliable on a given platform), + * reducing library size and offering the most optimized option. + * + * SDL also offers other C-runtime-adjacent functionality in this header that + * either isn't, strictly speaking, part of any C runtime standards, like + * SDL_crc32() and SDL_reinterpret_cast, etc. It also offers a few better + * options, like SDL_strlcpy(), which functions as a safer form of strcpy(). */ #ifndef SDL_stdinc_h_ @@ -32,17 +48,34 @@ #include -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#include -#endif #include -#ifndef __cplusplus -#include -#endif #include #include #include +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ + defined(SDL_INCLUDE_INTTYPES_H) +#include +#endif + +#ifndef __cplusplus +#if defined(__has_include) && !defined(SDL_INCLUDE_STDBOOL_H) +#if __has_include() +#define SDL_INCLUDE_STDBOOL_H +#endif +#endif +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ + (defined(_MSC_VER) && (_MSC_VER >= 1910 /* Visual Studio 2017 */)) || \ + defined(SDL_INCLUDE_STDBOOL_H) +#include +#elif !defined(__bool_true_false_are_defined) && !defined(bool) +#define bool unsigned char +#define false 0 +#define true 1 +#define __bool_true_false_are_defined 1 +#endif +#endif /* !__cplusplus */ + #ifndef SDL_DISABLE_ALLOCA # ifndef alloca # ifdef HAVE_ALLOCA_H @@ -74,31 +107,120 @@ void *alloca(size_t); # endif #endif -#ifdef SIZE_MAX + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Don't let SDL use "long long" C types. + * + * SDL will define this if it believes the compiler doesn't understand the + * "long long" syntax for C datatypes. This can happen on older compilers. + * + * If _your_ compiler doesn't support "long long" but SDL doesn't know it, it + * is safe to define this yourself to build against the SDL headers. + * + * If this is defined, it will remove access to some C runtime support + * functions, like SDL_ulltoa and SDL_strtoll that refer to this datatype + * explicitly. The rest of SDL will still be available. + * + * SDL's own source code cannot be built with a compiler that has this + * defined, for various technical reasons. + */ +#define SDL_NOLONGLONG 1 + +#elif defined(_MSC_VER) && (_MSC_VER < 1310) /* long long introduced in Visual Studio.NET 2003 */ +# define SDL_NOLONGLONG 1 +#endif + + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * The largest value that a `size_t` can hold for the target platform. + * + * `size_t` is generally the same size as a pointer in modern times, but this + * can get weird on very old and very esoteric machines. For example, on a + * 16-bit Intel 286, you might have a 32-bit "far" pointer (16-bit segment + * plus 16-bit offset), but `size_t` is 16 bits, because it can only deal with + * the offset into an individual segment. + * + * In modern times, it's generally expected to cover an entire linear address + * space. But be careful! + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_SIZE_MAX SIZE_MAX + +#elif defined(SIZE_MAX) # define SDL_SIZE_MAX SIZE_MAX #else # define SDL_SIZE_MAX ((size_t) -1) #endif +#ifndef SDL_COMPILE_TIME_ASSERT +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + /** - * 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. + * A compile-time assertion. + * + * This can check constant values _known to the compiler at build time_ for + * correctness, and end the compile with the error if they fail. + * + * Often times these are used to verify basic truths, like the size of a + * datatype is what is expected: + * + * ```c + * SDL_COMPILE_TIME_ASSERT(uint32_size, sizeof(Uint32) == 4); + * ``` + * + * The `name` parameter must be a valid C symbol, and must be unique across + * all compile-time asserts in the same compilation unit (one run of the + * compiler), or the build might fail with cryptic errors on some targets. + * This is used with a C language trick that works on older compilers that + * don't support better assertion techniques. + * + * If you need an assertion that operates at runtime, on variable data, you + * should try SDL_assert instead. + * + * \param name a unique identifier for this assertion. + * \param x the value to test. Must be a boolean value. + * + * \threadsafety This macro doesn't generate any code to run. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_assert */ -#ifdef __has_builtin -#define SDL_HAS_BUILTIN(x) __has_builtin(x) -#else -#define SDL_HAS_BUILTIN(x) 0 +#define SDL_COMPILE_TIME_ASSERT(name, x) FailToCompileIf_x_IsFalse(x) +#elif defined(__cplusplus) +/* Keep C++ case alone: Some versions of gcc will define __STDC_VERSION__ even when compiling in C++ mode. */ +#if (__cplusplus >= 201103L) +#define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) +#endif +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L) +#define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) +#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 /** - * The number of elements in an array. + * The number of elements in a static array. + * + * This will compile but return incorrect results for a pointer to an array; + * it has to be an array the compiler knows the size of. * * This macro looks like it double-evaluates the argument, but it does so * inside of `sizeof`, so there are no side-effects here, as expressions do * not actually run any code in these cases. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) @@ -111,7 +233,9 @@ void *alloca(size_t); * #define LOG_ERROR(X) OutputDebugString(SDL_STRINGIFY_ARG(__FUNCTION__) ": " X "\n")` * ``` * - * \since This macro is available since SDL 3.0.0. + * \param arg the text to turn into a string literal. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_STRINGIFY_ARG(arg) #arg @@ -122,7 +246,76 @@ void *alloca(size_t); * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above). */ /* @{ */ -#ifdef __cplusplus + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Handle a Reinterpret Cast properly whether using C or C++. + * + * If compiled as C++, this macro offers a proper C++ reinterpret_cast<>. + * + * If compiled as C, this macro does a normal C-style cast. + * + * This is helpful to avoid compiler warnings in C++. + * + * \param type the type to cast the expression to. + * \param expression the expression to cast to a different type. + * \returns `expression`, cast to `type`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_static_cast + * \sa SDL_const_cast + */ +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) /* or `((type)(expression))` in C */ + +/** + * Handle a Static Cast properly whether using C or C++. + * + * If compiled as C++, this macro offers a proper C++ static_cast<>. + * + * If compiled as C, this macro does a normal C-style cast. + * + * This is helpful to avoid compiler warnings in C++. + * + * \param type the type to cast the expression to. + * \param expression the expression to cast to a different type. + * \returns `expression`, cast to `type`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_reinterpret_cast + * \sa SDL_const_cast + */ +#define SDL_static_cast(type, expression) static_cast(expression) /* or `((type)(expression))` in C */ + +/** + * Handle a Const Cast properly whether using C or C++. + * + * If compiled as C++, this macro offers a proper C++ const_cast<>. + * + * If compiled as C, this macro does a normal C-style cast. + * + * This is helpful to avoid compiler warnings in C++. + * + * \param type the type to cast the expression to. + * \param expression the expression to cast to a different type. + * \returns `expression`, cast to `type`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_reinterpret_cast + * \sa SDL_static_cast + */ +#define SDL_const_cast(type, expression) const_cast(expression) /* or `((type)(expression))` in C */ + +#elif defined(__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) @@ -131,9 +324,23 @@ void *alloca(size_t); #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 a four character code as a Uint32. + * + * \param A the first ASCII character. + * \param B the second ASCII character. + * \param C the third ASCII character. + * \param D the fourth ASCII character. + * \returns the four characters converted into a Uint32, one character + * per-byte. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #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) | \ @@ -149,7 +356,7 @@ void *alloca(size_t); * 0xFFFFFFFF is overflowing a 32-bit value. Use `SDL_SINT64_C(0xFFFFFFFF1)` * instead of `0xFFFFFFFF1` by itself. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_UINT64_C */ @@ -162,63 +369,49 @@ void *alloca(size_t); * 0xFFFFFFFF is overflowing a 32-bit value. Use `SDL_UINT64_C(0xFFFFFFFF1)` * instead of `0xFFFFFFFF1` by itself. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SINT64_C */ #define SDL_UINT64_C(c) c ## ULL /* or whatever the current compiler uses. */ -#elif defined(INT64_C) +#else /* !SDL_WIKI_DOCUMENTATION_SECTION */ + +#ifndef SDL_SINT64_C +#if defined(INT64_C) #define SDL_SINT64_C(c) INT64_C(c) -#define SDL_UINT64_C(c) UINT64_C(c) #elif defined(_MSC_VER) #define SDL_SINT64_C(c) c ## i64 -#define SDL_UINT64_C(c) c ## ui64 #elif defined(__LP64__) || defined(_LP64) #define SDL_SINT64_C(c) c ## L -#define SDL_UINT64_C(c) c ## UL #else #define SDL_SINT64_C(c) c ## LL +#endif +#endif /* !SDL_SINT64_C */ + +#ifndef SDL_UINT64_C +#if defined(UINT64_C) +#define SDL_UINT64_C(c) UINT64_C(c) +#elif defined(_MSC_VER) +#define SDL_UINT64_C(c) c ## ui64 +#elif defined(__LP64__) || defined(_LP64) +#define SDL_UINT64_C(c) c ## UL +#else #define SDL_UINT64_C(c) c ## ULL #endif +#endif /* !SDL_UINT64_C */ + +#endif /* !SDL_WIKI_DOCUMENTATION_SECTION */ /** * \name Basic data types */ /* @{ */ -/** - * A boolean false. - * - * \since This macro is available since SDL 3.0.0. - * - * \sa SDL_bool - */ -#define SDL_FALSE false - -/** - * A boolean true. - * - * \since This macro is available since SDL 3.0.0. - * - * \sa SDL_bool - */ -#define SDL_TRUE true - -/** - * A boolean type: true or false. - * - * \since This datatype is available since SDL 3.0.0. - * - * \sa SDL_TRUE - * \sa SDL_FALSE - */ -typedef bool SDL_bool; - /** * A signed 8-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef int8_t Sint8; #define SDL_MAX_SINT8 ((Sint8)0x7F) /* 127 */ @@ -227,7 +420,7 @@ typedef int8_t Sint8; /** * An unsigned 8-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef uint8_t Uint8; #define SDL_MAX_UINT8 ((Uint8)0xFF) /* 255 */ @@ -236,7 +429,7 @@ typedef uint8_t Uint8; /** * A signed 16-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef int16_t Sint16; #define SDL_MAX_SINT16 ((Sint16)0x7FFF) /* 32767 */ @@ -245,7 +438,7 @@ typedef int16_t Sint16; /** * An unsigned 16-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef uint16_t Uint16; #define SDL_MAX_UINT16 ((Uint16)0xFFFF) /* 65535 */ @@ -254,7 +447,7 @@ typedef uint16_t Uint16; /** * A signed 32-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef int32_t Sint32; #define SDL_MAX_SINT32 ((Sint32)0x7FFFFFFF) /* 2147483647 */ @@ -263,7 +456,7 @@ typedef int32_t Sint32; /** * An unsigned 32-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef uint32_t Uint32; #define SDL_MAX_UINT32 ((Uint32)0xFFFFFFFFu) /* 4294967295 */ @@ -272,7 +465,7 @@ typedef uint32_t Uint32; /** * A signed 64-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SINT64_C */ @@ -283,7 +476,7 @@ typedef int64_t Sint64; /** * An unsigned 64-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_UINT64_C */ @@ -299,7 +492,7 @@ typedef uint64_t Uint64; * and SDL_SECONDS_TO_NS(), and between Windows FILETIME values with * SDL_TimeToWindows() and SDL_TimeFromWindows(). * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_MAX_SINT64 * \sa SDL_MIN_SINT64 @@ -325,40 +518,217 @@ typedef Sint64 SDL_Time; * Equals by default to platform-defined `FLT_EPSILON`, or * `1.1920928955078125e-07F` if that's not available. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_FLT_EPSILON 1.1920928955078125e-07F /* 0x0.000002p0 */ #endif /* @} *//* Floating-point constants */ +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A printf-formatting string for an Sint64 value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIs64 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIs64 "lld" + +/** + * A printf-formatting string for a Uint64 value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIu64 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIu64 "llu" + +/** + * A printf-formatting string for a Uint64 value as lower-case hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIx64 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIx64 "llx" + +/** + * A printf-formatting string for a Uint64 value as upper-case hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIX64 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIX64 "llX" + +/** + * A printf-formatting string for an Sint32 value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIs32 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIs32 "d" + +/** + * A printf-formatting string for a Uint32 value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIu32 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIu32 "u" + +/** + * A printf-formatting string for a Uint32 value as lower-case hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIx32 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIx32 "x" + +/** + * A printf-formatting string for a Uint32 value as upper-case hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIX32 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIX32 "X" + +/** + * A printf-formatting string prefix for a `long long` value. + * + * This is just the prefix! You probably actually want SDL_PRILLd, SDL_PRILLu, + * SDL_PRILLx, or SDL_PRILLX instead. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRILL_PREFIX "d bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRILL_PREFIX "ll" + +/** + * A printf-formatting string for a `long long` value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRILLd " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRILLd SDL_PRILL_PREFIX "d" + +/** + * A printf-formatting string for a `unsigned long long` value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRILLu " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRILLu SDL_PRILL_PREFIX "u" + +/** + * A printf-formatting string for an `unsigned long long` value as lower-case + * hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRILLx " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRILLx SDL_PRILL_PREFIX "x" + +/** + * A printf-formatting string for an `unsigned long long` value as upper-case + * hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRILLX " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRILLX SDL_PRILL_PREFIX "X" +#endif /* SDL_WIKI_DOCUMENTATION_SECTION */ + /* Make sure we have macros for printing width-based integers. - * should define these but this is not true all platforms. + * should define these but this is not true all platforms. * (for example win32) */ #ifndef SDL_PRIs64 -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) #define SDL_PRIs64 "I64d" -#elif defined(PRIs64) -#define SDL_PRIs64 PRIs64 -#elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) +#elif defined(PRId64) +#define SDL_PRIs64 PRId64 +#elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) && !defined(__EMSCRIPTEN__) #define SDL_PRIs64 "ld" #else #define SDL_PRIs64 "lld" #endif #endif #ifndef SDL_PRIu64 -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) #define SDL_PRIu64 "I64u" #elif defined(PRIu64) #define SDL_PRIu64 PRIu64 -#elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) +#elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) && !defined(__EMSCRIPTEN__) #define SDL_PRIu64 "lu" #else #define SDL_PRIu64 "llu" #endif #endif #ifndef SDL_PRIx64 -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) #define SDL_PRIx64 "I64x" #elif defined(PRIx64) #define SDL_PRIx64 PRIx64 @@ -369,7 +739,7 @@ typedef Sint64 SDL_Time; #endif #endif #ifndef SDL_PRIX64 -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) #define SDL_PRIX64 "I64X" #elif defined(PRIX64) #define SDL_PRIX64 PRIX64 @@ -407,9 +777,318 @@ typedef Sint64 SDL_Time; #define SDL_PRIX32 "X" #endif #endif +/* Specifically for the `long long` -- SDL-specific. */ +#ifdef SDL_PLATFORM_WINDOWS +#ifndef SDL_NOLONGLONG +SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 for windows - make sure `long long` is 64 bits. */ +#endif +#define SDL_PRILL_PREFIX "I64" +#else +#define SDL_PRILL_PREFIX "ll" +#endif +#ifndef SDL_PRILLd +#define SDL_PRILLd SDL_PRILL_PREFIX "d" +#endif +#ifndef SDL_PRILLu +#define SDL_PRILLu SDL_PRILL_PREFIX "u" +#endif +#ifndef SDL_PRILLx +#define SDL_PRILLx SDL_PRILL_PREFIX "x" +#endif +#ifndef SDL_PRILLX +#define SDL_PRILLX SDL_PRILL_PREFIX "X" +#endif /* Annotations to help code analysis tools */ -#ifdef SDL_DISABLE_ANALYZE_MACROS +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Macro that annotates function params with input buffer size. + * + * If we were to annotate `memcpy`: + * + * ```c + * void *memcpy(void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); + * ``` + * + * This notes that `src` should be `len` bytes in size and is only read by the + * function. The compiler or other analysis tools can warn when this doesn't + * appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_IN_BYTECAP(x) _In_bytecount_(x) + +/** + * Macro that annotates function params with input/output string buffer size. + * + * If we were to annotate `strlcat`: + * + * ```c + * size_t strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); + * ``` + * + * This notes that `dst` is a null-terminated C string, should be `maxlen` + * bytes in size, and is both read from and written to by the function. The + * compiler or other analysis tools can warn when this doesn't appear to be + * the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x) + +/** + * Macro that annotates function params with output string buffer size. + * + * If we were to annotate `snprintf`: + * + * ```c + * int snprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, ...); + * ``` + * + * This notes that `text` is a null-terminated C string, should be `maxlen` + * bytes in size, and is only written to by the function. The compiler or + * other analysis tools can warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_OUT_Z_CAP(x) _Out_z_cap_(x) + +/** + * Macro that annotates function params with output buffer size. + * + * If we were to annotate `wcsncpy`: + * + * ```c + * char *wcscpy(SDL_OUT_CAP(bufsize) wchar_t *dst, const wchar_t *src, size_t bufsize); + * ``` + * + * This notes that `dst` should have a capacity of `bufsize` wchar_t in size, + * and is only written to by the function. The compiler or other analysis + * tools can warn when this doesn't appear to be the case. + * + * This operates on counts of objects, not bytes. Use SDL_OUT_BYTECAP for + * bytes. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_OUT_CAP(x) _Out_cap_(x) + +/** + * Macro that annotates function params with output buffer size. + * + * If we were to annotate `memcpy`: + * + * ```c + * void *memcpy(SDL_OUT_BYTECAP(bufsize) void *dst, const void *src, size_t bufsize); + * ``` + * + * This notes that `dst` should have a capacity of `bufsize` bytes in size, + * and is only written to by the function. The compiler or other analysis + * tools can warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_OUT_BYTECAP(x) _Out_bytecap_(x) + +/** + * Macro that annotates function params with output buffer string size. + * + * If we were to annotate `strcpy`: + * + * ```c + * char *strcpy(SDL_OUT_Z_BYTECAP(bufsize) char *dst, const char *src, size_t bufsize); + * ``` + * + * This notes that `dst` should have a capacity of `bufsize` bytes in size, + * and a zero-terminated string is written to it by the function. The compiler + * or other analysis tools can warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x) + +/** + * Macro that annotates function params as printf-style format strings. + * + * If we were to annotate `fprintf`: + * + * ```c + * int fprintf(FILE *f, SDL_PRINTF_FORMAT_STRING const char *fmt, ...); + * ``` + * + * This notes that `fmt` should be a printf-style format string. The compiler + * or other analysis tools can warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRINTF_FORMAT_STRING _Printf_format_string_ + +/** + * Macro that annotates function params as scanf-style format strings. + * + * If we were to annotate `fscanf`: + * + * ```c + * int fscanf(FILE *f, SDL_SCANF_FORMAT_STRING const char *fmt, ...); + * ``` + * + * This notes that `fmt` should be a scanf-style format string. The compiler + * or other analysis tools can warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_ + +/** + * Macro that annotates a vararg function that operates like printf. + * + * If we were to annotate `fprintf`: + * + * ```c + * int fprintf(FILE *f, const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + * ``` + * + * This notes that the second parameter should be a printf-style format + * string, followed by `...`. The compiler or other analysis tools can warn + * when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 ))) + +/** + * Macro that annotates a va_list function that operates like printf. + * + * If we were to annotate `vfprintf`: + * + * ```c + * int vfprintf(FILE *f, const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2); + * ``` + * + * This notes that the second parameter should be a printf-style format + * string, followed by a va_list. The compiler or other analysis tools can + * warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRINTF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __printf__, fmtargnumber, 0 ))) + +/** + * Macro that annotates a vararg function that operates like scanf. + * + * If we were to annotate `fscanf`: + * + * ```c + * int fscanf(FILE *f, const char *fmt, ...) SDL_PRINTF_VARARG_FUNCV(2); + * ``` + * + * This notes that the second parameter should be a scanf-style format string, + * followed by `...`. The compiler or other analysis tools can warn when this + * doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_SCANF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 ))) + +/** + * Macro that annotates a va_list function that operates like scanf. + * + * If we were to annotate `vfscanf`: + * + * ```c + * int vfscanf(FILE *f, const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2); + * ``` + * + * This notes that the second parameter should be a scanf-style format string, + * followed by a va_list. The compiler or other analysis tools can warn when + * this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_SCANF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __scanf__, fmtargnumber, 0 ))) + +/** + * Macro that annotates a vararg function that operates like wprintf. + * + * If we were to annotate `fwprintf`: + * + * ```c + * int fwprintf(FILE *f, const wchar_t *fmt, ...) SDL_WPRINTF_VARARG_FUNC(2); + * ``` + * + * This notes that the second parameter should be a wprintf-style format wide + * string, followed by `...`. The compiler or other analysis tools can warn + * when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_WPRINTF_VARARG_FUNC( fmtargnumber ) /* __attribute__ (( format( __wprintf__, fmtargnumber, fmtargnumber+1 ))) */ + +/** + * Macro that annotates a va_list function that operates like wprintf. + * + * If we were to annotate `vfwprintf`: + * + * ```c + * int vfwprintf(FILE *f, const wchar_t *fmt, va_list ap) SDL_WPRINTF_VARARG_FUNC(2); + * ``` + * + * This notes that the second parameter should be a wprintf-style format wide + * string, followed by a va_list. The compiler or other analysis tools can + * warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_WPRINTF_VARARG_FUNCV( fmtargnumber ) /* __attribute__ (( format( __wprintf__, fmtargnumber, 0 ))) */ + +#elif defined(SDL_DISABLE_ANALYZE_MACROS) #define SDL_IN_BYTECAP(x) #define SDL_INOUT_Z_CAP(x) #define SDL_OUT_Z_CAP(x) @@ -423,7 +1102,7 @@ typedef Sint64 SDL_Time; #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) #define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) #define SDL_WPRINTF_VARARG_FUNC( fmtargnumber ) -#define SDL_WSCANF_VARARG_FUNC( fmtargnumber ) +#define SDL_WPRINTF_VARARG_FUNCV( fmtargnumber ) #else #if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */ #include @@ -447,53 +1126,45 @@ typedef Sint64 SDL_Time; #define SDL_PRINTF_FORMAT_STRING #define SDL_SCANF_FORMAT_STRING #endif -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 ))) #define SDL_PRINTF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __printf__, fmtargnumber, 0 ))) #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 ))) #define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __scanf__, fmtargnumber, 0 ))) #define SDL_WPRINTF_VARARG_FUNC( fmtargnumber ) /* __attribute__ (( format( __wprintf__, fmtargnumber, fmtargnumber+1 ))) */ -#define SDL_WSCANF_VARARG_FUNC( fmtargnumber ) /* __attribute__ (( format( __wscanf__, fmtargnumber, fmtargnumber+1 ))) */ +#define SDL_WPRINTF_VARARG_FUNCV( fmtargnumber ) /* __attribute__ (( format( __wprintf__, fmtargnumber, 0 ))) */ #else #define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) #define SDL_PRINTF_VARARG_FUNCV( fmtargnumber ) #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) #define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) #define SDL_WPRINTF_VARARG_FUNC( fmtargnumber ) -#define SDL_WSCANF_VARARG_FUNC( fmtargnumber ) +#define SDL_WPRINTF_VARARG_FUNCV( fmtargnumber ) #endif #endif /* SDL_DISABLE_ANALYZE_MACROS */ -#ifndef SDL_COMPILE_TIME_ASSERT -#if defined(__cplusplus) -/* Keep C++ case alone: Some versions of gcc will define __STDC_VERSION__ even when compiling in C++ mode. */ -#if (__cplusplus >= 201103L) -#define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) -#endif -#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L) -#define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) -#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(bool, sizeof(SDL_bool) == 1); -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); +SDL_COMPILE_TIME_ASSERT(bool_size, sizeof(bool) == 1); +SDL_COMPILE_TIME_ASSERT(uint8_size, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8_size, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16_size, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16_size, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32_size, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32_size, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64_size, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64_size, sizeof(Sint64) == 8); +#ifndef SDL_NOLONGLONG +SDL_COMPILE_TIME_ASSERT(uint64_longlong, sizeof(Uint64) <= sizeof(unsigned long long)); +SDL_COMPILE_TIME_ASSERT(size_t_longlong, sizeof(size_t) <= sizeof(unsigned long long)); +#endif +typedef struct SDL_alignment_test +{ + Uint8 a; + void *b; +} SDL_alignment_test; +SDL_COMPILE_TIME_ASSERT(struct_alignment, sizeof(SDL_alignment_test) == (2 * sizeof(void *))); +SDL_COMPILE_TIME_ASSERT(two_s_complement, (int)~(int)0 == (int)(-1)); #endif /* DOXYGEN_SHOULD_IGNORE_THIS */ /** \endcond */ @@ -523,7 +1194,96 @@ SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); extern "C" { #endif -#ifndef SDL_DISABLE_ALLOCA +/** + * A macro to initialize an SDL interface. + * + * This macro will initialize an SDL interface structure and should be called + * before you fill out the fields with your implementation. + * + * You can use it like this: + * + * ```c + * SDL_IOStreamInterface iface; + * + * SDL_INIT_INTERFACE(&iface); + * + * // Fill in the interface function pointers with your implementation + * iface.seek = ... + * + * stream = SDL_OpenIO(&iface, NULL); + * ``` + * + * If you are using designated initializers, you can use the size of the + * interface as the version, e.g. + * + * ```c + * SDL_IOStreamInterface iface = { + * .version = sizeof(iface), + * .seek = ... + * }; + * stream = SDL_OpenIO(&iface, NULL); + * ``` + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_IOStreamInterface + * \sa SDL_StorageInterface + * \sa SDL_VirtualJoystickDesc + */ +#define SDL_INIT_INTERFACE(iface) \ + do { \ + SDL_zerop(iface); \ + (iface)->version = sizeof(*(iface)); \ + } while (0) + + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Allocate memory on the stack (maybe). + * + * If SDL knows how to access alloca() on the current platform, it will use it + * to stack-allocate memory here. If it doesn't, it will use SDL_malloc() to + * heap-allocate memory. + * + * Since this might not be stack memory at all, it's important that you check + * the returned pointer for NULL, and that you call SDL_stack_free on the + * memory when done with it. Since this might be stack memory, it's important + * that you don't allocate large amounts of it, or allocate in a loop without + * returning from the function, so the stack doesn't overflow. + * + * \param type the datatype of the memory to allocate. + * \param count the number of `type` objects to allocate. + * \returns newly-allocated memory, or NULL on failure. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_stack_free + */ +#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) + +/** + * Free memory previously allocated with SDL_stack_alloc. + * + * If SDL used alloca() to allocate this memory, this macro does nothing and + * the allocated memory will be automatically released when the function that + * called SDL_stack_alloc() returns. If SDL used SDL_malloc(), it will + * SDL_free the memory immediately. + * + * \param data the pointer, from SDL_stack_alloc(), to free. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_stack_alloc + */ +#define SDL_stack_free(data) +#elif !defined(SDL_DISABLE_ALLOCA) #define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) #define SDL_stack_free(data) #else @@ -531,14 +1291,184 @@ extern "C" { #define SDL_stack_free(data) SDL_free(data) #endif +/** + * Allocate uninitialized memory. + * + * The allocated memory returned by this function must be freed with + * SDL_free(). + * + * If `size` is 0, it will be set to 1. + * + * If you want to allocate memory aligned to a specific alignment, consider + * using SDL_aligned_alloc(). + * + * \param size the size to allocate. + * \returns a pointer to the allocated memory, or NULL if allocation failed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_free + * \sa SDL_calloc + * \sa SDL_realloc + * \sa SDL_aligned_alloc + */ extern SDL_DECLSPEC SDL_MALLOC void * SDLCALL SDL_malloc(size_t size); + +/** + * Allocate a zero-initialized array. + * + * The memory returned by this function must be freed with SDL_free(). + * + * If either of `nmemb` or `size` is 0, they will both be set to 1. + * + * \param nmemb the number of elements in the array. + * \param size the size of each element of the array. + * \returns a pointer to the allocated array, or NULL if allocation failed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_free + * \sa SDL_malloc + * \sa SDL_realloc + */ extern SDL_DECLSPEC SDL_MALLOC SDL_ALLOC_SIZE2(1, 2) void * SDLCALL SDL_calloc(size_t nmemb, size_t size); + +/** + * Change the size of allocated memory. + * + * The memory returned by this function must be freed with SDL_free(). + * + * If `size` is 0, it will be set to 1. Note that this is unlike some other C + * runtime `realloc` implementations, which may treat `realloc(mem, 0)` the + * same way as `free(mem)`. + * + * If `mem` is NULL, the behavior of this function is equivalent to + * SDL_malloc(). Otherwise, the function can have one of three possible + * outcomes: + * + * - If it returns the same pointer as `mem`, it means that `mem` was resized + * in place without freeing. + * - If it returns a different non-NULL pointer, it means that `mem` was freed + * and cannot be dereferenced anymore. + * - If it returns NULL (indicating failure), then `mem` will remain valid and + * must still be freed with SDL_free(). + * + * \param mem a pointer to allocated memory to reallocate, or NULL. + * \param size the new size of the memory. + * \returns a pointer to the newly allocated memory, or NULL if allocation + * failed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_free + * \sa SDL_malloc + * \sa SDL_calloc + */ extern SDL_DECLSPEC SDL_ALLOC_SIZE(2) void * SDLCALL SDL_realloc(void *mem, size_t size); + +/** + * Free allocated memory. + * + * The pointer is no longer valid after this call and cannot be dereferenced + * anymore. + * + * If `mem` is NULL, this function does nothing. + * + * \param mem a pointer to allocated memory, or NULL. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_malloc + * \sa SDL_calloc + * \sa SDL_realloc + */ extern SDL_DECLSPEC void SDLCALL SDL_free(void *mem); +/** + * A callback used to implement SDL_malloc(). + * + * SDL will always ensure that the passed `size` is greater than 0. + * + * \param size the size to allocate. + * \returns a pointer to the allocated memory, or NULL if allocation failed. + * + * \threadsafety It should be safe to call this callback from any thread. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_malloc + * \sa SDL_GetOriginalMemoryFunctions + * \sa SDL_GetMemoryFunctions + * \sa SDL_SetMemoryFunctions + */ typedef void *(SDLCALL *SDL_malloc_func)(size_t size); + +/** + * A callback used to implement SDL_calloc(). + * + * SDL will always ensure that the passed `nmemb` and `size` are both greater + * than 0. + * + * \param nmemb the number of elements in the array. + * \param size the size of each element of the array. + * \returns a pointer to the allocated array, or NULL if allocation failed. + * + * \threadsafety It should be safe to call this callback from any thread. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_calloc + * \sa SDL_GetOriginalMemoryFunctions + * \sa SDL_GetMemoryFunctions + * \sa SDL_SetMemoryFunctions + */ typedef void *(SDLCALL *SDL_calloc_func)(size_t nmemb, size_t size); + +/** + * A callback used to implement SDL_realloc(). + * + * SDL will always ensure that the passed `size` is greater than 0. + * + * \param mem a pointer to allocated memory to reallocate, or NULL. + * \param size the new size of the memory. + * \returns a pointer to the newly allocated memory, or NULL if allocation + * failed. + * + * \threadsafety It should be safe to call this callback from any thread. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_realloc + * \sa SDL_GetOriginalMemoryFunctions + * \sa SDL_GetMemoryFunctions + * \sa SDL_SetMemoryFunctions + */ typedef void *(SDLCALL *SDL_realloc_func)(void *mem, size_t size); + +/** + * A callback used to implement SDL_free(). + * + * SDL will always ensure that the passed `mem` is a non-NULL pointer. + * + * \param mem a pointer to allocated memory. + * + * \threadsafety It should be safe to call this callback from any thread. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_free + * \sa SDL_GetOriginalMemoryFunctions + * \sa SDL_GetMemoryFunctions + * \sa SDL_SetMemoryFunctions + */ typedef void (SDLCALL *SDL_free_func)(void *mem); /** @@ -556,7 +1486,7 @@ typedef void (SDLCALL *SDL_free_func)(void *mem); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func *malloc_func, SDL_calloc_func *calloc_func, @@ -575,7 +1505,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func * unlikely event of a background thread calling * SDL_SetMemoryFunctions simultaneously. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetMemoryFunctions * \sa SDL_GetOriginalMemoryFunctions @@ -599,42 +1529,42 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetMemoryFunctions(SDL_malloc_func *malloc_ * \param calloc_func custom calloc function. * \param realloc_func custom realloc function. * \param free_func custom free function. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, but one * should not replace the memory functions once any allocations * are made! * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMemoryFunctions * \sa SDL_GetOriginalMemoryFunctions */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func, +extern SDL_DECLSPEC bool SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func, SDL_calloc_func calloc_func, SDL_realloc_func realloc_func, SDL_free_func free_func); /** - * Allocate memory aligned to a specific value. - * - * If `alignment` is less than the size of `void *`, then it will be increased - * to match that. - * - * The returned memory address will be a multiple of the alignment value, and - * the amount of memory allocated will be a multiple of the alignment value. + * Allocate memory aligned to a specific alignment. * * The memory returned by this function must be freed with SDL_aligned_free(), - * and _not_ SDL_free. + * _not_ SDL_free(). * - * \param alignment the alignment requested. + * If `alignment` is less than the size of `void *`, it will be increased to + * match that. + * + * The returned memory address will be a multiple of the alignment value, and + * the size of the memory allocated will be a multiple of the alignment value. + * + * \param alignment the alignment of the memory. * \param size the size to allocate. - * \returns a pointer to the aligned memory. + * \returns a pointer to the aligned memory, or NULL if allocation failed. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_aligned_free */ @@ -646,11 +1576,13 @@ extern SDL_DECLSPEC SDL_MALLOC void * SDLCALL SDL_aligned_alloc(size_t alignment * The pointer is no longer valid after this call and cannot be dereferenced * anymore. * - * \param mem a pointer previously returned by SDL_aligned_alloc. + * If `mem` is NULL, this function does nothing. + * + * \param mem a pointer previously returned by SDL_aligned_alloc(), or NULL. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_aligned_alloc */ @@ -659,31 +1591,552 @@ extern SDL_DECLSPEC void SDLCALL SDL_aligned_free(void *mem); /** * Get the number of outstanding (unfreed) allocations. * - * \returns the number of allocations. + * \returns the number of allocations or -1 if allocation counting is + * disabled. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetNumAllocations(void); -extern SDL_DECLSPEC const char * SDLCALL SDL_getenv(const char *name); -extern SDL_DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite); -extern SDL_DECLSPEC int SDLCALL SDL_unsetenv(const char *name); +/** + * A thread-safe set of environment variables + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironment + * \sa SDL_CreateEnvironment + * \sa SDL_GetEnvironmentVariable + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + * \sa SDL_DestroyEnvironment + */ +typedef struct SDL_Environment SDL_Environment; +/** + * Get the process environment. + * + * This is initialized at application start and is not affected by setenv() + * and unsetenv() calls after that point. Use SDL_SetEnvironmentVariable() and + * SDL_UnsetEnvironmentVariable() if you want to modify this environment, or + * SDL_setenv_unsafe() or SDL_unsetenv_unsafe() if you want changes to persist + * in the C runtime environment after SDL_Quit(). + * + * \returns a pointer to the environment for the process or NULL on failure; + * call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironmentVariable + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC SDL_Environment * SDLCALL SDL_GetEnvironment(void); + +/** + * Create a set of environment variables + * + * \param populated true to initialize it from the C runtime environment, + * false to create an empty environment. + * \returns a pointer to the new environment or NULL on failure; call + * SDL_GetError() for more information. + * + * \threadsafety If `populated` is false, it is safe to call this function + * from any thread, otherwise it is safe if no other threads are + * calling setenv() or unsetenv() + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironmentVariable + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + * \sa SDL_DestroyEnvironment + */ +extern SDL_DECLSPEC SDL_Environment * SDLCALL SDL_CreateEnvironment(bool populated); + +/** + * Get the value of a variable in the environment. + * + * \param env the environment to query. + * \param name the name of the variable to get. + * \returns a pointer to the value of the variable or NULL if it can't be + * found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironment + * \sa SDL_CreateEnvironment + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC const char * SDLCALL SDL_GetEnvironmentVariable(SDL_Environment *env, const char *name); + +/** + * Get all variables in the environment. + * + * \param env the environment to query. + * \returns a NULL terminated array of pointers to environment variables in + * the form "variable=value" or NULL on failure; call SDL_GetError() + * for more information. This is a single allocation that should be + * freed with SDL_free() when it is no longer needed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironment + * \sa SDL_CreateEnvironment + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC char ** SDLCALL SDL_GetEnvironmentVariables(SDL_Environment *env); + +/** + * Set the value of a variable in the environment. + * + * \param env the environment to modify. + * \param name the name of the variable to set. + * \param value the value of the variable to set. + * \param overwrite true to overwrite the variable if it exists, false to + * return success without setting the variable if it already + * exists. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironment + * \sa SDL_CreateEnvironment + * \sa SDL_GetEnvironmentVariable + * \sa SDL_GetEnvironmentVariables + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetEnvironmentVariable(SDL_Environment *env, const char *name, const char *value, bool overwrite); + +/** + * Clear a variable from the environment. + * + * \param env the environment to modify. + * \param name the name of the variable to unset. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironment + * \sa SDL_CreateEnvironment + * \sa SDL_GetEnvironmentVariable + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC bool SDLCALL SDL_UnsetEnvironmentVariable(SDL_Environment *env, const char *name); + +/** + * Destroy a set of environment variables. + * + * \param env the environment to destroy. + * + * \threadsafety It is safe to call this function from any thread, as long as + * the environment is no longer in use. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateEnvironment + */ +extern SDL_DECLSPEC void SDLCALL SDL_DestroyEnvironment(SDL_Environment *env); + +/** + * Get the value of a variable in the environment. + * + * This function uses SDL's cached copy of the environment and is thread-safe. + * + * \param name the name of the variable to get. + * \returns a pointer to the value of the variable or NULL if it can't be + * found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC const char * SDLCALL SDL_getenv(const char *name); + +/** + * Get the value of a variable in the environment. + * + * This function bypasses SDL's cached copy of the environment and is not + * thread-safe. + * + * \param name the name of the variable to get. + * \returns a pointer to the value of the variable or NULL if it can't be + * found. + * + * \threadsafety This function is not thread safe, consider using SDL_getenv() + * instead. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_getenv + */ +extern SDL_DECLSPEC const char * SDLCALL SDL_getenv_unsafe(const char *name); + +/** + * Set the value of a variable in the environment. + * + * \param name the name of the variable to set. + * \param value the value of the variable to set. + * \param overwrite 1 to overwrite the variable if it exists, 0 to return + * success without setting the variable if it already exists. + * \returns 0 on success, -1 on error. + * + * \threadsafety This function is not thread safe, consider using + * SDL_SetEnvironmentVariable() instead. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetEnvironmentVariable + */ +extern SDL_DECLSPEC int SDLCALL SDL_setenv_unsafe(const char *name, const char *value, int overwrite); + +/** + * Clear a variable from the environment. + * + * \param name the name of the variable to unset. + * \returns 0 on success, -1 on error. + * + * \threadsafety This function is not thread safe, consider using + * SDL_UnsetEnvironmentVariable() instead. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC int SDLCALL SDL_unsetenv_unsafe(const char *name); + +/** + * A callback used with SDL sorting and binary search functions. + * + * \param a a pointer to the first element being compared. + * \param b a pointer to the second element being compared. + * \returns -1 if `a` should be sorted before `b`, 1 if `b` should be sorted + * before `a`, 0 if they are equal. If two elements are equal, their + * order in the sorted array is undefined. + * + * \since This callback is available since SDL 3.2.0. + * + * \sa SDL_bsearch + * \sa SDL_qsort + */ typedef int (SDLCALL *SDL_CompareCallback)(const void *a, const void *b); + +/** + * Sort an array. + * + * For example: + * + * ```c + * typedef struct { + * int key; + * const char *string; + * } data; + * + * int SDLCALL compare(const void *a, const void *b) + * { + * const data *A = (const data *)a; + * const data *B = (const data *)b; + * + * if (A->n < B->n) { + * return -1; + * } else if (B->n < A->n) { + * return 1; + * } else { + * return 0; + * } + * } + * + * data values[] = { + * { 3, "third" }, { 1, "first" }, { 2, "second" } + * }; + * + * SDL_qsort(values, SDL_arraysize(values), sizeof(values[0]), compare); + * ``` + * + * \param base a pointer to the start of the array. + * \param nmemb the number of elements in the array. + * \param size the size of the elements in the array. + * \param compare a function used to compare elements in the array. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_bsearch + * \sa SDL_qsort_r + */ extern SDL_DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, SDL_CompareCallback compare); + +/** + * Perform a binary search on a previously sorted array. + * + * For example: + * + * ```c + * typedef struct { + * int key; + * const char *string; + * } data; + * + * int SDLCALL compare(const void *a, const void *b) + * { + * const data *A = (const data *)a; + * const data *B = (const data *)b; + * + * if (A->n < B->n) { + * return -1; + * } else if (B->n < A->n) { + * return 1; + * } else { + * return 0; + * } + * } + * + * data values[] = { + * { 1, "first" }, { 2, "second" }, { 3, "third" } + * }; + * data key = { 2, NULL }; + * + * data *result = SDL_bsearch(&key, values, SDL_arraysize(values), sizeof(values[0]), compare); + * ``` + * + * \param key a pointer to a key equal to the element being searched for. + * \param base a pointer to the start of the array. + * \param nmemb the number of elements in the array. + * \param size the size of the elements in the array. + * \param compare a function used to compare elements in the array. + * \returns a pointer to the matching element in the array, or NULL if not + * found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_bsearch_r + * \sa SDL_qsort + */ extern SDL_DECLSPEC void * SDLCALL SDL_bsearch(const void *key, const void *base, size_t nmemb, size_t size, SDL_CompareCallback compare); +/** + * A callback used with SDL sorting and binary search functions. + * + * \param userdata the `userdata` pointer passed to the sort function. + * \param a a pointer to the first element being compared. + * \param b a pointer to the second element being compared. + * \returns -1 if `a` should be sorted before `b`, 1 if `b` should be sorted + * before `a`, 0 if they are equal. If two elements are equal, their + * order in the sorted array is undefined. + * + * \since This callback is available since SDL 3.2.0. + * + * \sa SDL_qsort_r + * \sa SDL_bsearch_r + */ typedef int (SDLCALL *SDL_CompareCallback_r)(void *userdata, const void *a, const void *b); + +/** + * Sort an array, passing a userdata pointer to the compare function. + * + * For example: + * + * ```c + * typedef enum { + * sort_increasing, + * sort_decreasing, + * } sort_method; + * + * typedef struct { + * int key; + * const char *string; + * } data; + * + * int SDLCALL compare(const void *userdata, const void *a, const void *b) + * { + * sort_method method = (sort_method)(uintptr_t)userdata; + * const data *A = (const data *)a; + * const data *B = (const data *)b; + * + * if (A->key < B->key) { + * return (method == sort_increasing) ? -1 : 1; + * } else if (B->key < A->key) { + * return (method == sort_increasing) ? 1 : -1; + * } else { + * return 0; + * } + * } + * + * data values[] = { + * { 3, "third" }, { 1, "first" }, { 2, "second" } + * }; + * + * SDL_qsort_r(values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing); + * ``` + * + * \param base a pointer to the start of the array. + * \param nmemb the number of elements in the array. + * \param size the size of the elements in the array. + * \param compare a function used to compare elements in the array. + * \param userdata a pointer to pass to the compare function. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_bsearch_r + * \sa SDL_qsort + */ extern SDL_DECLSPEC void SDLCALL SDL_qsort_r(void *base, size_t nmemb, size_t size, SDL_CompareCallback_r compare, void *userdata); + +/** + * Perform a binary search on a previously sorted array, passing a userdata + * pointer to the compare function. + * + * For example: + * + * ```c + * typedef enum { + * sort_increasing, + * sort_decreasing, + * } sort_method; + * + * typedef struct { + * int key; + * const char *string; + * } data; + * + * int SDLCALL compare(const void *userdata, const void *a, const void *b) + * { + * sort_method method = (sort_method)(uintptr_t)userdata; + * const data *A = (const data *)a; + * const data *B = (const data *)b; + * + * if (A->key < B->key) { + * return (method == sort_increasing) ? -1 : 1; + * } else if (B->key < A->key) { + * return (method == sort_increasing) ? 1 : -1; + * } else { + * return 0; + * } + * } + * + * data values[] = { + * { 1, "first" }, { 2, "second" }, { 3, "third" } + * }; + * data key = { 2, NULL }; + * + * data *result = SDL_bsearch_r(&key, values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing); + * ``` + * + * \param key a pointer to a key equal to the element being searched for. + * \param base a pointer to the start of the array. + * \param nmemb the number of elements in the array. + * \param size the size of the elements in the array. + * \param compare a function used to compare elements in the array. + * \param userdata a pointer to pass to the compare function. + * \returns a pointer to the matching element in the array, or NULL if not + * found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_bsearch + * \sa SDL_qsort_r + */ extern SDL_DECLSPEC void * SDLCALL SDL_bsearch_r(const void *key, const void *base, size_t nmemb, size_t size, SDL_CompareCallback_r compare, void *userdata); +/** + * Compute the absolute value of `x`. + * + * \param x an integer value. + * \returns the absolute value of x. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_abs(int x); -/* NOTE: these double-evaluate their arguments, so you should never have side effects in the parameters */ +/** + * Return the lesser of two values. + * + * This is a helper macro that might be more clear than writing out the + * comparisons directly, and works with any type that can be compared with the + * `<` operator. However, it double-evaluates both its parameters, so do not + * use expressions with side-effects here. + * + * \param x the first value to compare. + * \param y the second value to compare. + * \returns the lesser of `x` and `y`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) + +/** + * Return the greater of two values. + * + * This is a helper macro that might be more clear than writing out the + * comparisons directly, and works with any type that can be compared with the + * `>` operator. However, it double-evaluates both its parameters, so do not + * use expressions with side-effects here. + * + * \param x the first value to compare. + * \param y the second value to compare. + * \returns the lesser of `x` and `y`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) + +/** + * Return a value clamped to a range. + * + * If `x` is outside the range a values between `a` and `b`, the returned + * value will be `a` or `b` as appropriate. Otherwise, `x` is returned. + * + * This macro will produce incorrect results if `b` is less than `a`. + * + * This is a helper macro that might be more clear than writing out the + * comparisons directly, and works with any type that can be compared with the + * `<` and `>` operators. However, it double-evaluates all its parameters, so + * do not use expressions with side-effects here. + * + * \param x the value to compare. + * \param a the low end value. + * \param b the high end value. + * \returns x, clamped between a and b. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_clamp(x, a, b) (((x) < (a)) ? (a) : (((x) > (b)) ? (b) : (x))) /** @@ -697,7 +2150,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_abs(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isalpha(int x); @@ -712,7 +2165,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isalpha(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isalnum(int x); @@ -727,7 +2180,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isalnum(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isblank(int x); @@ -742,7 +2195,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isblank(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_iscntrl(int x); @@ -757,7 +2210,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_iscntrl(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isdigit(int x); @@ -772,7 +2225,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isdigit(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isxdigit(int x); @@ -787,7 +2240,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isxdigit(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isgraph * \sa SDL_isalnum @@ -812,7 +2265,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_ispunct(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isspace(int x); @@ -827,7 +2280,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isspace(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isupper(int x); @@ -842,7 +2295,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isupper(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_islower(int x); @@ -861,7 +2314,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_islower(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isprint(int x); @@ -880,7 +2333,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isprint(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isprint */ @@ -900,7 +2353,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isgraph(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_toupper(int x); @@ -918,13 +2371,96 @@ extern SDL_DECLSPEC int SDLCALL SDL_toupper(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_tolower(int x); +/** + * Calculate a CRC-16 value. + * + * https://en.wikipedia.org/wiki/Cyclic_redundancy_check + * + * This function can be called multiple times, to stream data to be + * checksummed in blocks. Each call must provide the previous CRC-16 return + * value to be updated with the next block. The first call to this function + * for a set of blocks should pass in a zero CRC value. + * + * \param crc the current checksum for this data set, or 0 for a new data set. + * \param data a new block of data to add to the checksum. + * \param len the size, in bytes, of the new block of data. + * \returns a CRC-16 checksum value of all blocks in the data set. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_crc16(Uint16 crc, const void *data, size_t len); + +/** + * Calculate a CRC-32 value. + * + * https://en.wikipedia.org/wiki/Cyclic_redundancy_check + * + * This function can be called multiple times, to stream data to be + * checksummed in blocks. Each call must provide the previous CRC-32 return + * value to be updated with the next block. The first call to this function + * for a set of blocks should pass in a zero CRC value. + * + * \param crc the current checksum for this data set, or 0 for a new data set. + * \param data a new block of data to add to the checksum. + * \param len the size, in bytes, of the new block of data. + * \returns a CRC-32 checksum value of all blocks in the data set. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_crc32(Uint32 crc, const void *data, size_t len); +/** + * Calculate a 32-bit MurmurHash3 value for a block of data. + * + * https://en.wikipedia.org/wiki/MurmurHash + * + * A seed may be specified, which changes the final results consistently, but + * this does not work like SDL_crc16 and SDL_crc32: you can't feed a previous + * result from this function back into itself as the next seed value to + * calculate a hash in chunks; it won't produce the same hash as it would if + * the same data was provided in a single call. + * + * If you aren't sure what to provide for a seed, zero is fine. Murmur3 is not + * cryptographically secure, so it shouldn't be used for hashing top-secret + * data. + * + * \param data the data to be hashed. + * \param len the size of data, in bytes. + * \param seed a value that alters the final hash value. + * \returns a Murmur3 32-bit hash value. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_murmur3_32(const void *data, size_t len, Uint32 seed); + +/** + * Copy non-overlapping memory. + * + * The memory regions must not overlap. If they do, use SDL_memmove() instead. + * + * \param dst The destination memory region. Must not be NULL, and must not + * overlap with `src`. + * \param src The source memory region. Must not be NULL, and must not overlap + * with `dst`. + * \param len The length in bytes of both `dst` and `src`. + * \returns `dst`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_memmove + */ extern SDL_DECLSPEC void * SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); /* Take advantage of compiler optimizations for memcpy */ @@ -935,10 +2471,52 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SD #define SDL_memcpy memcpy #endif + +/** + * A macro to copy memory between objects, with basic type checking. + * + * SDL_memcpy and SDL_memmove do not care where you copy memory to and from, + * which can lead to bugs. This macro aims to avoid most of those bugs by + * making sure that the source and destination are both pointers to objects + * that are the same size. It does not check that the objects are the same + * _type_, just that the copy will not overflow either object. + * + * The size check happens at compile time, and the compiler will throw an + * error if the objects are different sizes. + * + * Generally this is intended to copy a single object, not an array. + * + * This macro looks like it double-evaluates its parameters, but the extras + * them are in `sizeof` sections, which generate no code nor side-effects. + * + * \param dst a pointer to the destination object. Must not be NULL. + * \param src a pointer to the source object. Must not be NULL. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ #define SDL_copyp(dst, src) \ { SDL_COMPILE_TIME_ASSERT(SDL_copyp, sizeof (*(dst)) == sizeof (*(src))); } \ SDL_memcpy((dst), (src), sizeof(*(src))) +/** + * Copy memory ranges that might overlap. + * + * It is okay for the memory regions to overlap. If you are confident that the + * regions never overlap, using SDL_memcpy() may improve performance. + * + * \param dst The destination memory region. Must not be NULL. + * \param src The source memory region. Must not be NULL. + * \param len The length in bytes of both `dst` and `src`. + * \returns `dst`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_memcpy + */ extern SDL_DECLSPEC void * SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); /* Take advantage of compiler optimizations for memmove */ @@ -949,7 +2527,44 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, S #define SDL_memmove memmove #endif +/** + * Initialize all bytes of buffer of memory to a specific value. + * + * This function will set `len` bytes, pointed to by `dst`, to the value + * specified in `c`. + * + * Despite `c` being an `int` instead of a `char`, this only operates on + * bytes; `c` must be a value between 0 and 255, inclusive. + * + * \param dst the destination memory region. Must not be NULL. + * \param c the byte value to set. + * \param len the length, in bytes, to set in `dst`. + * \returns `dst`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC void * SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len); + +/** + * Initialize all 32-bit words of buffer of memory to a specific value. + * + * This function will set a buffer of `dwords` Uint32 values, pointed to by + * `dst`, to the value specified in `val`. + * + * Unlike SDL_memset, this sets 32-bit values, not bytes, so it's not limited + * to a range of 0-255. + * + * \param dst the destination memory region. Must not be NULL. + * \param val the Uint32 value to set. + * \param dwords the number of Uint32 values to set in `dst`. + * \returns `dst`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC void * SDLCALL SDL_memset4(void *dst, Uint32 val, size_t dwords); /* Take advantage of compiler optimizations for memset */ @@ -960,18 +2575,255 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memset4(void *dst, Uint32 val, size_t dwo #define SDL_memset memset #endif +/** + * Clear an object's memory to zero. + * + * This is wrapper over SDL_memset that handles calculating the object size, + * so there's no chance of copy/paste errors, and the code is cleaner. + * + * This requires an object, not a pointer to an object, nor an array. + * + * \param x the object to clear. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_zerop + * \sa SDL_zeroa + */ #define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) + +/** + * Clear an object's memory to zero, using a pointer. + * + * This is wrapper over SDL_memset that handles calculating the object size, + * so there's no chance of copy/paste errors, and the code is cleaner. + * + * This requires a pointer to an object, not an object itself, nor an array. + * + * \param x a pointer to the object to clear. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_zero + * \sa SDL_zeroa + */ #define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) + +/** + * Clear an array's memory to zero. + * + * This is wrapper over SDL_memset that handles calculating the array size, so + * there's no chance of copy/paste errors, and the code is cleaner. + * + * This requires an array, not an object, nor a pointer to an object. + * + * \param x an array to clear. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_zero + * \sa SDL_zeroa + */ #define SDL_zeroa(x) SDL_memset((x), 0, sizeof((x))) + +/** + * Compare two buffers of memory. + * + * \param s1 the first buffer to compare. NULL is not permitted! + * \param s2 the second buffer to compare. NULL is not permitted! + * \param len the number of bytes to compare between the buffers. + * \returns less than zero if s1 is "less than" s2, greater than zero if s1 is + * "greater than" s2, and zero if the buffers match exactly for `len` + * bytes. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); +/** + * This works exactly like wcslen() but doesn't require access to a C runtime. + * + * Counts the number of wchar_t values in `wstr`, excluding the null + * terminator. + * + * Like SDL_strlen only counts bytes and not codepoints in a UTF-8 string, + * this counts wchar_t values in a string, even if the string's encoding is of + * variable width, like UTF-16. + * + * Also be aware that wchar_t is different sizes on different platforms (4 + * bytes on Linux, 2 on Windows, etc). + * + * \param wstr The null-terminated wide string to read. Must not be NULL. + * \returns the length (in wchar_t values, excluding the null terminator) of + * `wstr`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_wcsnlen + * \sa SDL_utf8strlen + * \sa SDL_utf8strnlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); + +/** + * This works exactly like wcsnlen() but doesn't require access to a C + * runtime. + * + * Counts up to a maximum of `maxlen` wchar_t values in `wstr`, excluding the + * null terminator. + * + * Like SDL_strnlen only counts bytes and not codepoints in a UTF-8 string, + * this counts wchar_t values in a string, even if the string's encoding is of + * variable width, like UTF-16. + * + * Also be aware that wchar_t is different sizes on different platforms (4 + * bytes on Linux, 2 on Windows, etc). + * + * Also, `maxlen` is a count of wide characters, not bytes! + * + * \param wstr The null-terminated wide string to read. Must not be NULL. + * \param maxlen The maximum amount of wide characters to count. + * \returns the length (in wide characters, excluding the null terminator) of + * `wstr` but never more than `maxlen`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_wcslen + * \sa SDL_utf8strlen + * \sa SDL_utf8strnlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_wcsnlen(const wchar_t *wstr, size_t maxlen); + +/** + * Copy a wide string. + * + * This function copies `maxlen` - 1 wide characters from `src` to `dst`, then + * appends a null terminator. + * + * `src` and `dst` must not overlap. + * + * If `maxlen` is 0, no wide characters are copied and no null terminator is + * written. + * + * \param dst The destination buffer. Must not be NULL, and must not overlap + * with `src`. + * \param src The null-terminated wide string to copy. Must not be NULL, and + * must not overlap with `dst`. + * \param maxlen The length (in wide characters) of the destination buffer. + * \returns the length (in wide characters, excluding the null terminator) of + * `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_wcslcat + */ extern SDL_DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); + +/** + * Concatenate wide strings. + * + * This function appends up to `maxlen` - SDL_wcslen(dst) - 1 wide characters + * from `src` to the end of the wide string in `dst`, then appends a null + * terminator. + * + * `src` and `dst` must not overlap. + * + * If `maxlen` - SDL_wcslen(dst) - 1 is less than or equal to 0, then `dst` is + * unmodified. + * + * \param dst The destination buffer already containing the first + * null-terminated wide string. Must not be NULL and must not + * overlap with `src`. + * \param src The second null-terminated wide string. Must not be NULL, and + * must not overlap with `dst`. + * \param maxlen The length (in wide characters) of the destination buffer. + * \returns the length (in wide characters, excluding the null terminator) of + * the string in `dst` plus the length of `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_wcslcpy + */ extern SDL_DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); + +/** + * Allocate a copy of a wide string. + * + * This allocates enough space for a null-terminated copy of `wstr`, using + * SDL_malloc, and then makes a copy of the string into this space. + * + * The returned string is owned by the caller, and should be passed to + * SDL_free when no longer needed. + * + * \param wstr the string to copy. + * \returns a pointer to the newly-allocated wide string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsdup(const wchar_t *wstr); + +/** + * Search a wide string for the first instance of a specific substring. + * + * The search ends once it finds the requested substring, or a null terminator + * byte to end the string. + * + * Note that this looks for strings of _wide characters_, not _codepoints_, so + * it's legal to search for malformed and incomplete UTF-16 sequences. + * + * \param haystack the wide string to search. Must not be NULL. + * \param needle the wide string to search for. Must not be NULL. + * \returns a pointer to the first instance of `needle` in the string, or NULL + * if not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsstr(const wchar_t *haystack, const wchar_t *needle); + +/** + * Search a wide string, up to n wide chars, for the first instance of a + * specific substring. + * + * The search ends once it finds the requested substring, or a null terminator + * value to end the string, or `maxlen` wide character have been examined. It + * is possible to use this function on a wide string without a null + * terminator. + * + * Note that this looks for strings of _wide characters_, not _codepoints_, so + * it's legal to search for malformed and incomplete UTF-16 sequences. + * + * \param haystack the wide string to search. Must not be NULL. + * \param needle the wide string to search for. Must not be NULL. + * \param maxlen the maximum number of wide characters to search in + * `haystack`. + * \returns a pointer to the first instance of `needle` in the string, or NULL + * if not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsnstr(const wchar_t *haystack, const wchar_t *needle, size_t maxlen); /** @@ -989,7 +2841,7 @@ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsnstr(const wchar_t *haystack, const * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *str2); @@ -1020,7 +2872,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *s * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcsncmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen); @@ -1050,7 +2902,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_wcsncmp(const wchar_t *str1, const wchar_t * * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcscasecmp(const wchar_t *str1, const wchar_t *str2); @@ -1092,19 +2944,228 @@ extern SDL_DECLSPEC int SDLCALL SDL_wcscasecmp(const wchar_t *str1, const wchar_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcsncasecmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen); +/** + * Parse a `long` from a wide string. + * + * If `str` starts with whitespace, then those whitespace characters are + * skipped before attempting to parse the number. + * + * If the parsed number does not fit inside a `long`, the result is clamped to + * the minimum and maximum representable `long` values. + * + * \param str The null-terminated wide string to read. Must not be NULL. + * \param endp If not NULL, the address of the first invalid wide character + * (i.e. the next character after the parsed number) will be + * written to this pointer. + * \param base The base of the integer to read. Supported values are 0 and 2 + * to 36 inclusive. If 0, the base will be inferred from the + * number's prefix (0x for hexadecimal, 0 for octal, decimal + * otherwise). + * \returns the parsed `long`, or 0 if no number could be parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strtol + */ extern SDL_DECLSPEC long SDLCALL SDL_wcstol(const wchar_t *str, wchar_t **endp, int base); +/** + * This works exactly like strlen() but doesn't require access to a C runtime. + * + * Counts the bytes in `str`, excluding the null terminator. + * + * If you need the length of a UTF-8 string, consider using SDL_utf8strlen(). + * + * \param str The null-terminated string to read. Must not be NULL. + * \returns the length (in bytes, excluding the null terminator) of `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strnlen + * \sa SDL_utf8strlen + * \sa SDL_utf8strnlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_strlen(const char *str); + +/** + * This works exactly like strnlen() but doesn't require access to a C + * runtime. + * + * Counts up to a maximum of `maxlen` bytes in `str`, excluding the null + * terminator. + * + * If you need the length of a UTF-8 string, consider using SDL_utf8strnlen(). + * + * \param str The null-terminated string to read. Must not be NULL. + * \param maxlen The maximum amount of bytes to count. + * \returns the length (in bytes, excluding the null terminator) of `src` but + * never more than `maxlen`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strlen + * \sa SDL_utf8strlen + * \sa SDL_utf8strnlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_strnlen(const char *str, size_t maxlen); + +/** + * Copy a string. + * + * This function copies up to `maxlen` - 1 characters from `src` to `dst`, + * then appends a null terminator. + * + * If `maxlen` is 0, no characters are copied and no null terminator is + * written. + * + * If you want to copy an UTF-8 string but need to ensure that multi-byte + * sequences are not truncated, consider using SDL_utf8strlcpy(). + * + * \param dst The destination buffer. Must not be NULL, and must not overlap + * with `src`. + * \param src The null-terminated string to copy. Must not be NULL, and must + * not overlap with `dst`. + * \param maxlen The length (in characters) of the destination buffer. + * \returns the length (in characters, excluding the null terminator) of + * `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strlcat + * \sa SDL_utf8strlcpy + */ extern SDL_DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); + +/** + * Copy an UTF-8 string. + * + * This function copies up to `dst_bytes` - 1 bytes from `src` to `dst` while + * also ensuring that the string written to `dst` does not end in a truncated + * multi-byte sequence. Finally, it appends a null terminator. + * + * `src` and `dst` must not overlap. + * + * Note that unlike SDL_strlcpy(), this function returns the number of bytes + * written, not the length of `src`. + * + * \param dst The destination buffer. Must not be NULL, and must not overlap + * with `src`. + * \param src The null-terminated UTF-8 string to copy. Must not be NULL, and + * must not overlap with `dst`. + * \param dst_bytes The length (in bytes) of the destination buffer. Must not + * be 0. + * \returns the number of bytes written, excluding the null terminator. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strlcpy + */ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes); + +/** + * Concatenate strings. + * + * This function appends up to `maxlen` - SDL_strlen(dst) - 1 characters from + * `src` to the end of the string in `dst`, then appends a null terminator. + * + * `src` and `dst` must not overlap. + * + * If `maxlen` - SDL_strlen(dst) - 1 is less than or equal to 0, then `dst` is + * unmodified. + * + * \param dst The destination buffer already containing the first + * null-terminated string. Must not be NULL and must not overlap + * with `src`. + * \param src The second null-terminated string. Must not be NULL, and must + * not overlap with `dst`. + * \param maxlen The length (in characters) of the destination buffer. + * \returns the length (in characters, excluding the null terminator) of the + * string in `dst` plus the length of `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strlcpy + */ extern SDL_DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); + +/** + * Allocate a copy of a string. + * + * This allocates enough space for a null-terminated copy of `str`, using + * SDL_malloc, and then makes a copy of the string into this space. + * + * The returned string is owned by the caller, and should be passed to + * SDL_free when no longer needed. + * + * \param str the string to copy. + * \returns a pointer to the newly-allocated string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC SDL_MALLOC char * SDLCALL SDL_strdup(const char *str); + +/** + * Allocate a copy of a string, up to n characters. + * + * This allocates enough space for a null-terminated copy of `str`, up to + * `maxlen` bytes, using SDL_malloc, and then makes a copy of the string into + * this space. + * + * If the string is longer than `maxlen` bytes, the returned string will be + * `maxlen` bytes long, plus a null-terminator character that isn't included + * in the count. + * + * The returned string is owned by the caller, and should be passed to + * SDL_free when no longer needed. + * + * \param str the string to copy. + * \param maxlen the maximum length of the copied string, not counting the + * null-terminator character. + * \returns a pointer to the newly-allocated string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC SDL_MALLOC char * SDLCALL SDL_strndup(const char *str, size_t maxlen); + +/** + * Reverse a string's contents. + * + * This reverses a null-terminated string in-place. Only the content of the + * string is reversed; the null-terminator character remains at the end of the + * reversed string. + * + * **WARNING**: This function reverses the _bytes_ of the string, not the + * codepoints. If `str` is a UTF-8 string with Unicode codepoints > 127, this + * will ruin the string data. You should only use this function on strings + * that are completely comprised of low ASCII characters. + * + * \param str the string to reverse. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strrev(char *str); /** @@ -1122,7 +3183,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strrev(char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strlwr */ @@ -1143,34 +3204,592 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strupr(char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strupr */ extern SDL_DECLSPEC char * SDLCALL SDL_strlwr(char *str); +/** + * Search a string for the first instance of a specific byte. + * + * The search ends once it finds the requested byte value, or a null + * terminator byte to end the string. + * + * Note that this looks for _bytes_, not _characters_, so you cannot match + * against a Unicode codepoint > 255, regardless of character encoding. + * + * \param str the string to search. Must not be NULL. + * \param c the byte value to search for. + * \returns a pointer to the first instance of `c` in the string, or NULL if + * not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strchr(const char *str, int c); + +/** + * Search a string for the last instance of a specific byte. + * + * The search must go until it finds a null terminator byte to end the string. + * + * Note that this looks for _bytes_, not _characters_, so you cannot match + * against a Unicode codepoint > 255, regardless of character encoding. + * + * \param str the string to search. Must not be NULL. + * \param c the byte value to search for. + * \returns a pointer to the last instance of `c` in the string, or NULL if + * not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strrchr(const char *str, int c); + +/** + * Search a string for the first instance of a specific substring. + * + * The search ends once it finds the requested substring, or a null terminator + * byte to end the string. + * + * Note that this looks for strings of _bytes_, not _characters_, so it's + * legal to search for malformed and incomplete UTF-8 sequences. + * + * \param haystack the string to search. Must not be NULL. + * \param needle the string to search for. Must not be NULL. + * \returns a pointer to the first instance of `needle` in the string, or NULL + * if not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char *needle); + +/** + * Search a string, up to n bytes, for the first instance of a specific + * substring. + * + * The search ends once it finds the requested substring, or a null terminator + * byte to end the string, or `maxlen` bytes have been examined. It is + * possible to use this function on a string without a null terminator. + * + * Note that this looks for strings of _bytes_, not _characters_, so it's + * legal to search for malformed and incomplete UTF-8 sequences. + * + * \param haystack the string to search. Must not be NULL. + * \param needle the string to search for. Must not be NULL. + * \param maxlen the maximum number of bytes to search in `haystack`. + * \returns a pointer to the first instance of `needle` in the string, or NULL + * if not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strnstr(const char *haystack, const char *needle, size_t maxlen); + +/** + * Search a UTF-8 string for the first instance of a specific substring, + * case-insensitively. + * + * This will work with Unicode strings, using a technique called + * "case-folding" to handle the vast majority of case-sensitive human + * languages regardless of system locale. It can deal with expanding values: a + * German Eszett character can compare against two ASCII 's' chars and be + * considered a match, for example. A notable exception: it does not handle + * the Turkish 'i' character; human language is complicated! + * + * Since this handles Unicode, it expects the strings to be well-formed UTF-8 + * and not a null-terminated string of arbitrary bytes. Bytes that are not + * valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT + * CHARACTER), which is to say two strings of random bits may turn out to + * match if they convert to the same amount of replacement characters. + * + * \param haystack the string to search. Must not be NULL. + * \param needle the string to search for. Must not be NULL. + * \returns a pointer to the first instance of `needle` in the string, or NULL + * if not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strcasestr(const char *haystack, const char *needle); -extern SDL_DECLSPEC char * SDLCALL SDL_strtok_r(char *s1, const char *s2, char **saveptr); + +/** + * This works exactly like strtok_r() but doesn't require access to a C + * runtime. + * + * Break a string up into a series of tokens. + * + * To start tokenizing a new string, `str` should be the non-NULL address of + * the string to start tokenizing. Future calls to get the next token from the + * same string should specify a NULL. + * + * Note that this function will overwrite pieces of `str` with null chars to + * split it into tokens. This function cannot be used with const/read-only + * strings! + * + * `saveptr` just needs to point to a `char *` that can be overwritten; SDL + * will use this to save tokenizing state between calls. It is initialized if + * `str` is non-NULL, and used to resume tokenizing when `str` is NULL. + * + * \param str the string to tokenize, or NULL to continue tokenizing. + * \param delim the delimiter string that separates tokens. + * \param saveptr pointer to a char *, used for ongoing state. + * \returns A pointer to the next token, or NULL if no tokens remain. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC char * SDLCALL SDL_strtok_r(char *str, const char *delim, char **saveptr); + +/** + * Count the number of codepoints in a UTF-8 string. + * + * Counts the _codepoints_, not _bytes_, in `str`, excluding the null + * terminator. + * + * If you need to count the bytes in a string instead, consider using + * SDL_strlen(). + * + * Since this handles Unicode, it expects the strings to be well-formed UTF-8 + * and not a null-terminated string of arbitrary bytes. Bytes that are not + * valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT + * CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the + * count by several replacement characters. + * + * \param str The null-terminated UTF-8 string to read. Must not be NULL. + * \returns The length (in codepoints, excluding the null terminator) of + * `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_utf8strnlen + * \sa SDL_strlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strlen(const char *str); + +/** + * Count the number of codepoints in a UTF-8 string, up to n bytes. + * + * Counts the _codepoints_, not _bytes_, in `str`, excluding the null + * terminator. + * + * If you need to count the bytes in a string instead, consider using + * SDL_strnlen(). + * + * The counting stops at `bytes` bytes (not codepoints!). This seems + * counterintuitive, but makes it easy to express the total size of the + * string's buffer. + * + * Since this handles Unicode, it expects the strings to be well-formed UTF-8 + * and not a null-terminated string of arbitrary bytes. Bytes that are not + * valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT + * CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the + * count by several replacement characters. + * + * \param str The null-terminated UTF-8 string to read. Must not be NULL. + * \param bytes The maximum amount of bytes to count. + * \returns The length (in codepoints, excluding the null terminator) of `src` + * but never more than `maxlen`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_utf8strlen + * \sa SDL_strnlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strnlen(const char *str, size_t bytes); +/** + * Convert an integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget possible negative + * signs, null terminator bytes, etc). + * + * \param value the integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_uitoa + * \sa SDL_ltoa + * \sa SDL_lltoa + */ extern SDL_DECLSPEC char * SDLCALL SDL_itoa(int value, char *str, int radix); -extern SDL_DECLSPEC char * SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); -extern SDL_DECLSPEC char * SDLCALL SDL_ltoa(long value, char *str, int radix); -extern SDL_DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); -extern SDL_DECLSPEC char * SDLCALL SDL_lltoa(Sint64 value, char *str, int radix); -extern SDL_DECLSPEC char * SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix); +/** + * Convert an unsigned integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget null terminator + * bytes, etc). + * + * \param value the unsigned integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_itoa + * \sa SDL_ultoa + * \sa SDL_ulltoa + */ +extern SDL_DECLSPEC char * SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); + +/** + * Convert a long integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget possible negative + * signs, null terminator bytes, etc). + * + * \param value the long integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ultoa + * \sa SDL_itoa + * \sa SDL_lltoa + */ +extern SDL_DECLSPEC char * SDLCALL SDL_ltoa(long value, char *str, int radix); + +/** + * Convert an unsigned long integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget null terminator + * bytes, etc). + * + * \param value the unsigned long integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ltoa + * \sa SDL_uitoa + * \sa SDL_ulltoa + */ +extern SDL_DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); + +#ifndef SDL_NOLONGLONG + +/** + * Convert a long long integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget possible negative + * signs, null terminator bytes, etc). + * + * \param value the long long integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ulltoa + * \sa SDL_itoa + * \sa SDL_ltoa + */ +extern SDL_DECLSPEC char * SDLCALL SDL_lltoa(long long value, char *str, int radix); + +/** + * Convert an unsigned long long integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget null terminator + * bytes, etc). + * + * \param value the unsigned long long integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_lltoa + * \sa SDL_uitoa + * \sa SDL_ultoa + */ +extern SDL_DECLSPEC char * SDLCALL SDL_ulltoa(unsigned long long value, char *str, int radix); +#endif + +/** + * Parse an `int` from a string. + * + * The result of calling `SDL_atoi(str)` is equivalent to + * `(int)SDL_strtol(str, NULL, 10)`. + * + * \param str The null-terminated string to read. Must not be NULL. + * \returns the parsed `int`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atof + * \sa SDL_strtol + * \sa SDL_strtoul + * \sa SDL_strtoll + * \sa SDL_strtoull + * \sa SDL_strtod + * \sa SDL_itoa + */ extern SDL_DECLSPEC int SDLCALL SDL_atoi(const char *str); + +/** + * Parse a `double` from a string. + * + * The result of calling `SDL_atof(str)` is equivalent to `SDL_strtod(str, + * NULL)`. + * + * \param str The null-terminated string to read. Must not be NULL. + * \returns the parsed `double`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_strtol + * \sa SDL_strtoul + * \sa SDL_strtoll + * \sa SDL_strtoull + * \sa SDL_strtod + */ extern SDL_DECLSPEC double SDLCALL SDL_atof(const char *str); + +/** + * Parse a `long` from a string. + * + * If `str` starts with whitespace, then those whitespace characters are + * skipped before attempting to parse the number. + * + * If the parsed number does not fit inside a `long`, the result is clamped to + * the minimum and maximum representable `long` values. + * + * \param str The null-terminated string to read. Must not be NULL. + * \param endp If not NULL, the address of the first invalid character (i.e. + * the next character after the parsed number) will be written to + * this pointer. + * \param base The base of the integer to read. Supported values are 0 and 2 + * to 36 inclusive. If 0, the base will be inferred from the + * number's prefix (0x for hexadecimal, 0 for octal, decimal + * otherwise). + * \returns the parsed `long`, or 0 if no number could be parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_atof + * \sa SDL_strtoul + * \sa SDL_strtoll + * \sa SDL_strtoull + * \sa SDL_strtod + * \sa SDL_ltoa + * \sa SDL_wcstol + */ extern SDL_DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base); + +/** + * Parse an `unsigned long` from a string. + * + * If `str` starts with whitespace, then those whitespace characters are + * skipped before attempting to parse the number. + * + * If the parsed number does not fit inside an `unsigned long`, the result is + * clamped to the maximum representable `unsigned long` value. + * + * \param str The null-terminated string to read. Must not be NULL. + * \param endp If not NULL, the address of the first invalid character (i.e. + * the next character after the parsed number) will be written to + * this pointer. + * \param base The base of the integer to read. Supported values are 0 and 2 + * to 36 inclusive. If 0, the base will be inferred from the + * number's prefix (0x for hexadecimal, 0 for octal, decimal + * otherwise). + * \returns the parsed `unsigned long`, or 0 if no number could be parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_atof + * \sa SDL_strtol + * \sa SDL_strtoll + * \sa SDL_strtoull + * \sa SDL_strtod + * \sa SDL_ultoa + */ extern SDL_DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base); -extern SDL_DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base); -extern SDL_DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base); + +#ifndef SDL_NOLONGLONG + +/** + * Parse a `long long` from a string. + * + * If `str` starts with whitespace, then those whitespace characters are + * skipped before attempting to parse the number. + * + * If the parsed number does not fit inside a `long long`, the result is + * clamped to the minimum and maximum representable `long long` values. + * + * \param str The null-terminated string to read. Must not be NULL. + * \param endp If not NULL, the address of the first invalid character (i.e. + * the next character after the parsed number) will be written to + * this pointer. + * \param base The base of the integer to read. Supported values are 0 and 2 + * to 36 inclusive. If 0, the base will be inferred from the + * number's prefix (0x for hexadecimal, 0 for octal, decimal + * otherwise). + * \returns the parsed `long long`, or 0 if no number could be parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_atof + * \sa SDL_strtol + * \sa SDL_strtoul + * \sa SDL_strtoull + * \sa SDL_strtod + * \sa SDL_lltoa + */ +extern SDL_DECLSPEC long long SDLCALL SDL_strtoll(const char *str, char **endp, int base); + +/** + * Parse an `unsigned long long` from a string. + * + * If `str` starts with whitespace, then those whitespace characters are + * skipped before attempting to parse the number. + * + * If the parsed number does not fit inside an `unsigned long long`, the + * result is clamped to the maximum representable `unsigned long long` value. + * + * \param str The null-terminated string to read. Must not be NULL. + * \param endp If not NULL, the address of the first invalid character (i.e. + * the next character after the parsed number) will be written to + * this pointer. + * \param base The base of the integer to read. Supported values are 0 and 2 + * to 36 inclusive. If 0, the base will be inferred from the + * number's prefix (0x for hexadecimal, 0 for octal, decimal + * otherwise). + * \returns the parsed `unsigned long long`, or 0 if no number could be + * parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_atof + * \sa SDL_strtol + * \sa SDL_strtoll + * \sa SDL_strtoul + * \sa SDL_strtod + * \sa SDL_ulltoa + */ +extern SDL_DECLSPEC unsigned long long SDLCALL SDL_strtoull(const char *str, char **endp, int base); +#endif + +/** + * Parse a `double` from a string. + * + * This function makes fewer guarantees than the C runtime `strtod`: + * + * - Only decimal notation is guaranteed to be supported. The handling of + * scientific and hexadecimal notation is unspecified. + * - Whether or not INF and NAN can be parsed is unspecified. + * - The precision of the result is unspecified. + * + * \param str the null-terminated string to read. Must not be NULL. + * \param endp if not NULL, the address of the first invalid character (i.e. + * the next character after the parsed number) will be written to + * this pointer. + * \returns the parsed `double`, or 0 if no number could be parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_atof + * \sa SDL_strtol + * \sa SDL_strtoll + * \sa SDL_strtoul + * \sa SDL_strtoull + */ extern SDL_DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); /** @@ -1189,7 +3808,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); @@ -1219,7 +3838,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); @@ -1247,7 +3866,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); @@ -1287,20 +3906,39 @@ extern SDL_DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); +/** + * Searches a string for the first occurence of any character contained in a + * breakset, and returns a pointer from the string to that character. + * + * \param str The null-terminated string to be searched. Must not be NULL, and + * must not overlap with `breakset`. + * \param breakset A null-terminated string containing the list of characters + * to look for. Must not be NULL, and must not overlap with + * `str`. + * \returns A pointer to the location, in str, of the first occurence of a + * character present in the breakset, or NULL if none is found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC char * SDLCALL SDL_strpbrk(const char *str, const char *breakset); + /** * The Unicode REPLACEMENT CHARACTER codepoint. * - * SDL_StepUTF8() reports this codepoint when it encounters a UTF-8 string - * with encoding errors. + * SDL_StepUTF8() and SDL_StepBackUTF8() report this codepoint when they + * encounter a UTF-8 string with encoding errors. * * This tends to render as something like a question mark in most places. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * + * \sa SDL_StepBackUTF8 * \sa SDL_StepUTF8 */ #define SDL_INVALID_UNICODE_CODEPOINT 0xFFFD @@ -1346,10 +3984,41 @@ extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *st * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_StepUTF8(const char **pstr, size_t *pslen); +/** + * Decode a UTF-8 string in reverse, one Unicode codepoint at a time. + * + * This will go to the start of the previous Unicode codepoint in the string, + * move `*pstr` to that location and return that codepoint. + * + * If `*pstr` is already at the start of the string), it will not advance + * `*pstr` at all. + * + * Generally this function is called in a loop until it returns zero, + * adjusting its parameter each iteration. + * + * If an invalid UTF-8 sequence is encountered, this function returns + * SDL_INVALID_UNICODE_CODEPOINT. + * + * Several things can generate invalid UTF-8 sequences, including overlong + * encodings, the use of UTF-16 surrogate values, and truncated data. Please + * refer to + * [RFC3629](https://www.ietf.org/rfc/rfc3629.txt) + * for details. + * + * \param start a pointer to the beginning of the UTF-8 string. + * \param pstr a pointer to a UTF-8 string pointer to be read and adjusted. + * \returns the previous Unicode codepoint in the string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_StepBackUTF8(const char *start, const char **pstr); + /** * Convert a single Unicode codepoint to UTF-8. * @@ -1375,18 +4044,200 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_StepUTF8(const char **pstr, size_t *pslen * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_UCS4ToUTF8(Uint32 codepoint, char *dst); - +/** + * This works exactly like sscanf() but doesn't require access to a C runtime. + * + * Scan a string, matching a format string, converting each '%' item and + * storing it to pointers provided through variable arguments. + * + * \param text the string to scan. Must not be NULL. + * \param fmt a printf-style format string. Must not be NULL. + * \param ... a list of pointers to values to be filled in with scanned items. + * \returns the number of items that matched the format string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2); + +/** + * This works exactly like vsscanf() but doesn't require access to a C + * runtime. + * + * Functions identically to SDL_sscanf(), except it takes a `va_list` instead + * of using `...` variable arguments. + * + * \param text the string to scan. Must not be NULL. + * \param fmt a printf-style format string. Must not be NULL. + * \param ap a `va_list` of pointers to values to be filled in with scanned + * items. + * \returns the number of items that matched the format string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_vsscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, va_list ap) SDL_SCANF_VARARG_FUNCV(2); -extern SDL_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 SDL_DECLSPEC int SDLCALL SDL_swprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const wchar_t *fmt, ... ) SDL_WPRINTF_VARARG_FUNC(3); + +/** + * This works exactly like snprintf() but doesn't require access to a C + * runtime. + * + * Format a string of up to `maxlen`-1 bytes, converting each '%' item with + * values provided through variable arguments. + * + * While some C runtimes differ on how to deal with too-large strings, this + * function null-terminates the output, by treating the null-terminator as + * part of the `maxlen` count. Note that if `maxlen` is zero, however, no + * bytes will be written at all. + * + * This function returns the number of _bytes_ (not _characters_) that should + * be written, excluding the null-terminator character. If this returns a + * number >= `maxlen`, it means the output string was truncated. A negative + * return value means an error occurred. + * + * Referencing the output string's pointer with a format item is undefined + * behavior. + * + * \param text the buffer to write the string into. Must not be NULL. + * \param maxlen the maximum bytes to write, including the null-terminator. + * \param fmt a printf-style format string. Must not be NULL. + * \param ... a list of values to be used with the format string. + * \returns the number of bytes that should be written, not counting the + * null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_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); + +/** + * This works exactly like swprintf() but doesn't require access to a C + * runtime. + * + * Format a wide string of up to `maxlen`-1 wchar_t values, converting each + * '%' item with values provided through variable arguments. + * + * While some C runtimes differ on how to deal with too-large strings, this + * function null-terminates the output, by treating the null-terminator as + * part of the `maxlen` count. Note that if `maxlen` is zero, however, no wide + * characters will be written at all. + * + * This function returns the number of _wide characters_ (not _codepoints_) + * that should be written, excluding the null-terminator character. If this + * returns a number >= `maxlen`, it means the output string was truncated. A + * negative return value means an error occurred. + * + * Referencing the output string's pointer with a format item is undefined + * behavior. + * + * \param text the buffer to write the wide string into. Must not be NULL. + * \param maxlen the maximum wchar_t values to write, including the + * null-terminator. + * \param fmt a printf-style format string. Must not be NULL. + * \param ... a list of values to be used with the format string. + * \returns the number of wide characters that should be written, not counting + * the null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC int SDLCALL SDL_swprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const wchar_t *fmt, ...) SDL_WPRINTF_VARARG_FUNC(3); + +/** + * This works exactly like vsnprintf() but doesn't require access to a C + * runtime. + * + * Functions identically to SDL_snprintf(), except it takes a `va_list` + * instead of using `...` variable arguments. + * + * \param text the buffer to write the string into. Must not be NULL. + * \param maxlen the maximum bytes to write, including the null-terminator. + * \param fmt a printf-style format string. Must not be NULL. + * \param ap a `va_list` values to be used with the format string. + * \returns the number of bytes that should be written, not counting the + * null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(3); -extern SDL_DECLSPEC int SDLCALL SDL_vswprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, const wchar_t *fmt, va_list ap); + +/** + * This works exactly like vswprintf() but doesn't require access to a C + * runtime. + * + * Functions identically to SDL_swprintf(), except it takes a `va_list` + * instead of using `...` variable arguments. + * + * \param text the buffer to write the string into. Must not be NULL. + * \param maxlen the maximum wide characters to write, including the + * null-terminator. + * \param fmt a printf-style format wide string. Must not be NULL. + * \param ap a `va_list` values to be used with the format string. + * \returns the number of wide characters that should be written, not counting + * the null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC int SDLCALL SDL_vswprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const wchar_t *fmt, va_list ap) SDL_WPRINTF_VARARG_FUNCV(3); + +/** + * This works exactly like asprintf() but doesn't require access to a C + * runtime. + * + * Functions identically to SDL_snprintf(), except it allocates a buffer large + * enough to hold the output string on behalf of the caller. + * + * On success, this function returns the number of bytes (not characters) + * comprising the output string, not counting the null-terminator character, + * and sets `*strp` to the newly-allocated string. + * + * On error, this function returns a negative number, and the value of `*strp` + * is undefined. + * + * The returned string is owned by the caller, and should be passed to + * SDL_free when no longer needed. + * + * \param strp on output, is set to the new string. Must not be NULL. + * \param fmt a printf-style format string. Must not be NULL. + * \param ... a list of values to be used with the format string. + * \returns the number of bytes in the newly-allocated string, not counting + * the null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_asprintf(char **strp, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * This works exactly like vasprintf() but doesn't require access to a C + * runtime. + * + * Functions identically to SDL_asprintf(), except it takes a `va_list` + * instead of using `...` variable arguments. + * + * \param strp on output, is set to the new string. Must not be NULL. + * \param fmt a printf-style format string. Must not be NULL. + * \param ap a `va_list` values to be used with the format string. + * \returns the number of bytes in the newly-allocated string, not counting + * the null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_vasprintf(char **strp, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2); /** @@ -1401,7 +4252,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_vasprintf(char **strp, SDL_PRINTF_FORMAT_STR * \threadsafety This should be called on the same thread that calls * SDL_rand*() * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand * \sa SDL_rand_bits @@ -1436,7 +4287,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_srand(Uint64 seed); * * \threadsafety All calls should be made from a single thread * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_srand * \sa SDL_randf @@ -1459,7 +4310,7 @@ extern SDL_DECLSPEC Sint32 SDLCALL SDL_rand(Sint32 n); * * \threadsafety All calls should be made from a single thread * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_srand * \sa SDL_rand @@ -1481,7 +4332,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_randf(void); * * \threadsafety All calls should be made from a single thread * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand * \sa SDL_randf @@ -1516,7 +4367,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_rand_bits(void); * \threadsafety This function is thread-safe, as long as the state pointer * isn't shared between threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand * \sa SDL_rand_bits_r @@ -1543,7 +4394,7 @@ extern SDL_DECLSPEC Sint32 SDLCALL SDL_rand_r(Uint64 *state, Sint32 n); * \threadsafety This function is thread-safe, as long as the state pointer * isn't shared between threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand_bits_r * \sa SDL_rand_r @@ -1569,18 +4420,34 @@ extern SDL_DECLSPEC float SDLCALL SDL_randf_r(Uint64 *state); * \threadsafety This function is thread-safe, as long as the state pointer * isn't shared between threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand_r * \sa SDL_randf_r */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_rand_bits_r(Uint64 *state); - #ifndef SDL_PI_D + +/** + * The value of Pi, as a double-precision floating point literal. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PI_F + */ #define SDL_PI_D 3.141592653589793238462643383279502884 /**< pi (double) */ #endif + #ifndef SDL_PI_F + +/** + * The value of Pi, as a single-precision floating point literal. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PI_D + */ #define SDL_PI_F 3.141592653589793238462643383279502884F /**< pi (float) */ #endif @@ -1606,7 +4473,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_rand_bits_r(Uint64 *state); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_acosf * \sa SDL_asin @@ -1636,7 +4503,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_acos(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_acos * \sa SDL_asinf @@ -1666,7 +4533,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_acosf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_asinf * \sa SDL_acos @@ -1696,7 +4563,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_asin(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_asin * \sa SDL_acosf @@ -1728,7 +4595,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_asinf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atanf * \sa SDL_atan2 @@ -1760,7 +4627,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_atan(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atan * \sa SDL_atan2f @@ -1796,7 +4663,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_atanf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atan2f * \sa SDL_atan @@ -1832,7 +4699,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_atan2(double y, double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atan2f * \sa SDL_atan @@ -1858,7 +4725,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_atan2f(float y, float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ceilf * \sa SDL_floor @@ -1886,7 +4753,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_ceil(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ceil * \sa SDL_floorf @@ -1915,7 +4782,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_ceilf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_copysignf * \sa SDL_fabs @@ -1941,7 +4808,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_copysign(double x, double y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_copysignf * \sa SDL_fabsf @@ -1968,7 +4835,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_copysignf(float x, float y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_cosf * \sa SDL_acos @@ -1996,7 +4863,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_cos(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_cos * \sa SDL_acosf @@ -2029,7 +4896,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_cosf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_expf * \sa SDL_log @@ -2061,7 +4928,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_exp(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_exp * \sa SDL_logf @@ -2083,7 +4950,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_expf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fabsf */ @@ -2104,7 +4971,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_fabs(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fabs */ @@ -2128,7 +4995,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_fabsf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_floorf * \sa SDL_ceil @@ -2156,7 +5023,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_floor(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_floor * \sa SDL_ceilf @@ -2184,7 +5051,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_floorf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_truncf * \sa SDL_fmod @@ -2213,7 +5080,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_trunc(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_trunc * \sa SDL_fmodf @@ -2242,7 +5109,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_truncf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fmodf * \sa SDL_modf @@ -2272,7 +5139,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_fmod(double x, double y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fmod * \sa SDL_truncf @@ -2292,7 +5159,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_fmodf(float x, float y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isinff */ @@ -2306,7 +5173,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isinf(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isinf */ @@ -2320,7 +5187,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isinff(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isnanf */ @@ -2334,7 +5201,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isnan(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isnan */ @@ -2362,7 +5229,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isnanf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_logf * \sa SDL_log10 @@ -2392,7 +5259,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_log(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_log * \sa SDL_expf @@ -2421,7 +5288,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_logf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_log10f * \sa SDL_log @@ -2451,7 +5318,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_log10(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_log10 * \sa SDL_logf @@ -2471,7 +5338,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_log10f(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_modff * \sa SDL_trunc @@ -2491,7 +5358,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_modf(double x, double *y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_modf * \sa SDL_truncf @@ -2523,7 +5390,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_modff(float x, float *y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_powf * \sa SDL_exp @@ -2555,7 +5422,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_pow(double x, double y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_pow * \sa SDL_expf @@ -2582,7 +5449,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_powf(float x, float y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_roundf * \sa SDL_lround @@ -2611,7 +5478,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_round(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_round * \sa SDL_lroundf @@ -2640,7 +5507,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_roundf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_lroundf * \sa SDL_round @@ -2669,7 +5536,7 @@ extern SDL_DECLSPEC long SDLCALL SDL_lround(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_lround * \sa SDL_roundf @@ -2697,7 +5564,7 @@ extern SDL_DECLSPEC long SDLCALL SDL_lroundf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_scalbnf * \sa SDL_pow @@ -2722,7 +5589,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_scalbn(double x, int n); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_scalbn * \sa SDL_powf @@ -2749,7 +5616,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_scalbnf(float x, int n); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sinf * \sa SDL_asin @@ -2765,7 +5632,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_sin(double x); * Range: `-1 <= y <= 1` * * This function operates on single-precision floating point values, use - * SDL_sinf for double-precision floats. + * SDL_sin for double-precision floats. * * This function may use a different approximation across different versions, * platforms and configurations. i.e, it can return a different value given @@ -2777,7 +5644,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_sin(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sin * \sa SDL_asinf @@ -2805,7 +5672,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_sinf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sqrtf */ @@ -2831,7 +5698,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_sqrt(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sqrt */ @@ -2857,7 +5724,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_sqrtf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_tanf * \sa SDL_sin @@ -2887,7 +5754,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_tan(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_tan * \sa SDL_sinf @@ -2897,12 +5764,13 @@ extern SDL_DECLSPEC double SDLCALL SDL_tan(double x); */ extern SDL_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 - +/** + * An opaque handle representing string encoding conversion state. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_iconv_open + */ typedef struct SDL_iconv_data_t *SDL_iconv_t; /** @@ -2914,7 +5782,7 @@ typedef struct SDL_iconv_data_t *SDL_iconv_t; * \returns a handle that must be freed with SDL_iconv_close, or * SDL_ICONV_ERROR on failure. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv * \sa SDL_iconv_close @@ -2929,7 +5797,7 @@ extern SDL_DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, * \param cd The character set conversion handle. * \returns 0 on success, or -1 on failure. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv * \sa SDL_iconv_open @@ -2941,7 +5809,22 @@ extern SDL_DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); * This function converts text between encodings, reading from and writing to * a buffer. * - * It returns the number of succesful conversions. + * It returns the number of succesful conversions on success. On error, + * SDL_ICONV_E2BIG is returned when the output buffer is too small, or + * SDL_ICONV_EILSEQ is returned when an invalid input sequence is encountered, + * or SDL_ICONV_EINVAL is returned when an incomplete input sequence is + * encountered. + * + * On exit: + * + * - inbuf will point to the beginning of the next multibyte sequence. On + * error, this is the location of the problematic input sequence. On + * success, this is the end of the input sequence. + * - inbytesleft will be set to the number of bytes left to convert, which + * will be 0 on success. + * - outbuf will point to the location where to store the next output byte. + * - outbytesleft will be set to the number of bytes left in the output + * buffer. * * \param cd The character set conversion context, created in * SDL_iconv_open(). @@ -2950,23 +5833,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); * \param inbytesleft The number of bytes in the input buffer. * \param outbuf Address of variable that points to the output buffer. * \param outbytesleft The number of bytes in the output buffer. - * \returns the number of conversions on success, else SDL_ICONV_E2BIG is - * returned when the output buffer is too small, or SDL_ICONV_EILSEQ - * is returned when an invalid input sequence is encountered, or - * SDL_ICONV_EINVAL is returned when an incomplete input sequence is - * encountered. + * \returns the number of conversions on success, or a negative error code. * - * On exit: - * - * - inbuf will point to the beginning of the next multibyte - * sequence. On error, this is the location of the problematic - * input sequence. On success, this is the end of the input - * sequence. - inbytesleft will be set to the number of bytes left - * to convert, which will be 0 on success. - outbuf will point to - * the location where to store the next output byte. - outbytesleft - * will be set to the number of bytes left in the output buffer. - * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv_open * \sa SDL_iconv_close @@ -2976,6 +5845,12 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); +#define SDL_ICONV_ERROR (size_t)-1 /**< Generic error. Check SDL_GetError()? */ +#define SDL_ICONV_E2BIG (size_t)-2 /**< Output buffer was too small. */ +#define SDL_ICONV_EILSEQ (size_t)-3 /**< Invalid input sequence was encountered. */ +#define SDL_ICONV_EINVAL (size_t)-4 /**< Incomplete input sequence was encountered. */ + + /** * Helper function to convert a string's encoding in one call. * @@ -2995,7 +5870,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, * \param inbytesleft the size of the input string _in bytes_. * \returns a new string, converted to the new encoding, or NULL on error. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv_open * \sa SDL_iconv_close @@ -3006,12 +5881,65 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *inbuf, size_t inbytesleft); -/* Some helper macros for common cases... */ +/* Some helper macros for common SDL_iconv_string cases... */ + +/** + * Convert a UTF-8 string to the current locale's character encoding. + * + * This is a helper macro that might be more clear than calling + * SDL_iconv_string directly. However, it double-evaluates its parameter, so + * do not use an expression with side-effects here. + * + * \param S the string to convert. + * \returns a new string, converted to the new encoding, or NULL on error. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) + +/** + * Convert a UTF-8 string to UCS-2. + * + * This is a helper macro that might be more clear than calling + * SDL_iconv_string directly. However, it double-evaluates its parameter, so + * do not use an expression with side-effects here. + * + * \param S the string to convert. + * \returns a new string, converted to the new encoding, or NULL on error. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) + +/** + * Convert a UTF-8 string to UCS-4. + * + * This is a helper macro that might be more clear than calling + * SDL_iconv_string directly. However, it double-evaluates its parameter, so + * do not use an expression with side-effects here. + * + * \param S the string to convert. + * \returns a new string, converted to the new encoding, or NULL on error. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) + +/** + * Convert a wchar_t string to UTF-8. + * + * This is a helper macro that might be more clear than calling + * SDL_iconv_string directly. However, it double-evaluates its parameter, so + * do not use an expression with side-effects here. + * + * \param S the string to convert. + * \returns a new string, converted to the new encoding, or NULL on error. + * + * \since This macro is available since SDL 3.2.0. + */ #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) @@ -3034,6 +5962,9 @@ size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t size); size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size); #endif +/* strdup is not ANSI but POSIX, and its prototype might be hidden... */ +char *strdup(const char *str); + /* Starting LLVM 16, the analyser errors out if these functions do not have their prototype defined (clang-diagnostic-implicit-function-declaration) */ #include @@ -3073,6 +6004,7 @@ size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size); #define SDL_wcsncmp wcsncmp #define SDL_strcasecmp strcasecmp #define SDL_strncasecmp strncasecmp +#define SDL_strpbrk strpbrk #define SDL_sscanf sscanf #define SDL_vsscanf vsscanf #define SDL_snprintf snprintf @@ -3082,29 +6014,27 @@ size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size); /** * Multiply two integers, checking for overflow. * - * If `a * b` would overflow, return -1. + * If `a * b` would overflow, return false. * - * Otherwise store `a * b` via ret and return 0. + * Otherwise store `a * b` via ret and return true. * * \param a the multiplicand. * \param b the multiplier. - * \param ret on non-overflow output, stores the multiplication result. May + * \param ret on non-overflow output, stores the multiplication result, may * not be NULL. - * \returns -1 on overflow, 0 if result doesn't overflow. + * \returns false on overflow, true if result is multiplied without overflow. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE int SDL_size_mul_overflow (size_t a, - size_t b, - size_t *ret) +SDL_FORCE_INLINE bool SDL_size_mul_check_overflow(size_t a, size_t b, size_t *ret) { if (a != 0 && b > SDL_SIZE_MAX / a) { - return -1; + return false; } *ret = a * b; - return 0; + return true; } #ifndef SDL_WIKI_DOCUMENTATION_SECTION @@ -3112,60 +6042,72 @@ SDL_FORCE_INLINE int SDL_size_mul_overflow (size_t a, /* 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) +SDL_FORCE_INLINE bool SDL_size_mul_check_overflow_builtin(size_t a, size_t b, size_t *ret) { - return __builtin_mul_overflow(a, b, ret) == 0 ? 0 : -1; + return (__builtin_mul_overflow(a, b, ret) == 0); } -#define SDL_size_mul_overflow(a, b, ret) (SDL_size_mul_overflow_builtin(a, b, ret)) +#define SDL_size_mul_check_overflow(a, b, ret) SDL_size_mul_check_overflow_builtin(a, b, ret) #endif #endif /** * Add two integers, checking for overflow. * - * If `a + b` would overflow, return -1. + * If `a + b` would overflow, return false. * - * Otherwise store `a + b` via ret and return 0. + * Otherwise store `a + b` via ret and return true. * * \param a the first addend. * \param b the second addend. - * \param ret on non-overflow output, stores the addition result. May not be + * \param ret on non-overflow output, stores the addition result, may not be * NULL. - * \returns -1 on overflow, 0 if result doesn't overflow. + * \returns false on overflow, true if result is added without overflow. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE int SDL_size_add_overflow (size_t a, - size_t b, - size_t *ret) +SDL_FORCE_INLINE bool SDL_size_add_check_overflow(size_t a, size_t b, size_t *ret) { if (b > SDL_SIZE_MAX - a) { - return -1; + return false; } *ret = a + b; - return 0; + return true; } #ifndef SDL_WIKI_DOCUMENTATION_SECTION #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) +SDL_FORCE_INLINE bool SDL_size_add_check_overflow_builtin(size_t a, size_t b, size_t *ret) { - return __builtin_add_overflow(a, b, ret) == 0 ? 0 : -1; + return (__builtin_add_overflow(a, b, ret) == 0); } -#define SDL_size_add_overflow(a, b, ret) (SDL_size_add_overflow_builtin(a, b, ret)) +#define SDL_size_add_check_overflow(a, b, ret) SDL_size_add_check_overflow_builtin(a, b, ret) #endif #endif /* This is a generic function pointer which should be cast to the type you expect */ -#ifdef SDL_FUNCTION_POINTER_IS_VOID_POINTER +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A generic function pointer. + * + * In theory, generic function pointers should use this, instead of `void *`, + * since some platforms could treat code addresses differently than data + * addresses. Although in current times no popular platforms make this + * distinction, it is more correct and portable to use the correct type for a + * generic pointer. + * + * If for some reason you need to force this typedef to be an actual `void *`, + * perhaps to work around a compiler or existing code, you can define + * `SDL_FUNCTION_POINTER_IS_VOID_POINTER` before including any SDL headers. + * + * \since This datatype is available since SDL 3.2.0. + */ +typedef void (*SDL_FunctionPointer)(void); +#elif defined(SDL_FUNCTION_POINTER_IS_VOID_POINTER) typedef void *SDL_FunctionPointer; #else typedef void (*SDL_FunctionPointer)(void); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_storage.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_storage.h index 91a90bc..8b89ace 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_storage.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_storage.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,222 @@ /** * # CategoryStorage * - * SDL storage container management. + * The storage API is a high-level API designed to abstract away the + * portability issues that come up when using something lower-level (in SDL's + * case, this sits on top of the [Filesystem](CategoryFilesystem) and + * [IOStream](CategoryIOStream) subsystems). It is significantly more + * restrictive than a typical filesystem API, for a number of reasons: + * + * 1. **What to Access:** A common pitfall with existing filesystem APIs is + * the assumption that all storage is monolithic. However, many other + * platforms (game consoles in particular) are more strict about what _type_ + * of filesystem is being accessed; for example, game content and user data + * are usually two separate storage devices with entirely different + * characteristics (and possibly different low-level APIs altogether!). + * + * 2. **How to Access:** Another common mistake is applications assuming that + * all storage is universally writeable - again, many platforms treat game + * content and user data as two separate storage devices, and only user data + * is writeable while game content is read-only. + * + * 3. **When to Access:** The most common portability issue with filesystem + * access is _timing_ - you cannot always assume that the storage device is + * always accessible all of the time, nor can you assume that there are no + * limits to how long you have access to a particular device. + * + * Consider the following example: + * + * ```c + * void ReadGameData(void) + * { + * extern char** fileNames; + * extern size_t numFiles; + * for (size_t i = 0; i < numFiles; i += 1) { + * FILE *data = fopen(fileNames[i], "rwb"); + * if (data == NULL) { + * // Something bad happened! + * } else { + * // A bunch of stuff happens here + * fclose(data); + * } + * } + * } + * + * void ReadSave(void) + * { + * FILE *save = fopen("saves/save0.sav", "rb"); + * if (save == NULL) { + * // Something bad happened! + * } else { + * // A bunch of stuff happens here + * fclose(save); + * } + * } + * + * void WriteSave(void) + * { + * FILE *save = fopen("saves/save0.sav", "wb"); + * if (save == NULL) { + * // Something bad happened! + * } else { + * // A bunch of stuff happens here + * fclose(save); + * } + * } + * ``` + * + * Going over the bullet points again: + * + * 1. **What to Access:** This code accesses a global filesystem; game data + * and saves are all presumed to be in the current working directory (which + * may or may not be the game's installation folder!). + * + * 2. **How to Access:** This code assumes that content paths are writeable, + * and that save data is also writeable despite being in the same location as + * the game data. + * + * 3. **When to Access:** This code assumes that they can be called at any + * time, since the filesystem is always accessible and has no limits on how + * long the filesystem is being accessed. + * + * Due to these assumptions, the filesystem code is not portable and will fail + * under these common scenarios: + * + * - The game is installed on a device that is read-only, both content loading + * and game saves will fail or crash outright + * - Game/User storage is not implicitly mounted, so no files will be found + * for either scenario when a platform requires explicitly mounting + * filesystems + * - Save data may not be safe since the I/O is not being flushed or + * validated, so an error occurring elsewhere in the program may result in + * missing/corrupted save data + * + * When using SDL_Storage, these types of problems are virtually impossible to + * trip over: + * + * ```c + * void ReadGameData(void) + * { + * extern char** fileNames; + * extern size_t numFiles; + * + * SDL_Storage *title = SDL_OpenTitleStorage(NULL, 0); + * if (title == NULL) { + * // Something bad happened! + * } + * while (!SDL_StorageReady(title)) { + * SDL_Delay(1); + * } + * + * for (size_t i = 0; i < numFiles; i += 1) { + * void* dst; + * Uint64 dstLen = 0; + * + * if (SDL_GetStorageFileSize(title, fileNames[i], &dstLen) && dstLen > 0) { + * dst = SDL_malloc(dstLen); + * if (SDL_ReadStorageFile(title, fileNames[i], dst, dstLen)) { + * // A bunch of stuff happens here + * } else { + * // Something bad happened! + * } + * SDL_free(dst); + * } else { + * // Something bad happened! + * } + * } + * + * SDL_CloseStorage(title); + * } + * + * void ReadSave(void) + * { + * SDL_Storage *user = SDL_OpenUserStorage("libsdl", "Storage Example", 0); + * if (user == NULL) { + * // Something bad happened! + * } + * while (!SDL_StorageReady(user)) { + * SDL_Delay(1); + * } + * + * Uint64 saveLen = 0; + * if (SDL_GetStorageFileSize(user, "save0.sav", &saveLen) && saveLen > 0) { + * void* dst = SDL_malloc(saveLen); + * if (SDL_ReadStorageFile(user, "save0.sav", dst, saveLen)) { + * // A bunch of stuff happens here + * } else { + * // Something bad happened! + * } + * SDL_free(dst); + * } else { + * // Something bad happened! + * } + * + * SDL_CloseStorage(user); + * } + * + * void WriteSave(void) + * { + * SDL_Storage *user = SDL_OpenUserStorage("libsdl", "Storage Example", 0); + * if (user == NULL) { + * // Something bad happened! + * } + * while (!SDL_StorageReady(user)) { + * SDL_Delay(1); + * } + * + * extern void *saveData; // A bunch of stuff happened here... + * extern Uint64 saveLen; + * if (!SDL_WriteStorageFile(user, "save0.sav", saveData, saveLen)) { + * // Something bad happened! + * } + * + * SDL_CloseStorage(user); + * } + * ``` + * + * Note the improvements that SDL_Storage makes: + * + * 1. **What to Access:** This code explicitly reads from a title or user + * storage device based on the context of the function. + * + * 2. **How to Access:** This code explicitly uses either a read or write + * function based on the context of the function. + * + * 3. **When to Access:** This code explicitly opens the device when it needs + * to, and closes it when it is finished working with the filesystem. + * + * The result is an application that is significantly more robust against the + * increasing demands of platforms and their filesystems! + * + * A publicly available example of an SDL_Storage backend is the + * [Steam Cloud](https://partner.steamgames.com/doc/features/cloud) + * backend - you can initialize Steamworks when starting the program, and then + * SDL will recognize that Steamworks is initialized and automatically use + * ISteamRemoteStorage when the application opens user storage. More + * importantly, when you _open_ storage it knows to begin a "batch" of + * filesystem operations, and when you _close_ storage it knows to end and + * flush the batch. This is used by Steam to support + * [Dynamic Cloud Sync](https://steamcommunity.com/groups/steamworks/announcements/detail/3142949576401813670) + * ; users can save data on one PC, put the device to sleep, and then continue + * playing on another PC (and vice versa) with the save data fully + * synchronized across all devices, allowing for a seamless experience without + * having to do full restarts of the program. + * + * ## Notes on valid paths + * + * All paths in the Storage API use Unix-style path separators ('/'). Using a + * different path separator will not work, even if the underlying platform + * would otherwise accept it. This is to keep code using the Storage API + * portable between platforms and Storage implementations and simplify app + * code. + * + * Paths with relative directories ("." and "..") are forbidden by the Storage + * API. + * + * All valid UTF-8 strings (discounting the NULL terminator character and the + * '/' path separator) are usable for filenames, however, an underlying + * Storage implementation may not support particularly strange sequences and + * refuse to create files with those names, etc. */ #ifndef SDL_storage_h_ @@ -40,8 +255,6 @@ extern "C" { #endif -/* !!! FIXME: Don't let this ship without async R/W support!!! */ - /** * Function interface for SDL_Storage. * @@ -52,44 +265,61 @@ extern "C" { * It is not usually necessary to do this; SDL provides standard * implementations for many things you might expect to do with an SDL_Storage. * - * \since This struct is available since SDL 3.0.0. + * This structure should be initialized using SDL_INIT_INTERFACE() + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_INIT_INTERFACE */ typedef struct SDL_StorageInterface { + /* The version of this interface */ + Uint32 version; + /* Called when the storage is closed */ - SDL_bool (SDLCALL *close)(void *userdata); + bool (SDLCALL *close)(void *userdata); /* Optional, returns whether the storage is currently ready for access */ - SDL_bool (SDLCALL *ready)(void *userdata); + bool (SDLCALL *ready)(void *userdata); /* Enumerate a directory, optional for write-only storage */ - SDL_bool (SDLCALL *enumerate)(void *userdata, const char *path, SDL_EnumerateDirectoryCallback callback, void *callback_userdata); + bool (SDLCALL *enumerate)(void *userdata, const char *path, SDL_EnumerateDirectoryCallback callback, void *callback_userdata); /* Get path information, optional for write-only storage */ - SDL_bool (SDLCALL *info)(void *userdata, const char *path, SDL_PathInfo *info); + bool (SDLCALL *info)(void *userdata, const char *path, SDL_PathInfo *info); /* Read a file from storage, optional for write-only storage */ - SDL_bool (SDLCALL *read_file)(void *userdata, const char *path, void *destination, Uint64 length); + bool (SDLCALL *read_file)(void *userdata, const char *path, void *destination, Uint64 length); /* Write a file to storage, optional for read-only storage */ - SDL_bool (SDLCALL *write_file)(void *userdata, const char *path, const void *source, Uint64 length); + bool (SDLCALL *write_file)(void *userdata, const char *path, const void *source, Uint64 length); /* Create a directory, optional for read-only storage */ - SDL_bool (SDLCALL *mkdir)(void *userdata, const char *path); + bool (SDLCALL *mkdir)(void *userdata, const char *path); /* Remove a file or empty directory, optional for read-only storage */ - SDL_bool (SDLCALL *remove)(void *userdata, const char *path); + bool (SDLCALL *remove)(void *userdata, const char *path); /* Rename a path, optional for read-only storage */ - SDL_bool (SDLCALL *rename)(void *userdata, const char *oldpath, const char *newpath); + bool (SDLCALL *rename)(void *userdata, const char *oldpath, const char *newpath); /* Copy a file, optional for read-only storage */ - SDL_bool (SDLCALL *copy)(void *userdata, const char *oldpath, const char *newpath); + bool (SDLCALL *copy)(void *userdata, const char *oldpath, const char *newpath); /* Get the space remaining, optional for read-only storage */ Uint64 (SDLCALL *space_remaining)(void *userdata); } SDL_StorageInterface; +/* Check the size of SDL_StorageInterface + * + * If this assert fails, either the compiler is padding to an unexpected size, + * or the interface has been updated and this should be updated to match and + * the code using this interface should be updated to handle the old version. + */ +SDL_COMPILE_TIME_ASSERT(SDL_StorageInterface_SIZE, + (sizeof(void *) == 4 && sizeof(SDL_StorageInterface) == 48) || + (sizeof(void *) == 8 && sizeof(SDL_StorageInterface) == 96)); + /** * An abstract interface for filesystem access. * @@ -97,7 +327,7 @@ typedef struct SDL_StorageInterface * functions like SDL_OpenTitleStorage or SDL_OpenUserStorage, etc, or create * an object with a custom implementation using SDL_OpenStorage. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Storage SDL_Storage; @@ -109,7 +339,7 @@ typedef struct SDL_Storage SDL_Storage; * \returns a title storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize @@ -132,7 +362,7 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenTitleStorage(const char *overr * \returns a user storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize @@ -156,7 +386,7 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenUserStorage(const char *org, c * \returns a filesystem storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize @@ -176,16 +406,21 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenFileStorage(const char *path); * should use the built-in implementations in SDL, like SDL_OpenTitleStorage() * or SDL_OpenUserStorage(). * - * \param iface the function table to be used by this container. - * \param userdata the pointer that will be passed to the store interface. + * This function makes a copy of `iface` and the caller does not need to keep + * it around after this call. + * + * \param iface the interface that implements this storage, initialized using + * SDL_INIT_INTERFACE(). + * \param userdata the pointer that will be passed to the interface functions. * \returns a storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize * \sa SDL_GetStorageSpaceRemaining + * \sa SDL_INIT_INTERFACE * \sa SDL_ReadStorageFile * \sa SDL_StorageReady * \sa SDL_WriteStorageFile @@ -196,33 +431,33 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenStorage(const SDL_StorageInter * Closes and frees a storage container. * * \param storage a storage container to close. - * \returns SDL_TRUE if the container was freed with no errors, SDL_FALSE - * otherwise; call SDL_GetError() for more information. Even if the - * function returns an error, the container data will be freed; the - * error is only for informational purposes. + * \returns true if the container was freed with no errors, false otherwise; + * call SDL_GetError() for more information. Even if the function + * returns an error, the container data will be freed; the error is + * only for informational purposes. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenFileStorage * \sa SDL_OpenStorage * \sa SDL_OpenTitleStorage * \sa SDL_OpenUserStorage */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CloseStorage(SDL_Storage *storage); +extern SDL_DECLSPEC bool SDLCALL SDL_CloseStorage(SDL_Storage *storage); /** * Checks if the storage container is ready to use. * - * This function should be called in regular intervals until it returns - * SDL_TRUE - however, it is not recommended to spinwait on this call, as the - * backend may depend on a synchronous message loop. + * This function should be called in regular intervals until it returns true - + * however, it is not recommended to spinwait on this call, as the backend may + * depend on a synchronous message loop. * * \param storage a storage container to query. - * \returns SDL_TRUE if the container is ready, SDL_FALSE otherwise. + * \returns true if the container is ready, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StorageReady(SDL_Storage *storage); +extern SDL_DECLSPEC bool SDLCALL SDL_StorageReady(SDL_Storage *storage); /** * Query the size of a file within a storage container. @@ -230,34 +465,38 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StorageReady(SDL_Storage *storage); * \param storage a storage container to query. * \param path the relative path of the file to query. * \param length a pointer to be filled with the file's length. - * \returns SDL_TRUE if the file could be queried or SDL_FALSE on failure; - * call SDL_GetError() for more information. + * \returns true if the file could be queried or false on failure; call + * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ReadStorageFile * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetStorageFileSize(SDL_Storage *storage, const char *path, Uint64 *length); +extern SDL_DECLSPEC bool SDLCALL SDL_GetStorageFileSize(SDL_Storage *storage, const char *path, Uint64 *length); /** * Synchronously read a file from a storage container into a client-provided * buffer. * + * The value of `length` must match the length of the file exactly; call + * SDL_GetStorageFileSize() to get this value. This behavior may be relaxed in + * a future release. + * * \param storage a storage container to read from. * \param path the relative path of the file to read. * \param destination a client-provided buffer to read the file into. * \param length the length of the destination buffer. - * \returns SDL_TRUE if the file was read or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true if the file was read or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetStorageFileSize * \sa SDL_StorageReady * \sa SDL_WriteStorageFile */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadStorageFile(SDL_Storage *storage, const char *path, void *destination, Uint64 length); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadStorageFile(SDL_Storage *storage, const char *path, void *destination, Uint64 length); /** * Synchronously write a file from client memory into a storage container. @@ -266,64 +505,73 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadStorageFile(SDL_Storage *storage, c * \param path the relative path of the file to write. * \param source a client-provided buffer to write from. * \param length the length of the source buffer. - * \returns SDL_TRUE if the file was written or SDL_FALSE on failure; call + * \returns true if the file was written or false on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetStorageSpaceRemaining * \sa SDL_ReadStorageFile * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteStorageFile(SDL_Storage *storage, const char *path, const void *source, Uint64 length); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteStorageFile(SDL_Storage *storage, const char *path, const void *source, Uint64 length); /** * Create a directory in a writable storage container. * * \param storage a storage container. * \param path the path of the directory to create. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CreateStorageDirectory(SDL_Storage *storage, const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_CreateStorageDirectory(SDL_Storage *storage, const char *path); /** * Enumerate a directory in a storage container through a callback function. * * This function provides every directory entry through an app-provided * callback, called once for each directory entry, until all results have been - * provided or the callback returns <= 0. + * provided or the callback returns either SDL_ENUM_SUCCESS or + * SDL_ENUM_FAILURE. + * + * This will return false if there was a system problem in general, or if a + * callback returns SDL_ENUM_FAILURE. A successful return means a callback + * returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries + * were enumerated. + * + * If `path` is NULL, this is treated as a request to enumerate the root of + * the storage container's tree. An empty string also works for this. * * \param storage a storage container. - * \param path the path of the directory to enumerate. + * \param path the path of the directory to enumerate, or NULL for the root. * \param callback a function that is called for each entry in the directory. * \param userdata a pointer that is passed to `callback`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnumerateStorageDirectory(SDL_Storage *storage, const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateStorageDirectory(SDL_Storage *storage, const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata); /** * Remove a file or an empty directory in a writable storage container. * * \param storage a storage container. * \param path the path of the directory to enumerate. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RemoveStoragePath(SDL_Storage *storage, const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_RemoveStoragePath(SDL_Storage *storage, const char *path); /** * Rename a file or directory in a writable storage container. @@ -331,14 +579,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RemoveStoragePath(SDL_Storage *storage, * \param storage a storage container. * \param oldpath the old path. * \param newpath the new path. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenameStoragePath(SDL_Storage *storage, const char *oldpath, const char *newpath); +extern SDL_DECLSPEC bool SDLCALL SDL_RenameStoragePath(SDL_Storage *storage, const char *oldpath, const char *newpath); /** * Copy a file in a writable storage container. @@ -346,14 +594,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenameStoragePath(SDL_Storage *storage, * \param storage a storage container. * \param oldpath the old path. * \param newpath the new path. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyStorageFile(SDL_Storage *storage, const char *oldpath, const char *newpath); +extern SDL_DECLSPEC bool SDLCALL SDL_CopyStorageFile(SDL_Storage *storage, const char *oldpath, const char *newpath); /** * Get information about a filesystem path in a storage container. @@ -362,14 +610,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyStorageFile(SDL_Storage *storage, c * \param path the path to query. * \param info a pointer filled in with information about the path, or NULL to * check for the existence of a file. - * \returns SDL_TRUE on success or SDL_FALSE if the file doesn't exist, or - * another failure; call SDL_GetError() for more information. + * \returns true on success or false if the file doesn't exist, or another + * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetStoragePathInfo(SDL_Storage *storage, const char *path, SDL_PathInfo *info); +extern SDL_DECLSPEC bool SDLCALL SDL_GetStoragePathInfo(SDL_Storage *storage, const char *path, SDL_PathInfo *info); /** * Queries the remaining space in a storage container. @@ -377,7 +625,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetStoragePathInfo(SDL_Storage *storage * \param storage a storage container to query. * \returns the amount of remaining space, in bytes. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady * \sa SDL_WriteStorageFile @@ -401,8 +649,11 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetStorageSpaceRemaining(SDL_Storage *sto * convenience, but if `count` is non-NULL, on return it will contain the * number of items in the array, not counting the NULL terminator. * + * If `path` is NULL, this is treated as a request to enumerate the root of + * the storage container's tree. An empty string also works for this. + * * \param storage a storage container. - * \param path the path of the directory to enumerate. + * \param path the path of the directory to enumerate, or NULL for the root. * \param pattern the pattern that files in the directory must match. Can be * NULL. * \param flags `SDL_GLOB_*` bitflags that affect this search. @@ -417,7 +668,7 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetStorageSpaceRemaining(SDL_Storage *sto * \threadsafety It is safe to call this function from any thread, assuming * the `storage` object is thread-safe. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char ** SDLCALL SDL_GlobStorageDirectory(SDL_Storage *storage, const char *path, const char *pattern, SDL_GlobFlags flags, int *count); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_surface.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_surface.h index aafe574..0752f53 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_surface.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_surface.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,19 @@ /** * # CategorySurface * - * SDL_Surface definition and management functions. + * SDL surfaces are buffers of pixels in system RAM. These are useful for + * passing around and manipulating images that are not stored in GPU memory. + * + * SDL_Surface makes serious efforts to manage images in various formats, and + * provides a reasonable toolbox for transforming the data, including copying + * between surfaces, filling rectangles in the image data, etc. + * + * There is also a simple .bmp loader, SDL_LoadBMP(). SDL itself does not + * provide loaders for various other file formats, but there are several + * excellent external libraries that do, including its own satellite library, + * SDL_image: + * + * https://github.com/libsdl-org/SDL_image */ #ifndef SDL_surface_h_ @@ -47,7 +59,7 @@ extern "C" { * * These are generally considered read-only. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_SurfaceFlags; @@ -59,14 +71,14 @@ typedef Uint32 SDL_SurfaceFlags; /** * Evaluates to true if the surface needs to be locked before access. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MUSTLOCK(S) ((((S)->flags & SDL_SURFACE_LOCK_NEEDED)) == SDL_SURFACE_LOCK_NEEDED) /** * The scaling mode. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ScaleMode { @@ -77,7 +89,7 @@ typedef enum SDL_ScaleMode /** * The flip mode. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_FlipMode { @@ -86,8 +98,7 @@ typedef enum SDL_FlipMode SDL_FLIP_VERTICAL /**< flip vertically */ } SDL_FlipMode; -/* Internal surface data */ -typedef struct SDL_SurfaceData SDL_SurfaceData; +#ifndef SDL_INTERNAL /** * A collection of pixels used in software blitting. @@ -104,22 +115,32 @@ typedef struct SDL_SurfaceData SDL_SurfaceData; * remaining bytes to reach the pitch are used as padding to reach a desired * alignment, and have undefined contents. * - * \since This struct is available since SDL 3.0.0. + * When a surface holds YUV format data, the planes are assumed to be + * contiguous without padding between them, e.g. a 32x32 surface in NV12 + * format with a pitch of 32 would consist of 32x32 bytes of Y plane followed + * by 32x16 bytes of UV plane. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateSurface + * \sa SDL_DestroySurface */ -typedef struct SDL_Surface +struct SDL_Surface { - SDL_SurfaceFlags flags; /**< Read-only */ - SDL_PixelFormat format; /**< Read-only */ - int w, h; /**< Read-only */ - int pitch; /**< Read-only */ - void *pixels; /**< Read-only pointer, writable pixels if non-NULL */ + SDL_SurfaceFlags flags; /**< The flags of the surface, read-only */ + SDL_PixelFormat format; /**< The format of the surface, read-only */ + int w; /**< The width of the surface, read-only. */ + int h; /**< The height of the surface, read-only. */ + int pitch; /**< The distance in bytes between rows of pixels, read-only */ + void *pixels; /**< A pointer to the pixels of the surface, the pixels are writeable if non-NULL */ int refcount; /**< Application reference count, used when freeing surface */ - SDL_SurfaceData *internal; /**< Private */ - -} SDL_Surface; + void *reserved; /**< Reserved for internal use */ +}; +#endif /* !SDL_INTERNAL */ +typedef struct SDL_Surface SDL_Surface; /** * Allocate a new surface with a specific pixel format. @@ -132,7 +153,7 @@ typedef struct SDL_Surface * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSurfaceFrom * \sa SDL_DestroySurface @@ -160,7 +181,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_CreateSurface(int width, int heigh * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSurface * \sa SDL_DestroySurface @@ -174,9 +195,8 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_CreateSurfaceFrom(int width, int h * * \param surface the SDL_Surface to free. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_CreateStackSurface * \sa SDL_CreateSurface * \sa SDL_CreateSurfaceFrom */ @@ -206,7 +226,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroySurface(SDL_Surface *surface); * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSurfaceProperties(SDL_Surface *surface); @@ -221,16 +241,16 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSurfaceProperties(SDL_Surfac * interpreted in color operations. * * \param surface the SDL_Surface structure to update. - * \param colorspace an SDL_ColorSpace value describing the surface + * \param colorspace an SDL_Colorspace value describing the surface * colorspace. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorspace */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceColorspace(SDL_Surface *surface, SDL_Colorspace colorspace); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorspace(SDL_Surface *surface, SDL_Colorspace colorspace); /** * Get the colorspace used by a surface. @@ -243,7 +263,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceColorspace(SDL_Surface *surfa * \returns the colorspace used by the surface, or SDL_COLORSPACE_UNKNOWN if * the surface is NULL. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceColorspace */ @@ -271,7 +291,7 @@ extern SDL_DECLSPEC SDL_Colorspace SDLCALL SDL_GetSurfaceColorspace(SDL_Surface * the surface didn't have an index format); call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetPaletteColors */ @@ -284,15 +304,15 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_CreateSurfacePalette(SDL_Surface * * * \param surface the SDL_Surface structure to update. * \param palette the SDL_Palette structure to use. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePalette * \sa SDL_GetSurfacePalette */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette); /** * Get the palette used by a surface. @@ -301,7 +321,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfacePalette(SDL_Surface *surface, * \returns a pointer to the palette used by the surface, or NULL if there is * no palette used. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfacePalette */ @@ -321,31 +341,30 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_GetSurfacePalette(SDL_Surface *sur * \param surface the SDL_Surface structure to update. * \param image a pointer to an alternate SDL_Surface to associate with this * surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RemoveSurfaceAlternateImages * \sa SDL_GetSurfaceImages * \sa SDL_SurfaceHasAlternateImages */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddSurfaceAlternateImage(SDL_Surface *surface, SDL_Surface *image); +extern SDL_DECLSPEC bool SDLCALL SDL_AddSurfaceAlternateImage(SDL_Surface *surface, SDL_Surface *image); /** * Return whether a surface has alternate versions available. * * \param surface the SDL_Surface structure to query. - * \returns SDL_TRUE if alternate versions are available or SDL_TRUE - * otherwise. + * \returns true if alternate versions are available or false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddSurfaceAlternateImage * \sa SDL_RemoveSurfaceAlternateImages * \sa SDL_GetSurfaceImages */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasAlternateImages(SDL_Surface *surface); +extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasAlternateImages(SDL_Surface *surface); /** * Get an array including all versions of a surface. @@ -364,7 +383,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasAlternateImages(SDL_Surface * * failure; call SDL_GetError() for more information. This should be * freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddSurfaceAlternateImage * \sa SDL_RemoveSurfaceAlternateImages @@ -380,7 +399,7 @@ extern SDL_DECLSPEC SDL_Surface ** SDLCALL SDL_GetSurfaceImages(SDL_Surface *sur * * \param surface the SDL_Surface structure to update. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddSurfaceAlternateImage * \sa SDL_GetSurfaceImages @@ -401,22 +420,22 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveSurfaceAlternateImages(SDL_Surface *s * format of the surface will not change. * * \param surface the SDL_Surface structure to be locked. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MUSTLOCK * \sa SDL_UnlockSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockSurface(SDL_Surface *surface); +extern SDL_DECLSPEC bool 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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockSurface */ @@ -429,18 +448,18 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); * will result in a memory leak. * * \param src the data stream for the surface. - * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning, - * even in the case of an error. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. * \returns a pointer to a new SDL_Surface structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface * \sa SDL_LoadBMP * \sa SDL_SaveBMP_IO */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_IO(SDL_IOStream *src, SDL_bool closeio); +extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_IO(SDL_IOStream *src, bool closeio); /** * Load a BMP image from a file. @@ -452,7 +471,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_IO(SDL_IOStream *src, SDL_ * \returns a pointer to a new SDL_Surface structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface * \sa SDL_LoadBMP_IO @@ -471,17 +490,17 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP(const char *file); * * \param surface the SDL_Surface structure containing the image to be saved. * \param dst a data stream to save to. - * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `dst` before returning, - * even in the case of an error. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param closeio if true, calls SDL_CloseIO() on `dst` before returning, even + * in the case of an error. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadBMP_IO * \sa SDL_SaveBMP */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IOStream *dst, SDL_bool closeio); +extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); /** * Save a surface to a file. @@ -494,15 +513,15 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IO * * \param surface the SDL_Surface structure containing the image to be saved. * \param file a file to save to. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadBMP * \sa SDL_SaveBMP_IO */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SaveBMP(SDL_Surface *surface, const char *file); +extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP(SDL_Surface *surface, const char *file); /** * Set the RLE acceleration hint for a surface. @@ -511,32 +530,31 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SaveBMP(SDL_Surface *surface, const cha * the surface must be locked before directly accessing the pixels. * * \param surface the SDL_Surface structure to optimize. - * \param enabled SDL_TRUE to enable RLE acceleration, SDL_FALSE to disable - * it. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param enabled true to enable RLE acceleration, false to disable it. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface * \sa SDL_LockSurface * \sa SDL_UnlockSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceRLE(SDL_Surface *surface, SDL_bool enabled); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceRLE(SDL_Surface *surface, bool enabled); /** * Returns whether the surface is RLE enabled. * - * It is safe to pass a NULL `surface` here; it will return SDL_FALSE. + * It is safe to pass a NULL `surface` here; it will return false. * * \param surface the SDL_Surface structure to query. - * \returns SDL_TRUE if the surface is RLE enabled, SDL_FALSE otherwise. + * \returns true if the surface is RLE enabled, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceRLE */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasRLE(SDL_Surface *surface); +extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasRLE(SDL_Surface *surface); /** * Set the color key (transparent pixel) in a surface. @@ -549,34 +567,33 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasRLE(SDL_Surface *surface); * SDL_MapRGB(). * * \param surface the SDL_Surface structure to update. - * \param enabled SDL_TRUE to enable color key, SDL_FALSE to disable color - * key. + * \param enabled true to enable color key, false to disable color key. * \param key the transparent pixel. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorKey * \sa SDL_SetSurfaceRLE * \sa SDL_SurfaceHasColorKey */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceColorKey(SDL_Surface *surface, SDL_bool enabled, Uint32 key); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorKey(SDL_Surface *surface, bool enabled, Uint32 key); /** * Returns whether the surface has a color key. * - * It is safe to pass a NULL `surface` here; it will return SDL_FALSE. + * It is safe to pass a NULL `surface` here; it will return false. * * \param surface the SDL_Surface structure to query. - * \returns SDL_TRUE if the surface has a color key, SDL_FALSE otherwise. + * \returns true if the surface has a color key, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceColorKey * \sa SDL_GetSurfaceColorKey */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasColorKey(SDL_Surface *surface); +extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasColorKey(SDL_Surface *surface); /** * Get the color key (transparent pixel) for a surface. @@ -584,19 +601,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasColorKey(SDL_Surface *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. + * If the surface doesn't have color key enabled this function returns false. * * \param surface the SDL_Surface structure to query. * \param key a pointer filled in with the transparent pixel. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceColorKey * \sa SDL_SurfaceHasColorKey */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceColorKey(SDL_Surface *surface, Uint32 *key); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceColorKey(SDL_Surface *surface, Uint32 *key); /** * Set an additional color value multiplied into blit operations. @@ -611,15 +628,15 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceColorKey(SDL_Surface *surface * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorMod * \sa SDL_SetSurfaceAlphaMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceColorMod(SDL_Surface *surface, Uint8 r, Uint8 g, Uint8 b); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorMod(SDL_Surface *surface, Uint8 r, Uint8 g, Uint8 b); /** @@ -629,15 +646,15 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceColorMod(SDL_Surface *surface * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceAlphaMod * \sa SDL_SetSurfaceColorMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceColorMod(SDL_Surface *surface, Uint8 *r, Uint8 *g, Uint8 *b); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceColorMod(SDL_Surface *surface, Uint8 *r, Uint8 *g, Uint8 *b); /** * Set an additional alpha value used in blit operations. @@ -649,30 +666,30 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceColorMod(SDL_Surface *surface * * \param surface the SDL_Surface structure to update. * \param alpha the alpha value multiplied into blit operations. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceAlphaMod * \sa SDL_SetSurfaceColorMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceAlphaMod(SDL_Surface *surface, Uint8 alpha); +extern SDL_DECLSPEC bool 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorMod * \sa SDL_SetSurfaceAlphaMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface *surface, Uint8 *alpha); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface *surface, Uint8 *alpha); /** * Set the blend mode used for blit operations. @@ -683,28 +700,28 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface *surface * * \param surface the SDL_Surface structure to update. * \param blendMode the SDL_BlendMode to use for blit blending. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode blendMode); +extern SDL_DECLSPEC bool 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode *blendMode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode *blendMode); /** * Set the clipping rectangle for a surface. @@ -718,14 +735,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface *surfac * \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. + * \returns true if the rectangle intersects the surface, otherwise false and + * blits will be completely clipped. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceClipRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceClipRect(SDL_Surface *surface, const SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceClipRect(SDL_Surface *surface, const SDL_Rect *rect); /** * Get the clipping rectangle for a surface. @@ -737,26 +754,26 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceClipRect(SDL_Surface *surface * clipped. * \param rect an SDL_Rect structure filled in with the clipping rectangle for * the surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceClipRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceClipRect(SDL_Surface *surface, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceClipRect(SDL_Surface *surface, SDL_Rect *rect); /** * Flip a surface vertically or horizontally. * * \param surface the surface to flip. * \param flip the direction to flip. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_FlipMode flip); +extern SDL_DECLSPEC bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_FlipMode flip); /** * Creates a new surface identical to the existing surface. @@ -770,7 +787,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_F * \returns a copy of the surface or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface */ @@ -789,7 +806,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_DuplicateSurface(SDL_Surface *surf * \returns a copy of the surface or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface */ @@ -814,7 +831,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ScaleSurface(SDL_Surface *surface, * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertSurfaceAndColorspace * \sa SDL_DestroySurface @@ -840,10 +857,9 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface(SDL_Surface *surfac * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertSurface - * \sa SDL_ConvertSurface * \sa SDL_DestroySurface */ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurfaceAndColorspace(SDL_Surface *surface, SDL_PixelFormat format, SDL_Palette *palette, SDL_Colorspace colorspace, SDL_PropertiesID props); @@ -859,14 +875,14 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurfaceAndColorspace(SDL_Su * \param dst_format an SDL_PixelFormat 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 SDL_FALSE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertPixelsAndColorspace */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertPixels(int width, int height, SDL_PixelFormat src_format, const void *src, int src_pitch, SDL_PixelFormat dst_format, void *dst, int dst_pitch); +extern SDL_DECLSPEC bool SDLCALL SDL_ConvertPixels(int width, int height, SDL_PixelFormat src_format, const void *src, int src_pitch, SDL_PixelFormat dst_format, void *dst, int dst_pitch); /** * Copy a block of pixels of one format and colorspace to another format and @@ -875,27 +891,27 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertPixels(int width, int height, SD * \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_PixelFormat value of the `src` pixels format. - * \param src_colorspace an SDL_ColorSpace value describing the colorspace of + * \param src_colorspace an SDL_Colorspace value describing the colorspace of * the `src` pixels. * \param src_properties an SDL_PropertiesID with additional source color * properties, or 0. * \param src a pointer to the source pixels. * \param src_pitch the pitch of the source pixels, in bytes. * \param dst_format an SDL_PixelFormat value of the `dst` pixels format. - * \param dst_colorspace an SDL_ColorSpace value describing the colorspace of + * \param dst_colorspace an SDL_Colorspace value describing the colorspace of * the `dst` pixels. * \param dst_properties an SDL_PropertiesID with additional destination color * properties, or 0. * \param dst a pointer to be filled in with new pixel data. * \param dst_pitch the pitch of the destination pixels, in bytes. - * \returns SDL_FALSE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertPixels */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertPixelsAndColorspace(int width, int height, SDL_PixelFormat src_format, SDL_Colorspace src_colorspace, SDL_PropertiesID src_properties, const void *src, int src_pitch, SDL_PixelFormat dst_format, SDL_Colorspace dst_colorspace, SDL_PropertiesID dst_properties, void *dst, int dst_pitch); +extern SDL_DECLSPEC bool SDLCALL SDL_ConvertPixelsAndColorspace(int width, int height, SDL_PixelFormat src_format, SDL_Colorspace src_colorspace, SDL_PropertiesID src_properties, const void *src, int src_pitch, SDL_PixelFormat dst_format, SDL_Colorspace dst_colorspace, SDL_PropertiesID dst_properties, void *dst, int dst_pitch); /** * Premultiply the alpha on a block of pixels. @@ -910,14 +926,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertPixelsAndColorspace(int width, i * \param dst_format an SDL_PixelFormat 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. - * \param linear SDL_TRUE to convert from sRGB to linear space for the alpha - * multiplication, SDL_FALSE to do multiplication in sRGB space. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param linear true to convert from sRGB to linear space for the alpha + * multiplication, false to do multiplication in sRGB space. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PremultiplyAlpha(int width, int height, SDL_PixelFormat src_format, const void *src, int src_pitch, SDL_PixelFormat dst_format, void *dst, int dst_pitch, SDL_bool linear); +extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplyAlpha(int width, int height, SDL_PixelFormat src_format, const void *src, int src_pitch, SDL_PixelFormat dst_format, void *dst, int dst_pitch, bool linear); /** * Premultiply the alpha in a surface. @@ -925,14 +941,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PremultiplyAlpha(int width, int height, * This is safe to use with src == dst, but not for other overlapping areas. * * \param surface the surface to modify. - * \param linear SDL_TRUE to convert from sRGB to linear space for the alpha - * multiplication, SDL_FALSE to do multiplication in sRGB space. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param linear true to convert from sRGB to linear space for the alpha + * multiplication, false to do multiplication in sRGB space. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *surface, SDL_bool linear); +extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *surface, bool linear); /** * Clear a surface with a specific color, with floating point precision. @@ -947,12 +963,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *su * \param g the green component of the pixel, normally in the range 0-1. * \param b the blue component of the pixel, normally in the range 0-1. * \param a the alpha component of the pixel, normally in the range 0-1. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearSurface(SDL_Surface *surface, float r, float g, float b, float a); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearSurface(SDL_Surface *surface, float r, float g, float b, float a); /** * Perform a fast fill of a rectangle with a specific color. @@ -970,14 +986,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearSurface(SDL_Surface *surface, floa * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_FillSurfaceRects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FillSurfaceRect(SDL_Surface *dst, const SDL_Rect *rect, Uint32 color); +extern SDL_DECLSPEC bool SDLCALL SDL_FillSurfaceRect(SDL_Surface *dst, const SDL_Rect *rect, Uint32 color); /** * Perform a fast fill of a set of rectangles with a specific color. @@ -995,22 +1011,24 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FillSurfaceRect(SDL_Surface *dst, const * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_FillSurfaceRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FillSurfaceRects(SDL_Surface *dst, const SDL_Rect *rects, int count, Uint32 color); +extern SDL_DECLSPEC bool SDLCALL SDL_FillSurfaceRects(SDL_Surface *dst, const SDL_Rect *rects, int count, Uint32 color); /** - * Performs a fast blit from the source surface to the destination surface. + * Performs a fast blit from the source surface to the destination surface + * with clipping. * - * This assumes that the source and destination rectangles are the same size. * If either `srcrect` or `dstrect` are NULL, the entire surface (`src` or - * `dst`) is copied. The final blit rectangles are saved in `srcrect` and - * `dstrect` after all clipping is performed. + * `dst`) is copied while ensuring clipping to `dst->clip_rect`. + * + * The final blit rectangles are saved in `srcrect` and `dstrect` after all + * clipping is performed. * * The blit function should not be called on a locked surface. * @@ -1066,18 +1084,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FillSurfaceRects(SDL_Surface *dst, cons * height are ignored, and are copied from `srcrect`. If you * want a specific width and height, you should use * SDL_BlitSurfaceScaled(). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurfaceScaled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurface(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurface(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); /** * Perform low-level surface blitting only. @@ -1091,18 +1109,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurface(SDL_Surface *src, const SDL * \param dst the SDL_Surface structure that is the blit target. * \param dstrect the SDL_Rect structure representing the target rectangle in * the destination surface, may not be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceUnchecked(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceUnchecked(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); /** * Perform a scaled blit to a destination surface, which may be of a different @@ -1116,18 +1134,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceUnchecked(SDL_Surface *src, * the destination surface, or NULL to fill the entire * destination surface. * \param scaleMode the SDL_ScaleMode to be used. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceScaled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect, SDL_ScaleMode scaleMode); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceScaled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect, SDL_ScaleMode scaleMode); /** * Perform low-level surface scaled blitting only. @@ -1142,18 +1160,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceScaled(SDL_Surface *src, con * \param dstrect the SDL_Rect structure representing the target rectangle in * the destination surface, may not be NULL. * \param scaleMode the SDL_ScaleMode to be used. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurfaceScaled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceUncheckedScaled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect, SDL_ScaleMode scaleMode); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceUncheckedScaled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect, SDL_ScaleMode scaleMode); /** * Perform a tiled blit to a destination surface, which may be of a different @@ -1168,18 +1186,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceUncheckedScaled(SDL_Surface * \param dst the SDL_Surface structure that is the blit target. * \param dstrect the SDL_Rect structure representing the target rectangle in * the destination surface, or NULL to fill the entire surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceTiled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceTiled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); /** * Perform a scaled and tiled blit to a destination surface, which may be of a @@ -1198,18 +1216,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceTiled(SDL_Surface *src, cons * \param dst the SDL_Surface structure that is the blit target. * \param dstrect the SDL_Rect structure representing the target rectangle in * the destination surface, or NULL to fill the entire surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceTiledWithScale(SDL_Surface *src, const SDL_Rect *srcrect, float scale, SDL_ScaleMode scaleMode, SDL_Surface *dst, const SDL_Rect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceTiledWithScale(SDL_Surface *src, const SDL_Rect *srcrect, float scale, SDL_ScaleMode scaleMode, SDL_Surface *dst, const SDL_Rect *dstrect); /** * Perform a scaled blit using the 9-grid algorithm to a destination surface, @@ -1235,18 +1253,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceTiledWithScale(SDL_Surface * * \param dst the SDL_Surface structure that is the blit target. * \param dstrect the SDL_Rect structure representing the target rectangle in * the destination surface, or NULL to fill the entire surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurface9Grid(SDL_Surface *src, const SDL_Rect *srcrect, int left_width, int right_width, int top_height, int bottom_height, float scale, SDL_ScaleMode scaleMode, SDL_Surface *dst, const SDL_Rect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurface9Grid(SDL_Surface *src, const SDL_Rect *srcrect, int left_width, int right_width, int top_height, int bottom_height, float scale, SDL_ScaleMode scaleMode, SDL_Surface *dst, const SDL_Rect *dstrect); /** * Map an RGB triple to an opaque pixel value for a surface. @@ -1272,7 +1290,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurface9Grid(SDL_Surface *src, cons * \param b the blue component of the pixel in the range 0-255. * \returns a pixel value. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MapSurfaceRGBA */ @@ -1303,7 +1321,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapSurfaceRGB(SDL_Surface *surface, Uint8 * \param a the alpha component of the pixel in the range 0-255. * \returns a pixel value. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MapSurfaceRGB */ @@ -1329,12 +1347,12 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapSurfaceRGBA(SDL_Surface *surface, Uint * ignore this channel. * \param a a pointer filled in with the alpha channel, 0-255, or NULL to * ignore this channel. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadSurfacePixel(SDL_Surface *surface, int x, int y, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixel(SDL_Surface *surface, int x, int y, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); /** * Retrieves a single pixel from a surface. @@ -1353,12 +1371,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadSurfacePixel(SDL_Surface *surface, * 0-1, or NULL to ignore this channel. * \param a a pointer filled in with the alpha channel, normally in the range * 0-1, or NULL to ignore this channel. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadSurfacePixelFloat(SDL_Surface *surface, int x, int y, float *r, float *g, float *b, float *a); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixelFloat(SDL_Surface *surface, int x, int y, float *r, float *g, float *b, float *a); /** * Writes a single pixel to a surface. @@ -1376,12 +1394,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadSurfacePixelFloat(SDL_Surface *surf * \param g the green channel value, 0-255. * \param b the blue channel value, 0-255. * \param a the alpha channel value, 0-255. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteSurfacePixel(SDL_Surface *surface, int x, int y, Uint8 r, Uint8 g, Uint8 b, Uint8 a); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteSurfacePixel(SDL_Surface *surface, int x, int y, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /** * Writes a single pixel to a surface. @@ -1396,12 +1414,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteSurfacePixel(SDL_Surface *surface, * \param g the green channel value, normally in the range 0-1. * \param b the blue channel value, normally in the range 0-1. * \param a the alpha channel value, normally in the range 0-1. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteSurfacePixelFloat(SDL_Surface *surface, int x, int y, float r, float g, float b, float a); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteSurfacePixelFloat(SDL_Surface *surface, int x, int y, float r, float g, float b, float a); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_system.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_system.h index 17ac0a1..294089f 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_system.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_system.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,13 @@ /** * # CategorySystem * - * Platform-specific SDL API functions. + * Platform-specific SDL API functions. These are functions that deal with + * needs of specific operating systems, that didn't make sense to offer as + * platform-independent, generic APIs. + * + * Most apps can make do without these functions, but they can be useful for + * integrating with other parts of a specific system, adding platform-specific + * polish to an app, or solving problems that only affect one target. */ #ifndef SDL_system_h_ @@ -31,7 +37,6 @@ #include #include #include -#include #include #include @@ -44,16 +49,15 @@ extern "C" { /* * Platform specific functions for Windows */ -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) typedef struct tagMSG MSG; /** * A callback to be used with SDL_SetWindowsMessageHook. * - * This callback may modify the message, and should return SDL_TRUE if the - * message should continue to be processed, or SDL_FALSE to prevent further - * processing. + * This callback may modify the message, and should return true if the message + * should continue to be processed, or false to prevent further processing. * * As this is processing a message directly from the Windows event loop, this * callback should do the minimum required work and return quickly. @@ -61,36 +65,35 @@ typedef struct tagMSG MSG; * \param userdata the app-defined pointer provided to * SDL_SetWindowsMessageHook. * \param msg a pointer to a Win32 event structure to process. - * \returns SDL_TRUE to let event continue on, SDL_FALSE to drop it. + * \returns true to let event continue on, false to drop it. * * \threadsafety This may only be called (by SDL) from the thread handling the * Windows event loop. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetWindowsMessageHook * \sa SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP */ -typedef SDL_bool (SDLCALL *SDL_WindowsMessageHook)(void *userdata, MSG *msg); +typedef bool (SDLCALL *SDL_WindowsMessageHook)(void *userdata, MSG *msg); /** * Set a callback for every Windows message, run before TranslateMessage(). * - * The callback may modify the message, and should return SDL_TRUE if the - * message should continue to be processed, or SDL_FALSE to prevent further - * processing. + * The callback may modify the message, and should return true if the message + * should continue to be processed, or false to prevent further processing. * * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WindowsMessageHook * \sa SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP */ extern SDL_DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata); -#endif /* defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) */ +#endif /* defined(SDL_PLATFORM_WINDOWS) */ #if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) @@ -104,14 +107,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHoo * \returns the D3D9 adapter index on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDirect3D9AdapterIndex(SDL_DisplayID displayID); -#endif /* defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) */ - -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) - /** * Get the DXGI Adapter and Output indices for the specified display. * @@ -122,33 +121,55 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDirect3D9AdapterIndex(SDL_DisplayID displ * \param displayID the instance of the display to query. * \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. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDXGIOutputInfo(SDL_DisplayID displayID, int *adapterIndex, int *outputIndex); +extern SDL_DECLSPEC bool SDLCALL SDL_GetDXGIOutputInfo(SDL_DisplayID displayID, int *adapterIndex, int *outputIndex); #endif /* defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) */ + /* * Platform specific functions for UNIX */ +/* this is defined in Xlib's headers, just need a simple declaration here. */ typedef union _XEvent XEvent; -typedef SDL_bool (SDLCALL *SDL_X11EventHook)(void *userdata, XEvent *xevent); + +/** + * A callback to be used with SDL_SetX11EventHook. + * + * This callback may modify the event, and should return true if the event + * should continue to be processed, or false to prevent further processing. + * + * As this is processing an event directly from the X11 event loop, this + * callback should do the minimum required work and return quickly. + * + * \param userdata the app-defined pointer provided to SDL_SetX11EventHook. + * \param xevent a pointer to an Xlib XEvent union to process. + * \returns true to let event continue on, false to drop it. + * + * \threadsafety This may only be called (by SDL) from the thread handling the + * X11 event loop. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_SetX11EventHook + */ +typedef bool (SDLCALL *SDL_X11EventHook)(void *userdata, XEvent *xevent); /** * Set a callback for every X11 event. * - * The callback may modify the event, and should return SDL_TRUE if the event - * should continue to be processed, or SDL_FALSE to prevent further - * processing. + * The callback may modify the event, and should return true if the event + * should continue to be processed, or false to prevent further processing. * * \param callback the SDL_X11EventHook function to call. * \param userdata a pointer to pass to every iteration of `callback`. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetX11EventHook(SDL_X11EventHook callback, void *userdata); @@ -162,12 +183,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetX11EventHook(SDL_X11EventHook callback, * * \param threadID the Unix thread ID to change priority of. * \param priority the new, Unix-specific, priority value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLinuxThreadPriority(Sint64 threadID, int priority); +extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriority(Sint64 threadID, int priority); /** * Sets the priority (not nice level) and scheduling policy for a thread. @@ -178,12 +199,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLinuxThreadPriority(Sint64 threadID, * \param sdlPriority the new SDL_ThreadPriority value. * \param schedPolicy the new scheduling policy (SCHED_FIFO, SCHED_RR, * SCHED_OTHER, etc...). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLinuxThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy); +extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy); #endif /* SDL_PLATFORM_LINUX */ @@ -204,7 +225,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLinuxThreadPriorityAndPolicy(Sint64 * \param userdata what was passed as `callbackParam` to * SDL_SetiOSAnimationCallback as `callbackParam`. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetiOSAnimationCallback */ @@ -240,27 +261,27 @@ typedef void (SDLCALL *SDL_iOSAnimationCallback)(void *userdata); * called. * \param callback the function to call for every frame. * \param callbackParam a pointer that is passed to `callback`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetiOSEventPump */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetiOSAnimationCallback(SDL_Window *window, int interval, SDL_iOSAnimationCallback callback, void *callbackParam); +extern SDL_DECLSPEC bool SDLCALL SDL_SetiOSAnimationCallback(SDL_Window *window, int interval, SDL_iOSAnimationCallback callback, void *callbackParam); /** * Use this function to enable or disable the SDL event pump on Apple iOS. * * This function is only available on Apple iOS. * - * \param enabled SDL_TRUE to enable the event pump, SDL_FALSE to disable it. + * \param enabled true to enable the event pump, false to disable it. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetiOSAnimationCallback */ -extern SDL_DECLSPEC void SDLCALL SDL_SetiOSEventPump(SDL_bool enabled); +extern SDL_DECLSPEC void SDLCALL SDL_SetiOSEventPump(bool enabled); #endif /* SDL_PLATFORM_IOS */ @@ -286,7 +307,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetiOSEventPump(SDL_bool enabled); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidActivity */ @@ -311,7 +332,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetAndroidJNIEnv(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidJNIEnv */ @@ -349,43 +370,34 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetAndroidActivity(void); * * \returns the Android API level. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_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 3.0.0. - */ -extern SDL_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. + * \returns true if this is a Chromebook, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsChromebook(void); +extern SDL_DECLSPEC 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. + * \returns true if this is a DeX docking station, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsDeXMode(void); +extern SDL_DECLSPEC bool SDLCALL SDL_IsDeXMode(void); /** * Trigger the Android system back button behavior. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); @@ -393,9 +405,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); * See the official Android developer guide for more information: * http://developer.android.com/guide/topics/data/data-storage.html * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ANDROID_EXTERNAL_STORAGE_READ 0x01 + +/** + * See the official Android developer guide for more information: + * http://developer.android.com/guide/topics/data/data-storage.html + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ANDROID_EXTERNAL_STORAGE_WRITE 0x02 /** @@ -414,9 +433,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); * \returns the path used for internal storage or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_GetAndroidExternalStorageState + * \sa SDL_GetAndroidExternalStoragePath + * \sa SDL_GetAndroidCachePath */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidInternalStoragePath(void); @@ -431,7 +451,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidInternalStoragePath(void) * \returns the current state of external storage, or 0 if external storage is * currently unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidExternalStoragePath */ @@ -453,9 +473,11 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAndroidExternalStorageState(void); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidExternalStorageState + * \sa SDL_GetAndroidInternalStoragePath + * \sa SDL_GetAndroidCachePath */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidExternalStoragePath(void); @@ -474,12 +496,25 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidExternalStoragePath(void) * \returns the path used for caches for this application on success or NULL * on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetAndroidInternalStoragePath + * \sa SDL_GetAndroidExternalStoragePath */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidCachePath(void); - -typedef void (SDLCALL *SDL_RequestAndroidPermissionCallback)(void *userdata, const char *permission, SDL_bool granted); +/** + * Callback that presents a response from a SDL_RequestAndroidPermission call. + * + * \param userdata an app-controlled pointer that is passed to the callback. + * \param permission the Android-specific permission name that was requested. + * \param granted true if permission is granted, false if denied. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_RequestAndroidPermission + */ +typedef void (SDLCALL *SDL_RequestAndroidPermissionCallback)(void *userdata, const char *permission, bool granted); /** * Request permissions at runtime, asynchronously. @@ -500,18 +535,22 @@ typedef void (SDLCALL *SDL_RequestAndroidPermissionCallback)(void *userdata, con * like memory running out. Normally there will be a yes or no to the request * through the callback. * + * For the `permission` parameter, choose a value from here: + * + * https://developer.android.com/reference/android/Manifest.permission + * * \param permission the permission to request. * \param cb the callback to trigger when the request has a response. * \param userdata an app-controlled pointer that is passed to the callback. - * \returns SDL_TRUE if the request was submitted, SDL_FALSE if there was an - * error submitting. The result of the request is only ever reported + * \returns true if the request was submitted, false if there was an error + * submitting. The result of the request is only ever reported * through the callback, not this return value. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RequestAndroidPermission(const char *permission, SDL_RequestAndroidPermissionCallback cb, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_RequestAndroidPermission(const char *permission, SDL_RequestAndroidPermissionCallback cb, void *userdata); /** * Shows an Android toast notification. @@ -532,14 +571,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RequestAndroidPermission(const char *pe * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowAndroidToast(const char *message, int duration, int gravity, int xoffset, int yoffset); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowAndroidToast(const char *message, int duration, int gravity, int xoffset, int yoffset); /** * Send a user command to SDLActivity. @@ -548,111 +587,63 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowAndroidToast(const char *message, i * * \param command user command that must be greater or equal to 0x8000. * \param param user parameter. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendAndroidMessage(Uint32 command, int param); +extern SDL_DECLSPEC bool SDLCALL SDL_SendAndroidMessage(Uint32 command, int param); #endif /* SDL_PLATFORM_ANDROID */ -/* - * Platform specific functions for WinRT - */ -#ifdef SDL_PLATFORM_WINRT - -/** - * WinRT / Windows Phone path types - * - * \since This enum is available since SDL 3.0.0. - */ -typedef enum SDL_WinRT_Path -{ - /** The installed app's root directory. - Files here are likely to be read-only. */ - SDL_WINRT_PATH_INSTALLED_LOCATION, - - /** The app's local data store. Files may be written here */ - SDL_WINRT_PATH_LOCAL_FOLDER, - - /** 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, - - /** 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; - - -/** - * WinRT Device Family - * - * \since This enum is available since SDL 3.0.0. - */ -typedef enum SDL_WinRT_DeviceFamily -{ - /** Unknown family */ - SDL_WINRT_DEVICEFAMILY_UNKNOWN, - - /** Desktop family*/ - SDL_WINRT_DEVICEFAMILY_DESKTOP, - - /** Mobile family (for example smartphone) */ - SDL_WINRT_DEVICEFAMILY_MOBILE, - - /** 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 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 3.0.0. - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetWinRTFSPath(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 3.0.0. - */ -extern SDL_DECLSPEC SDL_WinRT_DeviceFamily SDLCALL SDL_GetWinRTDeviceFamily(); - -#endif /* SDL_PLATFORM_WINRT */ - /** * Query if the current device is a tablet. * - * If SDL can't determine this, it will return SDL_FALSE. + * If SDL can't determine this, it will return false. * - * \returns SDL_TRUE if the device is a tablet, SDL_FALSE otherwise. + * \returns true if the device is a tablet, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsTablet(void); +extern SDL_DECLSPEC bool SDLCALL SDL_IsTablet(void); + +/** + * Query if the current device is a TV. + * + * If SDL can't determine this, it will return false. + * + * \returns true if the device is a TV, false otherwise. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_IsTV(void); + +/** + * Application sandbox environment. + * + * \since This enum is available since SDL 3.2.0. + */ +typedef enum SDL_Sandbox +{ + SDL_SANDBOX_NONE = 0, + SDL_SANDBOX_UNKNOWN_CONTAINER, + SDL_SANDBOX_FLATPAK, + SDL_SANDBOX_SNAP, + SDL_SANDBOX_MACOS +} SDL_Sandbox; + +/** + * Get the application sandbox environment, if any. + * + * \returns the application sandbox environment or SDL_SANDBOX_NONE if the + * application is not running in a sandbox environment. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC SDL_Sandbox SDLCALL SDL_GetSandbox(void); + /* Functions used by iOS app delegates to notify SDL about state changes. */ @@ -669,7 +660,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsTablet(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillTerminate(void); @@ -686,7 +677,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillTerminate(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidReceiveMemoryWarning(void); @@ -703,7 +694,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidReceiveMemoryWarning(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterBackground(void); @@ -720,7 +711,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterBackground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterBackground(void); @@ -737,7 +728,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterBackground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterForeground(void); @@ -754,7 +745,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterForeground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterForeground(void); @@ -773,7 +764,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterForeground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidChangeStatusBarOrientation(void); #endif @@ -794,12 +785,12 @@ typedef struct XUser *XUserHandle; * leak. * * \param outTaskQueue a pointer to be filled in with task queue handle. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGDKTaskQueue(XTaskQueueHandle *outTaskQueue); +extern SDL_DECLSPEC bool SDLCALL SDL_GetGDKTaskQueue(XTaskQueueHandle *outTaskQueue); /** * Gets a reference to the default user handle for GDK. @@ -809,12 +800,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGDKTaskQueue(XTaskQueueHandle *outTa * * \param outUserHandle a pointer to be filled in with the default user * handle. - * \returns SDL_TRUE if success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true if success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGDKDefaultUser(XUserHandle *outUserHandle); +extern SDL_DECLSPEC bool SDLCALL SDL_GetGDKDefaultUser(XUserHandle *outUserHandle); #endif diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_thread.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_thread.h index 0fdc8a0..277535f 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_thread.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_thread.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -25,7 +25,19 @@ /** * # CategoryThread * - * SDL thread management routines. + * SDL offers cross-platform thread management functions. These are mostly + * concerned with starting threads, setting their priority, and dealing with + * their termination. + * + * In addition, there is support for Thread Local Storage (data that is unique + * to each thread, but accessed from a single key). + * + * On platforms without thread support (such as Emscripten when built without + * pthreads), these functions still exist, but things like SDL_CreateThread() + * will report failure without doing anything. + * + * If you're going to work with threads, you almost certainly need to have a + * good understanding of [CategoryMutex](CategoryMutex) as well. */ #include @@ -34,9 +46,8 @@ /* Thread synchronization primitives */ #include -#include -#if (defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK)) && !defined(SDL_PLATFORM_WINRT) +#if defined(SDL_PLATFORM_WINDOWS) #include /* _beginthreadex() and _endthreadex() */ #endif @@ -51,7 +62,7 @@ extern "C" { * * These are opaque data. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_WaitThread @@ -65,7 +76,7 @@ typedef struct SDL_Thread SDL_Thread; * application will operate on, but having a way to uniquely identify a thread * can be useful at times. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetThreadID * \sa SDL_GetCurrentThreadID @@ -78,7 +89,7 @@ typedef Uint64 SDL_ThreadID; * 0 is the invalid ID. An app can create these and then set data for these * IDs that is unique to each thread. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetTLS * \sa SDL_SetTLS @@ -90,11 +101,11 @@ typedef SDL_AtomicInt SDL_TLSID; * * 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. + * should be aware that calling SDL_SetCurrentThreadPriority may alter such + * state. SDL_HINT_THREAD_PRIORITY_POLICY can be used to control aspects of + * this behavior. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ThreadPriority { SDL_THREAD_PRIORITY_LOW, @@ -103,13 +114,30 @@ typedef enum SDL_ThreadPriority { SDL_THREAD_PRIORITY_TIME_CRITICAL } SDL_ThreadPriority; +/** + * The SDL thread state. + * + * The current state of a thread can be checked by calling SDL_GetThreadState. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_GetThreadState + */ +typedef enum SDL_ThreadState +{ + SDL_THREAD_UNKNOWN, /**< The thread is not valid */ + SDL_THREAD_ALIVE, /**< The thread is currently running */ + SDL_THREAD_DETACHED, /**< The thread is detached and can't be waited on */ + SDL_THREAD_COMPLETE /**< The thread has finished and should be cleaned up with SDL_WaitThread() */ +} SDL_ThreadState; + /** * The function passed to SDL_CreateThread() as the new thread's entry point. * * \param data what was passed as `data` to SDL_CreateThread(). * \returns a value that can be reported through SDL_WaitThread(). * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef int (SDLCALL * SDL_ThreadFunction) (void *data); @@ -179,7 +207,7 @@ typedef int (SDLCALL * SDL_ThreadFunction) (void *data); * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThreadWithProperties * \sa SDL_WaitThread @@ -245,7 +273,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(SDL_ThreadFunction fn, * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_WaitThread @@ -263,7 +291,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithProperties(SDL_Prop /* The real implementation, hidden from the wiki, so it can show this as real functions that don't have macro magic. */ #ifndef SDL_WIKI_DOCUMENTATION_SECTION -# if (defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK)) && !defined(SDL_PLATFORM_WINRT) +# if defined(SDL_PLATFORM_WINDOWS) # ifndef SDL_BeginThreadFunction # define SDL_BeginThreadFunction _beginthreadex # endif @@ -300,7 +328,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithProperties(SDL_Prop * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadRuntime(SDL_ThreadFunction fn, const char *name, void *data, SDL_FunctionPointer pfnBeginThread, SDL_FunctionPointer pfnEndThread); @@ -314,7 +342,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadRuntime(SDL_ThreadFunct * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithPropertiesRuntime(SDL_PropertiesID props, SDL_FunctionPointer pfnBeginThread, SDL_FunctionPointer pfnEndThread); @@ -334,7 +362,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithPropertiesRuntime(S * \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 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetThreadName(SDL_Thread *thread); @@ -350,7 +378,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetThreadName(SDL_Thread *thread); * * \returns the ID of the current thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetThreadID */ @@ -367,7 +395,7 @@ extern SDL_DECLSPEC SDL_ThreadID SDLCALL SDL_GetCurrentThreadID(void); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCurrentThreadID */ @@ -381,25 +409,25 @@ extern SDL_DECLSPEC SDL_ThreadID SDLCALL SDL_GetThreadID(SDL_Thread *thread); * an administrator account. Be prepared for this to fail. * * \param priority the SDL_ThreadPriority to set. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority priority); +extern SDL_DECLSPEC bool SDLCALL SDL_SetCurrentThreadPriority(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. + * Threads that haven't been detached will remain 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. + * The return code from 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 @@ -412,17 +440,30 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority pr * * \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. + * \param status a pointer filled in with the value returned from the thread + * function by its 'return', or -1 if the thread has been + * detached or isn't valid, may be NULL. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_DetachThread */ extern SDL_DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status); +/** + * Get the current state of a thread. + * + * \param thread the thread to query. + * \returns the current state of a thread, or SDL_THREAD_UNKNOWN if the thread + * isn't valid. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ThreadState + */ +extern SDL_DECLSPEC SDL_ThreadState SDLCALL SDL_GetThreadState(SDL_Thread *thread); + /** * Let a thread clean up on exit without intervention. * @@ -452,7 +493,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status) * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_WaitThread @@ -468,7 +509,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DetachThread(SDL_Thread *thread); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTLS */ @@ -481,7 +522,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetTLS(SDL_TLSID *id); * * \param value a pointer previously handed to SDL_SetTLS. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetTLS */ @@ -504,16 +545,16 @@ typedef void (SDLCALL *SDL_TLSDestructorCallback)(void *value); * \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, may be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTLS */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTLS(SDL_TLSID *id, const void *value, SDL_TLSDestructorCallback destructor); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTLS(SDL_TLSID *id, const void *value, SDL_TLSDestructorCallback destructor); /** * Cleanup all TLS data for this thread. @@ -524,7 +565,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTLS(SDL_TLSID *id, const void *value * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CleanupTLS(void); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_time.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_time.h index 86c1fad..b6d3f6d 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_time.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_time.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer -Copyright (C) 1997-2024 Sam Lantinga +Copyright (C) 1997-2025 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 @@ -26,6 +26,14 @@ freely, subject to the following restrictions: * # CategoryTime * * SDL realtime clock and date/time routines. + * + * There are two data types that are used in this category: SDL_Time, which + * represents the nanoseconds since a specific moment (an "epoch"), and + * SDL_DateTime, which breaks time down into human-understandable components: + * years, months, days, hours, etc. + * + * Much of the functionality is involved in converting those two types to + * other useful forms. */ #include @@ -41,7 +49,7 @@ extern "C" { * A structure holding a calendar date and time broken down into its * components. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_DateTime { @@ -59,7 +67,7 @@ typedef struct SDL_DateTime /** * The preferred date format of the current system locale. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetDateTimeLocalePreferences */ @@ -73,7 +81,7 @@ typedef enum SDL_DateFormat /** * The preferred time format of the current system locale. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetDateTimeLocalePreferences */ @@ -95,24 +103,24 @@ typedef enum SDL_TimeFormat * format, may be NULL. * \param timeFormat a pointer to the SDL_TimeFormat to hold the returned time * format, may be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDateTimeLocalePreferences(SDL_DateFormat *dateFormat, SDL_TimeFormat *timeFormat); +extern SDL_DECLSPEC bool SDLCALL SDL_GetDateTimeLocalePreferences(SDL_DateFormat *dateFormat, SDL_TimeFormat *timeFormat); /** * Gets the current value of the system realtime clock in nanoseconds since * Jan 1, 1970 in Universal Coordinated Time (UTC). * * \param ticks the SDL_Time to hold the returned tick count. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCurrentTime(SDL_Time *ticks); +extern SDL_DECLSPEC bool SDLCALL SDL_GetCurrentTime(SDL_Time *ticks); /** * Converts an SDL_Time in nanoseconds since the epoch to a calendar time in @@ -123,12 +131,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCurrentTime(SDL_Time *ticks); * \param localTime the resulting SDL_DateTime will be expressed in local time * if true, otherwise it will be in Universal Coordinated * Time (UTC). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TimeToDateTime(SDL_Time ticks, SDL_DateTime *dt, SDL_bool localTime); +extern SDL_DECLSPEC bool SDLCALL SDL_TimeToDateTime(SDL_Time ticks, SDL_DateTime *dt, bool localTime); /** * Converts a calendar time to an SDL_Time in nanoseconds since the epoch. @@ -138,12 +146,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TimeToDateTime(SDL_Time ticks, SDL_Date * * \param dt the source SDL_DateTime. * \param ticks the resulting SDL_Time. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DateTimeToTime(const SDL_DateTime *dt, SDL_Time *ticks); +extern SDL_DECLSPEC bool SDLCALL SDL_DateTimeToTime(const SDL_DateTime *dt, SDL_Time *ticks); /** * Converts an SDL time into a Windows FILETIME (100-nanosecond intervals @@ -157,7 +165,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DateTimeToTime(const SDL_DateTime *dt, * \param dwHighDateTime a pointer filled in with the high portion of the * Windows FILETIME value. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_TimeToWindows(SDL_Time ticks, Uint32 *dwLowDateTime, Uint32 *dwHighDateTime); @@ -172,7 +180,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_TimeToWindows(SDL_Time ticks, Uint32 *dwLow * \param dwHighDateTime the high portion of the Windows FILETIME value. * \returns the converted SDL time. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Time SDLCALL SDL_TimeFromWindows(Uint32 dwLowDateTime, Uint32 dwHighDateTime); @@ -184,7 +192,7 @@ extern SDL_DECLSPEC SDL_Time SDLCALL SDL_TimeFromWindows(Uint32 dwLowDateTime, U * \returns the number of days in the requested month or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDaysInMonth(int year, int month); @@ -197,7 +205,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDaysInMonth(int year, int month); * \returns the day of year [0-365] if the date is valid or -1 on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfYear(int year, int month, int day); @@ -210,7 +218,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfYear(int year, int month, int day); * \returns a value between 0 and 6 (0 being Sunday) if the date is valid or * -1 on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfWeek(int year, int month, int day); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_timer.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_timer.h index 9d05161..cf94881 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_timer.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_timer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -25,7 +25,20 @@ /** * # CategoryTimer * - * SDL time management routines. + * SDL provides time management functionality. It is useful for dealing with + * (usually) small durations of time. + * + * This is not to be confused with _calendar time_ management, which is + * provided by [CategoryTime](CategoryTime). + * + * This category covers measuring time elapsed (SDL_GetTicks(), + * SDL_GetPerformanceCounter()), putting a thread to sleep for a certain + * amount of time (SDL_Delay(), SDL_DelayNS(), SDL_DelayPrecise()), and firing + * a callback function after a certain amount of time has elasped + * (SDL_AddTimer(), etc). + * + * There are also useful macros to convert between time units, like + * SDL_SECONDS_TO_NS() and such. */ #include @@ -38,16 +51,137 @@ extern "C" { #endif /* SDL time constants */ + +/** + * Number of milliseconds in a second. + * + * This is always 1000. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_MS_PER_SECOND 1000 + +/** + * Number of microseconds in a second. + * + * This is always 1000000. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_US_PER_SECOND 1000000 + +/** + * Number of nanoseconds in a second. + * + * This is always 1000000000. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_PER_SECOND 1000000000LL + +/** + * Number of nanoseconds in a millisecond. + * + * This is always 1000000. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_PER_MS 1000000 + +/** + * Number of nanoseconds in a microsecond. + * + * This is always 1000. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_PER_US 1000 + +/** + * Convert seconds to nanoseconds. + * + * This only converts whole numbers, not fractional seconds. + * + * \param S the number of seconds to convert. + * \returns S, expressed in nanoseconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_SECONDS_TO_NS(S) (((Uint64)(S)) * SDL_NS_PER_SECOND) + +/** + * Convert nanoseconds to seconds. + * + * This performs a division, so the results can be dramatically different if + * `NS` is an integer or floating point value. + * + * \param NS the number of nanoseconds to convert. + * \returns NS, expressed in seconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_TO_SECONDS(NS) ((NS) / SDL_NS_PER_SECOND) + +/** + * Convert milliseconds to nanoseconds. + * + * This only converts whole numbers, not fractional milliseconds. + * + * \param MS the number of milliseconds to convert. + * \returns MS, expressed in nanoseconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_MS_TO_NS(MS) (((Uint64)(MS)) * SDL_NS_PER_MS) + +/** + * Convert nanoseconds to milliseconds. + * + * This performs a division, so the results can be dramatically different if + * `NS` is an integer or floating point value. + * + * \param NS the number of nanoseconds to convert. + * \returns NS, expressed in milliseconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_TO_MS(NS) ((NS) / SDL_NS_PER_MS) + +/** + * Convert microseconds to nanoseconds. + * + * This only converts whole numbers, not fractional microseconds. + * + * \param US the number of microseconds to convert. + * \returns US, expressed in nanoseconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_US_TO_NS(US) (((Uint64)(US)) * SDL_NS_PER_US) + +/** + * Convert nanoseconds to microseconds. + * + * This performs a division, so the results can be dramatically different if + * `NS` is an integer or floating point value. + * + * \param NS the number of nanoseconds to convert. + * \returns NS, expressed in microseconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_TO_US(NS) ((NS) / SDL_NS_PER_US) /** @@ -56,7 +190,9 @@ extern "C" { * \returns an unsigned 64-bit value representing the number of milliseconds * since the SDL library initialized. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicks(void); @@ -66,7 +202,9 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicks(void); * \returns an unsigned 64-bit value representing the number of nanoseconds * since the SDL library initialized. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicksNS(void); @@ -81,7 +219,9 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicksNS(void); * * \returns the current counter value. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPerformanceFrequency */ @@ -92,7 +232,9 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetPerformanceCounter(void); * * \returns a platform-specific count per second. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPerformanceCounter */ @@ -107,10 +249,33 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetPerformanceFrequency(void); * * \param ms the number of milliseconds to delay. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_DelayNS + * \sa SDL_DelayPrecise */ extern SDL_DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); +/** + * Wait a specified number of nanoseconds before returning. + * + * This function waits a specified number of nanoseconds before returning. It + * waits at least the specified time, but possibly longer due to OS + * scheduling. + * + * \param ns the number of nanoseconds to delay. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_Delay + * \sa SDL_DelayPrecise + */ +extern SDL_DECLSPEC void SDLCALL SDL_DelayNS(Uint64 ns); + /** * Wait a specified number of nanoseconds before returning. * @@ -120,14 +285,19 @@ extern SDL_DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); * * \param ns the number of nanoseconds to delay. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_Delay + * \sa SDL_DelayNS */ -extern SDL_DECLSPEC void SDLCALL SDL_DelayNS(Uint64 ns); +extern SDL_DECLSPEC void SDLCALL SDL_DelayPrecise(Uint64 ns); /** * Definition of the timer ID type. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_TimerID; @@ -151,7 +321,7 @@ typedef Uint32 SDL_TimerID; * thread; the application is responsible for locking resources * the callback touches that need to be protected. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_AddTimer */ @@ -160,8 +330,6 @@ typedef Uint32 (SDLCALL *SDL_TimerCallback)(void *userdata, SDL_TimerID 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 @@ -188,7 +356,7 @@ typedef Uint32 (SDLCALL *SDL_TimerCallback)(void *userdata, SDL_TimerID timerID, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddTimerNS * \sa SDL_RemoveTimer @@ -215,7 +383,7 @@ extern SDL_DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_TimerC * thread; the application is responsible for locking resources * the callback touches that need to be protected. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_AddTimerNS */ @@ -224,8 +392,6 @@ typedef Uint64 (SDLCALL *SDL_NSTimerCallback)(void *userdata, SDL_TimerID timerI /** * 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_AddTimerNS() call and should return the * next timer interval. If the value returned from the callback is 0, the @@ -252,7 +418,7 @@ typedef Uint64 (SDLCALL *SDL_NSTimerCallback)(void *userdata, SDL_TimerID timerI * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddTimer * \sa SDL_RemoveTimer @@ -263,14 +429,16 @@ extern SDL_DECLSPEC SDL_TimerID SDLCALL SDL_AddTimerNS(Uint64 interval, SDL_NSTi * Remove a timer created with SDL_AddTimer(). * * \param id the ID of the timer to remove. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddTimer */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID id); +extern SDL_DECLSPEC bool SDLCALL SDL_RemoveTimer(SDL_TimerID id); /* Ends C function definitions when using C++ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_touch.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_touch.h index 6889f36..64845a1 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_touch.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_touch.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,18 @@ /** * # CategoryTouch * - * SDL touch management. + * SDL offers touch input, on platforms that support it. It can manage + * multiple touch devices and track multiple fingers on those devices. + * + * Touches are mostly dealt with through the event system, in the + * SDL_EVENT_FINGER_DOWN, SDL_EVENT_FINGER_MOTION, and SDL_EVENT_FINGER_UP + * events, but there are also functions to query for hardware details, etc. + * + * The touch system, by default, will also send virtual mouse events; this can + * be useful for making a some desktop apps work on a phone without + * significant changes. For apps that care about mouse and touch input + * separately, they should ignore mouse events that have a `which` field of + * SDL_TOUCH_MOUSEID. */ #ifndef SDL_touch_h_ @@ -31,7 +42,6 @@ #include #include #include -#include #include /* Set up for C function definitions, even when using C++ */ @@ -39,25 +49,53 @@ extern "C" { #endif +/** + * A unique ID for a touch device. + * + * This ID is valid for the time the device is connected to the system, and is + * never reused for the lifetime of the application. + * + * The value 0 is an invalid ID. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef Uint64 SDL_TouchID; + +/** + * A unique ID for a single finger on a touch device. + * + * This ID is valid for the time the finger (stylus, etc) is touching and will + * be unique for all fingers currently in contact, so this ID tracks the + * lifetime of a single continuous touch. This value may represent an index, a + * pointer, or some other unique ID, depending on the platform. + * + * The value 0 is an invalid ID. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef Uint64 SDL_FingerID; +/** + * An enum that describes the type of a touch device. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_TouchDeviceType { 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_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; /** * Data about a single finger in a multitouch event. * - * Each touch even is a collection of fingers that are simultaneously in + * Each touch event is a collection of fingers that are simultaneously in * contact with the touch device (so a "touch" can be a "multitouch," in * reality), and this struct reports details of the specific fingers. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetTouchFingers */ @@ -69,10 +107,18 @@ typedef struct SDL_Finger float pressure; /**< the quantity of pressure applied, normalized (0...1) */ } SDL_Finger; -/* Used as the device ID for mouse events simulated with touch input */ +/** + * The SDL_MouseID for mouse events simulated with touch input. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_TOUCH_MOUSEID ((SDL_MouseID)-1) -/* Used as the SDL_TouchID for touch events simulated with mouse input */ +/** + * The SDL_TouchID for touch events simulated with mouse input. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_MOUSE_TOUCHID ((SDL_TouchID)-1) @@ -89,7 +135,7 @@ typedef struct SDL_Finger * SDL_GetError() for more information. This should be freed with * SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_TouchID * SDLCALL SDL_GetTouchDevices(int *count); @@ -100,7 +146,7 @@ extern SDL_DECLSPEC SDL_TouchID * SDLCALL SDL_GetTouchDevices(int *count); * \returns touch device name, or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetTouchDeviceName(SDL_TouchID touchID); @@ -110,7 +156,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetTouchDeviceName(SDL_TouchID touc * \param touchID the ID of a touch device. * \returns touch device type. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_TouchID touchID); @@ -125,7 +171,7 @@ extern SDL_DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_Touch * allocation that should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Finger ** SDLCALL SDL_GetTouchFingers(SDL_TouchID touchID, int *count); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_tray.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_tray.h new file mode 100644 index 0000000..0b05db2 --- /dev/null +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_tray.h @@ -0,0 +1,544 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 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. +*/ + +/** + * # CategoryTray + * + * SDL offers a way to add items to the "system tray" (more correctly called + * the "notification area" on Windows). On platforms that offer this concept, + * an SDL app can add a tray icon, submenus, checkboxes, and clickable + * entries, and register a callback that is fired when the user clicks on + * these pieces. + */ + +#ifndef SDL_tray_h_ +#define SDL_tray_h_ + +#include +#include +#include +#include + +#include +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * An opaque handle representing a toplevel system tray object. + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_Tray SDL_Tray; + +/** + * An opaque handle representing a menu/submenu on a system tray object. + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_TrayMenu SDL_TrayMenu; + +/** + * An opaque handle representing an entry on a system tray object. + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_TrayEntry SDL_TrayEntry; + +/** + * Flags that control the creation of system tray entries. + * + * Some of these flags are required; exactly one of them must be specified at + * the time a tray entry is created. Other flags are optional; zero or more of + * those can be OR'ed together with the required flag. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_InsertTrayEntryAt + */ +typedef Uint32 SDL_TrayEntryFlags; + +#define SDL_TRAYENTRY_BUTTON 0x00000001u /**< Make the entry a simple button. Required. */ +#define SDL_TRAYENTRY_CHECKBOX 0x00000002u /**< Make the entry a checkbox. Required. */ +#define SDL_TRAYENTRY_SUBMENU 0x00000004u /**< Prepare the entry to have a submenu. Required */ +#define SDL_TRAYENTRY_DISABLED 0x80000000u /**< Make the entry disabled. Optional. */ +#define SDL_TRAYENTRY_CHECKED 0x40000000u /**< Make the entry checked. This is valid only for checkboxes. Optional. */ + +/** + * A callback that is invoked when a tray entry is selected. + * + * \param userdata an optional pointer to pass extra data to the callback when + * it will be invoked. + * \param entry the tray entry that was selected. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_SetTrayEntryCallback + */ +typedef void (SDLCALL *SDL_TrayCallback)(void *userdata, SDL_TrayEntry *entry); + +/** + * Create an icon to be placed in the operating system's tray, or equivalent. + * + * Many platforms advise not using a system tray unless persistence is a + * necessary feature. Avoid needlessly creating a tray icon, as the user may + * feel like it clutters their interface. + * + * Using tray icons require the video subsystem. + * + * \param icon a surface to be used as icon. May be NULL. + * \param tooltip a tooltip to be displayed when the mouse hovers the icon in + * UTF-8 encoding. Not supported on all platforms. May be NULL. + * \returns The newly created system tray icon. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTrayMenu + * \sa SDL_GetTrayMenu + * \sa SDL_DestroyTray + */ +extern SDL_DECLSPEC SDL_Tray *SDLCALL SDL_CreateTray(SDL_Surface *icon, const char *tooltip); + +/** + * Updates the system tray icon's icon. + * + * \param tray the tray icon to be updated. + * \param icon the new icon. May be NULL. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTray + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *icon); + +/** + * Updates the system tray icon's tooltip. + * + * \param tray the tray icon to be updated. + * \param tooltip the new tooltip in UTF-8 encoding. May be NULL. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTray + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayTooltip(SDL_Tray *tray, const char *tooltip); + +/** + * Create a menu for a system tray. + * + * This should be called at most once per tray icon. + * + * This function does the same thing as SDL_CreateTraySubmenu(), except that + * it takes a SDL_Tray instead of a SDL_TrayEntry. + * + * A menu does not need to be destroyed; it will be destroyed with the tray. + * + * \param tray the tray to bind the menu to. + * \returns the newly created menu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTray + * \sa SDL_GetTrayMenu + * \sa SDL_GetTrayMenuParentTray + */ +extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_CreateTrayMenu(SDL_Tray *tray); + +/** + * Create a submenu for a system tray entry. + * + * This should be called at most once per tray entry. + * + * This function does the same thing as SDL_CreateTrayMenu, except that it + * takes a SDL_TrayEntry instead of a SDL_Tray. + * + * A menu does not need to be destroyed; it will be destroyed with the tray. + * + * \param entry the tray entry to bind the menu to. + * \returns the newly created menu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_InsertTrayEntryAt + * \sa SDL_GetTraySubmenu + * \sa SDL_GetTrayMenuParentEntry + */ +extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_CreateTraySubmenu(SDL_TrayEntry *entry); + +/** + * Gets a previously created tray menu. + * + * You should have called SDL_CreateTrayMenu() on the tray object. This + * function allows you to fetch it again later. + * + * This function does the same thing as SDL_GetTraySubmenu(), except that it + * takes a SDL_Tray instead of a SDL_TrayEntry. + * + * A menu does not need to be destroyed; it will be destroyed with the tray. + * + * \param tray the tray entry to bind the menu to. + * \returns the newly created menu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTray + * \sa SDL_CreateTrayMenu + */ +extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_GetTrayMenu(SDL_Tray *tray); + +/** + * Gets a previously created tray entry submenu. + * + * You should have called SDL_CreateTraySubmenu() on the entry object. This + * function allows you to fetch it again later. + * + * This function does the same thing as SDL_GetTrayMenu(), except that it + * takes a SDL_TrayEntry instead of a SDL_Tray. + * + * A menu does not need to be destroyed; it will be destroyed with the tray. + * + * \param entry the tray entry to bind the menu to. + * \returns the newly created menu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_InsertTrayEntryAt + * \sa SDL_CreateTraySubmenu + */ +extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_GetTraySubmenu(SDL_TrayEntry *entry); + +/** + * Returns a list of entries in the menu, in order. + * + * \param menu The menu to get entries from. + * \param size An optional pointer to obtain the number of entries in the + * menu. + * \returns a NULL-terminated list of entries within the given menu. The + * pointer becomes invalid when any function that inserts or deletes + * entries in the menu is called. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_RemoveTrayEntry + * \sa SDL_InsertTrayEntryAt + */ +extern SDL_DECLSPEC const SDL_TrayEntry **SDLCALL SDL_GetTrayEntries(SDL_TrayMenu *menu, int *size); + +/** + * Removes a tray entry. + * + * \param entry The entry to be deleted. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + */ +extern SDL_DECLSPEC void SDLCALL SDL_RemoveTrayEntry(SDL_TrayEntry *entry); + +/** + * Insert a tray entry at a given position. + * + * If label is NULL, the entry will be a separator. Many functions won't work + * for an entry that is a separator. + * + * An entry does not need to be destroyed; it will be destroyed with the tray. + * + * \param menu the menu to append the entry to. + * \param pos the desired position for the new entry. Entries at or following + * this place will be moved. If pos is -1, the entry is appended. + * \param label the text to be displayed on the entry, in UTF-8 encoding, or + * NULL for a separator. + * \param flags a combination of flags, some of which are mandatory. + * \returns the newly created entry, or NULL if pos is out of bounds. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_TrayEntryFlags + * \sa SDL_GetTrayEntries + * \sa SDL_RemoveTrayEntry + * \sa SDL_GetTrayEntryParent + */ +extern SDL_DECLSPEC SDL_TrayEntry *SDLCALL SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *label, SDL_TrayEntryFlags flags); + +/** + * Sets the label of an entry. + * + * An entry cannot change between a separator and an ordinary entry; that is, + * it is not possible to set a non-NULL label on an entry that has a NULL + * label (separators), or to set a NULL label to an entry that has a non-NULL + * label. The function will silently fail if that happens. + * + * \param entry the entry to be updated. + * \param label the new label for the entry in UTF-8 encoding. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_GetTrayEntryLabel + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryLabel(SDL_TrayEntry *entry, const char *label); + +/** + * Gets the label of an entry. + * + * If the returned value is NULL, the entry is a separator. + * + * \param entry the entry to be read. + * \returns the label of the entry in UTF-8 encoding. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_SetTrayEntryLabel + */ +extern SDL_DECLSPEC const char *SDLCALL SDL_GetTrayEntryLabel(SDL_TrayEntry *entry); + +/** + * Sets whether or not an entry is checked. + * + * The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag. + * + * \param entry the entry to be updated. + * \param checked true if the entry should be checked; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_GetTrayEntryChecked + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryChecked(SDL_TrayEntry *entry, bool checked); + +/** + * Gets whether or not an entry is checked. + * + * The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag. + * + * \param entry the entry to be read. + * \returns true if the entry is checked; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_SetTrayEntryChecked + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GetTrayEntryChecked(SDL_TrayEntry *entry); + +/** + * Sets whether or not an entry is enabled. + * + * \param entry the entry to be updated. + * \param enabled true if the entry should be enabled; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_GetTrayEntryEnabled + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryEnabled(SDL_TrayEntry *entry, bool enabled); + +/** + * Gets whether or not an entry is enabled. + * + * \param entry the entry to be read. + * \returns true if the entry is enabled; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_SetTrayEntryEnabled + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GetTrayEntryEnabled(SDL_TrayEntry *entry); + +/** + * Sets a callback to be invoked when the entry is selected. + * + * \param entry the entry to be updated. + * \param callback a callback to be invoked when the entry is selected. + * \param userdata an optional pointer to pass extra data to the callback when + * it will be invoked. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryCallback(SDL_TrayEntry *entry, SDL_TrayCallback callback, void *userdata); + +/** + * Simulate a click on a tray entry. + * + * \param entry The entry to activate. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_ClickTrayEntry(SDL_TrayEntry *entry); + +/** + * Destroys a tray object. + * + * This also destroys all associated menus and entries. + * + * \param tray the tray icon to be destroyed. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTray + */ +extern SDL_DECLSPEC void SDLCALL SDL_DestroyTray(SDL_Tray *tray); + +/** + * Gets the menu containing a certain tray entry. + * + * \param entry the entry for which to get the parent menu. + * \returns the parent menu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_InsertTrayEntryAt + */ +extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_GetTrayEntryParent(SDL_TrayEntry *entry); + +/** + * Gets the entry for which the menu is a submenu, if the current menu is a + * submenu. + * + * Either this function or SDL_GetTrayMenuParentTray() will return non-NULL + * for any given menu. + * + * \param menu the menu for which to get the parent entry. + * \returns the parent entry, or NULL if this menu is not a submenu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTraySubmenu + * \sa SDL_GetTrayMenuParentTray + */ +extern SDL_DECLSPEC SDL_TrayEntry *SDLCALL SDL_GetTrayMenuParentEntry(SDL_TrayMenu *menu); + +/** + * Gets the tray for which this menu is the first-level menu, if the current + * menu isn't a submenu. + * + * Either this function or SDL_GetTrayMenuParentEntry() will return non-NULL + * for any given menu. + * + * \param menu the menu for which to get the parent enttrayry. + * \returns the parent tray, or NULL if this menu is a submenu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTrayMenu + * \sa SDL_GetTrayMenuParentEntry + */ +extern SDL_DECLSPEC SDL_Tray *SDLCALL SDL_GetTrayMenuParentTray(SDL_TrayMenu *menu); + +/** + * Update the trays. + * + * This is called automatically by the event loop and is only needed if you're + * using trays but aren't handling SDL events. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_UpdateTrays(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include + +#endif /* SDL_tray_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_version.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_version.h index c0f518d..55014e3 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_version.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_version.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -30,7 +30,6 @@ #define SDL_version_h_ #include -#include #include /* Set up for C function definitions, even when using C++ */ @@ -43,7 +42,7 @@ extern "C" { * * If this were SDL version 3.2.1, this value would be 3. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MAJOR_VERSION 3 @@ -52,18 +51,18 @@ extern "C" { * * If this were SDL version 3.2.1, this value would be 2. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ -#define SDL_MINOR_VERSION 1 +#define SDL_MINOR_VERSION 2 /** * The current micro (or patchlevel) version of the SDL headers. * * If this were SDL version 3.2.1, this value would be 1. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ -#define SDL_MICRO_VERSION 2 +#define SDL_MICRO_VERSION 0 /** * This macro turns the version numbers into a numeric value. @@ -74,7 +73,7 @@ extern "C" { * \param minor the minorversion number. * \param patch the patch version number. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM(major, minor, patch) \ ((major) * 1000000 + (minor) * 1000 + (patch)) @@ -86,7 +85,7 @@ extern "C" { * * \param version the version number. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MAJOR(version) ((version) / 1000000) @@ -97,7 +96,7 @@ extern "C" { * * \param version the version number. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MINOR(version) (((version) / 1000) % 1000) @@ -108,14 +107,16 @@ extern "C" { * * \param version the version number. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MICRO(version) ((version) % 1000) /** * This is the version number macro for the current SDL version. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_GetVersion */ #define SDL_VERSION \ SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_MICRO_VERSION) @@ -123,7 +124,7 @@ extern "C" { /** * This macro will evaluate to true if compiled with SDL at least X.Y.Z. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSION_ATLEAST(X, Y, Z) \ (SDL_VERSION >= SDL_VERSIONNUM(X, Y, Z)) @@ -140,7 +141,7 @@ extern "C" { * * \returns the version of the linked library. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRevision */ @@ -166,7 +167,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetVersion(void); * \returns an arbitrary string, uniquely identifying the exact revision of * the SDL library in use. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetVersion */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_video.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_video.h index 7cce828..a7afc32 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_video.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_video.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,28 @@ /** * # CategoryVideo * - * SDL video functions. + * SDL's video subsystem is largely interested in abstracting window + * management from the underlying operating system. You can create windows, + * manage them in various ways, set them fullscreen, and get events when + * interesting things happen with them, such as the mouse or keyboard + * interacting with a window. + * + * The video subsystem is also interested in abstracting away some + * platform-specific differences in OpenGL: context creation, swapping + * buffers, etc. This may be crucial to your app, but also you are not + * required to use OpenGL at all. In fact, SDL can provide rendering to those + * windows as well, either with an easy-to-use + * [2D API](https://wiki.libsdl.org/SDL3/CategoryRender) + * or with a more-powerful + * [GPU API](https://wiki.libsdl.org/SDL3/CategoryGPU) + * . Of course, it can simply get out of your way and give you the window + * handles you need to use Vulkan, Direct3D, Metal, or whatever else you like + * directly, too. + * + * The video subsystem covers a lot of functionality, out of necessity, so it + * is worth perusing the list of functions just to see what's available, but + * most apps can get by with simply creating a window and listening for + * events, so start with SDL_CreateWindow() and SDL_PollEvent(). */ #ifndef SDL_video_h_ @@ -49,7 +70,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_DisplayID; @@ -58,7 +79,7 @@ typedef Uint32 SDL_DisplayID; * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_WindowID; @@ -82,7 +103,7 @@ typedef Uint32 SDL_WindowID; /** * System theme. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_SystemTheme { @@ -91,13 +112,21 @@ typedef enum SDL_SystemTheme SDL_SYSTEM_THEME_DARK /**< Dark colored system theme */ } SDL_SystemTheme; -/* Internal display mode data */ +/** + * Internal display mode data. + * + * This lives as a field in SDL_DisplayMode, as opaque data. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_DisplayMode + */ typedef struct SDL_DisplayModeData SDL_DisplayModeData; /** * The structure that defines a display mode. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetFullscreenDisplayModes * \sa SDL_GetDesktopDisplayMode @@ -123,7 +152,7 @@ typedef struct SDL_DisplayMode /** * Display orientation values; the way a display is rotated. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_DisplayOrientation { @@ -137,7 +166,7 @@ typedef enum SDL_DisplayOrientation /** * The struct used as an opaque handle to a window. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateWindow */ @@ -151,7 +180,7 @@ typedef struct SDL_Window SDL_Window; * changed on existing windows by the app, and some of it might be altered by * the user or system outside of the app's control. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ @@ -185,31 +214,91 @@ typedef Uint64 SDL_WindowFlags; /** - * Used to indicate that you don't care what the window position is. + * A magic value used with SDL_WINDOWPOS_UNDEFINED. * - * \since This macro is available since SDL 3.0.0. + * Generally this macro isn't used directly, but rather through + * SDL_WINDOWPOS_UNDEFINED or SDL_WINDOWPOS_UNDEFINED_DISPLAY. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINDOWPOS_UNDEFINED_MASK 0x1FFF0000u + +/** + * Used to indicate that you don't care what the window position is. + * + * If you _really_ don't care, SDL_WINDOWPOS_UNDEFINED is the same, but always + * uses the primary display instead of specifying one. + * + * \param X the SDL_DisplayID of the display to use. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_WINDOWPOS_UNDEFINED_DISPLAY(X) (SDL_WINDOWPOS_UNDEFINED_MASK|(X)) + +/** + * Used to indicate that you don't care what the window position/display is. + * + * This always uses the primary display. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_WINDOWPOS_UNDEFINED SDL_WINDOWPOS_UNDEFINED_DISPLAY(0) -#define SDL_WINDOWPOS_ISUNDEFINED(X) \ - (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK) + +/** + * A macro to test if the window position is marked as "undefined." + * + * \param X the window position value. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_WINDOWPOS_ISUNDEFINED(X) (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK) + +/** + * A magic value used with SDL_WINDOWPOS_CENTERED. + * + * Generally this macro isn't used directly, but rather through + * SDL_WINDOWPOS_CENTERED or SDL_WINDOWPOS_CENTERED_DISPLAY. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_WINDOWPOS_CENTERED_MASK 0x2FFF0000u /** * Used to indicate that the window position should be centered. * - * \since This macro is available since SDL 3.0.0. + * SDL_WINDOWPOS_CENTERED is the same, but always uses the primary display + * instead of specifying one. + * + * \param X the SDL_DisplayID of the display to use. + * + * \since This macro is available since SDL 3.2.0. */ -#define SDL_WINDOWPOS_CENTERED_MASK 0x2FFF0000u #define SDL_WINDOWPOS_CENTERED_DISPLAY(X) (SDL_WINDOWPOS_CENTERED_MASK|(X)) + +/** + * Used to indicate that the window position should be centered. + * + * This always uses the primary display. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_WINDOWPOS_CENTERED SDL_WINDOWPOS_CENTERED_DISPLAY(0) + +/** + * A macro to test if the window position is marked as "centered." + * + * \param X the window position value. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_WINDOWPOS_ISCENTERED(X) \ (((X)&0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK) + /** * Window flash operation. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_FlashOperation { @@ -221,30 +310,102 @@ typedef enum SDL_FlashOperation /** * An opaque handle to an OpenGL context. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GL_CreateContext */ typedef struct SDL_GLContextState *SDL_GLContext; /** - * Opaque EGL types. + * Opaque type for an EGL display. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef void *SDL_EGLDisplay; + +/** + * Opaque type for an EGL config. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef void *SDL_EGLConfig; + +/** + * Opaque type for an EGL surface. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef void *SDL_EGLSurface; + +/** + * An EGL attribute, used when creating an EGL context. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef intptr_t SDL_EGLAttrib; + +/** + * An EGL integer attribute, used when creating an EGL surface. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef int SDL_EGLint; /** - * EGL attribute initialization callback types. + * EGL platform attribute initialization callback. * - * \since This datatype is available since SDL 3.0.0. + * This is called when SDL is attempting to create an EGL context, to let the + * app add extra attributes to its eglGetPlatformDisplay() call. + * + * The callback should return a pointer to an EGL attribute array terminated + * with `EGL_NONE`. If this function returns NULL, the SDL_CreateWindow + * process will fail gracefully. + * + * The returned pointer should be allocated with SDL_malloc() and will be + * passed to SDL_free(). + * + * The arrays returned by each callback will be appended to the existing + * attribute arrays defined by SDL. + * + * \param userdata an app-controlled pointer that is passed to the callback. + * \returns a newly-allocated array of attributes, terminated with `EGL_NONE`. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_EGL_SetAttributeCallbacks */ -typedef SDL_EGLAttrib *(SDLCALL *SDL_EGLAttribArrayCallback)(void); -typedef SDL_EGLint *(SDLCALL *SDL_EGLIntArrayCallback)(void); +typedef SDL_EGLAttrib *(SDLCALL *SDL_EGLAttribArrayCallback)(void *userdata); + +/** + * EGL surface/context attribute initialization callback types. + * + * This is called when SDL is attempting to create an EGL surface, to let the + * app add extra attributes to its eglCreateWindowSurface() or + * eglCreateContext calls. + * + * For convenience, the EGLDisplay and EGLConfig to use are provided to the + * callback. + * + * The callback should return a pointer to an EGL attribute array terminated + * with `EGL_NONE`. If this function returns NULL, the SDL_CreateWindow + * process will fail gracefully. + * + * The returned pointer should be allocated with SDL_malloc() and will be + * passed to SDL_free(). + * + * The arrays returned by each callback will be appended to the existing + * attribute arrays defined by SDL. + * + * \param userdata an app-controlled pointer that is passed to the callback. + * \param display the EGL display to be used. + * \param config the EGL config to be used. + * \returns a newly-allocated array of attributes, terminated with `EGL_NONE`. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_EGL_SetAttributeCallbacks + */ +typedef SDL_EGLint *(SDLCALL *SDL_EGLIntArrayCallback)(void *userdata, SDL_EGLDisplay display, SDL_EGLConfig config); /** * An enumeration of OpenGL configuration attributes. @@ -261,9 +422,9 @@ typedef SDL_EGLint *(SDLCALL *SDL_EGLIntArrayCallback)(void); * fail if the GL can't provide your requested attributes at a minimum, but * you should check to see exactly what you got. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ -typedef enum SDL_GLattr +typedef enum SDL_GLAttr { SDL_GL_RED_SIZE, /**< the minimum number of bits for the red channel of the color buffer; defaults to 3. */ SDL_GL_GREEN_SIZE, /**< the minimum number of bits for the green channel of the color buffer; defaults to 3. */ @@ -284,64 +445,64 @@ typedef enum SDL_GLattr SDL_GL_RETAINED_BACKING, /**< not used (deprecated). */ SDL_GL_CONTEXT_MAJOR_VERSION, /**< OpenGL context major version. */ SDL_GL_CONTEXT_MINOR_VERSION, /**< OpenGL context minor version. */ - SDL_GL_CONTEXT_FLAGS, /**< some combination of 0 or more of elements of the SDL_GLcontextFlag enumeration; defaults to 0. */ - SDL_GL_CONTEXT_PROFILE_MASK, /**< type of GL context (Core, Compatibility, ES). See SDL_GLprofile; default value depends on platform. */ + SDL_GL_CONTEXT_FLAGS, /**< some combination of 0 or more of elements of the SDL_GLContextFlag enumeration; defaults to 0. */ + SDL_GL_CONTEXT_PROFILE_MASK, /**< type of GL context (Core, Compatibility, ES). See SDL_GLProfile; default value depends on platform. */ SDL_GL_SHARE_WITH_CURRENT_CONTEXT, /**< OpenGL context sharing; defaults to 0. */ SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, /**< requests sRGB capable visual; defaults to 0. */ - SDL_GL_CONTEXT_RELEASE_BEHAVIOR, /**< sets context the release behavior. See SDL_GLcontextReleaseFlag; defaults to FLUSH. */ + SDL_GL_CONTEXT_RELEASE_BEHAVIOR, /**< sets context the release behavior. See SDL_GLContextReleaseFlag; defaults to FLUSH. */ SDL_GL_CONTEXT_RESET_NOTIFICATION, /**< set context reset notification. See SDL_GLContextResetNotification; defaults to NO_NOTIFICATION. */ SDL_GL_CONTEXT_NO_ERROR, SDL_GL_FLOATBUFFERS, SDL_GL_EGL_PLATFORM -} SDL_GLattr; +} SDL_GLAttr; /** * Possible values to be set for the SDL_GL_CONTEXT_PROFILE_MASK attribute. * - * \since This enum is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ -typedef enum SDL_GLprofile -{ - 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 Uint32 SDL_GLProfile; + +#define SDL_GL_CONTEXT_PROFILE_CORE 0x0001 /**< OpenGL Core Profile context */ +#define SDL_GL_CONTEXT_PROFILE_COMPATIBILITY 0x0002 /**< OpenGL Compatibility Profile context */ +#define SDL_GL_CONTEXT_PROFILE_ES 0x0004 /**< GLX_CONTEXT_ES2_PROFILE_BIT_EXT */ + /** - * Possible values to be set for the SDL_GL_CONTEXT_FLAGS attribute. + * Possible flags to be set for the SDL_GL_CONTEXT_FLAGS attribute. * - * \since This enum is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ -typedef enum SDL_GLcontextFlag -{ - 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 Uint32 SDL_GLContextFlag; + +#define SDL_GL_CONTEXT_DEBUG_FLAG 0x0001 +#define SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG 0x0002 +#define SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG 0x0004 +#define SDL_GL_CONTEXT_RESET_ISOLATION_FLAG 0x0008 + /** * Possible values to be set for the SDL_GL_CONTEXT_RELEASE_BEHAVIOR * attribute. * - * \since This enum is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ -typedef enum SDL_GLcontextReleaseFlag -{ - SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE = 0x0000, - SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x0001 -} SDL_GLcontextReleaseFlag; +typedef Uint32 SDL_GLContextReleaseFlag; + +#define SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE 0x0000 +#define SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x0001 + /** * Possible values to be set SDL_GL_CONTEXT_RESET_NOTIFICATION attribute. * - * \since This enum is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ -typedef enum SDL_GLContextResetNotification -{ - SDL_GL_CONTEXT_RESET_NO_NOTIFICATION = 0x0000, - SDL_GL_CONTEXT_RESET_LOSE_CONTEXT = 0x0001 -} SDL_GLContextResetNotification; +typedef Uint32 SDL_GLContextResetNotification; + +#define SDL_GL_CONTEXT_RESET_NO_NOTIFICATION 0x0000 +#define SDL_GL_CONTEXT_RESET_LOSE_CONTEXT 0x0001 + /* Function prototypes */ @@ -350,7 +511,9 @@ typedef enum SDL_GLContextResetNotification * * \returns the number of built in video drivers. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetVideoDriver */ @@ -369,7 +532,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void); * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumVideoDrivers */ @@ -385,7 +550,9 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetVideoDriver(int index); * \returns the name of the current video driver or NULL if no driver has been * initialized. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumVideoDrivers * \sa SDL_GetVideoDriver @@ -397,7 +564,9 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentVideoDriver(void); * * \returns the current system theme, light, dark, or unknown. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SystemTheme SDLCALL SDL_GetSystemTheme(void); @@ -410,7 +579,9 @@ extern SDL_DECLSPEC SDL_SystemTheme SDLCALL SDL_GetSystemTheme(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_DisplayID * SDLCALL SDL_GetDisplays(int *count); @@ -420,7 +591,9 @@ extern SDL_DECLSPEC SDL_DisplayID * SDLCALL SDL_GetDisplays(int *count); * \returns the instance ID of the primary display on success or 0 on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -448,7 +621,9 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetPrimaryDisplay(void); * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetDisplayProperties(SDL_DisplayID displayID); @@ -462,7 +637,9 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetDisplayProperties(SDL_Displa * \returns the name of a display or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -471,19 +648,22 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetDisplayName(SDL_DisplayID displa /** * Get the desktop area represented by a display. * - * The primary display is always located at (0,0). + * The primary display is often located at (0,0), but may be placed at a + * different location depending on monitor layout. * * \param displayID the instance ID of the display to query. * \param rect the SDL_Rect structure filled in with the display bounds. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayUsableBounds * \sa SDL_GetDisplays */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDisplayBounds(SDL_DisplayID displayID, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetDisplayBounds(SDL_DisplayID displayID, SDL_Rect *rect); /** * Get the usable desktop area represented by a display, in screen @@ -499,15 +679,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDisplayBounds(SDL_DisplayID displayI * * \param displayID the instance ID of the display to query. * \param rect the SDL_Rect structure filled in with the display bounds. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDisplayUsableBounds(SDL_DisplayID displayID, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetDisplayUsableBounds(SDL_DisplayID displayID, SDL_Rect *rect); /** * Get the orientation of a display when it is unrotated. @@ -516,7 +698,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDisplayUsableBounds(SDL_DisplayID di * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -529,7 +713,9 @@ extern SDL_DECLSPEC SDL_DisplayOrientation SDLCALL SDL_GetNaturalDisplayOrientat * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -543,12 +729,21 @@ extern SDL_DECLSPEC SDL_DisplayOrientation SDLCALL SDL_GetCurrentDisplayOrientat * display scale, which means that the user expects UI elements to be twice as * big on this display, to aid in readability. * + * After window creation, SDL_GetWindowDisplayScale() should be used to query + * the content scale factor for individual windows instead of querying the + * display for a window and calling this function, as the per-window content + * scale factor may differ from the base value of the display it is on, + * particularly on high-DPI and/or multi-monitor desktop configurations. + * * \param displayID the instance ID of the display to query. * \returns the content scale of the display, or 0.0f on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetWindowDisplayScale * \sa SDL_GetDisplays */ extern SDL_DECLSPEC float SDLCALL SDL_GetDisplayContentScale(SDL_DisplayID displayID); @@ -573,7 +768,9 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetDisplayContentScale(SDL_DisplayID displ * single allocation that should be freed with SDL_free() when it is * no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -587,7 +784,7 @@ extern SDL_DECLSPEC SDL_DisplayMode ** SDLCALL SDL_GetFullscreenDisplayModes(SDL * 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. + * small, then false is returned. * * \param displayID the instance ID of the display to query. * \param w the width in pixels of the desired display mode. @@ -596,17 +793,19 @@ extern SDL_DECLSPEC SDL_DisplayMode ** SDLCALL SDL_GetFullscreenDisplayModes(SDL * for the desktop refresh rate. * \param include_high_density_modes boolean to include high density modes in * the search. - * \param mode a pointer filled in with the closest display mode equal to or - * larger than the desired mode. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param closest a pointer filled in with the closest display mode equal to + * or larger than the desired mode. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays * \sa SDL_GetFullscreenDisplayModes */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID displayID, int w, int h, float refresh_rate, SDL_bool include_high_density_modes, SDL_DisplayMode *mode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID displayID, int w, int h, float refresh_rate, bool include_high_density_modes, SDL_DisplayMode *closest); /** * Get information about the desktop's display mode. @@ -620,7 +819,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetClosestFullscreenDisplayMode(SDL_Dis * \returns a pointer to the desktop display mode or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCurrentDisplayMode * \sa SDL_GetDisplays @@ -639,7 +840,9 @@ extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetDesktopDisplayMode(SD * \returns a pointer to the desktop display mode or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDesktopDisplayMode * \sa SDL_GetDisplays @@ -653,7 +856,9 @@ extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetCurrentDisplayMode(SD * \returns the instance ID of the display containing the point or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays @@ -668,7 +873,9 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetDisplayForPoint(const SDL_Point * closest to the center of the rect on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays @@ -683,7 +890,9 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetDisplayForRect(const SDL_Rect * * on success or 0 on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays @@ -701,7 +910,9 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetDisplayForWindow(SDL_Window *wi * \returns the pixel density or 0.0f on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowDisplayScale */ @@ -725,7 +936,9 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowPixelDensity(SDL_Window *window); * \returns the display scale, or 0.0f on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowDisplayScale(SDL_Window *window); @@ -743,24 +956,26 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowDisplayScale(SDL_Window *window); * taken effect. * * When the new mode takes effect, an SDL_EVENT_WINDOW_RESIZED and/or an - * SDL_EVENT_WINDOOW_PIXEL_SIZE_CHANGED event will be emitted with the new - * mode dimensions. + * SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event will be emitted with the new mode + * dimensions. * * \param window the window to affect. * \param mode a pointer to the display mode to use, which can be NULL for * borderless fullscreen desktop mode, or one of the fullscreen * modes returned by SDL_GetFullscreenDisplayModes() to set an * exclusive fullscreen mode. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFullscreenMode * \sa SDL_SetWindowFullscreen * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFullscreenMode(SDL_Window *window, const SDL_DisplayMode *mode); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFullscreenMode(SDL_Window *window, const SDL_DisplayMode *mode); /** * Query the display mode to use when a window is visible at fullscreen. @@ -769,7 +984,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFullscreenMode(SDL_Window *win * \returns a pointer to the exclusive fullscreen mode to use or NULL for * borderless fullscreen desktop mode. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowFullscreenMode * \sa SDL_SetWindowFullscreen @@ -785,7 +1002,9 @@ extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetWindowFullscreenMode( * SDL_GetError() for more information. This should be freed with * SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void * SDLCALL SDL_GetWindowICCProfile(SDL_Window *window, size_t *size); @@ -797,7 +1016,9 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetWindowICCProfile(SDL_Window *window, s * SDL_PIXELFORMAT_UNKNOWN on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetWindowPixelFormat(SDL_Window *window); @@ -811,7 +1032,9 @@ extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetWindowPixelFormat(SDL_Window * allocation that should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window ** SDLCALL SDL_GetWindows(int *count); @@ -870,7 +1093,7 @@ extern SDL_DECLSPEC SDL_Window ** SDLCALL SDL_GetWindows(int *count); * 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. + * 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. @@ -890,8 +1113,11 @@ extern SDL_DECLSPEC SDL_Window ** SDLCALL SDL_GetWindows(int *count); * \returns the window that was created or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateWindowAndRenderer * \sa SDL_CreatePopupWindow * \sa SDL_CreateWindowWithProperties * \sa SDL_DestroyWindow @@ -901,36 +1127,41 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, int /** * Create a child popup window of the specified parent window. * - * 'flags' **must** contain exactly one of the following: - - * 'SDL_WINDOW_TOOLTIP': The popup window is a tooltip and will not pass any - * input events. - 'SDL_WINDOW_POPUP_MENU': The popup window is a popup menu. - * The topmost popup menu will implicitly gain the keyboard focus. + * The flags parameter **must** contain at least one of the following: + * + * - `SDL_WINDOW_TOOLTIP`: The popup window is a tooltip and will not pass any + * input events. + * - `SDL_WINDOW_POPUP_MENU`: The popup window is a popup menu. The topmost + * popup menu will implicitly gain the keyboard focus. * * The following flags are not relevant to popup window creation and will be * ignored: * - * - 'SDL_WINDOW_MINIMIZED' - * - 'SDL_WINDOW_MAXIMIZED' - * - 'SDL_WINDOW_FULLSCREEN' - * - 'SDL_WINDOW_BORDERLESS' + * - `SDL_WINDOW_MINIMIZED` + * - `SDL_WINDOW_MAXIMIZED` + * - `SDL_WINDOW_FULLSCREEN` + * - `SDL_WINDOW_BORDERLESS` + * + * The following flags are incompatible with popup window creation and will + * cause it to fail: + * + * - `SDL_WINDOW_UTILITY` + * - `SDL_WINDOW_MODAL` * * The parent parameter **must** be non-null and a valid window. The parent of * a popup window can be either a regular, toplevel window, or another popup * window. * * Popup windows cannot be minimized, maximized, made fullscreen, raised, - * flash, be made a modal window, be the parent of a modal window, or grab the - * mouse and/or keyboard. Attempts to do so will fail. + * flash, be made a modal window, be the parent of a toplevel window, or grab + * the mouse and/or keyboard. Attempts to do so will fail. * * Popup windows implicitly do not have a border/decorations and do not appear * on the taskbar/dock or in lists of windows such as alt-tab menus. * - * If a parent window is hidden, any child popup windows will be recursively - * hidden as well. Child popup windows not explicitly hidden will be restored - * when the parent is shown. - * - * If the parent window is destroyed, any child popup windows will be - * recursively destroyed as well. + * If a parent window is hidden or destroyed, any child popup windows will be + * recursively hidden or destroyed as well. Child popup windows not explicitly + * hidden will be restored when the parent is shown. * * \param parent the parent of the window, must not be NULL. * \param offset_x the x position of the popup window relative to the origin @@ -944,7 +1175,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, int * \returns the window that was created or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateWindow * \sa SDL_CreateWindowWithProperties @@ -987,7 +1220,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * - `SDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN`: true if the window will be used * with OpenGL rendering * - `SDL_PROP_WINDOW_CREATE_PARENT_POINTER`: an SDL_Window that will be the - * parent of this window, required for windows with the "toolip", "menu", + * parent of this window, required for windows with the "tooltip", "menu", * and "modal" properties * - `SDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN`: true if the window should be * resizable @@ -1003,10 +1236,12 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * - `SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER`: the width of the window * - `SDL_PROP_WINDOW_CREATE_X_NUMBER`: the x position of the window, or * `SDL_WINDOWPOS_CENTERED`, defaults to `SDL_WINDOWPOS_UNDEFINED`. This is - * relative to the parent for windows with the "parent" property set. + * relative to the parent for windows with the "tooltip" or "menu" property + * set. * - `SDL_PROP_WINDOW_CREATE_Y_NUMBER`: the y position of the window, or * `SDL_WINDOWPOS_CENTERED`, defaults to `SDL_WINDOWPOS_UNDEFINED`. This is - * relative to the parent for windows with the "parent" property set. + * relative to the parent for windows with the "tooltip" or "menu" property + * set. * * These are additional supported properties on macOS: * @@ -1024,8 +1259,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * [README/wayland](README/wayland) for more information on using custom * surfaces. * - `SDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN` - true if the - * application wants an associated `wl_egl_window` object to be created, - * even if the window does not have the OpenGL property or flag set. + * application wants an associated `wl_egl_window` object to be created and + * attached to the window, even if the window does not have the OpenGL + * property or `SDL_WINDOW_OPENGL` flag set. * - `SDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER` - the wl_surface * associated with the window, if you want to wrap an existing window. See * [README/wayland](README/wayland) for more information. @@ -1061,7 +1297,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * \returns the window that was created or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties * \sa SDL_CreateWindow @@ -1114,7 +1352,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindowWithProperties(SDL_Prop * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFromID */ @@ -1130,7 +1370,9 @@ extern SDL_DECLSPEC SDL_WindowID SDLCALL SDL_GetWindowID(SDL_Window *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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowID */ @@ -1143,7 +1385,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowFromID(SDL_WindowID id); * \returns the parent of the window on success or NULL if the window has no * parent. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePopupWindow */ @@ -1181,7 +1425,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * - `SDL_PROP_WINDOW_UIKIT_WINDOW_POINTER`: the `(__unsafe_unretained)` * UIWindow associated with the window * - `SDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER`: the NSInteger tag - * assocated with metal views on the window + * associated with metal views on the window * - `SDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER`: the OpenGL view's * framebuffer object. It must be bound when rendering to the screen using * OpenGL. @@ -1206,6 +1450,11 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * - `SDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER`: the NSInteger tag * assocated with metal views on the window * + * On OpenVR: + * + * - `SDL_PROP_WINDOW_OPENVR_OVERLAY_ID`: the OpenVR Overlay Handle ID for the + * associated overlay window. + * * On Vivante: * * - `SDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER`: the EGLNativeDisplayType @@ -1215,11 +1464,6 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * - `SDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER`: the EGLSurface associated with * the window * - * On UWP: - * - * - `SDL_PROP_WINDOW_WINRT_WINDOW_POINTER`: the IInspectable CoreWindow - * associated with the window - * * On Windows: * * - `SDL_PROP_WINDOW_WIN32_HWND_POINTER`: the HWND associated with the window @@ -1237,6 +1481,8 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * the window * - `SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER`: the wl_surface associated with * the window + * - `SDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER`: the wp_viewport associated + * with the window * - `SDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER`: the wl_egl_window * associated with the window * - `SDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER`: the xdg_surface associated @@ -1263,7 +1509,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window *window); @@ -1283,15 +1531,16 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window #define SDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER "SDL.window.kmsdrm.gbm_dev" #define SDL_PROP_WINDOW_COCOA_WINDOW_POINTER "SDL.window.cocoa.window" #define SDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER "SDL.window.cocoa.metal_view_tag" +#define SDL_PROP_WINDOW_OPENVR_OVERLAY_ID "SDL.window.openvr.overlay_id" #define SDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER "SDL.window.vivante.display" #define SDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER "SDL.window.vivante.window" #define SDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER "SDL.window.vivante.surface" -#define SDL_PROP_WINDOW_WINRT_WINDOW_POINTER "SDL.window.winrt.window" #define SDL_PROP_WINDOW_WIN32_HWND_POINTER "SDL.window.win32.hwnd" #define SDL_PROP_WINDOW_WIN32_HDC_POINTER "SDL.window.win32.hdc" #define SDL_PROP_WINDOW_WIN32_INSTANCE_POINTER "SDL.window.win32.instance" #define SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER "SDL.window.wayland.display" #define SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER "SDL.window.wayland.surface" +#define SDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER "SDL.window.wayland.viewport" #define SDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER "SDL.window.wayland.egl_window" #define SDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER "SDL.window.wayland.xdg_surface" #define SDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER "SDL.window.wayland.xdg_toplevel" @@ -1308,7 +1557,9 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window * \param window the window to query. * \returns a mask of the SDL_WindowFlags associated with `window`. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateWindow * \sa SDL_HideWindow @@ -1327,14 +1578,16 @@ extern SDL_DECLSPEC SDL_WindowFlags SDLCALL SDL_GetWindowFlags(SDL_Window *windo * * \param window the window to change. * \param title the desired window title in UTF-8 format. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowTitle */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowTitle(SDL_Window *window, const char *title); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowTitle(SDL_Window *window, const char *title); /** * Get the title of a window. @@ -1343,7 +1596,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowTitle(SDL_Window *window, cons * \returns the title of the window in UTF-8 format or "" if there is no * title. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowTitle */ @@ -1364,23 +1619,24 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetWindowTitle(SDL_Window *window); * * \param window the window to change. * \param icon an SDL_Surface structure containing the icon for the window. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowIcon(SDL_Window *window, SDL_Surface *icon); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowIcon(SDL_Window *window, SDL_Surface *icon); /** * Request that the window's position be set. * - * If, at the time of this request, the window is in a fixed-size state such - * as maximized, this request may be deferred until the window returns to a - * resizable state. + * If the window is in an exclusive fullscreen or maximized state, this + * request has no effect. * * This can be used to reposition fullscreen-desktop windows onto a different - * display, however, exclusive fullscreen windows are locked to a specific - * display and can only be repositioned programmatically via + * display, however, as exclusive fullscreen windows are locked to a specific + * display, they can only be repositioned programmatically via * SDL_SetWindowFullscreenMode(). * * On some windowing systems this request is asynchronous and the new @@ -1401,15 +1657,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowIcon(SDL_Window *window, SDL_S * `SDL_WINDOWPOS_UNDEFINED`. * \param y the y coordinate of the window, or `SDL_WINDOWPOS_CENTERED` or * `SDL_WINDOWPOS_UNDEFINED`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowPosition * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowPosition(SDL_Window *window, int x, int y); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowPosition(SDL_Window *window, int x, int y); /** * Get the position of a window. @@ -1425,24 +1683,25 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowPosition(SDL_Window *window, i * NULL. * \param y a pointer filled in with the y position of the window, may be * NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowPosition */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowPosition(SDL_Window *window, int *x, int *y); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowPosition(SDL_Window *window, int *x, int *y); /** * Request that the size of a window's client area be set. * - * If, at the time of this request, the window in a fixed-size state, such as - * maximized or fullscreen, the request will be deferred until the window - * exits this state and becomes resizable again. + * If the window is in a fullscreen or maximized state, this request has no + * effect. * - * To change the fullscreen mode of a window, use - * SDL_SetWindowFullscreenMode() + * To change the exclusive fullscreen mode of a window, use + * SDL_SetWindowFullscreenMode(). * * On some windowing systems, this request is asynchronous and the new window * size may not have have been applied immediately upon the return of this @@ -1459,16 +1718,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowPosition(SDL_Window *window, i * \param window the window to change. * \param w the width of the window, must be > 0. * \param h the height of the window, must be > 0. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSize * \sa SDL_SetWindowFullscreenMode * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowSize(SDL_Window *window, int w, int h); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowSize(SDL_Window *window, int w, int h); /** * Get the size of a window's client area. @@ -1480,16 +1741,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowSize(SDL_Window *window, int w * \param window the window to query the width and height from. * \param w a pointer filled in with the width of the window, may be NULL. * \param h a pointer filled in with the height of the window, may be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderOutputSize * \sa SDL_GetWindowSizeInPixels * \sa SDL_SetWindowSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSize(SDL_Window *window, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSize(SDL_Window *window, int *w, int *h); /** * Get the safe area for this window. @@ -1497,19 +1760,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSize(SDL_Window *window, int * * Some devices have portions of the screen which are partially obscured or * not interactive, possibly due to on-screen controls, curved edges, camera * notches, TV overscan, etc. This function provides the area of the window - * which is safe to have interactible content. You should continue rendering + * which is safe to have interactable content. You should continue rendering * into the rest of the window, but it should not contain visually important * or interactible content. * * \param window the window to query. * \param rect a pointer filled in with the client area that is safe for * interactive content. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSafeArea(SDL_Window *window, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSafeArea(SDL_Window *window, SDL_Rect *rect); /** * Request that the aspect ratio of a window's client area be set. @@ -1540,15 +1805,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSafeArea(SDL_Window *window, S * limit. * \param max_aspect the maximum aspect ratio of the window, or 0.0f for no * limit. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowAspectRatio * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowAspectRatio(SDL_Window *window, float min_aspect, float max_aspect); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowAspectRatio(SDL_Window *window, float min_aspect, float max_aspect); /** * Get the size of a window's client area. @@ -1558,19 +1825,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowAspectRatio(SDL_Window *window * window, may be NULL. * \param max_aspect a pointer filled in with the maximum aspect ratio of the * window, may be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowAspectRatio */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowAspectRatio(SDL_Window *window, float *min_aspect, float *max_aspect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowAspectRatio(SDL_Window *window, float *min_aspect, float *max_aspect); /** * 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 + * Note: If this function fails (returns false), 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. * @@ -1580,7 +1849,8 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowAspectRatio(SDL_Window *window * 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. + * This function also returns false if getting the information is not + * supported. * * \param window the window to query the size values of the border * (decorations) from. @@ -1592,14 +1862,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowAspectRatio(SDL_Window *window * border; NULL is permitted. * \param right pointer to variable for storing the size of the right border; * NULL is permitted. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowBordersSize(SDL_Window *window, int *top, int *left, int *bottom, int *right); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowBordersSize(SDL_Window *window, int *top, int *left, int *bottom, int *right); /** * Get the size of a window's client area, in pixels. @@ -1609,15 +1881,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowBordersSize(SDL_Window *window * NULL. * \param h a pointer to variable for storing the height in pixels, may be * NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateWindow * \sa SDL_GetWindowSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSizeInPixels(SDL_Window *window, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSizeInPixels(SDL_Window *window, int *w, int *h); /** * Set the minimum size of a window's client area. @@ -1625,15 +1899,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSizeInPixels(SDL_Window *windo * \param window the window to change. * \param min_w the minimum width of the window, or 0 for no limit. * \param min_h the minimum height of the window, or 0 for no limit. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMinimumSize * \sa SDL_SetWindowMaximumSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMinimumSize(SDL_Window *window, int min_w, int min_h); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMinimumSize(SDL_Window *window, int min_w, int min_h); /** * Get the minimum size of a window's client area. @@ -1643,15 +1919,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMinimumSize(SDL_Window *window * NULL. * \param h a pointer filled in with the minimum height of the window, may be * NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMaximumSize * \sa SDL_SetWindowMinimumSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowMinimumSize(SDL_Window *window, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowMinimumSize(SDL_Window *window, int *w, int *h); /** * Set the maximum size of a window's client area. @@ -1659,15 +1937,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowMinimumSize(SDL_Window *window * \param window the window to change. * \param max_w the maximum width of the window, or 0 for no limit. * \param max_h the maximum height of the window, or 0 for no limit. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMaximumSize * \sa SDL_SetWindowMinimumSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMaximumSize(SDL_Window *window, int max_w, int max_h); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMaximumSize(SDL_Window *window, int max_w, int max_h); /** * Get the maximum size of a window's client area. @@ -1677,15 +1957,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMaximumSize(SDL_Window *window * NULL. * \param h a pointer filled in with the maximum height of the window, may be * NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMinimumSize * \sa SDL_SetWindowMaximumSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowMaximumSize(SDL_Window *window, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowMaximumSize(SDL_Window *window, int *w, int *h); /** * Set the border state of a window. @@ -1697,15 +1979,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowMaximumSize(SDL_Window *window * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param bordered false to remove border, true to add border. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowBordered(SDL_Window *window, SDL_bool bordered); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowBordered(SDL_Window *window, bool bordered); /** * Set the user-resizable state of a window. @@ -1717,15 +2001,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowBordered(SDL_Window *window, S * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param resizable true to allow resizing, false to disallow. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowResizable(SDL_Window *window, SDL_bool resizable); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowResizable(SDL_Window *window, bool resizable); /** * Set the window to always be above the others. @@ -1734,43 +2020,49 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowResizable(SDL_Window *window, * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param on_top true to set the window always on top, false to disable. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowAlwaysOnTop(SDL_Window *window, SDL_bool on_top); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowAlwaysOnTop(SDL_Window *window, bool on_top); /** * Show a window. * * \param window the window to show. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HideWindow * \sa SDL_RaiseWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowWindow(SDL_Window *window); /** * Hide a window. * * \param window the window to hide. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowWindow + * \sa SDL_WINDOW_HIDDEN */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HideWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_HideWindow(SDL_Window *window); /** * Request that a window be raised above other windows and gain the input @@ -1783,12 +2075,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HideWindow(SDL_Window *window); * the window will have the SDL_WINDOW_INPUT_FOCUS flag set. * * \param window the window to raise. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RaiseWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_RaiseWindow(SDL_Window *window); /** * Request that the window be made as large as possible. @@ -1811,22 +2105,27 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RaiseWindow(SDL_Window *window); * and Wayland window managers may vary. * * \param window the window to maximize. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_MinimizeWindow * \sa SDL_RestoreWindow * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MaximizeWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_MaximizeWindow(SDL_Window *window); /** * Request that the window be minimized to an iconic representation. * + * If the window is in a fullscreen state, this request has no direct effect. + * It may alter the state the window is returned to when leaving fullscreen. + * * On some windowing systems this request is asynchronous and the new window - * state may not have have been applied immediately upon the return of this + * state may not have been applied immediately upon the return of this * function. If an immediate change is required, call SDL_SyncWindow() to * block until the changes have taken effect. * @@ -1835,21 +2134,26 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MaximizeWindow(SDL_Window *window); * deny the state change. * * \param window the window to minimize. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_MaximizeWindow * \sa SDL_RestoreWindow * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MinimizeWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_MinimizeWindow(SDL_Window *window); /** * Request that the size and position of a minimized or maximized window be * restored. * + * If the window is in a fullscreen state, this request has no direct effect. + * It may alter the state the window is returned to when leaving fullscreen. + * * On some windowing systems this request is asynchronous and the new window * state may not have have been applied immediately upon the return of this * function. If an immediate change is required, call SDL_SyncWindow() to @@ -1860,16 +2164,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MinimizeWindow(SDL_Window *window); * deny the state change. * * \param window the window to restore. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_MaximizeWindow * \sa SDL_MinimizeWindow * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RestoreWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_RestoreWindow(SDL_Window *window); /** * Request that the window's fullscreen state be changed. @@ -1888,18 +2194,20 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RestoreWindow(SDL_Window *window); * is just a request, it can be denied by the windowing system. * * \param window the window to change. - * \param fullscreen SDL_TRUE for fullscreen mode, SDL_FALSE for windowed - * mode. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param fullscreen true for fullscreen mode, false for windowed mode. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFullscreenMode * \sa SDL_SetWindowFullscreenMode * \sa SDL_SyncWindow + * \sa SDL_WINDOW_FULLSCREEN */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFullscreen(SDL_Window *window, SDL_bool fullscreen); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFullscreen(SDL_Window *window, bool fullscreen); /** * Block until any pending window state is finalized. @@ -1915,10 +2223,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFullscreen(SDL_Window *window, * * \param window the window for which to wait for the pending state to be * applied. - * \returns SDL_TRUE on success or SDL_FALSE if the operation timed out before - * the window was in the requested state. + * \returns true on success or false if the operation timed out before the + * window was in the requested state. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowSize * \sa SDL_SetWindowPosition @@ -1928,20 +2238,22 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFullscreen(SDL_Window *window, * \sa SDL_RestoreWindow * \sa SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SyncWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_SyncWindow(SDL_Window *window); /** * Return whether the window has a surface associated with it. * * \param window the window to query. - * \returns SDL_TRUE if there is a surface associated with the window, or - * SDL_FALSE otherwise. + * \returns true if there is a surface associated with the window, or false + * otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WindowHasSurface(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_WindowHasSurface(SDL_Window *window); /** * Get the SDL surface associated with the window. @@ -1961,7 +2273,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WindowHasSurface(SDL_Window *window); * \returns the surface associated with the window, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyWindowSurface * \sa SDL_WindowHasSurface @@ -1985,14 +2299,16 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_GetWindowSurface(SDL_Window *windo * * \param window the window. * \param vsync the vertical refresh sync interval. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurfaceVSync */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowSurfaceVSync(SDL_Window *window, int vsync); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowSurfaceVSync(SDL_Window *window, int vsync); #define SDL_WINDOW_SURFACE_VSYNC_DISABLED 0 #define SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE (-1) @@ -2003,14 +2319,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowSurfaceVSync(SDL_Window *windo * \param window the window to query. * \param vsync an int filled with the current vertical refresh sync interval. * See SDL_SetWindowSurfaceVSync() for the meaning of the value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowSurfaceVSync */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSurfaceVSync(SDL_Window *window, int *vsync); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSurfaceVSync(SDL_Window *window, int *vsync); /** * Copy the window surface to the screen. @@ -2021,15 +2339,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSurfaceVSync(SDL_Window *windo * This function is equivalent to the SDL 1.2 API SDL_Flip(). * * \param window the window to update. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface * \sa SDL_UpdateWindowSurfaceRects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateWindowSurface(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateWindowSurface(SDL_Window *window); /** * Copy areas of the window surface to the screen. @@ -2048,29 +2368,33 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateWindowSurface(SDL_Window *window) * \param rects an array of SDL_Rect structures representing areas of the * surface to copy, in pixels. * \param numrects the number of rectangles. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface * \sa SDL_UpdateWindowSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window *window, const SDL_Rect *rects, int numrects); +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window *window, const SDL_Rect *rects, int numrects); /** * Destroy the surface associated with the window. * * \param window the window to update. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface * \sa SDL_WindowHasSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DestroyWindowSurface(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_DestroyWindowSurface(SDL_Window *window); /** * Set a window's keyboard grab mode. @@ -2092,16 +2416,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DestroyWindowSurface(SDL_Window *window * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param grabbed this is true to grab keyboard, and false to release. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowKeyboardGrab * \sa SDL_SetWindowMouseGrab */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowKeyboardGrab(SDL_Window *window, SDL_bool grabbed); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowKeyboardGrab(SDL_Window *window, bool grabbed); /** * Set a window's mouse grab mode. @@ -2109,47 +2435,60 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowKeyboardGrab(SDL_Window *windo * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param grabbed this is true to grab mouse, and false to release. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. * - * \sa SDL_GetWindowMouseGrab + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetWindowMouseRect + * \sa SDL_SetWindowMouseRect + * \sa SDL_SetWindowMouseGrab * \sa SDL_SetWindowKeyboardGrab */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMouseGrab(SDL_Window *window, SDL_bool grabbed); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMouseGrab(SDL_Window *window, bool grabbed); /** * Get a window's keyboard grab mode. * * \param window the window to query. - * \returns SDL_TRUE if keyboard is grabbed, and SDL_FALSE otherwise. + * \returns true if keyboard is grabbed, and false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowKeyboardGrab */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowKeyboardGrab(SDL_Window *window); +extern SDL_DECLSPEC 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. + * \returns true if mouse is grabbed, and false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetWindowMouseRect + * \sa SDL_SetWindowMouseRect + * \sa SDL_SetWindowMouseGrab * \sa SDL_SetWindowKeyboardGrab */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowMouseGrab(SDL_Window *window); +extern SDL_DECLSPEC 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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowMouseGrab * \sa SDL_SetWindowKeyboardGrab @@ -2165,15 +2504,18 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetGrabbedWindow(void); * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMouseRect + * \sa SDL_GetWindowMouseGrab * \sa SDL_SetWindowMouseGrab */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMouseRect(SDL_Window *window, const SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMouseRect(SDL_Window *window, const SDL_Rect *rect); /** * Get the mouse confinement rectangle of a window. @@ -2182,9 +2524,13 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMouseRect(SDL_Window *window, * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowMouseRect + * \sa SDL_GetWindowMouseGrab + * \sa SDL_SetWindowMouseGrab */ extern SDL_DECLSPEC const SDL_Rect * SDLCALL SDL_GetWindowMouseRect(SDL_Window *window); @@ -2194,18 +2540,20 @@ extern SDL_DECLSPEC const SDL_Rect * SDLCALL SDL_GetWindowMouseRect(SDL_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. + * This function also returns false 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowOpacity */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowOpacity(SDL_Window *window, float opacity); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowOpacity(SDL_Window *window, float opacity); /** * Get the opacity of a window. @@ -2217,43 +2565,81 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowOpacity(SDL_Window *window, fl * \returns the opacity, (0.0f - transparent, 1.0f - opaque), or -1.0f on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowOpacity */ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowOpacity(SDL_Window *window); /** - * Set the window as a modal to a parent window. + * Set the window as a child of a parent window. * - * If the window is already modal to an existing window, it will be reparented - * to the new owner. Setting the parent window to null unparents the modal - * window and removes modal status. + * If the window is already the child of an existing window, it will be + * reparented to the new owner. Setting the parent window to NULL unparents + * the window and removes child window status. * - * Setting a window as modal to a parent that is a descendent of the modal - * window results in undefined behavior. + * If a parent window is hidden or destroyed, the operation will be + * recursively applied to child windows. Child windows hidden with the parent + * that did not have their hidden status explicitly set will be restored when + * the parent is shown. * - * \param modal_window the window that should be set modal. - * \param parent_window the parent window for the modal window. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * Attempting to set the parent of a window that is currently in the modal + * state will fail. Use SDL_SetWindowModal() to cancel the modal status before + * attempting to change the parent. * - * \since This function is available since SDL 3.0.0. + * Popup windows cannot change parents and attempts to do so will fail. + * + * Setting a parent window that is currently the sibling or descendent of the + * child window results in undefined behavior. + * + * \param window the window that should become the child of a parent. + * \param parent the new parent window for the child window. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetWindowModal */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowModalFor(SDL_Window *modal_window, SDL_Window *parent_window); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowParent(SDL_Window *window, SDL_Window *parent); + +/** + * Toggle the state of the window as modal. + * + * To enable modal status on a window, the window must currently be the child + * window of a parent, or toggling modal status on will fail. + * + * \param window the window on which to set the modal state. + * \param modal true to toggle modal status on, false to toggle it off. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetWindowParent + * \sa SDL_WINDOW_MODAL + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowModal(SDL_Window *window, bool modal); /** * Set whether the window may have input focus. * * \param window the window to set focusable state. - * \param focusable SDL_TRUE to allow input focus, SDL_FALSE to not allow - * input focus. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param focusable true to allow input focus, false to not allow input focus. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFocusable(SDL_Window *window, SDL_bool focusable); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFocusable(SDL_Window *window, bool focusable); /** @@ -2272,17 +2658,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFocusable(SDL_Window *window, * the client area. * \param y the y coordinate of the menu, relative to the origin (top-left) of * the client area. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowWindowSystemMenu(SDL_Window *window, int x, int y); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowWindowSystemMenu(SDL_Window *window, int x, int y); /** * Possible return values from the SDL_HitTest callback. * - * \since This enum is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This enum is available since SDL 3.2.0. * * \sa SDL_HitTest */ @@ -2335,7 +2725,7 @@ typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win, * Specifying NULL for a callback disables hit-testing. Hit-testing is * disabled by default. * - * Platforms that don't support this functionality will return SDL_FALSE + * Platforms that don't support this functionality will return false * unconditionally, even if you're attempting to disable hit-testing. * * Your callback may fire at any time, and its firing does not indicate any @@ -2349,58 +2739,72 @@ typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win, * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowHitTest(SDL_Window *window, SDL_HitTest callback, void *callback_data); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowHitTest(SDL_Window *window, SDL_HitTest callback, void *callback_data); /** * Set the shape of a transparent window. * * This sets the alpha channel of a transparent window and any fully * transparent areas are also transparent to mouse clicks. If you are using - * something besides the SDL render API, then you are responsible for setting - * the alpha channel of the window yourself. + * something besides the SDL render API, then you are responsible for drawing + * the alpha channel of the window to match the shape alpha channel to get + * consistent cross-platform results. * * The shape is copied inside this function, so you can free it afterwards. If * your shape surface changes, you should call SDL_SetWindowShape() again to - * update the window. + * update the window. This is an expensive operation, so should be done + * sparingly. * * The window must have been created with the SDL_WINDOW_TRANSPARENT flag. * * \param window the window. * \param shape the surface representing the shape of the window, or NULL to * remove any current shape. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowShape(SDL_Window *window, SDL_Surface *shape); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowShape(SDL_Window *window, SDL_Surface *shape); /** * Request a window to demand attention from the user. * * \param window the window to be flashed. * \param operation the operation to perform. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlashWindow(SDL_Window *window, SDL_FlashOperation operation); +extern SDL_DECLSPEC bool SDLCALL SDL_FlashWindow(SDL_Window *window, SDL_FlashOperation operation); /** * Destroy a window. * - * Any popups or modal windows owned by the window will be recursively - * destroyed as well. + * Any child windows owned by the window will be recursively destroyed as + * well. + * + * Note that on some platforms, the visible window may not actually be removed + * from the screen until the SDL event loop is pumped again, even though the + * SDL_Window is no longer valid after this call. * * \param window the window to destroy. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePopupWindow * \sa SDL_CreateWindow @@ -2416,28 +2820,31 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_Window *window); * * 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. + * \returns true if the screensaver is enabled, false if it is disabled. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DisableScreenSaver * \sa SDL_EnableScreenSaver */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ScreenSaverEnabled(void); +extern SDL_DECLSPEC bool SDLCALL SDL_ScreenSaverEnabled(void); /** * Allow the screen to be blanked by a screen saver. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DisableScreenSaver * \sa SDL_ScreenSaverEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnableScreenSaver(void); +extern SDL_DECLSPEC bool SDLCALL SDL_EnableScreenSaver(void); /** * Prevent the screen from being blanked by a screen saver. @@ -2448,15 +2855,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnableScreenSaver(void); * The screensaver is disabled by default, but this may by changed by * SDL_HINT_VIDEO_ALLOW_SCREENSAVER. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_EnableScreenSaver * \sa SDL_ScreenSaverEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DisableScreenSaver(void); +extern SDL_DECLSPEC bool SDLCALL SDL_DisableScreenSaver(void); /** @@ -2476,15 +2885,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DisableScreenSaver(void); * * \param path the platform dependent OpenGL library name, or NULL to open the * default OpenGL library. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetProcAddress * \sa SDL_GL_UnloadLibrary */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_LoadLibrary(const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_LoadLibrary(const char *path); /** * Get an OpenGL function by name. @@ -2531,7 +2942,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_LoadLibrary(const char *path); * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_ExtensionSupported * \sa SDL_GL_LoadLibrary @@ -2550,7 +2963,9 @@ extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_GL_GetProcAddress(const char * \returns a pointer to the named EGL function. The returned pointer should * be cast to the appropriate function signature. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_EGL_GetCurrentDisplay */ @@ -2559,7 +2974,9 @@ extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_EGL_GetProcAddress(const cha /** * Unload the OpenGL library previously loaded by SDL_GL_LoadLibrary(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_LoadLibrary */ @@ -2580,16 +2997,20 @@ extern SDL_DECLSPEC void SDLCALL SDL_GL_UnloadLibrary(void); * 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. + * \returns true if the extension is supported, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char *extension); +extern SDL_DECLSPEC 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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetAttribute * \sa SDL_GL_SetAttribute @@ -2604,34 +3025,38 @@ extern SDL_DECLSPEC void SDLCALL SDL_GL_ResetAttributes(void); * 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 + * \param attr an SDL_GLAttr enum value specifying the OpenGL attribute to * set. * \param value the desired value for the attribute. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetAttribute * \sa SDL_GL_ResetAttributes */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); +extern SDL_DECLSPEC bool 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 + * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_ResetAttributes * \sa SDL_GL_SetAttribute */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *value); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_GetAttribute(SDL_GLAttr attr, int *value); /** * Create an OpenGL context for an OpenGL window, and make it current. @@ -2648,7 +3073,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *v * \returns the OpenGL context associated with `window` or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_DestroyContext * \sa SDL_GL_MakeCurrent @@ -2662,14 +3089,16 @@ extern SDL_DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_Window *windo * * \param window the window to associate with the context. * \param context the OpenGL context to associate with the window. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_CreateContext */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_MakeCurrent(SDL_Window *window, SDL_GLContext context); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_MakeCurrent(SDL_Window *window, SDL_GLContext context); /** * Get the currently active OpenGL window. @@ -2677,7 +3106,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_MakeCurrent(SDL_Window *window, SDL_ * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GL_GetCurrentWindow(void); @@ -2687,7 +3118,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GL_GetCurrentWindow(void); * \returns the currently active OpenGL context or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_MakeCurrent */ @@ -2699,7 +3132,9 @@ extern SDL_DECLSPEC SDL_GLContext SDLCALL SDL_GL_GetCurrentContext(void); * \returns the currently active EGL display or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_EGLDisplay SDLCALL SDL_EGL_GetCurrentDisplay(void); @@ -2709,7 +3144,9 @@ extern SDL_DECLSPEC SDL_EGLDisplay SDLCALL SDL_EGL_GetCurrentDisplay(void); * \returns the currently active EGL config or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_EGLConfig SDLCALL SDL_EGL_GetCurrentConfig(void); @@ -2720,7 +3157,9 @@ extern SDL_DECLSPEC SDL_EGLConfig SDLCALL SDL_EGL_GetCurrentConfig(void); * \returns the EGLSurface pointer associated with the window, or NULL on * failure. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_EGLSurface SDLCALL SDL_EGL_GetWindowSurface(SDL_Window *window); @@ -2728,27 +3167,25 @@ extern SDL_DECLSPEC SDL_EGLSurface SDLCALL SDL_EGL_GetWindowSurface(SDL_Window * * Sets the callbacks for defining custom EGLAttrib arrays for EGL * initialization. * - * Each callback should return a pointer to an EGL attribute array terminated - * with EGL_NONE. Callbacks may return NULL pointers to signal an error, which - * will cause the SDL_CreateWindow process to fail gracefully. - * - * The arrays returned by each callback will be appended to the existing - * attribute arrays defined by SDL. + * Callbacks that aren't needed can be set to NULL. * * NOTE: These callback pointers will be reset after SDL_GL_ResetAttributes. * * \param platformAttribCallback callback for attributes to pass to - * eglGetPlatformDisplay. + * eglGetPlatformDisplay. May be NULL. * \param surfaceAttribCallback callback for attributes to pass to - * eglCreateSurface. + * eglCreateSurface. May be NULL. * \param contextAttribCallback callback for attributes to pass to - * eglCreateContext. + * eglCreateContext. May be NULL. + * \param userdata a pointer that is passed to the callbacks. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EGL_SetAttributeCallbacks(SDL_EGLAttribArrayCallback platformAttribCallback, - SDL_EGLIntArrayCallback surfaceAttribCallback, - SDL_EGLIntArrayCallback contextAttribCallback); + SDL_EGLIntArrayCallback surfaceAttribCallback, + SDL_EGLIntArrayCallback contextAttribCallback, void *userdata); /** * Set the swap interval for the current OpenGL context. @@ -2758,7 +3195,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_EGL_SetAttributeCallbacks(SDL_EGLAttribArra * 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 SDL_FALSE. In such a case, you should + * this function will fail and return false. In such a case, you should * probably retry the call with 1 for the interval. * * Adaptive vsync is implemented for some glX drivers with @@ -2770,14 +3207,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_EGL_SetAttributeCallbacks(SDL_EGLAttribArra * * \param interval 0 for immediate updates, 1 for updates synchronized with * the vertical retrace, -1 for adaptive vsync. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetSwapInterval */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_SetSwapInterval(int interval); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_SetSwapInterval(int interval); /** * Get the swap interval for the current OpenGL context. @@ -2789,14 +3228,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_SetSwapInterval(int interval); * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_SetSwapInterval */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_GetSwapInterval(int *interval); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_GetSwapInterval(int *interval); /** * Update a window with OpenGL rendering. @@ -2809,25 +3250,29 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_GetSwapInterval(int *interval); * extra. * * \param window the window to change. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_SwapWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_SwapWindow(SDL_Window *window); /** * Delete an OpenGL context. * * \param context the OpenGL context to be deleted. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_CreateContext */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_DestroyContext(SDL_GLContext context); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_DestroyContext(SDL_GLContext context); /* @} *//* OpenGL support functions */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_vulkan.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_vulkan.h index c31d33c..5a48756 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_vulkan.h +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_vulkan.h @@ -23,11 +23,25 @@ * # CategoryVulkan * * Functions for creating Vulkan surfaces on SDL windows. + * + * For the most part, Vulkan operates independent of SDL, but it benefits from + * a little support during setup. + * + * Use SDL_Vulkan_GetInstanceExtensions() to get platform-specific bits for + * creating a VkInstance, then SDL_Vulkan_GetVkGetInstanceProcAddr() to get + * the appropriate function for querying Vulkan entry points. Then + * SDL_Vulkan_CreateSurface() will get you the final pieces you need to + * prepare for rendering into an SDL_Window with Vulkan. + * + * Unlike OpenGL, most of the details of "context" creation and window buffer + * swapping are handled by the Vulkan API directly, so SDL doesn't provide + * Vulkan equivalents of SDL_GL_SwapWindow(), etc; they aren't necessary. */ #ifndef SDL_vulkan_h_ #define SDL_vulkan_h_ +#include #include #include @@ -55,6 +69,10 @@ VK_DEFINE_HANDLE(VkPhysicalDevice) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) struct VkAllocationCallbacks; +/* Make sure to undef to avoid issues in case of later vulkan include */ +#undef VK_DEFINE_HANDLE +#undef VK_DEFINE_NON_DISPATCHABLE_HANDLE + #endif /* !NO_SDL_VULKAN_TYPEDEFS */ /** @@ -69,6 +87,13 @@ struct VkAllocationCallbacks; * creating any Vulkan windows. If no Vulkan loader library is loaded, the * default library will be loaded upon creation of the first Vulkan window. * + * SDL keeps a counter of how many times this function has been successfully + * called, so it is safe to call this function multiple times, so long as it + * is eventually paired with an equivalent number of calls to + * SDL_Vulkan_UnloadLibrary. The `path` argument is ignored unless there is no + * library currently loaded, and and the library isn't actually unloaded until + * there have been an equivalent number of calls to SDL_Vulkan_UnloadLibrary. + * * 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 @@ -95,15 +120,17 @@ struct VkAllocationCallbacks; * library version. * * \param path the platform dependent Vulkan loader library name or NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetVkGetInstanceProcAddr * \sa SDL_Vulkan_UnloadLibrary */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Vulkan_LoadLibrary(const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_Vulkan_LoadLibrary(const char *path); /** * Get the address of the `vkGetInstanceProcAddr` function. @@ -122,14 +149,27 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Vulkan_LoadLibrary(const char *path); * \returns the function pointer for `vkGetInstanceProcAddr` or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_Vulkan_GetVkGetInstanceProcAddr(void); /** * Unload the Vulkan library previously loaded by SDL_Vulkan_LoadLibrary(). * - * \since This function is available since SDL 3.0.0. + * SDL keeps a counter of how many times this function has been called, so it + * is safe to call this function multiple times, so long as it is paired with + * an equivalent number of calls to SDL_Vulkan_LoadLibrary. The library isn't + * actually unloaded until there have been an equivalent number of calls to + * SDL_Vulkan_UnloadLibrary. + * + * Once the library has actually been unloaded, if any Vulkan instances + * remain, they will likely crash the program. Clean up any existing Vulkan + * resources, and destroy appropriate windows, renderers and GPU devices + * before calling this function. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_LoadLibrary */ @@ -153,7 +193,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_Vulkan_UnloadLibrary(void); * \returns an array of extension name strings on success, NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_CreateSurface */ @@ -175,15 +215,15 @@ extern SDL_DECLSPEC char const * const * SDLCALL SDL_Vulkan_GetInstanceExtension * allocator that creates the surface. Can be NULL. * \param surface a pointer to a VkSurfaceKHR handle to output the newly * created surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetInstanceExtensions * \sa SDL_Vulkan_DestroySurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Vulkan_CreateSurface(SDL_Window *window, +extern SDL_DECLSPEC bool SDLCALL SDL_Vulkan_CreateSurface(SDL_Window *window, VkInstance instance, const struct VkAllocationCallbacks *allocator, VkSurfaceKHR* surface); @@ -206,7 +246,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Vulkan_CreateSurface(SDL_Window *window * \param allocator a VkAllocationCallbacks struct, which lets the app set the * allocator that destroys the surface. Can be NULL. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetInstanceExtensions * \sa SDL_Vulkan_CreateSurface @@ -226,14 +266,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_Vulkan_DestroySurface(VkInstance instance, * \param physicalDevice a valid Vulkan physical device handle. * \param queueFamilyIndex a valid queue family index for the given physical * device. - * \returns SDL_TRUE if supported, SDL_FALSE if unsupported or an error - * occurred. + * \returns true if supported, false if unsupported or an error occurred. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetInstanceExtensions */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Vulkan_GetPresentationSupport(VkInstance instance, +extern SDL_DECLSPEC bool SDLCALL SDL_Vulkan_GetPresentationSupport(VkInstance instance, VkPhysicalDevice physicalDevice, Uint32 queueFamilyIndex); diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/INSTALL.md b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/INSTALL.md new file mode 100644 index 0000000..97e4ab6 --- /dev/null +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/INSTALL.md @@ -0,0 +1,41 @@ + +# Using this package + +This package contains SDL built for Xcode. + +To use this package in Xcode, drag `SDL3.framework` into your project. + +# Documentation + +An API reference, tutorials, and additional documentation is available at: + +https://wiki.libsdl.org/SDL3 + +# Example code + +There are simple example programs available at: + +https://examples.libsdl.org/SDL3 + +# Discussions + +## Discord + +You can join the official Discord server at: + +https://discord.com/invite/BwpFGBWsv8 + +## Forums/mailing lists + +You can join SDL development discussions at: + +https://discourse.libsdl.org/ + +Once you sign up, you can use the forum through the website or as a mailing list from your email client. + +## Announcement list + +You can sign up for the low traffic announcement list at: + +https://www.libsdl.org/mailing-list.php + diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Info.plist b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Info.plist index 0555f88782d2e7408ae9acf4803733ea22140850..c0a15f58dfc2afb2b30ae8dfa83600810dd963ba 100644 GIT binary patch delta 132 zcmcb^c8zVrZ$|boBV!L^L&M1|OmWOcdIpnInM@5rjSSt)%_A}kGV=3M^NT|a&Gk%U zU_1~f#L(2lAk5Iz&Dby{1gQBOlcO#Z6BiRdlRA?nlPyyOQ!G<5QwCEOQ!&#Frg==u cnbt7vWZK7cl<5@H8K!eg7be><%QIdB0Kk +Copyright (C) 1997-2025 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 @@ -17,3 +15,4 @@ freely, subject to the following restrictions: 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/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/README.md b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/README.md new file mode 100644 index 0000000..68b0923 --- /dev/null +++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/README.md @@ -0,0 +1,17 @@ + +Simple DirectMedia Layer (SDL for short) is a cross-platform library +designed to make it easy to write multi-media software, such as games +and emulators. + +You can find the latest release and additional information at: +https://www.libsdl.org/ + +Installation instructions and a quick introduction is available in +[INSTALL.md](INSTALL.md) + +This library is distributed under the terms of the zlib license, +available in [LICENSE.txt](LICENSE.txt). + +Enjoy! + +Sam Lantinga (slouken@libsdl.org) diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/ReadMe.txt b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/ReadMe.txt deleted file mode 100644 index 6ea9347..0000000 --- a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/ReadMe.txt +++ /dev/null @@ -1,44 +0,0 @@ -The Simple DirectMedia Layer (SDL for short) is a cross-platform -library designed to make it easy to write multi-media software, -such as games and emulators. - -The Simple DirectMedia Layer library source code is available from: -http://www.libsdl.org/ - -This library is distributed under the terms of the zlib license: -http://zlib.net/zlib_license.html - - -This packages contains the SDL framework for macOS. -Conforming with Apple guidelines, this framework -contains both the SDL runtime component and development header files. - - -To Install: -Copy "SDL3.xcframework" and "share" to /Library/Frameworks - -You may alternatively install it in /Library/Frameworks -if your access privileges are not high enough. - - -Use in CMake projects: -SDL3.xcframework can be used in CMake projects using the following pattern: -```cmake -find_package(SDL3 REQUIRED COMPONENTS SDL3) -add_executable(my_game ${MY_SOURCES}) -target_link_libraries(my_game PRIVATE SDL3::SDL3) -``` -If SDL3.framework is installed in a non-standard location, -please refer to the following link for ways to configure CMake: -https://cmake.org/cmake/help/latest/command/find_package.html#config-mode-search-procedure - - -Additional References: - - - Screencast tutorials for getting started with OpenSceneGraph/macOS are - available at: - http://www.openscenegraph.org/projects/osg/wiki/Support/Tutorials/MacOSXTips - Though these are OpenSceneGraph centric, the same exact concepts apply to - SDL, thus the videos are recommended for everybody getting started with - developing on macOS. (You can skim over the PlugIns stuff since SDL - doesn't have any PlugIns to worry about.) diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/SDL3 b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/SDL3 index b1152908408e7d338b5773a24a7faccbc2c2712c..0804853f5b82385e0723e8f7cb4394cec6b43981 100755 GIT binary patch literal 1618944 zcmeFa30PD|);C`Fb^{F!$R=PzXciY1QE@>?Vr)PSf?gt!&17CcB!Z}j7^9-n2(FEZ ztxPfz-#@sJkya9o8f6kkj7v1eEhc6%Gw+DFp~R@ss2C03@7&uhO#>#AH}CiVp7&{< z=TNumR-HO^>eM->mRo(|{9& z-^%+Eo_R_s3&qXxp-ozP(?%cROUurhGCgYs(k<~h+PYD8R&K;cadUjE1ATcDCTF%0 zX^F4ORl-;Qf{2z;{PFlQ3uey9nKntv-hsaKYzg0gI*VP&OmSoO_PCLlmX?_}t)Q(# zEa_u!xQj)zmrM944l(HRFD-3SW@cK}?98m`Gt*{fOt8e4%}H|NVQeJD+qKsMb6T3n zzo}U>v!`WD&FawJc`^xK!GA~vO>q+%OWa0$nNu@n?!lF$-Bl zq8WWN=S=TNU-l#kUwuyrgDKuMzSpO{kuz;#TF$iB@XM$-jGEo+2WRkwFwU zr%$S-?Z3GkPsu5mX^Af?Si*PGScKvh_)J|P<}l)$J|k~tUT63eArihQBR-0o<1?zm zM+6%2vUE6AEM zBkMJo4@-Q1nkBXOuoN(go8yC6cE&$ZuMkE{eCaEU{b6h*#m(`7tj_Qiybd$e8NLB4 zC45?Adno=Z@a4?PAgk7~y<3g=rWnTn#eYSAOw5>>(J4OvRT6#v#tx>q1$|;U)4#N| zN2of*r&%N6n>|JQ* z$-Tr^CO?8A=KQn7NB&eiAT4doXd!Xrh|wmWN+aQ6^`;WW_zo#f|4nc3$eaK)CcObt z`Vl-GVVW7!GiGM@PZ=?0P(M-qzmYd1SB&B{{sI}(4iKNb*mDr(=WM*#Y%^XQ4)kIq z5-&x2vFYhjTd0oRwO(uoly7{HH`~3EF&g*JiFl;?iH4I3~Ok;6Afw?Cr<#foL0*_xdyp=$yQ17O2}^ z04e@D@Yx1*^S{WC7jh(E>)mQXh-=S@dLF-n5xB@}^A5nqh{#{R^pv z4s90IiWy!pE>YPD zf0e(;-*K;J%$PZsdeIDNTcU)yL;FR!=*vB3e6)4F8Q!+UHoQ^h?PnJd17FR?D|rI_ zV%iPY4&$7k9Rsb_zMM34`^B1q!$sOg7X!!;CAdbgQc|B`p zUf#@XGsNxEB`$UBSDDTC(8`)$8kf(`$e5npalo6BJL3J7bdSxNn3G{avzXQuy)G^Z z7?6+UGqrncUMD(4N|Z2n7%#uf=cMUb)1DnOGR2HsQy$GxLSUR5{-F{q) zaZ|f}p_hXZAv!f#v$HZ^$E0{lR+?y?+l&Wmmv2g5#>A`{9r6&)-T<1_e9Go(|MMEF1;gBT>f))D>5Ae^P7> z>ekQo;XRs=M{y-Uk6&7C5%X&U^fP_<@==U=;P)_BdJpo~pLJmQlR1_;(3BR}O-%b7 z^@Tr5vlG+8Y*^|$t2p5E46Pf;^eP*63O`=z(VJ7WvG=^{rME8zYxdt4KgpowMtoe`p>O{(a z=e;y_!N%xZHifQDdvA=yDmCNbN}2r&Iaw zTe>EmvsLo*HLK6bYz&*z%%6W%9((kid!rq*sEj&D)l$mTp_VW-@0RR^`A_Lr@Ms`x>p_>~#r{ zopr6PsYz(_aE|4NKEG`IXeQ4MLzu=XbI+lE2h^`b{kf<=!Re?sf`A_Ct5;4%jescgC5CG13zTdUAj_1azoDm*V-Q<3s1DQxZ8vVqZWw`okIV6P$gb3m^jV;hZAZE@GJ~ zJK`fU2E+zd*nA!kMRgC@_LgegHl3r{-^Q$ zAdkcN>U>P!k=Ytxi$_uN9sdflBHZ5M_n23mFP6z z19gU@Zya>3yhrZxZ565<)Rh1_>+OISWd?C&7W%^5lNSC=A&dF4Uo^gD6yb}GvDwEZmeJ*|mH`QMImiQb1+AC!&U-#nL z@kI!yzF0ASGUt@rh;&EDc{b$Ko^wjMTExvDI1r{$1n`RCJzSgZ$2@ zYm->7GSL8@^`-HKKB6(y4P)xs&bP)>KOC=qbNqEY=R!6b?zE;R(3nF1y1HxY{9^}K zxc_a)Y|=9fI-nTi=~IlYa-LTXVcnJX%wCyG{Kc5s1YP}G>eSr&?RDyYW1Uske|w$N zQ0Fh{j=M(PanDS5+%f8oeUO{OZkoCy@C{7k`iL`Z&U|m5;3L60`yM#C4PvA@))E2cnKC^^U65L-655#t~BF4-PqFqCr?^+glxLSz@? zzY#jFGkt*{y8cz;pZM7}{=LGg?n&d~B>L%;o3<_jINE!8U?=_7M`6p(ZO+pVd&C}T-a z8t93@c(9}=ly^{yb_4XRGU|qZw@&Si-(KhIsB_bi<;lUL-kYI@KYI-Qeb_9n!PpND z(Is#C+#tTM$NS);ZTU5b`+!#phsDXkwi1pi^fBRx?=8hMfFlIHWIP~r{^5#NnS*HS z#QDH?f%@s*ya#-;Z6zotrcDge=OWDkX>q_WrX3E_zlOA6$Qu0G%_XLE51k^c_4G*<})e<^MU9GgRR$wxysi*yk0LqUf@qyv5q@=j!IM=090 zoUxV-Hf%=-r`UWR>0#=pK`HGU7>BN*j_OuR4csc-Q@8NzAmTcq7a z8u2(AHfW-V6O%-97ldKfxcp4d3@i*stwDnz~Qm8*G9OYYJm^yWkhL7RhT`i)1xT z`tVRWv2x5?4Gc79Kg9+wXQjzkKVLtiiT6%W zyL!&hK=+yCzDTCXT^Gty&+-nr=?L$tS=|G7*75+p*!Ed|Dd`IaSESa;%Kf9+j-P<@ zmOHC!uwyNE`)lg%rLm9(S$Fts9tIxcDA4x38Ruo*pur1sS(V`uXjy`~FQe{HT3g>~ zuwjwFO>@$gCg8XdhPGkO+SI2F&qCyHME*8BKEUH{xGeKDEDe{H-vSK{G9SY#4rAAy zx!HGzKa9D4Ci+ed|A=gqx)b!D9%?0?hm%K)W*l%8*9D?yxB(oQF zl0D?U269jFEu>G(-dFh`eiZpJ{^-3w;_;~K2*%ZDj5A8pV2n~c1mlY0^%!?z8RIys z!8kh-x>+jU1Mkf0TZewmVI|2&z|XTh>c{*-j31EVwT>)x8ND~g{lTMU;Qx_B()%j$ zJ>rL@ctCfSdMl`{uP)1c4T}b_@)+>Nyq>-m^@PKRdR#sJ;`_FGIKPhd{PSs6-Us#A zL(W1VXT*zhS6W56U5C(;t^={G+()Dfc#j*~3m;x=pD|u#s`sR^y?9UUuy2&&>oCu> z#Cx+JE64f(+G~av?QMq_b4)RA!fWJ*2`}f>5%1WiSowAI{b;r@xn{jozrRQ?`sY(A z9ssxHRiS)FUD|YW#ZsBlNej4S(elg02KgNz2|H9aQ$ev|=g%Pa$pk+D8 zwRt(trDM4(!&vz)l(WP)W-u$?)=By|8dko!lXTB;R$kpn`Ww-#yb|f=20S=NsJri{}{%L*p4p7L%sOEO-}cre=OVcZ6qt74?5yw;>VrkprLRS5aw3}oq193}QJV48M z(9%w(u*M~}(I`{v(07*QE)8YnV^B`aXOxX9lS~<912Wg4Tr|o(gL1cwHpFB<4s3?~ zuwy$OKzA#4Kxb;!&!Dzl0qzj+iEIk&RgKA(G(y*s{=X-)hi%leWxDl zy`tSPvn5TiC3nqqQzOdDP?rpK$)Tq&LRXpW$el2g9q~2%1GLe)gDdE6K%Q?9C%frH z?J&bfx^8$BD<^;7GTnIyGp>Pl-M`{GSP47zu#l^Hh;`eVpqLs5*n&{liZtes`vr8b z!RSv>d<}x{l(SZj!%6{ujk*ZK(%nfe)ChWZEwsq4&4I&ZIHN+%lBy3*3E0 z+>W{RC>stt6AnA`9oBHtm{V>QWSQ2VO+Fmq^v8G)MLzQ3D4tIK6nv7(NFF>A*TJ{4 zt-<;ayYuA_3$dP4!t~UxTG*gtp_?D!u1EbQe~<8-gYURp&Rlg0=1TL4$vaC`3G+F3 zont^nU!;d4y%OnLb{4D3kUnOz&p6PFIoOvSaLrM>5iaxm z$1paXz>`{$Cn%4$gaV(5-{}|!Vq3uzqLBlSHo&jz$+5Z|IeaTT*D$ObI5GVZJj;>p z4_=$MJKPL^I&`xEeE1xEAbiEJos)qFPMCyKVTKcH|6Sp906&zE_@q_Q8d1XQer{=; z9BbjFDx#6vN^~B@bB?`)*P#>osISd=Qg*jB^%!JqtSCcHxed@66b~2s8#00Z7v;nl z&wz}Wc+!lzz5sMqk10=%W4ktX$v0E}?|_fm@Hm`QZw}TYiC>S)C-MUMsNXuvM{;~^ zh?yL}8lq# zdM`**R}FvtFa2Xf;?4Y0^6g779>_OM2fxWTjqfJ;rHmUrmx1T^;BVhUU)_bj+ydOU zF)uLrqu+S&<^FDLa39FtC2^04@^~4VNk77mUJ5;W82(x%{CJvIJ%KS|!cS|bm*L-< z=Lx_#@UX~3eykn*So3_O-yM)|3Er8flTBR;8+sV_gX%0sJYMD_&MWFMrXI~JVEc;E zHY(c$J#U$pe9OCN^JOnqcd;95xfI0ezQTM%yI@E~ltEUmbznQl*S~F?Z`>E>8lISI zbT>3Y7oUfXkZgl@yLm=YDE7h>EV2Rf1u3sP@_HC9pl>dsk1k<8^^p@Rr@cec`>&ub z+RKVYTknJa=Jb3Edi;xqRCpi{vt>J|Obh5S*)Yjwnd-5mNrkyjN%Cjl(|FLNm6_8- zduKf`PjWY01YMUv*JaR!wP)k}#=|f~q|4pl4!YXf;{B-H!@_vT=ChE|QIOSV1S{*WIrpRZ)yF<0s7bgeNS`Q zGWgggeNXWQ?>2oe&UF$082mAC?1AprBe$o*Py1_%76E}jN=Vc1?v%P_X-@;~bgPRu=tzIX4;oj8`G(@tEi*OI%Uj#_s z16WJ%0cY@jC!icq0J!`2fN9?U2$&WP7!N1}tOe`={EJ|9anc^ZT0kM-l@me2(|{)c zKOYYg3Q)cruoG|w@UP=Ng*||^fI>jQHv@!nz)rv!g1@X2b^^))1%U0P+l3vaJA|F3 zJB5!*KN8MN`?IhUP!1>n%zbT}@Gf9C;2XfL32wq5dGXVkjMJ-mS#tpF?0H!?Lo4Uh zO#1OXtW^@<8euEA*_pe0zUq?F>uE*Gb{6DU4hZmNZi5tq{M^TQs0SmSg0LX8w_gSy z5%ZjkL=${_FR}=3 zHZ9eRk=YE$8v!Ww4G>1!MCI86GVy!}Pz_K&5g?2KjD0y?s0|5lp7!!+;W)x$HsSq* zMc&<<7kMYuRxA2bS{~y45xOGY_J|i^g9DrkdyEze!vdUZt6lm} zunX)LyHU~qm5na_V>i0wW&SN-+CPzAim)1Rh+yT)q-wx%;92xVl<*p$7$cIw( z1m_9h`8@D?K6o4J8vy-+5HyhPSi5><(yM4|Ao7qN`Q${jFbsKvjd}MN^U}LL$omK6 zZPdS=bX8qHY~is`;Rv3uoCp=vX!ApqZS|=imUCjbP=U650x0}=o$$(%kA<}eUtRKv zur?3v2CP3eT$ns*yPyNaqRmfzE#-X`ZC;PIjtuY<_C$UxRHB^=(7r;1g+6J*dY@Ra zU;nB0?^mJz*qQqJHMCL2RXUc6dPd%y@m*``1(`E!w720b=iPiOFBWncQ%hqg06KtO zwu_{54mPm;jj%)h4s7Tk=n9f?iZ8t}|Fm2tKiUg6=sgcj$Y;17@pigr3^Z2l-u}&!xy5g8UjCdG&szEp(8nV}t$uMzJWr z*N`t(7UXvp`fESJ5y*Fu3-UVwT{h93S5I`aQI{g`V&rYb{O>c?Bl!Yw_D0_8`*0@d z0he#<(A)2Vw_N=ma3?Vqef?zR_)<4pvD_k*JInZp>)YQ_WicD&Uer?!-1||_Ug*m8 z&b+$O!R8S?Npcqb0rclV)I+$dfs4u~DS&tTBGpJ2rcZLj*`ENMv4U?>DrYxIm(w%x zSo=@A$W61=DZwvg@9y>omlWABMM@*uqj-Y3W$HEIS)j30(aSH>1#N?!w#B;=M_Y9! z+L#Sm--14B;uK2tLs`CJn_i_xn-yp$)_kKg^>N{k%0ge6%H^Tld9Fut>q9O-6ZE!n z)ZP*mwIv>OXS&9U$d*e~A8_KCs?)s@poDr(fAKe$28}`Lq@GS3`TQvx43dS`CF%G-X_h{Su z;w+ZBrR4d0*Iv=IRN`D*ZYE2`8HF#KHf!qgY?)s%|!KB`To%2NWtQ zv={iim`U zb6hxUq(2K=)sP1N1$8SS`*x#Z!`+0qaE}*8gsbCNKJDMyf*xnA-P&P1T*TRs3)t_C zMx4?QV86=-I{eSPjjksz*L?(dhx69`1yIS^HOEH0c>hA5N>wH2+05hlBA)k(>ErKT z7N047{QW!Pvsd#%JZEAZdxRew+6!O@xbp-XN_CZToUR)1gPO0s02>nr8*<)VUi)Jb zS342U8^pM*){e8)(LT}Nm!BPT7i0eC<(e^@cuZS zpMAn#IH>j)MggYdd4{jQa0}0`1K!5-dyC%_vKChhUoQSouv`3RVI|Vtk?)Uy%kX`w z;RhWm-70KFd=OwK-XB8x*LbFPm+|g7=*`oB7obOz7w-h_0O1Wh-&y>Ta2LAG8HBrx;ZS4xE@QsCh*P;Yd;^6NzzB7q zFcg{z=3d9gwG2XyiX*r&_#etCxgF1C?*)d&j^o&jW*5*>j; zDZ-tId!hUrOLhrs5Z+(%7vUcWGfO`fenR*O@(n}ySHSose-)B#`{mtTya#1J5%ZMF zpUJyx`%GRT!avwOleZtX=Mz8^;2`|a@qpI=YJdT7d9^<26j}d>&ugFtu9Y0fKO0@^kk&B!0ydJzFWtmg+qX9z)rlYM%{-11*o5BxQa3R zBI;k2;UdgJ_&3l|2N*e|P8c<0w~#XABjL%R+XP?0*~o1|6TsECN+5l3a)OKS!jN48 zje8pZ6MaSqyL|pbxS)~?m%T^BA9x;MC)iz(Cq3)eXPO(r^SEd#KoB^fnA<-p!)E1_))Wx8FuQuRvHk z-ytOvGMb5a*?hN@Nk}V!J=h5NZXTb~%b};=MGu*JG2$aVZPnGm1N^o?XRmZ~Nw$1DAx295?R-dtp{0?@j zY(9MKoGH7<0N#7T#cc`T5^VILd9Epce!|=BZNO)+^_S<_r+9j=Q;g<=rm)_Eadc`lWkzOy7LI>{R89sc;ovokp8`;jesoAfZjCO2$OwSjr3<> zA67yCcgOp;0f$OI6sAL`e<<374`Ev*JMbcO^kvMMXBl<4$p*X#9bOIFLH0q^{mB0V z?9Nc&sup#ylsUR`aUwxWGl?=1lbd^6=Wl>LtmNO2^ZK1vK8ibq5}3|zR^~U zx3Cj(=z6jhWGDU%NCVt}ZTJDU;xxjYWG7$)y2DPahHaP*JFyDz0&D}Vo8%xg0PaJd z4>lu3D4|1s&0c)sUVKkRwr z?E|=UJW43VyMqX;zv>TL(I57zzev-p40oXh^*6yjd=A(Q=mi>j4>bsVhHesu46PB~ zK-pITYJfZP2P4$`?GWZdzkdwd@SN&7f$RXy6({7?SpY$coA?%Dk{bkGrB%gkXsswp6o#mo^*hF)Q$K>6Fc|$e! zqD(fT*k~i%|7I821RJ4%jd(35dv`qGGhY`sPuK{_Cb*`Y@%47|f{nPtdn(T?uuq|R zkAmy1RKP}@2ki&C$A%xm{LN$|4q`rHXJ#Xof__^g{f8dWzgR^yANXUNjW{6AemCum;aag;@p@1I+abyL`bkV5;4J~px814hP$_Z%(h>*_ztiwD}T|pywzq~PChXLwk0v3`7T*chBVBgU=Ur`v`d;d1u5{G%n zMdRG#b|P0>O7jcMJI)(zi#Y%A(GDZq@}r%07}=N0-T2yDzq5VGH`N(Y}cJ{u}lsVsY2@r5v`z zH2?VT*q4ZZ)4ueCjUfB77+|t5H?bc01J=C0LbwxPvM=SZFZqwLFA+xja@)+ll*6t> znAw*w==Bv{*cW%dt-=k=Lrx9Z+KGMH`pCYNx3e$E+ogTk+J$}b_!ahLE9}cw*q5z> zM}`ON%T{5!-}XoLWt?i9g?(}TMf@&FH+~@da$19NC)t;j|3UjAgUu*`%^>@7 zURCv(O^`zkknSAoeTf@@E7(hc3{t92lgxmV$VX#`#-T~ar^&)J&VA{>{(2-*t018je8b7|2OVg8228; z{SHy5N_!o@xMyM9>k#)Wpx^$TJqvOFIJdnnw%j{5-#4axWI6+J3+p_zhm3v3q!fF0 zgLHCdd&u?Kl0H64d&u9$hUXvAgwH$|Bkm>7`LDR}`9^&l*To)kiRB*hD}1dC`^KL_ z2RC+;*FK4`0x%Ey`Qaq4HVE(50~)(Yd&rxxhit(5{aEZ%(mwJO%o$}bCkQ=XP84X* zvlLJw59*hReO@{ChDTs;IBTOz9;FXQya@4D><3@4>xn$r`$fJ=gw8z@#69NzJradd z=A#8{orX>WBve80=S4ZguN@5B+Uj~fIo5%Yt3f?Bk=B1z$L6fqTBOsvGVCXBLHbx@+LmKa2~Ni6Iy^^zGe{`=8c?@Rh(_J- zE~yjBmTVEqrmhp-^BE;XWB>ID=>H*;_6R+&Z~S)F9wBq(J4p|*Hgf*hFu_IjA3`kjMftO^7_Q*#7 zCPZ!&vLdm*FnFi19{bi=2&=tE37P(CVIy#7`bPK5^xfz@5q(N~xzl_nIMZHqCfb~Z zHuXk003q#L(>Vd!x0d$nS0#=5;z?m4(&!8U?dj9I%$2K>;*ie6k0<#a^~F=ddZfo8 z{Pe2_j%NGGoW*|fy;ovuA5My?rM=|( zOC9%;BYxvvvS}Zg_LONanf8!B#hz~*;DRF1Pwp;L(?0P5qpp1mYXJALZa{mW<4;R_ zpck;-K)&E8>^Pn)sev4*}gOFIn!P;?J@t-Ub5zK zd&$tN?e>zPTP^pJJKftA_mMSi`^eaXHti$RI!c%O&uFh{|JhO}C!t)Y`_E{nX)pN$ z_{g;0ar+r*4W=1;#a*qzoX5IZj*~am!0ns);gru?SA^&F&qzA`3f9oFo$zh3E7Lp3 z9FEdiHpiVsA#Y+G>I1;{oU`&RtU+xBbmO~0cI;DXu?}^7zH7=BuCKBlazlIav~Ljv zSvv2?)Qb?8Ion_jt#`Y9lZALs`z$yYq1Ny=YKHgDXs>DC6d~~j-(raCQ(*(zc;k;RCToMSIldylG5qypf~rJ>58wHy2#!97gYUdpHw}yx|-; zb&RczIsotc{Z720@5P8WZ(?u#1AqhMp^|gJ{<(1finxDH&q?>MiqFp2OHaCA;t9F& zWJ41GN}Lf`hJAnBwV=CE$=5bwEsGiFI6r*G)%L>kD8LfzC8pqP!ENYAI$tEf?%#pV zu0M!#kZSF)?{WV4I^^vJ&g%8R{>V*^(?5khk(3gx~+-lc9FTtjNUM?V9JxJ*G#2{fd!d(CjAQ15qgkLP$A{f3jaR;!pkArT;M4^Jo6-k~ar7R0aF`D#9j&QLypi9)Zz@Fod#| z#Yt&^P34e{;D(sE?K!}UP`G8fWNnXc#3Bh<~ zD@&7N0U`R*q-7_139$eb()|(EAL}jfCwdDt2;TwR!`|`TGlPX_)EA5T7{DI&eGj|d zkl`#O;5iI+eus6Z^^seIt&y9BZIK4y!^j%p9h98|coh&12todjeO?hBf{!2j_z1Ed zae_DY6l6X!!5jMt%r|Np!@dFYEfjcFtf0ldu?A~F%$pYiv6rx+$E!G}#tT7DL`|FE zyI#=vrVCZbbDiV$$8kqWz_r%YBAm^-Q5jqN!)G{~W!z6DU2zrr$&OA+T^V$pQl=Dj z-HN)R5Ylre0i@qZ&z%Ac;9Zn1SaUxPU3VS2?iluF8!(=E*sEGIT~}?U>!xD7z7HL? z7dq@X^xR(Puxs1jRFU2@>AdjnEQ<7=Qx|#1;(Zy;L*ed`n*l$yrYfP|uE`t>-$BP+ zdxf>6bYqcm%Ks?u3sI2e@EgAN);c*CK6*%XrU}_%E6JgJa<-A%B z-5wC!(=QlxUx9C~2AvKWJ(5HAEyvj?IKjWdRd-^F* zj`HDq`&0$a^dw^shV_Jnp8BN7zG})sZ<%3P2^V`W0po!XryP#5=fG@;I<7#{h z{a6~8#dV|+^_cVR7iq+rmx*u1XrGC1CK{FKPio&a*ks~A&4(0d>lK{g3Pv00+(QWB zxDzN^`u6DsoZ){SXZcfcrauK|`;+m_!MK_$LC@jLe-h6A3sbK@HFhe#1rWarbAX<< z$Gu1m(9f4kWVJW<^R;%+%L4#ExNC=vL%7O9M~{Jy){=h4-UFQj{SLB5_YQrJvGVP* zvtvGhj{a$xX3PiB(GL+G2JBT26hZ;HfG+?m00Mw?^JeI1rzZvql}7zcx|wuzU+CX{ zNH^)|j}SNM=wpj&q2mV$`vIAB{(F(6qj!^jF5M!Kjy?nZOnRDhH0fv3(M*gI?W>cjVvGnRW8q*sUYraV4G0F1j$UEZ&#efXPV^Cu9P0!9+z0x(k1)@upPxafAi$jI2y~>O#1l@boMNyKZUedg#Lhr6A{9v$0CG} z06maif{^UM8R%$}e!c{|qROxp6wuA10iQ!R=OU~^z3Wl$2GlzXWzztC0ZxGTL5Bim zKJj@~c-RATHSd>%DCp`sA78=7$41b2YlKgsuQlFGu!XLURrj72>su|H_jy66?lDH# z;4Kqup6ESo1N8SxzH@{*(9Pc1dGoYK(NH?qFYJYe(wl-!4wYkokb{1&BymzYCLbo_vv&$k`4CW z5B99ay^Ac-7SFc5Y%A(ZHQ}E+YW7q!e19inp`T5kzv>pwW0}5Ps>WKF$Gion%V!jd z-!4r$z>;W9<41g7NjB+#t&?si?@H&g@SQN1t5IN$&Y$Hkgx&Ijy{B);LXnT2-)8Q* z-Mp91HBnQWf^UgZvCldL5Q%5gH%7^}ee)s+kVZ0V{=Lvn=-6^VGTzO^w?tn9l949@ zFa&2UQvv!j1B4F&$|LDEZN-_A z`j*zzjdS1F{imMH?cFgBDWx+#Qe3glFpxko(9bpARlN%94dX_*sUz_HPfvXRvysV_ zr4v;t2YR#FcWrUbnRzwS_tYO_?S=YaD)#n??^EX$tv-(abXmZqh-(_vZ>ex+Bl(bt z&*9T+SM-HzFV~8={Q0XU-d=F}Vjs_eRp9%``SVX#PoKMrgD*A#eBXapmUIEUx7jF9 zqH}Ra<=u3#I2-4}I~n=!oLjGw)=24GTyH;|u^1H>K2R7Do)&<6(vaqkez*jios05x z)|#H{AKFFYdpe4L`5GtJeFc5m9r`p9@CG1-+399u4mKBaE_a-ln}_EGc#g-JTYJD{ zKo}rrQH`KO7{6$f@HxT|*!RuGFvRAWykf2{wcCldo9{1HJ`#$-IR%X%o^eH1b`?;^*P zoxL61C~pD60=~QQYhzfB@W%ywN&)Yo+=01EcgTLh0?(8?iXnbyUh+`Cfi%zYUg|TU z0e+_;{{^q9Ql57h;y3sOd=tmJCeKXvQkUahIo_4y9qurhQ;zi0_@?12Ih&JcVz*_&F!9^Zm;+9 zblU;i$`>e8F86eF%k2f=?3B6lyQjPc+WN%ChU*c!I7Ike*4V12W9~2z-x)mX=c2wG z9N^as|G!Vdi15pb2*2DcRZ1@Bn*5rdt$LKoMU6FPzt8X<->T1P#+aseM?v!;(B2#4 z`J4xfq`lx=j3Jt@IQGIfpE$#`&%OFK`{_Oen(t`4v7vv$^H_}S zDfUh}Ta2w|0n-870N-P*e~EE@8sCS~T1a<{ZStqDL%-76hbP9GH^$oERWAu^cG>0q zqH=c@jk+T0rp@GVJ!iT z0YKsEQjCMrB=QBHgzfeL{B%4*_&eYQ)WQmSA_lx=WSk6hDe^1*}6mk+WaTBl)vOx3hn+PLtuWbZm z;yC2tI)L;ntwq{F76t&0Lp~xD1N>Y^*r~sSOqg_dKgj8E$iYgyo20Q*A4i}6+1CxS zf^}=i!gaiR6ZgYjNBWzf<1HIWhQGsiUA35V7sGzgGu;Exj5Pz?tr3|pd-Covpl|G0 z2iy(ekwWL6wWw3k%ejKX+;#(=P4n$oJj=Vsg5a_?8JPneD~(` zFEPi*x2AM=-EiDHFb3-=ru+XWUWRY8O?MAayaDTlrn~$;#Mr2(`@PoE9Xw+|Pa^0_ z0DYrDXFTSx&*HmznSP#}_b{)c4CBzejxo5u!MqN-FT+$vFzQg?`>0L${+#On0_`*1 zwI|X8U&(aW9>wXdwNvu;Wyav%q;_Sn$Jnk6;(M`nN_En`hlGc|^%e6VE}mn@9VCZC zH;eByeelkVrgd+(wI>Z_&F@U4xcQxl6t6eKExt#*JL)&_fYRt2c@qyPzAgawj^mr% zTmAW(2e=1lEzbs1{}FDw_ss`q^qcT~tp|l(nig+_53oLd2X|WB!d-9$wrm{T!*dR2 z*6AJ~L%h8F4DX>^EA!Uj+r=RYd~;@MdtdO_RQGVyP4}NSc*WM72YwTe(y<>)@7CdN zHB(-qv*GzR-cX$KnfOTY0Qfl1^0*h!jDP0%(;;7`{33qzO*{PYQk-ZN>wC7XzV{(3 zCiDj*V| zfWLZArbuj~-`x-@((eKKJ$2r8EFuW^ORvQF-3Qy);B4T^0WLLg1p^n#rzkLA5oOEB zm)YRST03)|co@1r;)%EJY4Bto@DU#^c{2vzewt*R`l$i?TBbgx__^9PUS#6goEM(( z#jk=N@!$vMS4J9_6OC^6;E4lxLVOzyo=iqNa?uWnN2}@1AGZ|H9fEK$LK-7y+V!iu z;li`juf!K`T_oC&h&GU%)tkwg7$4Zye-zKam}!J;T!4(=Ta#qHQJ>JAr}VxG`Aza* ziktdhEDs%ED*rfLIso)E;EofQp1ko+6P3Y9dai*?uVfec>iuPWxgYW=%*OQ82=@M)Zl{4v&7MLO3U ze^A?dDxW^GtvtoKK$dDLhra*G1`nt4f%E1#8}IIbyA$}J(|E0elZ?y}5Ki=|?e;dfZ9P%&wH|1Xr z+0TOPkAmEj{P)3lV37R`$bKwjKL}&t-;sZk>CXb&bmRf)S<;dI{q)~(eEHWh=3%nA zL34j^J5%&nJCiV~&CZZ6@`SC~26{|3pf}PUX9rGWY?|klL${gYWPcu4mP1*S>0T%2S!*4fqWlqpl~}{w3RS4z`DU z*{WeI^)}|;O>vz5N(un?Fjr@Cr!JM?9_CEW_&XN9@V|QC{wFWP!sga@v{TsN3%D1` zWLw4dfF^UAGoFHvoT91Afj=-A{($5ktX7d9;LX`5z5srGOa3?3Y3*@Gpyc;xRiSiW zAnZ+C4({K-T&+B)F3Qg9D*7JjFL z>ViEQ$K*$c2eO+R&?nDg zVFPR?*)+bVW_GNiethgamy|%Phmy_8pfY4fy5Px%^k2u5OxzvuKh2Z$SO4$w#L_Q$ z^(9F!%V1Z3FPm47dDQRam;Aq^mo0fWPmp*QB>aB7Yrwg#&UiNgW5(R4Ys9$e;M2Kj zX7_CK=jM}<8_$@Qh50?D~KX@X10P=%-!~UE6;B@ee{NOWKk0?&}eQz?()yY1sFtceCXK16zo>5$j_olfTtp%CvBfX<}kjd6iJO=A$ z;<}98zh}!%TxosBKT@(~yGzF3`)N`_$lZU8tTFHV!I+D8^&17a>$yexohP!7D%i*F zhQ9!(b`Tr<)&kDmWFI@DnZue)(;!V9v+0%?4_kNwZ6yEc4gWU(X{PjCQ>9=x*v3Bk zC9PcfBG^nZKBm9E1o2|TJF~OiHp>ztfw$#FP2DcEt*bUz(!ZSO4{yI7(HA^eigkxd zCGN7sx*nYcy2|&!?+dvnem{IvNEy~D%CJ`P9p{+XxFoJ-EW_{c0B+!Sv9M>Sn~wSZ zO__IS`dqc!Ftl?$=!s*R=nHsX0=bRz&_t~-QQa$n>@LLot+5YlX&j_!iAA13yg%1p z(-MH^M*J>84B|1ICi)!C^u%=6M4hw8eOFj(K8O62XCDqUoAR%tXQT%)PaUQ8L`d`n zpbok>>LPfP#n~v|13jP7-4>uBfwR$NVvq6sAO_kH_Gc~Uhid9FnWK{EEyZ1t*Et#9 zOKAa!pL3Vj97kF#o*UJyr54X2;<}L{_bOzQzU4lO^;Nnz@dC9A@2gSgd!Y9+a9%>2 z-otn7@1g!`xhDD|_;8Wv10PC}r>7YY=(ib)i3dm*d4T-Ch6mJki7yCO+tirzp>c_< zCKL4+F_+vh=)VMNAJ(p6!#qH9GNq^g03H0+$eQiYjnw~ip6VM-FWs_2wHy5&-#)BK z!q*$u95kZlyUinOu7OT!cQe)&yP@55f7T7&S?9`YqFvEzt?VEbcAIh3=={7^J&Q?xOrO$j}DVEshtED`(D#qNA0EGC-@Hiy9|E))equo zD)Cz?&DiIlJx01~{RHmEbdhPIZ;<>c5#lW13G`83PI%OHgx>BW!$X_j|z&UP7 z{t`I4Psa(ocGS_jKdpPx?+eoJ*6jkXnuFw!c^k+)YayAXb;&EdCYsJx+S8rp;O!Nh zcc?*LF&%PG_facQem9kWN?t?#dllu?R35fZ0Xh$(JmkDZfxfr`J_l1AycXl&DaC0X z`?z^0?PJ}a^fC5_IP4Sg*e{Y{|4NSiD-OTg!x=2+8stldVE#e#Flo+KtcpTffg+${ zhf6?35%1Al1)iRzyHBy6UxU1cM|l^iLXp>Uo;DQg;V+Dfs_2gS*c?2ou?Fb~5G4D=#mAT{**h>F}Ge`2m;@d7|GkuwG7gKvSNVk*6H*&mbSx(8WAK z;H5boFYa8VqIGjB^U`YZzUm!6LZ1=M_$|%UCfH^#yzenTs=`FeEZ~#Y>WLN)!*J9i z*+$yC@i06k#!dHQdl-g_w0cQ2Ku1y8LewSo#|ZE_4*ZS<-(#>ZcW@K+!-KrP;F&`j zk9RWUK|d7Y_kc0?rhC$fM)Ur73g?!B!QZFBUz#5;-Bqme27j}WmSao{-dUnjfv200 zR%1*Xg!a!uf7PMC&hkB)$zQ_y#Fv%bSU&Vu>TBRvd{I<|7v{Y5o4egWH|{XsA?;In ziFd%a#>mSrVc&|%#Nj;DCfb|89QZt~kriRSy+8QqWb7L!aEe6nUVrd2@s+5GO8gez zbl11noN&{vp*7*6IoMAD&zmvlb@bFkVV^7d8tisoCB8ecW6>?x2c|hT^|cFc58G<5 zdzW(%`I-T~J_TB*%r82fk9m6dw8B;IgXZD9Q!{*^R9DU^(O>3>pM}HkZQ}b0tOM(z zYIO|Za2adn2gclQz;_p|9M>E;DE59F#$^M~hWg8#b>}did7J}siG{6+VfrBa{=)^F zBVfymYR|1Gs?E}}Q&n0vW&*$k=bx?@Gd50NUD!wg#ZBfnr-Z188g4)@a;YO>(>s=R43ZI~pJdS5}$iXe4B01Y{)+G7}5g ziNXHvAyJl0yo$!!I+gbaO%dQlgoDHj;sFOdb0=~zMg&)BK`W*uEu@G$>3xkX@p8ZkhW5EaG!+b0}jj=EjW8p6t3zfV| z919F%p~zVp3t{NDYYRPSM`_(DHz%rMFUCT?>zXww?#8izJ&!lAOho|06_gqV?hJ?nD8rPV+zK~RE(K7u@7Uut~C>~HV*qRg8+n6 zi#?10$Ve~9NCv{*2#e9bK?qA>ulitI4aXhe3kQxAWoI~V*Sv7R$oq|uqarbV)cy0~ zGo_Cb?-VWKZJGlIjuOWj-$7;{AHCNbR| zpM^{B9~QQ^mFO4odkgxl+^&9O`!4hd^~GG^pffhRFkVHTemwx^RM|~$u6#{Br%euk zZxjfK8ZOcLN93n+71(cX5cxsBD}g)G$4c*4;Qe9%@$X5r1v+#G>G>4!jQXpQB zzArv|8OGxIFt5Vhy-cTqzuSN{fTzJz%1ghop@0t;j58zm&axWdA^x6>{o4S2H-^0c zJSz?k&^I9+w(KO+2I$}Vi7WR2J>>HQA`gZ1o6k5rR3nyU5vYTF5S2lNz8Q+P-NSjQ z!;{~LQtx5n@5GW!(Aip3S`2jj*~vqrs2mriP4?Ev%m0SBc^-x_k^OV)5L2FR$U}WM zObp@sh@rc|M+`mj`x&EPmqx-ajeuQ>gI$Wn?|vEkt&4F*e0N59>aWUBoN<6pphX`w z$vi?aSH2OlPOV?gm`hkrc2oj>Z&$;q&xm~SjnLPAjxhoMgk+5PL$XAA8#pE2)eqAD z0dare6Xg}5E8-enn@qe;N9csG3L)*ahLGI^&m=!-M)`RNIlBWO`JuBu8sw42zn9_DdcK@t-0fH?$ww9BgT~+| zNGJaV`6T%e$DgNR{b%^?M%lfgmVIp5pBqtMXZ^Ve`og@Ai_ynFK<`OB9jw27pDQQ% zqIry%Hf6B>I?`yZjcAd0G+2KXX(Sg1KsV*5_u{(&5&H8+9Hu@Ynb`_@h%fJpp}XNt zF(jGke4O7-`YU{3>376VL+57q9@&E57uu$U&q}{fbvx-((cifZJ-d{DB|5v+ZfHH} zX8#Zz_rRUpz+eA!>tF@buFCFh(=ufiD-XuFSjziEo0o4wc?I`MH2roF){s)C&%(JS z!qW@&$=Np8*3=Wj<@h-v?U&@MKP=pfITF^D(3j?AvG$VM0R8i@aNnjmW;j|wM-^j( zMc!zK;B4N$O%?Y!4}Z`?&xF&wt+zl=Hrhk<>;uj!&|PFfGw~yx_(Alc|A@DycAB^C z&Wn4%C-AV4$M4aQ53EgAp}%OXr9+1efnMMFgP%SU;Tc}7r#5m5x<|h|?4~DtSM8TJ zpp*76_x6xvJe_APkIT0c`OV@ASQsYQC&YGq+rI#fi<`oY325=zef-@A{G8MkrAE>tR z7N2*9?W3=pD@w|I0|T9V1|Jx*hkk~PO8xSv{4C5jQ9hfM zCKvIF$xH7r*JZOfSB2{`_5CanL6`2u?D{lD#)PkI;FDGt!wDL)$^TTD)U=MhT$dI$W{z_)5b z|FL1rtpNVC;^A|rvw1ehlCBiID?&OJ&IYG)O+$C^H-;`<%#BlLvHT{oU9-4xmSq%d zquWv*zlqQTd;ni-l=w!r*J0HW_`aR-SUZ<S`+?zOhFxf=KrmNcbz zl2-XMm%r3ro6NY%4syUc$?xAunzpkvTW#_R$fgFNB^~~9ZSrDzhp-f(7U4n)JIPy* zcZGP@fN&1NDuiz!tVf-%Q`kwFs!r%>=p-Mr>qr~bV@YoV_-vWRI?3nXNt&jUwDeBW zw4J0?b&^)!Nm@GEHW0j^(2`E#5BXTcFUxntlb(1-d>}uS+UZYWCwcul!Oc2JO9y@A zt5F|_zFH@F2)`}z5KdZeAv`>lLFnGt`e>|J(u?2rJZ17R)J%~d*M(mE;2ziRw?N51 zP{hE`c-jA+zo;YIekartXGs@0*8r#J6MQuQK0#Y~6K=)J>G!a1cQOQX7p(E!^yikY zG0)eTovVkPAb(ncc`kIrV6v@WgVvp~A$sBq&YkO_vu|oa)4I6@_u%{OAiKQ#0AKEp zGf$Eo?r4`pThSx3ovoM*`hh>Wt1?8NxeX?po9)0>Dsp0Iow}t7zlT`Q-56THHx11u z9hAZH4`ZEP)IWOyI{5q|Urvo|@kTqcp&!*8`U^VCWXIHEI`5{y+9K)MVAyq>n_d~R zZ;;;qV`4lA3xV!yIOS)<*DChe!{~CV$ltV z|81YFyfb>MaOY3SQ}S|=wy#IF>;`S(^O2D)J5A5WMz(xtdj57~%LjPwOg_^gpCkt! zkk86b@q0;V)51NV0q3G(ux^`;wJ(J|b5jg)PRYUAS4el}7Tn!qP>zG?Sv4pJ?V`Ca z<`$4W5BQB8<+XC5ET6_*F5z~>w@~1@h}#Lc$9kCIRt*{rJPyE@j=YsT{f3kH-RI4H z2*on4D1&c=LXag69&F$uy|l}B&X0NL z_Lz5`UBAP4-KuEQV_Ru$CF-uYwj#7x@AU)qIlW~y63(G|$o|%Z3_E>}!G_YdhOEQ$dRr>9RT1GuWwwUw>jj(+#o?r43=OB@5?{rU2HXkQ)P zMej1b>mk1Djd!$;Cfde$cZ@44|v(1_`ny)^c8=^m~p2y)b0kZH16JK3$U(%-y&}HVRgZ{ zGl1jD9!;)QT&4Xl8OH}2scTx?klwG}@lfGCNkg$l}AQbD{xQ7cffH#J-;iIDF7?t<$ zlIKQrB^L4&D4*gSMRWsIHJm#y^_-_3scZiURfb>dw(^%%L*pLf1wG%M#eHh_Eb5aQ zrefv4qO+(4mf-(?MVXpt%KVBlSE*a--AfKD4 z)JW=m9k}&%Z9=8v9Pr_T_1ZY)I}d&u-wWTN^B|R=_owK%zSGrEc2sZ~C?mGOUxf>v zoedktIeo_rPM`3`LDVH_qC4{vm-%NAJaYGY8y8=}&OOijn%Y|J^`a{J2Q;-pzlT^oKj+kmm-$ z0|vqiZi6QbKo8oVd*r#Z_?#9pZ(Ti)tkExw-$~iabr@fu2N3;I&iw`*7J*|DaldXQ zzOs2|-h=1l_wGMu zBH?154a8-iG?X7+82^T@pAkL$xv^oilYQ#B5$KmR?giE=6N~a1QaJ;oSnkiJ?~tqA zLz(A;_i4*}@UHDJ%fLB{u!H&$dRd+SA+Im<7|X!(_E24NP=~CSgI@e~`0JNCCSZ5) zBj_qv$Ai?N{@$p|!o@bHPjqP-d)39)IUNJTRFBrtVQnJShQje$q+4Xb!IaIyMm`I_ zTm8O2d~B*RJ%#UPzVJW{_V-;Qo`X-vxVw_?y~H1IZdbH>m?mMAd#Ls}VWfMowkkP_ z`R?(yLdyX?X;GrL{H&}Un)TwrwzTHFu0iw7)|JW1H??(%FK@nMZ5DR_FW_4%^_3(0 zW$gzhd@JRBH}cF7{OmY8D$Z}`{+QURkGh_;Y|_?Y2k_$dmC14@q-TDlRn9d@+m+?n zk8NeJ4yjY#hu{YntW$jVhEQJY2#UAkyGQv<(z0}0AvJRfbvj7Pm~XO*?_t`m43FU1 z3Xb6o4MphIbR1(-BRUCF_`2i==lJ zGfz7WUoL?!r=piZ*6^)tTwCbqU5)O|9BH3zen5DjDUrL|W0Vhh^-N7Gp~)+8Dq}iT z`kwq(``)<6fZujF<1vD9*@`h{f_|B&=eCA^4c-js)(mY(-wdIS>!FG3p^0c{AX}$_ zXm>X0Rf*E)QSKnEgvAY=^CI-}4)h{%w@wq-H$Y>Z;s(wcsCkkHnM!<_^Y^Z8G`6l6 zy{_o?ZklgeJ20xmXP$p}?G)Os&u>v};U9y6YY^}a1kT%lcL4kQ@Q^(QZ`4^0J$x8? zOk-s-W9^nloek~hw_V%NXmZGW;53R}OY`1c=jU0fmD=V{)Au9_2b@+qKRAzH?I)bw zBCyE*m0wrczH&wHurgV17svR=jR(4GPn(>BOHwjwTi}8s$nYmoyu4 z`kdEA`HpN9doS_jD=B=6dW0u$`YZJY{xOz$R`kq%dbl>ugr{bJC#TwVtJ=M&kJ*f^ zRC}kdHT&^HuXj4!gxU1{&*=M~)Au9zUk-hrL*Fa9FiHvr4zxZ!ht4lKU`7Ky*dzZU|F@VcdOL*~2y&sy0jb8RtWxg&OL_yxBU7);QS zmdE%Dz!VHy?jMK_UFcSH=*65fqT%zo5gAJ4fQ9+8FQvAXLRXvN3+vcZ9|CW!L&v%< z9UmF!DC5lhLsPNuvvV#>I^Rs#{Mohmdi0=Tn|Y8u&q{X;zBTNb%Dvli$M1yQ<9DWU zx2&eA>Iuu7{&={mHgN`ugR>(v_CK0=!sUAinVc13ilRPj1){JOsNq}?IoEOeB6VOl zXX;Jj>HJ&n4(0g)X>YDnLnjbl%(IBNo3k`l@l?rq8qoH5&0Mdcj~1VUMx*gSUB~cg z7iUB;K3g$PO^jDF;}%{rm$M)ks~0%?;nTj#_h+lZ7E<}nfj>C|BEy+#GxPinJjy)n zKL4~X)=2UGu`dgXdirGC$i7Y(W-}>DTSZ? z6JMbJJ_`@clyw_tIAK%hD;<}yR%y;^Wpdbx460g%OFYBI9#3^`U%oHMSX*axHl$9e z?Nh^fhsY@2y}(=3(Rt}eE5_UEMX}_)R5OIL8BM9SqBg3!X1KGusI96lo!CdOJFS(o zn)B4|QKmFoQL_IZX^|mmHdQTqmb2)`@y2%b(q3mg_S4v^)WE+MVt=lO@oJ`%_4b$G zLTri3*#G{GgmWHw^j*S7Y2&ykb(84D&eK-WBb3gW^=KXKG~eOiEKh$sYiMU`pq(|e zvyOI}n4ep=^9L>3N#3S*vWC#xSwlNT?{T`#J5n?~d!&E~Xv% z^jAJ(W-;x^r@!(UGoRCr`{rN2cEgm<`y8dOj?zb*8yCyBOGoJ+IS)BMPE{YJfASMm zwR=LJwG;KaQf>L|RrN%@t~6VI2gV<^M1!$?6FnO3_V)#2L;6DGj9{BQbBcHTfi@66 z`a43gaXK7mQypy(8nFWZV|=d%{vmf{tt|@lLn`nW1^OWs`0Igx@cgW`^|ZTa%4dFh zqYXl1d~d>iDs2!NOQj70r(=TP-c(->4+^E3q7dBk{~a~J^%!{knD8^;{1agva>7l{h6(KVFh4dtQLD-(+}Qm76z>ZkfUh(f{Bvf!@<~2f z1NLM+SHwEi2@g2es2q*Pz&Ga8+xaHz-y+tiMM`bo2mYmADVxq5aO+>>yPU1jwsJ`? z|9+-?FC@KafU}{Pu%w;ehN1Yn0Ts2(<#h{H#kpAKZ2o!+L*JkVX$_;yw`{ey0*5tjouk?KSP2OC}iY#5;##wzNvLIW7FL2(; zrJ~g(u|~QR>^C?rd1Y8hSHwBm1`_`*ubSWlk8}*l4LoUl+6)+0e%6 zdx5<5=pd(P$Se3JEMnfNNOm?Ww^swH0$yc7gyN}ET zBHw=BiM~SicER&>;#bAd0&rx|swYNh)uOKrEq^;@oM#*L^7jybp6`MifqQ%u=Q-%| zpdaSR^ur*7((_b+y9#iZLAyo2o(JwWH{s1(=|HCHYvw#M(jDMU@GE&7;EOu8Wl}C5 z8%@F4c*+-r;4Fxve*7<+|D7ezW5Cq_jlLKN&l5`dvxLRJ@XMyV8P7%E5xGund$-0< zo3dsX8b)S3_@j?W`;KZ5x?6Z%Snm>OUF@Kw3^?4ji!uxOF7l3v^kU9|ki7|^$R8d>+4S&6S4R?iY6SBb9$pNx1ZqFFcC_vUjMlwVDH}f9@I2jlf)@D3sR+^E~ z!r}(a!QQ&rUz@dZ@XUvPtaF2Y;u2pEZx{&NMXVibjiyZVJXu?q>x-b(duU6>5az5n z*7a|)ufqCxv07UAI&0^f=@0f;wm1gebj2P^z8W!dV2Wzfvd%nw^!ih0ldqk?B{*YE z)-rDqdpO@AuR$vTFkB;Bpwe|KOp6_(VT`jNZ?yr;YYH{I)$_-bo zFOT+hAkRSZY$lIk_mHdBrGc~f(0qAU&nI++-qYWPephdU%-4zYOlu#GDe>)H@WI-> z{`K1yHKLt&;~Brbo?o|p^*JLrUkJV4eZjBODM4rP;ey1q=Nnr)ZUMi48^t=oDEu7% z`#(d=ml~NPRAuUI&W2Ve{p+~Kj;i6SMngrBte@=aQt@?pj@suJe~xy<#+&~N@Ai_e|C{;m%|P5PI>Ouhc?E9d z&B9-N?uVnaO^NR{gGpacmc#%v{}4OrFM5WRiOpSbJ-Hv;CR6Sy^2pra&zD$PM?R_J zJnMrbW1{$Z=<7=Hk=zfj&|%@9Tlrrw{vmn;;a>*B>O#ZhtM}6c{DXc(p2j6c^i`3} z-<;7lHyYi%5q%YVQH;wH=Clcm(N|8=4s4vI9e8$$cEG_pvqq_2-={BYSf8Tn+miN7 zJMS)FPy4MZ+l;?dEw*}%y@I-qWqoRvEagFeyJQK^qCP9(nRVd5o|JRz9%-5*P}ALF!yD`WbYm!Y41y9R?1EA_EOUr|Fk@F1ORd zcL<#JU|nm@lYLfAm%Dn1%?&(n5%syGzSho$?aSHgU`~69aN!))5VYkIxk+TGvcETO z{~LW5TEECjhp?X%xv2;ki{Rt!fpa176-oPF=AYEB$6s|e^a;j)UoyB9tN(_;6A96&L{boMSdt(D38TGAB{He5Yw?{WIrzjG_bWDWlj+BqsZd-_E5Hbux8 zU*6-_Ra{L6+)_Uv=dO+ib|(`^kqP2q1#{Udok!GJ0h!kG<{6e6lnUG zIJQwaloH;>-pmnTWlVf<(Cj$Gm}u59H2dE0Kfm1`yydHV&8!JpGcGRYF>>ab$n`@q1)1c9J5I94=;QMd8GuJUWBYH{V6ic_x_}GU4992$~xqjb;vQBky+`# zZS9dGe#f4KiM(bWkz+sWXmr%kwhLLv+WE-pn!?6jC7{DQXg8{vb;zYx%O~~eGC6t` zp`VOcr*F_T>fFn?EKS#CC0{Lix)R2K?D3>8bzV3&NqJKk4>hgTHraP5LDpK7Z}d+7 zNR^eQ_v>8?P3dVHjNVwrkjN3Gv`PM1dR@QXCg`%{Cgfz!AFqimxmEHW*`vH+s56K9S)aosoBt|5vs#doqS)cud=|F~M&#gLzH(?osLx9Bcef=C?Hh z4{NL1M%FE?n`G__{l1w0>HBd7@bm(Bd%<#^6+BD&C`+nsQR_RiRZ^Nw`l4}#^3`-# z)ymS%rjpWaHMgm1^XccgV?y~dk+qz=*&pn#F4fHdSBrnsNABe*rTkv-f&hh2QC4dlncN4-xR| zR?K^TBEdb};{e>QZ+zPN^dtL=i! z%33-&eizQXSHcjJMSQ|uUX&2Tl>6LadwokLjGBc zF4!scKbqHY1l-@!J*-UX7riX&?U`Sq;}>0$#@^6}H}ZdYsRqn`nQ9%S{6y=ct=Ek7+H-Zxb>uyc=Evp9(;aRmy z1TPWIc)3Mg+MDk5)y`GEmw>zI)d3B+-5gd{9>Y5LLsju5_DqkErsJ%7K*Q_IZ|8^j z{R1vhr;LTBZ^%BU1K-Z^P1ZR=d$NapjI~cE`gu#PzwBT5UZbBU(Z2E%iIe9eLV-p0 zwIZ>bL7qBj=HKUWfKl_VT_7LBa$fNh;n*$ogQBK;d zzwaB+Fp6;^^)4b^Y!h0sPa^Bxhi(n_adPE!zUlej9njFr>4#VHh|PTgz9BNUzDFJ% zk7M#0keRS8XkXa_|1t?D1pX=QxRbb~-O7J25K7uF0&Oeeo50WmS~?0Ih3COP4sOtW z7LzN7^8JfmtaYKIV)h`j1NryDKN7;Ny^E8bzI{St$exR2tx4aTj&QauGTbY~xAD{* z9MJFs#(=cBALTFdzmmfP8t%YeOw#(2CjB92-O4$)at=zR?k}BKc|G4GJ(Do>Ut$9# zFxY`X{HDVA{u6kmv{UB9N_^)=j#gztr***ZXkWrQ*X%KcJAI;0%+TP)v^PPozkOvJ zJxr>!NEqnXJvm`zBFml~l~+-M+#xvsjK01!*9Bh~27ed|pBMta7>s^z5c<7=-1p;` zb!A+Ld@TANjYsD@fqJW`SNPP=2u(}#E6f()3rDA>^Gs9aN8BN(*oR0X-2i?4G$$-U z5f@sMxVb#P!j$N2XiZv%X4-GM)bG$B%4f7!K9Lzuc7KJls5S1rFu>1@z!wIb;lO)2 zk8j-5`hebF0b9$>OWIw)XXNy(d@ExvzVerDY$1BW&y8Jd%F@-AaobM|_jcXvS7Ng%}%|J-}}=S2Ga}L`0J_h zr_TC=Mg#`vA45l<8jJn2urH<(@!@2~%~KYc-!ZuF=33Z@s3E_ha(bv)+;)0ZUf zEWY>g!o8Y5Ju8^LC(++7gFn41d}_>ZHy0lM z;PJwT?a-1X)7Ba~^gxr3j9F7ScFgt%lGq#bZ8RQ;vUIV1#hDzX3lgkKOSi2zbg`x8 zrb2sZwl69SWxIKoy(Eo25Iqdg^ik+FJtJMG>o90KO{eKhTR&5lEft#1gr=QI8Me{| zudFp)ntaH7Ajz6`=ail4&NS{|QxBv?rBmj5+hPMDa-P)foZDlkZU;HQpr2!pEPfDs z;?s^an>TY&TQ7DLtBXz!xFq3(GyZVmS${aGVZfz&+7ULQlP&!H8*LFIZnWLUzU+!T zXLelcPPQ}s!tGBC%gY`)Ai_Q~lbc-n_sx!5y*f6>vLbe*<%!stmM3F#G<9htd1np? zx5tt1Oh%4vRR5mjdxCsVl5aKn$gf#1uE-l2Qtz;kdT+f-z4nV&*4yhU^`=noceA~N z?#PY@jxUCWbBjWReN<+5TbE(CWXA(hExs`fs^P{kDrM7E%8)>R(Cy zk6*3+URS9<!|{iEOQdHIR*V%>awBP>5mV~?vyw@ z`??Mzvb()GGW*7N3$r`^Bq}>+QFL~fL9y9sahB}vE90^|?{1Twx@@-cQ?i8+7caPSp)8n-2&WT#JiFS2suT|T%q%#xP)0Ms2%}d5!(AN?n zHvEf_U77E&nQ2}VTo~Vf&a`aI^^JdY!$ulX_?n+;C;Hz z3)`kz;x+8k%R73YGgq_q8+YS$B= zHJ%p(!j8)0P`eIFXu4GNBummZ8M{lRzNR|lAChiY=K7)h za}auv*1)+^U3fVQp2R*_y@!7fq;A$7XWZm*glV44XxRf+X9jIu`Lx-*(vup!`)T$g z_M1|*wF4D)va|zz6Sf_fr!^W4tjjdy7z2G}M2=xyFg6_d3tPgutXKDNF1J-x>;;Z> z=#(PS@t@@m4Y>#FJo*$_C$tBLe}LA<6)4-=R8pA1++n^{ zbSPd+^t7IT_o2a4daTV~gx+GNYNNO_MC=$c<|kQ8_Gfrxzw;RKbCI#{;q$HAdt~pO z^XO-4fqkkk*bioXT2Z{%v>zE0UFB`SIslma1A9N(PyoHN~HIcM}qyoaF!#8lxd_hvbsy(DRlloT~N!v); zLfT)0PHiFg=AfGzotnGI)h~CkD?G_rrT)};dU#4+RmnS@U1^Ula^*j|*flwKiEGlM zOI&Gxx^8;jJ6&9cgnYiIyC#rF{Wi^|In{K+m{g@M>HTAIR;B(ab-LuyOuKGP1-4)w z_1o00{_*-aEGp9lWau?UFyvx~HskE_ESd^=CSc2=iuoV4Ho)Nr{o(f(nC!+xekdY;9$;SJK>AdPU?yQIBI+9uLAk+#X}92V@0a{3`m@2gHRdOs{$ z7tQ@}XVO?BNx#)+{ff1KHcjXwGDVF}fY#QuPPIX6+3bngp*6w;`-HGW;`!MVxtq4Y zQb3qsUu;Sw-Y|BbQ@uU{S8YZ@qyWICMf%WltF|E z_CF^i5+9uXX_B(v<{UzpV2?;nBtA5|l}*`4^czN)VDDl}B<{-Ymapt12M#Apu#d=3 zBt8P!L)i<5jwDR5&m53QyfFKL!OA}ByQ2sb><0%Y5+9v?$ffMJ-!+CX!TyCSk@)S| zHRB|0Z1yfgg1yF&Xs@FmilM88-PFv9(5Kjv&4fNB^xzwqrA4mIQjz-?=BYE2u)m3H zk+z3DR}Z#Vq4_$J7MWo71j}t?U)6*B8JfpPT4al~Nt}b_!OuQ4-yZf)BQ4E!74Yt1 z%@>+yBYK?s=FLBprPTiWw5a{-fYnHvn{}YTy^(!Y`6lrK;yoBwV|X6sd5UKT&+mD@ z;<0kqTpymhc^2?wKD6M8di_3QjeBNQrJX#R8AoQu*w5hYE8oj-?d83K@IBroF5$jF zdR>cj^Kbn59fYCz2L;lnv`AkWNUsP<|26hv`*^SWO{QxlqEIGB2qvo~6djJ16KSW77&)a=JC2K%0fZw6GeyQ{ zXqkb5GJ`_Oa8H(AX0ZQT%8(Xih6c(E3n{}r)Os0Lpv>?VWkv+bj0`E$FHoj1P-aw% zGNS`!#)OpVA1HHsb~*f}U&7ez5~bP8xtj~$6}!wi!s85rN1i-zxd@)tFCkCA=WA1# z(XJg=H$+&R({@{y#r99i5Adi0LWBL&1f#uwO26zs!?$j8_9p~~ZH>eS1bEbKga&w& z5gs)#z@r8c8sJezc+}tkj~YT~fJYhOQA7PaYQ!)?gZ+uYM*FA{uIwk_QKLr>Cp6eO zQJVOO>}`e0KIXe42@Uq&78;2cW`6+P+I*(JSv&<0LC5b<;`%L*4A?NZELl( zuoLr5IrEL23(|^*^DYm@;X@+%8)Oea@}lF#uE1x0)ZS(@w!*bt!X10(NQgb`od$>8 zhn7U$Nr!U1$I+e3{*RpRTAStcolqw3U^GP{Z~5LL4iQ9tqJ`BPBkd57wTv)6;~ zL|sSrbQ$|~Sz=FP@_1uZ4;!$EF1)sHLB$Dcv?C?2i|6z!{VU9^owFnJdU;fgb9Pi4 z=j__N>pbyoowGM-&fXCb&e_NFZt`TebLOrvT0Pq|!^mO8xkGv6k_F1TAv(%>44>6W zDtyR8^CGMp9cJrh7dbKaWdnGtA_S+n^;z=I0JLWN=T+ z&7Wr&RhAiVU1La$+99Q(E|tQ}ZLN6FJ|t zsq9@zqw+0@ZJyU+BTrCYEBC#*C#dfzWq)XhjXcG_W8E`yher+1oXC~6u@P$aaNrEq zbw712QkuuYe=Y9&b1nBIjgq=7Z4%pr)+cqH7I*^n#l{TJL=QfDcnDllSFoNc>Ik-5 z>a3b?7!?YS)W0Rs+C7?jvbpTkF*gveKsIbD z&z;xVoUtYSH=OVk;Ze><9bt0LK0V)Jbw)X7m(N#LcnWtCYF1~0bG92gIMUsJRy20s zL-NB&a~Q0XG)v?paBp-^%B`YI5q&a=_6O4x{WFO^;T+gVH~5QmyK{@cWn|QlOb_=B znyA-AeJ1LPq^@8dH}v9$UZSXL73HGb_vNkvj~?)5qAn9@CUT@hhxOIW8e}62V@J+qew?wK?T%i%)$E-8%V_89^>NPG8xozfkAb5} z(Acx#&e_q7?Qq8MruTEbZ*dNDE6#~Lp$sFt6V5UiMn1S8&U$v9)jI2T%?jOGKcL)p zgK^0A%rNWAhJ?tc!ec#$q0N_zAI?1t9qlm0M;?ZDl5QDrXh-p*xk(ERqqZAbMYe5c z?Ji?yd+|fLAHdbVBg0$Vy%we7M=lzDyHCDPXA{~|2yKW(*K(|^Gy1`l>Yzk&hm|> z?*--()+u5mDgFu9vPqQn3;W#-wRe8kQ47x(zRls?r_Uel<=uOaY3+%Q;T6K?yFe2q z_zE0nA06Eh=WzIWy#-$HrHt5?9k?fMZB4A7&)4-*z6yB#r_YBwIK$cZB|JWndbc0U z^`2l46a9+L+>3EoP!!nGe@f4E5n60H13uOw+>ZieLTN7^*-j3_MWI%)%%^0w5WL18(tNu_c?W% z+ff%ZbG7oH8!j*VdBo*q>snKmad6eLF)hlrxx8$W6~B_Us`vS1_2VjxGiEMXIf55|5Mkr|{+z?5nZohHbCKz57h#=osPA_CQ~~QczJ&AMIv-PGgRo z#2klS&tnSk>tH$UbmQnLdV38cuP0nZzhu*okI#>`rqP#a+`XPof36BQSkvfJd=GIC zfHzCO5-Oz)NvB^`hQVr7(K;XAICWC4k$y6&sOES2NP%}n-<3}-%2o7JC@+qN$I2X5 zHFa9H#e&|={!PA;} za4UBnytGz$F#J|{a4kGImifIF+OC~v(rNp8((%2WS;JaW_^ymY8Gmu`miF)#4c=ma zw+KylgkF>2DJDP9eP4L)K6uslIU8SSdPVUJo%en*FV6bgdF`zyMrhWz;JH00R|d~5 z%S=KBiPvQi;iGFfBYX|KHON=jaOQcLjK=^UE#oY5hfdeVAr429wL5els!1w4A5&Kai#07g_q#7P9m#WapqP zEpoMAmX4^;=PuZ_@AaU zeN0+Jo^I`o+pcL%GPB6gi@2Y9`*$p((iqd4dqQra&D6bTN>cYNHgzLs_xn!63oVB5 zA(jOZ)(OfI8O--Qa#xeQ+s86$wZYOP%RYn*+9k!*y_GGg`{@+w30J%Fk7|S}v2Fv#H}G zbyRgwH%3P&pDsINA0@K$q_bDb&Y#9|--EqbcFu#p{!e6Q*+=@{kew%kx25!3n0vA= zN0)%N%VcKST|~RlW8TQv^@Z~4P`UXsc^TY=%F6e3Fm;cjj#6-k% zTf4gPoKn6}dHDm@twFvYDm#}kw%!ssh<*}Tc^h^7mhrWm@%3q#^69cNcFrOzcZ3gy z%F5`Q|0%L^OFn*uj4XW~A|Fqo&&~9C27Qj4j1BR%?>-lOQczA7KCa8j|KZ~yI+3sE z<03;Bpci=%d1E7M;WaVMdJ#V#kGKB!eBAsWKK}nR9}m@k)S&;!L;q2QoPBK_h+obY z9mr%&HSzIN=u%eed_1;EuW>(o{C?r%@Qf?@c(aZqih7##9y%Y7ZPI!Czrn}juffL? zzcC*V)pcCS#}k|Q_=EpqJ{}2w7Cs(>JpLZ?__x9(qR$=ZMr0kl z58X#Gd^`iXG5v>+UsbpLZ!3?ZV++d0iQlnw-(t`*EjH6Pm&ehkULlY7v2;JJEdF}_ zQF)yDn&ffn8Lnb8PjxVTb9o%SY^W|fn>vu!GpnfM|7v+0yj>=b)9y$Wndzq8SMu>@ zJ@#etIJmn^9>3Mny;L)0ny90NJibNN!7b(ShePD?2|;-r-M{Ehg7SE9-$!hcL_c_g z{;jRG4t49MijdIwjcQ*pS>Yje=4+=5Oe4V_AQh#tEWIu+TYLXW-0ug8u? zCXe>aLLUF}pCOZvPimIQ86RzpZ8HxuKEAO`&iJ}aCZ~?&hKNjbmAXt`CHiY*a%@yW zWb$ZFU*1I~59(Ix(6M}5{dGVl-xAcVTp^Q7zlX}?^gH(JdcS`YnOuC=1m6FlOs>;Z z=sx8?QMaPm(%Z;$>sDrdm-PRmoJes7sIfRz4CnI`t(K-=f$T;haH->@~{X1NSyZ%HD)YONjiO{qu!dR6YBZqcyd( zFqX4z|ID3&avqrYntzTiwJa~wbJ}Rml>1`Wut)KEJ7>dF5+aBEI4{HVd*p~eAV>TW zIpR;q5$u08{FJ%%edLH0hIr4joZYn){m3!GNrV&Gi}B7&w$AKlwJw>LVm*#NZ>h2k zSsG@sKF+0-QO0jo}$)b-NE6LYs}agjOb2;+)p=H|l-a@Yf}(u{ta4gMoGCF$&e z4~rU>`FOaReVB8&XR!zVi6K_s1GfOvIoh(Fhr4<`pR$kpWjm(>T=>>$vF<$d7qQ^? ze)c;BXHSBk``OzH#o3Sav;?c*ZM7eddRaM-<3;rAvhVjUq0C2R_i5_&qfwK!@y+Z;?In zqwL+txmR*tT#g|;(!zdRt?UG6G8hOhEbaDI`#s6oz^v-{+H&hI*NJm-v- z%%kL)!=CLi@~rb(l`Pdje*0+tCe~)kKy}56*NBXwW)cnpK>Dxxt{LUWf3hqump`wSJ7!hMV z!d{N73)fGbkh`0`=vwxkbejhDQ}?nLU8_{{JNwXw{rk{y=b^*C##r}8^t0TljQ?q@ zd(rvE(RToEZ{VIoIF7I#;dw*!kn@Ex*6)rtTXjA7)JM^YtKPZeTU)<7DY7{YSbL3+ zvg&$s&IJ4rSmoRp{KYec55$B2S>V4G{GA7n4;B~aiXOg{Q1&Iq44jd>oquhQh_SXE zW44Np{o$z(=bqzVKe`><-4UtlHHu}gn17Yt9@YHLzj6#IdS9{^6shp(*v+|f*YY0- z`VQdN4jo?I$Md)yz8R}k?2fyPZyv0_rO;82EygN8-(2nIn^9}oV;&jgn~~68J?EBV zf1g=zR1I$}LeRMth+)mCEu7?*EvBxhsJITEO zLB3hfzW9TA4$pb)H^|%Ykk-yq5C43G@OO-j-!nG;z}WaBW8)dd#>b3}7vPV=FWunx zcz|avnU`dpIKRDhu_@W=o^K8C$`p8|&H6)lpsed}m^veuy*YjVuG`f6;kA*vKC;u) z$+;HxFHWOJTFstCEc!=yl}6v&A>(%xd{J;RON;l6hA;YY zlAz<{VT~}5e-XBDFTm>r2frZ{JGJ*)@WOjZ7h9DRDt^cz@OC6D-g+8-A8f}&_}?k` zUl2E^(5t!OeX?egw#3qw8MLJyy;>yrSfTU4tNTg?&r( z2FC@~dhMydcfc=$vD4(2QHCwqEY>7RtOLY1Bj~50`(|J#ygt_Ne<9})ecpvTlztQC zSc^?AzOuWj#DP!8(TZ;dVpVke3!jTR+H9*5UYMJck{O ztevlOvv!8Rz0X?rEo{jSW7i^b`%P|a%~=nh$OyN7L7Lb!c6ZOp&Cy~#@3SVh#Ei=9 z##(WNZc7%1Em^d61NLIFwoVs+4(gQk^C9fZf@Q_Vd?IDpv+~dD_*#sJ8j)$>9Hnm9 zn2!KX3vfzZTd8XXwuG{d&2i7nm36GtC2QHx`lPOz0*}b6)YmO$L?$+Fm%$}<1?zd8 z{6QF{PVqYlg-7Zii4H-phc*AWfKSGFqo(_0+=oww1D^~NFi+zt0q1U>Pdhq&;-4Wl zW?$Zm-8Oc>jT+W>_-M3+Hcqid+l&9jY5F^ovjxPa(1gsJD*cV^D~C6G-od83lsqQB zpJv^<54(X=U9cs_|6mpI&$TE|u-^5bi*CU$3s*r0q8~WQK9BfrY$5MRd^gU_kFz@Q z-KgrXtRn-y8#Ooh?Lys}y25v(BX$d?C^M73n}pr3_-;s=;Kc8{;n$UB;kz*t9A(7} z$;<-Rej7BU`)-)AA(XvphZ{S6(UGB}iKH%F&Ze9jy~7mUcf+qU&A@jfBVfDVEntVH z?{|%F_Su*Z{(?RmdFZ5cpN+tNS1I;qf=Aic()YT$_p4w}#j|o=JNz}w9<%5aSeu3V zYv^k^Y?HHZ^ZRYQ%DSt`Zv*_a@Y`4&^xL=>8)EU>h$n3J+erRD#Bal_>#R(SU$IB? z+ZK!e24|+S|1|{~l6^0KU;6zwuoGTg1^>+I_04UJBmI6HtFPwA(G}YU6Mh^)pA8eV z5D6`0gzSm^V}2ZFw=-y;_BDPS$DTA+h_7C#AIEtPa=4lwM-lv4{5M1=6>4KFJ{-HT zIS=}91by|ye?vcSLGA``;lCk1dKTt_Q|Jk{6N>-FMEp1Q27EX6Ve>EkMUM)d5`Tp7 z489vj(Y1>IMm@Y@PF^?Wh1kqn0(?T|hXr{(Jz0$N492*F@tw-p=1v3ji_YGi@yD9% zo}F8OFM{Y-A15xnVHLLY--lnYM>^y!>^Gms=jKZl5&2?{+4?xV^Ih!wSDBr0WxyJ3 zRK0^~OPMd0lP?-Sfp_5tk}nz`fobslDlL9U6>Ioo0sn$M_!qpze~tKZEMd$G|By5z zz8sH}M|6*Rd3-tE1(vIoKW4bR>@oC2p=D2^Cwli9|6avEMVEO@d^+$e`5gV(D*h{J z;>V$_btEy1$lqZdV6MUN|XW1_>zrthYaFO~i)!9K7fedyMV zR_Vu8yo-H*kWV|{(;ewkhr?*?MEhh-`37ssF#4zyx|pVS`p2O~>AZKJ_{%i;aR^^F zTFsQzZHV|*2ae5@ZF&dCCd$gV+#B%Y7y&O9KaSuyY3ai;qlqWCaxV({a0GaAZ3s{9 z7NA?PKWORGAvOr2@0EQFu|L>%k9lo2dYv5jaV~nWH1uHNkC+esI-=7N`-9_*v!(1^ zgrl>03w&>a#!p~3C4BjddC}Hw_;s8Zk!0O8Ps86$d^!yHbQqg_I@YxC>CoSGpN??d zr=twtIPvN5+W{N!n=@L2`&3WjD-MBYve@YZi5bK@L$T4e4M>;Z(z+`?bQFDEE-2mLvO=jP)N zoz_C;K6^-H?w;`0g#T9N{z8|zyI)i0z8&9dpNXJ6E3)<}c^6$5WAO%jmb;^u`~uz34AIl#E8+Jw4#NjpWaQWoxz_J*q08Rl zYe7B1I^vO2)2XM)=K_C;8PMPT>~);dzP>K0C+NE&@LX08@XXMCH@?0Oy?h8fm(>9* zx{QtQhRE3ByYY20_K8?$17}Y<&W6a?NB);&>@@tN|2Jgp$pJpz2_FxUx4j{@!MbdX zK5!;|o<*M{Uk7|Vu9UAYldD5)gGHv!LO&Ww9mN4V(VMQ2t^K}ub3*v|5#(gu7w;;3 zJXE%>3z4mzEoAF6jL)2JC|m!Tyg}Jo{5xhLS0@By>t_EBXh$8j~8deJpx zYMozy3z=HhPocd23RzmW6OL>0k^Xje!e)2Te|WyGXZa>PU;Ih$Mb{#-#|P+IzPN(t zhg<)9p0EDH^ZyUw`Jp{$bJd9Jw>mt_&<@L+;D*p2?M29jNTN8ahNcZat`hzs< zMMC{SuH^Z#O*)lG>S@xY=se$l2FCvzJpXHK&c2~fUr?5pb1%M~FUYsz`S1UudX%hy zZ^&P``#orb=0Ja9?(Fx|7GDsD^gsF*ecgty$hY(H`_?@F{r_b-|NZ~#<$T%O3Cj8G z!_8n{C+LImjpTgvv{%Ua)H6Kj%khuO`BGm1p7hXqzNwtw0-nq2_>Y`#^@1Ptu1)-V zCi`Dm0ej;sd497V{W3WpojUTSuB*{`KKp^iAwC5ELOK8ae?ZQ^%#Zt@Cg*=cJL7Bm zaWnqD&S#|AkNaQ4^F? zwzube`Q(aYkEn*TujKhIyp*S(e|L`c$YJz*+s2vJRZznKoQHkXgOMfc3hT8U55x!TYtEv#-%MHV2W!x6{6FDdA$(IzCN;8l58-@m)ESHN zn&;X_)io-gW&Zp_b;{z&YB%gYZ;Y+&+xA9#bXd&XH&pCo z!j#DovA4dVX59O!Hsj;-#^DLkVXlchN4a0`FUDxjVo$0(**(Q^`t7KSqoZ0^9JjZs zxUf$7zPeL2Tzrjt61%8N#}^u=9gW>}tK8)(w6rNq#nm=CeQwPZISJeT_q3GAlilxf z)Gl#0$evp*_^OS~L&uvESu6O{lIu^uJ+vZy5cim33vy4t3{NfljHUBUR@3~2hw2`2 zHuPdIZ8>|4wd^CC*#~g;b9m}FpZ_!VBu#{W<6C?m)uV1M=f0YE&Ausm*X)eAU9)>8 z?wY*_z5n&$yJpwz;e5J0|2g2Y-!oTJ2}j;mzKh&XDDNkMc|Ci(*#^z?rO{Hk1)BlR zCad3*twwiKNs&1Qi|1xTf@i!juHHzRl=+G?RF4jEHrz#cfj%3}bM!W6!)=7)jS2OJ z?st84oc&zs|K2$6tCPe}_f@@K z=Q%oRFgU-h;;TFH>v+xSJMy;Ew}bQx>zux64%Ms9ndLbNUaP><8T>lRRJ7+b_=+|} zdyaFC{t@;PKQ?Nf^R($Sd%PE&9X)HJ!d!0w3+Lr|j<6R$n6voilIKD%_8t3m^&FvZ zk_V)D7TLDBerx}g>*Zyi3_To?Jmab5pA3C9{^71W;~$=Wj`!Dy_lh;dY?k-uEV1qX z>t)x6F@~7)#LumJ*_9M+h%rBJiQPfk+I6qE?q2c9(6NL`q&>54hwHmMuRd?Nq4Igl zjPp-bxW+HrK7HJZ?b8Rhx_S81l(nv@a5WMiNB+ijuet{Q*Q+k`vK_9^R_t^Q>G{0t zdY)lpx(@Hk<5*cf{hbakx?bq;f@?7GlPiAdidpuG>o*nUu9Y1et``ZPBmY63sxh60 zzsEDRL#Atghcs6ePt3BHU0W98GMAB-3t$+M5Ph1)v2y3saE z#LdGkKcx-Jce*mEcap86t2?mIvQ@eS{#iDMYnH8tt1!hq-Msvlu1sLgBA)|T9l$ss zW!iMha-S<27-N8~s>5`iF0Qc25yO|Kyh!_VT&p@%xh(wOV!PgD=KoKm{CxVLlozId z1fHwGZ8i9;2AB7AsC4}_Wy0zG6QVax&At~)9_ih^Vrf{g*=m%zU=B|>*m_D)aTk7cJqw; zc&ey-I**+`Sq-jpY}0tUxMtATFLt;=r-iptdbr*tK3!;ne{bSxLwnMuGc6 z+Wc$UGZ-2e9DeigEgiPF21CntE!*kx0Mn|mU59(X&l4#X)1Luv^E&i#J!9|Tx^vkt zT~mPj$&}60i^(?^nCF7~JC^xenc#j>N;g+G(g%0ApQj7(bmggp9&=nd)MEvP_8m66 z?ns$C{U_A@NAN0boCzJ|K#MuhV(#)Cu4L-?zU?_zJaEjiz3NJ$>?~WZpB8Pexq2;s z#dQH3eg*E%gR}GCtG9ipD`)x3uA896TSz}_o6FP1br*g9J$qMRc-fUhKXiun+X2U| zcE*bRRo94=N2ae%*)hGFrg@(+YF>-&CD#FHp$+A7R<0Y`XQdh{^HClAH>o4{S^SCf z^V#N6LEFkuFZ=qWo!c51-`w68Z}A%$`wUF((H& zAFY}nG3xz(gqmq2X914FR%xWRpuKhL{I=Gr`H5D`0F(8A(K)*#_k6uM2_b+`eChn&4m^Qa}jg5~9iy3L#8Ux*RePHQJF}GKi$BgA$;q9Gb z3vGR4a{2e9r8{C~huwU`oF3&d^g&FHeNIe{Ej8v2`z0pHpjj-CR#aX`?wb` z8v7Sthba0pEvEO1?Ol7fx;eJj@$ z#Y{@ciP;Ja-GQMOFysJ34lq1nf4S=>V0alAc2NGX?NOf8m=U%uF>QdM(Drf+wA*!4 z%8fB`z+$v*j5%$4C1!QX%&x2LFLjNuJs0z4%BGltW$NPhR;Y_|X179S;ZD)GzFNGy zBl{V(pNLOhy!*&�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%0DSao@*mn53r$r+ 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

#4wwrPB~T=t;Z?+KQavaZtHhtyEwd$-Nn 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

&j>e8XC1J7nFU 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
v$+OnqFCyq>|~dHe&<_|=&~tuN7f%k*d(Wh(uD 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

    (rA=*JI_qA(y#nY@cq*e#YD7%IEuOUNq8kZQ;uI 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

    @tR_?)W@BUWIXQxY-qVxKh5 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≪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 z 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�n!)(T#(l3V>=+pVl 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./${shadername}_$fileplatform.h - rm -f $shadername.air $shadername.metallib - done -} - -generate_shaders macos macos macosx 10.11 -generate_shaders ios ios iphoneos 8.0 -generate_shaders iphonesimulator ios iphonesimulator 8.0 -generate_shaders tvos ios appletvos 9.0 -generate_shaders tvsimulator ios appletvsimulator 9.0 - -# Bundle together one mega-header -catShaders() -{ - target=$1 - for shadername in "${shadernames[@]}"; do - cat ${shadername}_$target.h >> Metal_Blit.h - done -} - -rm -f Metal_Blit.h -echo "#if defined(SDL_PLATFORM_IOS)" >> Metal_Blit.h - echo "#if TARGET_OS_SIMULATOR" >> Metal_Blit.h - catShaders iphonesimulator - echo "#else" >> Metal_Blit.h - catShaders ios - echo "#endif" >> Metal_Blit.h -echo "#elif defined(SDL_PLATFORM_TVOS)" >> Metal_Blit.h - echo "#if TARGET_OS_SIMULATOR" >> Metal_Blit.h - catShaders tvsimulator - echo "#else" >> Metal_Blit.h - catShaders tvos - echo "#endif" >> Metal_Blit.h -echo "#else" >> Metal_Blit.h - catShaders macos -echo "#endif" >> Metal_Blit.h - -# Clean up -cleanupShaders() -{ - target=$1 - for shadername in "${shadernames[@]}"; do - rm -f ${shadername}_$target.h - done -} -cleanupShaders iphonesimulator -cleanupShaders ios -cleanupShaders tvsimulator -cleanupShaders tvos -cleanupShaders macos \ No newline at end of file diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/default.metallib b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/default.metallib index 24685fd8b44e6fb3c6aec8d33c8989b7afa3b0e3..117cef8bff0644376b5e50adaa75c5c9195f7df1 100644 GIT binary patch literal 34505 zcmeI53qTWB_V6bUl0aU=LktpNB4ANbhldyxH6f^|*v2=$mV}qk@`!+n)Y?3NL`54P zwfNX=u+(+Cb~jdQ-EOx{0xDXn)LNURt__MvU20Rcezfbh-?@{ZsMvP*zq?=e`x|8* zckbM|_sqR_=G@;ocV^AYNTp$P_~-eZto5ujz57ovJR1h@+ItxDWqQI%Z@gshzFF@H zV8IH-eNsMaia$0tEhB4gX;EQr)~dX+io8l}-Xi4`8iu9I=cW@_PSZsFYu&m%%bv6+ zB>3mOef5)?lP~Oham%5oVKaGeevC|9$_>DPIG>I>vDzhdZ##|CE%5; zoPB0ZK!SDuqD{;9PYZv?laGAw^>ObS3-xRaln*!0a|{W?2%AV40r!M4a5iqPlT7~o z9|pNz58dQ5bMbH5u^F`7*e!(zj@4g&dD|b;e&NYRiTCn-cgOw2qq89s-^<4RHDl5I z1z7{1?nZ!9ltKeKgQlP4SN zyqAyhuJN2lXG0rtFB_;%Es)QfHwY@RrnJ1UqOcU?s?8}aDlNlkS~#?b35S?0l;>n` zWCCLh6dBr9PHAabE=H%$^MP1Q789L_YV5yqebF|Ui^>oLf4R`yzK36`!gg^i1faem zn@2`zai11+Tmm(4HUx6@1l3RjA&jky+#+vbPG{lq$y;gFyl5XzNH}w2wl-)AJ#{NL zwGodGl5#{d{o?1C(#=7HVyfv?EF?a)GhJZbGPGGKpRKFwFkIQd96psb8|vS)kY?z* zs9uy0npwMn!>-h_*Hp6C7BI^9vsa6ZNhG_nz_5zLu9C5};hhcPr)WgGB(ni(k=YjveD2{%@yvsYP+6&m9jjDtc*_8N|H zRg5u7Yh0bqUTra!nT<&?>{aQ;Ramz?{91z;bA(-N;J3=d9Svcp8u+e`u(S5C?gnvZ z1OJpR>}*3=yDjXZJ*-_Dc1j{{rCHc(_8ZGQi9>>?d2T8(jafniO$v0P&;BaBIHC|9fN2Q2=D4!Cr9r$p?cg+s

    e0S3vaiC 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 literal 26077 zcmeHw3qVsx+V;tXlR!cUh@oWTC~=pw%dOu!B(x^-S4vBzyJT4VlrpW zWagbYlXK>IpXZ&oa}mIE>;-Xoo(_hw?qCt^_f3JbCEYljUH!?dZZSm~o`Af4Gugobb$tgwV%$FpS5F}MJI~7MdvY*XY?%JK*)7ZAX zGNWqMn?ESL&TY)!GuQk{?w#kyZhk%`Wezsf&hJ0wCciM7j*t-ekA%!jn!SLISeUMI z$K-%-BIJ>wtJ zUi$XWd&}=sZCsIjrsKKwVzKI_3L)!Abl0+p~9Uv79Vh)rVQRJYNbv?*@E~jBn@-48{I#U`g)eaH<_Hc zg^{?IE%1$_W79kYNg=5o23~N}3ks$`uPB7pn(Cc(z;r;^JOJ(($Sg3|R)bH@t09B1 zJ(5AOkxnaB&{mhy*5y%(571U&+8BaXnx|e#r>zmv6oEapfo&xG5-*^$*0ZCQdzQ!T zsP*ixe23)cPT(t&VQUtW|xOS3>w)%j!$W=M0kkGCM#w)Zjd0M%NR`N)lojh)5X5b|Y z*HP2j=PeZ(r-GRU!o0SW?X(t6J@dSh>)7huMH52>j^^f>Pb_>@w=spuHOK)~%^E z`1+)6)H5`D)7Zi&q>)aQYS|V-g@lNVr+3icXkoN9a`j3+=p}7sJ7uzSm_diu$tiI{ zl7A9k^McM>UmL|HrXuJVQ!ibZ$>y=kz3DmN!8YuGJe9WEOqrOcmMdtbQf*P5x};RQ zx|I^E0Do%FW3yNVh}Rk^t;9rIDWt(fJNgZqwnhQ}3Jk1L6Ak`3Ggq2uE2OkFY+wia z4M8h1(TZ^z7~~>w_-GBikDl#)^z0o_!$Vcw!C~vaR(0pm@7@tY1Aevb&SO;>oK@kl z%nI<{j)KaIfbkE#7f8KU7@)O95?C0%gJL-C70{Q5-a)Zfz_(1a-`<_I$(`n{Kxjom zSS>tkM{hWr0JQN~ep-y9smXMPje%nI77Toy^-QGO6H*s$7ozTx?eoWpLGa|HkZcI|D zPf_O5qH(h21@fi&IpcCOi%S+4WR~PD&MC~y%FhvNvU&cReWx4rC*Qa3tE+A>o-TX8 zdc(zG#nX!d{X`4 z@yE;`2u9}SFV8HA&bFQJ$*}dDJ=JNu)TXnXJhSiIzLO1}v$i~=+``|yWy35`%j=73 zxQqO+e!eguAR{2)-6Miyf(GKaKv1=#F7|`i_@IOxQA z_C&sXX<^CY;-zbH!tEVbZGA?|$$bsyX72l@8Z;5E^oiKKr9ih?;=WC;frj+A_4Kt3 zoI2m>xZcMv106M=tSEy9t>4$Mxw`9ILRfLwR>q#NVDa619y7MySIHQhF!5ShaM;%S z_omloHsA3}c_vEpf~IN4lw^sD%Jkv8tCObh=T-THymV`f(kDb}5KgN~J)Jx{eCFBY zgJrR%PJLfnjQEpv3JB+hu#@b>I8THs~5WRr58P<8!QaAXAEHN?N zNAi=&qn8>|H;g1|w=#-%My=ht43ymXpybBim2~GYMLvxvUe9ujZYbHn8Cbon zc!qlIp0MIQ6n`*RyQ8Wx+u5nkU6ux=2e zg(+!W2G%VH+C9Mf7V-MV0twMBAuNgjM?m0;Qulh*(2Y_A)L*DVRF$H3|qdUfHf ze$We?AJAzHw21=GgT;n2u+zcq=?b_`3e3f3#hJwu-%uymB_Tr{k!n|!(n^i9(rz2P z;0Of19N3o0?c>4a&8sA^+~V4K0Rx%noHBKsy)nToo(u-$C)=bRae@vUHtIj}06o=$ zby^8nq48-&MrB4fn+2xNH3{o`BG?L61wCCOI=TX`0s~V06U^$#N7WonW1Ld_V8aW18;a4uc^FE_LLrC#4U&;i`*8UZIAm{x^sRyV-{hu=HUZya!L z4idp%^=EQz%7Bip5&gV?US2>GF92M@KHjKY{7tY>nOsi+ik z$i0eG;g9%4A-=gtE<)FPD{%T(qmXXzimGY8RX6FnOMH(uyipzd&BfD;|Qhs+NFKVPsHBXZ5cqO%?fP z)1wKqY0D>gqq#!qwsl=T-4WF)EnOlNg^c2m2bqG9Of%{?=~f+2@kwbDr`;N8BDv)l zcya0&vyj;n)k>I1+;jxJ<)6*JAZ3O3fh@UM8IW!|y~LpO`pU!#XMijRtyn?prQWK` zR%~)(t_x3f$Vg;puRW$mgxF)K``F;E6whX}0iJ+>X<;R9QU`mnr*srCNdeq-iXQ8> zZhD`?K?(8tfSV?y(MI8`&DV6~iE)F-X?28lc)N8ojXo+rzIo`2ppv22!}#UIWB4Wf zDSr9iieJd2e*(XF{A=+Gp~sPxbkTnRzhp7JHIXGKxtDIi-7auRd}a{UMv!auPw|Tr z#r!+q7YQ{Oal<6^90~q7enFpzUxJ>5U)=r+_$B8N{F3v(2fySl$tlb!$}Gvr=Epto zkR`1YEY2Mh?SwMfy7ua>ijyZ#Z}!aGGWN6&|D4a5FUm3ZYN`8FK0p^A9ZIV_#QZMo zjOU@s$`>FQyL>qv17Pg(yd9kR{(&cd!%^?OXO3M#<=Ia6KEudrkltgrzKR@Z#7?n>*uHg-3Vo08e>t3~26g2u} zi{`m;_JXthGY`R%$q!1F|E^>{ku=SQd#kgVTPCDllIoPmwC(kzUB_aMMc2n37sO69 zL>?vLr_5ejAkWXi#bIIioJ5gGtO;R(G3JI8Swh76Y}S@|sZY7+QMmF2x6Rl4)6d&E z8CSPEk?Tus?4UaJURECH`NII{eJ~2O?R%M#K9f@W@dh<7QAIlnhG_u+cDCLHz0Fr0 zZ3_T4mgK%rj-3t+S!w9AvUy*qy}gGPm`58E4C2XVaeTcp-YkxLqj6H2w<=R(8(LI; zBV=83ux=Bh`6=NpeDW}8AyOo+%zifOhMe^S8(?U6)@*!B?wX+5caNYeO zzz{+g?D3k7maRzP|5mfm>zV?9s92YO<0-CrifjI@am|2v(cR*+>Ys;u&unr-oVaEI zSZ6=LHSQq&1YA=s^!I%j*8n`D*FZd@)1G(Y87bk!Ge*LNXQus%XQWp!A;dGy4G-{) z?m1?=3(w5{70+m_{zqMS=I|$~=~L89btvkW=7cS{`dp3DZLx4T<;aw7 z??T|BRG^^patpJ=LXI>57$irROG#Mk5<_h&CEje>3bN|ZSES0&T_SW!DP^KL9F$Uz zYO)3xhqbnBAx-fk2I_F-CO7)JaK0nzvVle-F0-o=;hV}J5(2pKFU2#+V|eCg;7I?c z_!zc}kJ0=wA47kfkCB7E{Km&1Px+Yt*Z3H4{UFx@`L$shAp&_8=u#I1(VaZYFvznE zd%&~k0MDXHV^4DOED)zGnKnDged{NI7GcsGpQa9LPxDCxUq(=Gw3f{i&7qKrsZs+u zZYtuTrYi_N0r?q$lh=95s{nTBU(Tyg9_Cdb3lDe|--mb=o3|p7uMFbr$Yb^7F;%KD z-19bn5?`MPa=>9NcZPxN^sPSgB#eS4a)pVr9_Co^MjlT7&tMce;8?PS9w84fN<1rD zh=%-qj1u>cI2PGI%du3JJK2$p8V;ZiMl3RR&i4=aL!w1&=oYCc6L<4$yjgI)9l4c} zunhR`?@upQzq3cSa&GV3&=D!~Qp#17A7i$sY`@c+lKss0IolE;Q;~DfUIE|)WGWaL zHJ#jyFR(>B7WsQdeQ=DJ=r4G{Qxs+vqbHB~N|`bv7sD?-}JY;DS4 z58B^N8>c^{XYR}GulROmWou>c$Khokb#N~4>}0$9v#vW>f30Wr=_>pC4nUGg=j4@c zx&vdq--(I>6bod;_V@w<%XTNm51M$Vx;JHR`P2|drW^{_>*oLiKjyxfaRs|FVo_km z7xQ-P{DQ-9S}7=&y)ZR#@$y$n_qG*Oi?M=P$%Mx6kjuuIzk+ zxho#vri7!>#}ALMKNcN(oM%>0bqXrYpPQqgyArtyUsqy@g6m4;DR5U}sUpOccv-=B zC6+0|U5R`PgmZx3=zo2j*P;Gp<7U36p9eY$SdlMWy~Gw?s=4gsj&_YXN&x&;8+$DN zI1zh19+in(5nknY2&E~`hPWHL*lHQGGA6DQiL8tjYA6#Oj@HUJEQ@=&E1-yIA{4TT zy^4$5{VvW)JL9_m1M{kV=Vk69Bj*bDA48*V0FAT(+)`7tSg&SQPLk~4WyvpCYiZMq z`;@o1YfM6IApa~lEa_7Q1*|cpfkQjHyF)GZ^3`Uuw}pQ0)4a_u=5s;p9durdR*>9u zd%_RR+fwf2gpOGG+1%cg?E+2QPmVsy0x;nsGV_;a7Dp7zmdkS@07=Fdj1lW8zN}~C z{wCGQ6*iqNpu-w?$?AEjE1{`D~=L6(Qpm5u>v z1FbX_@Fd#BfNgO3)Q#FPYFk{e(N#0>ugl|rD1!#%7-N7a;wk_0l>hm+=6?VzLQwnx z|Km+U#nHpyN+}a}X{a7xB^2acC}xY;d72!8BAi4K5-ErZ*S!YvyFJk)3DJw`ESzk* zM|LHT&t_nEUHk}KQ!U(xJJi8Y74iGm!+ggDun>4yuT}IfXl~mH@yk_dZD+<K7yg36%$T<8fXYe!jJ(3 zzYgpHsx#2d->b-^jiGD{d5$=4FO+G;T~NDdWlnu#!ch?IJh5RSeU@iSeLvQaZ~ z5#8&O-oZ;5gQWnu*ZbBuDj-BW>9^pVqF4|g30NyaOaVF1VLBnEa~EfFhoMbz;27cy zKKT5*Ixguy!WR%=bn%yN#7Yp&uQ*v%tT{uu4`iQU-Ka61LkMv}_h$_5x8h+arXrglZx@ zYH^Rf5|8q)oT4zO3Cn#VUYRWvmOO%22x8jm4a>!-~0hDWZ&VaI}Jw8yt1{QI^Q7w=Yaz=s5)+PBa57y?K^5BM8#$bLn1pL(oLjnkPXh6iQr zZ!C$kt)}aCds~lF)Aa=XnKvAW&0&n-;Nfr(ram(-Hs#0U?X-CS2j$*rw&}l(&{x_! zjTbhz4~gacj|(OppV)91>h1(%mlgu-<5ZJnG+*tw3fgJ5b+q-hpKPdpzs$P+{pxeI zCpX`$U0WQsjG?|SU~u-V-THdh100m&7nAa1=rfH=D${QKl@(EOsGo5o;!H&$J)9s% z5o8T28A(u_3ByPNbtc+J67J3fn?rcG%5VsVs|<%=y2@|}PgfZ(@dyzF(Ox&~s88ss zJI-DXZ{D`D_s)dv`{y+;@rckLOe^d=Q&2h1UQt+S?O+R}>^vqekg^UiF(nU=Qk+FL zQc_t)$_`2{fLSaP<88_~INsoDl)O@uGY4MWUfU%{N1G0a&(2*uU47bc)2XDZQ`pPi zx7JnPm7BsEIf;>!5}L%HAd7{ih)5DB9I=;{@!OYsN?nCdM;bXnk*ubnqU;N_cDK7$ zHrj@J`A}L}rpXF`OlpyKs*>D-KdN5KXXR|veY333bKG|yr;Y1B_^!QTTn?R7K@Ra~ z0u4Pv2n|8k-f~PbMz{yrOs)gu-8SNbqvnQf4Rx{ghqpDDW8yvlf>It@;?d3*?k6;g z>7-45iB#nnd!*2ei^NSxmK)zMguc;jnkq}Q!<23a0*4+O z-QEI+hr!{WcxVVi5}tbQ-yW)o;IkjzpZ9^!r&_(ITD^Zqtsc~$qilfHAg7f~#hB;P z{LG}(o*BsZ;Z4taf1Z@wwA|~}vJuAsj>^Olga^t$z;E!o*)2f|VO%dx-OZ*fm_U$) z`KaO&9XVHr;_MXUz*$6MB;f=Z2}ax4CQ;+04N7Xa=cZ89S1&5B74~AROi$FG98xC* zw367Aq-K%?^9`q;Q7gdj2I9zt9uA>f_V5q5i3Fo%EPeoF{qFTJ-eZHniHGqX38)hP zDLx2u@j*?0%m?Wn=YxI(mORCKzlQhxKZ*A~fOv1DjR)~|Q*EFfMEd|>3__S{JpmdA zD&byIhm=i+XmHO^AQtkndJ_ic*s}osd3PaRK!*FB!mB{a`oY2KZbyOkx}craCG_e; z+SQXTh~tr@guUv7qa+|)jt5fdqsqxujdAUb2_SH&Q#{c?nQWqfz!ZcDB+&&p>j$8i z09pwL>wAO^bEK?WY}U6D7nhfmGfKV&YU&^GTq67^by`diE z3oGGe8HJz*#mj0X6`*~NJ_+J^1>beOm^kSoD!U60NCxC(annyQiSX5M06`GfUJ4ku ziJ%GRJqF@>=%aGsdQl{g2xZc?q+z}xHSF+VWOM_LAYyP{5TtYQhry6P3?7Qp(gXgm zDUDrkWm*U_i5X0{%s=lt%hq#*MzFoVjy_L~-l~C0Xb=b_(ulAWOu^;n?(S8>I6e@v z*J%o9QwD-Lcw6WNqv3#Lois`!<%Z1k9-Vfo|5N}kj-u3jg(V3!d-jgmtvUV6GhgjE zpd0+Q%jpQ9j;>GL5j5TS(_*r532*mnBZGk-0jmuWvFS;N!#(56_#1cQ2LO3)m_tSI zx0%9Oh8Oj_fid_&X7Vh0BkD|QS6He!T18uflu<}y2F`dZY&aQDBk2)l zF!M`15oZQ*ZFnM&8O$E_)R*u-;!6Npdj*_1h=P|!r7BnQxF-QnAGZc5atU&ZS!C@oNqYCD-kp-j6!Arrjqf`Y@|)M#}JYp8pxQ1%WoPyJb`Q7N$p6 zpDU~L6g4{rjhpWJ6+$#88wys-&M918R8YJ)dug#NRxL8M6-o_%ja4f#S2vuiKJ8>-SFF9S3fsC<4MVn$gar>9Lc7=eKAW3Dy-_f(!YO&Y z9U&7|h$f()VL}jm>}WQPq!cnuk-BEbNcDfjk+JtXe@X%KROEqX z1qbxhB4r+mr2l{7&RF;H=j%SkOjc~K_49RSj_FAw^~#a!+J`a^TBojeWs*4S&JJZB zway#LRC3mRHk5h7y6Qp6|EgOgDN2&#b+cx=AqA)f1i^C}KgS#V*>i6Ju z>w_2J0L2wq85MoiZtrdDbA<+;ahz$-W9->F19&smfBZG*UZ)jvSifG^aZE1?)GGst z({CRR8p~N59JWU^H|9>t+!zh>R4%hw%4~IPZ8kBd^vaqo%w`A3@oE;brYvRlI*OaY z4}S`#UdFtqm;wB5j79!|i{8xehbrLhE+<6Rkgr9MJ;@pG8IBicLP7165a7m;mP;1L zpsx{V&OpSdDAYut?U=@fWyo+3csi?GvTNvcwaC*Zkp+Qex8m%4-rk6dM>7($5$8X zBGEhoHA~Pd>`06PGSfjOGpm+)B2rf-7;MJ<+7Kpu$DQv&=eyMTuHaafXb|$gzNuLeLx>hF>#r^w*M@n%9iA+OVcX z|B_!bk$*4AGvSgv_u?=V6s+f+p`$Ot=ju}*(bIU&f9H74@nDY5HT+y$u173@T)_~ymP`P692C6ITaG8s|I?V@nInpRag z0ii^;n2A!N#SHch(Iff^h*Fs2U4@afmrwpnXbzJnIZGU>4)Mm1zz7PMO2O*YHK=$e!hT(;;F}A_LW{K@tL`@)UL8l z{3?=x{#Dl!j=@&+S{b4u0xL;$TWK6B^UNBz|7Y5^Nt|D7#zQaP0QLTocJIUS?GyOD ziy1AEeITRw%l&VSKU&!O{VB`W2RFS&bw=K*q(qA8NH14q#jJn%^R=HVyzAG8U%HBk z?CSM5D!h$99&fwKbdAd2T<1;^DeW!0Uw=(TeSg6_-^QlkuNOYAwqhi&_ac6)U8dOSg5=Rb8maJ=b5u!y+Xc9ey`VtlJLe1;lgXe3h(TX;jTechggtRY9#~ zlj>G2axa*YiY6JB=~P9!aIaHxMoE!)^4G5+2rY^$Kb*I^Fw%IKoaI zS4AERRup;=N+k7qU&v^Xdb}m~$R=9ZRkpEA0dpUlp=PT1b{no{U$EU&9fulx>F_+O z4#@I79TwKla-}m5@hi$~G7+jOzUt=2A{}irwjpDvClbaf*c0UpzO}S$Vn^dNQ`7jN zp0t;(fIX3h{z+OX8nJDgQAV$XZ{^j-(Q)Vk@*4J_g3UaE^zX)&o3yXxxqCFr#RSV5 zPT4|LGn?Yfjir<+`lM+RB85p0Zr=b+ApeQJ#;STr@rh29NuA`aQ+uAmM}1$0Pl=)4 z_K(E%c(}@2ZKF2_AvA_XG^Ln%-K_Zt7n@o4rDEYOQMoA~G0VU^kdn0x_dh_VYCJ1% zqSXgB95zXrvDA8pUBI6~v)m zrhxkK47*P_Ww_ELJuMewCNc4`MQSZ=oT+nLBq5qPMXK;ll`67T`bN@BW-Pl8R31H# zC|C4-Bp2geZQ+gG)X;YIx?Fdh(@&ZbjB31%DN@mt)+KPHFVOE~ZbL>MKzyf`_F~c? zc15HnHM*RmS})1<-^(XzNA*O_Aifyz8i2iaOdvCo5I%KRdkDi z`gUZwsTPc@(5Ee2oa`2A)PNSlITEt7MMsL%I^EUc75aj#Z5G(#^aH)v79=Lu{g85_ z(0p3~qSM=K5xtm&%q)}{c=Xrn%{=HPC;V1LwzBt%Ub6ext#b8PM-uU|p;|<=n$i4O zBf33nts_r~tk`nQ^K*-*M>Dr^0re~J1+&}YbUBFZ;K>>1u)?^PZ8bSKB?1#;XJz#~ zi+j#CA2%aUyf6CI0uH0)G-c}V@H zNX^?*$~ols!H_oLO!BY}*r<%i5@MtcOgNav)B!)grm}V6M#iAsM{fnAs!`%-F>_k` zs9?0*+nj0|c>s0^Ew%d?tiogmt%g9=Ol!ElCEUuj3yeyxy%F^8Liuvo3rCQ0sXg*U ziXsTsZfTW|EM_JeoCmF`N_e0M>h>I{8x@fV#?7$lZ*ksW+|-5CNbu|LZ(idXx4w!& zFm9=hH90zU6up^^a{LSF&xvbtQYq2&v{cW#cAo=QICPl;*eDT7T9)n@d8-bI0Yhg( zDZ>>iG;yRovTCX$SVq@x0yE!SYZsWUBdMXSUF>XH@{DqMIudxRPB;lP zjnF{TU!gXRJu-x}Q;%UO=4V8&cD8_@=cw_58EkM`Im)O+XlkZ1wY3!tpgz{oYCP)h zCNtEAr1d2CVu?wXt)g;aQg)L{1fq*b8yu~GuJM^Dm_g7eqe)9M288GfTzZkzYHWQ* zEyt1J;2FEh%=#tcOFVMJ8S%_Fj>OHH_r+_o4i+xjSuiH9BARq2>CWN%D>V*gQ%zJ8 zHT>tKjA6sQ@8EvdPG9|yMJMy71%CVDpIWZ}a{B5o<4E=+?9E>f8zCT(B3&F5*dM`I zMj2sP+)?yKBEq7L!#^}%la}FJR)+A^%#Uv}lyTg8#ZR_vYOZQUoSbyGEJ7Pk?U6gk zw-^g6SJB(LEN(p`KH%PD8yl63*75oA_8`92RiPT03M}c;zVD$p`%z#gBu#kXaN;UH$ z*)vv>NPNtuTe)KKM^^A~O!dnKn^w?GFM}I$VXHy9Ei+ZsRUQGJ#kwH)^R;+QTv}P{ zF(8FEf63tfc$C+whPU`69`gV=u&C#&vP?m2dLbsJ19&VNP)BN%UU2FXZs2Lo*E@W5 z(t2LKW-E@VuWn;8qliNrTkk%K~B1M(piAY@ncGE)%MN;rmYn4~F4AwXe@lOU%U>{RzC1?eFkPd5~AK@ii(ZuSEWhSK9L=UJ2d5 z4#C#VxzXHibEzcDv5uSWm@SU3Qp>_9OT+dsWRyC5?Gcr^+oIL&hnf06ZopEhzcuJE2L(DoBaxz9P zta*KY2lvW6K>1vnSF_NFE&PJrwJ;TZn3Mt=1Q+BC?She;QzH9qC&l;vLyS_-TB2Kh zDo-~s?Z1Ie()f@1;l*7)h!)>oG%CfZp&im3-f(Re^4YI?*6C+pbRKtez!@NB-34W{ z^@4`@`oodOqyHip+Ho2OfxPth=UX3*;>j>Fe#-8A)*w9x(ZvQZMDsA4>spW^5n+`p9 z$QeebpT2{W5#Wpx^xqD*kp%735g!O9mMkyKDae#BF32g#Tb{kH?`mh;C7a`v-PYW9 zwI^%vfmXJrtm53s)29b&g16p3E}pR`?7nL4jN&~UGQ+6k8E@8Fx1*TKnfNo>;Yu7s zJJimc7Bt8`|&sL_?6(ezMZ3U|hI?)31`cQk>zW z;|>BQMGq9ykT0rX`fqX)r;OH&bPji6jhFjz!HI)B-<0*Q4OEkIr7bj%QMb!%tJd!p zZgO41wDSJ2wCBc!Z)$N$p53yY7236Ki~L`zzR31?=hU- zzc*Kz^~4Cp>KAiJ3a2Fw(3BnxG1nw%Dq|}0AiFtQ0S{&0S=|BhQR$yk8ZuxRSDb{ z8$>XHs8MC$e(FK+TzksxJmq%&ow*$jn4>9d6!E$1W0}Ob`FzuaS>87PsA*1ri62N;ofTnPA6m4Z$XyagCR(ITBCeBx0Yc&&NV{|}k>OxNP)NG4 zhrAjx>cnMdd6?e&#M%W{zr>W6TXuh2;oUT;!D9x*ro>? zf?gG(a<<0^-3$?MP>fsNWa6vl@Ky0>L|oZTj|pb=Y@wT=UYG$nhxW}@ooE*IJu|hK znPTzi9xk`g-gS5^le_AZGA{ss3SYHA2fiL$T6VKMf$g@yB-O|EkjB)L-DLHd7-h*e zUOI5ayv3}VUoN8SCsKfOk3DxEXs|b6fU4*b2 zJzwMiZ)}RU@dp%mW8?ZaQU>)HJ6XX}x|QI&yw$tupYhDVaU(O4B_39zOsFcx3hS>6 zfeX`MF((*430G##540?4Qt-*8^l%5|E^uTf6JE+ub{{_UU(!!=DL&@LaH~M#P4^fD zTuY=e2W{NOG4k($d){OV>tI6ZlfD@#0S3CNCtge z{+Nw2KXyjP3n5d-;m6JU + Copyright (C) 1997-2025 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 @@ -20,9 +20,12 @@ */ /** - * \file SDL.h + * Main include header for the SDL library, version 3.2.0 * - * Main include header for the SDL library, version 3.1.2 + * It is almost always best to include just this one header instead of + * picking out individual headers included here. There are exceptions to + * this rule--SDL_main.h is special and not included here--but usually + * letting SDL.h include the kitchen sink for you is the correct approach. */ #ifndef SDL_h_ @@ -30,6 +33,7 @@ #include #include +#include #include #include #include @@ -65,6 +69,7 @@ #include #include #include +#include #include #include #include @@ -76,6 +81,7 @@ #include #include #include +#include #include #include #include diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_assert.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_assert.h index f5f798e..09b3b47 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_assert.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_assert.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -51,9 +51,14 @@ * - It provides statistics and data on all failed assertions to the app. * - It allows the default assertion handler to be controlled with environment * variables, in case an automated script needs to control it. + * - It can be used as an aid to Clang's static analysis; it will treat SDL + * assertions as universally true (under the assumption that you are serious + * about the asserted claims and that your debug builds will detect when + * these claims were wrong). This can help the analyzer avoid false + * positives. * - * To use it: do a debug build and just sprinkle around tests to check your - * code! + * To use it: compile a debug build and just sprinkle around tests to check + * your code! */ #ifndef SDL_assert_h_ @@ -84,7 +89,7 @@ extern "C" { * - 3: Paranoid settings: All SDL assertion macros enabled, including * SDL_assert_paranoid. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ASSERT_LEVEL SomeNumberBasedOnVariousFactors @@ -113,24 +118,27 @@ extern "C" { * * If the program is not running under a debugger, SDL_TriggerBreakpoint will * likely terminate the app, possibly without warning. If the current platform - * isn't supported (SDL doesn't know how to trigger a breakpoint), this macro - * does nothing. + * isn't supported, this macro is left undefined. * - * \threadsafety It is safe to call this function from any thread. + * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner -#elif defined(_MSC_VER) +#elif defined(_MSC_VER) && _MSC_VER >= 1310 /* Don't include intrin.h here because it contains C++ code */ extern void __cdecl __debugbreak(void); #define SDL_TriggerBreakpoint() __debugbreak() +#elif defined(_MSC_VER) && defined(_M_IX86) + #define SDL_TriggerBreakpoint() { _asm { int 0x03 } } #elif defined(ANDROID) #include #define SDL_TriggerBreakpoint() assert(0) #elif SDL_HAS_BUILTIN(__builtin_debugtrap) #define SDL_TriggerBreakpoint() __builtin_debugtrap() +#elif SDL_HAS_BUILTIN(__builtin_trap) + #define SDL_TriggerBreakpoint() __builtin_trap() #elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) #elif (defined(__GNUC__) || defined(__clang__)) && defined(__riscv) @@ -147,18 +155,40 @@ extern "C" { #include #define SDL_TriggerBreakpoint() raise(SIGTRAP) #else - /* How do we trigger breakpoints on this platform? */ - #define SDL_TriggerBreakpoint() + /* SDL_TriggerBreakpoint is intentionally left undefined on unknown platforms. */ #endif -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro that reports the current function being compiled. + * + * If SDL can't figure how the compiler reports this, it will use "???". + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_FUNCTION __FUNCTION__ + +#elif 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 + +/** + * A macro that reports the current file being compiled. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_FILE __FILE__ + +/** + * A macro that reports the current line number of the file being compiled. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_LINE __LINE__ /* @@ -176,14 +206,50 @@ This also solves the problem of... disable assertions. */ +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro for wrapping code in `do {} while (0);` without compiler warnings. + * + * Visual Studio with really aggressive warnings enabled needs this to avoid + * compiler complaints. + * + * the `do {} while (0);` trick is useful for wrapping code in a macro that + * may or may not be a single statement, to avoid various C language + * accidents. + * + * To use: + * + * ```c + * do { SomethingOnce(); } while (SDL_NULL_WHILE_LOOP_CONDITION (0)); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_NULL_WHILE_LOOP_CONDITION (0) + +#elif defined(_MSC_VER) /* Avoid /W4 warnings. */ /* "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 +/** + * The macro used when an assertion is disabled. + * + * This isn't for direct use by apps, but this is the code that is inserted + * when an SDL_assert is disabled (perhaps in a release build). + * + * The code does nothing, but wraps `condition` in a sizeof operator, which + * generates no code and has no side effects, but avoid compiler warnings + * about unused variables. + * + * \param condition the condition to assert (but not actually run here). + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_disabled_assert(condition) \ do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION) @@ -198,7 +264,7 @@ disable assertions. * condition, try to break in a debugger, kill the program, or ignore the * problem). * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_AssertState { @@ -216,11 +282,11 @@ typedef enum SDL_AssertState * used by the assertion handler, then added to the assertion report. This is * returned as a linked list from SDL_GetAssertionReport(). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_AssertData { - SDL_bool always_ignore; /**< SDL_TRUE if app should always continue when assertion is triggered. */ + bool always_ignore; /**< true if app should always continue when assertion is triggered. */ unsigned int trigger_count; /**< Number of times this assertion has been triggered. */ const char *condition; /**< A string of this assert's test code. */ const char *filename; /**< The source file where this assert lives. */ @@ -232,7 +298,7 @@ typedef struct SDL_AssertData /** * Never call this directly. * - * Use the SDL_assert* macros instead. + * Use the SDL_assert macros instead. * * \param data assert data structure. * \param func function name. @@ -240,29 +306,57 @@ typedef struct SDL_AssertData * \param line line number. * \returns assert state. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *data, const char *func, const char *file, int line) SDL_ANALYZER_NORETURN; -/* Define the trigger breakpoint call used in asserts */ -#ifndef SDL_AssertBreakpoint -#if defined(ANDROID) && defined(assert) -/* Define this as empty in case assert() is defined as SDL_assert */ -#define SDL_AssertBreakpoint() -#else + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * The macro used when an assertion triggers a breakpoint. + * + * This isn't for direct use by apps; use SDL_assert or SDL_TriggerBreakpoint + * instead. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_AssertBreakpoint() SDL_TriggerBreakpoint() -#endif + +#elif !defined(SDL_AssertBreakpoint) +# if defined(ANDROID) && defined(assert) + /* Define this as empty in case assert() is defined as SDL_assert */ +# define SDL_AssertBreakpoint() +# else +# define SDL_AssertBreakpoint() SDL_TriggerBreakpoint() +# endif #endif /* !SDL_AssertBreakpoint */ -/* 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. -*/ +/** + * The macro used when an assertion is enabled. + * + * This isn't for direct use by apps, but this is the code that is inserted + * when an SDL_assert is enabled. + * + * The `do {} while(0)` avoids dangling else problems: + * + * ```c + * 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(). + * + * \param condition the condition to assert. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_enabled_assert(condition) \ do { \ while ( !(condition) ) { \ @@ -305,7 +399,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \param condition boolean value to test. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert(condition) if (assertion_enabled && (condition)) { trigger_assertion; } @@ -336,7 +432,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \param condition boolean value to test. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert_release(condition) SDL_disabled_assert(condition) @@ -363,7 +461,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \param condition boolean value to test. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) @@ -389,7 +489,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * #endif /** - * An assertion test that always performed. + * An assertion test that is always performed. * * This macro is always enabled no matter what SDL_ASSERT_LEVEL is set to. You * almost never want to use this, as it could trigger on an end-user's system, @@ -405,7 +505,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \param condition boolean value to test. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert_always(condition) SDL_enabled_assert(condition) @@ -418,7 +520,10 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * \param userdata what was passed as `userdata` to SDL_SetAssertionHandler(). * \returns an SDL_AssertState value indicating how to handle the failure. * - * \since This datatype is available since SDL 3.0.0. + * \threadsafety This callback may be called from any thread that triggers an + * assert at any time. + * + * \since This datatype is available since SDL 3.2.0. */ typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)( const SDL_AssertData *data, void *userdata); @@ -440,7 +545,9 @@ typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)( * fails or NULL for the default handler. * \param userdata a pointer that is passed to `handler`. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAssertionHandler */ @@ -459,7 +566,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetAssertionHandler( * \returns the default SDL_AssertionHandler that is called when an assert * triggers. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAssertionHandler */ @@ -482,7 +591,9 @@ extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler( * was passed to SDL_SetAssertionHandler(). * \returns the SDL_AssertionHandler that is called when an assert triggers. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAssertionHandler */ @@ -508,9 +619,15 @@ extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void ** * ``` * * \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. + * memory should not be modified or freed by the application. This + * pointer remains valid until the next call to SDL_Quit() or + * SDL_ResetAssertionReport(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. Other threads calling + * SDL_ResetAssertionReport() simultaneously, may render the + * returned pointer invalid. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResetAssertionReport */ @@ -524,7 +641,11 @@ extern SDL_DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void); * 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 3.0.0. + * \threadsafety This function is not thread safe. Other threads triggering an + * assertion, or simultaneously calling this function may cause + * memory leaks or crashes. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAssertionReport */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_asyncio.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_asyncio.h new file mode 100644 index 0000000..b36cb07 --- /dev/null +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_asyncio.h @@ -0,0 +1,546 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 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. +*/ + +/* WIKI CATEGORY: AsyncIO */ + +/** + * # CategoryAsyncIO + * + * SDL offers a way to perform I/O asynchronously. This allows an app to read + * or write files without waiting for data to actually transfer; the functions + * that request I/O never block while the request is fulfilled. + * + * Instead, the data moves in the background and the app can check for results + * at their leisure. + * + * This is more complicated than just reading and writing files in a + * synchronous way, but it can allow for more efficiency, and never having + * framerate drops as the hard drive catches up, etc. + * + * The general usage pattern for async I/O is: + * + * - Create one or more SDL_AsyncIOQueue objects. + * - Open files with SDL_AsyncIOFromFile. + * - Start I/O tasks to the files with SDL_ReadAsyncIO or SDL_WriteAsyncIO, + * putting those tasks into one of the queues. + * - Later on, use SDL_GetAsyncIOResult on a queue to see if any task is + * finished without blocking. Tasks might finish in any order with success + * or failure. + * - When all your tasks are done, close the file with SDL_CloseAsyncIO. This + * also generates a task, since it might flush data to disk! + * + * This all works, without blocking, in a single thread, but one can also wait + * on a queue in a background thread, sleeping until new results have arrived: + * + * - Call SDL_WaitAsyncIOResult from one or more threads to efficiently block + * until new tasks complete. + * - When shutting down, call SDL_SignalAsyncIOQueue to unblock any sleeping + * threads despite there being no new tasks completed. + * + * And, of course, to match the synchronous SDL_LoadFile, we offer + * SDL_LoadFileAsync as a convenience function. This will handle allocating a + * buffer, slurping in the file data, and null-terminating it; you still check + * for results later. + * + * Behind the scenes, SDL will use newer, efficient APIs on platforms that + * support them: Linux's io_uring and Windows 11's IoRing, for example. If + * those technologies aren't available, SDL will offload the work to a thread + * pool that will manage otherwise-synchronous loads without blocking the app. + * + * ## Best Practices + * + * Simple non-blocking I/O--for an app that just wants to pick up data + * whenever it's ready without losing framerate waiting on disks to spin--can + * use whatever pattern works well for the program. In this case, simply call + * SDL_ReadAsyncIO, or maybe SDL_LoadFileAsync, as needed. Once a frame, call + * SDL_GetAsyncIOResult to check for any completed tasks and deal with the + * data as it arrives. + * + * If two separate pieces of the same program need their own I/O, it is legal + * for each to create their own queue. This will prevent either piece from + * accidentally consuming the other's completed tasks. Each queue does require + * some amount of resources, but it is not an overwhelming cost. Do not make a + * queue for each task, however. It is better to put many tasks into a single + * queue. They will be reported in order of completion, not in the order they + * were submitted, so it doesn't generally matter what order tasks are + * started. + * + * One async I/O queue can be shared by multiple threads, or one thread can + * have more than one queue, but the most efficient way--if ruthless + * efficiency is the goal--is to have one queue per thread, with multiple + * threads working in parallel, and attempt to keep each queue loaded with + * tasks that are both started by and consumed by the same thread. On modern + * platforms that can use newer interfaces, this can keep data flowing as + * efficiently as possible all the way from storage hardware to the app, with + * no contention between threads for access to the same queue. + * + * Written data is not guaranteed to make it to physical media by the time a + * closing task is completed, unless SDL_CloseAsyncIO is called with its + * `flush` parameter set to true, which is to say that a successful result + * here can still result in lost data during an unfortunately-timed power + * outage if not flushed. However, flushing will take longer and may be + * unnecessary, depending on the app's needs. + */ + +#ifndef SDL_asyncio_h_ +#define SDL_asyncio_h_ + +#include + +#include +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The asynchronous I/O operation structure. + * + * This operates as an opaque handle. One can then request read or write + * operations on it. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_AsyncIOFromFile + */ +typedef struct SDL_AsyncIO SDL_AsyncIO; + +/** + * Types of asynchronous I/O tasks. + * + * \since This enum is available since SDL 3.2.0. + */ +typedef enum SDL_AsyncIOTaskType +{ + SDL_ASYNCIO_TASK_READ, /**< A read operation. */ + SDL_ASYNCIO_TASK_WRITE, /**< A write operation. */ + SDL_ASYNCIO_TASK_CLOSE /**< A close operation. */ +} SDL_AsyncIOTaskType; + +/** + * Possible outcomes of an asynchronous I/O task. + * + * \since This enum is available since SDL 3.2.0. + */ +typedef enum SDL_AsyncIOResult +{ + SDL_ASYNCIO_COMPLETE, /**< request was completed without error */ + SDL_ASYNCIO_FAILURE, /**< request failed for some reason; check SDL_GetError()! */ + SDL_ASYNCIO_CANCELED /**< request was canceled before completing. */ +} SDL_AsyncIOResult; + +/** + * Information about a completed asynchronous I/O request. + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_AsyncIOOutcome +{ + SDL_AsyncIO *asyncio; /**< what generated this task. This pointer will be invalid if it was closed! */ + SDL_AsyncIOTaskType type; /**< What sort of task was this? Read, write, etc? */ + SDL_AsyncIOResult result; /**< the result of the work (success, failure, cancellation). */ + void *buffer; /**< buffer where data was read/written. */ + Uint64 offset; /**< offset in the SDL_AsyncIO where data was read/written. */ + Uint64 bytes_requested; /**< number of bytes the task was to read/write. */ + Uint64 bytes_transferred; /**< actual number of bytes that were read/written. */ + void *userdata; /**< pointer provided by the app when starting the task */ +} SDL_AsyncIOOutcome; + +/** + * A queue of completed asynchronous I/O tasks. + * + * When starting an asynchronous operation, you specify a queue for the new + * task. A queue can be asked later if any tasks in it have completed, + * allowing an app to manage multiple pending tasks in one place, in whatever + * order they complete. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateAsyncIOQueue + * \sa SDL_ReadAsyncIO + * \sa SDL_WriteAsyncIO + * \sa SDL_GetAsyncIOResult + * \sa SDL_WaitAsyncIOResult + */ +typedef struct SDL_AsyncIOQueue SDL_AsyncIOQueue; + +/** + * Use this function to create a new SDL_AsyncIO object for reading from + * and/or writing to a named file. + * + * The `mode` string understands the following values: + * + * - "r": Open a file for reading only. It must exist. + * - "w": Open a file for writing only. It will create missing files or + * truncate existing ones. + * - "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. + * + * There is no "b" mode, as there is only "binary" style I/O, and no "a" mode + * for appending, since you specify the position when starting a task. + * + * This function supports Unicode filenames, but they must be encoded in UTF-8 + * format, regardless of the underlying operating system. + * + * This call is _not_ asynchronous; it will open the file before returning, + * under the assumption that doing so is generally a fast operation. Future + * reads and writes to the opened file will be async, however. + * + * \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_AsyncIO structure that is created or NULL on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CloseAsyncIO + * \sa SDL_ReadAsyncIO + * \sa SDL_WriteAsyncIO + */ +extern SDL_DECLSPEC SDL_AsyncIO * SDLCALL SDL_AsyncIOFromFile(const char *file, const char *mode); + +/** + * Use this function to get the size of the data stream in an SDL_AsyncIO. + * + * This call is _not_ asynchronous; it assumes that obtaining this info is a + * non-blocking operation in most reasonable cases. + * + * \param asyncio the SDL_AsyncIO to get the size of the data stream from. + * \returns the size of the data stream in the SDL_IOStream on success or a + * negative error code on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetAsyncIOSize(SDL_AsyncIO *asyncio); + +/** + * Start an async read. + * + * This function reads up to `size` bytes from `offset` position in the data + * source to the area pointed at by `ptr`. This function may read less bytes + * than requested. + * + * This function returns as quickly as possible; it does not wait for the read + * to complete. On a successful return, this work will continue in the + * background. If the work begins, even failure is asynchronous: a failing + * return value from this function only means the work couldn't start at all. + * + * `ptr` must remain available until the work is done, and may be accessed by + * the system at any time until then. Do not allocate it on the stack, as this + * might take longer than the life of the calling function to complete! + * + * An SDL_AsyncIOQueue must be specified. The newly-created task will be added + * to it when it completes its work. + * + * \param asyncio a pointer to an SDL_AsyncIO structure. + * \param ptr a pointer to a buffer to read data into. + * \param offset the position to start reading in the data source. + * \param size the number of bytes to read from the data source. + * \param queue a queue to add the new SDL_AsyncIO to. + * \param userdata an app-defined pointer that will be provided with the task + * results. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_WriteAsyncIO + * \sa SDL_CreateAsyncIOQueue + */ +extern SDL_DECLSPEC bool SDLCALL SDL_ReadAsyncIO(SDL_AsyncIO *asyncio, void *ptr, Uint64 offset, Uint64 size, SDL_AsyncIOQueue *queue, void *userdata); + +/** + * Start an async write. + * + * This function writes `size` bytes from `offset` position in the data source + * to the area pointed at by `ptr`. + * + * This function returns as quickly as possible; it does not wait for the + * write to complete. On a successful return, this work will continue in the + * background. If the work begins, even failure is asynchronous: a failing + * return value from this function only means the work couldn't start at all. + * + * `ptr` must remain available until the work is done, and may be accessed by + * the system at any time until then. Do not allocate it on the stack, as this + * might take longer than the life of the calling function to complete! + * + * An SDL_AsyncIOQueue must be specified. The newly-created task will be added + * to it when it completes its work. + * + * \param asyncio a pointer to an SDL_AsyncIO structure. + * \param ptr a pointer to a buffer to write data from. + * \param offset the position to start writing to the data source. + * \param size the number of bytes to write to the data source. + * \param queue a queue to add the new SDL_AsyncIO to. + * \param userdata an app-defined pointer that will be provided with the task + * results. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ReadAsyncIO + * \sa SDL_CreateAsyncIOQueue + */ +extern SDL_DECLSPEC bool SDLCALL SDL_WriteAsyncIO(SDL_AsyncIO *asyncio, void *ptr, Uint64 offset, Uint64 size, SDL_AsyncIOQueue *queue, void *userdata); + +/** + * Close and free any allocated resources for an async I/O object. + * + * Closing a file is _also_ an asynchronous task! If a write failure were to + * happen during the closing process, for example, the task results will + * report it as usual. + * + * Closing a file that has been written to does not guarantee the data has + * made it to physical media; it may remain in the operating system's file + * cache, for later writing to disk. This means that a successfully-closed + * file can be lost if the system crashes or loses power in this small window. + * To prevent this, call this function with the `flush` parameter set to true. + * This will make the operation take longer, and perhaps increase system load + * in general, but a successful result guarantees that the data has made it to + * physical storage. Don't use this for temporary files, caches, and + * unimportant data, and definitely use it for crucial irreplaceable files, + * like game saves. + * + * This function guarantees that the close will happen after any other pending + * tasks to `asyncio`, so it's safe to open a file, start several operations, + * close the file immediately, then check for all results later. This function + * will not block until the tasks have completed. + * + * Once this function returns true, `asyncio` is no longer valid, regardless + * of any future outcomes. Any completed tasks might still contain this + * pointer in their SDL_AsyncIOOutcome data, in case the app was using this + * value to track information, but it should not be used again. + * + * If this function returns false, the close wasn't started at all, and it's + * safe to attempt to close again later. + * + * An SDL_AsyncIOQueue must be specified. The newly-created task will be added + * to it when it completes its work. + * + * \param asyncio a pointer to an SDL_AsyncIO structure to close. + * \param flush true if data should sync to disk before the task completes. + * \param queue a queue to add the new SDL_AsyncIO to. + * \param userdata an app-defined pointer that will be provided with the task + * results. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread, but two + * threads should not attempt to close the same object. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_CloseAsyncIO(SDL_AsyncIO *asyncio, bool flush, SDL_AsyncIOQueue *queue, void *userdata); + +/** + * Create a task queue for tracking multiple I/O operations. + * + * Async I/O operations are assigned to a queue when started. The queue can be + * checked for completed tasks thereafter. + * + * \returns a new task queue object or NULL if there was an error; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_DestroyAsyncIOQueue + * \sa SDL_GetAsyncIOResult + * \sa SDL_WaitAsyncIOResult + */ +extern SDL_DECLSPEC SDL_AsyncIOQueue * SDLCALL SDL_CreateAsyncIOQueue(void); + +/** + * Destroy a previously-created async I/O task queue. + * + * If there are still tasks pending for this queue, this call will block until + * those tasks are finished. All those tasks will be deallocated. Their + * results will be lost to the app. + * + * Any pending reads from SDL_LoadFileAsync() that are still in this queue + * will have their buffers deallocated by this function, to prevent a memory + * leak. + * + * Once this function is called, the queue is no longer valid and should not + * be used, including by other threads that might access it while destruction + * is blocking on pending tasks. + * + * Do not destroy a queue that still has threads waiting on it through + * SDL_WaitAsyncIOResult(). You can call SDL_SignalAsyncIOQueue() first to + * unblock those threads, and take measures (such as SDL_WaitThread()) to make + * sure they have finished their wait and won't wait on the queue again. + * + * \param queue the task queue to destroy. + * + * \threadsafety It is safe to call this function from any thread, so long as + * no other thread is waiting on the queue with + * SDL_WaitAsyncIOResult. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_DestroyAsyncIOQueue(SDL_AsyncIOQueue *queue); + +/** + * Query an async I/O task queue for completed tasks. + * + * If a task assigned to this queue has finished, this will return true and + * fill in `outcome` with the details of the task. If no task in the queue has + * finished, this function will return false. This function does not block. + * + * If a task has completed, this function will free its resources and the task + * pointer will no longer be valid. The task will be removed from the queue. + * + * It is safe for multiple threads to call this function on the same queue at + * once; a completed task will only go to one of the threads. + * + * \param queue the async I/O task queue to query. + * \param outcome details of a finished task will be written here. May not be + * NULL. + * \returns true if a task has completed, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_WaitAsyncIOResult + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GetAsyncIOResult(SDL_AsyncIOQueue *queue, SDL_AsyncIOOutcome *outcome); + +/** + * Block until an async I/O task queue has a completed task. + * + * This function puts the calling thread to sleep until there a task assigned + * to the queue that has finished. + * + * If a task assigned to the queue has finished, this will return true and + * fill in `outcome` with the details of the task. If no task in the queue has + * finished, this function will return false. + * + * If a task has completed, this function will free its resources and the task + * pointer will no longer be valid. The task will be removed from the queue. + * + * It is safe for multiple threads to call this function on the same queue at + * once; a completed task will only go to one of the threads. + * + * Note that by the nature of various platforms, more than one waiting thread + * may wake to handle a single task, but only one will obtain it, so + * `timeoutMS` is a _maximum_ wait time, and this function may return false + * sooner. + * + * This function may return false if there was a system error, the OS + * inadvertently awoke multiple threads, or if SDL_SignalAsyncIOQueue() was + * called to wake up all waiting threads without a finished task. + * + * A timeout can be used to specify a maximum wait time, but rather than + * polling, it is possible to have a timeout of -1 to wait forever, and use + * SDL_SignalAsyncIOQueue() to wake up the waiting threads later. + * + * \param queue the async I/O task queue to wait on. + * \param outcome details of a finished task will be written here. May not be + * NULL. + * \param timeoutMS the maximum time to wait, in milliseconds, or -1 to wait + * indefinitely. + * \returns true if task has completed, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SignalAsyncIOQueue + */ +extern SDL_DECLSPEC bool SDLCALL SDL_WaitAsyncIOResult(SDL_AsyncIOQueue *queue, SDL_AsyncIOOutcome *outcome, Sint32 timeoutMS); + +/** + * Wake up any threads that are blocking in SDL_WaitAsyncIOResult(). + * + * This will unblock any threads that are sleeping in a call to + * SDL_WaitAsyncIOResult for the specified queue, and cause them to return + * from that function. + * + * This can be useful when destroying a queue to make sure nothing is touching + * it indefinitely. In this case, once this call completes, the caller should + * take measures to make sure any previously-blocked threads have returned + * from their wait and will not touch the queue again (perhaps by setting a + * flag to tell the threads to terminate and then using SDL_WaitThread() to + * make sure they've done so). + * + * \param queue the async I/O task queue to signal. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_WaitAsyncIOResult + */ +extern SDL_DECLSPEC void SDLCALL SDL_SignalAsyncIOQueue(SDL_AsyncIOQueue *queue); + +/** + * Load all the data from a file path, asynchronously. + * + * This function returns as quickly as possible; it does not wait for the read + * to complete. On a successful return, this work will continue in the + * background. If the work begins, even failure is asynchronous: a failing + * return value from this function only means the work couldn't start at all. + * + * The data is allocated with a zero byte at the end (null terminated) for + * convenience. This extra byte is not included in SDL_AsyncIOOutcome's + * bytes_transferred value. + * + * This function will allocate the buffer to contain the file. It must be + * deallocated by calling SDL_free() on SDL_AsyncIOOutcome's buffer field + * after completion. + * + * An SDL_AsyncIOQueue must be specified. The newly-created task will be added + * to it when it completes its work. + * + * \param file the path to read all available data from. + * \param queue a queue to add the new SDL_AsyncIO to. + * \param userdata an app-defined pointer that will be provided with the task + * results. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_LoadFile_IO + */ +extern SDL_DECLSPEC bool SDLCALL SDL_LoadFileAsync(const char *file, SDL_AsyncIOQueue *queue, void *userdata); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include + +#endif /* SDL_asyncio_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_atomic.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_atomic.h index f159bcd..03e3fb1 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_atomic.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_atomic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -88,15 +88,16 @@ typedef int SDL_SpinLock; * 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. + * \returns true if the lock succeeded, false if the lock is already held. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockSpinlock * \sa SDL_UnlockSpinlock */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock); /** * Lock a spin lock by setting it to a non-zero value. @@ -106,7 +107,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock); * * \param lock a pointer to a lock variable. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_TryLockSpinlock * \sa SDL_UnlockSpinlock @@ -123,7 +126,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockSpinlock(SDL_SpinLock *lock); * * \param lock a pointer to a lock variable. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockSpinlock * \sa SDL_TryLockSpinlock @@ -147,9 +152,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockSpinlock(SDL_SpinLock *lock); * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_CompilerBarrier() DoCompilerSpecificReadWriteBarrier() + #elif defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__) void _ReadWriteBarrier(void); #pragma intrinsic(_ReadWriteBarrier) @@ -166,7 +172,50 @@ extern __inline void SDL_CompilerBarrier(void); #endif /** - * Insert a memory release barrier. + * Insert a memory release barrier (function version). + * + * Please refer to SDL_MemoryBarrierRelease for details. This is a function + * version, which might be useful if you need to use this functionality from a + * scripting language, etc. Also, some of the macro versions call this + * function behind the scenes, where more heavy lifting can happen inside of + * SDL. Generally, though, an app written in C/C++/etc should use the macro + * version, as it will be more efficient. + * + * \threadsafety Obviously this function is safe to use from any thread at any + * time, but if you find yourself needing this, you are probably + * dealing with some very sensitive code; be careful! + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_MemoryBarrierRelease + */ +extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void); + +/** + * Insert a memory acquire barrier (function version). + * + * Please refer to SDL_MemoryBarrierRelease for details. This is a function + * version, which might be useful if you need to use this functionality from a + * scripting language, etc. Also, some of the macro versions call this + * function behind the scenes, where more heavy lifting can happen inside of + * SDL. Generally, though, an app written in C/C++/etc should use the macro + * version, as it will be more efficient. + * + * \threadsafety Obviously this function is safe to use from any thread at any + * time, but if you find yourself needing this, you are probably + * dealing with some very sensitive code; be careful! + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_MemoryBarrierAcquire + */ +extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void); + + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Insert a memory release barrier (macro version). * * 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. @@ -186,31 +235,47 @@ extern __inline void SDL_CompilerBarrier(void); * For more information on these semantics, take a look at the blog post: * http://preshing.com/20120913/acquire-and-release-semantics * + * This is the macro version of this functionality; if possible, SDL will use + * compiler intrinsics or inline assembly, but some platforms might need to + * call the function version of this, SDL_MemoryBarrierReleaseFunction to do + * the heavy lifting. Apps that can use the macro should favor it over the + * function. + * * \threadsafety Obviously this macro is safe to use from any thread at any * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This function is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_MemoryBarrierAcquire + * \sa SDL_MemoryBarrierReleaseFunction */ -extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void); +#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction() /** - * Insert a memory acquire barrier. + * Insert a memory acquire barrier (macro version). * - * Please refer to SDL_MemoryBarrierReleaseFunction for the details! + * Please see SDL_MemoryBarrierRelease for the details on what memory barriers + * are and when to use them. * - * \threadsafety Obviously this function is safe to use from any thread at any + * This is the macro version of this functionality; if possible, SDL will use + * compiler intrinsics or inline assembly, but some platforms might need to + * call the function version of this, SDL_MemoryBarrierAcquireFunction, to do + * the heavy lifting. Apps that can use the macro should favor it over the + * function. + * + * \threadsafety Obviously this macro is safe to use from any thread at any * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This function is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * - * \sa SDL_MemoryBarrierReleaseFunction + * \sa SDL_MemoryBarrierRelease + * \sa SDL_MemoryBarrierAcquireFunction */ -extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void); +#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction() -/* !!! FIXME: this should have documentation! */ -#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +#elif 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__) @@ -225,8 +290,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void); hard-coded at address 0xffff0fa0 */ typedef void (*SDL_KernelMemoryBarrierFunc)(); -#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() -#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() +#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() +#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() #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") @@ -276,9 +341,10 @@ typedef void (*SDL_KernelMemoryBarrierFunc)(); * * \threadsafety This macro is safe to use from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_CPUPauseInstruction() DoACPUPauseInACompilerAndArchitectureSpecificWay + #elif (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__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(__aarch64__) @@ -303,9 +369,10 @@ typedef void (*SDL_KernelMemoryBarrierFunc)(); * A type representing an atomic integer value. * * This can be used to manage a value that is synchronized across multiple - * CPUs without a race condition; when an app sets a value with SDL_AtomicSet - * all other threads, regardless of the CPU it is running on, will see that - * value when retrieved with SDL_AtomicGet, regardless of CPU caches, etc. + * CPUs without a race condition; when an app sets a value with + * SDL_SetAtomicInt all other threads, regardless of the CPU it is running on, + * will see that value when retrieved with SDL_GetAtomicInt, regardless of CPU + * caches, etc. * * This is also useful for atomic compare-and-swap operations: a thread can * change the value as long as its current value matches expectations. When @@ -316,14 +383,14 @@ typedef void (*SDL_KernelMemoryBarrierFunc)(); * this!). * * This is a struct so people don't accidentally use numeric operations on it - * directly. You have to use SDL_Atomic* functions. + * directly. You have to use SDL atomic functions. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * - * \sa SDL_AtomicCompareAndSwap - * \sa SDL_AtomicGet - * \sa SDL_AtomicSet - * \sa SDL_AtomicAdd + * \sa SDL_CompareAndSwapAtomicInt + * \sa SDL_GetAtomicInt + * \sa SDL_SetAtomicInt + * \sa SDL_AddAtomicInt */ typedef struct SDL_AtomicInt { int value; } SDL_AtomicInt; @@ -336,15 +403,16 @@ typedef struct SDL_AtomicInt { int value; } SDL_AtomicInt; * \param a a pointer to an SDL_AtomicInt 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. + * \returns true if the atomic variable was set, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicCompareAndSwapPointer + * \sa SDL_GetAtomicInt + * \sa SDL_SetAtomicInt */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwap(SDL_AtomicInt *a, int oldval, int newval); +extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicInt(SDL_AtomicInt *a, int oldval, int newval); /** * Set an atomic variable to a value. @@ -360,11 +428,11 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwap(SDL_AtomicInt *a, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicGet + * \sa SDL_GetAtomicInt */ -extern SDL_DECLSPEC int SDLCALL SDL_AtomicSet(SDL_AtomicInt *a, int v); +extern SDL_DECLSPEC int SDLCALL SDL_SetAtomicInt(SDL_AtomicInt *a, int v); /** * Get the value of an atomic variable. @@ -377,11 +445,11 @@ extern SDL_DECLSPEC int SDLCALL SDL_AtomicSet(SDL_AtomicInt *a, int v); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicSet + * \sa SDL_SetAtomicInt */ -extern SDL_DECLSPEC int SDLCALL SDL_AtomicGet(SDL_AtomicInt *a); +extern SDL_DECLSPEC int SDLCALL SDL_GetAtomicInt(SDL_AtomicInt *a); /** * Add to an atomic variable. @@ -397,12 +465,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_AtomicGet(SDL_AtomicInt *a); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AtomicDecRef * \sa SDL_AtomicIncRef */ -extern SDL_DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_AtomicInt *a, int v); +extern SDL_DECLSPEC int SDLCALL SDL_AddAtomicInt(SDL_AtomicInt *a, int v); #ifndef SDL_AtomicIncRef @@ -414,11 +482,13 @@ extern SDL_DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_AtomicInt *a, int v); * \param a a pointer to an SDL_AtomicInt to increment. * \returns the previous value of the atomic variable. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. * * \sa SDL_AtomicDecRef */ -#define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1) +#define SDL_AtomicIncRef(a) SDL_AddAtomicInt(a, 1) #endif #ifndef SDL_AtomicDecRef @@ -429,16 +499,103 @@ extern SDL_DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_AtomicInt *a, int v); * ***Note: If you don't know what this macro is for, you shouldn't use it!*** * * \param a a pointer to an SDL_AtomicInt to increment. - * \returns SDL_TRUE if the variable reached zero after decrementing, - * SDL_FALSE otherwise. + * \returns true if the variable reached zero after decrementing, false + * otherwise. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. * * \sa SDL_AtomicIncRef */ -#define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1) +#define SDL_AtomicDecRef(a) (SDL_AddAtomicInt(a, -1) == 1) #endif +/** + * A type representing an atomic unsigned 32-bit value. + * + * This can be used to manage a value that is synchronized across multiple + * CPUs without a race condition; when an app sets a value with + * SDL_SetAtomicU32 all other threads, regardless of the CPU it is running on, + * will see that value when retrieved with SDL_GetAtomicU32, regardless of CPU + * caches, etc. + * + * This is also useful for atomic compare-and-swap operations: a thread can + * change the value as long as its current value matches expectations. When + * done in a loop, one can guarantee data consistency across threads without a + * lock (but the usual warnings apply: if you don't know what you're doing, or + * you don't do it carefully, you can confidently cause any number of + * disasters with this, so in most cases, you _should_ use a mutex instead of + * this!). + * + * This is a struct so people don't accidentally use numeric operations on it + * directly. You have to use SDL atomic functions. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CompareAndSwapAtomicU32 + * \sa SDL_GetAtomicU32 + * \sa SDL_SetAtomicU32 + */ +typedef struct SDL_AtomicU32 { Uint32 value; } SDL_AtomicU32; + +/** + * 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_AtomicU32 variable to be modified. + * \param oldval the old value. + * \param newval the new value. + * \returns true if the atomic variable was set, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetAtomicU32 + * \sa SDL_SetAtomicU32 + */ +extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicU32(SDL_AtomicU32 *a, Uint32 oldval, Uint32 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_AtomicU32 variable to be modified. + * \param v the desired value. + * \returns the previous value of the atomic variable. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetAtomicU32 + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_SetAtomicU32(SDL_AtomicU32 *a, Uint32 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_AtomicU32 variable. + * \returns the current value of an atomic variable. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetAtomicU32 + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAtomicU32(SDL_AtomicU32 *a); + /** * Set a pointer to a new value if it is currently an old value. * @@ -448,17 +605,17 @@ extern SDL_DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_AtomicInt *a, int v); * \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. + * \returns true if the pointer was set, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicCompareAndSwap - * \sa SDL_AtomicGetPointer - * \sa SDL_AtomicSetPointer + * \sa SDL_CompareAndSwapAtomicInt + * \sa SDL_GetAtomicPointer + * \sa SDL_SetAtomicPointer */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwapPointer(void **a, void *oldval, void *newval); +extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicPointer(void **a, void *oldval, void *newval); /** * Set a pointer to a value atomically. @@ -472,12 +629,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwapPointer(void **a, v * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicCompareAndSwapPointer - * \sa SDL_AtomicGetPointer + * \sa SDL_CompareAndSwapAtomicPointer + * \sa SDL_GetAtomicPointer */ -extern SDL_DECLSPEC void * SDLCALL SDL_AtomicSetPointer(void **a, void *v); +extern SDL_DECLSPEC void * SDLCALL SDL_SetAtomicPointer(void **a, void *v); /** * Get the value of a pointer atomically. @@ -490,12 +647,12 @@ extern SDL_DECLSPEC void * SDLCALL SDL_AtomicSetPointer(void **a, void *v); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_AtomicCompareAndSwapPointer - * \sa SDL_AtomicSetPointer + * \sa SDL_CompareAndSwapAtomicPointer + * \sa SDL_SetAtomicPointer */ -extern SDL_DECLSPEC void * SDLCALL SDL_AtomicGetPointer(void **a); +extern SDL_DECLSPEC void * SDLCALL SDL_GetAtomicPointer(void **a); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_audio.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_audio.h index b7a4b7b..9569382 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_audio.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_audio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -33,8 +33,9 @@ * even if the data format changes on either side halfway through. * * An app opens an audio device and binds any number of audio streams to it, - * feeding more data to it as available. When the devices needs more data, it - * will pull it from all bound streams and mix them together for playback. + * feeding more data to the streams as available. When the device needs more + * data, it will pull it from all bound streams and mix them together for + * playback. * * Audio streams can also use an app-provided callback to supply data * on-demand, which maps pretty closely to the SDL2 audio model. @@ -43,6 +44,45 @@ * if you aren't reading from a file) as a basic means to load sound data into * your program. * + * ## Logical audio devices + * + * In SDL3, opening a physical device (like a SoundBlaster 16 Pro) gives you a + * logical device ID that you can bind audio streams to. In almost all cases, + * logical devices can be used anywhere in the API that a physical device is + * normally used. However, since each device opening generates a new logical + * device, different parts of the program (say, a VoIP library, or + * text-to-speech framework, or maybe some other sort of mixer on top of SDL) + * can have their own device opens that do not interfere with each other; each + * logical device will mix its separate audio down to a single buffer, fed to + * the physical device, behind the scenes. As many logical devices as you like + * can come and go; SDL will only have to open the physical device at the OS + * level once, and will manage all the logical devices on top of it + * internally. + * + * One other benefit of logical devices: if you don't open a specific physical + * device, instead opting for the default, SDL can automatically migrate those + * logical devices to different hardware as circumstances change: a user + * plugged in headphones? The system default changed? SDL can transparently + * migrate the logical devices to the correct physical device seamlessly and + * keep playing; the app doesn't even have to know it happened if it doesn't + * want to. + * + * ## Simplified audio + * + * As a simplified model for when a single source of audio is all that's + * needed, an app can use SDL_OpenAudioDeviceStream, which is a single + * function to open an audio device, create an audio stream, bind that stream + * to the newly-opened device, and (optionally) provide a callback for + * obtaining audio data. When using this function, the primary interface is + * the SDL_AudioStream and the device handle is mostly hidden away; destroying + * a stream created through this function will also close the device, stream + * bindings cannot be changed, etc. One other quirk of this is that the device + * is started in a _paused_ state and must be explicitly resumed; this is + * partially to offer a clean migration for SDL2 apps and partially because + * the app might have to do more setup before playback begins; in the + * non-simplified form, nothing will play until a stream is bound to a device, + * so they start _unpaused_. + * * ## Channel layouts * * Audio data passing through SDL is uncompressed PCM data, interleaved. One @@ -73,7 +113,7 @@ * - 4 channels (quad) layout: FL, FR, BL, BR * - 5 channels (4.1) layout: FL, FR, LFE, BL, BR * - 6 channels (5.1) layout: FL, FR, FC, LFE, BL, BR (last two can also be - * BL, BR) + * SL, SR) * - 7 channels (6.1) layout: FL, FR, FC, LFE, BC, SL, SR * - 8 channels (7.1) layout: FL, FR, FC, LFE, BL, BR, SL, SR * @@ -94,7 +134,6 @@ #include #include #include -#include #include /* Set up for C function definitions, even when using C++ */ @@ -102,19 +141,73 @@ extern "C" { #endif -/* masks for different parts of SDL_AudioFormat. */ +/** + * Mask of bits in an SDL_AudioFormat that contains the format bit size. + * + * Generally one should use SDL_AUDIO_BITSIZE instead of this macro directly. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_AUDIO_MASK_BITSIZE (0xFFu) + +/** + * Mask of bits in an SDL_AudioFormat that contain the floating point flag. + * + * Generally one should use SDL_AUDIO_ISFLOAT instead of this macro directly. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_AUDIO_MASK_FLOAT (1u<<8) + +/** + * Mask of bits in an SDL_AudioFormat that contain the bigendian flag. + * + * Generally one should use SDL_AUDIO_ISBIGENDIAN or SDL_AUDIO_ISLITTLEENDIAN + * instead of this macro directly. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_AUDIO_MASK_BIG_ENDIAN (1u<<12) + +/** + * Mask of bits in an SDL_AudioFormat that contain the signed data flag. + * + * Generally one should use SDL_AUDIO_ISSIGNED instead of this macro directly. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_AUDIO_MASK_SIGNED (1u<<15) -#define SDL_DEFINE_AUDIO_FORMAT(signed, bigendian, float, size) \ - (((Uint16)(signed) << 15) | ((Uint16)(bigendian) << 12) | ((Uint16)(float) << 8) | ((size) & SDL_AUDIO_MASK_BITSIZE)) +/** + * Define an SDL_AudioFormat value. + * + * SDL does not support custom audio formats, so this macro is not of much use + * externally, but it can be illustrative as to what the various bits of an + * SDL_AudioFormat mean. + * + * For example, SDL_AUDIO_S32LE looks like this: + * + * ```c + * SDL_DEFINE_AUDIO_FORMAT(1, 0, 0, 32) + * ``` + * + * \param signed 1 for signed data, 0 for unsigned data. + * \param bigendian 1 for bigendian data, 0 for littleendian data. + * \param flt 1 for floating point data, 0 for integer data. + * \param size number of bits per sample. + * \returns a format value in the style of SDL_AudioFormat. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_DEFINE_AUDIO_FORMAT(signed, bigendian, flt, size) \ + (((Uint16)(signed) << 15) | ((Uint16)(bigendian) << 12) | ((Uint16)(flt) << 8) | ((size) & SDL_AUDIO_MASK_BITSIZE)) /** * Audio format. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_AUDIO_BITSIZE * \sa SDL_AUDIO_BYTESIZE @@ -144,17 +237,18 @@ typedef enum SDL_AudioFormat /* SDL_DEFINE_AUDIO_FORMAT(1, 0, 1, 32), */ SDL_AUDIO_F32BE = 0x9120u, /**< As above, but big-endian byte order */ /* SDL_DEFINE_AUDIO_FORMAT(1, 1, 1, 32), */ -} SDL_AudioFormat; -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define SDL_AUDIO_S16 SDL_AUDIO_S16LE -#define SDL_AUDIO_S32 SDL_AUDIO_S32LE -#define SDL_AUDIO_F32 SDL_AUDIO_F32LE -#else -#define SDL_AUDIO_S16 SDL_AUDIO_S16BE -#define SDL_AUDIO_S32 SDL_AUDIO_S32BE -#define SDL_AUDIO_F32 SDL_AUDIO_F32BE -#endif + /* These represent the current system's byteorder. */ + #if SDL_BYTEORDER == SDL_LIL_ENDIAN + SDL_AUDIO_S16 = SDL_AUDIO_S16LE, + SDL_AUDIO_S32 = SDL_AUDIO_S32LE, + SDL_AUDIO_F32 = SDL_AUDIO_F32LE + #else + SDL_AUDIO_S16 = SDL_AUDIO_S16BE, + SDL_AUDIO_S32 = SDL_AUDIO_S32BE, + SDL_AUDIO_F32 = SDL_AUDIO_F32BE + #endif +} SDL_AudioFormat; /** @@ -167,7 +261,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_BITSIZE(x) ((x) & SDL_AUDIO_MASK_BITSIZE) @@ -181,7 +275,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_BYTESIZE(x) (SDL_AUDIO_BITSIZE(x) / 8) @@ -195,7 +289,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISFLOAT(x) ((x) & SDL_AUDIO_MASK_FLOAT) @@ -209,7 +303,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISBIGENDIAN(x) ((x) & SDL_AUDIO_MASK_BIG_ENDIAN) @@ -223,7 +317,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x)) @@ -237,7 +331,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISSIGNED(x) ((x) & SDL_AUDIO_MASK_SIGNED) @@ -251,7 +345,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x)) @@ -265,7 +359,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x)) @@ -275,7 +369,7 @@ typedef enum SDL_AudioFormat * * Zero is used to signify an invalid/null device. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_AudioDeviceID; @@ -286,7 +380,7 @@ typedef Uint32 SDL_AudioDeviceID; * to signify the app just wants the system to choose a default device instead * of the app providing a specific one. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK ((SDL_AudioDeviceID) 0xFFFFFFFFu) @@ -297,14 +391,14 @@ typedef Uint32 SDL_AudioDeviceID; * to signify the app just wants the system to choose a default device instead * of the app providing a specific one. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_DEVICE_DEFAULT_RECORDING ((SDL_AudioDeviceID) 0xFFFFFFFEu) /** * Format specifier for audio data. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_AudioFormat */ @@ -326,7 +420,7 @@ typedef struct SDL_AudioSpec * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_FRAMESIZE(x) (SDL_AUDIO_BYTESIZE((x).format) * (x).channels) @@ -350,7 +444,7 @@ typedef struct SDL_AudioSpec * more of them, bind them to an opened audio device, and feed data to them * (or for recording, consume data from them). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateAudioStream */ @@ -359,14 +453,6 @@ typedef struct SDL_AudioStream SDL_AudioStream; /* 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. * @@ -384,7 +470,7 @@ typedef struct SDL_AudioStream SDL_AudioStream; * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioDriver */ @@ -408,12 +494,11 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumAudioDrivers */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDriver(int index); -/* @} */ /** * Get the name of the current audio driver. @@ -427,7 +512,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDriver(int index); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver(void); @@ -453,7 +538,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenAudioDevice * \sa SDL_GetAudioRecordingDevices @@ -482,7 +567,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioPlaybackDevices(int * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenAudioDevice * \sa SDL_GetAudioPlaybackDevices @@ -498,11 +583,10 @@ extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioRecordingDevices(int * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioPlaybackDevices * \sa SDL_GetAudioRecordingDevices - * \sa SDL_GetDefaultAudioInfo */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDeviceName(SDL_AudioDeviceID devid); @@ -532,14 +616,14 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDeviceName(SDL_AudioDeviceI * \param spec on return, will be filled with device details. * \param sample_frames pointer to store device buffer size, in sample frames. * Can be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devid, SDL_AudioSpec *spec, int *sample_frames); +extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devid, SDL_AudioSpec *spec, int *sample_frames); /** * Get the current channel map of an audio device. @@ -558,7 +642,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -633,13 +717,52 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioDeviceChannelMap(SDL_AudioDeviceID * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseAudioDevice * \sa SDL_GetAudioDeviceFormat */ extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(SDL_AudioDeviceID devid, const SDL_AudioSpec *spec); +/** + * Determine if an audio device is physical (instead of logical). + * + * An SDL_AudioDeviceID that represents physical hardware is a physical + * device; there is one for each piece of hardware that SDL can see. Logical + * devices are created by calling SDL_OpenAudioDevice or + * SDL_OpenAudioDeviceStream, and while each is associated with a physical + * device, there can be any number of logical devices on one physical device. + * + * For the most part, logical and physical IDs are interchangeable--if you try + * to open a logical device, SDL understands to assign that effort to the + * underlying physical device, etc. However, it might be useful to know if an + * arbitrary device ID is physical or logical. This function reports which. + * + * This function may return either true or false for invalid device IDs. + * + * \param devid the device ID to query. + * \returns true if devid is a physical device, false if it is logical. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_IsAudioDevicePhysical(SDL_AudioDeviceID devid); + +/** + * Determine if an audio device is a playback device (instead of recording). + * + * This function may return either true or false for invalid device IDs. + * + * \param devid the device ID to query. + * \returns true if devid is a playback device, false if it is recording. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_IsAudioDevicePlayback(SDL_AudioDeviceID devid); + /** * Use this function to pause audio playback on a specified device. * @@ -659,17 +782,17 @@ extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(SDL_AudioDevic * created through SDL_OpenAudioDevice() can be. * * \param dev a device opened by SDL_OpenAudioDevice(). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResumeAudioDevice * \sa SDL_AudioDevicePaused */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev); +extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev); /** * Use this function to unpause audio playback on a specified device. @@ -687,17 +810,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev) * created through SDL_OpenAudioDevice() can be. * * \param dev a device opened by SDL_OpenAudioDevice(). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AudioDevicePaused * \sa SDL_PauseAudioDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResumeAudioDevice(SDL_AudioDeviceID dev); +extern SDL_DECLSPEC bool SDLCALL SDL_ResumeAudioDevice(SDL_AudioDeviceID dev); /** * Use this function to query if an audio device is paused. @@ -710,16 +833,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResumeAudioDevice(SDL_AudioDeviceID dev * IDs will report themselves as unpaused here. * * \param dev a device opened by SDL_OpenAudioDevice(). - * \returns SDL_TRUE if device is valid and paused, SDL_FALSE otherwise. + * \returns true if device is valid and paused, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PauseAudioDevice * \sa SDL_ResumeAudioDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AudioDevicePaused(SDL_AudioDeviceID dev); +extern SDL_DECLSPEC bool SDLCALL SDL_AudioDevicePaused(SDL_AudioDeviceID dev); /** * Get the gain of an audio device. @@ -738,7 +861,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AudioDevicePaused(SDL_AudioDeviceID dev * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioDeviceGain */ @@ -753,8 +876,8 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioDeviceGain(SDL_AudioDeviceID devid * Audio devices default to a gain of 1.0f (no change in output). * * Physical devices may not have their gain changed, only logical devices, and - * this function will always return -1 when used on physical devices. While it - * might seem attractive to adjust several logical devices at once in this + * this function will always return false when used on physical devices. While + * it might seem attractive to adjust several logical devices at once in this * way, it would allow an app or library to interfere with another portion of * the program's otherwise-isolated devices. * @@ -767,17 +890,17 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioDeviceGain(SDL_AudioDeviceID devid * * \param devid the audio device on which to change gain. * \param gain the gain. 1.0f is no change, 0.0f is silence. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioDeviceGain */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioDeviceGain(SDL_AudioDeviceID devid, float gain); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioDeviceGain(SDL_AudioDeviceID devid, float gain); /** * Close a previously-opened audio device. @@ -794,7 +917,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioDeviceGain(SDL_AudioDeviceID de * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenAudioDevice */ @@ -819,23 +942,23 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID devid); * Binding a stream to a device will set its output format for playback * devices, and its input format for recording devices, so they match the * device's settings. The caller is welcome to change the other end of the - * stream's format at any time. + * stream's format at any time with SDL_SetAudioStreamFormat(). * * \param devid an audio device to bind a stream to. * \param streams an array of audio streams to bind. * \param num_streams number streams listed in the `streams` array. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStreams * \sa SDL_UnbindAudioStream * \sa SDL_GetAudioStreamDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream **streams, int num_streams); +extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream * const *streams, int num_streams); /** * Bind a single audio stream to an audio device. @@ -845,18 +968,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devi * * \param devid an audio device to bind a stream to. * \param stream an audio stream to bind to a device. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStreams * \sa SDL_UnbindAudioStream * \sa SDL_GetAudioStreamDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BindAudioStream(SDL_AudioDeviceID devid, SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStream(SDL_AudioDeviceID devid, SDL_AudioStream *stream); /** * Unbind a list of audio streams from their audio devices. @@ -867,16 +990,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BindAudioStream(SDL_AudioDeviceID devid * * Unbinding a stream that isn't bound to a device is a legal no-op. * - * \param streams an array of audio streams to unbind. + * \param streams an array of audio streams to unbind. Can be NULL or contain + * NULL. * \param num_streams number streams listed in the `streams` array. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStreams */ -extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream **streams, int num_streams); +extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream * const *streams, int num_streams); /** * Unbind a single audio stream from its audio device. @@ -884,11 +1008,11 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream **stream * This is a convenience function, equivalent to calling * `SDL_UnbindAudioStreams(&stream, 1)`. * - * \param stream an audio stream to unbind from a device. + * \param stream an audio stream to unbind from a device. Can be NULL. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStream */ @@ -907,7 +1031,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStream(SDL_AudioStream *stream); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStream * \sa SDL_BindAudioStreams @@ -924,7 +1048,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_GetAudioStreamDevice(SDL_Audio * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PutAudioStreamData * \sa SDL_GetAudioStreamData @@ -943,7 +1067,9 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_Au * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_AudioStream *stream); @@ -953,17 +1079,17 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_Au * \param stream the SDL_AudioStream to query. * \param src_spec where to store the input audio format; ignored if NULL. * \param dst_spec where to store the output audio format; ignored if NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamFormat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetAudioStreamFormat(SDL_AudioStream *stream, SDL_AudioSpec *src_spec, SDL_AudioSpec *dst_spec); +extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioStreamFormat(SDL_AudioStream *stream, SDL_AudioSpec *src_spec, SDL_AudioSpec *dst_spec); /** * Change the input and output formats of an audio stream. @@ -978,23 +1104,29 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetAudioStreamFormat(SDL_AudioStream *s * next sound file, and start putting that new data while the previous sound * file is still queued, and everything will still play back correctly. * + * If a stream is bound to a device, then the format of the side of the stream + * bound to a device cannot be changed (src_spec for recording devices, + * dst_spec for playback devices). Attempts to make a change to this side will + * be ignored, but this will not report an error. The other side's format can + * be changed. + * * \param stream the stream the format is being changed. * \param src_spec the new format of the audio input; if NULL, it is not * changed. * \param dst_spec the new format of the audio output; if NULL, it is not * changed. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamFormat * \sa SDL_SetAudioStreamFrequencyRatio */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamFormat(SDL_AudioStream *stream, const SDL_AudioSpec *src_spec, const SDL_AudioSpec *dst_spec); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamFormat(SDL_AudioStream *stream, const SDL_AudioSpec *src_spec, const SDL_AudioSpec *dst_spec); /** * Get the frequency ratio of an audio stream. @@ -1006,7 +1138,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamFormat(SDL_AudioStream *s * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamFrequencyRatio */ @@ -1027,18 +1159,18 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamFrequencyRatio(SDL_AudioStre * \param stream the stream the frequency ratio is being changed. * \param ratio the frequency ratio. 1.0 is normal speed. Must be between 0.01 * and 100. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamFrequencyRatio * \sa SDL_SetAudioStreamFormat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamFrequencyRatio(SDL_AudioStream *stream, float ratio); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamFrequencyRatio(SDL_AudioStream *stream, float ratio); /** * Get the gain of an audio stream. @@ -1055,7 +1187,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamFrequencyRatio(SDL_AudioS * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamGain */ @@ -1074,17 +1206,17 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamGain(SDL_AudioStream *stream * * \param stream the stream on which the gain is being changed. * \param gain the gain. 1.0f is no change, 0.0f is silence. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamGain */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *stream, float gain); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *stream, float gain); /** * Get the current input channel map of an audio stream. @@ -1104,7 +1236,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *str * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -1128,7 +1260,7 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamInputChannelMap(SDL_AudioStr * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -1148,8 +1280,12 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioSt * channel that it should be remapped to. To reverse a stereo signal's left * and right values, you'd have an array of `{ 1, 0 }`. It is legal to remap * multiple channels to the same thing, so `{ 1, 1 }` would duplicate the - * right channel to both channels of a stereo signal. You cannot change the - * number of channels through a channel map, just reorder them. + * right channel to both channels of a stereo signal. An element in the + * channel map set to -1 instead of a valid channel will mute that channel, + * setting it to a silence value. + * + * You cannot change the number of channels through a channel map, just + * reorder/mute them. * * Data that was previously queued in the stream will still be operated on in * the order that was current when it was added, which is to say you can put @@ -1164,26 +1300,31 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioSt * after this call. * * If `count` is not equal to the current number of channels in the audio - * stream's format, this will fail. This is a safety measure to make sure a a - * race condition hasn't changed the format while you this call is setting the + * stream's format, this will fail. This is a safety measure to make sure a + * race condition hasn't changed the format while this call is setting the * channel map. * + * Unlike attempting to change the stream's format, the input channel map on a + * stream bound to a recording device is permitted to change at any time; any + * data added to the stream from the device after this call will have the new + * mapping, but previously-added data will still have the prior mapping. + * * \param stream the SDL_AudioStream to change. * \param chmap the new channel map, NULL to reset to default. * \param count The number of channels in the map. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. Don't change the * stream's format to have a different number of channels from a * a different thread at the same time, though! * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStream *stream, const int *chmap, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStream *stream, const int *chmap, int count); /** * Set the current output channel map of an audio stream. @@ -1194,12 +1335,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_Audio * The output channel map reorders data that leaving a stream via * SDL_GetAudioStreamData. * - * Each item in the array represents an output channel, and its value is the + * Each item in the array represents an input channel, and its value is the * channel that it should be remapped to. To reverse a stereo signal's left * and right values, you'd have an array of `{ 1, 0 }`. It is legal to remap * multiple channels to the same thing, so `{ 1, 1 }` would duplicate the - * right channel to both channels of a stereo signal. You cannot change the - * number of channels through a channel map, just reorder them. + * right channel to both channels of a stereo signal. An element in the + * channel map set to -1 instead of a valid channel will mute that channel, + * setting it to a silence value. + * + * You cannot change the number of channels through a channel map, just + * reorder/mute them. * * The output channel map can be changed at any time, as output remapping is * applied during SDL_GetAudioStreamData. @@ -1211,26 +1356,33 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_Audio * after this call. * * If `count` is not equal to the current number of channels in the audio - * stream's format, this will fail. This is a safety measure to make sure a a - * race condition hasn't changed the format while you this call is setting the + * stream's format, this will fail. This is a safety measure to make sure a + * race condition hasn't changed the format while this call is setting the * channel map. * + * Unlike attempting to change the stream's format, the output channel map on + * a stream bound to a recording device is permitted to change at any time; + * any data added to the stream after this call will have the new mapping, but + * previously-added data will still have the prior mapping. When the channel + * map doesn't match the hardware's channel layout, SDL will convert the data + * before feeding it to the device for playback. + * * \param stream the SDL_AudioStream to change. * \param chmap the new channel map, NULL to reset to default. * \param count The number of channels in the map. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. Don't change the * stream's format to have a different number of channels from a * a different thread at the same time, though! * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_AudioStream *stream, const int *chmap, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_AudioStream *stream, const int *chmap, int count); /** * Add data to the stream. @@ -1246,21 +1398,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_Audi * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, but if the * stream has a callback set, the caller might need to manage * extra locking. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearAudioStream * \sa SDL_FlushAudioStream * \sa SDL_GetAudioStreamData * \sa SDL_GetAudioStreamQueued */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *stream, const void *buf, int len); +extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *stream, const void *buf, int len); /** * Get converted/resampled data from the stream. @@ -1284,7 +1436,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *str * stream has a callback set, the caller might need to manage * extra locking. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearAudioStream * \sa SDL_GetAudioStreamAvailable @@ -1311,7 +1463,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamData(SDL_AudioStream *stream, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamData * \sa SDL_PutAudioStreamData @@ -1322,6 +1474,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamAvailable(SDL_AudioStream *str /** * Get the number of bytes currently queued. * + * This is the number of bytes put into a stream as input, not the number that + * can be retrieved as output. Because of several details, it's not possible + * to calculate one number directly from the other. If you need to know how + * much usable data can be retrieved right now, you should use + * SDL_GetAudioStreamAvailable() and not this function. + * * Note that audio streams can change their input format at any time, even if * there is still data queued in a different format, so the returned byte * count will not necessarily match the number of _sample frames_ available. @@ -1344,7 +1502,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamAvailable(SDL_AudioStream *str * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PutAudioStreamData * \sa SDL_ClearAudioStream @@ -1361,16 +1519,16 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamQueued(SDL_AudioStream *stream * input, so the complete output becomes available. * * \param stream the audio stream to flush. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PutAudioStreamData */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlushAudioStream(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_FlushAudioStream(SDL_AudioStream *stream); /** * Clear any pending data in the stream. @@ -1379,19 +1537,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlushAudioStream(SDL_AudioStream *strea * stream until more is added. * * \param stream the audio stream to clear. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamAvailable * \sa SDL_GetAudioStreamData * \sa SDL_GetAudioStreamQueued * \sa SDL_PutAudioStreamData */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearAudioStream(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearAudioStream(SDL_AudioStream *stream); /** * Use this function to pause audio playback on the audio device associated @@ -1406,16 +1564,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearAudioStream(SDL_AudioStream *strea * loading, etc. * * \param stream the audio stream associated with the audio device to pause. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResumeAudioStreamDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream *stream); /** * Use this function to unpause audio playback on the audio device associated @@ -1426,16 +1584,36 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream * to progress again, and audio can be generated. * * \param stream the audio stream associated with the audio device to resume. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PauseAudioStreamDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResumeAudioStreamDevice(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_ResumeAudioStreamDevice(SDL_AudioStream *stream); + +/** + * Use this function to query if an audio device associated with a stream is + * paused. + * + * Unlike in SDL2, audio devices start in an _unpaused_ state, since an app + * has to bind a stream before any audio will flow. + * + * \param stream the audio stream associated with the audio device to query. + * \returns true if device is valid and paused, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_PauseAudioStreamDevice + * \sa SDL_ResumeAudioStreamDevice + */ +extern SDL_DECLSPEC bool SDLCALL SDL_AudioStreamDevicePaused(SDL_AudioStream *stream); + /** * Lock an audio stream for serialized access. @@ -1454,16 +1632,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResumeAudioStreamDevice(SDL_AudioStream * all the same attributes (recursive locks are allowed, etc). * * \param stream the audio stream to lock. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UnlockAudioStream */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockAudioStream(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_LockAudioStream(SDL_AudioStream *stream); /** @@ -1472,17 +1650,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockAudioStream(SDL_AudioStream *stream * This unlocks an audio stream after a call to SDL_LockAudioStream. * * \param stream the audio stream to unlock. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety You should only call this from the same thread that * previously called SDL_LockAudioStream. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockAudioStream */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UnlockAudioStream(SDL_AudioStream *stream); +extern SDL_DECLSPEC bool SDLCALL SDL_UnlockAudioStream(SDL_AudioStream *stream); /** * A callback that fires when data passes through an SDL_AudioStream. @@ -1519,7 +1697,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UnlockAudioStream(SDL_AudioStream *stre * is called, so your callback does not need to manage the lock * explicitly. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamGetCallback * \sa SDL_SetAudioStreamPutCallback @@ -1561,16 +1739,16 @@ typedef void (SDLCALL *SDL_AudioStreamCallback)(void *userdata, SDL_AudioStream * from the stream. * \param userdata an opaque pointer provided to the callback for its own * personal use. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. This only fails if `stream` is NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. This only fails if `stream` is NULL. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamPutCallback */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStream *stream, SDL_AudioStreamCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStream *stream, SDL_AudioStreamCallback callback, void *userdata); /** * Set a callback that runs when data is added to an audio stream. @@ -1610,16 +1788,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStre * stream. * \param userdata an opaque pointer provided to the callback for its own * personal use. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. This only fails if `stream` is NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. This only fails if `stream` is NULL. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamGetCallback */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamPutCallback(SDL_AudioStream *stream, SDL_AudioStreamCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamPutCallback(SDL_AudioStream *stream, SDL_AudioStreamCallback callback, void *userdata); /** @@ -1637,7 +1815,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioStreamPutCallback(SDL_AudioStre * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateAudioStream */ @@ -1699,7 +1877,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyAudioStream(SDL_AudioStream *stream) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamDevice * \sa SDL_ResumeAudioStreamDevice @@ -1737,7 +1915,7 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_OpenAudioDeviceStream(SDL_Audi * application is responsible for locking resources the callback * touches that need to be protected. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetAudioPostmixCallback */ @@ -1788,14 +1966,14 @@ typedef void (SDLCALL *SDL_AudioPostmixCallback)(void *userdata, const SDL_Audio * \param devid the ID of an opened audio device. * \param callback a callback function to be called. Can be NULL. * \param userdata app-controlled pointer passed to callback. Can be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDeviceID devid, SDL_AudioPostmixCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDeviceID devid, SDL_AudioPostmixCallback callback, void *userdata); /** @@ -1839,7 +2017,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDevice * Example: * * ```c - * SDL_LoadWAV_IO(SDL_IOFromFile("sample.wav", "rb"), 1, &spec, &buf, &len); + * SDL_LoadWAV_IO(SDL_IOFromFile("sample.wav", "rb"), true, &spec, &buf, &len); * ``` * * Note that the SDL_LoadWAV function does this same thing for you, but in a @@ -1850,19 +2028,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDevice * ``` * * \param src the data source for the WAVE data. - * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning, - * even in the case of an error. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. * \param spec a pointer to an SDL_AudioSpec that will be set to the WAVE * data's format details on successful return. * \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 SDL_TRUE on success. `audio_buf` will be filled with a pointer to - * an allocated buffer containing the audio data, and `audio_len` is + * \returns true on success. `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 SDL_FALSE if the .WAV file cannot be opened, + * This function returns false if the .WAV file cannot be opened, * uses an unknown data format, or is corrupt; call SDL_GetError() * for more information. * @@ -1871,12 +2049,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDevice * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_free * \sa SDL_LoadWAV */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, SDL_bool closeio, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); +extern SDL_DECLSPEC bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, bool closeio, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); /** * Loads a WAV from a file path. @@ -1884,7 +2062,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, SDL_bool * This is a convenience function that is effectively the same as: * * ```c - * SDL_LoadWAV_IO(SDL_IOFromFile(path, "rb"), SDL_TRUE, spec, audio_buf, audio_len); + * SDL_LoadWAV_IO(SDL_IOFromFile(path, "rb"), true, spec, audio_buf, audio_len); * ``` * * \param path the file path of the WAV file to open. @@ -1894,11 +2072,11 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, SDL_bool * function. * \param audio_len a pointer filled with the length of the audio data buffer * in bytes. - * \returns SDL_TRUE on success. `audio_buf` will be filled with a pointer to - * an allocated buffer containing the audio data, and `audio_len` is + * \returns true on success. `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 SDL_FALSE if the .WAV file cannot be opened, + * This function returns false if the .WAV file cannot be opened, * uses an unknown data format, or is corrupt; call SDL_GetError() * for more information. * @@ -1907,12 +2085,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, SDL_bool * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_free * \sa SDL_LoadWAV_IO */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV(const char *path, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); +extern SDL_DECLSPEC bool SDLCALL SDL_LoadWAV(const char *path, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); /** * Mix audio data in a specified format. @@ -1941,14 +2119,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LoadWAV(const char *path, SDL_AudioSpec * \param len the length of the audio buffer in bytes. * \param volume ranges from 0.0 - 1.0, and should be set to 1.0 for full * audio volume. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, SDL_AudioFormat format, Uint32 len, float volume); +extern SDL_DECLSPEC bool SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, SDL_AudioFormat format, Uint32 len, float volume); /** * Convert some audio data of one format to another format. @@ -1971,14 +2149,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, * which should be freed with SDL_free(). On error, it will be * NULL. * \param dst_len will be filled with the len of dst_data. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec *src_spec, const Uint8 *src_data, int src_len, const SDL_AudioSpec *dst_spec, Uint8 **dst_data, int *dst_len); +extern SDL_DECLSPEC bool SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec *src_spec, const Uint8 *src_data, int src_len, const SDL_AudioSpec *dst_spec, Uint8 **dst_data, int *dst_len); /** * Get the human readable name of an audio format. @@ -1989,7 +2167,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioFormatName(SDL_AudioFormat format); @@ -2005,7 +2183,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioFormatName(SDL_AudioFormat * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSilenceValueForFormat(SDL_AudioFormat format); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_begin_code.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_begin_code.h index f418c61..a6b47cf 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_begin_code.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_begin_code.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,9 +22,15 @@ /* WIKI CATEGORY: BeginCode */ /** - * SDL_begin_code.h 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. :) + * # CategoryBeginCode + * + * `SDL_begin_code.h` 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. :) + * + * SDL's headers use this; applications generally should not include this + * header directly. */ /* This shouldn't be nested -- included it around code only. */ @@ -33,6 +39,259 @@ #endif #define SDL_begin_code_h +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro to tag a symbol as deprecated. + * + * A function is marked deprecated by adding this macro to its declaration: + * + * ```c + * extern SDL_DEPRECATED int ThisFunctionWasABadIdea(void); + * ``` + * + * Compilers with deprecation support can give a warning when a deprecated + * function is used. This symbol may be used in SDL's headers, but apps are + * welcome to use it for their own interfaces as well. + * + * SDL, on occasion, might deprecate a function for various reasons. However, + * SDL never removes symbols before major versions, so deprecated interfaces + * in SDL3 will remain available until SDL4, where it would be expected an app + * would have to take steps to migrate anyhow. + * + * On compilers without a deprecation mechanism, this is defined to nothing, + * and using a deprecated function will not generate a warning. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_DEPRECATED __attribute__((deprecated)) + +/** + * A macro to tag a symbol as a public API. + * + * SDL uses this macro for all its public functions. On some targets, it is + * used to signal to the compiler that this function needs to be exported from + * a shared library, but it might have other side effects. + * + * This symbol is used in SDL's headers, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_DECLSPEC __attribute__ ((visibility("default"))) + +/** + * A macro to set a function's calling conventions. + * + * SDL uses this macro for all its public functions, and any callbacks it + * defines. This macro guarantees that calling conventions match between SDL + * and the app, even if the two were built with different compilers or + * optimization settings. + * + * When writing a callback function, it is very important for it to be + * correctly tagged with SDLCALL, as mismatched calling conventions can cause + * strange behaviors and can be difficult to diagnose. Plus, on many + * platforms, SDLCALL is defined to nothing, so compilers won't be able to + * warn that the tag is missing. + * + * This symbol is used in SDL's headers, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDLCALL __cdecl + +/** + * A macro to request a function be inlined. + * + * This is a hint to the compiler to inline a function. The compiler is free + * to ignore this request. On compilers without inline support, this is + * defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_INLINE __inline + +/** + * A macro to demand a function be inlined. + * + * This is a command to the compiler to inline a function. SDL uses this macro + * in its public headers for a handful of simple functions. On compilers + * without forceinline support, this is defined to `static SDL_INLINE`, which + * is often good enough. + * + * This symbol is used in SDL's headers, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_FORCE_INLINE __forceinline + +/** + * A macro to tag a function as never-returning. + * + * This is a hint to the compiler that a function does not return. An example + * of a function like this is the C runtime's exit() function. + * + * This hint can lead to code optimizations, and help analyzers understand + * code flow better. On compilers without noreturn support, this is defined to + * nothing. + * + * This symbol is used in SDL's headers, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_NORETURN __attribute__((noreturn)) + +/** + * A macro to tag a function as never-returning (for analysis purposes). + * + * This is almost identical to SDL_NORETURN, except functions marked with this + * _can_ actually return. The difference is that this isn't used for code + * generation, but rather static analyzers use this information to assume + * truths about program state and available code paths. Specifically, this tag + * is useful for writing an assertion mechanism. Indeed, SDL_assert uses this + * tag behind the scenes. Generally, apps that don't understand the specific + * use-case for this tag should avoid using it directly. + * + * On compilers without analyzer_noreturn support, this is defined to nothing. + * + * This symbol is used in SDL's headers, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ANALYZER_NORETURN __attribute__((analyzer_noreturn)) + + +/** + * A macro to signal that a case statement without a `break` is intentional. + * + * C compilers have gotten more aggressive about warning when a switch's + * `case` block does not end with a `break` or other flow control statement, + * flowing into the next case's code, as this is a common accident that leads + * to strange bugs. But sometimes falling through to the next case is the + * correct and desired behavior. This symbol lets an app communicate this + * intention to the compiler, so it doesn't generate a warning. + * + * It is used like this: + * + * ```c + * switch (x) { + * case 1: + * DoSomethingOnlyForOne(); + * SDL_FALLTHROUGH; // tell the compiler this was intentional. + * case 2: + * DoSomethingForOneAndTwo(); + * break; + * } + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_FALLTHROUGH [[fallthrough]] + +/** + * A macro to tag a function's return value as critical. + * + * This is a hint to the compiler that a function's return value should not be + * ignored. + * + * If an NODISCARD function's return value is thrown away (the function is + * called as if it returns `void`), the compiler will issue a warning. + * + * While it's generally good practice to check return values for errors, often + * times legitimate programs do not for good reasons. Be careful about what + * functions are tagged as NODISCARD. It operates best when used on a function + * that's failure is surprising and catastrophic; a good example would be a + * program that checks the return values of all its file write function calls + * but not the call to close the file, which it assumes incorrectly never + * fails. + * + * Function callers that want to throw away a NODISCARD return value can call + * the function with a `(void)` cast, which informs the compiler the act is + * intentional. + * + * On compilers without nodiscard support, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_NODISCARD [[nodiscard]] + +/** + * A macro to tag a function as an allocator. + * + * This is a hint to the compiler that a function is an allocator, like + * malloc(), with certain rules. A description of how GCC treats this hint is + * here: + * + * https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute + * + * On compilers without allocator tag support, this is defined to nothing. + * + * Most apps don't need to, and should not, use this directly. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_MALLOC __declspec(allocator) __desclspec(restrict) + +/** + * A macro to tag a function as returning a certain allocation. + * + * This is a hint to the compiler that a function allocates and returns a + * specific amount of memory based on one of its arguments. For example, the C + * runtime's malloc() function could use this macro with an argument of 1 + * (first argument to malloc is the size of the allocation). + * + * On compilers without alloc_size support, this is defined to nothing. + * + * Most apps don't need to, and should not, use this directly. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ALLOC_SIZE(p) __attribute__((alloc_size(p))) + +/** + * A macro to tag a pointer variable, to help with pointer aliasing. + * + * A good explanation of the restrict keyword is here: + * + * https://en.wikipedia.org/wiki/Restrict + * + * On compilers without restrict support, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_RESTRICT __restrict__ + +/** + * Check if the compiler supports a given builtin functionality. + * + * This allows preprocessor checks for things that otherwise might fail to + * compile. + * + * Supported by virtually all clang versions and more-recent GCCs. Use this + * instead of checking the clang version if possible. + * + * On compilers without has_builtin support, this is defined to 0 (always + * false). + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_HAS_BUILTIN(x) __has_builtin(x) + +/* end of wiki documentation section. */ +#endif + +#ifndef SDL_HAS_BUILTIN +#ifdef __has_builtin +#define SDL_HAS_BUILTIN(x) __has_builtin(x) +#else +#define SDL_HAS_BUILTIN(x) 0 +#endif +#endif + #ifndef SDL_DEPRECATED # if defined(__GNUC__) && (__GNUC__ >= 4) /* technically, this arrived in gcc 3.1, but oh well. */ # define SDL_DEPRECATED __attribute__((deprecated)) @@ -53,7 +312,7 @@ /* Some compilers use a special export keyword */ #ifndef SDL_DECLSPEC -# if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINRT) || defined(SDL_PLATFORM_CYGWIN) || defined(SDL_PLATFORM_GDK) +# if defined(SDL_PLATFORM_WINDOWS) # ifdef DLL_EXPORT # define SDL_DECLSPEC __declspec(dllexport) # else @@ -70,7 +329,7 @@ /* By default SDL uses the C calling convention */ #ifndef SDLCALL -#if (defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINRT) || defined(SDL_PLATFORM_GDK)) && !defined(__GNUC__) +#if defined(SDL_PLATFORM_WINDOWS) && !defined(__GNUC__) #define SDLCALL __cdecl #else #define SDLCALL diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_bits.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_bits.h index 72be082..7435ce6 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_bits.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_bits.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -36,10 +36,6 @@ extern "C" { #endif -/** - * \file SDL_bits.h - */ - #if defined(__WATCOMC__) && defined(__386__) extern __inline int _SDL_bsr_watcom(Uint32); #pragma aux _SDL_bsr_watcom = \ @@ -65,7 +61,7 @@ extern __inline int _SDL_bsr_watcom(Uint32); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) { @@ -82,10 +78,10 @@ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) return -1; } return _SDL_bsr_watcom(x); -#elif defined(_MSC_VER) +#elif defined(_MSC_VER) && _MSC_VER >= 1400 unsigned long index; if (_BitScanReverse(&index, x)) { - return index; + return (int)index; } return -1; #else @@ -120,8 +116,7 @@ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) * Determine if a unsigned 32-bit value has exactly one bit set. * * If there are no bits set (`x` is zero), or more than one bit set, this - * returns SDL_FALSE. If any one bit is exclusively set, this returns - * SDL_TRUE. + * returns false. If any one bit is exclusively set, this returns true. * * Note that this is a forced-inline function in a header, and not a public * API function available in the SDL library (which is to say, the code is @@ -129,18 +124,18 @@ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) * be able to find this function inside SDL itself). * * \param x the 32-bit value to examine. - * \returns SDL_TRUE if exactly one bit is set in `x`, SDL_FALSE otherwise. + * \returns true if exactly one bit is set in `x`, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_HasExactlyOneBitSet32(Uint32 x) +SDL_FORCE_INLINE bool SDL_HasExactlyOneBitSet32(Uint32 x) { if (x && !(x & (x - 1))) { - return SDL_TRUE; + return true; } - return SDL_FALSE; + return false; } /* Ends C function definitions when using C++ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_blendmode.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_blendmode.h index 76aa197..8f00cbc 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_blendmode.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_blendmode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -24,7 +24,7 @@ * * Blend modes decide how two colors will mix together. There are both * standard modes for basic needs and a means to create custom modes, - * dictating what sort of math to do what on what color components. + * dictating what sort of math to do on what color components. */ #ifndef SDL_blendmode_h_ @@ -45,7 +45,7 @@ extern "C" { * * Additional values may be obtained from SDL_ComposeCustomBlendMode. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_ComposeCustomBlendMode */ @@ -64,7 +64,7 @@ typedef Uint32 SDL_BlendMode; * The blend operation used when combining source and destination pixel * components. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_BlendOperation { @@ -83,7 +83,7 @@ typedef enum SDL_BlendOperation * operation. The comma-separated factors listed above are always applied in * the component order red, green, blue, and alpha. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_BlendFactor { @@ -177,7 +177,9 @@ typedef enum SDL_BlendFactor * \returns an SDL_BlendMode that represents the chosen factors and * operations. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawBlendMode * \sa SDL_GetRenderDrawBlendMode diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_camera.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_camera.h index 3d4c57e..c4d0596 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_camera.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_camera.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -28,13 +28,51 @@ * devices can be enumerated, queried, and opened. Once opened, it will * provide SDL_Surface objects as new frames of video come in. These surfaces * can be uploaded to an SDL_Texture or processed as pixels in memory. + * + * Several platforms will alert the user if an app tries to access a camera, + * and some will present a UI asking the user if your application should be + * allowed to obtain images at all, which they can deny. A successfully opened + * camera will not provide images until permission is granted. Applications, + * after opening a camera device, can see if they were granted access by + * either polling with the SDL_GetCameraPermissionState() function, or waiting + * for an SDL_EVENT_CAMERA_DEVICE_APPROVED or SDL_EVENT_CAMERA_DEVICE_DENIED + * event. Platforms that don't have any user approval process will report + * approval immediately. + * + * Note that SDL cameras only provide video as individual frames; they will + * not provide full-motion video encoded in a movie file format, although an + * app is free to encode the acquired frames into any format it likes. It also + * does not provide audio from the camera hardware through this API; not only + * do many webcams not have microphones at all, many people--from streamers to + * people on Zoom calls--will want to use a separate microphone regardless of + * the camera. In any case, recorded audio will be available through SDL's + * audio API no matter what hardware provides the microphone. + * + * ## Camera gotchas + * + * Consumer-level camera hardware tends to take a little while to warm up, + * once the device has been opened. Generally most camera apps have some sort + * of UI to take a picture (a button to snap a pic while a preview is showing, + * some sort of multi-second countdown for the user to pose, like a photo + * booth), which puts control in the users' hands, or they are intended to + * stay on for long times (Pokemon Go, etc). + * + * It's not uncommon that a newly-opened camera will provide a couple of + * completely black frames, maybe followed by some under-exposed images. If + * taking a single frame automatically, or recording video from a camera's + * input without the user initiating it from a preview, it could be wise to + * drop the first several frames (if not the first several _seconds_ worth of + * frames!) before using images from a camera. */ #ifndef SDL_camera_h_ #define SDL_camera_h_ +#include #include -#include +#include +#include +#include #include /* Set up for C function definitions, even when using C++ */ @@ -50,7 +88,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetCameras */ @@ -59,7 +97,7 @@ typedef Uint32 SDL_CameraID; /** * The opaque structure used to identify an opened SDL camera. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Camera SDL_Camera; @@ -69,7 +107,7 @@ typedef struct SDL_Camera SDL_Camera; * Cameras often support multiple formats; each one will be encapsulated in * this struct. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetCameraSupportedFormats * \sa SDL_GetCameraFormat @@ -87,7 +125,7 @@ typedef struct SDL_CameraSpec /** * The position of camera in relation to system device. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetCameraPosition */ @@ -116,7 +154,7 @@ typedef enum SDL_CameraPosition * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameraDriver */ @@ -140,7 +178,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumCameraDrivers(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumCameraDrivers */ @@ -158,7 +196,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraDriver(int index); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void); @@ -173,7 +211,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera */ @@ -211,7 +249,7 @@ extern SDL_DECLSPEC SDL_CameraID * SDLCALL SDL_GetCameras(int *count); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras * \sa SDL_OpenCamera @@ -227,7 +265,7 @@ extern SDL_DECLSPEC SDL_CameraSpec ** SDLCALL SDL_GetCameraSupportedFormats(SDL_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras */ @@ -246,7 +284,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraName(SDL_CameraID instance * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras */ @@ -265,7 +303,7 @@ extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraI * * You can call SDL_GetCameraFormat() to get the actual data format if passing * a NULL spec here. You can see the exact specs a device can support without - * conversion with SDL_GetCameraSupportedSpecs(). + * conversion with SDL_GetCameraSupportedFormats(). * * SDL will not attempt to emulate framerate; it will try to set the hardware * to the rate closest to the requested speed, but it won't attempt to limit @@ -278,10 +316,11 @@ extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraI * the camera, and they can choose Yes or No at that point. Until they do, the * camera will not be usable. The app should either wait for an * SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, - * or poll SDL_IsCameraApproved() occasionally until it returns non-zero. On - * platforms that don't require explicit user approval (and perhaps in places - * where the user previously permitted access), the approval event might come - * immediately, but it might come seconds, minutes, or hours later! + * or poll SDL_GetCameraPermissionState() occasionally until it returns + * non-zero. On platforms that don't require explicit user approval (and + * perhaps in places where the user previously permitted access), the approval + * event might come immediately, but it might come seconds, minutes, or hours + * later! * * \param instance_id the camera device instance ID. * \param spec the desired format for data the device will provide. Can be @@ -291,7 +330,7 @@ extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraI * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras * \sa SDL_GetCameraFormat @@ -324,7 +363,7 @@ extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera * \sa SDL_CloseCamera @@ -340,7 +379,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera */ @@ -355,7 +394,7 @@ extern SDL_DECLSPEC SDL_CameraID SDLCALL SDL_GetCameraID(SDL_Camera *camera); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera *camera); @@ -366,23 +405,24 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera * be converting to this format behind the scenes. * * If the system is waiting for the user to approve access to the camera, as - * some platforms require, this will return SDL_FALSE, but this isn't - * necessarily a fatal error; you should either wait for an + * some platforms require, this will return false, but this isn't necessarily + * a fatal error; you should either wait for an * SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, - * or poll SDL_IsCameraApproved() occasionally until it returns non-zero. + * or poll SDL_GetCameraPermissionState() occasionally until it returns + * non-zero. * * \param camera opened camera device. * \param spec the SDL_CameraSpec to be initialized by this function. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL_CameraSpec *spec); +extern SDL_DECLSPEC bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL_CameraSpec *spec); /** * Acquire a frame. @@ -404,14 +444,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL * After use, the frame should be released with SDL_ReleaseCameraFrame(). If * you don't do this, the system may stop providing more video! * - * Do not call SDL_FreeSurface() on the returned surface! It must be given + * Do not call SDL_DestroySurface() on the returned surface! It must be given * back to the camera subsystem with SDL_ReleaseCameraFrame! * * If the system is waiting for the user to approve access to the camera, as * some platforms require, this will return NULL (no frames available); you * should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or - * SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll SDL_IsCameraApproved() - * occasionally until it returns non-zero. + * SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll + * SDL_GetCameraPermissionState() occasionally until it returns non-zero. * * \param camera opened camera device. * \param timestampNS a pointer filled in with the frame's timestamp, or 0 on @@ -421,7 +461,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ReleaseCameraFrame */ @@ -449,7 +489,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_AcquireCameraFrame(SDL_Camera *cam * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AcquireCameraFrame */ @@ -464,9 +504,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseCameraFrame(SDL_Camera *camera, SDL_ * \threadsafety It is safe to call this function from any thread, but no * thread may reference `device` once this function is called. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_OpenCameraWithSpec * \sa SDL_OpenCamera */ extern SDL_DECLSPEC void SDLCALL SDL_CloseCamera(SDL_Camera *camera); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_clipboard.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_clipboard.h index 4d4ae32..0d3cbb4 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_clipboard.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_clipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -26,6 +26,51 @@ * from other processes and publishing information of its own. * * This is not just text! SDL apps can access and publish data by mimetype. + * + * ## Basic use (text) + * + * Obtaining and publishing simple text to the system clipboard is as easy as + * calling SDL_GetClipboardText() and SDL_SetClipboardText(), respectively. + * These deal with C strings in UTF-8 encoding. Data transmission and encoding + * conversion is completely managed by SDL. + * + * ## Clipboard callbacks (data other than text) + * + * Things get more complicated when the clipboard contains something other + * than text. Not only can the system clipboard contain data of any type, in + * some cases it can contain the same data in different formats! For example, + * an image painting app might let the user copy a graphic to the clipboard, + * and offers it in .BMP, .JPG, or .PNG format for other apps to consume. + * + * Obtaining clipboard data ("pasting") like this is a matter of calling + * SDL_GetClipboardData() and telling it the mimetype of the data you want. + * But how does one know if that format is available? SDL_HasClipboardData() + * can report if a specific mimetype is offered, and + * SDL_GetClipboardMimeTypes() can provide the entire list of mimetypes + * available, so the app can decide what to do with the data and what formats + * it can support. + * + * Setting the clipboard ("copying") to arbitrary data is done with + * SDL_SetClipboardData. The app does not provide the data in this call, but + * rather the mimetypes it is willing to provide and a callback function. + * During the callback, the app will generate the data. This allows massive + * data sets to be provided to the clipboard, without any data being copied + * before it is explicitly requested. More specifically, it allows an app to + * offer data in multiple formats without providing a copy of all of them + * upfront. If the app has an image that it could provide in PNG or JPG + * format, it doesn't have to encode it to either of those unless and until + * something tries to paste it. + * + * ## Primary Selection + * + * The X11 and Wayland video targets have a concept of the "primary selection" + * in addition to the usual clipboard. This is generally highlighted (but not + * explicitly copied) text from various apps. SDL offers APIs for this through + * SDL_GetPrimarySelectionText() and SDL_SetPrimarySelectionText(). SDL offers + * these APIs on platforms without this concept, too, but only so far that it + * will keep a copy of a string that the app sets for later retrieval; the + * operating system will not ever attempt to change the string externally if + * it doesn't support a primary selection. */ #ifndef SDL_clipboard_h_ @@ -46,27 +91,31 @@ extern "C" { * Put UTF-8 text into the clipboard. * * \param text the text to store in the clipboard. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetClipboardText * \sa SDL_HasClipboardText */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetClipboardText(const char *text); +extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardText(const char *text); /** * Get UTF-8 text from the clipboard. * - * This functions returns empty string if there was not enough memory left for - * a copy of the clipboard's content. + * This functions returns an 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. This should be freed with * SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasClipboardText * \sa SDL_SetClipboardText @@ -76,40 +125,46 @@ extern SDL_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. + * \returns true if the clipboard has text, or false if it does not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetClipboardText * \sa SDL_SetClipboardText */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasClipboardText(void); /** * Put UTF-8 text into the primary selection. * * \param text the text to store in the primary selection. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPrimarySelectionText * \sa SDL_HasPrimarySelectionText */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPrimarySelectionText(const char *text); +extern SDL_DECLSPEC bool SDLCALL SDL_SetPrimarySelectionText(const char *text); /** * Get UTF-8 text from the primary selection. * - * This functions returns empty string if there was not enough memory left for - * a copy of the primary selection's content. + * This functions returns an 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. This should be * freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasPrimarySelectionText * \sa SDL_SetPrimarySelectionText @@ -120,15 +175,16 @@ extern SDL_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. + * \returns true if the primary selection has text, or false if it does not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPrimarySelectionText * \sa SDL_SetPrimarySelectionText */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasPrimarySelectionText(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasPrimarySelectionText(void); /** * Callback function that will be called when data for the specified mime-type @@ -148,7 +204,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasPrimarySelectionText(void); * breakage in receiving applications. The returned data will not be * freed so it needs to be retained and dealt with internally. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData */ @@ -160,7 +216,7 @@ typedef const void *(SDLCALL *SDL_ClipboardDataCallback)(void *userdata, const c * * \param userdata a pointer to provided user data. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData */ @@ -170,13 +226,13 @@ typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata); * Offer clipboard data to the OS. * * Tell the operating system that the application is offering clipboard data - * for each of the proivded mime-types. Once another application requests the - * data the callback function will be called allowing it to generate and + * for each of the provided mime-types. Once another application requests the + * data the callback function will be called, allowing it to generate and * respond with the data for the requested mime-type. * * The size of text data does not include any terminator, and the text does * not need to be null terminated (e.g. you can directly copy a portion of a - * document) + * document). * * \param callback a function pointer to the function that provides the * clipboard data. @@ -185,28 +241,32 @@ typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata); * \param userdata an opaque pointer that will be forwarded to the callbacks. * \param mime_types a list of mime-types that are being offered. * \param num_mime_types the number of mime-types in the mime_types list. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearClipboardData * \sa SDL_GetClipboardData * \sa SDL_HasClipboardData */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetClipboardData(SDL_ClipboardDataCallback callback, SDL_ClipboardCleanupCallback cleanup, void *userdata, const char **mime_types, size_t num_mime_types); +extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardData(SDL_ClipboardDataCallback callback, SDL_ClipboardCleanupCallback cleanup, void *userdata, const char **mime_types, size_t num_mime_types); /** * Clear the clipboard data. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearClipboardData(void); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearClipboardData(void); /** * Get the data from clipboard for a given mime type. @@ -220,7 +280,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearClipboardData(void); * for more information. This should be freed with SDL_free() when it * is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasClipboardData * \sa SDL_SetClipboardData @@ -231,15 +293,34 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetClipboardData(const char *mime_type, s * Query whether there is data in the clipboard for the provided mime type. * * \param mime_type the mime type to check for data for. - * \returns SDL_TRUE if there exists data in clipboard for the provided mime - * type, SDL_FALSE if it does not. + * \returns true if there exists data in clipboard for the provided mime type, + * false if it does not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData * \sa SDL_GetClipboardData */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasClipboardData(const char *mime_type); +extern SDL_DECLSPEC bool SDLCALL SDL_HasClipboardData(const char *mime_type); + +/** + * Retrieve the list of mime types available in the clipboard. + * + * \param num_mime_types a pointer filled with the number of mime types, may + * be NULL. + * \returns a null terminated array of strings with mime types, or NULL on + * failure; call SDL_GetError() for more information. This should be + * freed with SDL_free() when it is no longer needed. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetClipboardData + */ +extern SDL_DECLSPEC char ** SDLCALL SDL_GetClipboardMimeTypes(size_t *num_mime_types); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_close_code.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_close_code.h index fa4d3d1..da1dea7 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_close_code.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_close_code.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -21,7 +21,10 @@ /* * This file reverses the effects of SDL_begin_code.h and should be included - * after you finish any function and structure declarations in your headers + * after you finish any function and structure declarations in your headers. + * + * SDL's headers use this; applications generally should not include this + * header directly. */ #ifndef SDL_begin_code_h diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_copying.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_copying.h index dcbdcea..747bd35 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_copying.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_copying.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_cpuinfo.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_cpuinfo.h index e7ced26..1745bd9 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_cpuinfo.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_cpuinfo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -29,6 +29,12 @@ * These functions are largely concerned with reporting if the system has * access to various SIMD instruction sets, but also has other important info * to share, such as system RAM size and number of logical CPU cores. + * + * CPU instruction set checks, like SDL_HasSSE() and SDL_HasNEON(), are + * available on all platforms, even if they don't make sense (an ARM processor + * will never have SSE and an x86 processor will never have NEON, for example, + * but these functions still exist and will simply return false in these + * cases). */ #ifndef SDL_cpuinfo_h_ @@ -49,20 +55,22 @@ extern "C" { * processors have a 128 byte cache line. We use the larger value to be * generally safe. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_CACHELINE_SIZE 128 /** - * Get the number of CPU cores available. + * Get the number of logical 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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCount(void); +extern SDL_DECLSPEC int SDLCALL SDL_GetNumLogicalCPUCores(void); /** * Determine the L1 cache line size of the CPU. @@ -72,7 +80,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCount(void); * * \returns the L1 cache line size of the CPU, in bytes. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); @@ -82,144 +92,164 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); * 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. + * \returns true if the CPU has AltiVec features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has MMX features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasMMX(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. + * \returns true if the CPU has SSE features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE2 * \sa SDL_HasSSE3 * \sa SDL_HasSSE41 * \sa SDL_HasSSE42 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has SSE2 features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE3 * \sa SDL_HasSSE41 * \sa SDL_HasSSE42 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has SSE3 features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE2 * \sa SDL_HasSSE41 * \sa SDL_HasSSE42 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has SSE4.1 features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE2 * \sa SDL_HasSSE3 * \sa SDL_HasSSE42 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has SSE4.2 features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE2 * \sa SDL_HasSSE3 * \sa SDL_HasSSE41 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has AVX features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasAVX2 * \sa SDL_HasAVX512F */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has AVX2 features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasAVX * \sa SDL_HasAVX512F */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has AVX-512F features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasAVX * \sa SDL_HasAVX2 */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX512F(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasAVX512F(void); /** * Determine whether the CPU has ARM SIMD (ARMv6) features. @@ -228,24 +258,28 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX512F(void); * * 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. + * \returns true if the CPU has ARM SIMD features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasNEON */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasARMSIMD(void); +extern SDL_DECLSPEC 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. + * \returns true if the CPU has ARM NEON features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasNEON(void); /** * Determine whether the CPU has LSX (LOONGARCH SIMD) features. @@ -253,12 +287,13 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void); * 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. + * \returns true if the CPU has LOONGARCH LSX features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasLSX(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasLSX(void); /** * Determine whether the CPU has LASX (LOONGARCH SIMD) features. @@ -266,19 +301,22 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasLSX(void); * 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. + * \returns true if the CPU has LOONGARCH LASX features or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasLASX(void); +extern SDL_DECLSPEC 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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSystemRAM(void); @@ -297,7 +335,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetSystemRAM(void); * \returns the alignment in bytes needed for available, known SIMD * instructions. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_aligned_alloc * \sa SDL_aligned_free diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_dialog.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_dialog.h index 8a198a8..460038f 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_dialog.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_dialog.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,12 +23,23 @@ * # CategoryDialog * * File dialog support. + * + * SDL offers file dialogs, to let users select files with native GUI + * interfaces. There are "open" dialogs, "save" dialogs, and folder selection + * dialogs. The app can control some details, such as filtering to specific + * files, or whether multiple files can be selected by the user. + * + * Note that launching a file dialog is a non-blocking operation; control + * returns to the app immediately, and a callback is called later (possibly in + * another thread) when the user makes a choice. */ #ifndef SDL_dialog_h_ #define SDL_dialog_h_ +#include #include +#include #include #include @@ -48,12 +59,13 @@ extern "C" { * hyphens, underscores and periods. Alternatively, the whole string can be a * single asterisk ("*"), which serves as an "All files" filter. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_ShowOpenFileDialog * \sa SDL_ShowSaveFileDialog * \sa SDL_ShowOpenFolderDialog + * \sa SDL_ShowFileDialogWithProperties */ typedef struct SDL_DialogFileFilter { @@ -75,31 +87,34 @@ typedef struct SDL_DialogFileFilter * is a null-terminated list of pointers to C strings, each containing a * path. * - * The filelist argument does not need to be freed; it will automatically be - * freed when the callback returns. + * The filelist argument should not be freed; it will automatically be freed + * when the callback returns. * * The filter argument is the index of the filter that was selected, or -1 if * no filter was selected or if the platform or method doesn't support * fetching the selected filter. * + * In Android, the `filelist` are `content://` URIs. They should be opened + * using SDL_IOFromFile() with appropriate modes. This applies both to open + * and save file dialog. + * * \param userdata an app-provided pointer, for the callback's use. * \param filelist the file(s) chosen by the user. * \param filter index of the selected filter. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_DialogFileFilter * \sa SDL_ShowOpenFileDialog * \sa SDL_ShowSaveFileDialog * \sa SDL_ShowOpenFolderDialog + * \sa SDL_ShowFileDialogWithProperties */ typedef void (SDLCALL *SDL_DialogFileCallback)(void *userdata, const char * const *filelist, int filter); /** * Displays a dialog that lets the user select a file on their filesystem. * - * This function should only be invoked from the main thread. - * * This is an asynchronous function; it will return immediately, and the * result will be passed to the callback. * @@ -117,47 +132,41 @@ typedef void (SDLCALL *SDL_DialogFileCallback)(void *userdata, const char * cons * requires an event-handling loop. Apps that do not use SDL to handle events * should add a call to SDL_PumpEvents in their main loop. * - * \param callback an SDL_DialogFileCallback to be invoked when the user - * selects a file and accepts, or cancels the dialog, or an - * error occurs. The first argument is a null-terminated list - * of C strings, representing the paths chosen by the user. - * The list will be empty if the user canceled the dialog, and - * it will be NULL if an error occurred. If an error occurred, - * it can be fetched with SDL_GetError(). The second argument - * is the userdata pointer passed to the function. The third - * argument is the index of the filter selected by the user, - * or one past the index of the last filter (therefore the - * index of the terminating NULL filter) if no filter was - * chosen, or -1 if the platform does not support detecting - * the selected filter. + * \param callback a function pointer to be invoked when the user selects a + * file and accepts, or cancels the dialog, or an error + * occurs. * \param userdata an optional pointer to pass extra data to the callback when * it will be invoked. - * \param window the window that the dialog should be modal for. May be NULL. + * \param window the window that the dialog should be modal for, may be NULL. * Not all platforms support this option. - * \param filters a list of SDL_DialogFileFilter's. May be NULL. Not all - * platforms support this option, and platforms that do support - * it may allow the user to ignore the filters. + * \param filters a list of filters, may be NULL. Not all platforms support + * this option, and platforms that do support it may allow the + * user to ignore the filters. If non-NULL, it must remain + * valid at least until the callback is invoked. * \param nfilters the number of filters. Ignored if filters is NULL. - * \param default_location the default folder or file to start the dialog at. - * May be NULL. Not all platforms support this option. + * \param default_location the default folder or file to start the dialog at, + * may be NULL. Not all platforms support this option. * \param allow_many if non-zero, the user will be allowed to select multiple * entries. Not all platforms support this option. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should be called only from the main thread. The + * callback may be invoked from the same thread or from a + * different one, depending on the OS's constraints. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_DialogFileFilter * \sa SDL_ShowSaveFileDialog * \sa SDL_ShowOpenFolderDialog + * \sa SDL_ShowFileDialogWithProperties */ -extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location, SDL_bool allow_many); +extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location, bool allow_many); /** * Displays a dialog that lets the user choose a new or existing file on their * filesystem. * - * This function should only be invoked from the main thread. - * * This is an asynchronous function; it will return immediately, and the * result will be passed to the callback. * @@ -174,44 +183,38 @@ extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFileDialog(SDL_DialogFileCallback c * requires an event-handling loop. Apps that do not use SDL to handle events * should add a call to SDL_PumpEvents in their main loop. * - * \param callback an SDL_DialogFileCallback to be invoked when the user - * selects a file and accepts, or cancels the dialog, or an - * error occurs. The first argument is a null-terminated list - * of C strings, representing the paths chosen by the user. - * The list will be empty if the user canceled the dialog, and - * it will be NULL if an error occurred. If an error occurred, - * it can be fetched with SDL_GetError(). The second argument - * is the userdata pointer passed to the function. The third - * argument is the index of the filter selected by the user, - * or one past the index of the last filter (therefore the - * index of the terminating NULL filter) if no filter was - * chosen, or -1 if the platform does not support detecting - * the selected filter. + * \param callback a function pointer to be invoked when the user selects a + * file and accepts, or cancels the dialog, or an error + * occurs. * \param userdata an optional pointer to pass extra data to the callback when * it will be invoked. - * \param window the window that the dialog should be modal for. May be NULL. + * \param window the window that the dialog should be modal for, may be NULL. * Not all platforms support this option. - * \param filters a list of SDL_DialogFileFilter's. May be NULL. Not all - * platforms support this option, and platforms that do support - * it may allow the user to ignore the filters. + * \param filters a list of filters, may be NULL. Not all platforms support + * this option, and platforms that do support it may allow the + * user to ignore the filters. If non-NULL, it must remain + * valid at least until the callback is invoked. * \param nfilters the number of filters. Ignored if filters is NULL. - * \param default_location the default folder or file to start the dialog at. - * May be NULL. Not all platforms support this option. + * \param default_location the default folder or file to start the dialog at, + * may be NULL. Not all platforms support this option. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should be called only from the main thread. The + * callback may be invoked from the same thread or from a + * different one, depending on the OS's constraints. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_DialogFileFilter * \sa SDL_ShowOpenFileDialog * \sa SDL_ShowOpenFolderDialog + * \sa SDL_ShowFileDialogWithProperties */ extern SDL_DECLSPEC void SDLCALL SDL_ShowSaveFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location); /** * Displays a dialog that lets the user select a folder on their filesystem. * - * This function should only be invoked from the main thread. - * * This is an asynchronous function; it will return immediately, and the * result will be passed to the callback. * @@ -229,31 +232,105 @@ extern SDL_DECLSPEC void SDLCALL SDL_ShowSaveFileDialog(SDL_DialogFileCallback c * requires an event-handling loop. Apps that do not use SDL to handle events * should add a call to SDL_PumpEvents in their main loop. * - * \param callback an SDL_DialogFileCallback to be invoked when the user - * selects a file and accepts, or cancels the dialog, or an - * error occurs. The first argument is a null-terminated list - * of C strings, representing the paths chosen by the user. - * The list will be empty if the user canceled the dialog, and - * it will be NULL if an error occurred. If an error occurred, - * it can be fetched with SDL_GetError(). The second argument - * is the userdata pointer passed to the function. The third - * argument is always -1 for SDL_ShowOpenFolderDialog. + * \param callback a function pointer to be invoked when the user selects a + * file and accepts, or cancels the dialog, or an error + * occurs. * \param userdata an optional pointer to pass extra data to the callback when * it will be invoked. - * \param window the window that the dialog should be modal for. May be NULL. + * \param window the window that the dialog should be modal for, may be NULL. * Not all platforms support this option. - * \param default_location the default folder or file to start the dialog at. - * May be NULL. Not all platforms support this option. + * \param default_location the default folder or file to start the dialog at, + * may be NULL. Not all platforms support this option. * \param allow_many if non-zero, the user will be allowed to select multiple * entries. Not all platforms support this option. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should be called only from the main thread. The + * callback may be invoked from the same thread or from a + * different one, depending on the OS's constraints. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_ShowOpenFileDialog * \sa SDL_ShowSaveFileDialog + * \sa SDL_ShowFileDialogWithProperties */ -extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFolderDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const char *default_location, SDL_bool allow_many); +extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFolderDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const char *default_location, bool allow_many); + +/** + * Various types of file dialogs. + * + * This is used by SDL_ShowFileDialogWithProperties() to decide what kind of + * dialog to present to the user. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_ShowFileDialogWithProperties + */ +typedef enum SDL_FileDialogType +{ + SDL_FILEDIALOG_OPENFILE, + SDL_FILEDIALOG_SAVEFILE, + SDL_FILEDIALOG_OPENFOLDER +} SDL_FileDialogType; + +/** + * Create and launch a file dialog with the specified properties. + * + * These are the supported properties: + * + * - `SDL_PROP_FILE_DIALOG_FILTERS_POINTER`: a pointer to a list of + * SDL_DialogFileFilter structs, which will be used as filters for + * file-based selections. Ignored if the dialog is an "Open Folder" dialog. + * If non-NULL, the array of filters must remain valid at least until the + * callback is invoked. + * - `SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER`: the number of filters in the + * array of filters, if it exists. + * - `SDL_PROP_FILE_DIALOG_WINDOW_POINTER`: the window that the dialog should + * be modal for. + * - `SDL_PROP_FILE_DIALOG_LOCATION_STRING`: the default folder or file to + * start the dialog at. + * - `SDL_PROP_FILE_DIALOG_MANY_BOOLEAN`: true to allow the user to select + * more than one entry. + * - `SDL_PROP_FILE_DIALOG_TITLE_STRING`: the title for the dialog. + * - `SDL_PROP_FILE_DIALOG_ACCEPT_STRING`: the label that the accept button + * should have. + * - `SDL_PROP_FILE_DIALOG_CANCEL_STRING`: the label that the cancel button + * should have. + * + * Note that each platform may or may not support any of the properties. + * + * \param type the type of file dialog. + * \param callback a function pointer to be invoked when the user selects a + * file and accepts, or cancels the dialog, or an error + * occurs. + * \param userdata an optional pointer to pass extra data to the callback when + * it will be invoked. + * \param props the properties to use. + * + * \threadsafety This function should be called only from the main thread. The + * callback may be invoked from the same thread or from a + * different one, depending on the OS's constraints. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_FileDialogType + * \sa SDL_DialogFileCallback + * \sa SDL_DialogFileFilter + * \sa SDL_ShowOpenFileDialog + * \sa SDL_ShowSaveFileDialog + * \sa SDL_ShowOpenFolderDialog + */ +extern SDL_DECLSPEC void SDLCALL SDL_ShowFileDialogWithProperties(SDL_FileDialogType type, SDL_DialogFileCallback callback, void *userdata, SDL_PropertiesID props); + +#define SDL_PROP_FILE_DIALOG_FILTERS_POINTER "SDL.filedialog.filters" +#define SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER "SDL.filedialog.nfilters" +#define SDL_PROP_FILE_DIALOG_WINDOW_POINTER "SDL.filedialog.window" +#define SDL_PROP_FILE_DIALOG_LOCATION_STRING "SDL.filedialog.location" +#define SDL_PROP_FILE_DIALOG_MANY_BOOLEAN "SDL.filedialog.many" +#define SDL_PROP_FILE_DIALOG_TITLE_STRING "SDL.filedialog.title" +#define SDL_PROP_FILE_DIALOG_ACCEPT_STRING "SDL.filedialog.accept" +#define SDL_PROP_FILE_DIALOG_CANCEL_STRING "SDL.filedialog.cancel" /* Ends C function definitions when using C++ */ #ifdef __cplusplus @@ -261,4 +338,4 @@ extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFolderDialog(SDL_DialogFileCallback #endif #include -#endif /* SDL_joystick_h_ */ +#endif /* SDL_dialog_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_egl.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_egl.h index cc557d6..65d4e96 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_egl.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_egl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_endian.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_endian.h index cb3d7f3..a34e9d4 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_endian.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_endian.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,20 @@ /** * # CategoryEndian * - * Functions for reading and writing endian-specific values. + * Functions converting endian-specific values to different byte orders. + * + * These functions either unconditionally swap byte order (SDL_Swap16, + * SDL_Swap32, SDL_Swap64, SDL_SwapFloat), or they swap to/from the system's + * native byte order (SDL_Swap16LE, SDL_Swap16BE, SDL_Swap32LE, SDL_Swap32BE, + * SDL_Swap32LE, SDL_Swap32BE, SDL_SwapFloatLE, SDL_SwapFloatBE). In the + * latter case, the functionality is provided by macros that become no-ops if + * a swap isn't necessary: on an x86 (littleendian) processor, SDL_Swap32LE + * does nothing, but SDL_Swap32BE reverses the bytes of the data. On a PowerPC + * processor (bigendian), the macros behavior is reversed. + * + * The swap routines are inline functions, and attempt to use compiler + * intrinsics, inline assembly, and other magic to make byteswapping + * efficient. */ #ifndef SDL_endian_h_ @@ -51,12 +64,71 @@ _m_prefetch(void *__P) * \name The two types of endianness */ /* @{ */ + + +/** + * A value to represent littleendian byteorder. + * + * This is used with the preprocessor macro SDL_BYTEORDER, to determine a + * platform's byte ordering: + * + * ```c + * #if SDL_BYTEORDER == SDL_LIL_ENDIAN + * SDL_Log("This system is littleendian."); + * #endif + * ``` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_BYTEORDER + * \sa SDL_BIG_ENDIAN + */ #define SDL_LIL_ENDIAN 1234 + +/** + * A value to represent bigendian byteorder. + * + * This is used with the preprocessor macro SDL_BYTEORDER, to determine a + * platform's byte ordering: + * + * ```c + * #if SDL_BYTEORDER == SDL_BIG_ENDIAN + * SDL_Log("This system is bigendian."); + * #endif + * ``` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_BYTEORDER + * \sa SDL_LIL_ENDIAN + */ #define SDL_BIG_ENDIAN 4321 + /* @} */ #ifndef SDL_BYTEORDER -#ifdef SDL_PLATFORM_LINUX +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro that reports the target system's byte order. + * + * This is set to either SDL_LIL_ENDIAN or SDL_BIG_ENDIAN (and maybe other + * values in the future, if something else becomes popular). This can be + * tested with the preprocessor, so decisions can be made at compile time. + * + * ```c + * #if SDL_BYTEORDER == SDL_BIG_ENDIAN + * SDL_Log("This system is bigendian."); + * #endif + * ``` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_LIL_ENDIAN + * \sa SDL_BIG_ENDIAN + */ +#define SDL_BYTEORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN +#elif defined(SDL_PLATFORM_LINUX) #include #define SDL_BYTEORDER __BYTE_ORDER #elif defined(SDL_PLATFORM_SOLARIS) @@ -97,8 +169,29 @@ _m_prefetch(void *__P) #endif /* !SDL_BYTEORDER */ #ifndef SDL_FLOATWORDORDER +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro that reports the target system's floating point word order. + * + * This is set to either SDL_LIL_ENDIAN or SDL_BIG_ENDIAN (and maybe other + * values in the future, if something else becomes popular). This can be + * tested with the preprocessor, so decisions can be made at compile time. + * + * ```c + * #if SDL_FLOATWORDORDER == SDL_BIG_ENDIAN + * SDL_Log("This system's floats are bigendian."); + * #endif + * ``` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_LIL_ENDIAN + * \sa SDL_BIG_ENDIAN + */ +#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN /* predefs from newer gcc versions: */ -#if defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__FLOAT_WORD_ORDER__) +#elif 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__) @@ -125,10 +218,6 @@ _m_prefetch(void *__P) 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)) || \ @@ -148,6 +237,7 @@ extern "C" { #endif /* Byte swap 16-bit integer. */ +#ifndef SDL_WIKI_DOCUMENTATION_SECTION #if HAS_BUILTIN_BSWAP16 #define SDL_Swap16(x) __builtin_bswap16(x) #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL) @@ -191,8 +281,10 @@ SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) return SDL_static_cast(Uint16, ((x << 8) | (x >> 8))); } #endif +#endif /* Byte swap 32-bit integer. */ +#ifndef SDL_WIKI_DOCUMENTATION_SECTION #if HAS_BUILTIN_BSWAP32 #define SDL_Swap32(x) __builtin_bswap32(x) #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL) @@ -239,8 +331,10 @@ SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) ((x >> 8) & 0x0000FF00) | (x >> 24))); } #endif +#endif /* Byte swap 64-bit integer. */ +#ifndef SDL_WIKI_DOCUMENTATION_SECTION #if HAS_BUILTIN_BSWAP64 #define SDL_Swap64(x) __builtin_bswap64(x) #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL) @@ -290,7 +384,7 @@ SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x) return (x); } #endif - +#endif /** * Byte-swap a floating point number. @@ -309,7 +403,7 @@ SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE float SDL_SwapFloat(float x) { @@ -348,7 +442,7 @@ SDL_FORCE_INLINE float SDL_SwapFloat(float x) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { return x_but_byteswapped; } @@ -369,7 +463,7 @@ SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { return x_but_byteswapped; } @@ -390,7 +484,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } @@ -404,7 +498,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in littleendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap16LE(x) SwapOnlyIfNecessary(x) @@ -418,7 +514,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in littleendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap32LE(x) SwapOnlyIfNecessary(x) @@ -432,7 +530,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in littleendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap64LE(x) SwapOnlyIfNecessary(x) @@ -446,7 +546,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in littleendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_SwapFloatLE(x) SwapOnlyIfNecessary(x) @@ -460,7 +562,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in bigendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap16BE(x) SwapOnlyIfNecessary(x) @@ -474,7 +578,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in bigendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap32BE(x) SwapOnlyIfNecessary(x) @@ -488,7 +594,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in bigendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap64BE(x) SwapOnlyIfNecessary(x) @@ -502,7 +610,9 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * \param x the value to swap, in bigendian byte order. * \returns `x` in native byte order. * - * \since This macro is available since SDL 3.0.0. + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_SwapFloatBE(x) SwapOnlyIfNecessary(x) diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_error.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_error.h index a98823f..934967c 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_error.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_error.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,26 @@ * # CategoryError * * Simple error message routines for SDL. + * + * Most apps will interface with these APIs in exactly one function: when + * almost any SDL function call reports failure, you can get a human-readable + * string of the problem from SDL_GetError(). + * + * These strings are maintained per-thread, and apps are welcome to set their + * own errors, which is popular when building libraries on top of SDL for + * other apps to consume. These strings are set by calling SDL_SetError(). + * + * A common usage pattern is to have a function that returns true for success + * and false for failure, and do this when something fails: + * + * ```c + * if (something_went_wrong) { + * return SDL_SetError("The thing broke in this specific way: %d", errcode); + * } + * ``` + * + * It's also common to just return `false` in this case if the failing thing + * is known to call SDL_SetError(), so errors simply propagate through. */ #ifndef SDL_error_h_ @@ -44,8 +64,8 @@ extern "C" { * * 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: + * This function always returns false, since SDL frequently uses false to + * signify a failing result, leading to this idiom: * * ```c * if (error_code) { @@ -56,25 +76,49 @@ extern "C" { * \param fmt a printf()-style message format string. * \param ... additional parameters matching % tokens in the `fmt` string, if * any. - * \returns SDL_FALSE. + * \returns false. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearError * \sa SDL_GetError + * \sa SDL_SetErrorV */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); +extern SDL_DECLSPEC bool SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); + +/** + * Set the SDL error message for the current thread. + * + * Calling this function will replace any previous error message that was set. + * + * \param fmt a printf()-style message format string. + * \param ap a variable argument list. + * \returns false. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ClearError + * \sa SDL_GetError + * \sa SDL_SetError + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetErrorV(SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(1); /** * Set an error indicating that memory allocation failed. * * This function does not do any memory allocation. * - * \returns SDL_FALSE. + * \returns false. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_OutOfMemory(void); +extern SDL_DECLSPEC bool SDLCALL SDL_OutOfMemory(void); /** * Retrieve a message about the last error that occurred on the current @@ -104,7 +148,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_OutOfMemory(void); * or an empty string if there hasn't been an error message set since * the last call to SDL_ClearError(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearError * \sa SDL_SetError @@ -114,14 +160,16 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetError(void); /** * Clear any previous error message for this thread. * - * \returns SDL_TRUE. + * \returns true. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetError * \sa SDL_SetError */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearError(void); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearError(void); /** * \name Internal error functions @@ -130,8 +178,43 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearError(void); * Private error reporting function - used internally. */ /* @{ */ + +/** + * A macro to standardize error reporting on unsupported operations. + * + * This simply calls SDL_SetError() with a standardized error string, for + * convenience, consistency, and clarity. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_Unsupported() SDL_SetError("That operation is not supported") + +/** + * A macro to standardize error reporting on unsupported operations. + * + * This simply calls SDL_SetError() with a standardized error string, for + * convenience, consistency, and clarity. + * + * A common usage pattern inside SDL is this: + * + * ```c + * bool MyFunction(const char *str) { + * if (!str) { + * return SDL_InvalidParamError("str"); // returns false. + * } + * DoSomething(str); + * return true; + * } + * ``` + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_InvalidParamError(param) SDL_SetError("Parameter '%s' is invalid", (param)) + /* @} *//* Internal error functions */ /* Ends C function definitions when using C++ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_events.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_events.h index fbe2bb0..1323e9f 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_events.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_events.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,22 +23,50 @@ * # CategoryEvents * * Event queue management. + * + * It's extremely common--often required--that an app deal with SDL's event + * queue. Almost all useful information about interactions with the real world + * flow through here: the user interacting with the computer and app, hardware + * coming and going, the system changing in some way, etc. + * + * An app generally takes a moment, perhaps at the start of a new frame, to + * examine any events that have occured since the last time and process or + * ignore them. This is generally done by calling SDL_PollEvent() in a loop + * until it returns false (or, if using the main callbacks, events are + * provided one at a time in calls to SDL_AppEvent() before the next call to + * SDL_AppIterate(); in this scenario, the app does not call SDL_PollEvent() + * at all). + * + * There is other forms of control, too: SDL_PeepEvents() has more + * functionality at the cost of more complexity, and SDL_WaitEvent() can block + * the process until something interesting happens, which might be beneficial + * for certain types of programs on low-power hardware. One may also call + * SDL_AddEventWatch() to set a callback when new events arrive. + * + * The app is free to generate their own events, too: SDL_PushEvent allows the + * app to put events onto the queue for later retrieval; SDL_RegisterEvents + * can guarantee that these events have a type that isn't in use by other + * parts of the system. */ #ifndef SDL_events_h_ #define SDL_events_h_ +#include #include +#include #include #include #include #include +#include #include #include -#include +#include +#include +#include #include #include -#include #include /* Set up for C function definitions, even when using C++ */ @@ -48,29 +76,10 @@ extern "C" { /* General keyboard/mouse/pen state definitions */ -/** - * A value that signifies a button is no longer pressed. - * - * \since This macro is available since SDL 3.0.0. - * - * \sa SDL_PRESSED - */ -#define SDL_RELEASED 0 - -/** - * A value that signifies a button has been pressed down. - * - * \since This macro is available since SDL 3.0.0. - * - * \sa SDL_RELEASED - */ -#define SDL_PRESSED 1 - - /** * The types of events that can be delivered. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_EventType { @@ -148,7 +157,7 @@ typedef enum SDL_EventType SDL_EVENT_WINDOW_ENTER_FULLSCREEN, /**< The window has entered fullscreen mode */ SDL_EVENT_WINDOW_LEAVE_FULLSCREEN, /**< The window has left fullscreen mode */ SDL_EVENT_WINDOW_DESTROYED, /**< The window with the associated ID is being or has been destroyed. If this message is being handled - in an event watcher, the window handle is still valid and can still be used to retrieve any userdata + in an event watcher, the window handle is still valid and can still be used to retrieve any properties associated with the window. Otherwise, the handle has already been destroyed and all resources associated with it are invalid */ SDL_EVENT_WINDOW_HDR_STATE_CHANGED, /**< Window HDR properties have changed */ @@ -203,6 +212,7 @@ typedef enum SDL_EventType SDL_EVENT_FINGER_DOWN = 0x700, SDL_EVENT_FINGER_UP, SDL_EVENT_FINGER_MOTION, + SDL_EVENT_FINGER_CANCELED, /* 0x800, 0x801, and 0x802 were the Gesture events from SDL2. Do not reuse these values! sdl2-compat needs them! */ @@ -243,6 +253,13 @@ typedef enum SDL_EventType /* Render events */ SDL_EVENT_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset and their contents need to be updated */ SDL_EVENT_RENDER_DEVICE_RESET, /**< The device has been reset and all textures need to be recreated */ + SDL_EVENT_RENDER_DEVICE_LOST, /**< The device has been lost and can't be recovered. */ + + /* Reserved events for private platforms */ + SDL_EVENT_PRIVATE0 = 0x4000, + SDL_EVENT_PRIVATE1, + SDL_EVENT_PRIVATE2, + SDL_EVENT_PRIVATE3, /* Internal events */ SDL_EVENT_POLL_SENTINEL = 0x7F00, /**< Signals the end of an event poll cycle */ @@ -265,7 +282,7 @@ typedef enum SDL_EventType /** * Fields shared by every event * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_CommonEvent { @@ -277,7 +294,7 @@ typedef struct SDL_CommonEvent /** * Display state change event data (event.display.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_DisplayEvent { @@ -292,7 +309,7 @@ typedef struct SDL_DisplayEvent /** * Window state change event data (event.window.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_WindowEvent { @@ -307,7 +324,7 @@ typedef struct SDL_WindowEvent /** * Keyboard device event structure (event.kdevice.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_KeyboardDeviceEvent { @@ -326,7 +343,7 @@ typedef struct SDL_KeyboardDeviceEvent * event scancode and modifiers directly from the keyboard layout, bypassing * SDL_HINT_KEYCODE_OPTIONS, by calling SDL_GetKeyFromScancode(). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetKeyFromScancode * \sa SDL_HINT_KEYCODE_OPTIONS @@ -342,8 +359,8 @@ typedef struct SDL_KeyboardEvent SDL_Keycode key; /**< SDL virtual key code */ SDL_Keymod mod; /**< current key modifiers */ Uint16 raw; /**< The platform dependent scancode for this event */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ - Uint8 repeat; /**< Non-zero if this is a key repeat */ + bool down; /**< true if the key is pressed */ + bool repeat; /**< true if this is a key repeat */ } SDL_KeyboardEvent; /** @@ -353,7 +370,7 @@ typedef struct SDL_KeyboardEvent * will be inserted into the editing text. The length is the number of UTF-8 * characters that will be replaced by new typing. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_TextEditingEvent { @@ -369,7 +386,7 @@ typedef struct SDL_TextEditingEvent /** * Keyboard IME candidates event structure (event.edit_candidates.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_TextEditingCandidatesEvent { @@ -380,7 +397,10 @@ typedef struct SDL_TextEditingCandidatesEvent const char * const *candidates; /**< The list of candidates, or NULL if there are no candidates available */ Sint32 num_candidates; /**< The number of strings in `candidates` */ Sint32 selected_candidate; /**< The index of the selected candidate, or -1 if no candidate is selected */ - SDL_bool horizontal; /**< SDL_TRUE if the list is horizontal, SDL_FALSE if it's vertical */ + bool horizontal; /**< true if the list is horizontal, false if it's vertical */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; } SDL_TextEditingCandidatesEvent; /** @@ -389,7 +409,7 @@ typedef struct SDL_TextEditingCandidatesEvent * This event will never be delivered unless text input is enabled by calling * SDL_StartTextInput(). Text input is disabled by default! * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_StartTextInput * \sa SDL_StopTextInput @@ -406,7 +426,7 @@ typedef struct SDL_TextInputEvent /** * Mouse device event structure (event.mdevice.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseDeviceEvent { @@ -419,7 +439,7 @@ typedef struct SDL_MouseDeviceEvent /** * Mouse motion event structure (event.motion.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseMotionEvent { @@ -427,7 +447,7 @@ typedef struct SDL_MouseMotionEvent Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_WindowID windowID; /**< The window with mouse focus, if any */ - SDL_MouseID which; /**< The mouse instance id or SDL_TOUCH_MOUSEID */ + SDL_MouseID which; /**< The mouse instance id in relative mode, SDL_TOUCH_MOUSEID for touch events, or 0 */ SDL_MouseButtonFlags state; /**< The current button state */ float x; /**< X coordinate, relative to window */ float y; /**< Y coordinate, relative to window */ @@ -438,7 +458,7 @@ typedef struct SDL_MouseMotionEvent /** * Mouse button event structure (event.button.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseButtonEvent { @@ -446,9 +466,9 @@ typedef struct SDL_MouseButtonEvent Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_WindowID windowID; /**< The window with mouse focus, if any */ - SDL_MouseID which; /**< The mouse instance id, SDL_TOUCH_MOUSEID */ + SDL_MouseID which; /**< The mouse instance id in relative mode, SDL_TOUCH_MOUSEID for touch events, or 0 */ Uint8 button; /**< The mouse button index */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + bool down; /**< true if the button is pressed */ Uint8 clicks; /**< 1 for single-click, 2 for double-click, etc. */ Uint8 padding; float x; /**< X coordinate, relative to window */ @@ -458,7 +478,7 @@ typedef struct SDL_MouseButtonEvent /** * Mouse wheel event structure (event.wheel.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseWheelEvent { @@ -466,7 +486,7 @@ typedef struct SDL_MouseWheelEvent Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_WindowID windowID; /**< The window with mouse focus, if any */ - SDL_MouseID which; /**< The mouse instance id, SDL_TOUCH_MOUSEID */ + SDL_MouseID which; /**< The mouse instance id in relative mode or 0 */ float x; /**< The amount scrolled horizontally, positive to the right and negative to the left */ float y; /**< The amount scrolled vertically, positive away from the user and negative toward the user */ SDL_MouseWheelDirection 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 */ @@ -477,7 +497,7 @@ typedef struct SDL_MouseWheelEvent /** * Joystick axis motion event structure (event.jaxis.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyAxisEvent { @@ -496,7 +516,7 @@ typedef struct SDL_JoyAxisEvent /** * Joystick trackball motion event structure (event.jball.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyBallEvent { @@ -515,7 +535,7 @@ typedef struct SDL_JoyBallEvent /** * Joystick hat position change event structure (event.jhat.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyHatEvent { @@ -538,7 +558,7 @@ typedef struct SDL_JoyHatEvent /** * Joystick button event structure (event.jbutton.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyButtonEvent { @@ -547,7 +567,7 @@ typedef struct SDL_JoyButtonEvent Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_JoystickID which; /**< The joystick instance id */ Uint8 button; /**< The joystick button index */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + bool down; /**< true if the button is pressed */ Uint8 padding1; Uint8 padding2; } SDL_JoyButtonEvent; @@ -555,7 +575,12 @@ typedef struct SDL_JoyButtonEvent /** * Joystick device event structure (event.jdevice.*) * - * \since This struct is available since SDL 3.0.0. + * SDL will send JOYSTICK_ADDED events for devices that are already plugged in + * during SDL_Init. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GamepadDeviceEvent */ typedef struct SDL_JoyDeviceEvent { @@ -566,9 +591,9 @@ typedef struct SDL_JoyDeviceEvent } SDL_JoyDeviceEvent; /** - * Joysick battery level change event structure (event.jbattery.*) + * Joystick battery level change event structure (event.jbattery.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyBatteryEvent { @@ -583,7 +608,7 @@ typedef struct SDL_JoyBatteryEvent /** * Gamepad axis motion event structure (event.gaxis.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadAxisEvent { @@ -603,7 +628,7 @@ typedef struct SDL_GamepadAxisEvent /** * Gamepad button event structure (event.gbutton.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadButtonEvent { @@ -612,7 +637,7 @@ typedef struct SDL_GamepadButtonEvent Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_JoystickID which; /**< The joystick instance id */ Uint8 button; /**< The gamepad button (SDL_GamepadButton) */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + bool down; /**< true if the button is pressed */ Uint8 padding1; Uint8 padding2; } SDL_GamepadButtonEvent; @@ -621,7 +646,16 @@ typedef struct SDL_GamepadButtonEvent /** * Gamepad device event structure (event.gdevice.*) * - * \since This struct is available since SDL 3.0.0. + * Joysticks that are supported gamepads receive both an SDL_JoyDeviceEvent + * and an SDL_GamepadDeviceEvent. + * + * SDL will send GAMEPAD_ADDED events for joysticks that are already plugged + * in during SDL_Init() and are recognized as gamepads. It will also send + * events for joysticks that get gamepad mappings at runtime. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_JoyDeviceEvent */ typedef struct SDL_GamepadDeviceEvent { @@ -634,7 +668,7 @@ typedef struct SDL_GamepadDeviceEvent /** * Gamepad touchpad event structure (event.gtouchpad.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadTouchpadEvent { @@ -652,7 +686,7 @@ typedef struct SDL_GamepadTouchpadEvent /** * Gamepad sensor event structure (event.gsensor.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadSensorEvent { @@ -668,7 +702,7 @@ typedef struct SDL_GamepadSensorEvent /** * Audio device event structure (event.adevice.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_AudioDeviceEvent { @@ -676,7 +710,7 @@ typedef struct SDL_AudioDeviceEvent Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_AudioDeviceID which; /**< SDL_AudioDeviceID for the device being added or removed or changing */ - Uint8 recording; /**< zero if a playback device, non-zero if a recording device. */ + bool recording; /**< false if a playback device, true if a recording device. */ Uint8 padding1; Uint8 padding2; Uint8 padding3; @@ -685,7 +719,7 @@ typedef struct SDL_AudioDeviceEvent /** * Camera device event structure (event.cdevice.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_CameraDeviceEvent { @@ -695,14 +729,43 @@ typedef struct SDL_CameraDeviceEvent SDL_CameraID which; /**< SDL_CameraID for the device being added or removed or changing */ } SDL_CameraDeviceEvent; + +/** + * Renderer event structure (event.render.*) + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_RenderEvent +{ + SDL_EventType type; /**< SDL_EVENT_RENDER_TARGETS_RESET, SDL_EVENT_RENDER_DEVICE_RESET, SDL_EVENT_RENDER_DEVICE_LOST */ + Uint32 reserved; + Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ + SDL_WindowID windowID; /**< The window containing the renderer in question. */ +} SDL_RenderEvent; + + /** * Touch finger event structure (event.tfinger.*) * - * \since This struct is available since SDL 3.0.0. + * Coordinates in this event are normalized. `x` and `y` are normalized to a + * range between 0.0f and 1.0f, relative to the window, so (0,0) is the top + * left and (1,1) is the bottom right. Delta coordinates `dx` and `dy` are + * normalized in the ranges of -1.0f (traversed all the way from the bottom or + * right to all the way up or left) to 1.0f (traversed all the way from the + * top or left to all the way down or right). + * + * Note that while the coordinates are _normalized_, they are not _clamped_, + * which means in some circumstances you can get a value outside of this + * range. For example, a renderer using logical presentation might give a + * negative value when the touch is in the letterboxing. Some platforms might + * report a touch outside of the window, which will also be outside of the + * range. + * + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_TouchFingerEvent { - SDL_EventType type; /**< SDL_EVENT_FINGER_MOTION or SDL_EVENT_FINGER_DOWN or SDL_EVENT_FINGER_UP */ + SDL_EventType type; /**< SDL_EVENT_FINGER_DOWN, SDL_EVENT_FINGER_UP, SDL_EVENT_FINGER_MOTION, or SDL_EVENT_FINGER_CANCELED */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_TouchID touchID; /**< The touch device id */ @@ -728,14 +791,14 @@ typedef struct SDL_TouchFingerEvent * is there." The pen touching and lifting off from the tablet while not * leaving the area are handled by SDL_EVENT_PEN_DOWN and SDL_EVENT_PEN_UP. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenProximityEvent { SDL_EventType type; /**< SDL_EVENT_PEN_PROXIMITY_IN or SDL_EVENT_PEN_PROXIMITY_OUT */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ - SDL_WindowID windowID; /**< The window with mouse focus, if any */ + SDL_WindowID windowID; /**< The window with pen focus, if any */ SDL_PenID which; /**< The pen instance id */ } SDL_PenProximityEvent; @@ -748,18 +811,18 @@ typedef struct SDL_PenProximityEvent * `pen_state & SDL_PEN_INPUT_DOWN` to decide if a pen is "drawing" when * dealing with pen motion. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenMotionEvent { SDL_EventType type; /**< SDL_EVENT_PEN_MOTION */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ - SDL_WindowID windowID; /**< The window with mouse focus, if any */ + SDL_WindowID windowID; /**< The window with pen focus, if any */ SDL_PenID which; /**< The pen instance id */ SDL_PenInputFlags pen_state; /**< Complete pen input state at time of event */ - float x; /**< X position of pen on tablet */ - float y; /**< Y position of pen on tablet */ + float x; /**< X coordinate, relative to window */ + float y; /**< Y coordinate, relative to window */ } SDL_PenMotionEvent; /** @@ -768,7 +831,7 @@ typedef struct SDL_PenMotionEvent * These events come when a pen touches a surface (a tablet, etc), or lifts * off from one. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenTouchEvent { @@ -778,10 +841,10 @@ typedef struct SDL_PenTouchEvent SDL_WindowID windowID; /**< The window with pen focus, if any */ SDL_PenID which; /**< The pen instance id */ SDL_PenInputFlags pen_state; /**< Complete pen input state at time of event */ - float x; /**< X position of pen on tablet */ - float y; /**< Y position of pen on tablet */ - Uint8 eraser; /**< Non-zero if eraser end is used (not all pens support this). */ - Uint8 state; /**< SDL_PRESSED (pen is touching) or SDL_RELEASED (pen is lifted off) */ + float x; /**< X coordinate, relative to window */ + float y; /**< Y coordinate, relative to window */ + bool eraser; /**< true if eraser end is used (not all pens support this). */ + bool down; /**< true if the pen is touching or false if the pen is lifted off */ } SDL_PenTouchEvent; /** @@ -790,7 +853,7 @@ typedef struct SDL_PenTouchEvent * This is for buttons on the pen itself that the user might click. The pen * itself pressing down to draw triggers a SDL_EVENT_PEN_DOWN event instead. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenButtonEvent { @@ -800,10 +863,10 @@ typedef struct SDL_PenButtonEvent SDL_WindowID windowID; /**< The window with mouse focus, if any */ SDL_PenID which; /**< The pen instance id */ SDL_PenInputFlags pen_state; /**< Complete pen input state at time of event */ - float x; /**< X position of pen on tablet */ - float y; /**< Y position of pen on tablet */ + float x; /**< X coordinate, relative to window */ + float y; /**< Y coordinate, relative to window */ Uint8 button; /**< The pen button index (first button is 1). */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + bool down; /**< true if the button is pressed */ } SDL_PenButtonEvent; /** @@ -812,7 +875,7 @@ typedef struct SDL_PenButtonEvent * You might get some of these events even if the pen isn't touching the * tablet. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenAxisEvent { @@ -822,8 +885,8 @@ typedef struct SDL_PenAxisEvent SDL_WindowID windowID; /**< The window with pen focus, if any */ SDL_PenID which; /**< The pen instance id */ SDL_PenInputFlags pen_state; /**< Complete pen input state at time of event */ - float x; /**< X position of pen on tablet */ - float y; /**< Y position of pen on tablet */ + float x; /**< X coordinate, relative to window */ + float y; /**< Y coordinate, relative to window */ SDL_PenAxis axis; /**< Axis that has changed */ float value; /**< New value of axis */ } SDL_PenAxisEvent; @@ -832,7 +895,7 @@ typedef struct SDL_PenAxisEvent * An event used to drop text or request a file open by the system * (event.drop.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_DropEvent { @@ -850,19 +913,22 @@ typedef struct SDL_DropEvent * An event triggered when the clipboard contents have changed * (event.clipboard.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_ClipboardEvent { SDL_EventType type; /**< SDL_EVENT_CLIPBOARD_UPDATE */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ + bool owner; /**< are we owning the clipboard (internal update) */ + Sint32 num_mime_types; /**< number of mime types */ + const char **mime_types; /**< current mime types */ } SDL_ClipboardEvent; /** * Sensor event structure (event.sensor.*) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_SensorEvent { @@ -877,7 +943,7 @@ typedef struct SDL_SensorEvent /** * The "quit requested" event * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_QuitEvent { @@ -895,7 +961,7 @@ typedef struct SDL_QuitEvent * the programmer; the only requirement is that '''type''' is a value obtained * from SDL_RegisterEvents(). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_UserEvent { @@ -912,7 +978,10 @@ typedef struct SDL_UserEvent /** * The structure for all events in SDL. * - * \since This struct is available since SDL 3.0.0. + * The SDL_Event structure is the core of all event handling in SDL. SDL_Event + * is a union of all event structures used in SDL. + * + * \since This struct is available since SDL 3.2.0. */ typedef union SDL_Event { @@ -951,6 +1020,7 @@ typedef union SDL_Event SDL_PenMotionEvent pmotion; /**< Pen motion event data */ SDL_PenButtonEvent pbutton; /**< Pen button event data */ SDL_PenAxisEvent paxis; /**< Pen axis event data */ + SDL_RenderEvent render; /**< Render event data */ SDL_DropEvent drop; /**< Drag and drop event data */ SDL_ClipboardEvent clipboard; /**< Clipboard event data */ @@ -981,10 +1051,6 @@ SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NUL * * 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 @@ -993,7 +1059,9 @@ SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NUL * 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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_WaitEvent @@ -1001,11 +1069,17 @@ SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NUL extern SDL_DECLSPEC void SDLCALL SDL_PumpEvents(void); /* @{ */ + +/** + * The type of action to request from SDL_PeepEvents(). + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_EventAction { - SDL_ADDEVENT, - SDL_PEEKEVENT, - SDL_GETEVENT + SDL_ADDEVENT, /**< Add events to the back of the queue. */ + SDL_PEEKEVENT, /**< Check but don't remove events from the queue front. */ + SDL_GETEVENT /**< Retrieve/remove events from the front of the queue. */ } SDL_EventAction; /** @@ -1017,7 +1091,9 @@ typedef enum SDL_EventAction * 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. + * caller and will _not_ be removed from the queue. If you pass NULL for + * `events`, then `numevents` is ignored and the total number of matching + * events will be returned. * - `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. @@ -1026,8 +1102,6 @@ typedef enum SDL_EventAction * 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, may be NULL to * leave the events in the queue and return the number of events * that would have been stored. @@ -1042,7 +1116,9 @@ typedef enum SDL_EventAction * \returns the number of events actually stored or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_PumpEvents @@ -1058,14 +1134,16 @@ extern SDL_DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, * 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. + * \returns true if events matching `type` are present, or false if events + * matching `type` are not present. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasEvents */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type); +extern SDL_DECLSPEC bool SDLCALL SDL_HasEvent(Uint32 type); /** @@ -1077,14 +1155,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type); * 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. + * \returns true if events with type >= `minType` and <= `maxType` are + * present, or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasEvents */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); +extern SDL_DECLSPEC bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); /** * Clear events of a specific type from the event queue. @@ -1106,7 +1186,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxTyp * * \param type the type of event to be cleared; see SDL_EventType for details. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_FlushEvents */ @@ -1131,7 +1213,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type); * \param maxType the high end of event type to be cleared, inclusive; see * SDL_EventType for details. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_FlushEvent */ @@ -1171,16 +1255,17 @@ extern SDL_DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType) * * \param event the SDL_Event structure to be filled with the next event from * the queue, or NULL. - * \returns SDL_TRUE if this got an event or SDL_FALSE if there are none - * available. + * \returns true if this got an event or false if there are none available. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PushEvent * \sa SDL_WaitEvent * \sa SDL_WaitEventTimeout */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PollEvent(SDL_Event *event); +extern SDL_DECLSPEC bool SDLCALL SDL_PollEvent(SDL_Event *event); /** * Wait indefinitely for the next available event. @@ -1193,16 +1278,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PollEvent(SDL_Event *event); * * \param event the SDL_Event structure to be filled in with the next event * from the queue, or NULL. - * \returns SDL_TRUE on success or SDL_FALSE if there was an error while - * waiting for events; call SDL_GetError() for more information. + * \returns true on success or false if there was an error while waiting for + * events; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_PushEvent * \sa SDL_WaitEventTimeout */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEvent(SDL_Event *event); +extern SDL_DECLSPEC bool SDLCALL SDL_WaitEvent(SDL_Event *event); /** * Wait until the specified timeout (in milliseconds) for the next available @@ -1221,16 +1308,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEvent(SDL_Event *event); * from the queue, or NULL. * \param timeoutMS the maximum number of milliseconds to wait for the next * available event. - * \returns SDL_TRUE if this got an event or SDL_FALSE if the timeout elapsed - * without any events available. + * \returns true if this got an event or false if the timeout elapsed without + * any events available. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_PushEvent * \sa SDL_WaitEvent */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEventTimeout(SDL_Event *event, Sint32 timeoutMS); +extern SDL_DECLSPEC bool SDLCALL SDL_WaitEventTimeout(SDL_Event *event, Sint32 timeoutMS); /** * Add an event to the event queue. @@ -1244,8 +1333,6 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEventTimeout(SDL_Event *event, Sint * 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. * @@ -1254,17 +1341,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEventTimeout(SDL_Event *event, Sint * its own custom event types. * * \param event the SDL_Event to be added to the queue. - * \returns SDL_TRUE on success, SDL_FALSE if the event was filtered or on - * failure; call SDL_GetError() for more information. A common reason - * for error is the event queue being full. + * \returns true on success, false if the event was filtered or 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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PeepEvents * \sa SDL_PollEvent * \sa SDL_RegisterEvents */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PushEvent(SDL_Event *event); +extern SDL_DECLSPEC bool SDLCALL SDL_PushEvent(SDL_Event *event); /** * A function pointer used for callbacks that watch the event queue. @@ -1272,29 +1361,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PushEvent(SDL_Event *event); * \param userdata what was passed as `userdata` to SDL_SetEventFilter() or * SDL_AddEventWatch, etc. * \param event the event that triggered the callback. - * \returns SDL_TRUE to permit event to be added to the queue, and SDL_FALSE - * to disallow it. When used with SDL_AddEventWatch, the return value - * is ignored. + * \returns true to permit event to be added to the queue, and false to + * disallow it. When used with SDL_AddEventWatch, the return value is + * ignored. * * \threadsafety SDL may call this callback at any time from any thread; the * application is responsible for locking resources the callback * touches that need to be protected. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetEventFilter * \sa SDL_AddEventWatch */ -typedef SDL_bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); +typedef bool (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. + * Set up a filter to process all events before they are added to the internal + * event queue. * - * If the filter function returns SDL_TRUE when called, then the event will be - * added to the internal queue. If it returns SDL_FALSE, 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. + * If you just want to see events without modifying them or preventing them + * from being queued, you should use SDL_AddEventWatch() instead. + * + * If the filter function returns true when called, then the event will be + * added to the internal queue. If it returns false, 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! @@ -1303,17 +1395,9 @@ typedef SDL_bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); * 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_SetEventEnabled(). * - * 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. @@ -1321,11 +1405,9 @@ typedef SDL_bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); * \param filter an SDL_EventFilter function to call when an event happens. * \param userdata a pointer that is passed to `filter`. * - * \threadsafety SDL may call the filter callback at any time from any thread; - * the application is responsible for locking resources the - * callback touches that need to be protected. + * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch * \sa SDL_SetEventEnabled @@ -1344,13 +1426,15 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter, void * \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. + * \returns true on success or false if there is no event filter set. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetEventFilter */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter *filter, void **userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_GetEventFilter(SDL_EventFilter *filter, void **userdata); /** * Add a callback to be triggered when an event is added to the event queue. @@ -1372,17 +1456,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter *filter, * * \param filter an SDL_EventFilter function to call when an event happens. * \param userdata a pointer that is passed to `filter`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RemoveEventWatch * \sa SDL_SetEventFilter */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, void *userdata); /** * Remove an event watch callback added with SDL_AddEventWatch(). @@ -1393,7 +1477,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, v * \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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch */ @@ -1401,7 +1487,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveEventWatch(SDL_EventFilter filter, vo /** * Run a specific filter function on the current event queue, removing any - * events for which the filter returns SDL_FALSE. + * events for which the filter returns false. * * See SDL_SetEventFilter() for more information. Unlike SDL_SetEventFilter(), * this function does not change the filter permanently, it only uses the @@ -1410,7 +1496,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveEventWatch(SDL_EventFilter filter, vo * \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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetEventFilter * \sa SDL_SetEventFilter @@ -1423,23 +1511,27 @@ extern SDL_DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, void * * \param type the type of event; see SDL_EventType for details. * \param enabled whether to process the event or not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_EventEnabled */ -extern SDL_DECLSPEC void SDLCALL SDL_SetEventEnabled(Uint32 type, SDL_bool enabled); +extern SDL_DECLSPEC void SDLCALL SDL_SetEventEnabled(Uint32 type, bool enabled); /** * Query the state of processing events by type. * * \param type the type of event; see SDL_EventType for details. - * \returns SDL_TRUE if the event is being processed, SDL_FALSE otherwise. + * \returns true if the event is being processed, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetEventEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EventEnabled(Uint32 type); +extern SDL_DECLSPEC bool SDLCALL SDL_EventEnabled(Uint32 type); /** * Allocate a set of user-defined events, and return the beginning event @@ -1449,7 +1541,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EventEnabled(Uint32 type); * \returns the beginning event number, or 0 if numevents is invalid or if * there are not enough user-defined events left. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PushEvent */ @@ -1461,7 +1555,9 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); * \param event an event containing a `windowID`. * \returns the associated window on success or NULL if there is none. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_WaitEvent diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_filesystem.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_filesystem.h index 5faa244..af3ca27 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_filesystem.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_filesystem.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,23 @@ /** * # CategoryFilesystem * - * SDL Filesystem API. + * SDL offers an API for examining and manipulating the system's filesystem. + * This covers most things one would need to do with directories, except for + * actual file I/O (which is covered by [CategoryIOStream](CategoryIOStream) + * and [CategoryAsyncIO](CategoryAsyncIO) instead). + * + * There are functions to answer necessary path questions: + * + * - Where is my app's data? SDL_GetBasePath(). + * - Where can I safely write files? SDL_GetPrefPath(). + * - Where are paths like Downloads, Desktop, Music? SDL_GetUserFolder(). + * - What is this thing at this location? SDL_GetPathInfo(). + * - What items live in this folder? SDL_EnumerateDirectory(). + * - What items live in this folder by wildcard? SDL_GlobDirectory(). + * - What is my current working directory? SDL_GetCurrentDirectory(). + * + * SDL also offers functions to manipulate the directory tree: renaming, + * removing, copying files. */ #ifndef SDL_filesystem_h_ @@ -73,7 +89,7 @@ extern "C" { * doesn't implement this functionality, call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPrefPath */ @@ -128,7 +144,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetBasePath(void); * etc.). This should be freed with SDL_free() when it is no longer * needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetBasePath */ @@ -143,66 +159,40 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetPrefPath(const char *org, const char * * * The folders supported per platform are: * - * | | Windows | WinRT/UWP |macOS/iOS | tvOS | Unix (XDG) | Haiku | Emscripten | - * | ----------- | ------- | --------- |--------- | ---- | ---------- | ----- | ---------- | - * | HOME | X | X | X | | X | X | X | - * | DESKTOP | X | X | X | | X | X | | - * | DOCUMENTS | X | X | X | | X | | | - * | DOWNLOADS | Vista+ | X | X | | X | | | - * | MUSIC | X | X | X | | X | | | - * | PICTURES | X | X | X | | X | | | - * | PUBLICSHARE | | | X | | X | | | - * | SAVEDGAMES | Vista+ | | | | | | | - * | SCREENSHOTS | Vista+ | X | | | | | | - * | TEMPLATES | X | X | X | | X | | | - * | VIDEOS | X | X | X* | | X | | | + * | | Windows | macOS/iOS | tvOS | Unix (XDG) | Haiku | Emscripten | + * | ----------- | ------- | --------- | ---- | ---------- | ----- | ---------- | + * | HOME | X | X | | X | X | X | + * | DESKTOP | X | X | | X | X | | + * | DOCUMENTS | X | X | | X | | | + * | DOWNLOADS | Vista+ | X | | X | | | + * | MUSIC | X | X | | X | | | + * | PICTURES | X | X | | X | | | + * | PUBLICSHARE | | X | | X | | | + * | SAVEDGAMES | Vista+ | | | | | | + * | SCREENSHOTS | Vista+ | | | | | | + * | TEMPLATES | X | X | | X | | | + * | VIDEOS | X | X* | | X | | | * * Note that on macOS/iOS, the Videos folder is called "Movies". * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetUserFolder */ typedef enum SDL_Folder { - /** The folder which contains all of the current user's data, preferences, - and documents. It usually contains most of the other folders. If a - requested folder does not exist, the home folder can be considered a safe - fallback to store a user's documents. */ - SDL_FOLDER_HOME, - /** The folder of files that are displayed on the desktop. Note that the - existence of a desktop folder does not guarantee that the system does - show icons on its desktop; certain GNU/Linux distros with a graphical - environment may not have desktop icons. */ - SDL_FOLDER_DESKTOP, - /** User document files, possibly application-specific. This is a good - place to save a user's projects. */ - SDL_FOLDER_DOCUMENTS, - /** Standard folder for user files downloaded from the internet. */ - SDL_FOLDER_DOWNLOADS, - /** Music files that can be played using a standard music player (mp3, - ogg...). */ - SDL_FOLDER_MUSIC, - /** Image files that can be displayed using a standard viewer (png, - jpg...). */ - SDL_FOLDER_PICTURES, - /** Files that are meant to be shared with other users on the same - computer. */ - SDL_FOLDER_PUBLICSHARE, - /** Save files for games. */ - SDL_FOLDER_SAVEDGAMES, - /** Application screenshots. */ - SDL_FOLDER_SCREENSHOTS, - /** Template files to be used when the user requests the desktop environment - to create a new file in a certain folder, such as "New Text File.txt". - Any file in the Templates folder can be used as a starting point for a - new file. */ - SDL_FOLDER_TEMPLATES, - /** Video files that can be played using a standard video player (mp4, - webm...). */ - SDL_FOLDER_VIDEOS, - /** total number of types in this enum, not a folder type by itself. */ - SDL_FOLDER_TOTAL + SDL_FOLDER_HOME, /**< The folder which contains all of the current user's data, preferences, and documents. It usually contains most of the other folders. If a requested folder does not exist, the home folder can be considered a safe fallback to store a user's documents. */ + SDL_FOLDER_DESKTOP, /**< The folder of files that are displayed on the desktop. Note that the existence of a desktop folder does not guarantee that the system does show icons on its desktop; certain GNU/Linux distros with a graphical environment may not have desktop icons. */ + SDL_FOLDER_DOCUMENTS, /**< User document files, possibly application-specific. This is a good place to save a user's projects. */ + SDL_FOLDER_DOWNLOADS, /**< Standard folder for user files downloaded from the internet. */ + SDL_FOLDER_MUSIC, /**< Music files that can be played using a standard music player (mp3, ogg...). */ + SDL_FOLDER_PICTURES, /**< Image files that can be displayed using a standard viewer (png, jpg...). */ + SDL_FOLDER_PUBLICSHARE, /**< Files that are meant to be shared with other users on the same computer. */ + SDL_FOLDER_SAVEDGAMES, /**< Save files for games. */ + SDL_FOLDER_SCREENSHOTS, /**< Application screenshots. */ + SDL_FOLDER_TEMPLATES, /**< Template files to be used when the user requests the desktop environment to create a new file in a certain folder, such as "New Text File.txt". Any file in the Templates folder can be used as a starting point for a new file. */ + SDL_FOLDER_VIDEOS, /**< Video files that can be played using a standard video player (mp4, webm...). */ + SDL_FOLDER_COUNT /**< Total number of types in this enum, not a folder type by itself. */ } SDL_Folder; /** @@ -226,13 +216,24 @@ typedef enum SDL_Folder * \returns either a null-terminated C string containing the full path to the * folder, or NULL if an error happened. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetUserFolder(SDL_Folder folder); /* Abstract filesystem interface */ +/** + * Types of filesystem entries. + * + * Note that there may be other sorts of items on a filesystem: devices, + * symlinks, named pipes, etc. They are currently reported as + * SDL_PATHTYPE_OTHER. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_PathInfo + */ typedef enum SDL_PathType { SDL_PATHTYPE_NONE, /**< path does not exist */ @@ -241,19 +242,27 @@ typedef enum SDL_PathType SDL_PATHTYPE_OTHER /**< something completely different like a device node (not a symlink, those are always followed) */ } SDL_PathType; +/** + * Information about a path on the filesystem. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_GetPathInfo + * \sa SDL_GetStoragePathInfo + */ typedef struct SDL_PathInfo { - SDL_PathType type; /* the path type */ - Uint64 size; /* the file size in bytes */ - SDL_Time create_time; /* the time when the path was created */ - SDL_Time modify_time; /* the last time the path was modified */ - SDL_Time access_time; /* the last time the path was read */ + SDL_PathType type; /**< the path type */ + Uint64 size; /**< the file size in bytes */ + SDL_Time create_time; /**< the time when the path was created */ + SDL_Time modify_time; /**< the last time the path was modified */ + SDL_Time access_time; /**< the last time the path was read */ } SDL_PathInfo; /** - * Flags for path matching + * Flags for path matching. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GlobDirectory * \sa SDL_GlobStorageDirectory @@ -263,73 +272,160 @@ typedef Uint32 SDL_GlobFlags; #define SDL_GLOB_CASEINSENSITIVE (1u << 0) /** - * Create a directory. + * Create a directory, and any missing parent directories. + * + * This reports success if `path` already exists as a directory. + * + * If parent directories are missing, it will also create them. Note that if + * this fails, it will not remove any parent directories it already made. * * \param path the path of the directory to create. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CreateDirectory(const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_CreateDirectory(const char *path); -/* Callback for directory enumeration. Return 1 to keep enumerating, - 0 to stop enumerating (no error), -1 to stop enumerating and - report an error. `dirname` is the directory being enumerated, - `fname` is the enumerated entry. */ -typedef int (SDLCALL *SDL_EnumerateDirectoryCallback)(void *userdata, const char *dirname, const char *fname); +/** + * Possible results from an enumeration callback. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_EnumerateDirectoryCallback + */ +typedef enum SDL_EnumerationResult +{ + SDL_ENUM_CONTINUE, /**< Value that requests that enumeration continue. */ + SDL_ENUM_SUCCESS, /**< Value that requests that enumeration stop, successfully. */ + SDL_ENUM_FAILURE /**< Value that requests that enumeration stop, as a failure. */ +} SDL_EnumerationResult; + +/** + * Callback for directory enumeration. + * + * Enumeration of directory entries will continue until either all entries + * have been provided to the callback, or the callback has requested a stop + * through its return value. + * + * Returning SDL_ENUM_CONTINUE will let enumeration proceed, calling the + * callback with further entries. SDL_ENUM_SUCCESS and SDL_ENUM_FAILURE will + * terminate the enumeration early, and dictate the return value of the + * enumeration function itself. + * + * `dirname` is guaranteed to end with a path separator ('\\' on Windows, '/' + * on most other platforms). + * + * \param userdata an app-controlled pointer that is passed to the callback. + * \param dirname the directory that is being enumerated. + * \param fname the next entry in the enumeration. + * \returns how the enumeration should proceed. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_EnumerateDirectory + */ +typedef SDL_EnumerationResult (SDLCALL *SDL_EnumerateDirectoryCallback)(void *userdata, const char *dirname, const char *fname); /** * Enumerate a directory through a callback function. * * This function provides every directory entry through an app-provided * callback, called once for each directory entry, until all results have been - * provided or the callback returns <= 0. + * provided or the callback returns either SDL_ENUM_SUCCESS or + * SDL_ENUM_FAILURE. + * + * This will return false if there was a system problem in general, or if a + * callback returns SDL_ENUM_FAILURE. A successful return means a callback + * returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries + * were enumerated. * * \param path the path of the directory to enumerate. * \param callback a function that is called for each entry in the directory. * \param userdata a pointer that is passed to `callback`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata); /** * Remove a file or an empty directory. * - * \param path the path of the directory to enumerate. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * Directories that are not empty will fail; this function will not recursely + * delete directory trees. * - * \since This function is available since SDL 3.0.0. + * \param path the path to remove from the filesystem. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RemovePath(const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_RemovePath(const char *path); /** * Rename a file or directory. * + * If the file at `newpath` already exists, it will replaced. + * + * Note that this will not copy files across filesystems/drives/volumes, as + * that is a much more complicated (and possibly time-consuming) operation. + * + * Which is to say, if this function fails, SDL_CopyFile() to a temporary file + * in the same directory as `newpath`, then SDL_RenamePath() from the + * temporary file to `newpath` and SDL_RemovePath() on `oldpath` might work + * for files. Renaming a non-empty directory across filesystems is + * dramatically more complex, however. + * * \param oldpath the old path. * \param newpath the new path. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenamePath(const char *oldpath, const char *newpath); +extern SDL_DECLSPEC bool SDLCALL SDL_RenamePath(const char *oldpath, const char *newpath); /** * Copy a file. * + * If the file at `newpath` already exists, it will be overwritten with the + * contents of the file at `oldpath`. + * + * This function will block until the copy is complete, which might be a + * significant time for large files on slow disks. On some platforms, the copy + * can be handed off to the OS itself, but on others SDL might just open both + * paths, and read from one and write to the other. + * + * Note that this is not an atomic operation! If something tries to read from + * `newpath` while the copy is in progress, it will see an incomplete copy of + * the data, and if the calling thread terminates (or the power goes out) + * during the copy, `newpath`'s previous contents will be gone, replaced with + * an incomplete copy of the data. To avoid this risk, it is recommended that + * the app copy to a temporary file in the same directory as `newpath`, and if + * the copy is successful, use SDL_RenamePath() to replace `newpath` with the + * temporary file. This will ensure that reads of `newpath` will either see a + * complete copy of the data, or it will see the pre-copy state of `newpath`. + * + * This function attempts to synchronize the newly-copied data to disk before + * returning, if the platform allows it, so that the renaming trick will not + * have a problem in a system crash or power failure, where the file could be + * renamed but the contents never made it from the system file cache to the + * physical disk. + * + * If the copy fails for any reason, the state of `newpath` is undefined. It + * might be half a copy, it might be the untouched data of what was already + * there, or it might be a zero-byte file, etc. + * * \param oldpath the old path. * \param newpath the new path. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyFile(const char *oldpath, const char *newpath); +extern SDL_DECLSPEC bool SDLCALL SDL_CopyFile(const char *oldpath, const char *newpath); /** * Get information about a filesystem path. @@ -337,21 +433,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyFile(const char *oldpath, const cha * \param path the path to query. * \param info a pointer filled in with information about the path, or NULL to * check for the existence of a file. - * \returns SDL_TRUE on success or SDL_FALSE if the file doesn't exist, or - * another failure; call SDL_GetError() for more information. + * \returns true on success or false if the file doesn't exist, or another + * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo *info); +extern SDL_DECLSPEC bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo *info); /** * Enumerate a directory tree, filtered by pattern, and return a list. * * Files are filtered out if they don't match the string in `pattern`, which - * may contain wildcard characters '*' (match everything) and '?' (match one + * may contain wildcard characters '\*' (match everything) and '?' (match one * character). If pattern is NULL, no filtering is done and all results are * returned. Subdirectories are permitted, and are specified with a path - * separator of '/'. Wildcard characters '*' and '?' never match a path + * separator of '/'. Wildcard characters '\*' and '?' never match a path * separator. * * `flags` may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching @@ -373,10 +469,31 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathI * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char ** SDLCALL SDL_GlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count); +/** + * Get what the system believes is the "current working directory." + * + * For systems without a concept of a current working directory, this will + * still attempt to provide something reasonable. + * + * SDL does not provide a means to _change_ the current working directory; for + * platforms without this concept, this would cause surprises with file access + * outside of SDL. + * + * The returned path is guaranteed to end with a path separator ('\\' on + * Windows, '/' on most other platforms). + * + * \returns a UTF-8 string of the current working directory in + * platform-dependent notation. NULL if there's a problem. This + * should be freed with SDL_free() when it is no longer needed. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC char * SDLCALL SDL_GetCurrentDirectory(void); + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gamepad.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gamepad.h index 3d2d726..264f763 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gamepad.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gamepad.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -51,6 +51,24 @@ * If you would like to receive gamepad updates while the application is in * the background, you should set the following hint before calling * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + * + * Gamepads support various optional features such as rumble, color LEDs, + * touchpad, gyro, etc. The support for these features varies depending on the + * controller and OS support available. You can check for LED and rumble + * capabilities at runtime by calling SDL_GetGamepadProperties() and checking + * the various capability properties. You can check for touchpad by calling + * SDL_GetNumGamepadTouchpads() and check for gyro and accelerometer by + * calling SDL_GamepadHasSensor(). + * + * By default SDL will try to use the most capable driver available, but you + * can tune which OS drivers to use with the various joystick hints in + * SDL_hints.h. + * + * Your application should always support gamepad hotplugging. On some + * platforms like Xbox, Steam Deck, etc., this is a requirement for + * certification. On other platforms, like macOS and Windows when using + * Windows.Gaming.Input, controllers may not be available at startup and will + * come in at some point after you've started processing events. */ #ifndef SDL_gamepad_h_ @@ -58,9 +76,11 @@ #include #include -#include -#include +#include #include +#include +#include +#include #include #include @@ -72,7 +92,7 @@ extern "C" { /** * The structure used to identify an SDL gamepad * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Gamepad SDL_Gamepad; @@ -98,7 +118,7 @@ typedef enum SDL_GamepadType SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT, SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT, SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR, - SDL_GAMEPAD_TYPE_MAX + SDL_GAMEPAD_TYPE_COUNT } SDL_GamepadType; /** @@ -122,15 +142,15 @@ typedef enum SDL_GamepadType * You can query the labels for the face buttons using * SDL_GetGamepadButtonLabel() * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadButton { SDL_GAMEPAD_BUTTON_INVALID = -1, - SDL_GAMEPAD_BUTTON_SOUTH, /* Bottom face button (e.g. Xbox A button) */ - SDL_GAMEPAD_BUTTON_EAST, /* Right face button (e.g. Xbox B button) */ - SDL_GAMEPAD_BUTTON_WEST, /* Left face button (e.g. Xbox X button) */ - SDL_GAMEPAD_BUTTON_NORTH, /* Top face button (e.g. Xbox Y button) */ + SDL_GAMEPAD_BUTTON_SOUTH, /**< Bottom face button (e.g. Xbox A button) */ + SDL_GAMEPAD_BUTTON_EAST, /**< Right face button (e.g. Xbox B button) */ + SDL_GAMEPAD_BUTTON_WEST, /**< Left face button (e.g. Xbox X button) */ + SDL_GAMEPAD_BUTTON_NORTH, /**< Top face button (e.g. Xbox Y button) */ SDL_GAMEPAD_BUTTON_BACK, SDL_GAMEPAD_BUTTON_GUIDE, SDL_GAMEPAD_BUTTON_START, @@ -142,18 +162,18 @@ typedef enum SDL_GamepadButton SDL_GAMEPAD_BUTTON_DPAD_DOWN, SDL_GAMEPAD_BUTTON_DPAD_LEFT, SDL_GAMEPAD_BUTTON_DPAD_RIGHT, - SDL_GAMEPAD_BUTTON_MISC1, /* Additional button (e.g. Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button, Google Stadia capture button) */ - SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1, /* Upper or primary paddle, under your right hand (e.g. Xbox Elite paddle P1) */ - SDL_GAMEPAD_BUTTON_LEFT_PADDLE1, /* Upper or primary paddle, under your left hand (e.g. Xbox Elite paddle P3) */ - SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2, /* Lower or secondary paddle, under your right hand (e.g. Xbox Elite paddle P2) */ - SDL_GAMEPAD_BUTTON_LEFT_PADDLE2, /* Lower or secondary paddle, under your left hand (e.g. Xbox Elite paddle P4) */ - SDL_GAMEPAD_BUTTON_TOUCHPAD, /* PS4/PS5 touchpad button */ - SDL_GAMEPAD_BUTTON_MISC2, /* Additional button */ - SDL_GAMEPAD_BUTTON_MISC3, /* Additional button */ - SDL_GAMEPAD_BUTTON_MISC4, /* Additional button */ - SDL_GAMEPAD_BUTTON_MISC5, /* Additional button */ - SDL_GAMEPAD_BUTTON_MISC6, /* Additional button */ - SDL_GAMEPAD_BUTTON_MAX + SDL_GAMEPAD_BUTTON_MISC1, /**< Additional button (e.g. Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button, Google Stadia capture button) */ + SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1, /**< Upper or primary paddle, under your right hand (e.g. Xbox Elite paddle P1) */ + SDL_GAMEPAD_BUTTON_LEFT_PADDLE1, /**< Upper or primary paddle, under your left hand (e.g. Xbox Elite paddle P3) */ + SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2, /**< Lower or secondary paddle, under your right hand (e.g. Xbox Elite paddle P2) */ + SDL_GAMEPAD_BUTTON_LEFT_PADDLE2, /**< Lower or secondary paddle, under your left hand (e.g. Xbox Elite paddle P4) */ + SDL_GAMEPAD_BUTTON_TOUCHPAD, /**< PS4/PS5 touchpad button */ + SDL_GAMEPAD_BUTTON_MISC2, /**< Additional button */ + SDL_GAMEPAD_BUTTON_MISC3, /**< Additional button */ + SDL_GAMEPAD_BUTTON_MISC4, /**< Additional button */ + SDL_GAMEPAD_BUTTON_MISC5, /**< Additional button */ + SDL_GAMEPAD_BUTTON_MISC6, /**< Additional button */ + SDL_GAMEPAD_BUTTON_COUNT } SDL_GamepadButton; /** @@ -165,7 +185,7 @@ typedef enum SDL_GamepadButton * For a complete set, you should look at the button and gamepad type and have * a set of symbols that work well with your art style. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadButtonLabel { @@ -192,7 +212,7 @@ typedef enum SDL_GamepadButtonLabel * pressed) when reported by SDL_GetGamepadAxis(). Note that this is not the * same range that will be reported by the lower-level SDL_GetJoystickAxis(). * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadAxis { @@ -203,7 +223,7 @@ typedef enum SDL_GamepadAxis SDL_GAMEPAD_AXIS_RIGHTY, SDL_GAMEPAD_AXIS_LEFT_TRIGGER, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, - SDL_GAMEPAD_AXIS_MAX + SDL_GAMEPAD_AXIS_COUNT } SDL_GamepadAxis; /** @@ -214,7 +234,7 @@ typedef enum SDL_GamepadAxis * gamepad. This enum is used as part of SDL_GamepadBinding to specify those * mappings. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadBindingType { @@ -235,7 +255,7 @@ typedef enum SDL_GamepadBindingType * more with a simple text string. Those strings are parsed into a collection * of these structs to make it easier to operate on the data. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetGamepadBindings */ @@ -293,6 +313,9 @@ typedef struct SDL_GamepadBinding * * Buttons can be used as a gamepad axes and vice versa. * + * If a device with this GUID is already plugged in, SDL will generate an + * SDL_EVENT_GAMEPAD_ADDED event. + * * This string shows an example of a valid mapping for a gamepad: * * ```c @@ -305,10 +328,15 @@ typedef struct SDL_GamepadBinding * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * + * \sa SDL_AddGamepadMappingsFromFile + * \sa SDL_AddGamepadMappingsFromIO * \sa SDL_GetGamepadMapping * \sa SDL_GetGamepadMappingForGUID + * \sa SDL_HINT_GAMECONTROLLERCONFIG + * \sa SDL_HINT_GAMECONTROLLERCONFIG_FILE + * \sa SDL_EVENT_GAMEPAD_ADDED */ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMapping(const char *mapping); @@ -321,6 +349,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMapping(const char *mapping); * If a new mapping is loaded for an already known gamepad GUID, the later * version will overwrite the one currently loaded. * + * Any new mappings for already plugged in controllers will generate + * SDL_EVENT_GAMEPAD_ADDED events. + * * 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). @@ -330,21 +361,24 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMapping(const char *mapping); * constrained environment. * * \param src the data stream for the mappings to be added. - * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning, - * even in the case of an error. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. * \returns the number of mappings added or -1 on failure; call SDL_GetError() * for more information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_AddGamepadMappingsFromFile * \sa SDL_GetGamepadMapping * \sa SDL_GetGamepadMappingForGUID + * \sa SDL_HINT_GAMECONTROLLERCONFIG + * \sa SDL_HINT_GAMECONTROLLERCONFIG_FILE + * \sa SDL_EVENT_GAMEPAD_ADDED */ -extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, SDL_bool closeio); +extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, bool closeio); /** * Load a set of gamepad mappings from a file. @@ -355,6 +389,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, * If a new mapping is loaded for an already known gamepad GUID, the later * version will overwrite the one currently loaded. * + * Any new mappings for already plugged in controllers will generate + * SDL_EVENT_GAMEPAD_ADDED events. + * * 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). @@ -365,12 +402,15 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_AddGamepadMappingsFromIO * \sa SDL_GetGamepadMapping * \sa SDL_GetGamepadMappingForGUID + * \sa SDL_HINT_GAMECONTROLLERCONFIG + * \sa SDL_HINT_GAMECONTROLLERCONFIG_FILE + * \sa SDL_EVENT_GAMEPAD_ADDED */ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromFile(const char *file); @@ -379,12 +419,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromFile(const char *file) * * This will generate gamepad events as needed if device mappings change. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReloadGamepadMappings(void); +extern SDL_DECLSPEC bool SDLCALL SDL_ReloadGamepadMappings(void); /** * Get the current gamepad mappings. @@ -396,7 +436,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReloadGamepadMappings(void); * single allocation that should be freed with SDL_free() when it is * no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char ** SDLCALL SDL_GetGamepadMappings(int *count); @@ -408,7 +448,7 @@ extern SDL_DECLSPEC char ** SDLCALL SDL_GetGamepadMappings(int *count); * information. This should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID * \sa SDL_GetJoystickGUID @@ -425,7 +465,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForGUID(SDL_GUID guid); * available; call SDL_GetError() for more information. This should * be freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_GetGamepadMappingForID @@ -442,26 +482,26 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMapping(SDL_Gamepad *gamepad); * \param instance_id the joystick instance ID. * \param mapping the mapping to use for this device, or NULL to clear the * mapping. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_GetGamepadMapping */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadMapping(SDL_JoystickID instance_id, const char *mapping); +extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadMapping(SDL_JoystickID instance_id, const char *mapping); /** * Return whether a gamepad is currently connected. * - * \returns SDL_TRUE if a gamepad is connected, SDL_FALSE otherwise. + * \returns true if a gamepad is connected, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepads */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasGamepad(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasGamepad(void); /** * Get a list of currently connected gamepads. @@ -472,7 +512,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasGamepad(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasGamepad * \sa SDL_OpenGamepad @@ -483,15 +523,15 @@ extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetGamepads(int *count); * Check if the given joystick is supported by the gamepad interface. * * \param instance_id the joystick instance ID. - * \returns SDL_TRUE if the given joystick is supported by the gamepad - * interface, SDL_FALSE if it isn't or it's an invalid index. + * \returns true if the given joystick is supported by the gamepad interface, + * false if it isn't or it's an invalid index. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoysticks * \sa SDL_OpenGamepad */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id); +extern SDL_DECLSPEC bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id); /** * Get the implementation dependent name of a gamepad. @@ -502,7 +542,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id); * \returns the name of the selected gamepad. If no name can be found, this * function returns NULL; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadName * \sa SDL_GetGamepads @@ -518,7 +558,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadNameForID(SDL_JoystickID * \returns the path of the selected gamepad. If no path can be found, this * function returns NULL; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPath * \sa SDL_GetGamepads @@ -533,7 +573,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPathForID(SDL_JoystickID * \param instance_id the joystick instance ID. * \returns the player index of a gamepad, or -1 if it's not available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex * \sa SDL_GetGamepads @@ -549,7 +589,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndexForID(SDL_JoystickID in * \returns the GUID of the selected gamepad. If called on an invalid index, * this function returns a zero GUID. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GUIDToString * \sa SDL_GetGamepads @@ -566,7 +606,7 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetGamepadGUIDForID(SDL_JoystickID inst * \returns the USB vendor ID of the selected gamepad. If called on an invalid * index, this function returns zero. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadVendor * \sa SDL_GetGamepads @@ -583,7 +623,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendorForID(SDL_JoystickID inst * \returns the USB product ID of the selected gamepad. If called on an * invalid index, this function returns zero. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProduct * \sa SDL_GetGamepads @@ -600,7 +640,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductForID(SDL_JoystickID ins * \returns the product version of the selected gamepad. If called on an * invalid index, this function returns zero. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductVersion * \sa SDL_GetGamepads @@ -615,7 +655,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersionForID(SDL_Joystic * \param instance_id the joystick instance ID. * \returns the gamepad type. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadType * \sa SDL_GetGamepads @@ -631,7 +671,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeForID(SDL_Joystick * \param instance_id the joystick instance ID. * \returns the gamepad type. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeForID * \sa SDL_GetGamepads @@ -648,7 +688,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadTypeForID(SDL_Joys * \returns the mapping string. Returns NULL if no mapping is available. This * should be freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepads * \sa SDL_GetGamepadMapping @@ -662,7 +702,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForID(SDL_JoystickID ins * \returns a gamepad identifier or NULL if an error occurred; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseGamepad * \sa SDL_IsGamepad @@ -677,7 +717,7 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_OpenGamepad(SDL_JoystickID instanc * \returns an SDL_Gamepad on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromID(SDL_JoystickID instance_id); @@ -687,7 +727,7 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromID(SDL_JoystickID in * \param player_index the player index, which different from the instance ID. * \returns the SDL_Gamepad associated with a player index. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex * \sa SDL_SetGamepadPlayerIndex @@ -717,7 +757,7 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromPlayerIndex(int play * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGamepadProperties(SDL_Gamepad *gamepad); @@ -735,7 +775,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGamepadProperties(SDL_Gamepa * \returns the instance ID of the specified gamepad on success or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad); @@ -747,7 +787,7 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad * \returns the implementation dependent name for the gamepad, or NULL if * there is no name or the identifier passed is invalid. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadNameForID */ @@ -761,7 +801,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadName(SDL_Gamepad *gamepad * \returns the implementation dependent path for the gamepad, or NULL if * there is no path or the identifier passed is invalid. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPathForID */ @@ -774,7 +814,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPath(SDL_Gamepad *gamepad * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not * available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeForID */ @@ -787,7 +827,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadType(SDL_Gamepad *game * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not * available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRealGamepadTypeForID */ @@ -801,7 +841,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadType(SDL_Gamepad * * \param gamepad the gamepad object to query. * \returns the player index for gamepad, or -1 if it's not available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadPlayerIndex */ @@ -813,14 +853,14 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndex(SDL_Gamepad *gamepad); * \param gamepad the gamepad object to adjust. * \param player_index player index to assign to this gamepad, or -1 to clear * the player index and turn off player LEDs. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadPlayerIndex(SDL_Gamepad *gamepad, int player_index); +extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadPlayerIndex(SDL_Gamepad *gamepad, int player_index); /** * Get the USB vendor ID of an opened gamepad, if available. @@ -830,7 +870,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadPlayerIndex(SDL_Gamepad *game * \param gamepad the gamepad object to query. * \returns the USB vendor ID, or zero if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadVendorForID */ @@ -844,7 +884,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendor(SDL_Gamepad *gamepad); * \param gamepad the gamepad object to query. * \returns the USB product ID, or zero if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductForID */ @@ -858,7 +898,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProduct(SDL_Gamepad *gamepad); * \param gamepad the gamepad object to query. * \returns the USB product version, or zero if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductVersionForID */ @@ -872,7 +912,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersion(SDL_Gamepad *gam * \param gamepad the gamepad object to query. * \returns the gamepad firmware version, or zero if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *gamepad); @@ -884,7 +924,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *ga * \param gamepad the gamepad object to query. * \returns the serial number, or NULL if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamepad); @@ -897,7 +937,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamep * \param gamepad the gamepad object to query. * \returns the gamepad handle, or 0 if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetGamepadSteamHandle(SDL_Gamepad *gamepad); @@ -909,7 +949,7 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetGamepadSteamHandle(SDL_Gamepad *gamepa * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetGamepadConnectionState(SDL_Gamepad *gamepad); @@ -929,7 +969,7 @@ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetGamepadConnection * battery. * \returns the current battery state. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetGamepadPowerInfo(SDL_Gamepad *gamepad, int *percent); @@ -938,12 +978,12 @@ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetGamepadPowerInfo(SDL_Gamepad * * * \param gamepad a gamepad identifier previously returned by * SDL_OpenGamepad(). - * \returns SDL_TRUE if the gamepad has been opened and is currently - * connected, or SDL_FALSE if not. + * \returns true if the gamepad has been opened and is currently connected, or + * false if not. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); /** * Get the underlying joystick from a gamepad. @@ -961,7 +1001,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); * \returns an SDL_Joystick object, or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetGamepadJoystick(SDL_Gamepad *gamepad); @@ -973,12 +1013,12 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetGamepadJoystick(SDL_Gamepad *g * * \param enabled whether to process gamepad events or not. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadEventsEnabled * \sa SDL_UpdateGamepads */ -extern SDL_DECLSPEC void SDLCALL SDL_SetGamepadEventsEnabled(SDL_bool enabled); +extern SDL_DECLSPEC void SDLCALL SDL_SetGamepadEventsEnabled(bool enabled); /** * Query the state of gamepad event processing. @@ -986,14 +1026,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGamepadEventsEnabled(SDL_bool enabled); * If gamepad events are disabled, you must call SDL_UpdateGamepads() yourself * and check the state of the gamepad when you want gamepad information. * - * \returns SDL_TRUE if gamepad events are being processed, SDL_FALSE - * otherwise. + * \returns true if gamepad events are being processed, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadEventsEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadEventsEnabled(void); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadEventsEnabled(void); /** * Get the SDL joystick layer bindings for a gamepad. @@ -1005,7 +1044,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadEventsEnabled(void); * single allocation that should be freed with SDL_free() when it is * no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gamepad *gamepad, int *count); @@ -1016,7 +1055,7 @@ extern SDL_DECLSPEC SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gam * enabled. Under such circumstances, it will not be necessary to call this * function. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateGamepads(void); @@ -1032,7 +1071,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UpdateGamepads(void); * \returns the SDL_GamepadType enum corresponding to the input string, or * `SDL_GAMEPAD_TYPE_UNKNOWN` if no match was found. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForType */ @@ -1046,7 +1085,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeFromString(const c * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeFromString */ @@ -1068,7 +1107,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForType(SDL_Gamepad * \returns the SDL_GamepadAxis enum corresponding to the input string, or * `SDL_GAMEPAD_AXIS_INVALID` if no match was found. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForAxis */ @@ -1082,7 +1121,7 @@ extern SDL_DECLSPEC SDL_GamepadAxis SDLCALL SDL_GetGamepadAxisFromString(const c * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAxisFromString */ @@ -1096,14 +1135,14 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForAxis(SDL_Gamepad * * \param gamepad a gamepad. * \param axis an axis enum value (an SDL_GamepadAxis value). - * \returns SDL_TRUE if the gamepad has this axis, SDL_FALSE otherwise. + * \returns true if the gamepad has this axis, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasButton * \sa SDL_GetGamepadAxis */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); /** * Get the current state of an axis control on a gamepad. @@ -1122,7 +1161,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SD * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasAxis * \sa SDL_GetGamepadButton @@ -1141,7 +1180,7 @@ extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetGamepadAxis(SDL_Gamepad *gamepad, SDL_ * \returns the SDL_GamepadButton enum corresponding to the input string, or * `SDL_GAMEPAD_BUTTON_INVALID` if no match was found. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForButton */ @@ -1155,7 +1194,7 @@ extern SDL_DECLSPEC SDL_GamepadButton SDLCALL SDL_GetGamepadButtonFromString(con * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonFromString */ @@ -1169,28 +1208,27 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForButton(SDL_Gamep * * \param gamepad a gamepad. * \param button a button enum value (an SDL_GamepadButton value). - * \returns SDL_TRUE if the gamepad has this button, SDL_FALSE otherwise. + * \returns true if the gamepad has this button, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasAxis */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); /** * Get the current state of a button on a gamepad. * * \param gamepad a gamepad. * \param button a button index (one of the SDL_GamepadButton values). - * \returns 1 for pressed state or 0 for not pressed state or failure; call - * SDL_GetError() for more information. + * \returns true if the button is pressed, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasButton * \sa SDL_GetGamepadAxis */ -extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); +extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); /** * Get the label of a button on a gamepad. @@ -1199,7 +1237,7 @@ extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL * \param button a button index (one of the SDL_GamepadButton values). * \returns the SDL_GamepadButtonLabel enum corresponding to the button label. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonLabel */ @@ -1212,7 +1250,7 @@ extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabelForT * \param button a button index (one of the SDL_GamepadButton values). * \returns the SDL_GamepadButtonLabel enum corresponding to the button label. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonLabelForType */ @@ -1224,7 +1262,7 @@ extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabel(SDL * \param gamepad a gamepad. * \returns number of touchpads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumGamepadTouchpadFingers */ @@ -1238,7 +1276,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpads(SDL_Gamepad *gamepad) * \param touchpad a touchpad. * \returns number of supported simultaneous fingers. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTouchpadFinger * \sa SDL_GetNumGamepadTouchpads @@ -1251,35 +1289,36 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpadFingers(SDL_Gamepad *ga * \param gamepad a gamepad. * \param touchpad a touchpad. * \param finger a finger. - * \param state filled with state. - * \param x filled with x position, normalized 0 to 1, with the origin in the - * upper left. - * \param y filled with y position, normalized 0 to 1, with the origin in the - * upper left. - * \param pressure filled with pressure value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param down a pointer filled with true if the finger is down, false + * otherwise, may be NULL. + * \param x a pointer filled with the x position, normalized 0 to 1, with the + * origin in the upper left, may be NULL. + * \param y a pointer filled with the y position, normalized 0 to 1, with the + * origin in the upper left, may be NULL. + * \param pressure a pointer filled with pressure value, may be NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumGamepadTouchpadFingers */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGamepadTouchpadFinger(SDL_Gamepad *gamepad, int touchpad, int finger, Uint8 *state, float *x, float *y, float *pressure); +extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadTouchpadFinger(SDL_Gamepad *gamepad, int touchpad, int finger, bool *down, float *x, float *y, float *pressure); /** * Return whether a gamepad has a particular sensor. * * \param gamepad the gamepad to query. * \param type the type of sensor to query. - * \returns SDL_TRUE if the sensor exists, SDL_FALSE otherwise. + * \returns true if the sensor exists, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadSensorData * \sa SDL_GetGamepadSensorDataRate * \sa SDL_SetGamepadSensorEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasSensor(SDL_Gamepad *gamepad, SDL_SensorType type); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasSensor(SDL_Gamepad *gamepad, SDL_SensorType type); /** * Set whether data reporting for a gamepad sensor is enabled. @@ -1287,28 +1326,28 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasSensor(SDL_Gamepad *gamepad, * \param gamepad the gamepad to update. * \param type the type of sensor to enable/disable. * \param enabled whether data reporting should be enabled. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasSensor * \sa SDL_GamepadSensorEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type, SDL_bool enabled); +extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type, bool enabled); /** * Query whether sensor data reporting is enabled for a gamepad. * * \param gamepad the gamepad to query. * \param type the type of sensor to query. - * \returns SDL_TRUE if the sensor is enabled, SDL_FALSE otherwise. + * \returns true if the sensor is enabled, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadSensorEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type); +extern SDL_DECLSPEC bool SDLCALL SDL_GamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type); /** * Get the data rate (number of events per second) of a gamepad sensor. @@ -1317,7 +1356,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadSensorEnabled(SDL_Gamepad *gamep * \param type the type of sensor to query. * \returns the data rate, or 0.0f if the data rate is not available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *gamepad, SDL_SensorType type); @@ -1331,12 +1370,12 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *game * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamepad, SDL_SensorType type, float *data, int num_values); +extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamepad, SDL_SensorType type, float *data, int num_values); /** * Start a rumble effect on a gamepad. @@ -1353,12 +1392,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamep * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); +extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); /** * Start a rumble effect in the gamepad's triggers. @@ -1379,14 +1418,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uin * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RumbleGamepad */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleGamepadTriggers(SDL_Gamepad *gamepad, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); +extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepadTriggers(SDL_Gamepad *gamepad, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); /** * Update a gamepad's LED color. @@ -1401,12 +1440,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleGamepadTriggers(SDL_Gamepad *game * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uint8 red, Uint8 green, Uint8 blue); +extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uint8 red, Uint8 green, Uint8 blue); /** * Send a gamepad specific effect packet. @@ -1414,12 +1453,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uin * \param gamepad the gamepad to affect. * \param data the data to send to the gamepad. * \param size the size of the data to send to the gamepad. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, const void *data, int size); +extern SDL_DECLSPEC bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, const void *data, int size); /** * Close a gamepad previously opened with SDL_OpenGamepad(). @@ -1427,7 +1466,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, * \param gamepad a gamepad identifier previously returned by * SDL_OpenGamepad(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenGamepad */ @@ -1441,7 +1480,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseGamepad(SDL_Gamepad *gamepad); * \param button a button on the gamepad. * \returns the sfSymbolsName or NULL if the name can't be found. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAppleSFSymbolsNameForAxis */ @@ -1454,7 +1493,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForButt * \param axis an axis on the gamepad. * \returns the sfSymbolsName or NULL if the name can't be found. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAppleSFSymbolsNameForButton */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gpu.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gpu.h index bba47cc..fa870a5 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gpu.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gpu.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -24,7 +24,281 @@ /** * # CategoryGPU * - * Include file for SDL GPU API functions + * The GPU API offers a cross-platform way for apps to talk to modern graphics + * hardware. It offers both 3D graphics and compute support, in the style of + * Metal, Vulkan, and Direct3D 12. + * + * A basic workflow might be something like this: + * + * The app creates a GPU device with SDL_CreateGPUDevice(), and assigns it to + * a window with SDL_ClaimWindowForGPUDevice()--although strictly speaking you + * can render offscreen entirely, perhaps for image processing, and not use a + * window at all. + * + * Next the app prepares static data (things that are created once and used + * over and over). For example: + * + * - Shaders (programs that run on the GPU): use SDL_CreateGPUShader(). + * - Vertex buffers (arrays of geometry data) and other data rendering will + * need: use SDL_UploadToGPUBuffer(). + * - Textures (images): use SDL_UploadToGPUTexture(). + * - Samplers (how textures should be read from): use SDL_CreateGPUSampler(). + * - Render pipelines (precalculated rendering state): use + * SDL_CreateGPUGraphicsPipeline() + * + * To render, the app creates one or more command buffers, with + * SDL_AcquireGPUCommandBuffer(). Command buffers collect rendering + * instructions that will be submitted to the GPU in batch. Complex scenes can + * use multiple command buffers, maybe configured across multiple threads in + * parallel, as long as they are submitted in the correct order, but many apps + * will just need one command buffer per frame. + * + * Rendering can happen to a texture (what other APIs call a "render target") + * or it can happen to the swapchain texture (which is just a special texture + * that represents a window's contents). The app can use + * SDL_WaitAndAcquireGPUSwapchainTexture() to render to the window. + * + * Rendering actually happens in a Render Pass, which is encoded into a + * command buffer. One can encode multiple render passes (or alternate between + * render and compute passes) in a single command buffer, but many apps might + * simply need a single render pass in a single command buffer. Render Passes + * can render to up to four color textures and one depth texture + * simultaneously. If the set of textures being rendered to needs to change, + * the Render Pass must be ended and a new one must be begun. + * + * The app calls SDL_BeginGPURenderPass(). Then it sets states it needs for + * each draw: + * + * - SDL_BindGPUGraphicsPipeline() + * - SDL_SetGPUViewport() + * - SDL_BindGPUVertexBuffers() + * - SDL_BindGPUVertexSamplers() + * - etc + * + * Then, make the actual draw commands with these states: + * + * - SDL_DrawGPUPrimitives() + * - SDL_DrawGPUPrimitivesIndirect() + * - SDL_DrawGPUIndexedPrimitivesIndirect() + * - etc + * + * After all the drawing commands for a pass are complete, the app should call + * SDL_EndGPURenderPass(). Once a render pass ends all render-related state is + * reset. + * + * The app can begin new Render Passes and make new draws in the same command + * buffer until the entire scene is rendered. + * + * Once all of the render commands for the scene are complete, the app calls + * SDL_SubmitGPUCommandBuffer() to send it to the GPU for processing. + * + * If the app needs to read back data from texture or buffers, the API has an + * efficient way of doing this, provided that the app is willing to tolerate + * some latency. When the app uses SDL_DownloadFromGPUTexture() or + * SDL_DownloadFromGPUBuffer(), submitting the command buffer with + * SDL_SubmitGPUCommandBufferAndAcquireFence() will return a fence handle that + * the app can poll or wait on in a thread. Once the fence indicates that the + * command buffer is done processing, it is safe to read the downloaded data. + * Make sure to call SDL_ReleaseGPUFence() when done with the fence. + * + * The API also has "compute" support. The app calls SDL_BeginGPUComputePass() + * with compute-writeable textures and/or buffers, which can be written to in + * a compute shader. Then it sets states it needs for the compute dispatches: + * + * - SDL_BindGPUComputePipeline() + * - SDL_BindGPUComputeStorageBuffers() + * - SDL_BindGPUComputeStorageTextures() + * + * Then, dispatch compute work: + * + * - SDL_DispatchGPUCompute() + * + * For advanced users, this opens up powerful GPU-driven workflows. + * + * Graphics and compute pipelines require the use of shaders, which as + * mentioned above are small programs executed on the GPU. Each backend + * (Vulkan, Metal, D3D12) requires a different shader format. When the app + * creates the GPU device, the app lets the device know which shader formats + * the app can provide. It will then select the appropriate backend depending + * on the available shader formats and the backends available on the platform. + * When creating shaders, the app must provide the correct shader format for + * the selected backend. If you would like to learn more about why the API + * works this way, there is a detailed + * [blog post](https://moonside.games/posts/layers-all-the-way-down/) + * explaining this situation. + * + * It is optimal for apps to pre-compile the shader formats they might use, + * but for ease of use SDL provides a separate project, + * [SDL_shadercross](https://github.com/libsdl-org/SDL_shadercross) + * , for performing runtime shader cross-compilation. + * + * This is an extremely quick overview that leaves out several important + * details. Already, though, one can see that GPU programming can be quite + * complex! If you just need simple 2D graphics, the + * [Render API](https://wiki.libsdl.org/SDL3/CategoryRender) + * is much easier to use but still hardware-accelerated. That said, even for + * 2D applications the performance benefits and expressiveness of the GPU API + * are significant. + * + * The GPU API targets a feature set with a wide range of hardware support and + * ease of portability. It is designed so that the app won't have to branch + * itself by querying feature support. If you need cutting-edge features with + * limited hardware support, this API is probably not for you. + * + * Examples demonstrating proper usage of this API can be found + * [here](https://github.com/TheSpydog/SDL_gpu_examples) + * . + * + * ## Performance considerations + * + * Here are some basic tips for maximizing your rendering performance. + * + * - Beginning a new render pass is relatively expensive. Use as few render + * passes as you can. + * - Minimize the amount of state changes. For example, binding a pipeline is + * relatively cheap, but doing it hundreds of times when you don't need to + * will slow the performance significantly. + * - Perform your data uploads as early as possible in the frame. + * - Don't churn resources. Creating and releasing resources is expensive. + * It's better to create what you need up front and cache it. + * - Don't use uniform buffers for large amounts of data (more than a matrix + * or so). Use a storage buffer instead. + * - Use cycling correctly. There is a detailed explanation of cycling further + * below. + * - Use culling techniques to minimize pixel writes. The less writing the GPU + * has to do the better. Culling can be a very advanced topic but even + * simple culling techniques can boost performance significantly. + * + * In general try to remember the golden rule of performance: doing things is + * more expensive than not doing things. Don't Touch The Driver! + * + * ## FAQ + * + * **Question: When are you adding more advanced features, like ray tracing or + * mesh shaders?** + * + * Answer: We don't have immediate plans to add more bleeding-edge features, + * but we certainly might in the future, when these features prove worthwhile, + * and reasonable to implement across several platforms and underlying APIs. + * So while these things are not in the "never" category, they are definitely + * not "near future" items either. + * + * **Question: Why is my shader not working?** + * + * Answer: A common oversight when using shaders is not properly laying out + * the shader resources/registers correctly. The GPU API is very strict with + * how it wants resources to be laid out and it's difficult for the API to + * automatically validate shaders to see if they have a compatible layout. See + * the documentation for SDL_CreateGPUShader() and + * SDL_CreateGPUComputePipeline() for information on the expected layout. + * + * Another common issue is not setting the correct number of samplers, + * textures, and buffers in SDL_GPUShaderCreateInfo. If possible use shader + * reflection to extract the required information from the shader + * automatically instead of manually filling in the struct's values. + * + * **Question: My application isn't performing very well. Is this the GPU + * API's fault?** + * + * Answer: No. Long answer: The GPU API is a relatively thin layer over the + * underlying graphics API. While it's possible that we have done something + * inefficiently, it's very unlikely especially if you are relatively + * inexperienced with GPU rendering. Please see the performance tips above and + * make sure you are following them. Additionally, tools like RenderDoc can be + * very helpful for diagnosing incorrect behavior and performance issues. + * + * ## System Requirements + * + * **Vulkan:** Supported on Windows, Linux, Nintendo Switch, and certain + * Android devices. Requires Vulkan 1.0 with the following extensions and + * device features: + * + * - `VK_KHR_swapchain` + * - `VK_KHR_maintenance1` + * - `independentBlend` + * - `imageCubeArray` + * - `depthClamp` + * - `shaderClipDistance` + * - `drawIndirectFirstInstance` + * + * **D3D12:** Supported on Windows 10 or newer, Xbox One (GDK), and Xbox + * Series X|S (GDK). Requires a GPU that supports DirectX 12 Feature Level + * 11_1. + * + * **Metal:** Supported on macOS 10.14+ and iOS/tvOS 13.0+. Hardware + * requirements vary by operating system: + * + * - macOS requires an Apple Silicon or + * [Intel Mac2 family](https://developer.apple.com/documentation/metal/mtlfeatureset/mtlfeatureset_macos_gpufamily2_v1?language=objc) + * GPU + * - iOS/tvOS requires an A9 GPU or newer + * - iOS Simulator and tvOS Simulator are unsupported + * + * ## Uniform Data + * + * Uniforms are for passing data to shaders. The uniform data will be constant + * across all executions of the shader. + * + * There are 4 available uniform slots per shader stage (where the stages are + * vertex, fragment, and compute). Uniform data pushed to a slot on a stage + * keeps its value throughout the command buffer until you call the relevant + * Push function on that slot again. + * + * For example, you could write your vertex shaders to read a camera matrix + * from uniform binding slot 0, push the camera matrix at the start of the + * command buffer, and that data will be used for every subsequent draw call. + * + * It is valid to push uniform data during a render or compute pass. + * + * Uniforms are best for pushing small amounts of data. If you are pushing + * more than a matrix or two per call you should consider using a storage + * buffer instead. + * + * ## A Note On Cycling + * + * When using a command buffer, operations do not occur immediately - they + * occur some time after the command buffer is submitted. + * + * When a resource is used in a pending or active command buffer, it is + * considered to be "bound". When a resource is no longer used in any pending + * or active command buffers, it is considered to be "unbound". + * + * If data resources are bound, it is unspecified when that data will be + * unbound unless you acquire a fence when submitting the command buffer and + * wait on it. However, this doesn't mean you need to track resource usage + * manually. + * + * All of the functions and structs that involve writing to a resource have a + * "cycle" bool. SDL_GPUTransferBuffer, SDL_GPUBuffer, and SDL_GPUTexture all + * effectively function as ring buffers on internal resources. When cycle is + * true, if the resource is bound, the cycle rotates to the next unbound + * internal resource, or if none are available, a new one is created. This + * means you don't have to worry about complex state tracking and + * synchronization as long as cycling is correctly employed. + * + * For example: you can call SDL_MapGPUTransferBuffer(), write texture data, + * SDL_UnmapGPUTransferBuffer(), and then SDL_UploadToGPUTexture(). The next + * time you write texture data to the transfer buffer, if you set the cycle + * param to true, you don't have to worry about overwriting any data that is + * not yet uploaded. + * + * Another example: If you are using a texture in a render pass every frame, + * this can cause a data dependency between frames. If you set cycle to true + * in the SDL_GPUColorTargetInfo struct, you can prevent this data dependency. + * + * Cycling will never undefine already bound data. When cycling, all data in + * the resource is considered to be undefined for subsequent commands until + * that data is written again. You must take care not to read undefined data. + * + * Note that when cycling a texture, the entire texture will be cycled, even + * if only part of the texture is used in the call, so you must consider the + * entire texture to contain undefined data after cycling. + * + * You must also take care not to overwrite a section of data that has been + * referenced in a command without cycling first. It is OK to overwrite + * unreferenced data in a bound resource without cycling, but overwriting a + * section of data that has already been referenced will produce unexpected + * results. */ #ifndef SDL_gpu_h_ @@ -44,132 +318,394 @@ extern "C" { /* Type Declarations */ +/** + * An opaque handle representing the SDL_GPU context. + * + * \since This struct is available since SDL 3.2.0. + */ typedef struct SDL_GPUDevice SDL_GPUDevice; + +/** + * An opaque handle representing a buffer. + * + * Used for vertices, indices, indirect draw commands, and general compute + * data. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUBuffer + * \sa SDL_UploadToGPUBuffer + * \sa SDL_DownloadFromGPUBuffer + * \sa SDL_CopyGPUBufferToBuffer + * \sa SDL_BindGPUVertexBuffers + * \sa SDL_BindGPUIndexBuffer + * \sa SDL_BindGPUVertexStorageBuffers + * \sa SDL_BindGPUFragmentStorageBuffers + * \sa SDL_DrawGPUPrimitivesIndirect + * \sa SDL_DrawGPUIndexedPrimitivesIndirect + * \sa SDL_BindGPUComputeStorageBuffers + * \sa SDL_DispatchGPUComputeIndirect + * \sa SDL_ReleaseGPUBuffer + */ typedef struct SDL_GPUBuffer SDL_GPUBuffer; + +/** + * An opaque handle representing a transfer buffer. + * + * Used for transferring data to and from the device. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTransferBuffer + * \sa SDL_MapGPUTransferBuffer + * \sa SDL_UnmapGPUTransferBuffer + * \sa SDL_UploadToGPUBuffer + * \sa SDL_UploadToGPUTexture + * \sa SDL_DownloadFromGPUBuffer + * \sa SDL_DownloadFromGPUTexture + * \sa SDL_ReleaseGPUTransferBuffer + */ typedef struct SDL_GPUTransferBuffer SDL_GPUTransferBuffer; + +/** + * An opaque handle representing a texture. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + * \sa SDL_UploadToGPUTexture + * \sa SDL_DownloadFromGPUTexture + * \sa SDL_CopyGPUTextureToTexture + * \sa SDL_BindGPUVertexSamplers + * \sa SDL_BindGPUVertexStorageTextures + * \sa SDL_BindGPUFragmentSamplers + * \sa SDL_BindGPUFragmentStorageTextures + * \sa SDL_BindGPUComputeStorageTextures + * \sa SDL_GenerateMipmapsForGPUTexture + * \sa SDL_BlitGPUTexture + * \sa SDL_ReleaseGPUTexture + */ typedef struct SDL_GPUTexture SDL_GPUTexture; + +/** + * An opaque handle representing a sampler. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUSampler + * \sa SDL_BindGPUVertexSamplers + * \sa SDL_BindGPUFragmentSamplers + * \sa SDL_ReleaseGPUSampler + */ typedef struct SDL_GPUSampler SDL_GPUSampler; + +/** + * An opaque handle representing a compiled shader object. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUShader + * \sa SDL_CreateGPUGraphicsPipeline + * \sa SDL_ReleaseGPUShader + */ typedef struct SDL_GPUShader SDL_GPUShader; + +/** + * An opaque handle representing a compute pipeline. + * + * Used during compute passes. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUComputePipeline + * \sa SDL_BindGPUComputePipeline + * \sa SDL_ReleaseGPUComputePipeline + */ typedef struct SDL_GPUComputePipeline SDL_GPUComputePipeline; + +/** + * An opaque handle representing a graphics pipeline. + * + * Used during render passes. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + * \sa SDL_BindGPUGraphicsPipeline + * \sa SDL_ReleaseGPUGraphicsPipeline + */ typedef struct SDL_GPUGraphicsPipeline SDL_GPUGraphicsPipeline; + +/** + * An opaque handle representing a command buffer. + * + * Most state is managed via command buffers. When setting state using a + * command buffer, that state is local to the command buffer. + * + * Commands only begin execution on the GPU once SDL_SubmitGPUCommandBuffer is + * called. Once the command buffer is submitted, it is no longer valid to use + * it. + * + * Command buffers are executed in submission order. If you submit command + * buffer A and then command buffer B all commands in A will begin executing + * before any command in B begins executing. + * + * In multi-threading scenarios, you should only access a command buffer on + * the thread you acquired it from. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_AcquireGPUCommandBuffer + * \sa SDL_SubmitGPUCommandBuffer + * \sa SDL_SubmitGPUCommandBufferAndAcquireFence + */ typedef struct SDL_GPUCommandBuffer SDL_GPUCommandBuffer; + +/** + * An opaque handle representing a render pass. + * + * This handle is transient and should not be held or referenced after + * SDL_EndGPURenderPass is called. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPURenderPass + * \sa SDL_EndGPURenderPass + */ typedef struct SDL_GPURenderPass SDL_GPURenderPass; + +/** + * An opaque handle representing a compute pass. + * + * This handle is transient and should not be held or referenced after + * SDL_EndGPUComputePass is called. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPUComputePass + * \sa SDL_EndGPUComputePass + */ typedef struct SDL_GPUComputePass SDL_GPUComputePass; + +/** + * An opaque handle representing a copy pass. + * + * This handle is transient and should not be held or referenced after + * SDL_EndGPUCopyPass is called. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPUCopyPass + * \sa SDL_EndGPUCopyPass + */ typedef struct SDL_GPUCopyPass SDL_GPUCopyPass; + +/** + * An opaque handle representing a fence. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_SubmitGPUCommandBufferAndAcquireFence + * \sa SDL_QueryGPUFence + * \sa SDL_WaitForGPUFences + * \sa SDL_ReleaseGPUFence + */ typedef struct SDL_GPUFence SDL_GPUFence; +/** + * Specifies the primitive topology of a graphics pipeline. + * + * If you are using POINTLIST you must include a point size output in the + * vertex shader. + * + * - For HLSL compiling to SPIRV you must decorate a float output with + * [[vk::builtin("PointSize")]]. + * - For GLSL you must set the gl_PointSize builtin. + * - For MSL you must include a float output with the [[point_size]] + * decorator. + * + * Note that sized point topology is totally unsupported on D3D12. Any size + * other than 1 will be ignored. In general, you should avoid using point + * topology for both compatibility and performance reasons. You WILL regret + * using it. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUPrimitiveType { - SDL_GPU_PRIMITIVETYPE_POINTLIST, - SDL_GPU_PRIMITIVETYPE_LINELIST, - SDL_GPU_PRIMITIVETYPE_LINESTRIP, - SDL_GPU_PRIMITIVETYPE_TRIANGLELIST, - SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP + SDL_GPU_PRIMITIVETYPE_TRIANGLELIST, /**< A series of separate triangles. */ + SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP, /**< A series of connected triangles. */ + SDL_GPU_PRIMITIVETYPE_LINELIST, /**< A series of separate lines. */ + SDL_GPU_PRIMITIVETYPE_LINESTRIP, /**< A series of connected lines. */ + SDL_GPU_PRIMITIVETYPE_POINTLIST /**< A series of separate points. */ } SDL_GPUPrimitiveType; +/** + * Specifies how the contents of a texture attached to a render pass are + * treated at the beginning of the render pass. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_BeginGPURenderPass + */ typedef enum SDL_GPULoadOp { - SDL_GPU_LOADOP_LOAD, - SDL_GPU_LOADOP_CLEAR, - SDL_GPU_LOADOP_DONT_CARE + SDL_GPU_LOADOP_LOAD, /**< The previous contents of the texture will be preserved. */ + SDL_GPU_LOADOP_CLEAR, /**< The contents of the texture will be cleared to a color. */ + SDL_GPU_LOADOP_DONT_CARE /**< The previous contents of the texture need not be preserved. The contents will be undefined. */ } SDL_GPULoadOp; +/** + * Specifies how the contents of a texture attached to a render pass are + * treated at the end of the render pass. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_BeginGPURenderPass + */ typedef enum SDL_GPUStoreOp { - SDL_GPU_STOREOP_STORE, - SDL_GPU_STOREOP_DONT_CARE + SDL_GPU_STOREOP_STORE, /**< The contents generated during the render pass will be written to memory. */ + SDL_GPU_STOREOP_DONT_CARE, /**< The contents generated during the render pass are not needed and may be discarded. The contents will be undefined. */ + SDL_GPU_STOREOP_RESOLVE, /**< The multisample contents generated during the render pass will be resolved to a non-multisample texture. The contents in the multisample texture may then be discarded and will be undefined. */ + SDL_GPU_STOREOP_RESOLVE_AND_STORE /**< The multisample contents generated during the render pass will be resolved to a non-multisample texture. The contents in the multisample texture will be written to memory. */ } SDL_GPUStoreOp; +/** + * Specifies the size of elements in an index buffer. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUIndexElementSize { - SDL_GPU_INDEXELEMENTSIZE_16BIT, - SDL_GPU_INDEXELEMENTSIZE_32BIT + SDL_GPU_INDEXELEMENTSIZE_16BIT, /**< The index elements are 16-bit. */ + SDL_GPU_INDEXELEMENTSIZE_32BIT /**< The index elements are 32-bit. */ } SDL_GPUIndexElementSize; -/* Texture format support varies depending on driver, hardware, and usage flags. - * In general, you should use SDL_GPUTextureSupportsFormat to query if a format - * is supported before using it. However, there are a few guaranteed formats. +/** + * Specifies the pixel format of a texture. + * + * Texture format support varies depending on driver, hardware, and usage + * flags. In general, you should use SDL_GPUTextureSupportsFormat to query if + * a format is supported before using it. However, there are a few guaranteed + * formats. + * + * FIXME: Check universal support for 32-bit component formats FIXME: Check + * universal support for SIMULTANEOUS_READ_WRITE * * For SAMPLER usage, the following formats are universally supported: - * - R8G8B8A8_UNORM - * - B8G8R8A8_UNORM - * - R8_UNORM - * - R8G8_SNORM - * - R8G8B8A8_SNORM - * - R16_FLOAT - * - R16G16_FLOAT - * - R16G16B16A16_FLOAT - * - R32_FLOAT - * - R32G32_FLOAT - * - R32G32B32A32_FLOAT - * - R8G8B8A8_UNORM_SRGB - * - B8G8R8A8_UNORM_SRGB - * - D16_UNORM + * + * - R8G8B8A8_UNORM + * - B8G8R8A8_UNORM + * - R8_UNORM + * - R8_SNORM + * - R8G8_UNORM + * - R8G8_SNORM + * - R8G8B8A8_SNORM + * - R16_FLOAT + * - R16G16_FLOAT + * - R16G16B16A16_FLOAT + * - R32_FLOAT + * - R32G32_FLOAT + * - R32G32B32A32_FLOAT + * - R11G11B10_UFLOAT + * - R8G8B8A8_UNORM_SRGB + * - B8G8R8A8_UNORM_SRGB + * - D16_UNORM * * For COLOR_TARGET usage, the following formats are universally supported: - * - R8G8B8A8_UNORM - * - B8G8R8A8_UNORM - * - R8_UNORM - * - R16_FLOAT - * - R16G16_FLOAT - * - R16G16B16A16_FLOAT - * - R32_FLOAT - * - R32G32_FLOAT - * - R32G32B32A32_FLOAT - * - R8_UINT - * - R8G8_UINT - * - R8G8B8A8_UINT - * - R16_UINT - * - R16G16_UINT - * - R16G16B16A16_UINT - * - R8G8B8A8_UNORM_SRGB - * - B8G8R8A8_UNORM_SRGB + * + * - R8G8B8A8_UNORM + * - B8G8R8A8_UNORM + * - R8_UNORM + * - R16_FLOAT + * - R16G16_FLOAT + * - R16G16B16A16_FLOAT + * - R32_FLOAT + * - R32G32_FLOAT + * - R32G32B32A32_FLOAT + * - R8_UINT + * - R8G8_UINT + * - R8G8B8A8_UINT + * - R16_UINT + * - R16G16_UINT + * - R16G16B16A16_UINT + * - R8_INT + * - R8G8_INT + * - R8G8B8A8_INT + * - R16_INT + * - R16G16_INT + * - R16G16B16A16_INT + * - R8G8B8A8_UNORM_SRGB + * - B8G8R8A8_UNORM_SRGB * * For STORAGE usages, the following formats are universally supported: - * - R8G8B8A8_UNORM - * - R8G8B8A8_SNORM - * - R16G16B16A16_FLOAT - * - R32_FLOAT - * - R32G32_FLOAT - * - R32G32B32A32_FLOAT - * - R8_UINT - * - R8G8_UINT - * - R8G8B8A8_UINT - * - R16_UINT - * - R16G16_UINT - * - R16G16B16A16_UINT * - * For DEPTH_STENCIL_TARGET usage, the following formats are universally supported: - * - D16_UNORM - * - Either (but not necessarily both!) D24_UNORM or D32_SFLOAT - * - Either (but not necessarily both!) D24_UNORM_S8_UINT or D32_SFLOAT_S8_UINT + * - R8G8B8A8_UNORM + * - R8G8B8A8_SNORM + * - R16G16B16A16_FLOAT + * - R32_FLOAT + * - R32G32_FLOAT + * - R32G32B32A32_FLOAT + * - R8G8B8A8_UINT + * - R16G16B16A16_UINT + * - R8G8B8A8_INT + * - R16G16B16A16_INT * - * Unless D16_UNORM is sufficient for your purposes, always check which - * of D24/D32 is supported before creating a depth-stencil texture! + * For DEPTH_STENCIL_TARGET usage, the following formats are universally + * supported: + * + * - D16_UNORM + * - Either (but not necessarily both!) D24_UNORM or D32_FLOAT + * - Either (but not necessarily both!) D24_UNORM_S8_UINT or D32_FLOAT_S8_UINT + * + * Unless D16_UNORM is sufficient for your purposes, always check which of + * D24/D32 is supported before creating a depth-stencil texture! + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + * \sa SDL_GPUTextureSupportsFormat */ typedef enum SDL_GPUTextureFormat { - SDL_GPU_TEXTUREFORMAT_INVALID = -1, + SDL_GPU_TEXTUREFORMAT_INVALID, /* Unsigned Normalized Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_A8_UNORM, + SDL_GPU_TEXTUREFORMAT_R8_UNORM, + SDL_GPU_TEXTUREFORMAT_R8G8_UNORM, SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM, - SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, + SDL_GPU_TEXTUREFORMAT_R16_UNORM, + SDL_GPU_TEXTUREFORMAT_R16G16_UNORM, + SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM, + SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM, SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM, SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM, SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM, - SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM, - SDL_GPU_TEXTUREFORMAT_R16G16_UNORM, - SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM, - SDL_GPU_TEXTUREFORMAT_R8_UNORM, - SDL_GPU_TEXTUREFORMAT_A8_UNORM, + SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, /* Compressed Unsigned Normalized Float Color Formats */ - SDL_GPU_TEXTUREFORMAT_BC1_UNORM, - SDL_GPU_TEXTUREFORMAT_BC2_UNORM, - SDL_GPU_TEXTUREFORMAT_BC3_UNORM, - SDL_GPU_TEXTUREFORMAT_BC7_UNORM, + SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM, + SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM, + SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM, + SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM, + SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM, + SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM, + /* Compressed Signed Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT, + /* Compressed Unsigned Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT, /* Signed Normalized Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_R8_SNORM, SDL_GPU_TEXTUREFORMAT_R8G8_SNORM, SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM, + SDL_GPU_TEXTUREFORMAT_R16_SNORM, + SDL_GPU_TEXTUREFORMAT_R16G16_SNORM, + SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM, /* Signed Float Color Formats */ SDL_GPU_TEXTUREFORMAT_R16_FLOAT, SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT, @@ -177,6 +713,8 @@ typedef enum SDL_GPUTextureFormat SDL_GPU_TEXTUREFORMAT_R32_FLOAT, SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT, SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT, + /* Unsigned Float Color Formats */ + SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT, /* Unsigned Integer Color Formats */ SDL_GPU_TEXTUREFORMAT_R8_UINT, SDL_GPU_TEXTUREFORMAT_R8G8_UINT, @@ -184,48 +722,153 @@ typedef enum SDL_GPUTextureFormat SDL_GPU_TEXTUREFORMAT_R16_UINT, SDL_GPU_TEXTUREFORMAT_R16G16_UINT, SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT, + SDL_GPU_TEXTUREFORMAT_R32_UINT, + SDL_GPU_TEXTUREFORMAT_R32G32_UINT, + SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT, + /* Signed Integer Color Formats */ + SDL_GPU_TEXTUREFORMAT_R8_INT, + SDL_GPU_TEXTUREFORMAT_R8G8_INT, + SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT, + SDL_GPU_TEXTUREFORMAT_R16_INT, + SDL_GPU_TEXTUREFORMAT_R16G16_INT, + SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT, + SDL_GPU_TEXTUREFORMAT_R32_INT, + SDL_GPU_TEXTUREFORMAT_R32G32_INT, + SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT, /* SRGB Unsigned Normalized Color Formats */ SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB, SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB, /* Compressed SRGB Unsigned Normalized Color Formats */ - SDL_GPU_TEXTUREFORMAT_BC3_UNORM_SRGB, - SDL_GPU_TEXTUREFORMAT_BC7_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB, /* Depth Formats */ SDL_GPU_TEXTUREFORMAT_D16_UNORM, SDL_GPU_TEXTUREFORMAT_D24_UNORM, SDL_GPU_TEXTUREFORMAT_D32_FLOAT, SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT, - SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT + SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT, + /* Compressed ASTC Normalized Float Color Formats*/ + SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM, + SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM, + /* Compressed SRGB ASTC Normalized Float Color Formats*/ + SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB, + SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB, + /* Compressed ASTC Signed Float Color Formats*/ + SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT, + SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT } SDL_GPUTextureFormat; -typedef enum SDL_GPUTextureUsageFlagBits -{ - SDL_GPU_TEXTUREUSAGE_SAMPLER_BIT = 0x00000001, - SDL_GPU_TEXTUREUSAGE_COLOR_TARGET_BIT = 0x00000002, - SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET_BIT = 0x00000004, - SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ_BIT = 0x00000008, - SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ_BIT = 0x00000020, - SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE_BIT = 0x00000040 -} SDL_GPUTextureUsageFlagBits; - +/** + * Specifies how a texture is intended to be used by the client. + * + * A texture must have at least one usage flag. Note that some usage flag + * combinations are invalid. + * + * With regards to compute storage usage, READ | WRITE means that you can have + * shader A that only writes into the texture and shader B that only reads + * from the texture and bind the same texture to either shader respectively. + * SIMULTANEOUS means that you can do reads and writes within the same shader + * or compute pass. It also implies that atomic ops can be used, since those + * are read-modify-write operations. If you use SIMULTANEOUS, you are + * responsible for avoiding data races, as there is no data synchronization + * within a compute pass. Note that SIMULTANEOUS usage is only supported by a + * limited number of texture formats. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + */ typedef Uint32 SDL_GPUTextureUsageFlags; +#define SDL_GPU_TEXTUREUSAGE_SAMPLER (1u << 0) /**< Texture supports sampling. */ +#define SDL_GPU_TEXTUREUSAGE_COLOR_TARGET (1u << 1) /**< Texture is a color render target. */ +#define SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET (1u << 2) /**< Texture is a depth stencil target. */ +#define SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ (1u << 3) /**< Texture supports storage reads in graphics stages. */ +#define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ (1u << 4) /**< Texture supports storage reads in the compute stage. */ +#define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE (1u << 5) /**< Texture supports storage writes in the compute stage. */ +#define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE (1u << 6) /**< Texture supports reads and writes in the same compute shader. This is NOT equivalent to READ | WRITE. */ + +/** + * Specifies the type of a texture. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + */ typedef enum SDL_GPUTextureType { - SDL_GPU_TEXTURETYPE_2D, - SDL_GPU_TEXTURETYPE_2D_ARRAY, - SDL_GPU_TEXTURETYPE_3D, - SDL_GPU_TEXTURETYPE_CUBE + SDL_GPU_TEXTURETYPE_2D, /**< The texture is a 2-dimensional image. */ + SDL_GPU_TEXTURETYPE_2D_ARRAY, /**< The texture is a 2-dimensional array image. */ + SDL_GPU_TEXTURETYPE_3D, /**< The texture is a 3-dimensional image. */ + SDL_GPU_TEXTURETYPE_CUBE, /**< The texture is a cube image. */ + SDL_GPU_TEXTURETYPE_CUBE_ARRAY /**< The texture is a cube array image. */ } SDL_GPUTextureType; +/** + * Specifies the sample count of a texture. + * + * Used in multisampling. Note that this value only applies when the texture + * is used as a render target. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + * \sa SDL_GPUTextureSupportsSampleCount + */ typedef enum SDL_GPUSampleCount { - SDL_GPU_SAMPLECOUNT_1, - SDL_GPU_SAMPLECOUNT_2, - SDL_GPU_SAMPLECOUNT_4, - SDL_GPU_SAMPLECOUNT_8 + SDL_GPU_SAMPLECOUNT_1, /**< No multisampling. */ + SDL_GPU_SAMPLECOUNT_2, /**< MSAA 2x */ + SDL_GPU_SAMPLECOUNT_4, /**< MSAA 4x */ + SDL_GPU_SAMPLECOUNT_8 /**< MSAA 8x */ } SDL_GPUSampleCount; + +/** + * Specifies the face of a cube map. + * + * Can be passed in as the layer field in texture-related structs. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_GPUCubeMapFace { SDL_GPU_CUBEMAPFACE_POSITIVEX, @@ -236,45 +879,87 @@ typedef enum SDL_GPUCubeMapFace SDL_GPU_CUBEMAPFACE_NEGATIVEZ } SDL_GPUCubeMapFace; -typedef enum SDL_GPUBufferUsageFlagBits -{ - SDL_GPU_BUFFERUSAGE_VERTEX_BIT = 0x00000001, - SDL_GPU_BUFFERUSAGE_INDEX_BIT = 0x00000002, - SDL_GPU_BUFFERUSAGE_INDIRECT_BIT = 0x00000004, - SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ_BIT = 0x00000008, - SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ_BIT = 0x00000020, - SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE_BIT = 0x00000040 -} SDL_GPUBufferUsageFlagBits; - +/** + * Specifies how a buffer is intended to be used by the client. + * + * A buffer must have at least one usage flag. Note that some usage flag + * combinations are invalid. + * + * Unlike textures, READ | WRITE can be used for simultaneous read-write + * usage. The same data synchronization concerns as textures apply. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUBuffer + */ typedef Uint32 SDL_GPUBufferUsageFlags; +#define SDL_GPU_BUFFERUSAGE_VERTEX (1u << 0) /**< Buffer is a vertex buffer. */ +#define SDL_GPU_BUFFERUSAGE_INDEX (1u << 1) /**< Buffer is an index buffer. */ +#define SDL_GPU_BUFFERUSAGE_INDIRECT (1u << 2) /**< Buffer is an indirect buffer. */ +#define SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ (1u << 3) /**< Buffer supports storage reads in graphics stages. */ +#define SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ (1u << 4) /**< Buffer supports storage reads in the compute stage. */ +#define SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE (1u << 5) /**< Buffer supports storage writes in the compute stage. */ + +/** + * Specifies how a transfer buffer is intended to be used by the client. + * + * Note that mapping and copying FROM an upload transfer buffer or TO a + * download transfer buffer is undefined behavior. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTransferBuffer + */ typedef enum SDL_GPUTransferBufferUsage { SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD, SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD } SDL_GPUTransferBufferUsage; +/** + * Specifies which stage a shader program corresponds to. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUShader + */ typedef enum SDL_GPUShaderStage { SDL_GPU_SHADERSTAGE_VERTEX, SDL_GPU_SHADERSTAGE_FRAGMENT } SDL_GPUShaderStage; -typedef enum SDL_GPUShaderFormatFlagBits -{ - SDL_GPU_SHADERFORMAT_INVALID = 0x00000000, - SDL_GPU_SHADERFORMAT_SECRET = 0x00000001, /* NDA'd platforms */ - SDL_GPU_SHADERFORMAT_SPIRV = 0x00000002, /* Vulkan */ - SDL_GPU_SHADERFORMAT_DXBC = 0x00000004, /* D3D11 (Shader Model 5_0) */ - SDL_GPU_SHADERFORMAT_DXIL = 0x00000008, /* D3D12 */ - SDL_GPU_SHADERFORMAT_MSL = 0x00000010, /* Metal */ - SDL_GPU_SHADERFORMAT_METALLIB = 0x00000020, /* Metal */ -} SDL_GPUShaderFormatFlagBits; - +/** + * Specifies the format of shader code. + * + * Each format corresponds to a specific backend that accepts it. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUShader + */ typedef Uint32 SDL_GPUShaderFormat; +#define SDL_GPU_SHADERFORMAT_INVALID 0 +#define SDL_GPU_SHADERFORMAT_PRIVATE (1u << 0) /**< Shaders for NDA'd platforms. */ +#define SDL_GPU_SHADERFORMAT_SPIRV (1u << 1) /**< SPIR-V shaders for Vulkan. */ +#define SDL_GPU_SHADERFORMAT_DXBC (1u << 2) /**< DXBC SM5_1 shaders for D3D12. */ +#define SDL_GPU_SHADERFORMAT_DXIL (1u << 3) /**< DXIL SM6_0 shaders for D3D12. */ +#define SDL_GPU_SHADERFORMAT_MSL (1u << 4) /**< MSL shaders for Metal. */ +#define SDL_GPU_SHADERFORMAT_METALLIB (1u << 5) /**< Precompiled metallib shaders for Metal. */ + +/** + * Specifies the format of a vertex attribute. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUVertexElementFormat { + SDL_GPU_VERTEXELEMENTFORMAT_INVALID, + /* 32-bit Signed Integers */ SDL_GPU_VERTEXELEMENTFORMAT_INT, SDL_GPU_VERTEXELEMENTFORMAT_INT2, @@ -330,125 +1015,230 @@ typedef enum SDL_GPUVertexElementFormat SDL_GPU_VERTEXELEMENTFORMAT_HALF4 } SDL_GPUVertexElementFormat; +/** + * Specifies the rate at which vertex attributes are pulled from buffers. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUVertexInputRate { - SDL_GPU_VERTEXINPUTRATE_VERTEX = 0, - SDL_GPU_VERTEXINPUTRATE_INSTANCE = 1 + SDL_GPU_VERTEXINPUTRATE_VERTEX, /**< Attribute addressing is a function of the vertex index. */ + SDL_GPU_VERTEXINPUTRATE_INSTANCE /**< Attribute addressing is a function of the instance index. */ } SDL_GPUVertexInputRate; +/** + * Specifies the fill mode of the graphics pipeline. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUFillMode { - SDL_GPU_FILLMODE_FILL, - SDL_GPU_FILLMODE_LINE + SDL_GPU_FILLMODE_FILL, /**< Polygons will be rendered via rasterization. */ + SDL_GPU_FILLMODE_LINE /**< Polygon edges will be drawn as line segments. */ } SDL_GPUFillMode; +/** + * Specifies the facing direction in which triangle faces will be culled. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUCullMode { - SDL_GPU_CULLMODE_NONE, - SDL_GPU_CULLMODE_FRONT, - SDL_GPU_CULLMODE_BACK + SDL_GPU_CULLMODE_NONE, /**< No triangles are culled. */ + SDL_GPU_CULLMODE_FRONT, /**< Front-facing triangles are culled. */ + SDL_GPU_CULLMODE_BACK /**< Back-facing triangles are culled. */ } SDL_GPUCullMode; +/** + * Specifies the vertex winding that will cause a triangle to be determined to + * be front-facing. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUFrontFace { - SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE, - SDL_GPU_FRONTFACE_CLOCKWISE + SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE, /**< A triangle with counter-clockwise vertex winding will be considered front-facing. */ + SDL_GPU_FRONTFACE_CLOCKWISE /**< A triangle with clockwise vertex winding will be considered front-facing. */ } SDL_GPUFrontFace; +/** + * Specifies a comparison operator for depth, stencil and sampler operations. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUCompareOp { - SDL_GPU_COMPAREOP_NEVER, - SDL_GPU_COMPAREOP_LESS, - SDL_GPU_COMPAREOP_EQUAL, - SDL_GPU_COMPAREOP_LESS_OR_EQUAL, - SDL_GPU_COMPAREOP_GREATER, - SDL_GPU_COMPAREOP_NOT_EQUAL, - SDL_GPU_COMPAREOP_GREATER_OR_EQUAL, - SDL_GPU_COMPAREOP_ALWAYS + SDL_GPU_COMPAREOP_INVALID, + SDL_GPU_COMPAREOP_NEVER, /**< The comparison always evaluates false. */ + SDL_GPU_COMPAREOP_LESS, /**< The comparison evaluates reference < test. */ + SDL_GPU_COMPAREOP_EQUAL, /**< The comparison evaluates reference == test. */ + SDL_GPU_COMPAREOP_LESS_OR_EQUAL, /**< The comparison evaluates reference <= test. */ + SDL_GPU_COMPAREOP_GREATER, /**< The comparison evaluates reference > test. */ + SDL_GPU_COMPAREOP_NOT_EQUAL, /**< The comparison evaluates reference != test. */ + SDL_GPU_COMPAREOP_GREATER_OR_EQUAL, /**< The comparison evalutes reference >= test. */ + SDL_GPU_COMPAREOP_ALWAYS /**< The comparison always evaluates true. */ } SDL_GPUCompareOp; +/** + * Specifies what happens to a stored stencil value if stencil tests fail or + * pass. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUStencilOp { - SDL_GPU_STENCILOP_KEEP, - SDL_GPU_STENCILOP_ZERO, - SDL_GPU_STENCILOP_REPLACE, - SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP, - SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP, - SDL_GPU_STENCILOP_INVERT, - SDL_GPU_STENCILOP_INCREMENT_AND_WRAP, - SDL_GPU_STENCILOP_DECREMENT_AND_WRAP + SDL_GPU_STENCILOP_INVALID, + SDL_GPU_STENCILOP_KEEP, /**< Keeps the current value. */ + SDL_GPU_STENCILOP_ZERO, /**< Sets the value to 0. */ + SDL_GPU_STENCILOP_REPLACE, /**< Sets the value to reference. */ + SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP, /**< Increments the current value and clamps to the maximum value. */ + SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP, /**< Decrements the current value and clamps to 0. */ + SDL_GPU_STENCILOP_INVERT, /**< Bitwise-inverts the current value. */ + SDL_GPU_STENCILOP_INCREMENT_AND_WRAP, /**< Increments the current value and wraps back to 0. */ + SDL_GPU_STENCILOP_DECREMENT_AND_WRAP /**< Decrements the current value and wraps to the maximum value. */ } SDL_GPUStencilOp; +/** + * Specifies the operator to be used when pixels in a render target are + * blended with existing pixels in the texture. + * + * The source color is the value written by the fragment shader. The + * destination color is the value currently existing in the texture. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUBlendOp { - SDL_GPU_BLENDOP_ADD, - SDL_GPU_BLENDOP_SUBTRACT, - SDL_GPU_BLENDOP_REVERSE_SUBTRACT, - SDL_GPU_BLENDOP_MIN, - SDL_GPU_BLENDOP_MAX + SDL_GPU_BLENDOP_INVALID, + SDL_GPU_BLENDOP_ADD, /**< (source * source_factor) + (destination * destination_factor) */ + SDL_GPU_BLENDOP_SUBTRACT, /**< (source * source_factor) - (destination * destination_factor) */ + SDL_GPU_BLENDOP_REVERSE_SUBTRACT, /**< (destination * destination_factor) - (source * source_factor) */ + SDL_GPU_BLENDOP_MIN, /**< min(source, destination) */ + SDL_GPU_BLENDOP_MAX /**< max(source, destination) */ } SDL_GPUBlendOp; +/** + * Specifies a blending factor to be used when pixels in a render target are + * blended with existing pixels in the texture. + * + * The source color is the value written by the fragment shader. The + * destination color is the value currently existing in the texture. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef enum SDL_GPUBlendFactor { - SDL_GPU_BLENDFACTOR_ZERO, - SDL_GPU_BLENDFACTOR_ONE, - SDL_GPU_BLENDFACTOR_SRC_COLOR, - SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR, - SDL_GPU_BLENDFACTOR_DST_COLOR, - SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR, - SDL_GPU_BLENDFACTOR_SRC_ALPHA, - SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, - SDL_GPU_BLENDFACTOR_DST_ALPHA, - SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA, - SDL_GPU_BLENDFACTOR_CONSTANT_COLOR, - SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR, - SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE + SDL_GPU_BLENDFACTOR_INVALID, + SDL_GPU_BLENDFACTOR_ZERO, /**< 0 */ + SDL_GPU_BLENDFACTOR_ONE, /**< 1 */ + SDL_GPU_BLENDFACTOR_SRC_COLOR, /**< source color */ + SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR, /**< 1 - source color */ + SDL_GPU_BLENDFACTOR_DST_COLOR, /**< destination color */ + SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR, /**< 1 - destination color */ + SDL_GPU_BLENDFACTOR_SRC_ALPHA, /**< source alpha */ + SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, /**< 1 - source alpha */ + SDL_GPU_BLENDFACTOR_DST_ALPHA, /**< destination alpha */ + SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA, /**< 1 - destination alpha */ + SDL_GPU_BLENDFACTOR_CONSTANT_COLOR, /**< blend constant */ + SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR, /**< 1 - blend constant */ + SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE /**< min(source alpha, 1 - destination alpha) */ } SDL_GPUBlendFactor; -typedef enum SDL_GPUColorComponentFlagBits -{ - SDL_GPU_COLORCOMPONENT_R_BIT = 0x00000001, - SDL_GPU_COLORCOMPONENT_G_BIT = 0x00000002, - SDL_GPU_COLORCOMPONENT_B_BIT = 0x00000004, - SDL_GPU_COLORCOMPONENT_A_BIT = 0x00000008 -} SDL_GPUColorComponentFlagBits; - +/** + * Specifies which color components are written in a graphics pipeline. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + */ typedef Uint8 SDL_GPUColorComponentFlags; +#define SDL_GPU_COLORCOMPONENT_R (1u << 0) /**< the red component */ +#define SDL_GPU_COLORCOMPONENT_G (1u << 1) /**< the green component */ +#define SDL_GPU_COLORCOMPONENT_B (1u << 2) /**< the blue component */ +#define SDL_GPU_COLORCOMPONENT_A (1u << 3) /**< the alpha component */ + +/** + * Specifies a filter operation used by a sampler. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUSampler + */ typedef enum SDL_GPUFilter { - SDL_GPU_FILTER_NEAREST, - SDL_GPU_FILTER_LINEAR + SDL_GPU_FILTER_NEAREST, /**< Point filtering. */ + SDL_GPU_FILTER_LINEAR /**< Linear filtering. */ } SDL_GPUFilter; +/** + * Specifies a mipmap mode used by a sampler. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUSampler + */ typedef enum SDL_GPUSamplerMipmapMode { - SDL_GPU_SAMPLERMIPMAPMODE_NEAREST, - SDL_GPU_SAMPLERMIPMAPMODE_LINEAR + SDL_GPU_SAMPLERMIPMAPMODE_NEAREST, /**< Point filtering. */ + SDL_GPU_SAMPLERMIPMAPMODE_LINEAR /**< Linear filtering. */ } SDL_GPUSamplerMipmapMode; +/** + * Specifies behavior of texture sampling when the coordinates exceed the 0-1 + * range. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUSampler + */ typedef enum SDL_GPUSamplerAddressMode { - SDL_GPU_SAMPLERADDRESSMODE_REPEAT, - SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT, - SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE + SDL_GPU_SAMPLERADDRESSMODE_REPEAT, /**< Specifies that the coordinates will wrap around. */ + SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT, /**< Specifies that the coordinates will wrap around mirrored. */ + SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE /**< Specifies that the coordinates will clamp to the 0-1 range. */ } SDL_GPUSamplerAddressMode; -/* - * VSYNC: - * Waits for vblank before presenting. - * If there is a pending image to present, the new image is enqueued for presentation. - * Disallows tearing at the cost of visual latency. - * When using this present mode, AcquireSwapchainTexture will block if too many frames are in flight. - * IMMEDIATE: - * Immediately presents. - * Lowest latency option, but tearing may occur. - * When using this mode, AcquireSwapchainTexture will return NULL if too many frames are in flight. - * MAILBOX: - * Waits for vblank before presenting. No tearing is possible. - * If there is a pending image to present, the pending image is replaced by the new image. - * Similar to VSYNC, but with reduced visual latency. - * When using this mode, AcquireSwapchainTexture will return NULL if too many frames are in flight. +/** + * Specifies the timing that will be used to present swapchain textures to the + * OS. + * + * VSYNC mode will always be supported. IMMEDIATE and MAILBOX modes may not be + * supported on certain systems. + * + * It is recommended to query SDL_WindowSupportsGPUPresentMode after claiming + * the window if you wish to change the present mode to IMMEDIATE or MAILBOX. + * + * - VSYNC: Waits for vblank before presenting. No tearing is possible. If + * there is a pending image to present, the new image is enqueued for + * presentation. Disallows tearing at the cost of visual latency. + * - IMMEDIATE: Immediately presents. Lowest latency option, but tearing may + * occur. + * - MAILBOX: Waits for vblank before presenting. No tearing is possible. If + * there is a pending image to present, the pending image is replaced by the + * new image. Similar to VSYNC, but with reduced visual latency. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_SetGPUSwapchainParameters + * \sa SDL_WindowSupportsGPUPresentMode + * \sa SDL_WaitAndAcquireGPUSwapchainTexture */ typedef enum SDL_GPUPresentMode { @@ -457,493 +1247,866 @@ typedef enum SDL_GPUPresentMode SDL_GPU_PRESENTMODE_MAILBOX } SDL_GPUPresentMode; -/* - * SDR: - * B8G8R8A8 or R8G8B8A8 swapchain. Pixel values are in nonlinear sRGB encoding. Blends raw pixel values. - * SDR_LINEAR: - * B8G8R8A8_SRGB or R8G8B8A8_SRGB swapchain. Pixel values are in nonlinear sRGB encoding. Blends in linear space. - * HDR_EXTENDED_LINEAR: - * R16G16B16A16_SFLOAT swapchain. Pixel values are in extended linear encoding. Blends in linear space. - * HDR10_ST2048: - * A2R10G10B10 or A2B10G10R10 swapchain. Pixel values are in PQ ST2048 encoding. Blends raw pixel values. (TODO: verify this) +/** + * Specifies the texture format and colorspace of the swapchain textures. + * + * SDR will always be supported. Other compositions may not be supported on + * certain systems. + * + * It is recommended to query SDL_WindowSupportsGPUSwapchainComposition after + * claiming the window if you wish to change the swapchain composition from + * SDR. + * + * - SDR: B8G8R8A8 or R8G8B8A8 swapchain. Pixel values are in sRGB encoding. + * - SDR_LINEAR: B8G8R8A8_SRGB or R8G8B8A8_SRGB swapchain. Pixel values are + * stored in memory in sRGB encoding but accessed in shaders in "linear + * sRGB" encoding which is sRGB but with a linear transfer function. + * - HDR_EXTENDED_LINEAR: R16G16B16A16_FLOAT swapchain. Pixel values are in + * extended linear sRGB encoding and permits values outside of the [0, 1] + * range. + * - HDR10_ST2084: A2R10G10B10 or A2B10G10R10 swapchain. Pixel values are in + * BT.2020 ST2084 (PQ) encoding. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_SetGPUSwapchainParameters + * \sa SDL_WindowSupportsGPUSwapchainComposition + * \sa SDL_WaitAndAcquireGPUSwapchainTexture */ typedef enum SDL_GPUSwapchainComposition { SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR, SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR, - SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048 + SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084 } SDL_GPUSwapchainComposition; -typedef enum SDL_GPUDriver -{ - SDL_GPU_DRIVER_INVALID = -1, - SDL_GPU_DRIVER_SECRET, /* NDA'd platforms */ - SDL_GPU_DRIVER_VULKAN, - SDL_GPU_DRIVER_D3D11, - SDL_GPU_DRIVER_D3D12, - SDL_GPU_DRIVER_METAL -} SDL_GPUDriver; - /* Structures */ -typedef struct SDL_GPUDepthStencilValue -{ - float depth; - Uint8 stencil; -} SDL_GPUDepthStencilValue; - +/** + * A structure specifying a viewport. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_SetGPUViewport + */ typedef struct SDL_GPUViewport { - float x; - float y; - float w; - float h; - float minDepth; - float maxDepth; + float x; /**< The left offset of the viewport. */ + float y; /**< The top offset of the viewport. */ + float w; /**< The width of the viewport. */ + float h; /**< The height of the viewport. */ + float min_depth; /**< The minimum depth of the viewport. */ + float max_depth; /**< The maximum depth of the viewport. */ } SDL_GPUViewport; +/** + * A structure specifying parameters related to transferring data to or from a + * texture. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_UploadToGPUTexture + * \sa SDL_DownloadFromGPUTexture + */ typedef struct SDL_GPUTextureTransferInfo { - SDL_GPUTransferBuffer *transferBuffer; - Uint32 offset; /* starting location of the image data */ - Uint32 imagePitch; /* number of pixels from one row to the next */ - Uint32 imageHeight; /* number of rows from one layer/depth-slice to the next */ + SDL_GPUTransferBuffer *transfer_buffer; /**< The transfer buffer used in the transfer operation. */ + Uint32 offset; /**< The starting byte of the image data in the transfer buffer. */ + Uint32 pixels_per_row; /**< The number of pixels from one row to the next. */ + Uint32 rows_per_layer; /**< The number of rows from one layer/depth-slice to the next. */ } SDL_GPUTextureTransferInfo; +/** + * A structure specifying a location in a transfer buffer. + * + * Used when transferring buffer data to or from a transfer buffer. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_UploadToGPUBuffer + * \sa SDL_DownloadFromGPUBuffer + */ typedef struct SDL_GPUTransferBufferLocation { - SDL_GPUTransferBuffer *transferBuffer; - Uint32 offset; + SDL_GPUTransferBuffer *transfer_buffer; /**< The transfer buffer used in the transfer operation. */ + Uint32 offset; /**< The starting byte of the buffer data in the transfer buffer. */ } SDL_GPUTransferBufferLocation; +/** + * A structure specifying a location in a texture. + * + * Used when copying data from one texture to another. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CopyGPUTextureToTexture + */ typedef struct SDL_GPUTextureLocation { - SDL_GPUTexture *texture; - Uint32 mipLevel; - Uint32 layer; - Uint32 x; - Uint32 y; - Uint32 z; + SDL_GPUTexture *texture; /**< The texture used in the copy operation. */ + Uint32 mip_level; /**< The mip level index of the location. */ + Uint32 layer; /**< The layer index of the location. */ + Uint32 x; /**< The left offset of the location. */ + Uint32 y; /**< The top offset of the location. */ + Uint32 z; /**< The front offset of the location. */ } SDL_GPUTextureLocation; +/** + * A structure specifying a region of a texture. + * + * Used when transferring data to or from a texture. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_UploadToGPUTexture + * \sa SDL_DownloadFromGPUTexture + */ typedef struct SDL_GPUTextureRegion { - SDL_GPUTexture *texture; - Uint32 mipLevel; - Uint32 layer; - Uint32 x; - Uint32 y; - Uint32 z; - Uint32 w; - Uint32 h; - Uint32 d; + SDL_GPUTexture *texture; /**< The texture used in the copy operation. */ + Uint32 mip_level; /**< The mip level index to transfer. */ + Uint32 layer; /**< The layer index to transfer. */ + Uint32 x; /**< The left offset of the region. */ + Uint32 y; /**< The top offset of the region. */ + Uint32 z; /**< The front offset of the region. */ + Uint32 w; /**< The width of the region. */ + Uint32 h; /**< The height of the region. */ + Uint32 d; /**< The depth of the region. */ } SDL_GPUTextureRegion; +/** + * A structure specifying a region of a texture used in the blit operation. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BlitGPUTexture + */ typedef struct SDL_GPUBlitRegion { - SDL_GPUTexture *texture; - Uint32 mipLevel; - Uint32 layerOrDepthPlane; - Uint32 x; - Uint32 y; - Uint32 w; - Uint32 h; + SDL_GPUTexture *texture; /**< The texture. */ + Uint32 mip_level; /**< The mip level index of the region. */ + Uint32 layer_or_depth_plane; /**< The layer index or depth plane of the region. This value is treated as a layer index on 2D array and cube textures, and as a depth plane on 3D textures. */ + Uint32 x; /**< The left offset of the region. */ + Uint32 y; /**< The top offset of the region. */ + Uint32 w; /**< The width of the region. */ + Uint32 h; /**< The height of the region. */ } SDL_GPUBlitRegion; +/** + * A structure specifying a location in a buffer. + * + * Used when copying data between buffers. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CopyGPUBufferToBuffer + */ typedef struct SDL_GPUBufferLocation { - SDL_GPUBuffer *buffer; - Uint32 offset; + SDL_GPUBuffer *buffer; /**< The buffer. */ + Uint32 offset; /**< The starting byte within the buffer. */ } SDL_GPUBufferLocation; +/** + * A structure specifying a region of a buffer. + * + * Used when transferring data to or from buffers. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_UploadToGPUBuffer + * \sa SDL_DownloadFromGPUBuffer + */ typedef struct SDL_GPUBufferRegion { - SDL_GPUBuffer *buffer; - Uint32 offset; - Uint32 size; + SDL_GPUBuffer *buffer; /**< The buffer. */ + Uint32 offset; /**< The starting byte within the buffer. */ + Uint32 size; /**< The size in bytes of the region. */ } SDL_GPUBufferRegion; -/* Note that the `firstVertex` and `firstInstance` parameters are NOT compatible with - * built-in vertex/instance ID variables in shaders (for example, SV_VertexID). If - * your shader depends on these variables, the correlating draw call parameter MUST - * be 0. +/** + * A structure specifying the parameters of an indirect draw command. + * + * Note that the `first_vertex` and `first_instance` parameters are NOT + * compatible with built-in vertex/instance ID variables in shaders (for + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_DrawGPUPrimitivesIndirect */ typedef struct SDL_GPUIndirectDrawCommand { - Uint32 vertexCount; /* number of vertices to draw */ - Uint32 instanceCount; /* number of instances to draw */ - Uint32 firstVertex; /* index of the first vertex to draw */ - Uint32 firstInstance; /* ID of the first instance to draw */ + Uint32 num_vertices; /**< The number of vertices to draw. */ + Uint32 num_instances; /**< The number of instances to draw. */ + Uint32 first_vertex; /**< The index of the first vertex to draw. */ + Uint32 first_instance; /**< The ID of the first instance to draw. */ } SDL_GPUIndirectDrawCommand; +/** + * A structure specifying the parameters of an indexed indirect draw command. + * + * Note that the `first_vertex` and `first_instance` parameters are NOT + * compatible with built-in vertex/instance ID variables in shaders (for + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_DrawGPUIndexedPrimitivesIndirect + */ typedef struct SDL_GPUIndexedIndirectDrawCommand { - Uint32 indexCount; /* number of vertices to draw per instance */ - Uint32 instanceCount; /* number of instances to draw */ - Uint32 firstIndex; /* base index within the index buffer */ - Sint32 vertexOffset; /* value added to vertex index before indexing into the vertex buffer */ - Uint32 firstInstance; /* ID of the first instance to draw */ + Uint32 num_indices; /**< The number of indices to draw per instance. */ + Uint32 num_instances; /**< The number of instances to draw. */ + Uint32 first_index; /**< The base index within the index buffer. */ + Sint32 vertex_offset; /**< The value added to the vertex index before indexing into the vertex buffer. */ + Uint32 first_instance; /**< The ID of the first instance to draw. */ } SDL_GPUIndexedIndirectDrawCommand; +/** + * A structure specifying the parameters of an indexed dispatch command. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_DispatchGPUComputeIndirect + */ typedef struct SDL_GPUIndirectDispatchCommand { - Uint32 groupCountX; - Uint32 groupCountY; - Uint32 groupCountZ; + Uint32 groupcount_x; /**< The number of local workgroups to dispatch in the X dimension. */ + Uint32 groupcount_y; /**< The number of local workgroups to dispatch in the Y dimension. */ + Uint32 groupcount_z; /**< The number of local workgroups to dispatch in the Z dimension. */ } SDL_GPUIndirectDispatchCommand; /* State structures */ +/** + * A structure specifying the parameters of a sampler. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUSampler + */ typedef struct SDL_GPUSamplerCreateInfo { - SDL_GPUFilter minFilter; - SDL_GPUFilter magFilter; - SDL_GPUSamplerMipmapMode mipmapMode; - SDL_GPUSamplerAddressMode addressModeU; - SDL_GPUSamplerAddressMode addressModeV; - SDL_GPUSamplerAddressMode addressModeW; - float mipLodBias; - SDL_bool anisotropyEnable; - float maxAnisotropy; - SDL_bool compareEnable; - SDL_GPUCompareOp compareOp; - float minLod; - float maxLod; + SDL_GPUFilter min_filter; /**< The minification filter to apply to lookups. */ + SDL_GPUFilter mag_filter; /**< The magnification filter to apply to lookups. */ + SDL_GPUSamplerMipmapMode mipmap_mode; /**< The mipmap filter to apply to lookups. */ + SDL_GPUSamplerAddressMode address_mode_u; /**< The addressing mode for U coordinates outside [0, 1). */ + SDL_GPUSamplerAddressMode address_mode_v; /**< The addressing mode for V coordinates outside [0, 1). */ + SDL_GPUSamplerAddressMode address_mode_w; /**< The addressing mode for W coordinates outside [0, 1). */ + float mip_lod_bias; /**< The bias to be added to mipmap LOD calculation. */ + float max_anisotropy; /**< The anisotropy value clamp used by the sampler. If enable_anisotropy is false, this is ignored. */ + SDL_GPUCompareOp compare_op; /**< The comparison operator to apply to fetched data before filtering. */ + float min_lod; /**< Clamps the minimum of the computed LOD value. */ + float max_lod; /**< Clamps the maximum of the computed LOD value. */ + bool enable_anisotropy; /**< true to enable anisotropic filtering. */ + bool enable_compare; /**< true to enable comparison against a reference value during lookups. */ + Uint8 padding1; + Uint8 padding2; - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUSamplerCreateInfo; -typedef struct SDL_GPUVertexBinding +/** + * A structure specifying the parameters of vertex buffers used in a graphics + * pipeline. + * + * When you call SDL_BindGPUVertexBuffers, you specify the binding slots of + * the vertex buffers. For example if you called SDL_BindGPUVertexBuffers with + * a first_slot of 2 and num_bindings of 3, the binding slots 2, 3, 4 would be + * used by the vertex buffers you pass in. + * + * Vertex attributes are linked to buffers via the buffer_slot field of + * SDL_GPUVertexAttribute. For example, if an attribute has a buffer_slot of + * 0, then that attribute belongs to the vertex buffer bound at slot 0. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUVertexAttribute + * \sa SDL_GPUVertexInputState + */ +typedef struct SDL_GPUVertexBufferDescription { - Uint32 binding; - Uint32 stride; - SDL_GPUVertexInputRate inputRate; - Uint32 instanceStepRate; /* ignored unless inputRate is INSTANCE */ -} SDL_GPUVertexBinding; + Uint32 slot; /**< The binding slot of the vertex buffer. */ + Uint32 pitch; /**< The byte pitch between consecutive elements of the vertex buffer. */ + SDL_GPUVertexInputRate input_rate; /**< Whether attribute addressing is a function of the vertex index or instance index. */ + Uint32 instance_step_rate; /**< The number of instances to draw using the same per-instance data before advancing in the instance buffer by one element. Ignored unless input_rate is SDL_GPU_VERTEXINPUTRATE_INSTANCE */ +} SDL_GPUVertexBufferDescription; +/** + * A structure specifying a vertex attribute. + * + * All vertex attribute locations provided to an SDL_GPUVertexInputState must + * be unique. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUVertexBufferDescription + * \sa SDL_GPUVertexInputState + */ typedef struct SDL_GPUVertexAttribute { - Uint32 location; - Uint32 binding; - SDL_GPUVertexElementFormat format; - Uint32 offset; + Uint32 location; /**< The shader input location index. */ + Uint32 buffer_slot; /**< The binding slot of the associated vertex buffer. */ + SDL_GPUVertexElementFormat format; /**< The size and type of the attribute data. */ + Uint32 offset; /**< The byte offset of this attribute relative to the start of the vertex element. */ } SDL_GPUVertexAttribute; +/** + * A structure specifying the parameters of a graphics pipeline vertex input + * state. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineCreateInfo + * \sa SDL_GPUVertexBufferDescription + * \sa SDL_GPUVertexAttribute + */ typedef struct SDL_GPUVertexInputState { - const SDL_GPUVertexBinding *vertexBindings; - Uint32 vertexBindingCount; - const SDL_GPUVertexAttribute *vertexAttributes; - Uint32 vertexAttributeCount; + const SDL_GPUVertexBufferDescription *vertex_buffer_descriptions; /**< A pointer to an array of vertex buffer descriptions. */ + Uint32 num_vertex_buffers; /**< The number of vertex buffer descriptions in the above array. */ + const SDL_GPUVertexAttribute *vertex_attributes; /**< A pointer to an array of vertex attribute descriptions. */ + Uint32 num_vertex_attributes; /**< The number of vertex attribute descriptions in the above array. */ } SDL_GPUVertexInputState; +/** + * A structure specifying the stencil operation state of a graphics pipeline. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUDepthStencilState + */ typedef struct SDL_GPUStencilOpState { - SDL_GPUStencilOp failOp; - SDL_GPUStencilOp passOp; - SDL_GPUStencilOp depthFailOp; - SDL_GPUCompareOp compareOp; + SDL_GPUStencilOp fail_op; /**< The action performed on samples that fail the stencil test. */ + SDL_GPUStencilOp pass_op; /**< The action performed on samples that pass the depth and stencil tests. */ + SDL_GPUStencilOp depth_fail_op; /**< The action performed on samples that pass the stencil test and fail the depth test. */ + SDL_GPUCompareOp compare_op; /**< The comparison operator used in the stencil test. */ } SDL_GPUStencilOpState; -typedef struct SDL_GPUColorAttachmentBlendState +/** + * A structure specifying the blend state of a color target. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUColorTargetDescription + */ +typedef struct SDL_GPUColorTargetBlendState { - SDL_bool blendEnable; - SDL_GPUBlendFactor srcColorBlendFactor; - SDL_GPUBlendFactor dstColorBlendFactor; - SDL_GPUBlendOp colorBlendOp; - SDL_GPUBlendFactor srcAlphaBlendFactor; - SDL_GPUBlendFactor dstAlphaBlendFactor; - SDL_GPUBlendOp alphaBlendOp; - SDL_GPUColorComponentFlags colorWriteMask; -} SDL_GPUColorAttachmentBlendState; + SDL_GPUBlendFactor src_color_blendfactor; /**< The value to be multiplied by the source RGB value. */ + SDL_GPUBlendFactor dst_color_blendfactor; /**< The value to be multiplied by the destination RGB value. */ + SDL_GPUBlendOp color_blend_op; /**< The blend operation for the RGB components. */ + SDL_GPUBlendFactor src_alpha_blendfactor; /**< The value to be multiplied by the source alpha. */ + SDL_GPUBlendFactor dst_alpha_blendfactor; /**< The value to be multiplied by the destination alpha. */ + SDL_GPUBlendOp alpha_blend_op; /**< The blend operation for the alpha component. */ + SDL_GPUColorComponentFlags color_write_mask; /**< A bitmask specifying which of the RGBA components are enabled for writing. Writes to all channels if enable_color_write_mask is false. */ + bool enable_blend; /**< Whether blending is enabled for the color target. */ + bool enable_color_write_mask; /**< Whether the color write mask is enabled. */ + Uint8 padding1; + Uint8 padding2; +} SDL_GPUColorTargetBlendState; + +/** + * A structure specifying code and metadata for creating a shader object. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUShader + */ typedef struct SDL_GPUShaderCreateInfo { - size_t codeSize; - const Uint8 *code; - const char *entryPointName; - SDL_GPUShaderFormat format; - SDL_GPUShaderStage stage; - Uint32 samplerCount; - Uint32 storageTextureCount; - Uint32 storageBufferCount; - Uint32 uniformBufferCount; + size_t code_size; /**< The size in bytes of the code pointed to. */ + const Uint8 *code; /**< A pointer to shader code. */ + const char *entrypoint; /**< A pointer to a null-terminated UTF-8 string specifying the entry point function name for the shader. */ + SDL_GPUShaderFormat format; /**< The format of the shader code. */ + SDL_GPUShaderStage stage; /**< The stage the shader program corresponds to. */ + Uint32 num_samplers; /**< The number of samplers defined in the shader. */ + Uint32 num_storage_textures; /**< The number of storage textures defined in the shader. */ + Uint32 num_storage_buffers; /**< The number of storage buffers defined in the shader. */ + Uint32 num_uniform_buffers; /**< The number of uniform buffers defined in the shader. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUShaderCreateInfo; +/** + * A structure specifying the parameters of a texture. + * + * Usage flags can be bitwise OR'd together for combinations of usages. Note + * that certain usage combinations are invalid, for example SAMPLER and + * GRAPHICS_STORAGE. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture + * \sa SDL_GPUTextureType + * \sa SDL_GPUTextureFormat + * \sa SDL_GPUTextureUsageFlags + * \sa SDL_GPUSampleCount + */ typedef struct SDL_GPUTextureCreateInfo { - SDL_GPUTextureType type; - SDL_GPUTextureFormat format; - SDL_GPUTextureUsageFlags usageFlags; - Uint32 width; - Uint32 height; - Uint32 layerCountOrDepth; - Uint32 levelCount; - SDL_GPUSampleCount sampleCount; + SDL_GPUTextureType type; /**< The base dimensionality of the texture. */ + SDL_GPUTextureFormat format; /**< The pixel format of the texture. */ + SDL_GPUTextureUsageFlags usage; /**< How the texture is intended to be used by the client. */ + Uint32 width; /**< The width of the texture. */ + Uint32 height; /**< The height of the texture. */ + Uint32 layer_count_or_depth; /**< The layer count or depth of the texture. This value is treated as a layer count on 2D array textures, and as a depth value on 3D textures. */ + Uint32 num_levels; /**< The number of mip levels in the texture. */ + SDL_GPUSampleCount sample_count; /**< The number of samples per texel. Only applies if the texture is used as a render target. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUTextureCreateInfo; -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_R_FLOAT "SDL.gpu.createtexture.d3d12.clear.r" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_G_FLOAT "SDL.gpu.createtexture.d3d12.clear.g" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_B_FLOAT "SDL.gpu.createtexture.d3d12.clear.b" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_A_FLOAT "SDL.gpu.createtexture.d3d12.clear.a" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_DEPTH_FLOAT "SDL.gpu.createtexture.d3d12.clear.depth" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_STENCIL_UINT8 "SDL.gpu.createtexture.d3d12.clear.stencil" - +/** + * A structure specifying the parameters of a buffer. + * + * Usage flags can be bitwise OR'd together for combinations of usages. Note + * that certain combinations are invalid, for example VERTEX and INDEX. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUBuffer + * \sa SDL_GPUBufferUsageFlags + */ typedef struct SDL_GPUBufferCreateInfo { - SDL_GPUBufferUsageFlags usageFlags; - Uint32 sizeInBytes; + SDL_GPUBufferUsageFlags usage; /**< How the buffer is intended to be used by the client. */ + Uint32 size; /**< The size in bytes of the buffer. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUBufferCreateInfo; +/** + * A structure specifying the parameters of a transfer buffer. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTransferBuffer + */ typedef struct SDL_GPUTransferBufferCreateInfo { - SDL_GPUTransferBufferUsage usage; - Uint32 sizeInBytes; + SDL_GPUTransferBufferUsage usage; /**< How the transfer buffer is intended to be used by the client. */ + Uint32 size; /**< The size in bytes of the transfer buffer. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUTransferBufferCreateInfo; /* Pipeline state structures */ +/** + * A structure specifying the parameters of the graphics pipeline rasterizer + * state. + * + * NOTE: Some backend APIs (D3D11/12) will enable depth clamping even if + * enable_depth_clip is true. If you rely on this clamp+clip behavior, + * consider enabling depth clip and then manually clamping depth in your + * fragment shaders on Metal and Vulkan. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineCreateInfo + */ typedef struct SDL_GPURasterizerState { - SDL_GPUFillMode fillMode; - SDL_GPUCullMode cullMode; - SDL_GPUFrontFace frontFace; - SDL_bool depthBiasEnable; - float depthBiasConstantFactor; - float depthBiasClamp; - float depthBiasSlopeFactor; + SDL_GPUFillMode fill_mode; /**< Whether polygons will be filled in or drawn as lines. */ + SDL_GPUCullMode cull_mode; /**< The facing direction in which triangles will be culled. */ + SDL_GPUFrontFace front_face; /**< The vertex winding that will cause a triangle to be determined as front-facing. */ + float depth_bias_constant_factor; /**< A scalar factor controlling the depth value added to each fragment. */ + float depth_bias_clamp; /**< The maximum depth bias of a fragment. */ + float depth_bias_slope_factor; /**< A scalar factor applied to a fragment's slope in depth calculations. */ + bool enable_depth_bias; /**< true to bias fragment depth values. */ + bool enable_depth_clip; /**< true to enable depth clip, false to enable depth clamp. */ + Uint8 padding1; + Uint8 padding2; } SDL_GPURasterizerState; +/** + * A structure specifying the parameters of the graphics pipeline multisample + * state. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineCreateInfo + */ typedef struct SDL_GPUMultisampleState { - SDL_GPUSampleCount sampleCount; - Uint32 sampleMask; + SDL_GPUSampleCount sample_count; /**< The number of samples to be used in rasterization. */ + Uint32 sample_mask; /**< Determines which samples get updated in the render targets. Treated as 0xFFFFFFFF if enable_mask is false. */ + bool enable_mask; /**< Enables sample masking. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; } SDL_GPUMultisampleState; +/** + * A structure specifying the parameters of the graphics pipeline depth + * stencil state. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineCreateInfo + */ typedef struct SDL_GPUDepthStencilState { - SDL_bool depthTestEnable; - SDL_bool depthWriteEnable; - SDL_GPUCompareOp compareOp; - SDL_bool stencilTestEnable; - SDL_GPUStencilOpState backStencilState; - SDL_GPUStencilOpState frontStencilState; - Uint8 compareMask; - Uint8 writeMask; - Uint8 reference; + SDL_GPUCompareOp compare_op; /**< The comparison operator used for depth testing. */ + SDL_GPUStencilOpState back_stencil_state; /**< The stencil op state for back-facing triangles. */ + SDL_GPUStencilOpState front_stencil_state; /**< The stencil op state for front-facing triangles. */ + Uint8 compare_mask; /**< Selects the bits of the stencil values participating in the stencil test. */ + Uint8 write_mask; /**< Selects the bits of the stencil values updated by the stencil test. */ + bool enable_depth_test; /**< true enables the depth test. */ + bool enable_depth_write; /**< true enables depth writes. Depth writes are always disabled when enable_depth_test is false. */ + bool enable_stencil_test; /**< true enables the stencil test. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; } SDL_GPUDepthStencilState; -typedef struct SDL_GPUColorAttachmentDescription +/** + * A structure specifying the parameters of color targets used in a graphics + * pipeline. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineTargetInfo + */ +typedef struct SDL_GPUColorTargetDescription { - SDL_GPUTextureFormat format; - SDL_GPUColorAttachmentBlendState blendState; -} SDL_GPUColorAttachmentDescription; + SDL_GPUTextureFormat format; /**< The pixel format of the texture to be used as a color target. */ + SDL_GPUColorTargetBlendState blend_state; /**< The blend state to be used for the color target. */ +} SDL_GPUColorTargetDescription; -typedef struct SDL_GPUGraphicsPipelineAttachmentInfo +/** + * A structure specifying the descriptions of render targets used in a + * graphics pipeline. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GPUGraphicsPipelineCreateInfo + */ +typedef struct SDL_GPUGraphicsPipelineTargetInfo { - SDL_GPUColorAttachmentDescription *colorAttachmentDescriptions; - Uint32 colorAttachmentCount; - SDL_bool hasDepthStencilAttachment; - SDL_GPUTextureFormat depthStencilFormat; -} SDL_GPUGraphicsPipelineAttachmentInfo; + const SDL_GPUColorTargetDescription *color_target_descriptions; /**< A pointer to an array of color target descriptions. */ + Uint32 num_color_targets; /**< The number of color target descriptions in the above array. */ + SDL_GPUTextureFormat depth_stencil_format; /**< The pixel format of the depth-stencil target. Ignored if has_depth_stencil_target is false. */ + bool has_depth_stencil_target; /**< true specifies that the pipeline uses a depth-stencil target. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_GPUGraphicsPipelineTargetInfo; +/** + * A structure specifying the parameters of a graphics pipeline state. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUGraphicsPipeline + * \sa SDL_GPUVertexInputState + * \sa SDL_GPUPrimitiveType + * \sa SDL_GPURasterizerState + * \sa SDL_GPUMultisampleState + * \sa SDL_GPUDepthStencilState + * \sa SDL_GPUGraphicsPipelineTargetInfo + */ typedef struct SDL_GPUGraphicsPipelineCreateInfo { - SDL_GPUShader *vertexShader; - SDL_GPUShader *fragmentShader; - SDL_GPUVertexInputState vertexInputState; - SDL_GPUPrimitiveType primitiveType; - SDL_GPURasterizerState rasterizerState; - SDL_GPUMultisampleState multisampleState; - SDL_GPUDepthStencilState depthStencilState; - SDL_GPUGraphicsPipelineAttachmentInfo attachmentInfo; - float blendConstants[4]; + SDL_GPUShader *vertex_shader; /**< The vertex shader used by the graphics pipeline. */ + SDL_GPUShader *fragment_shader; /**< The fragment shader used by the graphics pipeline. */ + SDL_GPUVertexInputState vertex_input_state; /**< The vertex layout of the graphics pipeline. */ + SDL_GPUPrimitiveType primitive_type; /**< The primitive topology of the graphics pipeline. */ + SDL_GPURasterizerState rasterizer_state; /**< The rasterizer state of the graphics pipeline. */ + SDL_GPUMultisampleState multisample_state; /**< The multisample state of the graphics pipeline. */ + SDL_GPUDepthStencilState depth_stencil_state; /**< The depth-stencil state of the graphics pipeline. */ + SDL_GPUGraphicsPipelineTargetInfo target_info; /**< Formats and blend modes for the render targets of the graphics pipeline. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUGraphicsPipelineCreateInfo; +/** + * A structure specifying the parameters of a compute pipeline state. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUComputePipeline + */ typedef struct SDL_GPUComputePipelineCreateInfo { - size_t codeSize; - const Uint8 *code; - const char *entryPointName; - SDL_GPUShaderFormat format; - Uint32 readOnlyStorageTextureCount; - Uint32 readOnlyStorageBufferCount; - Uint32 writeOnlyStorageTextureCount; - Uint32 writeOnlyStorageBufferCount; - Uint32 uniformBufferCount; - Uint32 threadCountX; - Uint32 threadCountY; - Uint32 threadCountZ; + size_t code_size; /**< The size in bytes of the compute shader code pointed to. */ + const Uint8 *code; /**< A pointer to compute shader code. */ + const char *entrypoint; /**< A pointer to a null-terminated UTF-8 string specifying the entry point function name for the shader. */ + SDL_GPUShaderFormat format; /**< The format of the compute shader code. */ + Uint32 num_samplers; /**< The number of samplers defined in the shader. */ + Uint32 num_readonly_storage_textures; /**< The number of readonly storage textures defined in the shader. */ + Uint32 num_readonly_storage_buffers; /**< The number of readonly storage buffers defined in the shader. */ + Uint32 num_readwrite_storage_textures; /**< The number of read-write storage textures defined in the shader. */ + Uint32 num_readwrite_storage_buffers; /**< The number of read-write storage buffers defined in the shader. */ + Uint32 num_uniform_buffers; /**< The number of uniform buffers defined in the shader. */ + Uint32 threadcount_x; /**< The number of threads in the X dimension. This should match the value in the shader. */ + Uint32 threadcount_y; /**< The number of threads in the Y dimension. This should match the value in the shader. */ + Uint32 threadcount_z; /**< The number of threads in the Z dimension. This should match the value in the shader. */ - SDL_PropertiesID props; + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ } SDL_GPUComputePipelineCreateInfo; -typedef struct SDL_GPUColorAttachmentInfo +/** + * A structure specifying the parameters of a color target used by a render + * pass. + * + * The load_op field determines what is done with the texture at the beginning + * of the render pass. + * + * - LOAD: Loads the data currently in the texture. Not recommended for + * multisample textures as it requires significant memory bandwidth. + * - CLEAR: Clears the texture to a single color. + * - DONT_CARE: The driver will do whatever it wants with the texture memory. + * This is a good option if you know that every single pixel will be touched + * in the render pass. + * + * The store_op field determines what is done with the color results of the + * render pass. + * + * - STORE: Stores the results of the render pass in the texture. Not + * recommended for multisample textures as it requires significant memory + * bandwidth. + * - DONT_CARE: The driver will do whatever it wants with the texture memory. + * This is often a good option for depth/stencil textures. + * - RESOLVE: Resolves a multisample texture into resolve_texture, which must + * have a sample count of 1. Then the driver may discard the multisample + * texture memory. This is the most performant method of resolving a + * multisample target. + * - RESOLVE_AND_STORE: Resolves a multisample texture into the + * resolve_texture, which must have a sample count of 1. Then the driver + * stores the multisample texture's contents. Not recommended as it requires + * significant memory bandwidth. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPURenderPass + */ +typedef struct SDL_GPUColorTargetInfo { - /* The texture that will be used as a color attachment by a render pass. */ - SDL_GPUTexture *texture; - Uint32 mipLevel; - Uint32 layerOrDepthPlane; /* For 3D textures, you can bind an individual depth plane as an attachment. */ + SDL_GPUTexture *texture; /**< The texture that will be used as a color target by a render pass. */ + Uint32 mip_level; /**< The mip level to use as a color target. */ + Uint32 layer_or_depth_plane; /**< The layer index or depth plane to use as a color target. This value is treated as a layer index on 2D array and cube textures, and as a depth plane on 3D textures. */ + SDL_FColor clear_color; /**< The color to clear the color target to at the start of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */ + SDL_GPULoadOp load_op; /**< What is done with the contents of the color target at the beginning of the render pass. */ + SDL_GPUStoreOp store_op; /**< What is done with the results of the render pass. */ + SDL_GPUTexture *resolve_texture; /**< The texture that will receive the results of a multisample resolve operation. Ignored if a RESOLVE* store_op is not used. */ + Uint32 resolve_mip_level; /**< The mip level of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used. */ + Uint32 resolve_layer; /**< The layer index of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used. */ + bool cycle; /**< true cycles the texture if the texture is bound and load_op is not LOAD */ + bool cycle_resolve_texture; /**< true cycles the resolve texture if the resolve texture is bound. Ignored if a RESOLVE* store_op is not used. */ + Uint8 padding1; + Uint8 padding2; +} SDL_GPUColorTargetInfo; - /* Can be ignored by RenderPass if CLEAR is not used */ - SDL_FColor clearColor; - - /* Determines what is done with the texture at the beginning of the render pass. - * - * LOAD: - * Loads the data currently in the texture. - * - * CLEAR: - * Clears the texture to a single color. - * - * DONT_CARE: - * The driver will do whatever it wants with the texture memory. - * This is a good option if you know that every single pixel will be touched in the render pass. - */ - SDL_GPULoadOp loadOp; - - /* Determines what is done with the texture at the end of the render pass. - * - * STORE: - * Stores the results of the render pass in the texture. - * - * DONT_CARE: - * The driver will do whatever it wants with the texture memory. - * This is often a good option for depth/stencil textures. - */ - SDL_GPUStoreOp storeOp; - - /* if SDL_TRUE, cycles the texture if the texture is bound and loadOp is not LOAD */ - SDL_bool cycle; -} SDL_GPUColorAttachmentInfo; - -typedef struct SDL_GPUDepthStencilAttachmentInfo +/** + * A structure specifying the parameters of a depth-stencil target used by a + * render pass. + * + * The load_op field determines what is done with the depth contents of the + * texture at the beginning of the render pass. + * + * - LOAD: Loads the depth values currently in the texture. + * - CLEAR: Clears the texture to a single depth. + * - DONT_CARE: The driver will do whatever it wants with the memory. This is + * a good option if you know that every single pixel will be touched in the + * render pass. + * + * The store_op field determines what is done with the depth results of the + * render pass. + * + * - STORE: Stores the depth results in the texture. + * - DONT_CARE: The driver will do whatever it wants with the depth results. + * This is often a good option for depth/stencil textures that don't need to + * be reused again. + * + * The stencil_load_op field determines what is done with the stencil contents + * of the texture at the beginning of the render pass. + * + * - LOAD: Loads the stencil values currently in the texture. + * - CLEAR: Clears the stencil values to a single value. + * - DONT_CARE: The driver will do whatever it wants with the memory. This is + * a good option if you know that every single pixel will be touched in the + * render pass. + * + * The stencil_store_op field determines what is done with the stencil results + * of the render pass. + * + * - STORE: Stores the stencil results in the texture. + * - DONT_CARE: The driver will do whatever it wants with the stencil results. + * This is often a good option for depth/stencil textures that don't need to + * be reused again. + * + * Note that depth/stencil targets do not support multisample resolves. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPURenderPass + */ +typedef struct SDL_GPUDepthStencilTargetInfo { - /* The texture that will be used as the depth stencil attachment by a render pass. */ - SDL_GPUTexture *texture; + SDL_GPUTexture *texture; /**< The texture that will be used as the depth stencil target by the render pass. */ + float clear_depth; /**< The value to clear the depth component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */ + SDL_GPULoadOp load_op; /**< What is done with the depth contents at the beginning of the render pass. */ + SDL_GPUStoreOp store_op; /**< What is done with the depth results of the render pass. */ + SDL_GPULoadOp stencil_load_op; /**< What is done with the stencil contents at the beginning of the render pass. */ + SDL_GPUStoreOp stencil_store_op; /**< What is done with the stencil results of the render pass. */ + bool cycle; /**< true cycles the texture if the texture is bound and any load ops are not LOAD */ + Uint8 clear_stencil; /**< The value to clear the stencil component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */ + Uint8 padding1; + Uint8 padding2; +} SDL_GPUDepthStencilTargetInfo; - /* Can be ignored by the render pass if CLEAR is not used */ - SDL_GPUDepthStencilValue depthStencilClearValue; - - /* Determines what is done with the depth values at the beginning of the render pass. - * - * LOAD: - * Loads the depth values currently in the texture. - * - * CLEAR: - * Clears the texture to a single depth. - * - * DONT_CARE: - * The driver will do whatever it wants with the memory. - * This is a good option if you know that every single pixel will be touched in the render pass. - */ - SDL_GPULoadOp loadOp; - - /* Determines what is done with the depth values at the end of the render pass. - * - * STORE: - * Stores the depth results in the texture. - * - * DONT_CARE: - * The driver will do whatever it wants with the texture memory. - * This is often a good option for depth/stencil textures. - */ - SDL_GPUStoreOp storeOp; - - /* Determines what is done with the stencil values at the beginning of the render pass. - * - * LOAD: - * Loads the stencil values currently in the texture. - * - * CLEAR: - * Clears the texture to a single stencil value. - * - * DONT_CARE: - * The driver will do whatever it wants with the memory. - * This is a good option if you know that every single pixel will be touched in the render pass. - */ - SDL_GPULoadOp stencilLoadOp; - - /* Determines what is done with the stencil values at the end of the render pass. - * - * STORE: - * Stores the stencil results in the texture. - * - * DONT_CARE: - * The driver will do whatever it wants with the texture memory. - * This is often a good option for depth/stencil textures. - */ - SDL_GPUStoreOp stencilStoreOp; - - /* if SDL_TRUE, cycles the texture if the texture is bound and any load ops are not LOAD */ - SDL_bool cycle; -} SDL_GPUDepthStencilAttachmentInfo; +/** + * A structure containing parameters for a blit command. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BlitGPUTexture + */ +typedef struct SDL_GPUBlitInfo { + SDL_GPUBlitRegion source; /**< The source region for the blit. */ + SDL_GPUBlitRegion destination; /**< The destination region for the blit. */ + SDL_GPULoadOp load_op; /**< What is done with the contents of the destination before the blit. */ + SDL_FColor clear_color; /**< The color to clear the destination region to before the blit. Ignored if load_op is not SDL_GPU_LOADOP_CLEAR. */ + SDL_FlipMode flip_mode; /**< The flip mode for the source region. */ + SDL_GPUFilter filter; /**< The filter mode used when blitting. */ + bool cycle; /**< true cycles the destination texture if it is already bound. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_GPUBlitInfo; /* Binding structs */ +/** + * A structure specifying parameters in a buffer binding call. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BindGPUVertexBuffers + * \sa SDL_BindGPUIndexBuffer + */ typedef struct SDL_GPUBufferBinding { - SDL_GPUBuffer *buffer; - Uint32 offset; + SDL_GPUBuffer *buffer; /**< The buffer to bind. Must have been created with SDL_GPU_BUFFERUSAGE_VERTEX for SDL_BindGPUVertexBuffers, or SDL_GPU_BUFFERUSAGE_INDEX for SDL_BindGPUIndexBuffer. */ + Uint32 offset; /**< The starting byte of the data to bind in the buffer. */ } SDL_GPUBufferBinding; +/** + * A structure specifying parameters in a sampler binding call. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BindGPUVertexSamplers + * \sa SDL_BindGPUFragmentSamplers + */ typedef struct SDL_GPUTextureSamplerBinding { - SDL_GPUTexture *texture; - SDL_GPUSampler *sampler; + SDL_GPUTexture *texture; /**< The texture to bind. Must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. */ + SDL_GPUSampler *sampler; /**< The sampler to bind. */ } SDL_GPUTextureSamplerBinding; -typedef struct SDL_GPUStorageBufferWriteOnlyBinding +/** + * A structure specifying parameters related to binding buffers in a compute + * pass. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPUComputePass + */ +typedef struct SDL_GPUStorageBufferReadWriteBinding { - SDL_GPUBuffer *buffer; + SDL_GPUBuffer *buffer; /**< The buffer to bind. Must have been created with SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE. */ + bool cycle; /**< true cycles the buffer if it is already bound. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_GPUStorageBufferReadWriteBinding; - /* if SDL_TRUE, cycles the buffer if it is bound. */ - SDL_bool cycle; -} SDL_GPUStorageBufferWriteOnlyBinding; - -typedef struct SDL_GPUStorageTextureWriteOnlyBinding +/** + * A structure specifying parameters related to binding textures in a compute + * pass. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_BeginGPUComputePass + */ +typedef struct SDL_GPUStorageTextureReadWriteBinding { - SDL_GPUTexture *texture; - Uint32 mipLevel; - Uint32 layer; - - /* if SDL_TRUE, cycles the texture if the texture is bound. */ - SDL_bool cycle; -} SDL_GPUStorageTextureWriteOnlyBinding; + SDL_GPUTexture *texture; /**< The texture to bind. Must have been created with SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE or SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE. */ + Uint32 mip_level; /**< The mip level index to bind. */ + Uint32 layer; /**< The layer index to bind. */ + bool cycle; /**< true cycles the texture if it is already bound. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_GPUStorageTextureReadWriteBinding; /* Functions */ /* Device */ /** - * Creates a GPU context. + * Checks for GPU runtime support. * - * \param formatFlags a bitflag indicating which shader formats the app is - * able to provide. - * \param debugMode enable debug mode properties and validations. + * \param format_flags a bitflag indicating which shader formats the app is + * able to provide. * \param name the preferred GPU driver, or NULL to let SDL pick the optimal * driver. - * \returns a GPU context on success or NULL on failure. + * \returns true if supported, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_GetGPUDriver + * \sa SDL_CreateGPUDevice + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsShaderFormats( + SDL_GPUShaderFormat format_flags, + const char *name); + +/** + * Checks for GPU runtime support. + * + * \param props the properties to use. + * \returns true if supported, false otherwise. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUDeviceWithProperties + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsProperties( + SDL_PropertiesID props); + +/** + * Creates a GPU context. + * + * \param format_flags a bitflag indicating which shader formats the app is + * able to provide. + * \param debug_mode enable debug mode properties and validations. + * \param name the preferred GPU driver, or NULL to let SDL pick the optimal + * driver. + * \returns a GPU context on success or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetGPUShaderFormats + * \sa SDL_GetGPUDeviceDriver * \sa SDL_DestroyGPUDevice + * \sa SDL_GPUSupportsShaderFormats */ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDevice( - SDL_GPUShaderFormat formatFlags, - SDL_bool debugMode, + SDL_GPUShaderFormat format_flags, + bool debug_mode, const char *name); /** @@ -951,26 +2114,26 @@ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDevice( * * These are the supported properties: * - * - `SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOL`: enable debug mode properties - * and validations, defaults to SDL_TRUE. - * - `SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOL`: enable to prefer energy - * efficiency over maximum GPU performance, defaults to SDL_FALSE. + * - `SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN`: enable debug mode + * properties and validations, defaults to true. + * - `SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN`: enable to prefer + * energy efficiency over maximum GPU performance, defaults to false. * - `SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING`: the name of the GPU driver to * use, if a specific one is desired. * * These are the current shader format properties: * - * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SECRET_BOOL`: The app is able to + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN`: The app is able to * provide shaders for an NDA platform. - * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOL`: The app is able to + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN`: The app is able to * provide SPIR-V shaders if applicable. - * - SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOL`: The app is able to provide - * DXBC shaders if applicable - * `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOL`: The app is able to + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN`: The app is able to + * provide DXBC shaders if applicable + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN`: The app is able to * provide DXIL shaders if applicable. - * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOL`: The app is able to provide - * MSL shaders if applicable. - * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOL`: The app is able to + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN`: The app is able to + * provide MSL shaders if applicable. + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN`: The app is able to * provide Metal shader libraries if applicable. * * With the D3D12 renderer: @@ -979,25 +2142,28 @@ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDevice( * use for all vertex semantics, default is "TEXCOORD". * * \param props the properties to use. - * \returns a GPU context on success or NULL on failure. + * \returns a GPU context on success or NULL on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_GetGPUDriver + * \sa SDL_GetGPUShaderFormats + * \sa SDL_GetGPUDeviceDriver * \sa SDL_DestroyGPUDevice + * \sa SDL_GPUSupportsProperties */ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDeviceWithProperties( SDL_PropertiesID props); -#define SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOL "SDL.gpu.device.create.debugmode" -#define SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOL "SDL.gpu.device.create.preferlowpower" +#define SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN "SDL.gpu.device.create.debugmode" +#define SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN "SDL.gpu.device.create.preferlowpower" #define SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING "SDL.gpu.device.create.name" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SECRET_BOOL "SDL.gpu.device.create.shaders.secret" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOL "SDL.gpu.device.create.shaders.spirv" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOL "SDL.gpu.device.create.shaders.dxbc" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOL "SDL.gpu.device.create.shaders.dxil" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOL "SDL.gpu.device.create.shaders.msl" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOL "SDL.gpu.device.create.shaders.metallib" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN "SDL.gpu.device.create.shaders.private" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN "SDL.gpu.device.create.shaders.spirv" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN "SDL.gpu.device.create.shaders.dxbc" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN "SDL.gpu.device.create.shaders.dxil" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN "SDL.gpu.device.create.shaders.msl" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN "SDL.gpu.device.create.shaders.metallib" #define SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING "SDL.gpu.device.create.d3d12.semantic" /** @@ -1005,70 +2171,132 @@ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDeviceWithProperties( * * \param device a GPU Context to destroy. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUDevice */ extern SDL_DECLSPEC void SDLCALL SDL_DestroyGPUDevice(SDL_GPUDevice *device); /** - * Returns the backend used to create this GPU context. + * Get the number of GPU drivers compiled into SDL. + * + * \returns the number of built in GPU drivers. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetGPUDriver + */ +extern SDL_DECLSPEC int SDLCALL SDL_GetNumGPUDrivers(void); + +/** + * Get the name of a built in GPU driver. + * + * The GPU drivers are presented in the order in which they are normally + * checked during initialization. + * + * The names of drivers are all simple, low-ASCII identifiers, like "vulkan", + * "metal" or "direct3d12". These never have Unicode characters, and are not + * meant to be proper names. + * + * \param index the index of a GPU driver. + * \returns the name of the GPU driver with the given **index**. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetNumGPUDrivers + */ +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDriver(int index); + +/** + * Returns the name of the backend used to create this GPU context. * * \param device a GPU context to query. - * \returns an SDL_GPUDriver value, or SDL_GPU_DRIVER_INVALID on error. + * \returns the name of the device's driver, or NULL on error. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_GPUDriver SDLCALL SDL_GetGPUDriver(SDL_GPUDevice *device); +extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDeviceDriver(SDL_GPUDevice *device); + +/** + * Returns the supported shader formats for this GPU context. + * + * \param device a GPU context to query. + * \returns a bitflag indicating which shader formats the driver is able to + * consume. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC SDL_GPUShaderFormat SDLCALL SDL_GetGPUShaderFormats(SDL_GPUDevice *device); /* State Creation */ /** * Creates a pipeline object to be used in a compute workflow. * - * Shader resource bindings must be authored to follow a particular order. For - * SPIR-V shaders, use the following resource sets: 0: Read-only storage - * textures, followed by read-only storage buffers 1: Write-only storage - * textures, followed by write-only storage buffers 2: Uniform buffers + * Shader resource bindings must be authored to follow a particular order + * depending on the shader format. * - * For DXBC Shader Model 5_0 shaders, use the following register order: For t - * registers: Read-only storage textures, followed by read-only storage - * buffers For u registers: Write-only storage textures, followed by - * write-only storage buffers For b registers: Uniform buffers + * For SPIR-V shaders, use the following resource sets: * - * For DXIL shaders, use the following register order: (t[n], space0): - * Read-only storage textures, followed by read-only storage buffers (u[n], - * space1): Write-only storage textures, followed by write-only storage - * buffers (b[n], space2): Uniform buffers + * - 0: Sampled textures, followed by read-only storage textures, followed by + * read-only storage buffers + * - 1: Read-write storage textures, followed by read-write storage buffers + * - 2: Uniform buffers * - * For MSL/metallib, use the following order: For [[buffer]]: Uniform buffers, - * followed by write-only storage buffers, followed by write-only storage - * buffers For [[texture]]: Read-only storage textures, followed by write-only - * storage textures + * For DXBC and DXIL shaders, use the following register order: + * + * - (t[n], space0): Sampled textures, followed by read-only storage textures, + * followed by read-only storage buffers + * - (u[n], space1): Read-write storage textures, followed by read-write + * storage buffers + * - (b[n], space2): Uniform buffers + * + * For MSL/metallib, use the following order: + * + * - [[buffer]]: Uniform buffers, followed by read-only storage buffers, + * followed by read-write storage buffers + * - [[texture]]: Sampled textures, followed by read-only storage textures, + * followed by read-write storage textures + * + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING`: a name that can be + * displayed in debugging tools. * * \param device a GPU Context. - * \param computePipelineCreateInfo a struct describing the state of the - * requested compute pipeline. - * \returns a compute pipeline object on success, or NULL on failure. + * \param createinfo a struct describing the state of the compute pipeline to + * create. + * \returns a compute pipeline object on success, or NULL on failure; call + * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindGPUComputePipeline * \sa SDL_ReleaseGPUComputePipeline */ extern SDL_DECLSPEC SDL_GPUComputePipeline *SDLCALL SDL_CreateGPUComputePipeline( SDL_GPUDevice *device, - SDL_GPUComputePipelineCreateInfo *computePipelineCreateInfo); + const SDL_GPUComputePipelineCreateInfo *createinfo); + +#define SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING "SDL.gpu.computepipeline.create.name" /** * Creates a pipeline object to be used in a graphics workflow. * - * \param device a GPU Context. - * \param pipelineCreateInfo a struct describing the state of the desired - * graphics pipeline. - * \returns a graphics pipeline object on success, or NULL on failure. + * There are optional properties that can be provided through `props`. These + * are the supported properties: * - * \since This function is available since SDL 3.0.0. + * - `SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING`: a name that can be + * displayed in debugging tools. + * + * \param device a GPU Context. + * \param createinfo a struct describing the state of the graphics pipeline to + * create. + * \returns a graphics pipeline object on success, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUShader * \sa SDL_BindGPUGraphicsPipeline @@ -1076,26 +2304,36 @@ extern SDL_DECLSPEC SDL_GPUComputePipeline *SDLCALL SDL_CreateGPUComputePipeline */ extern SDL_DECLSPEC SDL_GPUGraphicsPipeline *SDLCALL SDL_CreateGPUGraphicsPipeline( SDL_GPUDevice *device, - SDL_GPUGraphicsPipelineCreateInfo *pipelineCreateInfo); + const SDL_GPUGraphicsPipelineCreateInfo *createinfo); + +#define SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING "SDL.gpu.graphicspipeline.create.name" /** * Creates a sampler object to be used when binding textures in a graphics * workflow. * - * \param device a GPU Context. - * \param samplerCreateInfo a struct describing the state of the desired - * sampler. - * \returns a sampler object on success, or NULL on failure. + * There are optional properties that can be provided through `props`. These + * are the supported properties: * - * \since This function is available since SDL 3.0.0. + * - `SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING`: a name that can be displayed + * in debugging tools. + * + * \param device a GPU Context. + * \param createinfo a struct describing the state of the sampler to create. + * \returns a sampler object on success, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindGPUVertexSamplers * \sa SDL_BindGPUFragmentSamplers - * \sa SDL_ReleaseSampler + * \sa SDL_ReleaseGPUSampler */ extern SDL_DECLSPEC SDL_GPUSampler *SDLCALL SDL_CreateGPUSampler( SDL_GPUDevice *device, - SDL_GPUSamplerCreateInfo *samplerCreateInfo); + const SDL_GPUSamplerCreateInfo *createinfo); + +#define SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING "SDL.gpu.sampler.create.name" /** * Creates a shader to be used when creating a graphics pipeline. @@ -1103,46 +2341,78 @@ extern SDL_DECLSPEC SDL_GPUSampler *SDLCALL SDL_CreateGPUSampler( * Shader resource bindings must be authored to follow a particular order * depending on the shader format. * - * For SPIR-V shaders, use the following resource sets: For vertex shaders: 0: - * Sampled textures, followed by storage textures, followed by storage buffers - * 1: Uniform buffers For fragment shaders: 2: Sampled textures, followed by - * storage textures, followed by storage buffers 3: Uniform buffers + * For SPIR-V shaders, use the following resource sets: * - * For DXBC Shader Model 5_0 shaders, use the following register order: For t - * registers: Sampled textures, followed by storage textures, followed by - * storage buffers For s registers: Samplers with indices corresponding to the - * sampled textures For b registers: Uniform buffers + * For vertex shaders: * - * For DXIL shaders, use the following register order: For vertex shaders: - * (t[n], space0): Sampled textures, followed by storage textures, followed by - * storage buffers (s[n], space0): Samplers with indices corresponding to the - * sampled textures (b[n], space1): Uniform buffers For pixel shaders: (t[n], - * space2): Sampled textures, followed by storage textures, followed by - * storage buffers (s[n], space2): Samplers with indices corresponding to the - * sampled textures (b[n], space3): Uniform buffers + * - 0: Sampled textures, followed by storage textures, followed by storage + * buffers + * - 1: Uniform buffers * - * For MSL/metallib, use the following order: For [[texture]]: Sampled - * textures, followed by storage textures For [[sampler]]: Samplers with - * indices corresponding to the sampled textures For [[buffer]]: Uniform - * buffers, followed by storage buffers. Vertex buffer 0 is bound at - * [[buffer(30)]], vertex buffer 1 at [[buffer(29)]], and so on. Rather than - * manually authoring vertex buffer indices, use the [[stage_in]] attribute - * which will automatically use the vertex input information from the - * SDL_GPUPipeline. + * For fragment shaders: + * + * - 2: Sampled textures, followed by storage textures, followed by storage + * buffers + * - 3: Uniform buffers + * + * For DXBC and DXIL shaders, use the following register order: + * + * For vertex shaders: + * + * - (t[n], space0): Sampled textures, followed by storage textures, followed + * by storage buffers + * - (s[n], space0): Samplers with indices corresponding to the sampled + * textures + * - (b[n], space1): Uniform buffers + * + * For pixel shaders: + * + * - (t[n], space2): Sampled textures, followed by storage textures, followed + * by storage buffers + * - (s[n], space2): Samplers with indices corresponding to the sampled + * textures + * - (b[n], space3): Uniform buffers + * + * For MSL/metallib, use the following order: + * + * - [[texture]]: Sampled textures, followed by storage textures + * - [[sampler]]: Samplers with indices corresponding to the sampled textures + * - [[buffer]]: Uniform buffers, followed by storage buffers. Vertex buffer 0 + * is bound at [[buffer(14)]], vertex buffer 1 at [[buffer(15)]], and so on. + * Rather than manually authoring vertex buffer indices, use the + * [[stage_in]] attribute which will automatically use the vertex input + * information from the SDL_GPUGraphicsPipeline. + * + * Shader semantics other than system-value semantics do not matter in D3D12 + * and for ease of use the SDL implementation assumes that non system-value + * semantics will all be TEXCOORD. If you are using HLSL as the shader source + * language, your vertex semantics should start at TEXCOORD0 and increment + * like so: TEXCOORD1, TEXCOORD2, etc. If you wish to change the semantic + * prefix to something other than TEXCOORD you can use + * SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING with + * SDL_CreateGPUDeviceWithProperties(). + * + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_SHADER_CREATE_NAME_STRING`: a name that can be displayed in + * debugging tools. * * \param device a GPU Context. - * \param shaderCreateInfo a struct describing the state of the desired - * shader. - * \returns a shader object on success, or NULL on failure. + * \param createinfo a struct describing the state of the shader to create. + * \returns a shader object on success, or NULL on failure; call + * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline * \sa SDL_ReleaseGPUShader */ extern SDL_DECLSPEC SDL_GPUShader *SDLCALL SDL_CreateGPUShader( SDL_GPUDevice *device, - SDL_GPUShaderCreateInfo *shaderCreateInfo); + const SDL_GPUShaderCreateInfo *createinfo); + +#define SDL_PROP_GPU_SHADER_CREATE_NAME_STRING "SDL.gpu.shader.create.name" /** * Creates a texture object to be used in graphics or compute workflows. @@ -1157,12 +2427,36 @@ extern SDL_DECLSPEC SDL_GPUShader *SDLCALL SDL_CreateGPUShader( * implementation will automatically fall back to the highest available sample * count. * - * \param device a GPU Context. - * \param textureCreateInfo a struct describing the state of the texture to - * create. - * \returns a texture object on success, or NULL on failure. + * There are optional properties that can be provided through + * SDL_GPUTextureCreateInfo's `props`. These are the supported properties: * - * \since This function is available since SDL 3.0.0. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT`: (Direct3D 12 only) if + * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture + * to a color with this red intensity. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT`: (Direct3D 12 only) if + * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture + * to a color with this green intensity. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT`: (Direct3D 12 only) if + * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture + * to a color with this blue intensity. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT`: (Direct3D 12 only) if + * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture + * to a color with this alpha intensity. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT`: (Direct3D 12 only) + * if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear + * the texture to a depth of this value. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_UINT8`: (Direct3D 12 + * only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, + * clear the texture to a stencil of this value. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING`: a name that can be displayed + * in debugging tools. + * + * \param device a GPU Context. + * \param createinfo a struct describing the state of the texture to create. + * \returns a texture object on success, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUTexture * \sa SDL_DownloadFromGPUTexture @@ -1177,7 +2471,15 @@ extern SDL_DECLSPEC SDL_GPUShader *SDLCALL SDL_CreateGPUShader( */ extern SDL_DECLSPEC SDL_GPUTexture *SDLCALL SDL_CreateGPUTexture( SDL_GPUDevice *device, - SDL_GPUTextureCreateInfo *textureCreateInfo); + const SDL_GPUTextureCreateInfo *createinfo); + +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT "SDL.gpu.texture.create.d3d12.clear.r" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT "SDL.gpu.texture.create.d3d12.clear.g" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT "SDL.gpu.texture.create.d3d12.clear.b" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT "SDL.gpu.texture.create.d3d12.clear.a" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT "SDL.gpu.texture.create.d3d12.clear.depth" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_UINT8 "SDL.gpu.texture.create.d3d12.clear.stencil" +#define SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING "SDL.gpu.texture.create.name" /** * Creates a buffer object to be used in graphics or compute workflows. @@ -1188,35 +2490,63 @@ extern SDL_DECLSPEC SDL_GPUTexture *SDLCALL SDL_CreateGPUTexture( * Note that certain combinations of usage flags are invalid. For example, a * buffer cannot have both the VERTEX and INDEX flags. * - * \param device a GPU Context. - * \param bufferCreateInfo a struct describing the state of the buffer to - * create. - * \returns a buffer object on success, or NULL on failure. + * For better understanding of underlying concepts and memory management with + * SDL GPU API, you may refer + * [this blog post](https://moonside.games/posts/sdl-gpu-concepts-cycling/) + * . * - * \since This function is available since SDL 3.0.0. + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING`: a name that can be displayed in + * debugging tools. + * + * \param device a GPU Context. + * \param createinfo a struct describing the state of the buffer to create. + * \returns a buffer object on success, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUBuffer + * \sa SDL_DownloadFromGPUBuffer + * \sa SDL_CopyGPUBufferToBuffer * \sa SDL_BindGPUVertexBuffers * \sa SDL_BindGPUIndexBuffer * \sa SDL_BindGPUVertexStorageBuffers * \sa SDL_BindGPUFragmentStorageBuffers + * \sa SDL_DrawGPUPrimitivesIndirect + * \sa SDL_DrawGPUIndexedPrimitivesIndirect * \sa SDL_BindGPUComputeStorageBuffers + * \sa SDL_DispatchGPUComputeIndirect * \sa SDL_ReleaseGPUBuffer */ extern SDL_DECLSPEC SDL_GPUBuffer *SDLCALL SDL_CreateGPUBuffer( SDL_GPUDevice *device, - SDL_GPUBufferCreateInfo *bufferCreateInfo); + const SDL_GPUBufferCreateInfo *createinfo); + +#define SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING "SDL.gpu.buffer.create.name" /** * Creates a transfer buffer to be used when uploading to or downloading from * graphics resources. * - * \param device a GPU Context. - * \param transferBufferCreateInfo a struct describing the state of the - * transfer buffer to create. - * \returns a transfer buffer on success, or NULL on failure. + * Download buffers can be particularly expensive to create, so it is good + * practice to reuse them if data will be downloaded regularly. * - * \since This function is available since SDL 3.0.0. + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING`: a name that can be + * displayed in debugging tools. + * + * \param device a GPU Context. + * \param createinfo a struct describing the state of the transfer buffer to + * create. + * \returns a transfer buffer on success, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUBuffer * \sa SDL_DownloadFromGPUBuffer @@ -1226,20 +2556,28 @@ extern SDL_DECLSPEC SDL_GPUBuffer *SDLCALL SDL_CreateGPUBuffer( */ extern SDL_DECLSPEC SDL_GPUTransferBuffer *SDLCALL SDL_CreateGPUTransferBuffer( SDL_GPUDevice *device, - SDL_GPUTransferBufferCreateInfo *transferBufferCreateInfo); + const SDL_GPUTransferBufferCreateInfo *createinfo); + +#define SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING "SDL.gpu.transferbuffer.create.name" /* Debug Naming */ /** * Sets an arbitrary string constant to label a buffer. * - * Useful for debugging. + * You should use SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING with + * SDL_CreateGPUBuffer instead of this function to avoid thread safety issues. * * \param device a GPU Context. * \param buffer a buffer to attach the name to. * \param text a UTF-8 string constant to mark as the name of the buffer. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe, you must make sure the + * buffer is not simultaneously used by any other thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUBuffer */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBufferName( SDL_GPUDevice *device, @@ -1249,13 +2587,20 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBufferName( /** * Sets an arbitrary string constant to label a texture. * - * Useful for debugging. + * You should use SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING with + * SDL_CreateGPUTexture instead of this function to avoid thread safety + * issues. * * \param device a GPU Context. * \param texture a texture to attach the name to. * \param text a UTF-8 string constant to mark as the name of the texture. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe, you must make sure the + * texture is not simultaneously used by any other thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUTextureName( SDL_GPUDevice *device, @@ -1267,13 +2612,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUTextureName( * * Useful for debugging. * - * \param commandBuffer a command buffer. + * \param command_buffer a command buffer. * \param text a UTF-8 string constant to insert as the label. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel( - SDL_GPUCommandBuffer *commandBuffer, + SDL_GPUCommandBuffer *command_buffer, const char *text); /** @@ -1290,28 +2635,28 @@ extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel( * pass rather than the command buffer. For best results, if you push a debug * group during a pass, always pop it in the same pass. * - * \param commandBuffer a command buffer. + * \param command_buffer a command buffer. * \param name a UTF-8 string constant that names the group. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PopGPUDebugGroup */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUDebugGroup( - SDL_GPUCommandBuffer *commandBuffer, + SDL_GPUCommandBuffer *command_buffer, const char *name); /** * Ends the most-recently pushed debug group. * - * \param commandBuffer a command buffer. + * \param command_buffer a command buffer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PushGPUDebugGroup */ extern SDL_DECLSPEC void SDLCALL SDL_PopGPUDebugGroup( - SDL_GPUCommandBuffer *commandBuffer); + SDL_GPUCommandBuffer *command_buffer); /* Disposal */ @@ -1323,7 +2668,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_PopGPUDebugGroup( * \param device a GPU context. * \param texture a texture to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTexture( SDL_GPUDevice *device, @@ -1332,12 +2677,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTexture( /** * Frees the given sampler as soon as it is safe to do so. * - * You must not reference the texture after calling this function. + * You must not reference the sampler after calling this function. * * \param device a GPU context. * \param sampler a sampler to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUSampler( SDL_GPUDevice *device, @@ -1351,7 +2696,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUSampler( * \param device a GPU context. * \param buffer a buffer to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUBuffer( SDL_GPUDevice *device, @@ -1363,13 +2708,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUBuffer( * You must not reference the transfer buffer after calling this function. * * \param device a GPU context. - * \param transferBuffer a transfer buffer to be destroyed. + * \param transfer_buffer a transfer buffer to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTransferBuffer( SDL_GPUDevice *device, - SDL_GPUTransferBuffer *transferBuffer); + SDL_GPUTransferBuffer *transfer_buffer); /** * Frees the given compute pipeline as soon as it is safe to do so. @@ -1377,13 +2722,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTransferBuffer( * You must not reference the compute pipeline after calling this function. * * \param device a GPU context. - * \param computePipeline a compute pipeline to be destroyed. + * \param compute_pipeline a compute pipeline to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUComputePipeline( SDL_GPUDevice *device, - SDL_GPUComputePipeline *computePipeline); + SDL_GPUComputePipeline *compute_pipeline); /** * Frees the given shader as soon as it is safe to do so. @@ -1393,7 +2738,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUComputePipeline( * \param device a GPU context. * \param shader a shader to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUShader( SDL_GPUDevice *device, @@ -1405,29 +2750,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUShader( * You must not reference the graphics pipeline after calling this function. * * \param device a GPU context. - * \param graphicsPipeline a graphics pipeline to be destroyed. + * \param graphics_pipeline a graphics pipeline to be destroyed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline( SDL_GPUDevice *device, - SDL_GPUGraphicsPipeline *graphicsPipeline); - -/* - * COMMAND BUFFERS - * - * Render state is managed via command buffers. - * When setting render state, that state is always local to the command buffer. - * - * Commands only begin execution on the GPU once Submit is called. - * Once the command buffer is submitted, it is no longer valid to use it. - * - * Command buffers are executed in submission order. If you submit command buffer A and then command buffer B - * all commands in A will begin executing before any command in B begins executing. - * - * In multi-threading scenarios, you should acquire and submit a command buffer on the same thread. - * As long as you satisfy this requirement, all functionality related to command buffers is thread-safe. - */ + SDL_GPUGraphicsPipeline *graphics_pipeline); /** * Acquire a command buffer. @@ -1437,10 +2766,18 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline( * acquired on. The command buffer should be submitted on the thread it was * acquired on. * - * \param device a GPU context. - * \returns a command buffer. + * It is valid to acquire multiple command buffers on the same thread at once. + * In fact a common design pattern is to acquire two command buffers per frame + * where one is dedicated to render and compute passes and the other is + * dedicated to copy passes and other preparatory work such as generating + * mipmaps. Interleaving commands between the two command buffers reduces the + * total amount of passes overall which improves rendering performance. * - * \since This function is available since SDL 3.0.0. + * \param device a GPU context. + * \returns a command buffer, or NULL on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBuffer * \sa SDL_SubmitGPUCommandBufferAndAcquireFence @@ -1448,118 +2785,61 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline( extern SDL_DECLSPEC SDL_GPUCommandBuffer *SDLCALL SDL_AcquireGPUCommandBuffer( SDL_GPUDevice *device); -/* - * UNIFORM DATA - * - * Uniforms are for passing data to shaders. - * The uniform data will be constant across all executions of the shader. - * - * There are 4 available uniform slots per shader stage (vertex, fragment, compute). - * Uniform data pushed to a slot on a stage keeps its value throughout the command buffer - * until you call the relevant Push function on that slot again. - * - * For example, you could write your vertex shaders to read a camera matrix from uniform binding slot 0, - * push the camera matrix at the start of the command buffer, and that data will be used for every - * subsequent draw call. - * - * It is valid to push uniform data during a render or compute pass. - * - * Uniforms are best for pushing small amounts of data. - * If you are pushing more than a matrix or two per call you should consider using a storage buffer instead. - */ +/* Uniform Data */ /** * Pushes data to a vertex uniform slot on the command buffer. * * Subsequent draw calls will use this uniform data. * - * \param commandBuffer a command buffer. - * \param slotIndex the vertex uniform slot to push data to. + * \param command_buffer a command buffer. + * \param slot_index the vertex uniform slot to push data to. * \param data client data to write. - * \param dataLengthInBytes the length of the data to write. + * \param length the length of the data to write. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUVertexUniformData( - SDL_GPUCommandBuffer *commandBuffer, - Uint32 slotIndex, + SDL_GPUCommandBuffer *command_buffer, + Uint32 slot_index, const void *data, - Uint32 dataLengthInBytes); + Uint32 length); /** * Pushes data to a fragment uniform slot on the command buffer. * * Subsequent draw calls will use this uniform data. * - * \param commandBuffer a command buffer. - * \param slotIndex the fragment uniform slot to push data to. + * \param command_buffer a command buffer. + * \param slot_index the fragment uniform slot to push data to. * \param data client data to write. - * \param dataLengthInBytes the length of the data to write. + * \param length the length of the data to write. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUFragmentUniformData( - SDL_GPUCommandBuffer *commandBuffer, - Uint32 slotIndex, + SDL_GPUCommandBuffer *command_buffer, + Uint32 slot_index, const void *data, - Uint32 dataLengthInBytes); + Uint32 length); /** * Pushes data to a uniform slot on the command buffer. * * Subsequent draw calls will use this uniform data. * - * \param commandBuffer a command buffer. - * \param slotIndex the uniform slot to push data to. + * \param command_buffer a command buffer. + * \param slot_index the uniform slot to push data to. * \param data client data to write. - * \param dataLengthInBytes the length of the data to write. + * \param length the length of the data to write. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUComputeUniformData( - SDL_GPUCommandBuffer *commandBuffer, - Uint32 slotIndex, + SDL_GPUCommandBuffer *command_buffer, + Uint32 slot_index, const void *data, - Uint32 dataLengthInBytes); - -/* - * A NOTE ON CYCLING - * - * When using a command buffer, operations do not occur immediately - - * they occur some time after the command buffer is submitted. - * - * When a resource is used in a pending or active command buffer, it is considered to be "bound". - * When a resource is no longer used in any pending or active command buffers, it is considered to be "unbound". - * - * If data resources are bound, it is unspecified when that data will be unbound - * unless you acquire a fence when submitting the command buffer and wait on it. - * However, this doesn't mean you need to track resource usage manually. - * - * All of the functions and structs that involve writing to a resource have a "cycle" bool. - * GPUTransferBuffer, GPUBuffer, and GPUTexture all effectively function as ring buffers on internal resources. - * When cycle is SDL_TRUE, if the resource is bound, the cycle rotates to the next unbound internal resource, - * or if none are available, a new one is created. - * This means you don't have to worry about complex state tracking and synchronization as long as cycling is correctly employed. - * - * For example: you can call MapTransferBuffer, write texture data, UnmapTransferBuffer, and then UploadToTexture. - * The next time you write texture data to the transfer buffer, if you set the cycle param to SDL_TRUE, you don't have - * to worry about overwriting any data that is not yet uploaded. - * - * Another example: If you are using a texture in a render pass every frame, this can cause a data dependency between frames. - * If you set cycle to SDL_TRUE in the ColorAttachmentInfo struct, you can prevent this data dependency. - * - * Cycling will never undefine already bound data. - * When cycling, all data in the resource is considered to be undefined for subsequent commands until that data is written again. - * You must take care not to read undefined data. - * - * Note that when cycling a texture, the entire texture will be cycled, - * even if only part of the texture is used in the call, - * so you must consider the entire texture to contain undefined data after cycling. - * - * You must also take care not to overwrite a section of data that has been referenced in a command without cycling first. - * It is OK to overwrite unreferenced data in a bound resource without cycling, - * but overwriting a section of data that has already been referenced will produce unexpected results. - */ + Uint32 length); /* Graphics State */ @@ -1574,212 +2854,240 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUComputeUniformData( * is called. You cannot begin another render pass, or begin a compute pass or * copy pass until you have ended the render pass. * - * \param commandBuffer a command buffer. - * \param colorAttachmentInfos an array of texture subresources with - * corresponding clear values and load/store ops. - * \param colorAttachmentCount the number of color attachments in the - * colorAttachmentInfos array. - * \param depthStencilAttachmentInfo a texture subresource with corresponding - * clear value and load/store ops, may be - * NULL. + * \param command_buffer a command buffer. + * \param color_target_infos an array of texture subresources with + * corresponding clear values and load/store ops. + * \param num_color_targets the number of color targets in the + * color_target_infos array. + * \param depth_stencil_target_info a texture subresource with corresponding + * clear value and load/store ops, may be + * NULL. * \returns a render pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_EndGPURenderPass */ extern SDL_DECLSPEC SDL_GPURenderPass *SDLCALL SDL_BeginGPURenderPass( - SDL_GPUCommandBuffer *commandBuffer, - SDL_GPUColorAttachmentInfo *colorAttachmentInfos, - Uint32 colorAttachmentCount, - SDL_GPUDepthStencilAttachmentInfo *depthStencilAttachmentInfo); + SDL_GPUCommandBuffer *command_buffer, + const SDL_GPUColorTargetInfo *color_target_infos, + Uint32 num_color_targets, + const SDL_GPUDepthStencilTargetInfo *depth_stencil_target_info); /** * Binds a graphics pipeline on a render pass to be used in rendering. * * A graphics pipeline must be bound before making any draw calls. * - * \param renderPass a render pass handle. - * \param graphicsPipeline the graphics pipeline to bind. + * \param render_pass a render pass handle. + * \param graphics_pipeline the graphics pipeline to bind. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUGraphicsPipeline( - SDL_GPURenderPass *renderPass, - SDL_GPUGraphicsPipeline *graphicsPipeline); + SDL_GPURenderPass *render_pass, + SDL_GPUGraphicsPipeline *graphics_pipeline); /** * Sets the current viewport state on a command buffer. * - * \param renderPass a render pass handle. + * \param render_pass a render pass handle. * \param viewport the viewport to set. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUViewport( - SDL_GPURenderPass *renderPass, - SDL_GPUViewport *viewport); + SDL_GPURenderPass *render_pass, + const SDL_GPUViewport *viewport); /** * Sets the current scissor state on a command buffer. * - * \param renderPass a render pass handle. + * \param render_pass a render pass handle. * \param scissor the scissor area to set. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUScissor( - SDL_GPURenderPass *renderPass, - SDL_Rect *scissor); + SDL_GPURenderPass *render_pass, + const SDL_Rect *scissor); + +/** + * Sets the current blend constants on a command buffer. + * + * \param render_pass a render pass handle. + * \param blend_constants the blend constant color. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GPU_BLENDFACTOR_CONSTANT_COLOR + * \sa SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBlendConstants( + SDL_GPURenderPass *render_pass, + SDL_FColor blend_constants); + +/** + * Sets the current stencil reference value on a command buffer. + * + * \param render_pass a render pass handle. + * \param reference the stencil reference value to set. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetGPUStencilReference( + SDL_GPURenderPass *render_pass, + Uint8 reference); /** * Binds vertex buffers on a command buffer for use with subsequent draw * calls. * - * \param renderPass a render pass handle. - * \param firstBinding the starting bind point for the vertex buffers. - * \param pBindings an array of SDL_GPUBufferBinding structs containing vertex - * buffers and offset values. - * \param bindingCount the number of bindings in the pBindings array. + * \param render_pass a render pass handle. + * \param first_slot the vertex buffer slot to begin binding from. + * \param bindings an array of SDL_GPUBufferBinding structs containing vertex + * buffers and offset values. + * \param num_bindings the number of bindings in the bindings array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexBuffers( - SDL_GPURenderPass *renderPass, - Uint32 firstBinding, - SDL_GPUBufferBinding *pBindings, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + const SDL_GPUBufferBinding *bindings, + Uint32 num_bindings); /** * Binds an index buffer on a command buffer for use with subsequent draw * calls. * - * \param renderPass a render pass handle. - * \param pBinding a pointer to a struct containing an index buffer and - * offset. - * \param indexElementSize whether the index values in the buffer are 16- or - * 32-bit. + * \param render_pass a render pass handle. + * \param binding a pointer to a struct containing an index buffer and offset. + * \param index_element_size whether the index values in the buffer are 16- or + * 32-bit. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUIndexBuffer( - SDL_GPURenderPass *renderPass, - SDL_GPUBufferBinding *pBinding, - SDL_GPUIndexElementSize indexElementSize); + SDL_GPURenderPass *render_pass, + const SDL_GPUBufferBinding *binding, + SDL_GPUIndexElementSize index_element_size); /** * Binds texture-sampler pairs for use on the vertex shader. * - * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER_BIT. + * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. * - * \param renderPass a render pass handle. - * \param firstSlot the vertex sampler slot to begin binding from. - * \param textureSamplerBindings an array of texture-sampler binding structs. - * \param bindingCount the number of texture-sampler pairs to bind from the + * \param render_pass a render pass handle. + * \param first_slot the vertex sampler slot to begin binding from. + * \param texture_sampler_bindings an array of texture-sampler binding + * structs. + * \param num_bindings the number of texture-sampler pairs to bind from the * array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexSamplers( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUTextureSamplerBinding *textureSamplerBindings, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + const SDL_GPUTextureSamplerBinding *texture_sampler_bindings, + Uint32 num_bindings); /** * Binds storage textures for use on the vertex shader. * * These textures must have been created with - * SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ_BIT. + * SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ. * - * \param renderPass a render pass handle. - * \param firstSlot the vertex storage texture slot to begin binding from. - * \param storageTextures an array of storage textures. - * \param bindingCount the number of storage texture to bind from the array. + * \param render_pass a render pass handle. + * \param first_slot the vertex storage texture slot to begin binding from. + * \param storage_textures an array of storage textures. + * \param num_bindings the number of storage texture to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageTextures( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUTexture **storageTextures, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + SDL_GPUTexture *const *storage_textures, + Uint32 num_bindings); /** * Binds storage buffers for use on the vertex shader. * * These buffers must have been created with - * SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ_BIT. + * SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ. * - * \param renderPass a render pass handle. - * \param firstSlot the vertex storage buffer slot to begin binding from. - * \param storageBuffers an array of buffers. - * \param bindingCount the number of buffers to bind from the array. + * \param render_pass a render pass handle. + * \param first_slot the vertex storage buffer slot to begin binding from. + * \param storage_buffers an array of buffers. + * \param num_bindings the number of buffers to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageBuffers( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUBuffer **storageBuffers, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + SDL_GPUBuffer *const *storage_buffers, + Uint32 num_bindings); /** * Binds texture-sampler pairs for use on the fragment shader. * - * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER_BIT. + * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. * - * \param renderPass a render pass handle. - * \param firstSlot the fragment sampler slot to begin binding from. - * \param textureSamplerBindings an array of texture-sampler binding structs. - * \param bindingCount the number of texture-sampler pairs to bind from the + * \param render_pass a render pass handle. + * \param first_slot the fragment sampler slot to begin binding from. + * \param texture_sampler_bindings an array of texture-sampler binding + * structs. + * \param num_bindings the number of texture-sampler pairs to bind from the * array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentSamplers( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUTextureSamplerBinding *textureSamplerBindings, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + const SDL_GPUTextureSamplerBinding *texture_sampler_bindings, + Uint32 num_bindings); /** * Binds storage textures for use on the fragment shader. * * These textures must have been created with - * SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ_BIT. + * SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ. * - * \param renderPass a render pass handle. - * \param firstSlot the fragment storage texture slot to begin binding from. - * \param storageTextures an array of storage textures. - * \param bindingCount the number of storage textures to bind from the array. + * \param render_pass a render pass handle. + * \param first_slot the fragment storage texture slot to begin binding from. + * \param storage_textures an array of storage textures. + * \param num_bindings the number of storage textures to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageTextures( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUTexture **storageTextures, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + SDL_GPUTexture *const *storage_textures, + Uint32 num_bindings); /** * Binds storage buffers for use on the fragment shader. * * These buffers must have been created with - * SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ_BIT. + * SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ. * - * \param renderPass a render pass handle. - * \param firstSlot the fragment storage buffer slot to begin binding from. - * \param storageBuffers an array of storage buffers. - * \param bindingCount the number of storage buffers to bind from the array. + * \param render_pass a render pass handle. + * \param first_slot the fragment storage buffer slot to begin binding from. + * \param storage_buffers an array of storage buffers. + * \param num_bindings the number of storage buffers to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageBuffers( - SDL_GPURenderPass *renderPass, - Uint32 firstSlot, - SDL_GPUBuffer **storageBuffers, - Uint32 bindingCount); + SDL_GPURenderPass *render_pass, + Uint32 first_slot, + SDL_GPUBuffer *const *storage_buffers, + Uint32 num_bindings); /* Drawing */ @@ -1789,100 +3097,101 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageBuffers( * * You must not call this function before binding a graphics pipeline. * - * Note that the `firstVertex` and `firstInstance` parameters are NOT + * Note that the `first_vertex` and `first_instance` parameters are NOT * compatible with built-in vertex/instance ID variables in shaders (for - * example, SV_VertexID). If your shader depends on these variables, the - * correlating draw call parameter MUST be 0. + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. * - * \param renderPass a render pass handle. - * \param indexCount the number of vertices to draw per instance. - * \param instanceCount the number of instances to draw. - * \param firstIndex the starting index within the index buffer. - * \param vertexOffset value added to vertex index before indexing into the - * vertex buffer. - * \param firstInstance the ID of the first instance to draw. + * \param render_pass a render pass handle. + * \param num_indices the number of indices to draw per instance. + * \param num_instances the number of instances to draw. + * \param first_index the starting index within the index buffer. + * \param vertex_offset value added to vertex index before indexing into the + * vertex buffer. + * \param first_instance the ID of the first instance to draw. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitives( - SDL_GPURenderPass *renderPass, - Uint32 indexCount, - Uint32 instanceCount, - Uint32 firstIndex, - Sint32 vertexOffset, - Uint32 firstInstance); + SDL_GPURenderPass *render_pass, + Uint32 num_indices, + Uint32 num_instances, + Uint32 first_index, + Sint32 vertex_offset, + Uint32 first_instance); /** * Draws data using bound graphics state. * * You must not call this function before binding a graphics pipeline. * - * Note that the `firstVertex` and `firstInstance` parameters are NOT + * Note that the `first_vertex` and `first_instance` parameters are NOT * compatible with built-in vertex/instance ID variables in shaders (for - * example, SV_VertexID). If your shader depends on these variables, the - * correlating draw call parameter MUST be 0. + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. * - * \param renderPass a render pass handle. - * \param vertexCount the number of vertices to draw. - * \param instanceCount the number of instances that will be drawn. - * \param firstVertex the index of the first vertex to draw. - * \param firstInstance the ID of the first instance to draw. + * \param render_pass a render pass handle. + * \param num_vertices the number of vertices to draw. + * \param num_instances the number of instances that will be drawn. + * \param first_vertex the index of the first vertex to draw. + * \param first_instance the ID of the first instance to draw. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitives( - SDL_GPURenderPass *renderPass, - Uint32 vertexCount, - Uint32 instanceCount, - Uint32 firstVertex, - Uint32 firstInstance); + SDL_GPURenderPass *render_pass, + Uint32 num_vertices, + Uint32 num_instances, + Uint32 first_vertex, + Uint32 first_instance); /** * Draws data using bound graphics state and with draw parameters set from a * buffer. * - * The buffer layout should match the layout of SDL_GPUIndirectDrawCommand. - * You must not call this function before binding a graphics pipeline. + * The buffer must consist of tightly-packed draw parameter sets that each + * match the layout of SDL_GPUIndirectDrawCommand. You must not call this + * function before binding a graphics pipeline. * - * \param renderPass a render pass handle. + * \param render_pass a render pass handle. * \param buffer a buffer containing draw parameters. - * \param offsetInBytes the offset to start reading from the draw buffer. - * \param drawCount the number of draw parameter sets that should be read from - * the draw buffer. - * \param stride the byte stride between sets of draw parameters. + * \param offset the offset to start reading from the draw buffer. + * \param draw_count the number of draw parameter sets that should be read + * from the draw buffer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitivesIndirect( - SDL_GPURenderPass *renderPass, + SDL_GPURenderPass *render_pass, SDL_GPUBuffer *buffer, - Uint32 offsetInBytes, - Uint32 drawCount, - Uint32 stride); + Uint32 offset, + Uint32 draw_count); /** * Draws data using bound graphics state with an index buffer enabled and with * draw parameters set from a buffer. * - * The buffer layout should match the layout of - * SDL_GPUIndexedIndirectDrawCommand. You must not call this function before - * binding a graphics pipeline. + * The buffer must consist of tightly-packed draw parameter sets that each + * match the layout of SDL_GPUIndexedIndirectDrawCommand. You must not call + * this function before binding a graphics pipeline. * - * \param renderPass a render pass handle. + * \param render_pass a render pass handle. * \param buffer a buffer containing draw parameters. - * \param offsetInBytes the offset to start reading from the draw buffer. - * \param drawCount the number of draw parameter sets that should be read from - * the draw buffer. - * \param stride the byte stride between sets of draw parameters. + * \param offset the offset to start reading from the draw buffer. + * \param draw_count the number of draw parameter sets that should be read + * from the draw buffer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitivesIndirect( - SDL_GPURenderPass *renderPass, + SDL_GPURenderPass *render_pass, SDL_GPUBuffer *buffer, - Uint32 offsetInBytes, - Uint32 drawCount, - Uint32 stride); + Uint32 offset, + Uint32 draw_count); /** * Ends the given render pass. @@ -1890,12 +3199,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitivesIndirect( * All bound graphics state on the render pass command buffer is unset. The * render pass handle is now invalid. * - * \param renderPass a render pass handle. + * \param render_pass a render pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EndGPURenderPass( - SDL_GPURenderPass *renderPass); + SDL_GPURenderPass *render_pass); /* Compute Pass */ @@ -1903,89 +3212,115 @@ extern SDL_DECLSPEC void SDLCALL SDL_EndGPURenderPass( * Begins a compute pass on a command buffer. * * A compute pass is defined by a set of texture subresources and buffers that - * will be written to by compute pipelines. These textures and buffers must - * have been created with the COMPUTE_STORAGE_WRITE bit. All operations - * related to compute pipelines must take place inside of a compute pass. You - * must not begin another compute pass, or a render pass or copy pass before - * ending the compute pass. + * may be written to by compute pipelines. These textures and buffers must + * have been created with the COMPUTE_STORAGE_WRITE bit or the + * COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE bit. If you do not create a texture + * with COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE, you must not read from the + * texture in the compute pass. All operations related to compute pipelines + * must take place inside of a compute pass. You must not begin another + * compute pass, or a render pass or copy pass before ending the compute pass. * - * A VERY IMPORTANT NOTE Textures and buffers bound as write-only MUST NOT be - * read from during the compute pass. Doing so will result in undefined - * behavior. If your compute work requires reading the output from a previous - * dispatch, you MUST end the current compute pass and begin a new one before - * you can safely access the data. + * A VERY IMPORTANT NOTE - Reads and writes in compute passes are NOT + * implicitly synchronized. This means you may cause data races by both + * reading and writing a resource region in a compute pass, or by writing + * multiple times to a resource region. If your compute work depends on + * reading the completed output from a previous dispatch, you MUST end the + * current compute pass and begin a new one before you can safely access the + * data. Otherwise you will receive unexpected results. Reading and writing a + * texture in the same compute pass is only supported by specific texture + * formats. Make sure you check the format support! * - * \param commandBuffer a command buffer. - * \param storageTextureBindings an array of writeable storage texture binding - * structs. - * \param storageTextureBindingCount the number of storage textures to bind - * from the array. - * \param storageBufferBindings an array of writeable storage buffer binding - * structs. - * \param storageBufferBindingCount the number of storage buffers to bind from - * the array. + * \param command_buffer a command buffer. + * \param storage_texture_bindings an array of writeable storage texture + * binding structs. + * \param num_storage_texture_bindings the number of storage textures to bind + * from the array. + * \param storage_buffer_bindings an array of writeable storage buffer binding + * structs. + * \param num_storage_buffer_bindings the number of storage buffers to bind + * from the array. * \returns a compute pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_EndGPUComputePass */ extern SDL_DECLSPEC SDL_GPUComputePass *SDLCALL SDL_BeginGPUComputePass( - SDL_GPUCommandBuffer *commandBuffer, - SDL_GPUStorageTextureWriteOnlyBinding *storageTextureBindings, - Uint32 storageTextureBindingCount, - SDL_GPUStorageBufferWriteOnlyBinding *storageBufferBindings, - Uint32 storageBufferBindingCount); + SDL_GPUCommandBuffer *command_buffer, + const SDL_GPUStorageTextureReadWriteBinding *storage_texture_bindings, + Uint32 num_storage_texture_bindings, + const SDL_GPUStorageBufferReadWriteBinding *storage_buffer_bindings, + Uint32 num_storage_buffer_bindings); /** * Binds a compute pipeline on a command buffer for use in compute dispatch. * - * \param computePass a compute pass handle. - * \param computePipeline a compute pipeline to bind. + * \param compute_pass a compute pass handle. + * \param compute_pipeline a compute pipeline to bind. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputePipeline( - SDL_GPUComputePass *computePass, - SDL_GPUComputePipeline *computePipeline); + SDL_GPUComputePass *compute_pass, + SDL_GPUComputePipeline *compute_pipeline); + +/** + * Binds texture-sampler pairs for use on the compute shader. + * + * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. + * + * \param compute_pass a compute pass handle. + * \param first_slot the compute sampler slot to begin binding from. + * \param texture_sampler_bindings an array of texture-sampler binding + * structs. + * \param num_bindings the number of texture-sampler bindings to bind from the + * array. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeSamplers( + SDL_GPUComputePass *compute_pass, + Uint32 first_slot, + const SDL_GPUTextureSamplerBinding *texture_sampler_bindings, + Uint32 num_bindings); /** * Binds storage textures as readonly for use on the compute pipeline. * * These textures must have been created with - * SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ_BIT. + * SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ. * - * \param computePass a compute pass handle. - * \param firstSlot the compute storage texture slot to begin binding from. - * \param storageTextures an array of storage textures. - * \param bindingCount the number of storage textures to bind from the array. + * \param compute_pass a compute pass handle. + * \param first_slot the compute storage texture slot to begin binding from. + * \param storage_textures an array of storage textures. + * \param num_bindings the number of storage textures to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageTextures( - SDL_GPUComputePass *computePass, - Uint32 firstSlot, - SDL_GPUTexture **storageTextures, - Uint32 bindingCount); + SDL_GPUComputePass *compute_pass, + Uint32 first_slot, + SDL_GPUTexture *const *storage_textures, + Uint32 num_bindings); /** * Binds storage buffers as readonly for use on the compute pipeline. * * These buffers must have been created with - * SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ_BIT. + * SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ. * - * \param computePass a compute pass handle. - * \param firstSlot the compute storage buffer slot to begin binding from. - * \param storageBuffers an array of storage buffer binding structs. - * \param bindingCount the number of storage buffers to bind from the array. + * \param compute_pass a compute pass handle. + * \param first_slot the compute storage buffer slot to begin binding from. + * \param storage_buffers an array of storage buffer binding structs. + * \param num_bindings the number of storage buffers to bind from the array. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageBuffers( - SDL_GPUComputePass *computePass, - Uint32 firstSlot, - SDL_GPUBuffer **storageBuffers, - Uint32 bindingCount); + SDL_GPUComputePass *compute_pass, + Uint32 first_slot, + SDL_GPUBuffer *const *storage_buffers, + Uint32 num_bindings); /** * Dispatches compute work. @@ -1997,21 +3332,21 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageBuffers( * guarantee of which order the writes will occur. If the write order matters, * you MUST end the compute pass and begin another one. * - * \param computePass a compute pass handle. - * \param groupCountX number of local workgroups to dispatch in the X - * dimension. - * \param groupCountY number of local workgroups to dispatch in the Y - * dimension. - * \param groupCountZ number of local workgroups to dispatch in the Z - * dimension. + * \param compute_pass a compute pass handle. + * \param groupcount_x number of local workgroups to dispatch in the X + * dimension. + * \param groupcount_y number of local workgroups to dispatch in the Y + * dimension. + * \param groupcount_z number of local workgroups to dispatch in the Z + * dimension. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUCompute( - SDL_GPUComputePass *computePass, - Uint32 groupCountX, - Uint32 groupCountY, - Uint32 groupCountZ); + SDL_GPUComputePass *compute_pass, + Uint32 groupcount_x, + Uint32 groupcount_y, + Uint32 groupcount_z); /** * Dispatches compute work with parameters set from a buffer. @@ -2025,16 +3360,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUCompute( * guarantee of which order the writes will occur. If the write order matters, * you MUST end the compute pass and begin another one. * - * \param computePass a compute pass handle. + * \param compute_pass a compute pass handle. * \param buffer a buffer containing dispatch parameters. - * \param offsetInBytes the offset to start reading from the dispatch buffer. + * \param offset the offset to start reading from the dispatch buffer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUComputeIndirect( - SDL_GPUComputePass *computePass, + SDL_GPUComputePass *compute_pass, SDL_GPUBuffer *buffer, - Uint32 offsetInBytes); + Uint32 offset); /** * Ends the current compute pass. @@ -2042,12 +3377,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUComputeIndirect( * All bound compute state on the command buffer is unset. The compute pass * handle is now invalid. * - * \param computePass a compute pass handle. + * \param compute_pass a compute pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EndGPUComputePass( - SDL_GPUComputePass *computePass); + SDL_GPUComputePass *compute_pass); /* TransferBuffer Data */ @@ -2057,28 +3392,29 @@ extern SDL_DECLSPEC void SDLCALL SDL_EndGPUComputePass( * You must unmap the transfer buffer before encoding upload commands. * * \param device a GPU context. - * \param transferBuffer a transfer buffer. - * \param cycle if SDL_TRUE, cycles the transfer buffer if it is bound. - * \returns the address of the mapped transfer buffer memory. + * \param transfer_buffer a transfer buffer. + * \param cycle if true, cycles the transfer buffer if it is already bound. + * \returns the address of the mapped transfer buffer memory, or NULL on + * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void *SDLCALL SDL_MapGPUTransferBuffer( SDL_GPUDevice *device, - SDL_GPUTransferBuffer *transferBuffer, - SDL_bool cycle); + SDL_GPUTransferBuffer *transfer_buffer, + bool cycle); /** * Unmaps a previously mapped transfer buffer. * * \param device a GPU context. - * \param transferBuffer a previously mapped transfer buffer. + * \param transfer_buffer a previously mapped transfer buffer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnmapGPUTransferBuffer( SDL_GPUDevice *device, - SDL_GPUTransferBuffer *transferBuffer); + SDL_GPUTransferBuffer *transfer_buffer); /* Copy Pass */ @@ -2089,13 +3425,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnmapGPUTransferBuffer( * inside a copy pass. You must not begin another copy pass, or a render pass * or compute pass before ending the copy pass. * - * \param commandBuffer a command buffer. + * \param command_buffer a command buffer. * \returns a copy pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GPUCopyPass *SDLCALL SDL_BeginGPUCopyPass( - SDL_GPUCommandBuffer *commandBuffer); + SDL_GPUCommandBuffer *command_buffer); /** * Uploads data from a transfer buffer to a texture. @@ -2106,21 +3442,19 @@ extern SDL_DECLSPEC SDL_GPUCopyPass *SDLCALL SDL_BeginGPUCopyPass( * You must align the data in the transfer buffer to a multiple of the texel * size of the texture format. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source the source transfer buffer with image layout information. * \param destination the destination texture region. - * \param cycle if SDL_TRUE, cycles the texture if the texture is bound, - * otherwise overwrites the data. + * \param cycle if true, cycles the texture if the texture is bound, otherwise + * overwrites the data. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUTexture( - SDL_GPUCopyPass *copyPass, - SDL_GPUTextureTransferInfo *source, - SDL_GPUTextureRegion *destination, - SDL_bool cycle); - -/* Uploads data from a TransferBuffer to a Buffer. */ + SDL_GPUCopyPass *copy_pass, + const SDL_GPUTextureTransferInfo *source, + const SDL_GPUTextureRegion *destination, + bool cycle); /** * Uploads data from a transfer buffer to a buffer. @@ -2128,19 +3462,19 @@ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUTexture( * The upload occurs on the GPU timeline. You may assume that the upload has * finished in subsequent commands. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source the source transfer buffer with offset. * \param destination the destination buffer with offset and size. - * \param cycle if SDL_TRUE, cycles the buffer if it is bound, otherwise + * \param cycle if true, cycles the buffer if it is already bound, otherwise * overwrites the data. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUBuffer( - SDL_GPUCopyPass *copyPass, - SDL_GPUTransferBufferLocation *source, - SDL_GPUBufferRegion *destination, - SDL_bool cycle); + SDL_GPUCopyPass *copy_pass, + const SDL_GPUTransferBufferLocation *source, + const SDL_GPUBufferRegion *destination, + bool cycle); /** * Performs a texture-to-texture copy. @@ -2148,27 +3482,25 @@ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUBuffer( * This copy occurs on the GPU timeline. You may assume the copy has finished * in subsequent commands. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source a source texture region. * \param destination a destination texture region. * \param w the width of the region to copy. * \param h the height of the region to copy. * \param d the depth of the region to copy. - * \param cycle if SDL_TRUE, cycles the destination texture if the destination + * \param cycle if true, cycles the destination texture if the destination * texture is bound, otherwise overwrites the data. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUTextureToTexture( - SDL_GPUCopyPass *copyPass, - SDL_GPUTextureLocation *source, - SDL_GPUTextureLocation *destination, + SDL_GPUCopyPass *copy_pass, + const SDL_GPUTextureLocation *source, + const SDL_GPUTextureLocation *destination, Uint32 w, Uint32 h, Uint32 d, - SDL_bool cycle); - -/* Copies data from a buffer to a buffer. */ + bool cycle); /** * Performs a buffer-to-buffer copy. @@ -2176,21 +3508,21 @@ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUTextureToTexture( * This copy occurs on the GPU timeline. You may assume the copy has finished * in subsequent commands. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source the buffer and offset to copy from. * \param destination the buffer and offset to copy to. * \param size the length of the buffer to copy. - * \param cycle if SDL_TRUE, cycles the destination buffer if it is bound, + * \param cycle if true, cycles the destination buffer if it is already bound, * otherwise overwrites the data. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUBufferToBuffer( - SDL_GPUCopyPass *copyPass, - SDL_GPUBufferLocation *source, - SDL_GPUBufferLocation *destination, + SDL_GPUCopyPass *copy_pass, + const SDL_GPUBufferLocation *source, + const SDL_GPUBufferLocation *destination, Uint32 size, - SDL_bool cycle); + bool cycle); /** * Copies data from a texture to a transfer buffer on the GPU timeline. @@ -2198,17 +3530,17 @@ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUBufferToBuffer( * This data is not guaranteed to be copied until the command buffer fence is * signaled. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source the source texture region. * \param destination the destination transfer buffer with image layout * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUTexture( - SDL_GPUCopyPass *copyPass, - SDL_GPUTextureRegion *source, - SDL_GPUTextureTransferInfo *destination); + SDL_GPUCopyPass *copy_pass, + const SDL_GPUTextureRegion *source, + const SDL_GPUTextureTransferInfo *destination); /** * Copies data from a buffer to a transfer buffer on the GPU timeline. @@ -2216,39 +3548,39 @@ extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUTexture( * This data is not guaranteed to be copied until the command buffer fence is * signaled. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * \param source the source buffer with offset and size. * \param destination the destination transfer buffer with offset. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUBuffer( - SDL_GPUCopyPass *copyPass, - SDL_GPUBufferRegion *source, - SDL_GPUTransferBufferLocation *destination); + SDL_GPUCopyPass *copy_pass, + const SDL_GPUBufferRegion *source, + const SDL_GPUTransferBufferLocation *destination); /** * Ends the current copy pass. * - * \param copyPass a copy pass handle. + * \param copy_pass a copy pass handle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EndGPUCopyPass( - SDL_GPUCopyPass *copyPass); + SDL_GPUCopyPass *copy_pass); /** * Generates mipmaps for the given texture. * * This function must not be called inside of any pass. * - * \param commandBuffer a commandBuffer. + * \param command_buffer a command_buffer. * \param texture a texture with more than 1 mip level. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_GenerateMipmapsForGPUTexture( - SDL_GPUCommandBuffer *commandBuffer, + SDL_GPUCommandBuffer *command_buffer, SDL_GPUTexture *texture); /** @@ -2256,23 +3588,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_GenerateMipmapsForGPUTexture( * * This function must not be called inside of any pass. * - * \param commandBuffer a command buffer. - * \param source the texture region to copy from. - * \param destination the texture region to copy to. - * \param flipMode the flip mode for the source texture region. - * \param filterMode the filter mode that will be used when blitting. - * \param cycle if SDL_TRUE, cycles the destination texture if the destination - * texture is bound, otherwise overwrites the data. + * \param command_buffer a command buffer. + * \param info the blit info struct containing the blit parameters. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BlitGPUTexture( - SDL_GPUCommandBuffer *commandBuffer, - SDL_GPUBlitRegion *source, - SDL_GPUBlitRegion *destination, - SDL_FlipMode flipMode, - SDL_GPUFilter filterMode, - SDL_bool cycle); + SDL_GPUCommandBuffer *command_buffer, + const SDL_GPUBlitInfo *info); /* Submission/Presentation */ @@ -2283,17 +3606,17 @@ extern SDL_DECLSPEC void SDLCALL SDL_BlitGPUTexture( * * \param device a GPU context. * \param window an SDL_Window. - * \param swapchainComposition the swapchain composition to check. - * \returns SDL_TRUE if supported, SDL_FALSE if unsupported (or on error). + * \param swapchain_composition the swapchain composition to check. + * \returns true if supported, false if unsupported. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WindowSupportsGPUSwapchainComposition( +extern SDL_DECLSPEC bool SDLCALL SDL_WindowSupportsGPUSwapchainComposition( SDL_GPUDevice *device, SDL_Window *window, - SDL_GPUSwapchainComposition swapchainComposition); + SDL_GPUSwapchainComposition swapchain_composition); /** * Determines whether a presentation mode is supported by the window. @@ -2302,40 +3625,46 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WindowSupportsGPUSwapchainComposition( * * \param device a GPU context. * \param window an SDL_Window. - * \param presentMode the presentation mode to check. - * \returns SDL_TRUE if supported, SDL_FALSE if unsupported (or on error). + * \param present_mode the presentation mode to check. + * \returns true if supported, false if unsupported. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WindowSupportsGPUPresentMode( +extern SDL_DECLSPEC bool SDLCALL SDL_WindowSupportsGPUPresentMode( SDL_GPUDevice *device, SDL_Window *window, - SDL_GPUPresentMode presentMode); + SDL_GPUPresentMode present_mode); /** * Claims a window, creating a swapchain structure for it. * * This must be called before SDL_AcquireGPUSwapchainTexture is called using + * the window. You should only call this function from the thread that created * the window. * * The swapchain will be created with SDL_GPU_SWAPCHAINCOMPOSITION_SDR and * SDL_GPU_PRESENTMODE_VSYNC. If you want to have different swapchain - * parameters, you must call SetSwapchainParameters after claiming the window. + * parameters, you must call SDL_SetGPUSwapchainParameters after claiming the + * window. * * \param device a GPU context. * \param window an SDL_Window. - * \returns SDL_TRUE on success, otherwise SDL_FALSE. + * \returns true on success, or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called from the thread that + * created the window. * - * \sa SDL_AcquireGPUSwapchainTexture + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_WaitAndAcquireGPUSwapchainTexture * \sa SDL_ReleaseWindowFromGPUDevice * \sa SDL_WindowSupportsGPUPresentMode * \sa SDL_WindowSupportsGPUSwapchainComposition */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClaimWindowForGPUDevice( +extern SDL_DECLSPEC bool SDLCALL SDL_ClaimWindowForGPUDevice( SDL_GPUDevice *device, SDL_Window *window); @@ -2345,7 +3674,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClaimWindowForGPUDevice( * \param device a GPU context. * \param window an SDL_Window that has been claimed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice */ @@ -2366,29 +3695,61 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseWindowFromGPUDevice( * * \param device a GPU context. * \param window an SDL_Window that has been claimed. - * \param swapchainComposition the desired composition of the swapchain. - * \param presentMode the desired present mode for the swapchain. - * \returns SDL_TRUE if successful, SDL_FALSE on error. + * \param swapchain_composition the desired composition of the swapchain. + * \param present_mode the desired present mode for the swapchain. + * \returns true if successful, false on error; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WindowSupportsGPUPresentMode * \sa SDL_WindowSupportsGPUSwapchainComposition */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetGPUSwapchainParameters( +extern SDL_DECLSPEC bool SDLCALL SDL_SetGPUSwapchainParameters( SDL_GPUDevice *device, SDL_Window *window, - SDL_GPUSwapchainComposition swapchainComposition, - SDL_GPUPresentMode presentMode); + SDL_GPUSwapchainComposition swapchain_composition, + SDL_GPUPresentMode present_mode); + +/** + * Configures the maximum allowed number of frames in flight. + * + * The default value when the device is created is 2. This means that after + * you have submitted 2 frames for presentation, if the GPU has not finished + * working on the first frame, SDL_AcquireGPUSwapchainTexture() will fill the + * swapchain texture pointer with NULL, and + * SDL_WaitAndAcquireGPUSwapchainTexture() will block. + * + * Higher values increase throughput at the expense of visual latency. Lower + * values decrease visual latency at the expense of throughput. + * + * Note that calling this function will stall and flush the command queue to + * prevent synchronization issues. + * + * The minimum value of allowed frames in flight is 1, and the maximum is 3. + * + * \param device a GPU context. + * \param allowed_frames_in_flight the maximum number of frames that can be + * pending on the GPU. + * \returns true if successful, false on error; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetGPUAllowedFramesInFlight( + SDL_GPUDevice *device, + Uint32 allowed_frames_in_flight); /** * Obtains the texture format of the swapchain for the given window. * + * Note that this format can change if the swapchain parameters change. + * * \param device a GPU context. * \param window an SDL_Window that has been claimed. * \returns the texture format of the swapchain. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUSwapchainTextureFormat( SDL_GPUDevice *device, @@ -2400,28 +3761,118 @@ extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUSwapchainTextureForma * When a swapchain texture is acquired on a command buffer, it will * automatically be submitted for presentation when the command buffer is * submitted. The swapchain texture should only be referenced by the command - * buffer used to acquire it. May return NULL under certain conditions. This - * is not necessarily an error. This texture is managed by the implementation - * and must not be freed by the user. You MUST NOT call this function from any - * thread other than the one that created the window. + * buffer used to acquire it. * - * \param commandBuffer a command buffer. + * This function will fill the swapchain texture handle with NULL if too many + * frames are in flight. This is not an error. + * + * If you use this function, it is possible to create a situation where many + * command buffers are allocated while the rendering context waits for the GPU + * to catch up, which will cause memory usage to grow. You should use + * SDL_WaitAndAcquireGPUSwapchainTexture() unless you know what you are doing + * with timing. + * + * The swapchain texture is managed by the implementation and must not be + * freed by the user. You MUST NOT call this function from any thread other + * than the one that created the window. + * + * \param command_buffer a command buffer. * \param window a window that has been claimed. - * \param pWidth a pointer filled in with the swapchain width. - * \param pHeight a pointer filled in with the swapchain height. - * \returns a swapchain texture. + * \param swapchain_texture a pointer filled in with a swapchain texture + * handle. + * \param swapchain_texture_width a pointer filled in with the swapchain + * texture width, may be NULL. + * \param swapchain_texture_height a pointer filled in with the swapchain + * texture height, may be NULL. + * \returns true on success, false on error; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called from the thread that + * created the window. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice * \sa SDL_SubmitGPUCommandBuffer * \sa SDL_SubmitGPUCommandBufferAndAcquireFence + * \sa SDL_CancelGPUCommandBuffer + * \sa SDL_GetWindowSizeInPixels + * \sa SDL_WaitForGPUSwapchain + * \sa SDL_WaitAndAcquireGPUSwapchainTexture + * \sa SDL_SetGPUAllowedFramesInFlight */ -extern SDL_DECLSPEC SDL_GPUTexture *SDLCALL SDL_AcquireGPUSwapchainTexture( - SDL_GPUCommandBuffer *commandBuffer, +extern SDL_DECLSPEC bool SDLCALL SDL_AcquireGPUSwapchainTexture( + SDL_GPUCommandBuffer *command_buffer, SDL_Window *window, - Uint32 *pWidth, - Uint32 *pHeight); + SDL_GPUTexture **swapchain_texture, + Uint32 *swapchain_texture_width, + Uint32 *swapchain_texture_height); + +/** + * Blocks the thread until a swapchain texture is available to be acquired. + * + * \param device a GPU context. + * \param window a window that has been claimed. + * \returns true on success, false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called from the thread that + * created the window. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_AcquireGPUSwapchainTexture + * \sa SDL_WaitAndAcquireGPUSwapchainTexture + * \sa SDL_SetGPUAllowedFramesInFlight + */ +extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUSwapchain( + SDL_GPUDevice *device, + SDL_Window *window); + +/** + * Blocks the thread until a swapchain texture is available to be acquired, + * and then acquires it. + * + * When a swapchain texture is acquired on a command buffer, it will + * automatically be submitted for presentation when the command buffer is + * submitted. The swapchain texture should only be referenced by the command + * buffer used to acquire it. It is an error to call + * SDL_CancelGPUCommandBuffer() after a swapchain texture is acquired. + * + * This function can fill the swapchain texture handle with NULL in certain + * cases, for example if the window is minimized. This is not an error. You + * should always make sure to check whether the pointer is NULL before + * actually using it. + * + * The swapchain texture is managed by the implementation and must not be + * freed by the user. You MUST NOT call this function from any thread other + * than the one that created the window. + * + * \param command_buffer a command buffer. + * \param window a window that has been claimed. + * \param swapchain_texture a pointer filled in with a swapchain texture + * handle. + * \param swapchain_texture_width a pointer filled in with the swapchain + * texture width, may be NULL. + * \param swapchain_texture_height a pointer filled in with the swapchain + * texture height, may be NULL. + * \returns true on success, false on error; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called from the thread that + * created the window. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SubmitGPUCommandBuffer + * \sa SDL_SubmitGPUCommandBufferAndAcquireFence + */ +extern SDL_DECLSPEC bool SDLCALL SDL_WaitAndAcquireGPUSwapchainTexture( + SDL_GPUCommandBuffer *command_buffer, + SDL_Window *window, + SDL_GPUTexture **swapchain_texture, + Uint32 *swapchain_texture_width, + Uint32 *swapchain_texture_height); /** * Submits a command buffer so its commands can be processed on the GPU. @@ -2433,16 +3884,19 @@ extern SDL_DECLSPEC SDL_GPUTexture *SDLCALL SDL_AcquireGPUSwapchainTexture( * All commands in the submission are guaranteed to begin executing before any * command in a subsequent submission begins executing. * - * \param commandBuffer a command buffer. + * \param command_buffer a command buffer. + * \returns true on success, false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AcquireGPUCommandBuffer + * \sa SDL_WaitAndAcquireGPUSwapchainTexture * \sa SDL_AcquireGPUSwapchainTexture * \sa SDL_SubmitGPUCommandBufferAndAcquireFence */ -extern SDL_DECLSPEC void SDLCALL SDL_SubmitGPUCommandBuffer( - SDL_GPUCommandBuffer *commandBuffer); +extern SDL_DECLSPEC bool SDLCALL SDL_SubmitGPUCommandBuffer( + SDL_GPUCommandBuffer *command_buffer); /** * Submits a command buffer so its commands can be processed on the GPU, and @@ -2456,63 +3910,94 @@ extern SDL_DECLSPEC void SDLCALL SDL_SubmitGPUCommandBuffer( * All commands in the submission are guaranteed to begin executing before any * command in a subsequent submission begins executing. * - * \param commandBuffer a command buffer. - * \returns a fence associated with the command buffer. + * \param command_buffer a command buffer. + * \returns a fence associated with the command buffer, or NULL on failure; + * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AcquireGPUCommandBuffer + * \sa SDL_WaitAndAcquireGPUSwapchainTexture * \sa SDL_AcquireGPUSwapchainTexture * \sa SDL_SubmitGPUCommandBuffer * \sa SDL_ReleaseGPUFence */ extern SDL_DECLSPEC SDL_GPUFence *SDLCALL SDL_SubmitGPUCommandBufferAndAcquireFence( - SDL_GPUCommandBuffer *commandBuffer); + SDL_GPUCommandBuffer *command_buffer); + +/** + * Cancels a command buffer. + * + * None of the enqueued commands are executed. + * + * It is an error to call this function after a swapchain texture has been + * acquired. + * + * This must be called from the thread the command buffer was acquired on. + * + * You must not reference the command buffer after calling this function. + * + * \param command_buffer a command buffer. + * \returns true on success, false on error; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_WaitAndAcquireGPUSwapchainTexture + * \sa SDL_AcquireGPUCommandBuffer + * \sa SDL_AcquireGPUSwapchainTexture + */ +extern SDL_DECLSPEC bool SDLCALL SDL_CancelGPUCommandBuffer( + SDL_GPUCommandBuffer *command_buffer); /** * Blocks the thread until the GPU is completely idle. * * \param device a GPU context. + * \returns true on success, false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WaitForGPUFences */ -extern SDL_DECLSPEC void SDLCALL SDL_WaitForGPUIdle( +extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUIdle( SDL_GPUDevice *device); /** * Blocks the thread until the given fences are signaled. * * \param device a GPU context. - * \param waitAll if 0, wait for any fence to be signaled, if 1, wait for all - * fences to be signaled. - * \param pFences an array of fences to wait on. - * \param fenceCount the number of fences in the pFences array. + * \param wait_all if 0, wait for any fence to be signaled, if 1, wait for all + * fences to be signaled. + * \param fences an array of fences to wait on. + * \param num_fences the number of fences in the fences array. + * \returns true on success, false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBufferAndAcquireFence * \sa SDL_WaitForGPUIdle */ -extern SDL_DECLSPEC void SDLCALL SDL_WaitForGPUFences( +extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUFences( SDL_GPUDevice *device, - SDL_bool waitAll, - SDL_GPUFence **pFences, - Uint32 fenceCount); + bool wait_all, + SDL_GPUFence *const *fences, + Uint32 num_fences); /** * Checks the status of a fence. * * \param device a GPU context. * \param fence a fence. - * \returns SDL_TRUE if the fence is signaled, SDL_FALSE if it is not. + * \returns true if the fence is signaled, false if it is not. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBufferAndAcquireFence */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_QueryGPUFence( +extern SDL_DECLSPEC bool SDLCALL SDL_QueryGPUFence( SDL_GPUDevice *device, SDL_GPUFence *fence); @@ -2522,7 +4007,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_QueryGPUFence( * \param device a GPU context. * \param fence a fence. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBufferAndAcquireFence */ @@ -2535,15 +4020,15 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUFence( /** * Obtains the texel block size for a texture format. * - * \param textureFormat the texture format you want to know the texel size of. + * \param format the texture format you want to know the texel size of. * \returns the texel block size of the texture format. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUTexture */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GPUTextureFormatTexelBlockSize( - SDL_GPUTextureFormat textureFormat); + SDL_GPUTextureFormat format); /** * Determines whether a texture format is supported for a given type and @@ -2555,9 +4040,9 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GPUTextureFormatTexelBlockSize( * \param usage a bitmask of all usage scenarios to check. * \returns whether the texture format is supported for this type and usage. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GPUTextureSupportsFormat( +extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsFormat( SDL_GPUDevice *device, SDL_GPUTextureFormat format, SDL_GPUTextureType type, @@ -2568,15 +4053,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GPUTextureSupportsFormat( * * \param device a GPU context. * \param format the texture format to check. - * \param sampleCount the sample count to check. + * \param sample_count the sample count to check. * \returns a hardware-specific version of min(preferred, possible). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GPUTextureSupportsSampleCount( +extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsSampleCount( SDL_GPUDevice *device, SDL_GPUTextureFormat format, - SDL_GPUSampleCount sampleCount); + SDL_GPUSampleCount sample_count); + +/** + * Calculate the size in bytes of a texture format with dimensions. + * + * \param format a texture format. + * \param width width in pixels. + * \param height height in pixels. + * \param depth_or_layer_count depth for 3D textures or layer count otherwise. + * \returns the size of a texture with this format and dimensions. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_CalculateGPUTextureFormatSize( + SDL_GPUTextureFormat format, + Uint32 width, + Uint32 height, + Uint32 depth_or_layer_count); #ifdef SDL_PLATFORM_GDK @@ -2589,7 +4091,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GPUTextureSupportsSampleCount( * * \param device a GPU context. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch */ @@ -2604,7 +4106,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendGPU(SDL_GPUDevice *device); * * \param device a GPU context. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_guid.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_guid.h index 285b237..e2f32ff 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_guid.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_guid.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -26,13 +26,14 @@ * * A GUID is a 128-bit value that represents something that is uniquely * identifiable by this value: "globally unique." + * + * SDL provides functions to convert a GUID to/from a string. */ #ifndef SDL_guid_h_ #define SDL_guid_h_ #include -#include #include /* Set up for C function definitions, even when using C++ */ @@ -55,7 +56,7 @@ extern "C" { * GUIDs may be platform-dependent (i.e., the same device may report different * GUIDs on different operating systems). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GUID { Uint8 data[16]; @@ -70,7 +71,7 @@ typedef struct SDL_GUID { * \param pszGUID buffer in which to write the ASCII string. * \param cbGUID the size of pszGUID, should be at least 33 bytes. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StringToGUID */ @@ -86,7 +87,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GUIDToString(SDL_GUID guid, char *pszGUID, * \param pchGUID string containing an ASCII representation of a GUID. * \returns a SDL_GUID structure. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GUIDToString */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_haptic.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_haptic.h index 95446fe..a45335b 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_haptic.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_haptic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -66,7 +66,7 @@ * Complete example: * * ```c - * SDL_bool test_haptic(SDL_Joystick *joystick) + * bool test_haptic(SDL_Joystick *joystick) * { * SDL_Haptic *haptic; * SDL_HapticEffect effect; @@ -74,12 +74,12 @@ * * // Open the device * haptic = SDL_OpenHapticFromJoystick(joystick); - * if (haptic == NULL) return SDL_FALSE; // Most likely joystick isn't haptic + * if (haptic == NULL) return false; // Most likely joystick isn't haptic * * // See if it can do sine waves * if ((SDL_GetHapticFeatures(haptic) & SDL_HAPTIC_SINE)==0) { * SDL_CloseHaptic(haptic); // No sine effect - * return SDL_FALSE; + * return false; * } * * // Create the effect @@ -106,7 +106,7 @@ * // Close the device * SDL_CloseHaptic(haptic); * - * return SDL_TRUE; // Success + * return true; // Success * } * ``` * @@ -139,15 +139,14 @@ extern "C" { */ /** - * \typedef SDL_Haptic + * The haptic structure used to identify an SDL haptic. * - * The haptic structure used to identify an SDL haptic. + * \since This struct is available since SDL 3.2.0. * - * \sa SDL_OpenHaptic - * \sa SDL_OpenHapticFromJoystick - * \sa SDL_CloseHaptic + * \sa SDL_OpenHaptic + * \sa SDL_OpenHapticFromJoystick + * \sa SDL_CloseHaptic */ -struct SDL_Haptic; typedef struct SDL_Haptic SDL_Haptic; @@ -168,7 +167,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Constant haptic effect. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -179,7 +178,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates sine waves. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -190,7 +189,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates square waves. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -201,7 +200,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates triangular waves. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -212,7 +211,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates saw tooth up waves. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -223,7 +222,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates saw tooth down waves. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -234,7 +233,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Ramp haptic effect. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticRamp */ @@ -246,7 +245,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates a spring. Effect is based on the * axes position. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -258,7 +257,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates dampening. Effect is based on the * axes velocity. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -270,7 +269,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates inertia. Effect is based on the axes * acceleration. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -282,7 +281,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates friction. Effect is based on the * axes movement. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -293,19 +292,31 @@ typedef struct SDL_Haptic SDL_Haptic; * * Haptic effect for direct control over high/low frequency motors. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticLeftRight */ #define SDL_HAPTIC_LEFTRIGHT (1u<<11) /** - * Reserved for future use + * Reserved for future use. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_HAPTIC_RESERVED1 (1u<<12) + +/** + * Reserved for future use. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_HAPTIC_RESERVED2 (1u<<13) + +/** + * Reserved for future use. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_HAPTIC_RESERVED3 (1u<<14) /** @@ -313,7 +324,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * User defined custom haptic effect. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_HAPTIC_CUSTOM (1u<<15) @@ -326,7 +337,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Device supports setting the global gain. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SetHapticGain */ @@ -337,7 +348,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Device supports setting autocenter. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SetHapticAutocenter */ @@ -348,7 +359,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Device supports querying effect status. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_GetHapticEffectStatus */ @@ -359,7 +370,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Devices supports being paused. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PauseHaptic * \sa SDL_ResumeHaptic @@ -375,7 +386,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Uses polar coordinates for the direction. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -384,7 +395,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Uses cartesian coordinates for the direction. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -393,7 +404,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Uses spherical coordinates for the direction. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -405,7 +416,7 @@ typedef struct SDL_Haptic SDL_Haptic; * This provides better compatibility across platforms and devices as SDL will * guess the correct axis. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -422,7 +433,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Used to play a device an infinite number of times. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_RunHapticEffect */ @@ -523,7 +534,7 @@ typedef struct SDL_Haptic SDL_Haptic; * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters. * ``` * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_POLAR * \sa SDL_HAPTIC_CARTESIAN @@ -547,7 +558,7 @@ typedef struct SDL_HapticDirection * A constant effect applies a constant force in the specified direction to * the joystick. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_CONSTANT * \sa SDL_HapticEffect @@ -629,7 +640,7 @@ typedef struct SDL_HapticConstant * \| \| \| \| \| \| \| * ``` * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_SINE * \sa SDL_HAPTIC_SQUARE @@ -685,7 +696,7 @@ typedef struct SDL_HapticPeriodic * SDL_HapticDirection diagram for which side is positive and which is * negative. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HapticDirection * \sa SDL_HAPTIC_SPRING @@ -699,7 +710,7 @@ 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. */ + SDL_HapticDirection direction; /**< Direction of the effect. */ /* Replay */ Uint32 length; /**< Duration of the effect. */ @@ -728,7 +739,7 @@ typedef struct SDL_HapticCondition * effects get added to the ramp effect making the effect become quadratic * instead of linear. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_RAMP * \sa SDL_HapticEffect @@ -767,7 +778,7 @@ typedef struct SDL_HapticRamp * motors, commonly found in modern game controllers. The small (right) motor * is high frequency, and the large (left) motor is low frequency. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_LEFTRIGHT * \sa SDL_HapticEffect @@ -797,7 +808,7 @@ typedef struct SDL_HapticLeftRight * If channels is one, the effect is rotated using the defined direction. * Otherwise it uses the samples in data for the different axes. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_CUSTOM * \sa SDL_HapticEffect @@ -892,7 +903,7 @@ typedef struct SDL_HapticCustom * Note either the attack_level or the fade_level may be above the actual * effect level. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HapticConstant * \sa SDL_HapticPeriodic @@ -921,7 +932,7 @@ typedef union SDL_HapticEffect * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_HapticID; @@ -937,7 +948,7 @@ typedef Uint32 SDL_HapticID; * failure; call SDL_GetError() for more information. This should be * freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHaptic */ @@ -953,7 +964,7 @@ extern SDL_DECLSPEC SDL_HapticID * SDLCALL SDL_GetHaptics(int *count); * this function returns NULL; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticName * \sa SDL_OpenHaptic @@ -974,7 +985,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetHapticNameForID(SDL_HapticID ins * \returns the device identifier or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseHaptic * \sa SDL_GetHaptics @@ -993,7 +1004,7 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHaptic(SDL_HapticID instance_id * \returns an SDL_Haptic on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_GetHapticFromID(SDL_HapticID instance_id); @@ -1004,7 +1015,7 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_GetHapticFromID(SDL_HapticID instan * \returns the instance ID of the specified haptic device on success or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_HapticID SDLCALL SDL_GetHapticID(SDL_Haptic *haptic); @@ -1016,7 +1027,7 @@ extern SDL_DECLSPEC SDL_HapticID SDLCALL SDL_GetHapticID(SDL_Haptic *haptic); * this function returns NULL; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticNameForID */ @@ -1025,13 +1036,13 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetHapticName(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. + * \returns true if the mouse is haptic or false if it isn't. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHapticFromMouse */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsMouseHaptic(void); +extern SDL_DECLSPEC bool SDLCALL SDL_IsMouseHaptic(void); /** * Try to open a haptic device from the current mouse. @@ -1039,7 +1050,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsMouseHaptic(void); * \returns the haptic device identifier or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseHaptic * \sa SDL_IsMouseHaptic @@ -1050,13 +1061,13 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHapticFromMouse(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 or SDL_FALSE if it isn't. + * \returns true if the joystick is haptic or false if it isn't. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHapticFromJoystick */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsJoystickHaptic(SDL_Joystick *joystick); +extern SDL_DECLSPEC bool SDLCALL SDL_IsJoystickHaptic(SDL_Joystick *joystick); /** * Open a haptic device for use from a joystick device. @@ -1073,7 +1084,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsJoystickHaptic(SDL_Joystick *joystick * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseHaptic * \sa SDL_IsJoystickHaptic @@ -1085,7 +1096,7 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHapticFromJoystick(SDL_Joystick * * \param haptic the SDL_Haptic device to close. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHaptic */ @@ -1102,7 +1113,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseHaptic(SDL_Haptic *haptic); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMaxHapticEffectsPlaying * \sa SDL_GetHapticFeatures @@ -1118,7 +1129,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetMaxHapticEffects(SDL_Haptic *haptic); * \returns the number of effects the haptic device can play at the same time * or -1 on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMaxHapticEffects * \sa SDL_GetHapticFeatures @@ -1132,7 +1143,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetMaxHapticEffectsPlaying(SDL_Haptic *hapti * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HapticEffectSupported * \sa SDL_GetMaxHapticEffects @@ -1149,7 +1160,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetHapticFeatures(SDL_Haptic *haptic); * \returns the number of axes on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetNumHapticAxes(SDL_Haptic *haptic); @@ -1158,14 +1169,14 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumHapticAxes(SDL_Haptic *haptic); * * \param haptic the SDL_Haptic device to query. * \param effect the desired effect to query. - * \returns SDL_TRUE if the effect is supported or SDL_FALSE if it isn't. + * \returns true if the effect is supported or false if it isn't. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateHapticEffect * \sa SDL_GetHapticFeatures */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HapticEffectSupported(SDL_Haptic *haptic, const SDL_HapticEffect *effect); +extern SDL_DECLSPEC bool SDLCALL SDL_HapticEffectSupported(SDL_Haptic *haptic, const SDL_HapticEffect *effect); /** * Create a new haptic effect on a specified device. @@ -1176,7 +1187,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HapticEffectSupported(SDL_Haptic *hapti * \returns the ID of the effect on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyHapticEffect * \sa SDL_RunHapticEffect @@ -1196,15 +1207,15 @@ extern SDL_DECLSPEC int SDLCALL SDL_CreateHapticEffect(SDL_Haptic *haptic, const * \param effect the identifier of the effect to update. * \param data an SDL_HapticEffect structure containing the new effect * properties to use. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateHapticEffect * \sa SDL_RunHapticEffect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, int effect, const SDL_HapticEffect *data); +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, int effect, const SDL_HapticEffect *data); /** * Run the haptic effect on its associated haptic device. @@ -1219,31 +1230,31 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticEffectStatus * \sa SDL_StopHapticEffect * \sa SDL_StopHapticEffects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RunHapticEffect(SDL_Haptic *haptic, int effect, Uint32 iterations); +extern SDL_DECLSPEC bool SDLCALL SDL_RunHapticEffect(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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RunHapticEffect * \sa SDL_StopHapticEffects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, int effect); +extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, int effect); /** * Destroy a haptic effect on the device. @@ -1254,7 +1265,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, in * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateHapticEffect */ @@ -1267,14 +1278,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyHapticEffect(SDL_Haptic *haptic, int * * \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 SDL_TRUE if it is playing, SDL_FALSE if it isn't playing or haptic - * status isn't supported. + * \returns true if it is playing, false if it isn't playing or haptic status + * isn't supported. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticFeatures */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetHapticEffectStatus(SDL_Haptic *haptic, int effect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetHapticEffectStatus(SDL_Haptic *haptic, int effect); /** * Set the global gain of the specified haptic device. @@ -1289,14 +1300,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetHapticEffectStatus(SDL_Haptic *hapti * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticFeatures */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHapticGain(SDL_Haptic *haptic, int gain); +extern SDL_DECLSPEC bool SDLCALL SDL_SetHapticGain(SDL_Haptic *haptic, int gain); /** * Set the global autocenter of the device. @@ -1308,14 +1319,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHapticGain(SDL_Haptic *haptic, int g * * \param haptic the SDL_Haptic device to set autocentering on. * \param autocenter value to set autocenter to (0-100). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticFeatures */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHapticAutocenter(SDL_Haptic *haptic, int autocenter); +extern SDL_DECLSPEC bool SDLCALL SDL_SetHapticAutocenter(SDL_Haptic *haptic, int autocenter); /** * Pause a haptic device. @@ -1327,14 +1338,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHapticAutocenter(SDL_Haptic *haptic, * can cause all sorts of weird errors. * * \param haptic the SDL_Haptic device to pause. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResumeHaptic */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseHaptic(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool SDLCALL SDL_PauseHaptic(SDL_Haptic *haptic); /** * Resume a haptic device. @@ -1342,55 +1353,55 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PauseHaptic(SDL_Haptic *haptic); * Call to unpause after SDL_PauseHaptic(). * * \param haptic the SDL_Haptic device to unpause. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PauseHaptic */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResumeHaptic(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool SDLCALL SDL_ResumeHaptic(SDL_Haptic *haptic); /** * Stop all the currently playing effects on a haptic device. * * \param haptic the SDL_Haptic device to stop. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RunHapticEffect * \sa SDL_StopHapticEffects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StopHapticEffects(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticEffects(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 the effect is supported or SDL_FALSE if it isn't. + * \returns true if the effect is supported or false if it isn't. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_InitHapticRumble */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HapticRumbleSupported(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PlayHapticRumble * \sa SDL_StopHapticRumble * \sa SDL_HapticRumbleSupported */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_InitHapticRumble(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool SDLCALL SDL_InitHapticRumble(SDL_Haptic *haptic); /** * Run a simple rumble effect on a haptic device. @@ -1398,28 +1409,28 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_InitHapticRumble(SDL_Haptic *haptic); * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_InitHapticRumble * \sa SDL_StopHapticRumble */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PlayHapticRumble(SDL_Haptic *haptic, float strength, Uint32 length); +extern SDL_DECLSPEC bool SDLCALL SDL_PlayHapticRumble(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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PlayHapticRumble */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StopHapticRumble(SDL_Haptic *haptic); +extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticRumble(SDL_Haptic *haptic); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hidapi.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hidapi.h index 66bea9d..131b037 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hidapi.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hidapi.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -65,14 +65,14 @@ extern "C" { /** * An opaque handle representing an open HID device. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_hid_device SDL_hid_device; /** * HID underlying bus types. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_hid_bus_type { /** Unknown bus type */ @@ -107,7 +107,7 @@ typedef enum SDL_hid_bus_type { /** * Information about a connected HID device * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_hid_device_info { @@ -169,7 +169,7 @@ typedef struct SDL_hid_device_info * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_exit */ @@ -184,7 +184,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_init(void); * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_init */ @@ -205,7 +205,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_exit(void); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_enumerate */ @@ -233,7 +233,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_hid_device_change_count(void); * in the case of failure. Free this linked list by calling * SDL_hid_free_enumeration(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_device_change_count */ @@ -247,7 +247,7 @@ extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_enumerate(unsigned sho * \param devs pointer to a list of struct_device returned from * SDL_hid_enumerate(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *devs); @@ -265,7 +265,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *d * \returns a pointer to a SDL_hid_device object on success or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); @@ -279,7 +279,7 @@ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_ * \returns a pointer to a SDL_hid_device object on success or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path); @@ -306,7 +306,7 @@ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path) * \returns the actual number of bytes written and -1 on on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigned char *data, size_t length); @@ -327,7 +327,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigne * SDL_GetError() for more information. If no packet was available to * be read within the timeout period, this function returns 0. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsigned char *data, size_t length, int milliseconds); @@ -348,7 +348,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsign * be read and the handle is in non-blocking mode, this function * returns 0. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char *data, size_t length); @@ -367,7 +367,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int nonblock); @@ -392,7 +392,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int * \returns the actual number of bytes written and -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, const unsigned char *data, size_t length); @@ -415,7 +415,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, * still in the first byte), or -1 on on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, unsigned char *data, size_t length); @@ -438,7 +438,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, * still in the first byte), or -1 on on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_input_report(SDL_hid_device *dev, unsigned char *data, size_t length); @@ -449,7 +449,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_input_report(SDL_hid_device *dev, un * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_close(SDL_hid_device *dev); @@ -462,7 +462,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_close(SDL_hid_device *dev); * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); @@ -475,7 +475,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device * * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); @@ -488,7 +488,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); @@ -502,7 +502,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, int string_index, wchar_t *string, size_t maxlen); @@ -514,7 +514,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, * on failure; call SDL_GetError() for more information. This struct * is valid until the device is closed with SDL_hid_close(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_get_device_info(SDL_hid_device *dev); @@ -530,18 +530,18 @@ extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_get_device_info(SDL_hi * \returns the number of bytes actually copied or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_report_descriptor(SDL_hid_device *dev, unsigned char *buf, size_t buf_size); /** * 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. + * \param active true to start the scan, false to stop the scan. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC void SDLCALL SDL_hid_ble_scan(SDL_bool active); +extern SDL_DECLSPEC void SDLCALL SDL_hid_ble_scan(bool active); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hints.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hints.h index 8433240..8f2d074 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hints.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hints.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,8 +22,6 @@ /** * # CategoryHints * - * Official documentation for SDL configuration variables - * * This file contains functions to set and get configuration hints, as well as * listing each of them alphabetically. * @@ -63,7 +61,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED "SDL_ALLOW_ALT_TAB_WHILE_GRABBED" @@ -83,7 +81,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY "SDL_ANDROID_ALLOW_RECREATE_ACTIVITY" @@ -98,10 +96,27 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ANDROID_BLOCK_ON_PAUSE "SDL_ANDROID_BLOCK_ON_PAUSE" +/** + * A variable to control whether low latency audio should be enabled. + * + * Some devices have poor quality output when this is enabled, but this is + * usually an improvement in audio latency. + * + * The variable can be set to the following values: + * + * - "0": Low latency audio is not enabled. + * - "1": Low latency audio is enabled. (default) + * + * This hint should be set before SDL audio is initialized. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_ANDROID_LOW_LATENCY_AUDIO "SDL_ANDROID_LOW_LATENCY_AUDIO" + /** * A variable to control whether we trap the Android back button to handle it * manually. @@ -121,7 +136,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ANDROID_TRAP_BACK_BUTTON "SDL_ANDROID_TRAP_BACK_BUTTON" @@ -137,7 +152,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APP_ID "SDL_APP_ID" @@ -155,7 +170,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APP_NAME "SDL_APP_NAME" @@ -178,7 +193,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS "SDL_APPLE_TV_CONTROLLER_UI_EVENTS" @@ -193,7 +208,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION "SDL_APPLE_TV_REMOTE_ALLOW_ROTATION" @@ -201,16 +216,58 @@ extern "C" { * Specify the default ALSA audio device name. * * This variable is a specific audio device to open when the "default" audio - * device is used. By default if 4 channel audio is requested, the - * "plug:surround40" device will be opened and if 6 channel audio is requested - * the "plug:surround51" device will be opened. + * device is used. + * + * This hint will be ignored when opening the default playback device if + * SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE is set, or when opening the + * default recording device if SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE is + * set. * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. + * + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE */ #define SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE "SDL_AUDIO_ALSA_DEFAULT_DEVICE" +/** + * Specify the default ALSA audio playback device name. + * + * This variable is a specific audio device to open for playback, when the + * "default" audio device is used. + * + * If this hint isn't set, SDL will check SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE + * before choosing a reasonable default. + * + * This hint should be set before an audio device is opened. + * + * \since This hint is available since SDL 3.2.0. + * + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE + */ +#define SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE "SDL_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE" + +/** + * Specify the default ALSA audio recording device name. + * + * This variable is a specific audio device to open for recording, when the + * "default" audio device is used. + * + * If this hint isn't set, SDL will check SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE + * before choosing a reasonable default. + * + * This hint should be set before an audio device is opened. + * + * \since This hint is available since SDL 3.2.0. + * + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE + * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE + */ +#define SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE "SDL_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE" + /** * A variable controlling the audio category on iOS and macOS. * @@ -225,7 +282,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_CATEGORY "SDL_AUDIO_CATEGORY" @@ -238,7 +295,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_CHANNELS "SDL_AUDIO_CHANNELS" @@ -261,7 +318,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_APP_ICON_NAME "SDL_AUDIO_DEVICE_APP_ICON_NAME" @@ -283,7 +340,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES "SDL_AUDIO_DEVICE_SAMPLE_FRAMES" @@ -310,7 +367,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_STREAM_NAME "SDL_AUDIO_DEVICE_STREAM_NAME" @@ -336,7 +393,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_STREAM_ROLE "SDL_AUDIO_DEVICE_STREAM_ROLE" @@ -347,7 +404,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DISK_INPUT_FILE "SDL_AUDIO_DISK_INPUT_FILE" @@ -358,7 +415,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DISK_OUTPUT_FILE "SDL_AUDIO_DISK_OUTPUT_FILE" @@ -371,7 +428,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DISK_TIMESCALE "SDL_AUDIO_DISK_TIMESCALE" @@ -385,7 +442,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DRIVER "SDL_AUDIO_DRIVER" @@ -398,7 +455,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DUMMY_TIMESCALE "SDL_AUDIO_DUMMY_TIMESCALE" @@ -409,18 +466,23 @@ extern "C" { * device, this hint can be used to specify a default format that will be * used. * - * The variable can be set to the following values: - "U8": Unsigned 8-bit - * audio - "S8": Signed 8-bit audio - "S16LE": Signed 16-bit little-endian - * audio - "S16BE": Signed 16-bit big-endian audio - "S16": Signed 16-bit - * native-endian audio (default) - "S32LE": Signed 32-bit little-endian audio - * - "S32BE": Signed 32-bit big-endian audio - "S32": Signed 32-bit - * native-endian audio - "F32LE": Floating point little-endian audio - - * "F32BE": Floating point big-endian audio - "F32": Floating point - * native-endian audio + * The variable can be set to the following values: + * + * - "U8": Unsigned 8-bit audio + * - "S8": Signed 8-bit audio + * - "S16LE": Signed 16-bit little-endian audio + * - "S16BE": Signed 16-bit big-endian audio + * - "S16": Signed 16-bit native-endian audio (default) + * - "S32LE": Signed 32-bit little-endian audio + * - "S32BE": Signed 32-bit big-endian audio + * - "S32": Signed 32-bit native-endian audio + * - "F32LE": Floating point little-endian audio + * - "F32BE": Floating point big-endian audio + * - "F32": Floating point native-endian audio * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_FORMAT "SDL_AUDIO_FORMAT" @@ -433,7 +495,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_FREQUENCY "SDL_AUDIO_FREQUENCY" @@ -456,7 +518,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_INCLUDE_MONITORS "SDL_AUDIO_INCLUDE_MONITORS" @@ -471,7 +533,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUTO_UPDATE_JOYSTICKS "SDL_AUTO_UPDATE_JOYSTICKS" @@ -486,7 +548,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUTO_UPDATE_SENSORS "SDL_AUTO_UPDATE_SENSORS" @@ -509,7 +571,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_BMP_SAVE_LEGACY_FORMAT "SDL_BMP_SAVE_LEGACY_FORMAT" @@ -525,7 +587,7 @@ extern "C" { * best camera backend on your behalf. This hint needs to be set before * SDL_Init() is called to be useful. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_CAMERA_DRIVER "SDL_CAMERA_DRIVER" @@ -558,7 +620,7 @@ extern "C" { * * The items can be prefixed by '+'/'-' to add/remove features. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_CPU_FEATURE_MASK "SDL_CPU_FEATURE_MASK" @@ -572,7 +634,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_DIRECTINPUT "SDL_JOYSTICK_DIRECTINPUT" @@ -601,7 +663,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_FILE_DIALOG_DRIVER "SDL_FILE_DIALOG_DRIVER" @@ -619,7 +681,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_DISPLAY_USABLE_BOUNDS "SDL_DISPLAY_USABLE_BOUNDS" @@ -640,7 +702,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EMSCRIPTEN_ASYNCIFY "SDL_EMSCRIPTEN_ASYNCIFY" @@ -653,7 +715,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EMSCRIPTEN_CANVAS_SELECTOR "SDL_EMSCRIPTEN_CANVAS_SELECTOR" @@ -668,12 +730,13 @@ extern "C" { * - "#document": the javascript document object * - "#screen": the javascript window.screen object * - "#canvas": the WebGL canvas element + * - "#none": Don't bind anything at all * - any other string without a leading # sign applies to the element on the * page with that ID. * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT" @@ -690,7 +753,7 @@ extern "C" { * * This hint must be set before SDL_StartTextInput() is called * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ENABLE_SCREEN_KEYBOARD "SDL_ENABLE_SCREEN_KEYBOARD" @@ -707,7 +770,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EVDEV_DEVICES "SDL_EVDEV_DEVICES" @@ -731,7 +794,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EVENT_LOGGING "SDL_EVENT_LOGGING" @@ -751,7 +814,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_FORCE_RAISEWINDOW "SDL_FORCE_RAISEWINDOW" @@ -772,7 +835,7 @@ extern "C" { * * This hint should be set before calling SDL_GetWindowSurface() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_FRAMEBUFFER_ACCELERATION "SDL_FRAMEBUFFER_ACCELERATION" @@ -787,7 +850,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLERCONFIG "SDL_GAMECONTROLLERCONFIG" @@ -803,7 +866,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLERCONFIG_FILE "SDL_GAMECONTROLLERCONFIG_FILE" @@ -827,7 +890,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLERTYPE "SDL_GAMECONTROLLERTYPE" @@ -845,7 +908,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES "SDL_GAMECONTROLLER_IGNORE_DEVICES" @@ -863,7 +926,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT "SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT" @@ -886,7 +949,7 @@ extern "C" { * * This hint should be set before a gamepad is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLER_SENSOR_FUSION "SDL_GAMECONTROLLER_SENSOR_FUSION" @@ -898,7 +961,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT "SDL_GDK_TEXTINPUT_DEFAULT_TEXT" @@ -910,7 +973,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_DESCRIPTION "SDL_GDK_TEXTINPUT_DESCRIPTION" @@ -925,7 +988,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_MAX_LENGTH "SDL_GDK_TEXTINPUT_MAX_LENGTH" @@ -941,7 +1004,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_SCOPE "SDL_GDK_TEXTINPUT_SCOPE" @@ -952,7 +1015,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_TITLE "SDL_GDK_TEXTINPUT_TITLE" @@ -970,7 +1033,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_LIBUSB "SDL_HIDAPI_LIBUSB" @@ -988,7 +1051,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_LIBUSB_WHITELIST "SDL_HIDAPI_LIBUSB_WHITELIST" @@ -1002,7 +1065,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_UDEV "SDL_HIDAPI_UDEV" @@ -1011,12 +1074,12 @@ extern "C" { * * By default, SDL will try all available GPU 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 "d3d11" if, say, your hardware supports - * D3D12 but want to try using D3D11 instead. + * force a specific target, such as "direct3d11" if, say, your hardware + * supports D3D12 but want to try using D3D11 instead. * - * This hint should be set before SDL_GPUSelectBackend() is called. + * This hint should be set before any GPU functions are called. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GPU_DRIVER "SDL_GPU_DRIVER" @@ -1035,7 +1098,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS "SDL_HIDAPI_ENUMERATE_ONLY_CONTROLLERS" @@ -1052,7 +1115,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_IGNORE_DEVICES "SDL_HIDAPI_IGNORE_DEVICES" @@ -1075,7 +1138,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_IME_IMPLEMENTED_UI "SDL_IME_IMPLEMENTED_UI" @@ -1094,7 +1157,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_IOS_HIDE_HOME_INDICATOR "SDL_IOS_HIDE_HOME_INDICATOR" @@ -1111,7 +1174,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS" @@ -1128,7 +1191,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES "SDL_JOYSTICK_ARCADESTICK_DEVICES" @@ -1149,7 +1212,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED" @@ -1167,7 +1230,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_BLACKLIST_DEVICES "SDL_JOYSTICK_BLACKLIST_DEVICES" @@ -1188,7 +1251,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED "SDL_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED" @@ -1198,10 +1261,35 @@ extern "C" { * * This variable is currently only used by the Linux joystick driver. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_DEVICE "SDL_JOYSTICK_DEVICE" +/** + * A variable controlling whether enhanced reports should be used for + * controllers when using the HIDAPI driver. + * + * Enhanced reports allow rumble and effects on Bluetooth PlayStation + * controllers and gyro on Nintendo Switch controllers, but break Windows + * DirectInput for other applications that don't use SDL. + * + * Once enhanced reports are enabled, they can't be disabled on PlayStation + * controllers without power cycling the controller. + * + * The variable can be set to the following values: + * + * - "0": enhanced reports are not enabled. + * - "1": enhanced reports are enabled. (default) + * - "auto": enhanced features are advertised to the application, but SDL + * doesn't change the controller report mode unless the application uses + * them. + * + * This hint can be enabled anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_JOYSTICK_ENHANCED_REPORTS "SDL_JOYSTICK_ENHANCED_REPORTS" + /** * A variable containing a list of flightstick style controllers. * @@ -1215,7 +1303,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES "SDL_JOYSTICK_FLIGHTSTICK_DEVICES" @@ -1236,7 +1324,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED" @@ -1246,12 +1334,14 @@ extern "C" { * * The variable can be set to the following values: * - * - "0": GameInput is not used. (default) + * - "0": GameInput is not used. * - "1": GameInput is used. * + * The default is "1" on GDK platforms, and "0" otherwise. + * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_GAMEINPUT "SDL_JOYSTICK_GAMEINPUT" @@ -1269,7 +1359,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_GAMECUBE_DEVICES "SDL_JOYSTICK_GAMECUBE_DEVICES" @@ -1290,7 +1380,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED "SDL_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED" @@ -1305,9 +1395,9 @@ extern "C" { * This variable is the default for all drivers, but can be overridden by the * hints for specific drivers below. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI "SDL_JOYSTICK_HIDAPI" @@ -1322,9 +1412,9 @@ extern "C" { * - "1": Left and right Joy-Con controllers will be combined into a single * controller. (default) * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS "SDL_JOYSTICK_HIDAPI_COMBINE_JOY_CONS" @@ -1339,9 +1429,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE "SDL_JOYSTICK_HIDAPI_GAMECUBE" @@ -1362,7 +1452,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE "SDL_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE" @@ -1377,9 +1467,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS "SDL_JOYSTICK_HIDAPI_JOY_CONS" @@ -1398,7 +1488,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED "SDL_JOYSTICK_HIDAPI_JOYCON_HOME_LED" @@ -1413,9 +1503,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_LUNA "SDL_JOYSTICK_HIDAPI_LUNA" @@ -1430,9 +1520,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC "SDL_JOYSTICK_HIDAPI_NINTENDO_CLASSIC" @@ -1452,9 +1542,9 @@ extern "C" { * SDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER. See * https://github.com/ViGEm/DsHidMini for an alternative driver on Windows. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS3 "SDL_JOYSTICK_HIDAPI_PS3" @@ -1469,9 +1559,9 @@ extern "C" { * * The default value is 0. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER "SDL_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER" @@ -1486,9 +1576,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS4 "SDL_JOYSTICK_HIDAPI_PS4" @@ -1503,36 +1593,10 @@ extern "C" { * This hint can be set anytime, but only takes effect when extended input * reports are enabled. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL "SDL_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL" -/** - * A variable controlling whether extended input reports should be used for - * PS4 controllers when using the HIDAPI driver. - * - * The variable can be set to the following values: - * - * - "0": extended reports are not enabled. (default) - * - "1": extended reports are enabled. - * - * 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. - * - * This hint can be enabled anytime. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE "SDL_JOYSTICK_HIDAPI_PS4_RUMBLE" - /** * A variable controlling whether the HIDAPI driver for PS5 controllers should * be used. @@ -1544,9 +1608,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS5 "SDL_JOYSTICK_HIDAPI_PS5" @@ -1559,35 +1623,10 @@ extern "C" { * - "0": player LEDs are not enabled. * - "1": player LEDs are enabled. (default) * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED "SDL_JOYSTICK_HIDAPI_PS5_PLAYER_LED" -/** - * A variable controlling whether extended input reports should be used for - * PS5 controllers when using the HIDAPI driver. - * - * The variable can be set to the following values: - * - * - "0": extended reports are not enabled. (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. - * - * This hint can be enabled anytime. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE "SDL_JOYSTICK_HIDAPI_PS5_RUMBLE" - /** * A variable controlling whether the HIDAPI driver for NVIDIA SHIELD * controllers should be used. @@ -1599,9 +1638,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SHIELD "SDL_JOYSTICK_HIDAPI_SHIELD" @@ -1616,7 +1655,7 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STADIA "SDL_JOYSTICK_HIDAPI_STADIA" @@ -1631,12 +1670,31 @@ extern "C" { * Bluetooth access and may prompt the user for permission on iOS and * Android. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STEAM "SDL_JOYSTICK_HIDAPI_STEAM" +/** + * A variable controlling whether the Steam button LED should be turned on + * when a Steam controller is opened. + * + * The variable can be set to the following values: + * + * - "0": Steam button LED is turned off. + * - "1": Steam button LED is turned on. + * + * By default the Steam 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 Steam button LED. + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_STEAM_HOME_LED "SDL_JOYSTICK_HIDAPI_STEAM_HOME_LED" + /** * A variable controlling whether the HIDAPI driver for the Steam Deck builtin * controller should be used. @@ -1648,12 +1706,23 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STEAMDECK "SDL_JOYSTICK_HIDAPI_STEAMDECK" +/** + * A variable controlling whether the HIDAPI driver for HORI licensed 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 + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_STEAM_HORI "SDL_JOYSTICK_HIDAPI_STEAM_HORI" + /** * A variable controlling whether the HIDAPI driver for Nintendo Switch * controllers should be used. @@ -1665,9 +1734,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH "SDL_JOYSTICK_HIDAPI_SWITCH" @@ -1686,7 +1755,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED "SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED" @@ -1701,7 +1770,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED "SDL_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED" @@ -1717,7 +1786,7 @@ extern "C" { * * This hint should be set before opening a Joy-Con controller. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS "SDL_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS" @@ -1730,12 +1799,12 @@ extern "C" { * - "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. + * This driver doesn't work with the dolphinbar, so the default is false for + * now. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_WII "SDL_JOYSTICK_HIDAPI_WII" @@ -1750,7 +1819,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED "SDL_JOYSTICK_HIDAPI_WII_PLAYER_LED" @@ -1766,9 +1835,9 @@ extern "C" { * The default is "0" on Windows, otherwise the value of * SDL_HINT_JOYSTICK_HIDAPI * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX "SDL_JOYSTICK_HIDAPI_XBOX" @@ -1783,9 +1852,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 "SDL_JOYSTICK_HIDAPI_XBOX_360" @@ -1800,7 +1869,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED "SDL_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED" @@ -1815,9 +1884,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS "SDL_JOYSTICK_HIDAPI_XBOX_360_WIRELESS" @@ -1832,9 +1901,9 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX. * - * This hint should be set before enumerating controllers. + * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE "SDL_JOYSTICK_HIDAPI_XBOX_ONE" @@ -1853,7 +1922,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED "SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED" @@ -1868,7 +1937,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_IOKIT "SDL_JOYSTICK_IOKIT" @@ -1883,7 +1952,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_CLASSIC "SDL_JOYSTICK_LINUX_CLASSIC" @@ -1898,7 +1967,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_DEADZONES "SDL_JOYSTICK_LINUX_DEADZONES" @@ -1916,7 +1985,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS "SDL_JOYSTICK_LINUX_DIGITAL_HATS" @@ -1932,7 +2001,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES "SDL_JOYSTICK_LINUX_HAT_DEADZONES" @@ -1947,7 +2016,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_MFI "SDL_JOYSTICK_MFI" @@ -1962,7 +2031,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_RAWINPUT "SDL_JOYSTICK_RAWINPUT" @@ -1979,7 +2048,7 @@ extern "C" { * * This hint should be set before a gamepad is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT "SDL_JOYSTICK_RAWINPUT_CORRELATE_XINPUT" @@ -1994,7 +2063,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ROG_CHAKRAM "SDL_JOYSTICK_ROG_CHAKRAM" @@ -2004,12 +2073,12 @@ extern "C" { * * The variable can be set to the following values: * - * - "0": A separate thread is not used. (default) - * - "1": A separate thread is used for handling raw input messages. + * - "0": A separate thread is not used. + * - "1": A separate thread is used for handling raw input messages. (default) * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD" @@ -2026,7 +2095,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_THROTTLE_DEVICES "SDL_JOYSTICK_THROTTLE_DEVICES" @@ -2047,7 +2116,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_THROTTLE_DEVICES_EXCLUDED "SDL_JOYSTICK_THROTTLE_DEVICES_EXCLUDED" @@ -2062,7 +2131,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_WGI "SDL_JOYSTICK_WGI" @@ -2079,7 +2148,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_WHEEL_DEVICES "SDL_JOYSTICK_WHEEL_DEVICES" @@ -2100,7 +2169,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_WHEEL_DEVICES_EXCLUDED "SDL_JOYSTICK_WHEEL_DEVICES_EXCLUDED" @@ -2118,7 +2187,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ZERO_CENTERED_DEVICES "SDL_JOYSTICK_ZERO_CENTERED_DEVICES" @@ -2139,7 +2208,7 @@ extern "C" { * - "latin_letters": For keyboards using non-Latin letters, such as Russian * or Thai, the letter keys generate keycodes as though it had an en_US * layout. e.g. pressing the key associated with SDL_SCANCODE_A on a Russian - * keyboard would yield 'a' instead of 'ф'. + * keyboard would yield 'a' instead of a Cyrillic letter. * * The default value for this hint is "french_numbers,latin_letters" * @@ -2152,7 +2221,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_KEYCODE_OPTIONS "SDL_KEYCODE_OPTIONS" @@ -2166,7 +2235,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_KMSDRM_DEVICE_INDEX "SDL_KMSDRM_DEVICE_INDEX" @@ -2194,7 +2263,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER "SDL_KMSDRM_REQUIRE_DRM_MASTER" @@ -2220,7 +2289,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_LOGGING "SDL_LOGGING" @@ -2234,9 +2303,9 @@ extern "C" { * (default) * - "1": The application may remain in the background when launched. * - * This hint should be set before applicationDidFinishLaunching() is called. + * This hint needs to be set before SDL_Init(). * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAC_BACKGROUND_APP "SDL_MAC_BACKGROUND_APP" @@ -2252,7 +2321,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK" @@ -2275,25 +2344,73 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH "SDL_MAC_OPENGL_ASYNC_DISPATCH" +/** + * A variable controlling whether the Option (⌥) key on macOS should be + * remapped to act as the Alt key. + * + * The variable can be set to the following values: + * + * - "none": The Option key is not remapped to Alt. (default) + * - "only_left": Only the left Option key is remapped to Alt. + * - "only_right": Only the right Option key is remapped to Alt. + * - "both": Both Option keys are remapped to Alt. + * + * This will prevent the triggering of key compositions that rely on the + * Option key, but will still send the Alt modifier for keyboard events. In + * the case that both Alt and Option are pressed, the Option key will be + * ignored. This is particularly useful for applications like terminal + * emulators and graphical user interfaces (GUIs) that rely on Alt key + * functionality for shortcuts or navigation. This does not apply to + * SDL_GetKeyFromScancode and only has an effect if IME is enabled. + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_MAC_OPTION_AS_ALT "SDL_MAC_OPTION_AS_ALT" + +/** + * A variable controlling whether SDL_EVENT_MOUSE_WHEEL event values will have + * momentum on macOS. + * + * The variable can be set to the following values: + * + * - "0": The mouse wheel events will have no momentum. (default) + * - "1": The mouse wheel events will have momentum. + * + * This hint needs to be set before SDL_Init(). + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_MAC_SCROLL_MOMENTUM "SDL_MAC_SCROLL_MOMENTUM" + /** * Request SDL_AppIterate() be called at a specific rate. * - * This number is in Hz, so "60" means try to iterate 60 times per second. + * If this is set to a number, it represents Hz, so "60" means try to iterate + * 60 times per second. "0" means to iterate as fast as possible. Negative + * values are illegal, but reserved, in case they are useful in a future + * revision of SDL. + * + * There are other strings that have special meaning. If set to "waitevent", + * SDL_AppIterate will not be called until new event(s) have arrived (and been + * processed by SDL_AppEvent). This can be useful for apps that are completely + * idle except in response to input. * * On some platforms, or if you are using SDL_main instead of SDL_AppIterate, * this hint is ignored. When the hint can be used, it is allowed to be * changed at any time. * - * This defaults to 60, and specifying NULL for the hint's value will restore + * This defaults to 0, and specifying NULL for the hint's value will restore * the default. * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAIN_CALLBACK_RATE "SDL_MAIN_CALLBACK_RATE" @@ -2312,7 +2429,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_AUTO_CAPTURE "SDL_MOUSE_AUTO_CAPTURE" @@ -2321,7 +2438,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS "SDL_MOUSE_DOUBLE_CLICK_RADIUS" @@ -2330,10 +2447,22 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_DOUBLE_CLICK_TIME "SDL_MOUSE_DOUBLE_CLICK_TIME" +/** + * A variable setting which system cursor to use as the default cursor. + * + * This should be an integer corresponding to the SDL_SystemCursor enum. The + * default value is zero (SDL_SYSTEM_CURSOR_DEFAULT). + * + * This hint needs to be set before SDL_Init(). + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_MOUSE_DEFAULT_SYSTEM_CURSOR "SDL_MOUSE_DEFAULT_SYSTEM_CURSOR" + /** * A variable controlling whether warping a hidden mouse cursor will activate * relative mouse mode. @@ -2362,7 +2491,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_EMULATE_WARP_WITH_RELATIVE "SDL_MOUSE_EMULATE_WARP_WITH_RELATIVE" @@ -2376,7 +2505,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH "SDL_MOUSE_FOCUS_CLICKTHROUGH" @@ -2386,7 +2515,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_NORMAL_SPEED_SCALE "SDL_MOUSE_NORMAL_SPEED_SCALE" @@ -2407,32 +2536,17 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_MODE_CENTER "SDL_MOUSE_RELATIVE_MODE_CENTER" -/** - * A variable controlling whether relative mouse mode is implemented using - * mouse warping. - * - * The variable can be set to the following values: - * - * - "0": Relative mouse mode uses raw input. (default) - * - "1": Relative mouse mode uses mouse warping. - * - * This hint can be set anytime relative mode is not currently enabled. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_MOUSE_RELATIVE_MODE_WARP "SDL_MOUSE_RELATIVE_MODE_WARP" - /** * A variable setting the scale for mouse motion, in floating point, when the * mouse is in relative mode. * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE "SDL_MOUSE_RELATIVE_SPEED_SCALE" @@ -2446,12 +2560,12 @@ extern "C" { * - "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 + * If SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE is set, that will be applied after * system speed scale. * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE "SDL_MOUSE_RELATIVE_SYSTEM_SCALE" @@ -2470,7 +2584,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_WARP_MOTION "SDL_MOUSE_RELATIVE_WARP_MOTION" @@ -2478,9 +2592,10 @@ extern "C" { * A variable controlling whether the hardware cursor stays visible when * relative mode is active. * - * This variable can be set to the following values: "0" - The cursor will be - * hidden while relative mode is active (default) "1" - The cursor will remain - * visible while relative mode is active + * This variable can be set to the following values: + * + * - "0": The cursor will be hidden while relative mode is active (default) + * - "1": The cursor will remain visible while relative mode is active * * Note that for systems without raw hardware inputs, relative mode is * implemented using warping, so the hardware cursor will visibly warp between @@ -2488,27 +2603,10 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE "SDL_MOUSE_RELATIVE_CURSOR_VISIBLE" -/** - * Controls how often SDL issues cursor confinement commands to the operating - * system while relative mode is active, in case the desired confinement state - * became out-of-sync due to interference from other running programs. - * - * The variable can be integers representing miliseconds between each refresh. - * A value of zero means SDL will not automatically refresh the confinement. - * The default value varies depending on the operating system, this variable - * might not have any effects on inapplicable platforms such as those without - * a cursor. - * - * This hint can be set anytime. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_MOUSE_RELATIVE_CLIP_INTERVAL "SDL_MOUSE_RELATIVE_CLIP_INTERVAL" - /** * A variable controlling whether mouse events should generate synthetic touch * events. @@ -2522,7 +2620,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_TOUCH_EVENTS "SDL_MOUSE_TOUCH_EVENTS" @@ -2540,7 +2638,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MUTE_CONSOLE_KEYBOARD "SDL_MUTE_CONSOLE_KEYBOARD" @@ -2555,7 +2653,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_NO_SIGNAL_HANDLERS "SDL_NO_SIGNAL_HANDLERS" @@ -2563,12 +2661,25 @@ extern "C" { * Specify the OpenGL library to load. * * This hint should be set before creating an OpenGL window or creating an - * OpenGL context. + * OpenGL context. If this hint isn't set, SDL will choose a reasonable + * default. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_OPENGL_LIBRARY "SDL_OPENGL_LIBRARY" +/** + * Specify the EGL library to load. + * + * This hint should be set before creating an OpenGL window or creating an + * OpenGL context. This hint is only considered if SDL is using EGL to manage + * OpenGL contexts. If this hint isn't set, SDL will choose a reasonable + * default. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_EGL_LIBRARY "SDL_EGL_LIBRARY" + /** * A variable controlling what driver to use for OpenGL ES contexts. * @@ -2599,10 +2710,22 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_OPENGL_ES_DRIVER "SDL_OPENGL_ES_DRIVER" +/** + * Mechanism to specify openvr_api library location + * + * By default, when using the OpenVR driver, it will search for the API + * library in the current folder. But, if you wish to use a system API you can + * specify that by using this hint. This should be the full or relative path + * to a .dll on Windows or .so on Linux. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_OPENVR_LIBRARY "SDL_OPENVR_LIBRARY" + /** * A variable controlling which orientations are allowed on iOS/Android. * @@ -2618,7 +2741,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ORIENTATIONS "SDL_ORIENTATIONS" @@ -2638,7 +2761,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_POLL_SENTINEL "SDL_POLL_SENTINEL" @@ -2656,7 +2779,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_PREFERRED_LOCALES "SDL_PREFERRED_LOCALES" @@ -2673,9 +2796,13 @@ extern "C" { * - "1": SDL will send a quit event when the last window is requesting to * close. (default) * + * If there is at least one active system tray icon, SDL_EVENT_QUIT will + * instead be sent when both the last window will be closed and the last tray + * icon will be destroyed. + * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE "SDL_QUIT_ON_LAST_WINDOW_CLOSE" @@ -2690,7 +2817,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_DIRECT3D_THREADSAFE "SDL_RENDER_DIRECT3D_THREADSAFE" @@ -2706,7 +2833,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_RENDER_DIRECT3D11_DEBUG" @@ -2720,7 +2847,7 @@ extern "C" { * * By default, SDL does not use Vulkan Validation Layers. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_VULKAN_DEBUG "SDL_RENDER_VULKAN_DEBUG" @@ -2734,7 +2861,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_GPU_DEBUG "SDL_RENDER_GPU_DEBUG" @@ -2749,7 +2876,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_GPU_LOW_POWER "SDL_RENDER_GPU_LOW_POWER" @@ -2758,7 +2885,7 @@ extern "C" { * * 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. + * can't be initialized, creating a renderer will fail. * * This variable is case insensitive and can be set to the following values: * @@ -2770,14 +2897,19 @@ extern "C" { * - "opengles" * - "metal" * - "vulkan" + * - "gpu" * - "software" * + * This hint accepts a comma-separated list of driver names, and each will be + * tried in the order listed when creating a renderer until one succeeds or + * all of them fail. + * * The default varies by platform, but it's the first one in the list that is * available on the current platform. * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_DRIVER "SDL_RENDER_DRIVER" @@ -2795,7 +2927,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_LINE_METHOD "SDL_RENDER_LINE_METHOD" @@ -2810,7 +2942,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE "SDL_RENDER_METAL_PREFER_LOW_POWER_DEVICE" @@ -2827,7 +2959,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC" @@ -2844,7 +2976,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RETURN_KEY_HIDES_IME "SDL_RETURN_KEY_HIDES_IME" @@ -2861,7 +2993,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. * * \sa SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED */ @@ -2883,7 +3015,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED "SDL_ROG_GAMEPAD_MICE_EXCLUDED" @@ -2895,7 +3027,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RPI_VIDEO_LAYER "SDL_RPI_VIDEO_LAYER" @@ -2917,7 +3049,7 @@ extern "C" { * * This hint should be set before calling SDL_DisableScreenSaver() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME "SDL_SCREENSAVER_INHIBIT_ACTIVITY_NAME" @@ -2936,7 +3068,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_SHUTDOWN_DBUS_ON_QUIT "SDL_SHUTDOWN_DBUS_ON_QUIT" @@ -2950,7 +3082,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_STORAGE_TITLE_DRIVER "SDL_STORAGE_TITLE_DRIVER" @@ -2964,7 +3096,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_STORAGE_USER_DRIVER "SDL_STORAGE_USER_DRIVER" @@ -2991,32 +3123,32 @@ extern "C" { * - "1": Force SDL_THREAD_PRIORITY_TIME_CRITICAL to a realtime scheduling * policy * - * This hint should be set before calling SDL_SetThreadPriority() + * This hint should be set before calling SDL_SetCurrentThreadPriority() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL "SDL_THREAD_FORCE_REALTIME_TIME_CRITICAL" /** * A string specifying additional information to use with - * SDL_SetThreadPriority. + * SDL_SetCurrentThreadPriority. * - * 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. + * By default SDL_SetCurrentThreadPriority 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. * * 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(). + * through RLIMIT_RTTIME after calling SDL_SetCurrentThreadPriority(). * - * This hint should be set before calling SDL_SetThreadPriority() + * This hint should be set before calling SDL_SetCurrentThreadPriority() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_THREAD_PRIORITY_POLICY "SDL_THREAD_PRIORITY_POLICY" @@ -3036,7 +3168,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION" @@ -3051,7 +3183,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TOUCH_MOUSE_EVENTS "SDL_TOUCH_MOUSE_EVENTS" @@ -3072,7 +3204,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TRACKPAD_IS_TOUCH_ONLY "SDL_TRACKPAD_IS_TOUCH_ONLY" @@ -3087,7 +3219,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TV_REMOTE_AS_JOYSTICK "SDL_TV_REMOTE_AS_JOYSTICK" @@ -3101,10 +3233,35 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_ALLOW_SCREENSAVER "SDL_VIDEO_ALLOW_SCREENSAVER" +/** + * A comma separated list containing the names of the displays that SDL should + * sort to the front of the display list. + * + * When this hint is set, displays with matching name strings will be + * prioritized in the list of displays, as exposed by calling + * SDL_GetDisplays(), with the first listed becoming the primary display. The + * naming convention can vary depending on the environment, but it is usually + * a connector name (e.g. 'DP-1', 'DP-2', 'HDMI-A-1',etc...). + * + * On Wayland and X11 desktops, the connector names associated with displays + * can typically be found by using the `xrandr` utility. + * + * This hint is currently supported on the following drivers: + * + * - KMSDRM (kmsdrm) + * - Wayland (wayland) + * - X11 (x11) + * + * This hint should be set before SDL is initialized. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_VIDEO_DISPLAY_PRIORITY "SDL_VIDEO_DISPLAY_PRIORITY" + /** * Tell the video driver that we only want a double buffer. * @@ -3124,7 +3281,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_DOUBLE_BUFFER "SDL_VIDEO_DOUBLE_BUFFER" @@ -3136,9 +3293,13 @@ extern "C" { * force a specific target, such as "x11" if, say, you are on Wayland but want * to try talking to the X server instead. * + * This hint accepts a comma-separated list of driver names, and each will be + * tried in the order listed during init, until one succeeds or all of them + * fail. + * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_DRIVER "SDL_VIDEO_DRIVER" @@ -3151,7 +3312,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_DUMMY_SAVE_FRAMES "SDL_VIDEO_DUMMY_SAVE_FRAMES" @@ -3165,7 +3326,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK "SDL_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK" @@ -3181,7 +3342,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_FORCE_EGL "SDL_VIDEO_FORCE_EGL" @@ -3199,10 +3360,31 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES "SDL_VIDEO_MAC_FULLSCREEN_SPACES" +/** + * A variable that specifies the menu visibility when a window is fullscreen + * in Spaces on macOS. + * + * The variable can be set to the following values: + * + * - "0": The menu will be hidden when the window is in a fullscreen space, + * and not accessible by moving the mouse to the top of the screen. + * - "1": The menu will be accessible when the window is in a fullscreen + * space. + * - "auto": The menu will be hidden if fullscreen mode was toggled on + * programmatically via `SDL_SetWindowFullscreen()`, and accessible if + * fullscreen was entered via the "fullscreen" button on the window title + * bar. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY "SDL_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY" + /** * A variable controlling whether fullscreen windows are minimized when they * lose focus. @@ -3215,7 +3397,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS" @@ -3232,7 +3414,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_OFFSCREEN_SAVE_FRAMES "SDL_VIDEO_OFFSCREEN_SAVE_FRAMES" @@ -3258,7 +3440,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS "SDL_VIDEO_SYNC_WINDOW_OPERATIONS" @@ -3276,7 +3458,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR "SDL_VIDEO_WAYLAND_ALLOW_LIBDECOR" @@ -3296,7 +3478,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_MODE_EMULATION "SDL_VIDEO_WAYLAND_MODE_EMULATION" @@ -3318,7 +3500,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_MODE_SCALING "SDL_VIDEO_WAYLAND_MODE_SCALING" @@ -3338,7 +3520,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR "SDL_VIDEO_WAYLAND_PREFER_LIBDECOR" @@ -3357,6 +3539,8 @@ extern "C" { * * - Rounding errors can result with odd window sizes and/or desktop scales, * which can cause the window contents to appear slightly blurry. + * - Positioning the window may be imprecise due to unit conversions and + * rounding. * - The window may be unusably small on scaled desktops. * - The window may jump in size when moving between displays of different * scale factors. @@ -3375,7 +3559,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_SCALE_TO_DISPLAY "SDL_VIDEO_WAYLAND_SCALE_TO_DISPLAY" @@ -3397,7 +3581,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WIN_D3DCOMPILER "SDL_VIDEO_WIN_D3DCOMPILER" @@ -3412,7 +3596,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR "SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR" @@ -3431,7 +3615,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_NET_WM_PING "SDL_VIDEO_X11_NET_WM_PING" @@ -3445,7 +3629,7 @@ extern "C" { * * This hint should be set before initializing the video subsystem. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_NODIRECTCOLOR "SDL_VIDEO_X11_NODIRECTCOLOR" @@ -3456,7 +3640,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_SCALING_FACTOR "SDL_VIDEO_X11_SCALING_FACTOR" @@ -3465,7 +3649,7 @@ extern "C" { * * This hint should be set before initializing the video subsystem. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_VISUALID "SDL_VIDEO_X11_VISUALID" @@ -3474,7 +3658,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_WINDOW_VISUALID "SDL_VIDEO_X11_WINDOW_VISUALID" @@ -3488,7 +3672,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR" @@ -3503,7 +3687,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_ENABLE_BACK_TOUCH "SDL_VITA_ENABLE_BACK_TOUCH" @@ -3518,7 +3702,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_ENABLE_FRONT_TOUCH "SDL_VITA_ENABLE_FRONT_TOUCH" @@ -3529,7 +3713,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_MODULE_PATH "SDL_VITA_MODULE_PATH" @@ -3542,7 +3726,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_PVR_INIT "SDL_VITA_PVR_INIT" @@ -3557,7 +3741,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_RESOLUTION "SDL_VITA_RESOLUTION" @@ -3572,7 +3756,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_PVR_OPENGL "SDL_VITA_PVR_OPENGL" @@ -3588,7 +3772,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_TOUCH_MOUSE_DEVICE "SDL_VITA_TOUCH_MOUSE_DEVICE" @@ -3599,7 +3783,7 @@ extern "C" { * * This hint should be set before calling SDL_Vulkan_CreateSurface() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VULKAN_DISPLAY "SDL_VULKAN_DISPLAY" @@ -3609,7 +3793,7 @@ extern "C" { * This hint should be set before creating a Vulkan window or calling * SDL_Vulkan_LoadLibrary(). * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VULKAN_LIBRARY "SDL_VULKAN_LIBRARY" @@ -3641,7 +3825,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_FACT_CHUNK "SDL_WAVE_FACT_CHUNK" @@ -3653,7 +3837,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_CHUNK_LIMIT "SDL_WAVE_CHUNK_LIMIT" @@ -3681,7 +3865,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_RIFF_CHUNK_SIZE "SDL_WAVE_RIFF_CHUNK_SIZE" @@ -3701,7 +3885,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_TRUNCATION "SDL_WAVE_TRUNCATION" @@ -3718,7 +3902,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED "SDL_WINDOW_ACTIVATE_WHEN_RAISED" @@ -3735,7 +3919,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN "SDL_WINDOW_ACTIVATE_WHEN_SHOWN" @@ -3753,7 +3937,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_ALLOW_TOPMOST "SDL_WINDOW_ALLOW_TOPMOST" @@ -3769,7 +3953,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN" @@ -3785,7 +3969,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_CLOSE_ON_ALT_F4 "SDL_WINDOWS_CLOSE_ON_ALT_F4" @@ -3814,7 +3998,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS "SDL_WINDOWS_ENABLE_MENU_MNEMONICS" @@ -3829,7 +4013,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP "SDL_WINDOWS_ENABLE_MESSAGELOOP" @@ -3845,7 +4029,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_GAMEINPUT "SDL_WINDOWS_GAMEINPUT" @@ -3859,7 +4043,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_RAW_KEYBOARD "SDL_WINDOWS_RAW_KEYBOARD" @@ -3880,7 +4064,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL "SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL" @@ -3890,9 +4074,18 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_INTRESOURCE_ICON "SDL_WINDOWS_INTRESOURCE_ICON" + +/** + * A variable to specify custom icon resource id from RC file on Windows + * platform. + * + * This hint should be set before SDL is initialized. + * + * \since This hint is available since SDL 3.2.0. + */ #define SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL "SDL_WINDOWS_INTRESOURCE_ICON_SMALL" /** @@ -3917,7 +4110,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_USE_D3D9EX "SDL_WINDOWS_USE_D3D9EX" @@ -3934,123 +4127,10 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_ERASE_BACKGROUND_MODE "SDL_WINDOWS_ERASE_BACKGROUND_MODE" -/** - * A variable controlling whether 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_EVENT_KEY_DOWN - * and SDL_EVENT_KEY_UP), 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_EVENT_KEY_DOWN events that have a scancode of SDL_SCANCODE_AC_BACK. - * (Alternatively, SDL_EVENT_KEY_UP 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 - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_WINRT_HANDLE_BACK_BUTTON "SDL_WINRT_HANDLE_BACK_BUTTON" - -/** - * A variable specifying the 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". - * - * For additional information on linking to a privacy policy, see the - * documentation for SDL_HINT_WINRT_PRIVACY_POLICY_URL. - * - * This hint should be set before SDL is initialized. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_WINRT_PRIVACY_POLICY_LABEL "SDL_WINRT_PRIVACY_POLICY_LABEL" - -/** - * A variable specifying the 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 - * 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. - * - * \since This hint is available since SDL 3.0.0. - */ -#define SDL_HINT_WINRT_PRIVACY_POLICY_URL "SDL_WINRT_PRIVACY_POLICY_URL" - /** * A variable controlling whether X11 windows are marked as override-redirect. * @@ -4068,7 +4148,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_X11_FORCE_OVERRIDE_REDIRECT "SDL_X11_FORCE_OVERRIDE_REDIRECT" @@ -4085,18 +4165,18 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_X11_WINDOW_TYPE "SDL_X11_WINDOW_TYPE" /** * Specify the XCB library to load for the X11 driver. * - * This defaults to "libX11-xcb.so" + * The default is platform-specific, often "libX11-xcb.so.1". * * This hint should be set before initializing the video subsystem. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_X11_XCB_LIBRARY "SDL_X11_XCB_LIBRARY" @@ -4111,7 +4191,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED" @@ -4135,15 +4215,45 @@ extern "C" { * This hint should be set before an assertion failure is triggered and can be * changed at any time. * - * \since This hint is available since SDL 3.0.0. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ASSERT "SDL_ASSERT" +/** + * A variable controlling whether pen events should generate synthetic mouse + * events. + * + * The variable can be set to the following values: + * + * - "0": Pen events will not generate mouse events. + * - "1": Pen events will generate mouse events. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_PEN_MOUSE_EVENTS "SDL_PEN_MOUSE_EVENTS" + +/** + * A variable controlling whether pen events should generate synthetic touch + * events. + * + * The variable can be set to the following values: + * + * - "0": Pen events will not generate touch events. + * - "1": Pen events will generate touch events. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_PEN_TOUCH_EVENTS "SDL_PEN_TOUCH_EVENTS" + /** * An enumeration of hint priorities. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_HintPriority { @@ -4162,18 +4272,18 @@ typedef enum SDL_HintPriority * \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 on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHint * \sa SDL_ResetHint * \sa SDL_SetHint */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name, const char *value, SDL_HintPriority priority); +extern SDL_DECLSPEC bool SDLCALL SDL_SetHintWithPriority(const char *name, const char *value, SDL_HintPriority priority); /** * Set a hint with normal priority. @@ -4184,18 +4294,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name, c * * \param name the hint to set. * \param value the value of the hint variable. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHint * \sa SDL_ResetHint * \sa SDL_SetHintWithPriority */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name, const char *value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetHint(const char *name, const char *value); /** * Reset a hint to the default value. @@ -4205,17 +4315,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name, const char *v * change. * * \param name the hint to set. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetHint * \sa SDL_ResetHints */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResetHint(const char *name); +extern SDL_DECLSPEC bool SDLCALL SDL_ResetHint(const char *name); /** * Reset all hints to the default values. @@ -4226,7 +4336,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResetHint(const char *name); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResetHint */ @@ -4245,7 +4355,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetHints(void); * callback instead is always thread-safe, as SDL holds a lock * on the thread subsystem during the callback. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetHint * \sa SDL_SetHintWithPriority @@ -4262,12 +4372,12 @@ extern SDL_DECLSPEC const char *SDLCALL SDL_GetHint(const char *name); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHint * \sa SDL_SetHint */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bool default_value); +extern SDL_DECLSPEC bool SDLCALL SDL_GetHintBoolean(const char *name, bool default_value); /** * A callback used to send notifications of hint value changes. @@ -4284,7 +4394,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bo * hint value. SDL holds a lock on the hint subsystem when * calling this callback. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_AddHintCallback */ @@ -4300,16 +4410,16 @@ typedef void(SDLCALL *SDL_HintCallback)(void *userdata, const char *name, const * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RemoveHintCallback */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddHintCallback(const char *name, SDL_HintCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_AddHintCallback(const char *name, SDL_HintCallback callback, void *userdata); /** * Remove a function watching a particular hint. @@ -4321,7 +4431,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddHintCallback(const char *name, SDL_H * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddHintCallback */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_init.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_init.h index 5a13947..adf0de8 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_init.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_init.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,10 +22,30 @@ /** * # CategoryInit * - * SDL subsystem init and quit functions. + * All SDL programs need to initialize the library before starting to work + * with it. + * + * Almost everything can simply call SDL_Init() near startup, with a handful + * of flags to specify subsystems to touch. These are here to make sure SDL + * does not even attempt to touch low-level pieces of the operating system + * that you don't intend to use. For example, you might be using SDL for video + * and input but chose an external library for audio, and in this case you + * would just need to leave off the `SDL_INIT_AUDIO` flag to make sure that + * external library has complete control. + * + * Most apps, when terminating, should call SDL_Quit(). This will clean up + * (nearly) everything that SDL might have allocated, and crucially, it'll + * make sure that the display's resolution is back to what the user expects if + * you had previously changed it for your game. + * + * SDL3 apps are strongly encouraged to call SDL_SetAppMetadata() at startup + * to fill in details about the program. This is completely optional, but it + * helps in small ways (we can provide an About dialog box for the macOS menu, + * we can name the app in the system's audio mixer, etc). Those that want to + * provide a _lot_ of information should look at the more-detailed + * SDL_SetAppMetadataProperty(). */ - #ifndef SDL_init_h_ #define SDL_init_h_ @@ -47,7 +67,7 @@ extern "C" { * These are the flags which may be passed to SDL_Init(). You should specify * the subsystems which you will be using in your application. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_Quit @@ -57,9 +77,8 @@ extern "C" { */ typedef Uint32 SDL_InitFlags; -#define SDL_INIT_TIMER 0x00000001u #define SDL_INIT_AUDIO 0x00000010u /**< `SDL_INIT_AUDIO` implies `SDL_INIT_EVENTS` */ -#define SDL_INIT_VIDEO 0x00000020u /**< `SDL_INIT_VIDEO` implies `SDL_INIT_EVENTS` */ +#define SDL_INIT_VIDEO 0x00000020u /**< `SDL_INIT_VIDEO` implies `SDL_INIT_EVENTS`, should be initialized on the main thread */ #define SDL_INIT_JOYSTICK 0x00000200u /**< `SDL_INIT_JOYSTICK` implies `SDL_INIT_EVENTS`, should be initialized on the same thread as SDL_INIT_VIDEO on Windows if you don't set SDL_HINT_JOYSTICK_THREAD */ #define SDL_INIT_HAPTIC 0x00001000u #define SDL_INIT_GAMEPAD 0x00002000u /**< `SDL_INIT_GAMEPAD` implies `SDL_INIT_JOYSTICK` */ @@ -85,7 +104,7 @@ typedef Uint32 SDL_InitFlags; * [Main callbacks in SDL3](https://wiki.libsdl.org/SDL3/README/main-functions#main-callbacks-in-sdl3) * for complete details. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_AppResult { @@ -94,10 +113,70 @@ typedef enum SDL_AppResult SDL_APP_FAILURE /**< Value that requests termination with error from the main callbacks. */ } SDL_AppResult; +/** + * Function pointer typedef for SDL_AppInit. + * + * These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind + * the scenes for apps using the optional main callbacks. Apps that want to + * use this should just implement SDL_AppInit directly. + * + * \param appstate a place where the app can optionally store a pointer for + * future use. + * \param argc the standard ANSI C main's argc; number of elements in `argv`. + * \param argv the standard ANSI C main's argv; array of command line + * arguments. + * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to + * terminate with success, SDL_APP_CONTINUE to continue. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef SDL_AppResult (SDLCALL *SDL_AppInit_func)(void **appstate, int argc, char *argv[]); + +/** + * Function pointer typedef for SDL_AppIterate. + * + * These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind + * the scenes for apps using the optional main callbacks. Apps that want to + * use this should just implement SDL_AppIterate directly. + * + * \param appstate an optional pointer, provided by the app in SDL_AppInit. + * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to + * terminate with success, SDL_APP_CONTINUE to continue. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef SDL_AppResult (SDLCALL *SDL_AppIterate_func)(void *appstate); -typedef SDL_AppResult (SDLCALL *SDL_AppEvent_func)(void *appstate, const SDL_Event *event); -typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate); + +/** + * Function pointer typedef for SDL_AppEvent. + * + * These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind + * the scenes for apps using the optional main callbacks. Apps that want to + * use this should just implement SDL_AppEvent directly. + * + * \param appstate an optional pointer, provided by the app in SDL_AppInit. + * \param event the new event for the app to examine. + * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to + * terminate with success, SDL_APP_CONTINUE to continue. + * + * \since This datatype is available since SDL 3.2.0. + */ +typedef SDL_AppResult (SDLCALL *SDL_AppEvent_func)(void *appstate, SDL_Event *event); + +/** + * Function pointer typedef for SDL_AppQuit. + * + * These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind + * the scenes for apps using the optional main callbacks. Apps that want to + * use this should just implement SDL_AppEvent directly. + * + * \param appstate an optional pointer, provided by the app in SDL_AppInit. + * \param result the result code that terminated the app (success or failure). + * + * \since This datatype is available since SDL 3.2.0. + */ +typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate, SDL_AppResult result); + /** * Initialize the SDL library. @@ -117,11 +196,10 @@ typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate); * * `flags` may be any of the following OR'd together: * - * - `SDL_INIT_TIMER`: timer subsystem * - `SDL_INIT_AUDIO`: audio subsystem; automatically initializes the events * subsystem * - `SDL_INIT_VIDEO`: video subsystem; automatically initializes the events - * subsystem + * subsystem, should be initialized on the main thread. * - `SDL_INIT_JOYSTICK`: joystick subsystem; automatically initializes the * events subsystem * - `SDL_INIT_HAPTIC`: haptic (force feedback) subsystem @@ -143,10 +221,10 @@ typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate); * SDL_SetAppMetadataProperty(). * * \param flags subsystem initialization flags. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAppMetadata * \sa SDL_SetAppMetadataProperty @@ -155,7 +233,7 @@ typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate); * \sa SDL_SetMainReady * \sa SDL_WasInit */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Init(SDL_InitFlags flags); +extern SDL_DECLSPEC bool SDLCALL SDL_Init(SDL_InitFlags flags); /** * Compatibility function to initialize the SDL library. @@ -163,16 +241,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Init(SDL_InitFlags flags); * This function and SDL_Init() are interchangeable. * * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_Quit * \sa SDL_QuitSubSystem */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_InitSubSystem(SDL_InitFlags flags); +extern SDL_DECLSPEC bool SDLCALL SDL_InitSubSystem(SDL_InitFlags flags); /** * Shut down specific SDL subsystems. @@ -182,7 +260,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_InitSubSystem(SDL_InitFlags flags); * * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_InitSubSystem * \sa SDL_Quit @@ -196,7 +274,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_QuitSubSystem(SDL_InitFlags flags); * \returns a mask of all initialized subsystems if `flags` is 0, otherwise it * returns the initialization status of the specified subsystems. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_InitSubSystem @@ -214,13 +292,70 @@ extern SDL_DECLSPEC SDL_InitFlags SDLCALL SDL_WasInit(SDL_InitFlags flags); * 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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_QuitSubSystem */ extern SDL_DECLSPEC void SDLCALL SDL_Quit(void); +/** + * Return whether this is the main thread. + * + * On Apple platforms, the main thread is the thread that runs your program's + * main() entry point. On other platforms, the main thread is the one that + * calls SDL_Init(SDL_INIT_VIDEO), which should usually be the one that runs + * your program's main() entry point. If you are using the main callbacks, + * SDL_AppInit(), SDL_AppIterate(), and SDL_AppQuit() are all called on the + * main thread. + * + * \returns true if this thread is the main thread, or false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_RunOnMainThread + */ +extern SDL_DECLSPEC bool SDLCALL SDL_IsMainThread(void); + +/** + * Callback run on the main thread. + * + * \param userdata an app-controlled pointer that is passed to the callback. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_RunOnMainThread + */ +typedef void (SDLCALL *SDL_MainThreadCallback)(void *userdata); + +/** + * Call a function on the main thread during event processing. + * + * If this is called on the main thread, the callback is executed immediately. + * If this is called on another thread, this callback is queued for execution + * on the main thread during event processing. + * + * Be careful of deadlocks when using this functionality. You should not have + * the main thread wait for the current thread while this function is being + * called with `wait_complete` true. + * + * \param callback the callback to call on the main thread. + * \param userdata a pointer that is passed to `callback`. + * \param wait_complete true to wait for the callback to complete, false to + * return immediately. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_IsMainThread + */ +extern SDL_DECLSPEC bool SDLCALL SDL_RunOnMainThread(SDL_MainThreadCallback callback, void *userdata, bool wait_complete); + /** * Specify basic metadata about your app. * @@ -248,16 +383,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_Quit(void); * hash, or whatever makes sense). * \param appidentifier A unique string in reverse-domain format that * identifies this app ("com.example.mygame2"). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAppMetadataProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAppMetadata(const char *appname, const char *appversion, const char *appidentifier); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAppMetadata(const char *appname, const char *appversion, const char *appidentifier); /** * Specify metadata about your app through a set of properties. @@ -274,7 +409,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAppMetadata(const char *appname, con * Multiple calls to this function are allowed, but various state might not * change once it has been set up with a previous call to this function. * - * Once set, this metadata can be read using SDL_GetMetadataProperty(). + * Once set, this metadata can be read using SDL_GetAppMetadataProperty(). * * These are the supported properties: * @@ -310,17 +445,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAppMetadata(const char *appname, con * * \param name the name of the metadata property to set. * \param value the value of the property, or NULL to remove that property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAppMetadataProperty * \sa SDL_SetAppMetadata */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAppMetadataProperty(const char *name, const char *value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetAppMetadataProperty(const char *name, const char *value); #define SDL_PROP_APP_METADATA_NAME_STRING "SDL.app.metadata.name" #define SDL_PROP_APP_METADATA_VERSION_STRING "SDL.app.metadata.version" @@ -346,7 +481,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetAppMetadataProperty(const char *name * freed if you call SDL_SetAppMetadataProperty() to set that * property from another thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAppMetadata * \sa SDL_SetAppMetadataProperty diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_intrin.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_intrin.h index efba11d..bac6d7a 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_intrin.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_intrin.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -19,8 +19,31 @@ 3. This notice may not be removed or altered from any source distribution. */ -/* - * Header file for CPU intrinsics for SDL +/* WIKI CATEGORY: Intrinsics */ + +/** + * # CategoryIntrinsics + * + * SDL does some preprocessor gymnastics to determine if any CPU-specific + * compiler intrinsics are available, as this is not necessarily an easy thing + * to calculate, and sometimes depends on quirks of a system, versions of + * build tools, and other external forces. + * + * Apps including SDL's headers will be able to check consistent preprocessor + * definitions to decide if it's safe to use compiler intrinsics for a + * specific CPU architecture. This check only tells you that the compiler is + * capable of using those intrinsics; at runtime, you should still check if + * they are available on the current system with the + * [CPU info functions](https://wiki.libsdl.org/SDL3/CategoryCPUInfo) + * , such as SDL_HasSSE() or SDL_HasNEON(). Otherwise, the process might crash + * for using an unsupported CPU instruction. + * + * SDL only sets preprocessor defines for CPU intrinsics if they are + * supported, so apps should check with `#ifdef` and not `#if`. + * + * SDL will also include the appropriate instruction-set-specific support + * headers, so if SDL decides to define SDL_SSE2_INTRINSICS, it will also + * `#include ` as well. */ #ifndef SDL_intrin_h_ @@ -28,6 +51,169 @@ #include +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Defined if (and only if) the compiler supports Loongarch LSX intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_LASX_INTRINSICS + */ +#define SDL_LSX_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Loongarch LSX intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_LASX_INTRINSICS + */ +#define SDL_LASX_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports ARM NEON intrinsics. + * + * If this macro is defined, SDL will have already included `` + * ``, ``, and ``, as appropriate. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_NEON_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports PowerPC Altivec intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ALTIVEC_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel MMX intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE_INTRINSICS + */ +#define SDL_MMX_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel SSE intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE2_INTRINSICS + * \sa SDL_SSE3_INTRINSICS + * \sa SDL_SSE4_1_INTRINSICS + * \sa SDL_SSE4_2_INTRINSICS + */ +#define SDL_SSE_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel SSE2 intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE_INTRINSICS + * \sa SDL_SSE3_INTRINSICS + * \sa SDL_SSE4_1_INTRINSICS + * \sa SDL_SSE4_2_INTRINSICS + */ +#define SDL_SSE2_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel SSE3 intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE_INTRINSICS + * \sa SDL_SSE2_INTRINSICS + * \sa SDL_SSE4_1_INTRINSICS + * \sa SDL_SSE4_2_INTRINSICS + */ +#define SDL_SSE3_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel SSE4.1 intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE_INTRINSICS + * \sa SDL_SSE2_INTRINSICS + * \sa SDL_SSE3_INTRINSICS + * \sa SDL_SSE4_2_INTRINSICS + */ +#define SDL_SSE4_1_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel SSE4.2 intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SSE_INTRINSICS + * \sa SDL_SSE2_INTRINSICS + * \sa SDL_SSE3_INTRINSICS + * \sa SDL_SSE4_1_INTRINSICS + */ +#define SDL_SSE4_2_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel AVX intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_AVX2_INTRINSICS + * \sa SDL_AVX512F_INTRINSICS + */ +#define SDL_AVX_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel AVX2 intrinsics. + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_AVX_INTRINSICS + * \sa SDL_AVX512F_INTRINSICS + */ +#define SDL_AVX2_INTRINSICS 1 + +/** + * Defined if (and only if) the compiler supports Intel AVX-512F intrinsics. + * + * AVX-512F is also sometimes referred to as "AVX-512 Foundation." + * + * If this macro is defined, SDL will have already included `` + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_AVX_INTRINSICS + * \sa SDL_AVX2_INTRINSICS + */ +#define SDL_AVX512F_INTRINSICS 1 +#endif + /* 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)) @@ -81,7 +267,21 @@ _m_prefetch(void *__P) #endif #endif /* compiler version */ -#if defined(__clang__) && defined(__has_attribute) +#ifdef SDL_WIKI_DOCUMENTATION_SECTION +/** + * A macro to decide if the compiler supports `__attribute__((target))`. + * + * Even though this is defined in SDL's public headers, it is generally not + * used directly by apps. Apps should probably just use SDL_TARGETING + * directly, instead. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_TARGETING + */ +#define SDL_HAS_TARGET_ATTRIBS + +#elif defined(__clang__) && defined(__has_attribute) # if __has_attribute(target) # define SDL_HAS_TARGET_ATTRIBS # endif @@ -91,7 +291,55 @@ _m_prefetch(void *__P) # define SDL_HAS_TARGET_ATTRIBS #endif -#ifdef SDL_HAS_TARGET_ATTRIBS + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro to tag a function as targeting a specific CPU architecture. + * + * This is a hint to the compiler that a function should be built with support + * for a CPU instruction set that might be different than the rest of the + * program. + * + * The particulars of this are explained in the GCC documentation: + * + * https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-target-function-attribute + * + * An example of using this feature is to turn on SSE2 support for a specific + * function, even if the rest of the source code is not compiled to use SSE2 + * code: + * + * ```c + * #ifdef SDL_SSE2_INTRINSICS + * static void SDL_TARGETING("sse2") DoSomethingWithSSE2(char *x) { + * ...use SSE2 intrinsic functions, etc... + * } + * #endif + * + * // later... + * #ifdef SDL_SSE2_INTRINSICS + * if (SDL_HasSSE2()) { + * DoSomethingWithSSE2(str); + * } + * #endif + * ``` + * + * The application is, on a whole, built without SSE2 instructions, so it will + * run on Intel machines that don't support SSE2. But then at runtime, it + * checks if the system supports the instructions, and then calls into a + * function that uses SSE2 opcodes. The ifdefs make sure that this code isn't + * used on platforms that don't have SSE2 at all. + * + * On compilers without target support, this is defined to nothing. + * + * This symbol is used by SDL internally, but apps and other libraries are + * welcome to use it for their own interfaces as well. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_TARGETING(x) __attribute__((target(x))) + +#elif defined(SDL_HAS_TARGET_ATTRIBS) # define SDL_TARGETING(x) __attribute__((target(x))) #else # define SDL_TARGETING(x) diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_iostream.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_iostream.h index a306deb..4ca1609 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_iostream.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_iostream.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -25,7 +25,7 @@ * # CategoryIOStream * * SDL provides an abstract interface for reading and writing data streams. It - * offers implementations for files, memory, etc, and the app can provideo + * offers implementations for files, memory, etc, and the app can provide * their own implementations, too. * * SDL_IOStream is not related to the standard C++ iostream class, other than @@ -48,7 +48,7 @@ extern "C" { /** * SDL_IOStream status, set by a read or write operation. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_IOStatus { @@ -66,13 +66,13 @@ typedef enum SDL_IOStatus * These map to the same "whence" concept that `fseek` or `lseek` use in the * standard C runtime. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_IOWhence { SDL_IO_SEEK_SET, /**< Seek from the beginning of data */ SDL_IO_SEEK_CUR, /**< Seek relative to current read point */ - SDL_IO_SEEK_END, /**< Seek relative to the end of data */ + SDL_IO_SEEK_END /**< Seek relative to the end of data */ } SDL_IOWhence; /** @@ -83,10 +83,17 @@ typedef enum SDL_IOWhence * already offers several common types of I/O streams, via functions like * SDL_IOFromFile() and SDL_IOFromMem(). * - * \since This struct is available since SDL 3.0.0. + * This structure should be initialized using SDL_INIT_INTERFACE() + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_INIT_INTERFACE */ typedef struct SDL_IOStreamInterface { + /* The version of this interface */ + Uint32 version; + /** * Return the number of bytes in this SDL_IOStream * @@ -126,18 +133,41 @@ typedef struct SDL_IOStreamInterface */ size_t (SDLCALL *write)(void *userdata, const void *ptr, size_t size, SDL_IOStatus *status); + /** + * If the stream is buffering, make sure the data is written out. + * + * On failure, you should set `*status` to a value from the + * SDL_IOStatus enum. You do not have to explicitly set this on + * a successful flush. + * + * \return true if successful or false on write error when flushing data. + */ + bool (SDLCALL *flush)(void *userdata, SDL_IOStatus *status); + /** * Close and free any allocated resources. * - * The SDL_IOStream is still destroyed even if this fails, so clean up anything - * even if flushing to disk returns an error. + * This does not guarantee file writes will sync to physical media; they + * can be in the system's file cache, waiting to go to disk. * - * \return SDL_TRUE if successful or SDL_FALSE on write error when flushing data. + * The SDL_IOStream is still destroyed even if this fails, so clean up anything + * even if flushing buffers, etc, returns an error. + * + * \return true if successful or false on write error when flushing data. */ - SDL_bool (SDLCALL *close)(void *userdata); + bool (SDLCALL *close)(void *userdata); } SDL_IOStreamInterface; +/* Check the size of SDL_IOStreamInterface + * + * If this assert fails, either the compiler is padding to an unexpected size, + * or the interface has been updated and this should be updated to match and + * the code using this interface should be updated to handle the old version. + */ +SDL_COMPILE_TIME_ASSERT(SDL_IOStreamInterface_SIZE, + (sizeof(void *) == 4 && sizeof(SDL_IOStreamInterface) == 28) || + (sizeof(void *) == 8 && sizeof(SDL_IOStreamInterface) == 56)); /** * The read/write operation structure. @@ -147,7 +177,7 @@ typedef struct SDL_IOStreamInterface * SDL_OpenIO() to provide their own stream implementation behind this * struct's abstract interface. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_IOStream SDL_IOStream; @@ -217,6 +247,8 @@ typedef struct SDL_IOStream SDL_IOStream; * than your app, trying to use this pointer will almost certainly result in * a crash! This is mostly a problem on Windows; make sure you build SDL and * your app with the same compiler and settings to avoid it. + * - `SDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER`: a file descriptor that this + * SDL_IOStream is using to access the filesystem. * - `SDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER`: a pointer, that can be cast * to an Android NDK `AAsset *`, that this SDL_IOStream is using to access * the filesystem. If SDL used some other method to access the filesystem, @@ -228,9 +260,12 @@ typedef struct SDL_IOStream SDL_IOStream; * \returns a pointer to the SDL_IOStream structure that is created or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseIO + * \sa SDL_FlushIO * \sa SDL_ReadIO * \sa SDL_SeekIO * \sa SDL_TellIO @@ -240,6 +275,7 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromFile(const char *file, cons #define SDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER "SDL.iostream.windows.handle" #define SDL_PROP_IOSTREAM_STDIO_FILE_POINTER "SDL.iostream.stdio.file" +#define SDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER "SDL.iostream.file_descriptor" #define SDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER "SDL.iostream.android.aasset" /** @@ -257,15 +293,25 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromFile(const char *file, cons * buffer, you should use SDL_IOFromConstMem() with a read-only buffer of * memory instead. * + * The following properties will be set at creation time by SDL: + * + * - `SDL_PROP_IOSTREAM_MEMORY_POINTER`: this will be the `mem` parameter that + * was passed to this function. + * - `SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER`: this will be the `size` parameter + * that was passed to this function. + * * \param mem a pointer to a buffer to feed an SDL_IOStream stream. * \param size the buffer size, in bytes. * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOFromConstMem * \sa SDL_CloseIO + * \sa SDL_FlushIO * \sa SDL_ReadIO * \sa SDL_SeekIO * \sa SDL_TellIO @@ -273,6 +319,9 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromFile(const char *file, cons */ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromMem(void *mem, size_t size); +#define SDL_PROP_IOSTREAM_MEMORY_POINTER "SDL.iostream.memory.base" +#define SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER "SDL.iostream.memory.size" + /** * Use this function to prepare a read-only memory buffer for use with * SDL_IOStream. @@ -290,12 +339,21 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromMem(void *mem, size_t size) * If you need to write to a memory buffer, you should use SDL_IOFromMem() * with a writable buffer of memory instead. * + * The following properties will be set at creation time by SDL: + * + * - `SDL_PROP_IOSTREAM_MEMORY_POINTER`: this will be the `mem` parameter that + * was passed to this function. + * - `SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER`: this will be the `size` parameter + * that was passed to this function. + * * \param mem a pointer to a read-only buffer to feed an SDL_IOStream stream. * \param size the buffer size, in bytes. * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOFromMem * \sa SDL_CloseIO @@ -323,7 +381,9 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromConstMem(const void *mem, s * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseIO * \sa SDL_ReadIO @@ -347,20 +407,21 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromDynamicMem(void); * read/write a common data source, you should use the built-in * implementations in SDL, like SDL_IOFromFile() or SDL_IOFromMem(), etc. * - * You must free the returned pointer with SDL_CloseIO(). - * * This function makes a copy of `iface` and the caller does not need to keep - * this data around after this call. + * it around after this call. * - * \param iface the function pointers that implement this SDL_IOStream. - * \param userdata the app-controlled pointer that is passed to iface's - * functions when called. + * \param iface the interface that implements this SDL_IOStream, initialized + * using SDL_INIT_INTERFACE(). + * \param userdata the pointer that will be passed to the interface functions. * \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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseIO + * \sa SDL_INIT_INTERFACE * \sa SDL_IOFromConstMem * \sa SDL_IOFromFile * \sa SDL_IOFromMem @@ -372,21 +433,32 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_OpenIO(const SDL_IOStreamInterfac * * SDL_CloseIO() closes and cleans up the SDL_IOStream stream. It releases any * resources used by the stream and frees the SDL_IOStream itself. This - * returns SDL_TRUE on success, or SDL_FALSE if the stream failed to flush to - * its output (e.g. to disk). + * returns true on success, or false 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_IOStream is still invalid once this function returns. + * Note that if this fails to flush the stream for any reason, this function + * reports an error, but the SDL_IOStream is still invalid once this function + * returns. + * + * This call flushes any buffered writes to the operating system, but there + * are no guarantees that those writes have gone to physical media; they might + * be in the OS's file cache, waiting to go to disk later. If it's absolutely + * crucial that writes go to disk immediately, so they are definitely stored + * even if the power fails before the file cache would have caught up, one + * should call SDL_FlushIO() before closing. Note that flushing takes time and + * makes the system and your app operate less efficiently, so do so sparingly. * * \param context SDL_IOStream structure to close. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenIO */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CloseIO(SDL_IOStream *context); +extern SDL_DECLSPEC bool SDLCALL SDL_CloseIO(SDL_IOStream *context); /** * Get the properties associated with an SDL_IOStream. @@ -395,7 +467,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CloseIO(SDL_IOStream *context); * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetIOProperties(SDL_IOStream *context); @@ -413,10 +487,9 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetIOProperties(SDL_IOStream *c * \param context the SDL_IOStream to query. * \returns an SDL_IOStatus enum with the current state. * - * \threadsafety This function should not be called at the same time that - * another thread is operating on the same SDL_IOStream. + * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_IOStatus SDLCALL SDL_GetIOStatus(SDL_IOStream *context); @@ -428,7 +501,9 @@ extern SDL_DECLSPEC SDL_IOStatus SDLCALL SDL_GetIOStatus(SDL_IOStream *context); * negative error code on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetIOSize(SDL_IOStream *context); @@ -450,10 +525,12 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetIOSize(SDL_IOStream *context); * negative. * \param whence any of `SDL_IO_SEEK_SET`, `SDL_IO_SEEK_CUR`, * `SDL_IO_SEEK_END`. - * \returns the final offset in the data stream after the seek or a negative - * error code on failure; call SDL_GetError() for more information. + * \returns the final offset in the data stream after the seek or -1 on + * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_TellIO */ @@ -471,7 +548,9 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_SeekIO(SDL_IOStream *context, Sint64 offs * \returns the current offset in the stream, or -1 if the information can not * be determined. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SeekIO */ @@ -481,10 +560,12 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_TellIO(SDL_IOStream *context); * Read from a data source. * * This function reads up `size` bytes from the data source to the area - * pointed at by `ptr`. This function may read less bytes than requested. It - * will return zero when the data stream is completely read, and - * SDL_GetIOStatus() will return SDL_IO_STATUS_EOF, or on error, and - * SDL_GetIOStatus() will return SDL_IO_STATUS_ERROR. + * pointed at by `ptr`. This function may read less bytes than requested. + * + * This function will return zero when the data stream is completely read, and + * SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If zero is returned and + * the stream is not at EOF, SDL_GetIOStatus() will return a different error + * value and SDL_GetError() will offer a human-readable message. * * \param context a pointer to an SDL_IOStream structure. * \param ptr a pointer to a buffer to read data into. @@ -492,7 +573,9 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_TellIO(SDL_IOStream *context); * \returns the number of bytes read, or 0 on end of file or other failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_WriteIO * \sa SDL_GetIOStatus @@ -519,11 +602,14 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_ReadIO(SDL_IOStream *context, void *ptr, * \returns the number of bytes written, which will be less than `size` on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOprintf * \sa SDL_ReadIO * \sa SDL_SeekIO + * \sa SDL_FlushIO * \sa SDL_GetIOStatus */ extern SDL_DECLSPEC size_t SDLCALL SDL_WriteIO(SDL_IOStream *context, const void *ptr, size_t size); @@ -540,7 +626,9 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_WriteIO(SDL_IOStream *context, const void * \returns the number of bytes written or 0 on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOvprintf * \sa SDL_WriteIO @@ -558,13 +646,35 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_IOprintf(SDL_IOStream *context, SDL_PRINT * \returns the number of bytes written or 0 on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOprintf * \sa SDL_WriteIO */ extern SDL_DECLSPEC size_t SDLCALL SDL_IOvprintf(SDL_IOStream *context, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2); +/** + * Flush any buffered data in the stream. + * + * This function makes sure that any buffered data is written to the stream. + * Normally this isn't necessary but if the stream is a pipe or socket it + * guarantees that any pending data is sent. + * + * \param context SDL_IOStream structure to flush. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_OpenIO + * \sa SDL_WriteIO + */ +extern SDL_DECLSPEC bool SDLCALL SDL_FlushIO(SDL_IOStream *context); + /** * Load all the data from an SDL data stream. * @@ -575,17 +685,21 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_IOvprintf(SDL_IOStream *context, SDL_PRIN * The data should be freed with SDL_free(). * * \param src the SDL_IOStream to read all available data from. - * \param datasize if not NULL, will store the number of bytes read. - * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning, - * even in the case of an error. + * \param datasize a pointer filled in with the number of bytes read, may be + * NULL. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. * \returns the data or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadFile + * \sa SDL_SaveFile_IO */ -extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile_IO(SDL_IOStream *src, size_t *datasize, SDL_bool closeio); +extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile_IO(SDL_IOStream *src, size_t *datasize, bool closeio); /** * Load all the data from a file path. @@ -601,12 +715,55 @@ extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile_IO(SDL_IOStream *src, size_t *da * \returns the data or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadFile_IO + * \sa SDL_SaveFile */ extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile(const char *file, size_t *datasize); +/** + * Save all the data into an SDL data stream. + * + * \param src the SDL_IOStream to write all data to. + * \param data the data to be written. If datasize is 0, may be NULL or a + * invalid pointer. + * \param datasize the number of bytes to be written. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SaveFile + * \sa SDL_LoadFile_IO + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SaveFile_IO(SDL_IOStream *src, const void *data, size_t datasize, bool closeio); + +/** + * Save all the data into a file path. + * + * \param file the path to write all available data into. + * \param data the data to be written. If datasize is 0, may be NULL or a + * invalid pointer. + * \param datasize the number of bytes to be written. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SaveFile_IO + * \sa SDL_LoadFile + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SaveFile(const char *file, const void *data, size_t datasize); + /** * \name Read endian functions * @@ -617,26 +774,63 @@ extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile(const char *file, size_t *datasi /** * Use this function to read a byte from an SDL_IOStream. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the SDL_IOStream to read from. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() + * \returns true on success or false on failure or EOF; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU8(SDL_IOStream *src, Uint8 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU8(SDL_IOStream *src, Uint8 *value); /** * Use this function to read a signed byte from an SDL_IOStream. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the SDL_IOStream to read from. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS8(SDL_IOStream *src, Sint8 *value); + +/** + * Use this function to read 16 bits of little-endian data from an + * SDL_IOStream and return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * + * \param src the stream from which to read data. + * \param value a pointer filled in with the data read. + * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS8(SDL_IOStream *src, Sint8 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU16LE(SDL_IOStream *src, Uint16 *value); /** * Use this function to read 16 bits of little-endian data from an @@ -645,30 +839,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS8(SDL_IOStream *src, Sint8 *value) * 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. - * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. - * - * \since This function is available since SDL 3.0.0. - */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU16LE(SDL_IOStream *src, Uint16 *value); - -/** - * Use this function to read 16 bits of little-endian data from an - * SDL_IOStream and return in native format. - * - * SDL byteswaps the data only if necessary, so the data returned will be in - * the native byte order. + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS16LE(SDL_IOStream *src, Sint16 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS16LE(SDL_IOStream *src, Sint16 *value); /** * Use this function to read 16 bits of big-endian data from an SDL_IOStream @@ -677,14 +862,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS16LE(SDL_IOStream *src, Sint16 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU16BE(SDL_IOStream *src, Uint16 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU16BE(SDL_IOStream *src, Uint16 *value); /** * Use this function to read 16 bits of big-endian data from an SDL_IOStream @@ -693,14 +885,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU16BE(SDL_IOStream *src, Uint16 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS16BE(SDL_IOStream *src, Sint16 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS16BE(SDL_IOStream *src, Sint16 *value); /** * Use this function to read 32 bits of little-endian data from an @@ -709,14 +908,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS16BE(SDL_IOStream *src, Sint16 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU32LE(SDL_IOStream *src, Uint32 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU32LE(SDL_IOStream *src, Uint32 *value); /** * Use this function to read 32 bits of little-endian data from an @@ -725,14 +931,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU32LE(SDL_IOStream *src, Uint32 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS32LE(SDL_IOStream *src, Sint32 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS32LE(SDL_IOStream *src, Sint32 *value); /** * Use this function to read 32 bits of big-endian data from an SDL_IOStream @@ -741,14 +954,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS32LE(SDL_IOStream *src, Sint32 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU32BE(SDL_IOStream *src, Uint32 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU32BE(SDL_IOStream *src, Uint32 *value); /** * Use this function to read 32 bits of big-endian data from an SDL_IOStream @@ -757,14 +977,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU32BE(SDL_IOStream *src, Uint32 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS32BE(SDL_IOStream *src, Sint32 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS32BE(SDL_IOStream *src, Sint32 *value); /** * Use this function to read 64 bits of little-endian data from an @@ -773,14 +1000,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS32BE(SDL_IOStream *src, Sint32 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU64LE(SDL_IOStream *src, Uint64 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU64LE(SDL_IOStream *src, Uint64 *value); /** * Use this function to read 64 bits of little-endian data from an @@ -789,14 +1023,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU64LE(SDL_IOStream *src, Uint64 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS64LE(SDL_IOStream *src, Sint64 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS64LE(SDL_IOStream *src, Sint64 *value); /** * Use this function to read 64 bits of big-endian data from an SDL_IOStream @@ -805,14 +1046,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS64LE(SDL_IOStream *src, Sint64 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU64BE(SDL_IOStream *src, Uint64 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadU64BE(SDL_IOStream *src, Uint64 *value); /** * Use this function to read 64 bits of big-endian data from an SDL_IOStream @@ -821,14 +1069,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU64BE(SDL_IOStream *src, Uint64 *va * SDL byteswaps the data only if necessary, so the data returned will be in * the native byte order. * + * This function will return false when the data stream is completely read, + * and SDL_GetIOStatus() will return SDL_IO_STATUS_EOF. If false is returned + * and the stream is not at EOF, SDL_GetIOStatus() will return a different + * error value and SDL_GetError() will offer a human-readable message. + * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS64BE(SDL_IOStream *src, Sint64 *value); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadS64BE(SDL_IOStream *src, Sint64 *value); /* @} *//* Read endian functions */ /** @@ -843,24 +1098,28 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS64BE(SDL_IOStream *src, Sint64 *va * * \param dst the SDL_IOStream to write to. * \param value the byte value to write. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU8(SDL_IOStream *dst, Uint8 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU8(SDL_IOStream *dst, Uint8 value); /** * Use this function to write a signed byte to an SDL_IOStream. * * \param dst the SDL_IOStream to write to. * \param value the byte value to write. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS8(SDL_IOStream *dst, Sint8 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS8(SDL_IOStream *dst, Sint8 value); /** * Use this function to write 16 bits in native format to an SDL_IOStream as @@ -872,12 +1131,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS8(SDL_IOStream *dst, Sint8 value) * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU16LE(SDL_IOStream *dst, Uint16 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU16LE(SDL_IOStream *dst, Uint16 value); /** * Use this function to write 16 bits in native format to an SDL_IOStream as @@ -889,12 +1150,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU16LE(SDL_IOStream *dst, Uint16 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS16LE(SDL_IOStream *dst, Sint16 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS16LE(SDL_IOStream *dst, Sint16 value); /** * Use this function to write 16 bits in native format to an SDL_IOStream as @@ -905,12 +1168,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS16LE(SDL_IOStream *dst, Sint16 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU16BE(SDL_IOStream *dst, Uint16 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU16BE(SDL_IOStream *dst, Uint16 value); /** * Use this function to write 16 bits in native format to an SDL_IOStream as @@ -921,12 +1186,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU16BE(SDL_IOStream *dst, Uint16 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS16BE(SDL_IOStream *dst, Sint16 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS16BE(SDL_IOStream *dst, Sint16 value); /** * Use this function to write 32 bits in native format to an SDL_IOStream as @@ -938,12 +1205,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS16BE(SDL_IOStream *dst, Sint16 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU32LE(SDL_IOStream *dst, Uint32 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU32LE(SDL_IOStream *dst, Uint32 value); /** * Use this function to write 32 bits in native format to an SDL_IOStream as @@ -955,12 +1224,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU32LE(SDL_IOStream *dst, Uint32 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS32LE(SDL_IOStream *dst, Sint32 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS32LE(SDL_IOStream *dst, Sint32 value); /** * Use this function to write 32 bits in native format to an SDL_IOStream as @@ -971,12 +1242,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS32LE(SDL_IOStream *dst, Sint32 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU32BE(SDL_IOStream *dst, Uint32 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU32BE(SDL_IOStream *dst, Uint32 value); /** * Use this function to write 32 bits in native format to an SDL_IOStream as @@ -987,12 +1260,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU32BE(SDL_IOStream *dst, Uint32 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS32BE(SDL_IOStream *dst, Sint32 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS32BE(SDL_IOStream *dst, Sint32 value); /** * Use this function to write 64 bits in native format to an SDL_IOStream as @@ -1004,12 +1279,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS32BE(SDL_IOStream *dst, Sint32 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU64LE(SDL_IOStream *dst, Uint64 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU64LE(SDL_IOStream *dst, Uint64 value); /** * Use this function to write 64 bits in native format to an SDL_IOStream as @@ -1021,12 +1298,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU64LE(SDL_IOStream *dst, Uint64 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS64LE(SDL_IOStream *dst, Sint64 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS64LE(SDL_IOStream *dst, Sint64 value); /** * Use this function to write 64 bits in native format to an SDL_IOStream as @@ -1037,12 +1316,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS64LE(SDL_IOStream *dst, Sint64 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU64BE(SDL_IOStream *dst, Uint64 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteU64BE(SDL_IOStream *dst, Uint64 value); /** * Use this function to write 64 bits in native format to an SDL_IOStream as @@ -1053,12 +1334,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU64BE(SDL_IOStream *dst, Uint64 va * * \param dst the stream to which data will be written. * \param value the data to be written, in native format. - * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true on successful write or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS64BE(SDL_IOStream *dst, Sint64 value); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteS64BE(SDL_IOStream *dst, Sint64 value); /* @} *//* Write endian functions */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_joystick.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_joystick.h index 43bc1e9..d15668b 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_joystick.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_joystick.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -25,8 +25,8 @@ * SDL joystick support. * * This is the lower-level joystick handling. If you want the simpler option, - * where what buttons does what is well-defined, you should use the gamepad - * API instead. + * where what each button does is well-defined, you should use the gamepad API + * instead. * * 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 @@ -81,7 +81,7 @@ extern SDL_Mutex *SDL_joystick_lock; * * This is opaque data. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Joystick SDL_Joystick; @@ -93,7 +93,7 @@ typedef struct SDL_Joystick SDL_Joystick; * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_JoystickID; @@ -107,7 +107,7 @@ typedef Uint32 SDL_JoystickID; * This is by no means a complete list of everything that can be plugged into * a computer. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_JoystickType { @@ -120,7 +120,8 @@ typedef enum SDL_JoystickType SDL_JOYSTICK_TYPE_GUITAR, SDL_JOYSTICK_TYPE_DRUM_KIT, SDL_JOYSTICK_TYPE_ARCADE_PAD, - SDL_JOYSTICK_TYPE_THROTTLE + SDL_JOYSTICK_TYPE_THROTTLE, + SDL_JOYSTICK_TYPE_COUNT } SDL_JoystickType; /** @@ -129,7 +130,7 @@ typedef enum SDL_JoystickType * This is used by SDL_GetJoystickConnectionState to report how a device is * connected to the system. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_JoystickConnectionState { @@ -142,7 +143,7 @@ typedef enum SDL_JoystickConnectionState /** * The largest value an SDL_Joystick's axis can report. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_JOYSTICK_AXIS_MIN */ @@ -153,19 +154,13 @@ typedef enum SDL_JoystickConnectionState * * This is a negative number! * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_JOYSTICK_AXIS_MAX */ #define SDL_JOYSTICK_AXIS_MIN -32768 -/* 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 */ /** @@ -175,27 +170,27 @@ typedef enum SDL_JoystickConnectionState * joysticks while processing to guarantee that the joystick list won't change * and joystick and gamepad events will not be delivered. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_LockJoysticks(void) SDL_ACQUIRE(SDL_joystick_lock); /** * Unlocking for atomic access to the joystick API. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnlockJoysticks(void) SDL_RELEASE(SDL_joystick_lock); /** * Return whether a joystick is currently connected. * - * \returns SDL_TRUE if a joystick is connected, SDL_FALSE otherwise. + * \returns true if a joystick is connected, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoysticks */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasJoystick(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasJoystick(void); /** * Get a list of currently connected joysticks. @@ -206,7 +201,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasJoystick(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasJoystick * \sa SDL_OpenJoystick @@ -222,7 +217,7 @@ extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetJoysticks(int *count); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickName * \sa SDL_GetJoysticks @@ -238,7 +233,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickNameForID(SDL_JoystickID * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPath * \sa SDL_GetJoysticks @@ -253,7 +248,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPathForID(SDL_JoystickID * \param instance_id the joystick instance ID. * \returns the player index of a joystick, or -1 if it's not available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex * \sa SDL_GetJoysticks @@ -269,7 +264,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickPlayerIndexForID(SDL_JoystickID i * \returns the GUID of the selected joystick. If called with an invalid * instance_id, this function returns a zero GUID. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUID * \sa SDL_GUIDToString @@ -286,7 +281,7 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetJoystickGUIDForID(SDL_JoystickID ins * \returns the USB vendor ID of the selected joystick. If called with an * invalid instance_id, this function returns 0. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickVendor * \sa SDL_GetJoysticks @@ -303,7 +298,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickVendorForID(SDL_JoystickID ins * \returns the USB product ID of the selected joystick. If called with an * invalid instance_id, this function returns 0. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProduct * \sa SDL_GetJoysticks @@ -320,7 +315,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductForID(SDL_JoystickID in * \returns the product version of the selected joystick. If called with an * invalid instance_id, this function returns 0. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductVersion * \sa SDL_GetJoysticks @@ -337,7 +332,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductVersionForID(SDL_Joysti * invalid instance_id, this function returns * `SDL_JOYSTICK_TYPE_UNKNOWN`. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickType * \sa SDL_GetJoysticks @@ -354,7 +349,7 @@ extern SDL_DECLSPEC SDL_JoystickType SDLCALL SDL_GetJoystickTypeForID(SDL_Joysti * \returns a joystick identifier or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseJoystick */ @@ -367,7 +362,7 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_OpenJoystick(SDL_JoystickID insta * \returns an SDL_Joystick on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromID(SDL_JoystickID instance_id); @@ -378,7 +373,7 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromID(SDL_JoystickID * \returns an SDL_Joystick on success or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex * \sa SDL_SetJoystickPlayerIndex @@ -388,7 +383,7 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromPlayerIndex(int pl /** * The structure that describes a virtual joystick touchpad. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_VirtualJoystickDesc */ @@ -401,7 +396,7 @@ typedef struct SDL_VirtualJoystickTouchpadDesc /** * The structure that describes a virtual joystick sensor. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_VirtualJoystickDesc */ @@ -414,16 +409,19 @@ typedef struct SDL_VirtualJoystickSensorDesc /** * The structure that describes a virtual joystick. * - * All elements of this structure are optional and can be left 0. + * This structure should be initialized using SDL_INIT_INTERFACE(). All + * elements of this structure are optional. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_AttachVirtualJoystick + * \sa SDL_INIT_INTERFACE * \sa SDL_VirtualJoystickSensorDesc * \sa SDL_VirtualJoystickTouchpadDesc */ typedef struct SDL_VirtualJoystickDesc { + Uint32 version; /**< the version of this interface */ Uint16 type; /**< `SDL_JoystickType` */ Uint16 padding; /**< unused */ Uint16 vendor_id; /**< the USB vendor ID of this joystick */ @@ -446,22 +444,32 @@ typedef struct SDL_VirtualJoystickDesc 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 */ - SDL_bool (SDLCALL *Rumble)(void *userdata, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble); /**< Implements SDL_RumbleJoystick() */ - SDL_bool (SDLCALL *RumbleTriggers)(void *userdata, Uint16 left_rumble, Uint16 right_rumble); /**< Implements SDL_RumbleJoystickTriggers() */ - SDL_bool (SDLCALL *SetLED)(void *userdata, Uint8 red, Uint8 green, Uint8 blue); /**< Implements SDL_SetJoystickLED() */ - SDL_bool (SDLCALL *SendEffect)(void *userdata, const void *data, int size); /**< Implements SDL_SendJoystickEffect() */ - SDL_bool (SDLCALL *SetSensorsEnabled)(void *userdata, SDL_bool enabled); /**< Implements SDL_SetGamepadSensorEnabled() */ + bool (SDLCALL *Rumble)(void *userdata, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble); /**< Implements SDL_RumbleJoystick() */ + bool (SDLCALL *RumbleTriggers)(void *userdata, Uint16 left_rumble, Uint16 right_rumble); /**< Implements SDL_RumbleJoystickTriggers() */ + bool (SDLCALL *SetLED)(void *userdata, Uint8 red, Uint8 green, Uint8 blue); /**< Implements SDL_SetJoystickLED() */ + bool (SDLCALL *SendEffect)(void *userdata, const void *data, int size); /**< Implements SDL_SendJoystickEffect() */ + bool (SDLCALL *SetSensorsEnabled)(void *userdata, bool enabled); /**< Implements SDL_SetGamepadSensorEnabled() */ void (SDLCALL *Cleanup)(void *userdata); /**< Cleans up the userdata when the joystick is detached */ } SDL_VirtualJoystickDesc; +/* Check the size of SDL_VirtualJoystickDesc + * + * If this assert fails, either the compiler is padding to an unexpected size, + * or the interface has been updated and this should be updated to match and + * the code using this interface should be updated to handle the old version. + */ +SDL_COMPILE_TIME_ASSERT(SDL_VirtualJoystickDesc_SIZE, + (sizeof(void *) == 4 && sizeof(SDL_VirtualJoystickDesc) == 84) || + (sizeof(void *) == 8 && sizeof(SDL_VirtualJoystickDesc) == 136)); + /** * Attach a new virtual joystick. * - * \param desc joystick description. + * \param desc joystick description, initialized using SDL_INIT_INTERFACE(). * \returns the joystick instance ID, or 0 on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DetachVirtualJoystick */ @@ -472,24 +480,24 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_AttachVirtualJoystick(const SDL_V * * \param instance_id the joystick instance ID, previously returned from * SDL_AttachVirtualJoystick(). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AttachVirtualJoystick */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DetachVirtualJoystick(SDL_JoystickID instance_id); +extern SDL_DECLSPEC bool SDLCALL SDL_DetachVirtualJoystick(SDL_JoystickID instance_id); /** * Query whether or not a joystick is virtual. * * \param instance_id the joystick instance ID. - * \returns SDL_TRUE if the joystick is virtual, SDL_FALSE otherwise. + * \returns true if the joystick is virtual, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instance_id); +extern SDL_DECLSPEC bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instance_id); /** * Set the state of an axis on an opened virtual joystick. @@ -507,12 +515,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instan * \param joystick the virtual joystick on which to set state. * \param axis the index of the axis on the virtual joystick to update. * \param value the new value for the specified axis. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value); /** * Generate ball motion on an opened virtual joystick. @@ -527,12 +535,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *jo * \param ball the index of the ball on the virtual joystick to update. * \param xrel the relative motion on the X axis. * \param yrel the relative motion on the Y axis. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *joystick, int ball, Sint16 xrel, Sint16 yrel); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *joystick, int ball, Sint16 xrel, Sint16 yrel); /** * Set the state of a button on an opened virtual joystick. @@ -545,13 +553,13 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *jo * * \param joystick the virtual joystick on which to set state. * \param button the index of the button on the virtual joystick to update. - * \param value the new value for the specified button. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param down true if the button is pressed, false otherwise. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick *joystick, int button, Uint8 value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick *joystick, int button, bool down); /** * Set the state of a hat on an opened virtual joystick. @@ -565,12 +573,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick * * \param joystick the virtual joystick on which to set state. * \param hat the index of the hat on the virtual joystick to update. * \param value the new value for the specified hat. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value); /** * Set touchpad finger state on an opened virtual joystick. @@ -585,19 +593,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joy * \param touchpad the index of the touchpad on the virtual joystick to * update. * \param finger the index of the finger on the touchpad to set. - * \param state `SDL_PRESSED` if the finger is pressed, `SDL_RELEASED` if the - * finger is released. + * \param down true if the finger is pressed, false if the finger is released. * \param x the x coordinate of the finger on the touchpad, normalized 0 to 1, * with the origin in the upper left. * \param y the y coordinate of the finger on the touchpad, normalized 0 to 1, * with the origin in the upper left. * \param pressure the pressure of the finger. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick *joystick, int touchpad, int finger, Uint8 state, float x, float y, float pressure); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick *joystick, int touchpad, int finger, bool down, float x, float y, float pressure); /** * Send a sensor update for an opened virtual joystick. @@ -614,12 +621,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick * the sensor reading. * \param data the data associated with the sensor reading. * \param num_values the number of values pointed to by `data`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joystick *joystick, SDL_SensorType type, Uint64 sensor_timestamp, const float *data, int num_values); +extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joystick *joystick, SDL_SensorType type, Uint64 sensor_timestamp, const float *data, int num_values); /** * Get the properties associated with a joystick. @@ -641,7 +648,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joyst * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetJoystickProperties(SDL_Joystick *joystick); @@ -658,7 +665,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetJoystickProperties(SDL_Joyst * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickNameForID */ @@ -671,7 +678,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickName(SDL_Joystick *joyst * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPathForID */ @@ -686,7 +693,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPath(SDL_Joystick *joyst * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the player index, or -1 if it's not available. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetJoystickPlayerIndex */ @@ -698,14 +705,14 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickPlayerIndex(SDL_Joystick *joystic * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \param player_index player index to assign to this joystick, or -1 to clear * the player index and turn off player LEDs. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickPlayerIndex(SDL_Joystick *joystick, int player_index); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickPlayerIndex(SDL_Joystick *joystick, int player_index); /** * Get the implementation-dependent GUID for the joystick. @@ -717,7 +724,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickPlayerIndex(SDL_Joystick *jo * this function returns a zero GUID; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID * \sa SDL_GUIDToString @@ -732,7 +739,7 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetJoystickGUID(SDL_Joystick *joystick) * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the USB vendor ID of the selected joystick, or 0 if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickVendorForID */ @@ -746,7 +753,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickVendor(SDL_Joystick *joystick) * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the USB product ID of the selected joystick, or 0 if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductForID */ @@ -760,7 +767,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProduct(SDL_Joystick *joystick * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the product version of the selected joystick, or 0 if unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductVersionForID */ @@ -775,7 +782,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductVersion(SDL_Joystick *j * \returns the firmware version of the selected joystick, or 0 if * unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickFirmwareVersion(SDL_Joystick *joystick); @@ -788,7 +795,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickFirmwareVersion(SDL_Joystick * * \returns the serial number of the selected joystick, or NULL if * unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joystick); @@ -798,7 +805,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joy * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the SDL_JoystickType of the selected joystick. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickTypeForID */ @@ -817,7 +824,7 @@ extern SDL_DECLSPEC SDL_JoystickType SDLCALL SDL_GetJoystickType(SDL_Joystick *j * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID */ @@ -827,12 +834,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetJoystickGUIDInfo(SDL_GUID guid, Uint16 * * 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. + * \returns true if the joystick has been opened, false if it has not; call + * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystick); +extern SDL_DECLSPEC bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystick); /** * Get the instance ID of an opened joystick. @@ -841,7 +848,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystic * \returns the instance ID of the specified joystick on success or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetJoystickID(SDL_Joystick *joystick); @@ -856,7 +863,7 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetJoystickID(SDL_Joystick *joyst * \returns the number of axis controls/number of axes on success or -1 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickAxis * \sa SDL_GetNumJoystickBalls @@ -877,7 +884,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickAxes(SDL_Joystick *joystick); * \returns the number of trackballs on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickBall * \sa SDL_GetNumJoystickAxes @@ -893,7 +900,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickBalls(SDL_Joystick *joystick); * \returns the number of POV hats on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickHat * \sa SDL_GetNumJoystickAxes @@ -909,7 +916,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickHats(SDL_Joystick *joystick); * \returns the number of buttons on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickButton * \sa SDL_GetNumJoystickAxes @@ -927,12 +934,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickButtons(SDL_Joystick *joystick * * \param enabled whether to process joystick events or not. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_JoystickEventsEnabled * \sa SDL_UpdateJoysticks */ -extern SDL_DECLSPEC void SDLCALL SDL_SetJoystickEventsEnabled(SDL_bool enabled); +extern SDL_DECLSPEC void SDLCALL SDL_SetJoystickEventsEnabled(bool enabled); /** * Query the state of joystick event processing. @@ -941,14 +948,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetJoystickEventsEnabled(SDL_bool enabled); * yourself and check the state of the joystick when you want joystick * information. * - * \returns SDL_TRUE if joystick events are being processed, SDL_FALSE - * otherwise. + * \returns true if joystick events are being processed, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetJoystickEventsEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_JoystickEventsEnabled(void); +extern SDL_DECLSPEC bool SDLCALL SDL_JoystickEventsEnabled(void); /** * Update the current state of the open joysticks. @@ -956,7 +962,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_JoystickEventsEnabled(void); * This is called automatically by the event loop if any joystick events are * enabled. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateJoysticks(void); @@ -978,7 +984,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UpdateJoysticks(void); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickAxes */ @@ -994,11 +1000,11 @@ extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetJoystickAxis(SDL_Joystick *joystick, i * \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. - * \returns SDL_TRUE if this axis has any initial value, or SDL_FALSE if not. + * \returns true if this axis has any initial value, or false if not. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystick *joystick, int axis, Sint16 *state); +extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystick *joystick, int axis, Sint16 *state); /** * Get the ball axis change since the last poll. @@ -1012,14 +1018,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystic * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickBalls */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetJoystickBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); +extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); /** * Get the current state of a POV hat on a joystick. @@ -1030,7 +1036,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetJoystickBall(SDL_Joystick *joystick, * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickHats */ @@ -1052,13 +1058,13 @@ extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetJoystickHat(SDL_Joystick *joystick, int * \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. + * \returns true if the button is pressed, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickButtons */ -extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetJoystickButton(SDL_Joystick *joystick, int button); +extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickButton(SDL_Joystick *joystick, int button); /** * Start a rumble effect. @@ -1075,11 +1081,11 @@ extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetJoystickButton(SDL_Joystick *joystick, * \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 SDL_TRUE, or SDL_FALSE if rumble isn't supported on this joystick. + * \returns true, or false if rumble isn't supported on this joystick. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); +extern SDL_DECLSPEC bool SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); /** * Start a rumble effect in the joystick's triggers. @@ -1101,14 +1107,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RumbleJoystick */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleJoystickTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); +extern SDL_DECLSPEC bool SDLCALL SDL_RumbleJoystickTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); /** * Update a joystick's LED color. @@ -1123,12 +1129,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RumbleJoystickTriggers(SDL_Joystick *jo * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue); +extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue); /** * Send a joystick specific effect packet. @@ -1136,19 +1142,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendJoystickEffect(SDL_Joystick *joystick, const void *data, int size); +extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickEffect(SDL_Joystick *joystick, const void *data, int size); /** * Close a joystick previously opened with SDL_OpenJoystick(). * * \param joystick the joystick device to close. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenJoystick */ @@ -1162,7 +1168,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseJoystick(SDL_Joystick *joystick); * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetJoystickConnectionState(SDL_Joystick *joystick); @@ -1183,7 +1189,7 @@ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetJoystickConnectio * \returns the current battery state or `SDL_POWERSTATE_ERROR` on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetJoystickPowerInfo(SDL_Joystick *joystick, int *percent); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keyboard.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keyboard.h index ec6c3f2..afa77b6 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keyboard.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,11 @@ * # CategoryKeyboard * * SDL keyboard management. + * + * Please refer to the Best Keyboard Practices document for details on how + * best to accept keyboard input in various types of programs: + * + * https://wiki.libsdl.org/SDL3/BestKeyboardPractices */ #ifndef SDL_keyboard_h_ @@ -31,6 +36,9 @@ #include #include #include +#include +#include +#include #include #include @@ -47,7 +55,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_KeyboardID; @@ -56,13 +64,15 @@ typedef Uint32 SDL_KeyboardID; /** * Return whether a keyboard is currently connected. * - * \returns SDL_TRUE if a keyboard is connected, SDL_FALSE otherwise. + * \returns true if a keyboard is connected, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboards */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasKeyboard(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasKeyboard(void); /** * Get a list of currently connected keyboards. @@ -78,7 +88,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasKeyboard(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboardNameForID * \sa SDL_HasKeyboard @@ -94,7 +106,9 @@ extern SDL_DECLSPEC SDL_KeyboardID * SDLCALL SDL_GetKeyboards(int *count); * \returns the name of the selected keyboard or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboards */ @@ -105,7 +119,9 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyboardNameForID(SDL_KeyboardID * * \returns the window with keyboard focus. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); @@ -116,9 +132,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); * 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. + * A array element with a value of true means that the key is pressed and a + * value of false means that it is not. Indexes into this array are obtained + * by using SDL_Scancode values. * * Use SDL_PumpEvents() to update the state array. * @@ -133,19 +149,23 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); * \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 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_PumpEvents * \sa SDL_ResetKeyboard */ -extern SDL_DECLSPEC const Uint8 * SDLCALL SDL_GetKeyboardState(int *numkeys); +extern SDL_DECLSPEC const bool * 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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboardState */ @@ -157,7 +177,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetKeyboard(void); * \returns an OR'd combination of the modifier keys for the keyboard. See * SDL_Keymod for details. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboardState * \sa SDL_SetModState @@ -177,7 +199,9 @@ extern SDL_DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void); * * \param modstate the desired SDL_Keymod for the keyboard. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetModState */ @@ -189,21 +213,23 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate); * * If you want to get the keycode as it would be delivered in key events, * including options specified in SDL_HINT_KEYCODE_OPTIONS, then you should - * pass `key_event` as SDL_TRUE. Otherwise this function simply translates the + * pass `key_event` as true. Otherwise this function simply translates the * scancode based on the given modifier state. * * \param scancode the desired SDL_Scancode to query. * \param modstate the modifier state to use when translating the scancode to * a keycode. - * \param key_event SDL_TRUE if the keycode will be used in key events. + * \param key_event true if the keycode will be used in key events. * \returns the SDL_Keycode that corresponds to the given SDL_Scancode. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyName * \sa SDL_GetScancodeFromKey */ -extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode, SDL_Keymod modstate, SDL_bool key_event); +extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode, SDL_Keymod modstate, bool key_event); /** * Get the scancode corresponding to the given key code according to the @@ -217,7 +243,9 @@ extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scan * scancode generates this key, may be NULL. * \returns the SDL_Scancode that corresponds to the given SDL_Keycode. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromScancode * \sa SDL_GetScancodeName @@ -231,14 +259,16 @@ extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key, * \param name the name to use for the scancode, encoded as UTF-8. The string * is not copied, so the pointer given to this function must stay * valid while SDL is being used. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetScancodeName */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetScancodeName(SDL_Scancode scancode, const char *name); +extern SDL_DECLSPEC bool SDLCALL SDL_SetScancodeName(SDL_Scancode scancode, const char *name); /** * Get a human-readable name for a scancode. @@ -256,7 +286,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetScancodeName(SDL_Scancode scancode, * \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 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetScancodeFromKey * \sa SDL_GetScancodeFromName @@ -271,7 +303,9 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetScancodeName(SDL_Scancode scanco * \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 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromName * \sa SDL_GetScancodeFromKey @@ -284,10 +318,14 @@ extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *nam * * If the key doesn't have a name, this function returns an empty string (""). * + * Letters will be presented in their uppercase form, if applicable. + * * \param key the desired SDL_Keycode to query. * \returns a UTF-8 encoded string of the key name. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromName * \sa SDL_GetKeyFromScancode @@ -302,7 +340,9 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyName(SDL_Keycode key); * \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 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromScancode * \sa SDL_GetKeyName @@ -319,20 +359,24 @@ extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name); * * Text input events are not received by default. * - * On some platforms using this function shows the screen keyboard. + * On some platforms using this function shows the screen keyboard and/or + * activates an IME, which can prevent some key press events from being passed + * through. * * \param window the window to enable text input. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextInputArea * \sa SDL_StartTextInputWithProperties * \sa SDL_StopTextInput * \sa SDL_TextInputActive */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StartTextInput(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_StartTextInput(SDL_Window *window); /** * Text input type. @@ -341,7 +385,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StartTextInput(SDL_Window *window); * value is valid on every platform, but where a value isn't supported, a * reasonable fallback will be used. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_StartTextInputWithProperties */ @@ -361,12 +405,11 @@ typedef enum SDL_TextInputType /** * Auto capitalization type. * - * These are the valid values for - * SDL_PROP_TEXTINPUT_AUTOCAPITALIZATION_NUMBER. Not every value is valid on - * every platform, but where a value isn't supported, a reasonable fallback - * will be used. + * These are the valid values for SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER. + * Not every value is valid on every platform, but where a value isn't + * supported, a reasonable fallback will be used. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_StartTextInputWithProperties */ @@ -388,7 +431,9 @@ typedef enum SDL_Capitalization * * Text input events are not received by default. * - * On some platforms using this function shows the screen keyboard. + * On some platforms using this function shows the screen keyboard and/or + * activates an IME, which can prevent some key press events from being passed + * through. * * These are the supported properties: * @@ -400,11 +445,11 @@ typedef enum SDL_Capitalization * SDL_TEXTINPUT_TYPE_TEXT_NAME, and SDL_CAPITALIZE_NONE for e-mail * addresses, usernames, and passwords. * - `SDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN` - true to enable auto completion - * and auto correction, defaults to SDL_TRUE. + * and auto correction, defaults to true. * - `SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN` - true if multiple lines of text - * are allowed. This defaults to SDL_TRUE if SDL_HINT_RETURN_KEY_HIDES_IME - * is "0" or is not set, and defaults to SDL_FALSE if - * SDL_HINT_RETURN_KEY_HIDES_IME is "1". + * are allowed. This defaults to true if SDL_HINT_RETURN_KEY_HIDES_IME is + * "0" or is not set, and defaults to false if SDL_HINT_RETURN_KEY_HIDES_IME + * is "1". * * On Android you can directly specify the input type: * @@ -414,17 +459,19 @@ typedef enum SDL_Capitalization * * \param window the window to enable text input. * \param props the properties to use. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextInputArea * \sa SDL_StartTextInput * \sa SDL_StopTextInput * \sa SDL_TextInputActive */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StartTextInputWithProperties(SDL_Window *window, SDL_PropertiesID props); +extern SDL_DECLSPEC bool SDLCALL SDL_StartTextInputWithProperties(SDL_Window *window, SDL_PropertiesID props); #define SDL_PROP_TEXTINPUT_TYPE_NUMBER "SDL.textinput.type" #define SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER "SDL.textinput.capitalization" @@ -436,13 +483,15 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StartTextInputWithProperties(SDL_Window * Check whether or not Unicode text input events are enabled for a window. * * \param window the window to check. - * \returns SDL_TRUE if text input events are enabled else SDL_FALSE. + * \returns true if text input events are enabled else false. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TextInputActive(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_TextInputActive(SDL_Window *window); /** * Stop receiving any text input events in a window. @@ -451,28 +500,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TextInputActive(SDL_Window *window); * it. * * \param window the window to disable text input. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StopTextInput(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_StopTextInput(SDL_Window *window); /** * Dismiss the composition window/IME without disabling the subsystem. * * \param window the window to affect. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput * \sa SDL_StopTextInput */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearComposition(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearComposition(SDL_Window *window); /** * Set the area used to type Unicode text input. @@ -485,15 +538,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearComposition(SDL_Window *window); * coordinates, or NULL to clear it. * \param cursor the offset of the current cursor location relative to * `rect->x`, in window coordinates. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextInputArea * \sa SDL_StartTextInput */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextInputArea(SDL_Window *window, const SDL_Rect *rect, int cursor); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTextInputArea(SDL_Window *window, const SDL_Rect *rect, int cursor); /** * Get the area used to type Unicode text input. @@ -505,39 +560,45 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextInputArea(SDL_Window *window, co * may be NULL. * \param cursor a pointer to the offset of the current cursor location * relative to `rect->x`, may be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextInputArea */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextInputArea(SDL_Window *window, SDL_Rect *rect, int *cursor); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextInputArea(SDL_Window *window, SDL_Rect *rect, int *cursor); /** * Check whether the platform has screen keyboard support. * - * \returns SDL_TRUE if the platform has some screen keyboard support or - * SDL_FALSE if not. + * \returns true if the platform has some screen keyboard support or false if + * not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput * \sa SDL_ScreenKeyboardShown */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasScreenKeyboardSupport(void); +extern SDL_DECLSPEC 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. + * \returns true if screen keyboard is shown or false if not. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasScreenKeyboardSupport */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ScreenKeyboardShown(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_ScreenKeyboardShown(SDL_Window *window); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keycode.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keycode.h index 2d03a3d..61b68e7 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keycode.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keycode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,11 @@ * # CategoryKeycode * * Defines constants which identify keyboard keys and modifiers. + * + * Please refer to the Best Keyboard Practices document for details on what + * this information means and how best to use it. + * + * https://wiki.libsdl.org/SDL3/BestKeyboardPractices */ #ifndef SDL_keycode_h_ @@ -42,272 +47,284 @@ * A special exception is the number keys at the top of the keyboard which map * to SDLK_0...SDLK_9 on AZERTY layouts. * - * \since This datatype is available since SDL 3.0.0. + * Keys with the `SDLK_EXTENDED_MASK` bit set do not map to a scancode or + * unicode code point. + * + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_Keycode; -#define SDLK_SCANCODE_MASK (1u<<30) +#define SDLK_EXTENDED_MASK (1u << 29) +#define SDLK_SCANCODE_MASK (1u << 30) #define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK) -#define SDLK_UNKNOWN 0x00000000u /* 0 */ -#define SDLK_RETURN 0x0000000du /* '\r' */ -#define SDLK_ESCAPE 0x0000001bu /* '\x1B' */ -#define SDLK_BACKSPACE 0x00000008u /* '\b' */ -#define SDLK_TAB 0x00000009u /* '\t' */ -#define SDLK_SPACE 0x00000020u /* ' ' */ -#define SDLK_EXCLAIM 0x00000021u /* '!' */ -#define SDLK_DBLAPOSTROPHE 0x00000022u /* '"' */ -#define SDLK_HASH 0x00000023u /* '#' */ -#define SDLK_DOLLAR 0x00000024u /* '$' */ -#define SDLK_PERCENT 0x00000025u /* '%' */ -#define SDLK_AMPERSAND 0x00000026u /* '&' */ -#define SDLK_APOSTROPHE 0x00000027u /* '\'' */ -#define SDLK_LEFTPAREN 0x00000028u /* '(' */ -#define SDLK_RIGHTPAREN 0x00000029u /* ')' */ -#define SDLK_ASTERISK 0x0000002au /* '*' */ -#define SDLK_PLUS 0x0000002bu /* '+' */ -#define SDLK_COMMA 0x0000002cu /* ',' */ -#define SDLK_MINUS 0x0000002du /* '-' */ -#define SDLK_PERIOD 0x0000002eu /* '.' */ -#define SDLK_SLASH 0x0000002fu /* '/' */ -#define SDLK_0 0x00000030u /* '0' */ -#define SDLK_1 0x00000031u /* '1' */ -#define SDLK_2 0x00000032u /* '2' */ -#define SDLK_3 0x00000033u /* '3' */ -#define SDLK_4 0x00000034u /* '4' */ -#define SDLK_5 0x00000035u /* '5' */ -#define SDLK_6 0x00000036u /* '6' */ -#define SDLK_7 0x00000037u /* '7' */ -#define SDLK_8 0x00000038u /* '8' */ -#define SDLK_9 0x00000039u /* '9' */ -#define SDLK_COLON 0x0000003au /* ':' */ -#define SDLK_SEMICOLON 0x0000003bu /* ';' */ -#define SDLK_LESS 0x0000003cu /* '<' */ -#define SDLK_EQUALS 0x0000003du /* '=' */ -#define SDLK_GREATER 0x0000003eu /* '>' */ -#define SDLK_QUESTION 0x0000003fu /* '?' */ -#define SDLK_AT 0x00000040u /* '@' */ -#define SDLK_LEFTBRACKET 0x0000005bu /* '[' */ -#define SDLK_BACKSLASH 0x0000005cu /* '\\' */ -#define SDLK_RIGHTBRACKET 0x0000005du /* ']' */ -#define SDLK_CARET 0x0000005eu /* '^' */ -#define SDLK_UNDERSCORE 0x0000005fu /* '_' */ -#define SDLK_GRAVE 0x00000060u /* '`' */ -#define SDLK_A 0x00000061u /* 'a' */ -#define SDLK_B 0x00000062u /* 'b' */ -#define SDLK_C 0x00000063u /* 'c' */ -#define SDLK_D 0x00000064u /* 'd' */ -#define SDLK_E 0x00000065u /* 'e' */ -#define SDLK_F 0x00000066u /* 'f' */ -#define SDLK_G 0x00000067u /* 'g' */ -#define SDLK_H 0x00000068u /* 'h' */ -#define SDLK_I 0x00000069u /* 'i' */ -#define SDLK_J 0x0000006au /* 'j' */ -#define SDLK_K 0x0000006bu /* 'k' */ -#define SDLK_L 0x0000006cu /* 'l' */ -#define SDLK_M 0x0000006du /* 'm' */ -#define SDLK_N 0x0000006eu /* 'n' */ -#define SDLK_O 0x0000006fu /* 'o' */ -#define SDLK_P 0x00000070u /* 'p' */ -#define SDLK_Q 0x00000071u /* 'q' */ -#define SDLK_R 0x00000072u /* 'r' */ -#define SDLK_S 0x00000073u /* 's' */ -#define SDLK_T 0x00000074u /* 't' */ -#define SDLK_U 0x00000075u /* 'u' */ -#define SDLK_V 0x00000076u /* 'v' */ -#define SDLK_W 0x00000077u /* 'w' */ -#define SDLK_X 0x00000078u /* 'x' */ -#define SDLK_Y 0x00000079u /* 'y' */ -#define SDLK_Z 0x0000007au /* 'z' */ -#define SDLK_LEFTBRACE 0x0000007bu /* '{' */ -#define SDLK_PIPE 0x0000007cu /* '|' */ -#define SDLK_RIGHTBRACE 0x0000007du /* '}' */ -#define SDLK_TILDE 0x0000007eu /* '~' */ -#define SDLK_DELETE 0x0000007fu /* '\x7F' */ -#define SDLK_PLUSMINUS 0x000000b1u /* '±' */ -#define SDLK_CAPSLOCK 0x40000039u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK) */ -#define SDLK_F1 0x4000003au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1) */ -#define SDLK_F2 0x4000003bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2) */ -#define SDLK_F3 0x4000003cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3) */ -#define SDLK_F4 0x4000003du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4) */ -#define SDLK_F5 0x4000003eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5) */ -#define SDLK_F6 0x4000003fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6) */ -#define SDLK_F7 0x40000040u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7) */ -#define SDLK_F8 0x40000041u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8) */ -#define SDLK_F9 0x40000042u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9) */ -#define SDLK_F10 0x40000043u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10) */ -#define SDLK_F11 0x40000044u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11) */ -#define SDLK_F12 0x40000045u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12) */ -#define SDLK_PRINTSCREEN 0x40000046u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN) */ -#define SDLK_SCROLLLOCK 0x40000047u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK) */ -#define SDLK_PAUSE 0x40000048u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE) */ -#define SDLK_INSERT 0x40000049u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT) */ -#define SDLK_HOME 0x4000004au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME) */ -#define SDLK_PAGEUP 0x4000004bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP) */ -#define SDLK_END 0x4000004du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END) */ -#define SDLK_PAGEDOWN 0x4000004eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN) */ -#define SDLK_RIGHT 0x4000004fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT) */ -#define SDLK_LEFT 0x40000050u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT) */ -#define SDLK_DOWN 0x40000051u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN) */ -#define SDLK_UP 0x40000052u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP) */ -#define SDLK_NUMLOCKCLEAR 0x40000053u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR) */ -#define SDLK_KP_DIVIDE 0x40000054u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE) */ -#define SDLK_KP_MULTIPLY 0x40000055u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY) */ -#define SDLK_KP_MINUS 0x40000056u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS) */ -#define SDLK_KP_PLUS 0x40000057u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS) */ -#define SDLK_KP_ENTER 0x40000058u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER) */ -#define SDLK_KP_1 0x40000059u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1) */ -#define SDLK_KP_2 0x4000005au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2) */ -#define SDLK_KP_3 0x4000005bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3) */ -#define SDLK_KP_4 0x4000005cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4) */ -#define SDLK_KP_5 0x4000005du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5) */ -#define SDLK_KP_6 0x4000005eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6) */ -#define SDLK_KP_7 0x4000005fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7) */ -#define SDLK_KP_8 0x40000060u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8) */ -#define SDLK_KP_9 0x40000061u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9) */ -#define SDLK_KP_0 0x40000062u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0) */ -#define SDLK_KP_PERIOD 0x40000063u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD) */ -#define SDLK_APPLICATION 0x40000065u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION) */ -#define SDLK_POWER 0x40000066u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER) */ -#define SDLK_KP_EQUALS 0x40000067u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS) */ -#define SDLK_F13 0x40000068u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13) */ -#define SDLK_F14 0x40000069u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14) */ -#define SDLK_F15 0x4000006au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15) */ -#define SDLK_F16 0x4000006bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16) */ -#define SDLK_F17 0x4000006cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17) */ -#define SDLK_F18 0x4000006du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18) */ -#define SDLK_F19 0x4000006eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19) */ -#define SDLK_F20 0x4000006fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20) */ -#define SDLK_F21 0x40000070u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21) */ -#define SDLK_F22 0x40000071u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22) */ -#define SDLK_F23 0x40000072u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23) */ -#define SDLK_F24 0x40000073u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24) */ -#define SDLK_EXECUTE 0x40000074u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE) */ -#define SDLK_HELP 0x40000075u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP) */ -#define SDLK_MENU 0x40000076u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU) */ -#define SDLK_SELECT 0x40000077u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT) */ -#define SDLK_STOP 0x40000078u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP) */ -#define SDLK_AGAIN 0x40000079u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN) */ -#define SDLK_UNDO 0x4000007au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO) */ -#define SDLK_CUT 0x4000007bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT) */ -#define SDLK_COPY 0x4000007cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY) */ -#define SDLK_PASTE 0x4000007du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE) */ -#define SDLK_FIND 0x4000007eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND) */ -#define SDLK_MUTE 0x4000007fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE) */ -#define SDLK_VOLUMEUP 0x40000080u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP) */ -#define SDLK_VOLUMEDOWN 0x40000081u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN) */ -#define SDLK_KP_COMMA 0x40000085u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA) */ -#define SDLK_KP_EQUALSAS400 0x40000086u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400) */ -#define SDLK_ALTERASE 0x40000099u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE) */ -#define SDLK_SYSREQ 0x4000009au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ) */ -#define SDLK_CANCEL 0x4000009bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL) */ -#define SDLK_CLEAR 0x4000009cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR) */ -#define SDLK_PRIOR 0x4000009du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR) */ -#define SDLK_RETURN2 0x4000009eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2) */ -#define SDLK_SEPARATOR 0x4000009fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR) */ -#define SDLK_OUT 0x400000a0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT) */ -#define SDLK_OPER 0x400000a1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER) */ -#define SDLK_CLEARAGAIN 0x400000a2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN) */ -#define SDLK_CRSEL 0x400000a3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL) */ -#define SDLK_EXSEL 0x400000a4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL) */ -#define SDLK_KP_00 0x400000b0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00) */ -#define SDLK_KP_000 0x400000b1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000) */ -#define SDLK_THOUSANDSSEPARATOR 0x400000b2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR) */ -#define SDLK_DECIMALSEPARATOR 0x400000b3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR) */ -#define SDLK_CURRENCYUNIT 0x400000b4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT) */ -#define SDLK_CURRENCYSUBUNIT 0x400000b5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT) */ -#define SDLK_KP_LEFTPAREN 0x400000b6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN) */ -#define SDLK_KP_RIGHTPAREN 0x400000b7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN) */ -#define SDLK_KP_LEFTBRACE 0x400000b8u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE) */ -#define SDLK_KP_RIGHTBRACE 0x400000b9u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE) */ -#define SDLK_KP_TAB 0x400000bau /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB) */ -#define SDLK_KP_BACKSPACE 0x400000bbu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE) */ -#define SDLK_KP_A 0x400000bcu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A) */ -#define SDLK_KP_B 0x400000bdu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B) */ -#define SDLK_KP_C 0x400000beu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C) */ -#define SDLK_KP_D 0x400000bfu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D) */ -#define SDLK_KP_E 0x400000c0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E) */ -#define SDLK_KP_F 0x400000c1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F) */ -#define SDLK_KP_XOR 0x400000c2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR) */ -#define SDLK_KP_POWER 0x400000c3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER) */ -#define SDLK_KP_PERCENT 0x400000c4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT) */ -#define SDLK_KP_LESS 0x400000c5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS) */ -#define SDLK_KP_GREATER 0x400000c6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER) */ -#define SDLK_KP_AMPERSAND 0x400000c7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND) */ -#define SDLK_KP_DBLAMPERSAND 0x400000c8u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND) */ -#define SDLK_KP_VERTICALBAR 0x400000c9u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR) */ -#define SDLK_KP_DBLVERTICALBAR 0x400000cau /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR) */ -#define SDLK_KP_COLON 0x400000cbu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON) */ -#define SDLK_KP_HASH 0x400000ccu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH) */ -#define SDLK_KP_SPACE 0x400000cdu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE) */ -#define SDLK_KP_AT 0x400000ceu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT) */ -#define SDLK_KP_EXCLAM 0x400000cfu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM) */ -#define SDLK_KP_MEMSTORE 0x400000d0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE) */ -#define SDLK_KP_MEMRECALL 0x400000d1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL) */ -#define SDLK_KP_MEMCLEAR 0x400000d2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR) */ -#define SDLK_KP_MEMADD 0x400000d3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD) */ -#define SDLK_KP_MEMSUBTRACT 0x400000d4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT) */ -#define SDLK_KP_MEMMULTIPLY 0x400000d5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY) */ -#define SDLK_KP_MEMDIVIDE 0x400000d6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE) */ -#define SDLK_KP_PLUSMINUS 0x400000d7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS) */ -#define SDLK_KP_CLEAR 0x400000d8u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR) */ -#define SDLK_KP_CLEARENTRY 0x400000d9u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY) */ -#define SDLK_KP_BINARY 0x400000dau /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY) */ -#define SDLK_KP_OCTAL 0x400000dbu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL) */ -#define SDLK_KP_DECIMAL 0x400000dcu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL) */ -#define SDLK_KP_HEXADECIMAL 0x400000ddu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL) */ -#define SDLK_LCTRL 0x400000e0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL) */ -#define SDLK_LSHIFT 0x400000e1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT) */ -#define SDLK_LALT 0x400000e2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT) */ -#define SDLK_LGUI 0x400000e3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI) */ -#define SDLK_RCTRL 0x400000e4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL) */ -#define SDLK_RSHIFT 0x400000e5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT) */ -#define SDLK_RALT 0x400000e6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT) */ -#define SDLK_RGUI 0x400000e7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI) */ -#define SDLK_MODE 0x40000101u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE) */ -#define SDLK_SLEEP 0x40000102u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP) */ -#define SDLK_WAKE 0x40000103u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WAKE) */ -#define SDLK_CHANNEL_INCREMENT 0x40000104u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_INCREMENT) */ -#define SDLK_CHANNEL_DECREMENT 0x40000105u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_DECREMENT) */ -#define SDLK_MEDIA_PLAY 0x40000106u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY) */ -#define SDLK_MEDIA_PAUSE 0x40000107u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PAUSE) */ -#define SDLK_MEDIA_RECORD 0x40000108u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_RECORD) */ -#define SDLK_MEDIA_FAST_FORWARD 0x40000109u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_FAST_FORWARD) */ -#define SDLK_MEDIA_REWIND 0x4000010au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_REWIND) */ -#define SDLK_MEDIA_NEXT_TRACK 0x4000010bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_NEXT_TRACK) */ -#define SDLK_MEDIA_PREVIOUS_TRACK 0x4000010cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PREVIOUS_TRACK) */ -#define SDLK_MEDIA_STOP 0x4000010du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_STOP) */ -#define SDLK_MEDIA_EJECT 0x4000010eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_EJECT) */ -#define SDLK_MEDIA_PLAY_PAUSE 0x4000010fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY_PAUSE) */ -#define SDLK_MEDIA_SELECT 0x40000110u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_SELECT) */ -#define SDLK_AC_NEW 0x40000111u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_NEW) */ -#define SDLK_AC_OPEN 0x40000112u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_OPEN) */ -#define SDLK_AC_CLOSE 0x40000113u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_CLOSE) */ -#define SDLK_AC_EXIT 0x40000114u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_EXIT) */ -#define SDLK_AC_SAVE 0x40000115u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SAVE) */ -#define SDLK_AC_PRINT 0x40000116u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PRINT) */ -#define SDLK_AC_PROPERTIES 0x40000117u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PROPERTIES) */ -#define SDLK_AC_SEARCH 0x40000118u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH) */ -#define SDLK_AC_HOME 0x40000119u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME) */ -#define SDLK_AC_BACK 0x4000011au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK) */ -#define SDLK_AC_FORWARD 0x4000011bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD) */ -#define SDLK_AC_STOP 0x4000011cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP) */ -#define SDLK_AC_REFRESH 0x4000011du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH) */ -#define SDLK_AC_BOOKMARKS 0x4000011eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS) */ -#define SDLK_SOFTLEFT 0x4000011fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTLEFT) */ -#define SDLK_SOFTRIGHT 0x40000120u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT) */ -#define SDLK_CALL 0x40000121u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL) */ -#define SDLK_ENDCALL 0x40000122u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL) */ +#define SDLK_UNKNOWN 0x00000000u /**< 0 */ +#define SDLK_RETURN 0x0000000du /**< '\r' */ +#define SDLK_ESCAPE 0x0000001bu /**< '\x1B' */ +#define SDLK_BACKSPACE 0x00000008u /**< '\b' */ +#define SDLK_TAB 0x00000009u /**< '\t' */ +#define SDLK_SPACE 0x00000020u /**< ' ' */ +#define SDLK_EXCLAIM 0x00000021u /**< '!' */ +#define SDLK_DBLAPOSTROPHE 0x00000022u /**< '"' */ +#define SDLK_HASH 0x00000023u /**< '#' */ +#define SDLK_DOLLAR 0x00000024u /**< '$' */ +#define SDLK_PERCENT 0x00000025u /**< '%' */ +#define SDLK_AMPERSAND 0x00000026u /**< '&' */ +#define SDLK_APOSTROPHE 0x00000027u /**< '\'' */ +#define SDLK_LEFTPAREN 0x00000028u /**< '(' */ +#define SDLK_RIGHTPAREN 0x00000029u /**< ')' */ +#define SDLK_ASTERISK 0x0000002au /**< '*' */ +#define SDLK_PLUS 0x0000002bu /**< '+' */ +#define SDLK_COMMA 0x0000002cu /**< ',' */ +#define SDLK_MINUS 0x0000002du /**< '-' */ +#define SDLK_PERIOD 0x0000002eu /**< '.' */ +#define SDLK_SLASH 0x0000002fu /**< '/' */ +#define SDLK_0 0x00000030u /**< '0' */ +#define SDLK_1 0x00000031u /**< '1' */ +#define SDLK_2 0x00000032u /**< '2' */ +#define SDLK_3 0x00000033u /**< '3' */ +#define SDLK_4 0x00000034u /**< '4' */ +#define SDLK_5 0x00000035u /**< '5' */ +#define SDLK_6 0x00000036u /**< '6' */ +#define SDLK_7 0x00000037u /**< '7' */ +#define SDLK_8 0x00000038u /**< '8' */ +#define SDLK_9 0x00000039u /**< '9' */ +#define SDLK_COLON 0x0000003au /**< ':' */ +#define SDLK_SEMICOLON 0x0000003bu /**< ';' */ +#define SDLK_LESS 0x0000003cu /**< '<' */ +#define SDLK_EQUALS 0x0000003du /**< '=' */ +#define SDLK_GREATER 0x0000003eu /**< '>' */ +#define SDLK_QUESTION 0x0000003fu /**< '?' */ +#define SDLK_AT 0x00000040u /**< '@' */ +#define SDLK_LEFTBRACKET 0x0000005bu /**< '[' */ +#define SDLK_BACKSLASH 0x0000005cu /**< '\\' */ +#define SDLK_RIGHTBRACKET 0x0000005du /**< ']' */ +#define SDLK_CARET 0x0000005eu /**< '^' */ +#define SDLK_UNDERSCORE 0x0000005fu /**< '_' */ +#define SDLK_GRAVE 0x00000060u /**< '`' */ +#define SDLK_A 0x00000061u /**< 'a' */ +#define SDLK_B 0x00000062u /**< 'b' */ +#define SDLK_C 0x00000063u /**< 'c' */ +#define SDLK_D 0x00000064u /**< 'd' */ +#define SDLK_E 0x00000065u /**< 'e' */ +#define SDLK_F 0x00000066u /**< 'f' */ +#define SDLK_G 0x00000067u /**< 'g' */ +#define SDLK_H 0x00000068u /**< 'h' */ +#define SDLK_I 0x00000069u /**< 'i' */ +#define SDLK_J 0x0000006au /**< 'j' */ +#define SDLK_K 0x0000006bu /**< 'k' */ +#define SDLK_L 0x0000006cu /**< 'l' */ +#define SDLK_M 0x0000006du /**< 'm' */ +#define SDLK_N 0x0000006eu /**< 'n' */ +#define SDLK_O 0x0000006fu /**< 'o' */ +#define SDLK_P 0x00000070u /**< 'p' */ +#define SDLK_Q 0x00000071u /**< 'q' */ +#define SDLK_R 0x00000072u /**< 'r' */ +#define SDLK_S 0x00000073u /**< 's' */ +#define SDLK_T 0x00000074u /**< 't' */ +#define SDLK_U 0x00000075u /**< 'u' */ +#define SDLK_V 0x00000076u /**< 'v' */ +#define SDLK_W 0x00000077u /**< 'w' */ +#define SDLK_X 0x00000078u /**< 'x' */ +#define SDLK_Y 0x00000079u /**< 'y' */ +#define SDLK_Z 0x0000007au /**< 'z' */ +#define SDLK_LEFTBRACE 0x0000007bu /**< '{' */ +#define SDLK_PIPE 0x0000007cu /**< '|' */ +#define SDLK_RIGHTBRACE 0x0000007du /**< '}' */ +#define SDLK_TILDE 0x0000007eu /**< '~' */ +#define SDLK_DELETE 0x0000007fu /**< '\x7F' */ +#define SDLK_PLUSMINUS 0x000000b1u /**< '\xB1' */ +#define SDLK_CAPSLOCK 0x40000039u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK) */ +#define SDLK_F1 0x4000003au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1) */ +#define SDLK_F2 0x4000003bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2) */ +#define SDLK_F3 0x4000003cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3) */ +#define SDLK_F4 0x4000003du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4) */ +#define SDLK_F5 0x4000003eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5) */ +#define SDLK_F6 0x4000003fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6) */ +#define SDLK_F7 0x40000040u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7) */ +#define SDLK_F8 0x40000041u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8) */ +#define SDLK_F9 0x40000042u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9) */ +#define SDLK_F10 0x40000043u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10) */ +#define SDLK_F11 0x40000044u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11) */ +#define SDLK_F12 0x40000045u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12) */ +#define SDLK_PRINTSCREEN 0x40000046u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN) */ +#define SDLK_SCROLLLOCK 0x40000047u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK) */ +#define SDLK_PAUSE 0x40000048u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE) */ +#define SDLK_INSERT 0x40000049u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT) */ +#define SDLK_HOME 0x4000004au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME) */ +#define SDLK_PAGEUP 0x4000004bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP) */ +#define SDLK_END 0x4000004du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END) */ +#define SDLK_PAGEDOWN 0x4000004eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN) */ +#define SDLK_RIGHT 0x4000004fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT) */ +#define SDLK_LEFT 0x40000050u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT) */ +#define SDLK_DOWN 0x40000051u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN) */ +#define SDLK_UP 0x40000052u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP) */ +#define SDLK_NUMLOCKCLEAR 0x40000053u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR) */ +#define SDLK_KP_DIVIDE 0x40000054u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE) */ +#define SDLK_KP_MULTIPLY 0x40000055u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY) */ +#define SDLK_KP_MINUS 0x40000056u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS) */ +#define SDLK_KP_PLUS 0x40000057u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS) */ +#define SDLK_KP_ENTER 0x40000058u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER) */ +#define SDLK_KP_1 0x40000059u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1) */ +#define SDLK_KP_2 0x4000005au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2) */ +#define SDLK_KP_3 0x4000005bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3) */ +#define SDLK_KP_4 0x4000005cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4) */ +#define SDLK_KP_5 0x4000005du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5) */ +#define SDLK_KP_6 0x4000005eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6) */ +#define SDLK_KP_7 0x4000005fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7) */ +#define SDLK_KP_8 0x40000060u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8) */ +#define SDLK_KP_9 0x40000061u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9) */ +#define SDLK_KP_0 0x40000062u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0) */ +#define SDLK_KP_PERIOD 0x40000063u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD) */ +#define SDLK_APPLICATION 0x40000065u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION) */ +#define SDLK_POWER 0x40000066u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER) */ +#define SDLK_KP_EQUALS 0x40000067u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS) */ +#define SDLK_F13 0x40000068u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13) */ +#define SDLK_F14 0x40000069u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14) */ +#define SDLK_F15 0x4000006au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15) */ +#define SDLK_F16 0x4000006bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16) */ +#define SDLK_F17 0x4000006cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17) */ +#define SDLK_F18 0x4000006du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18) */ +#define SDLK_F19 0x4000006eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19) */ +#define SDLK_F20 0x4000006fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20) */ +#define SDLK_F21 0x40000070u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21) */ +#define SDLK_F22 0x40000071u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22) */ +#define SDLK_F23 0x40000072u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23) */ +#define SDLK_F24 0x40000073u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24) */ +#define SDLK_EXECUTE 0x40000074u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE) */ +#define SDLK_HELP 0x40000075u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP) */ +#define SDLK_MENU 0x40000076u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU) */ +#define SDLK_SELECT 0x40000077u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT) */ +#define SDLK_STOP 0x40000078u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP) */ +#define SDLK_AGAIN 0x40000079u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN) */ +#define SDLK_UNDO 0x4000007au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO) */ +#define SDLK_CUT 0x4000007bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT) */ +#define SDLK_COPY 0x4000007cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY) */ +#define SDLK_PASTE 0x4000007du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE) */ +#define SDLK_FIND 0x4000007eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND) */ +#define SDLK_MUTE 0x4000007fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE) */ +#define SDLK_VOLUMEUP 0x40000080u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP) */ +#define SDLK_VOLUMEDOWN 0x40000081u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN) */ +#define SDLK_KP_COMMA 0x40000085u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA) */ +#define SDLK_KP_EQUALSAS400 0x40000086u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400) */ +#define SDLK_ALTERASE 0x40000099u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE) */ +#define SDLK_SYSREQ 0x4000009au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ) */ +#define SDLK_CANCEL 0x4000009bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL) */ +#define SDLK_CLEAR 0x4000009cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR) */ +#define SDLK_PRIOR 0x4000009du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR) */ +#define SDLK_RETURN2 0x4000009eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2) */ +#define SDLK_SEPARATOR 0x4000009fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR) */ +#define SDLK_OUT 0x400000a0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT) */ +#define SDLK_OPER 0x400000a1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER) */ +#define SDLK_CLEARAGAIN 0x400000a2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN) */ +#define SDLK_CRSEL 0x400000a3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL) */ +#define SDLK_EXSEL 0x400000a4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL) */ +#define SDLK_KP_00 0x400000b0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00) */ +#define SDLK_KP_000 0x400000b1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000) */ +#define SDLK_THOUSANDSSEPARATOR 0x400000b2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR) */ +#define SDLK_DECIMALSEPARATOR 0x400000b3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR) */ +#define SDLK_CURRENCYUNIT 0x400000b4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT) */ +#define SDLK_CURRENCYSUBUNIT 0x400000b5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT) */ +#define SDLK_KP_LEFTPAREN 0x400000b6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN) */ +#define SDLK_KP_RIGHTPAREN 0x400000b7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN) */ +#define SDLK_KP_LEFTBRACE 0x400000b8u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE) */ +#define SDLK_KP_RIGHTBRACE 0x400000b9u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE) */ +#define SDLK_KP_TAB 0x400000bau /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB) */ +#define SDLK_KP_BACKSPACE 0x400000bbu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE) */ +#define SDLK_KP_A 0x400000bcu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A) */ +#define SDLK_KP_B 0x400000bdu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B) */ +#define SDLK_KP_C 0x400000beu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C) */ +#define SDLK_KP_D 0x400000bfu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D) */ +#define SDLK_KP_E 0x400000c0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E) */ +#define SDLK_KP_F 0x400000c1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F) */ +#define SDLK_KP_XOR 0x400000c2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR) */ +#define SDLK_KP_POWER 0x400000c3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER) */ +#define SDLK_KP_PERCENT 0x400000c4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT) */ +#define SDLK_KP_LESS 0x400000c5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS) */ +#define SDLK_KP_GREATER 0x400000c6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER) */ +#define SDLK_KP_AMPERSAND 0x400000c7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND) */ +#define SDLK_KP_DBLAMPERSAND 0x400000c8u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND) */ +#define SDLK_KP_VERTICALBAR 0x400000c9u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR) */ +#define SDLK_KP_DBLVERTICALBAR 0x400000cau /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR) */ +#define SDLK_KP_COLON 0x400000cbu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON) */ +#define SDLK_KP_HASH 0x400000ccu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH) */ +#define SDLK_KP_SPACE 0x400000cdu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE) */ +#define SDLK_KP_AT 0x400000ceu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT) */ +#define SDLK_KP_EXCLAM 0x400000cfu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM) */ +#define SDLK_KP_MEMSTORE 0x400000d0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE) */ +#define SDLK_KP_MEMRECALL 0x400000d1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL) */ +#define SDLK_KP_MEMCLEAR 0x400000d2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR) */ +#define SDLK_KP_MEMADD 0x400000d3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD) */ +#define SDLK_KP_MEMSUBTRACT 0x400000d4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT) */ +#define SDLK_KP_MEMMULTIPLY 0x400000d5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY) */ +#define SDLK_KP_MEMDIVIDE 0x400000d6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE) */ +#define SDLK_KP_PLUSMINUS 0x400000d7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS) */ +#define SDLK_KP_CLEAR 0x400000d8u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR) */ +#define SDLK_KP_CLEARENTRY 0x400000d9u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY) */ +#define SDLK_KP_BINARY 0x400000dau /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY) */ +#define SDLK_KP_OCTAL 0x400000dbu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL) */ +#define SDLK_KP_DECIMAL 0x400000dcu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL) */ +#define SDLK_KP_HEXADECIMAL 0x400000ddu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL) */ +#define SDLK_LCTRL 0x400000e0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL) */ +#define SDLK_LSHIFT 0x400000e1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT) */ +#define SDLK_LALT 0x400000e2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT) */ +#define SDLK_LGUI 0x400000e3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI) */ +#define SDLK_RCTRL 0x400000e4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL) */ +#define SDLK_RSHIFT 0x400000e5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT) */ +#define SDLK_RALT 0x400000e6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT) */ +#define SDLK_RGUI 0x400000e7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI) */ +#define SDLK_MODE 0x40000101u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE) */ +#define SDLK_SLEEP 0x40000102u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP) */ +#define SDLK_WAKE 0x40000103u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WAKE) */ +#define SDLK_CHANNEL_INCREMENT 0x40000104u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_INCREMENT) */ +#define SDLK_CHANNEL_DECREMENT 0x40000105u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_DECREMENT) */ +#define SDLK_MEDIA_PLAY 0x40000106u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY) */ +#define SDLK_MEDIA_PAUSE 0x40000107u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PAUSE) */ +#define SDLK_MEDIA_RECORD 0x40000108u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_RECORD) */ +#define SDLK_MEDIA_FAST_FORWARD 0x40000109u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_FAST_FORWARD) */ +#define SDLK_MEDIA_REWIND 0x4000010au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_REWIND) */ +#define SDLK_MEDIA_NEXT_TRACK 0x4000010bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_NEXT_TRACK) */ +#define SDLK_MEDIA_PREVIOUS_TRACK 0x4000010cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PREVIOUS_TRACK) */ +#define SDLK_MEDIA_STOP 0x4000010du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_STOP) */ +#define SDLK_MEDIA_EJECT 0x4000010eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_EJECT) */ +#define SDLK_MEDIA_PLAY_PAUSE 0x4000010fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY_PAUSE) */ +#define SDLK_MEDIA_SELECT 0x40000110u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_SELECT) */ +#define SDLK_AC_NEW 0x40000111u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_NEW) */ +#define SDLK_AC_OPEN 0x40000112u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_OPEN) */ +#define SDLK_AC_CLOSE 0x40000113u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_CLOSE) */ +#define SDLK_AC_EXIT 0x40000114u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_EXIT) */ +#define SDLK_AC_SAVE 0x40000115u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SAVE) */ +#define SDLK_AC_PRINT 0x40000116u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PRINT) */ +#define SDLK_AC_PROPERTIES 0x40000117u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PROPERTIES) */ +#define SDLK_AC_SEARCH 0x40000118u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH) */ +#define SDLK_AC_HOME 0x40000119u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME) */ +#define SDLK_AC_BACK 0x4000011au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK) */ +#define SDLK_AC_FORWARD 0x4000011bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD) */ +#define SDLK_AC_STOP 0x4000011cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP) */ +#define SDLK_AC_REFRESH 0x4000011du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH) */ +#define SDLK_AC_BOOKMARKS 0x4000011eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS) */ +#define SDLK_SOFTLEFT 0x4000011fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTLEFT) */ +#define SDLK_SOFTRIGHT 0x40000120u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT) */ +#define SDLK_CALL 0x40000121u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL) */ +#define SDLK_ENDCALL 0x40000122u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL) */ +#define SDLK_LEFT_TAB 0x20000001u /**< Extended key Left Tab */ +#define SDLK_LEVEL5_SHIFT 0x20000002u /**< Extended key Level 5 Shift */ +#define SDLK_MULTI_KEY_COMPOSE 0x20000003u /**< Extended key Multi-key Compose */ +#define SDLK_LMETA 0x20000004u /**< Extended key Left Meta */ +#define SDLK_RMETA 0x20000005u /**< Extended key Right Meta */ +#define SDLK_LHYPER 0x20000006u /**< Extended key Left Hyper */ +#define SDLK_RHYPER 0x20000007u /**< Extended key Right Hyper */ /** * Valid key modifiers (possibly OR'd together). * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint16 SDL_Keymod; #define SDL_KMOD_NONE 0x0000u /**< no modifier is applicable. */ #define SDL_KMOD_LSHIFT 0x0001u /**< the left Shift key is down. */ #define SDL_KMOD_RSHIFT 0x0002u /**< the right Shift key is down. */ +#define SDL_KMOD_LEVEL5 0x0004u /**< the Level 5 Shift key is down. */ #define SDL_KMOD_LCTRL 0x0040u /**< the left Ctrl (Control) key is down. */ #define SDL_KMOD_RCTRL 0x0080u /**< the right Ctrl (Control) key is down. */ #define SDL_KMOD_LALT 0x0100u /**< the left Alt key is down. */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_loadso.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_loadso.h index ab34a38..f8649d7 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_loadso.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_loadso.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -26,6 +26,14 @@ * * System-dependent library loading routines. * + * Shared objects are code that is programmatically loadable at runtime. + * Windows calls these "DLLs", Linux calls them "shared libraries", etc. + * + * To use them, build such a library, then call SDL_LoadObject() on it. Once + * loaded, you can use SDL_LoadFunction() on that object to find the address + * of its exported symbols. When done with the object, call SDL_UnloadObject() + * to dispose of it. + * * Some things to keep in mind: * * - These functions only work on C function names. Other languages may have @@ -38,6 +46,11 @@ * 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. :) + * - Once a library is unloaded, all pointers into it obtained through + * SDL_LoadFunction() become invalid, even if the library is later reloaded. + * Don't unload a library if you plan to use these pointers in the future. + * Notably: beware of giving one of these pointers to atexit(), since it may + * call that pointer after the library unloads. */ #ifndef SDL_loadso_h_ @@ -52,6 +65,17 @@ extern "C" { #endif +/** + * An opaque datatype that represents a loaded shared object. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_LoadObject + * \sa SDL_LoadFunction + * \sa SDL_UnloadObject + */ +typedef struct SDL_SharedObject SDL_SharedObject; + /** * Dynamically load a shared object. * @@ -59,12 +83,14 @@ extern "C" { * \returns an opaque pointer to the object handle or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadFunction * \sa SDL_UnloadObject */ -extern SDL_DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); +extern SDL_DECLSPEC SDL_SharedObject * SDLCALL SDL_LoadObject(const char *sofile); /** * Look up the address of the named function in a shared object. @@ -86,22 +112,29 @@ extern SDL_DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); * \returns a pointer to the function or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadObject */ -extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_LoadFunction(void *handle, const char *name); +extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_LoadFunction(SDL_SharedObject *handle, const char *name); /** * Unload a shared object from memory. * + * Note that any pointers from this object looked up through + * SDL_LoadFunction() will no longer be valid. + * * \param handle a valid shared object handle returned by SDL_LoadObject(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadObject */ -extern SDL_DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); +extern SDL_DECLSPEC void SDLCALL SDL_UnloadObject(SDL_SharedObject *handle); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_locale.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_locale.h index 85d7750..902843e 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_locale.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_locale.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,12 @@ * # CategoryLocale * * SDL locale services. + * + * This provides a way to get a list of preferred locales (language plus + * country) for the user. There is exactly one function: + * SDL_GetPreferredLocales(), which handles all the heavy lifting, and offers + * documentation on all the strange ways humans might have configured their + * language settings. */ #ifndef SDL_locale_h @@ -47,7 +53,7 @@ extern "C" { * would be "en"), and the country, if not NULL, will be an ISO-3166 country * code (so Canada would be "CA"). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPreferredLocales */ @@ -96,7 +102,7 @@ typedef struct SDL_Locale * allocation that should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Locale ** SDLCALL SDL_GetPreferredLocales(int *count); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_log.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_log.h index deda238..a56476c 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_log.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_log.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,7 @@ /** * # CategoryLog * - * Simple log messages with priorities and categories. A message’s + * Simple log messages with priorities and categories. A message's * SDL_LogPriority signifies how important the message is. A message's * SDL_LogCategory signifies from what domain it belongs to. Every category * has a minimum priority specified: when a message belongs to that category, @@ -76,7 +76,7 @@ extern "C" { * 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 ERROR level. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_LogCategory { @@ -87,12 +87,11 @@ typedef enum SDL_LogCategory SDL_LOG_CATEGORY_AUDIO, SDL_LOG_CATEGORY_VIDEO, SDL_LOG_CATEGORY_RENDER, - SDL_LOG_CATEGORY_GPU, SDL_LOG_CATEGORY_INPUT, SDL_LOG_CATEGORY_TEST, + SDL_LOG_CATEGORY_GPU, /* Reserved for future SDL library use */ - SDL_LOG_CATEGORY_RESERVED1, SDL_LOG_CATEGORY_RESERVED2, SDL_LOG_CATEGORY_RESERVED3, SDL_LOG_CATEGORY_RESERVED4, @@ -117,17 +116,19 @@ typedef enum SDL_LogCategory /** * The predefined log priorities * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_LogPriority { - SDL_LOG_PRIORITY_VERBOSE = 1, + SDL_LOG_PRIORITY_INVALID, + SDL_LOG_PRIORITY_TRACE, + SDL_LOG_PRIORITY_VERBOSE, 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_LOG_PRIORITY_COUNT } SDL_LogPriority; @@ -136,7 +137,9 @@ typedef enum SDL_LogPriority * * \param priority the SDL_LogPriority to assign. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResetLogPriorities * \sa SDL_SetLogPriority @@ -149,14 +152,15 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriorities(SDL_LogPriority priority); * \param category the category to assign a priority to. * \param priority the SDL_LogPriority to assign. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetLogPriority * \sa SDL_ResetLogPriorities * \sa SDL_SetLogPriorities */ -extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriority(int category, - SDL_LogPriority priority); +extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriority(int category, SDL_LogPriority priority); /** * Get the priority of a particular log category. @@ -164,7 +168,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriority(int category, * \param category the category to query. * \returns the SDL_LogPriority for the requested category. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetLogPriority */ @@ -175,7 +181,9 @@ extern SDL_DECLSPEC SDL_LogPriority SDLCALL SDL_GetLogPriority(int category); * * This is called by SDL_Quit(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetLogPriorities * \sa SDL_SetLogPriority @@ -192,15 +200,17 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetLogPriorities(void); * \param priority the SDL_LogPriority to modify. * \param prefix the prefix to use for that log priority, or NULL to use no * prefix. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetLogPriorities * \sa SDL_SetLogPriority */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLogPriorityPrefix(SDL_LogPriority priority, const char *prefix); +extern SDL_DECLSPEC bool SDLCALL SDL_SetLogPriorityPrefix(SDL_LogPriority priority, const char *prefix); /** * Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO. @@ -209,7 +219,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLogPriorityPrefix(SDL_LogPriority pr * \param ... additional parameters matching % tokens in the `fmt` string, if * any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LogCritical * \sa SDL_LogDebug @@ -217,11 +229,37 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLogPriorityPrefix(SDL_LogPriority pr * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ extern SDL_DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); +/** + * Log a message with SDL_LOG_PRIORITY_TRACE. + * + * \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. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogTrace + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern SDL_DECLSPEC void SDLCALL SDL_LogTrace(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + /** * Log a message with SDL_LOG_PRIORITY_VERBOSE. * @@ -230,7 +268,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fm * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -251,7 +291,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_ * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -259,6 +301,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_ * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -272,7 +315,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogDebug(int category, SDL_PRINTF_FORMAT_ST * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -280,6 +325,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogDebug(int category, SDL_PRINTF_FORMAT_ST * \sa SDL_LogError * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -293,7 +339,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STR * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -302,6 +350,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STR * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose */ extern SDL_DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); @@ -314,7 +363,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STR * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -322,6 +373,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STR * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -335,7 +387,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogError(int category, SDL_PRINTF_FORMAT_ST * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogDebug @@ -343,6 +397,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogError(int category, SDL_PRINTF_FORMAT_ST * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -357,7 +412,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogCritical(int category, SDL_PRINTF_FORMAT * \param ... additional parameters matching % tokens in the **fmt** string, * if any. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -365,6 +422,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogCritical(int category, SDL_PRINTF_FORMAT * \sa SDL_LogError * \sa SDL_LogInfo * \sa SDL_LogMessageV + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -380,7 +438,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogMessage(int category, * \param fmt a printf() style message format string. * \param ap a variable argument list. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -388,6 +448,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogMessage(int category, * \sa SDL_LogError * \sa SDL_LogInfo * \sa SDL_LogMessage + * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ @@ -398,7 +459,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogMessageV(int category, /** * The prototype for the log output callback function. * - * This function is called by SDL when there is new text to be logged. + * This function is called by SDL when there is new text to be logged. A mutex + * is held so that this function is never called by more than one thread at + * once. * * \param userdata what was passed as `userdata` to * SDL_SetLogOutputFunction(). @@ -406,10 +469,24 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogMessageV(int category, * \param priority the priority of the message. * \param message the message being output. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef void (SDLCALL *SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message); +/** + * Get the default log output function. + * + * \returns the default log output callback. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetLogOutputFunction + * \sa SDL_GetLogOutputFunction + */ +extern SDL_DECLSPEC SDL_LogOutputFunction SDLCALL SDL_GetDefaultLogOutputFunction(void); + /** * Get the current log output function. * @@ -418,8 +495,11 @@ typedef void (SDLCALL *SDL_LogOutputFunction)(void *userdata, int category, SDL_ * \param userdata a pointer filled in with the pointer that is passed to * `callback`. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetDefaultLogOutputFunction * \sa SDL_SetLogOutputFunction */ extern SDL_DECLSPEC void SDLCALL SDL_GetLogOutputFunction(SDL_LogOutputFunction *callback, void **userdata); @@ -430,8 +510,11 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetLogOutputFunction(SDL_LogOutputFunction * \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 3.0.0. + * \threadsafety It is safe to call this function from any thread. * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetDefaultLogOutputFunction * \sa SDL_GetLogOutputFunction */ extern SDL_DECLSPEC void SDLCALL SDL_SetLogOutputFunction(SDL_LogOutputFunction callback, void *userdata); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main.h index de3c187..2e7a2eb 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,13 +22,29 @@ /** * # CategoryMain * - * Redefine main() on some platforms so that it is called by SDL. + * Redefine main() if necessary so that it is called by SDL. * - * For details on how SDL_main works, and how to use it, please refer to: + * In order to make this consistent on all platforms, the application's main() + * should look like this: + * + * ```c + * int main(int argc, char *argv[]) + * { + * } + * ``` + * + * SDL will take care of platform specific details on how it gets called. + * + * This is also where an app can be configured to use the main callbacks, via + * the SDL_MAIN_USE_CALLBACKS macro. + * + * This is a "single-header library," which is to say that including this + * header inserts code into your program, and you should only include it once + * in most cases. SDL.h does not include this header automatically. + * + * For more information, see: * * https://wiki.libsdl.org/SDL3/README/main-functions - * - * (or docs/README-main-functions.md in the SDL source tree) */ #ifndef SDL_main_h_ @@ -39,8 +55,96 @@ #include #include +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Inform SDL that the app is providing an entry point instead of SDL. + * + * SDL does not define this macro, but will check if it is defined when + * including `SDL_main.h`. If defined, SDL will expect the app to provide the + * proper entry point for the platform, and all the other magic details + * needed, like manually calling SDL_SetMainReady. + * + * Please see [README/main-functions](README/main-functions), (or + * docs/README-main-functions.md in the source tree) for a more detailed + * explanation. + * + * \since This macro is used by the headers since SDL 3.2.0. + */ +#define SDL_MAIN_HANDLED 1 + +/** + * Inform SDL to use the main callbacks instead of main. + * + * SDL does not define this macro, but will check if it is defined when + * including `SDL_main.h`. If defined, SDL will expect the app to provide + * several functions: SDL_AppInit, SDL_AppEvent, SDL_AppIterate, and + * SDL_AppQuit. The app should not provide a `main` function in this case, and + * doing so will likely cause the build to fail. + * + * Please see [README/main-functions](README/main-functions), (or + * docs/README-main-functions.md in the source tree) for a more detailed + * explanation. + * + * \since This macro is used by the headers since SDL 3.2.0. + * + * \sa SDL_AppInit + * \sa SDL_AppEvent + * \sa SDL_AppIterate + * \sa SDL_AppQuit + */ +#define SDL_MAIN_USE_CALLBACKS 1 + +/** + * Defined if the target platform offers a special mainline through SDL. + * + * This won't be defined otherwise. If defined, SDL's headers will redefine + * `main` to `SDL_main`. + * + * This macro is defined by `SDL_main.h`, which is not automatically included + * by `SDL.h`. + * + * Even if available, an app can define SDL_MAIN_HANDLED and provide their + * own, if they know what they're doing. + * + * This macro is used internally by SDL, and apps probably shouldn't rely on it. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_MAIN_AVAILABLE + +/** + * Defined if the target platform _requires_ a special mainline through SDL. + * + * This won't be defined otherwise. If defined, SDL's headers will redefine + * `main` to `SDL_main`. + * + * This macro is defined by `SDL_main.h`, which is not automatically included + * by `SDL.h`. + * + * Even if required, an app can define SDL_MAIN_HANDLED and provide their + * own, if they know what they're doing. + * + * This macro is used internally by SDL, and apps probably shouldn't rely on it. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_MAIN_NEEDED + +#endif + +#if defined(__has_include) + #if __has_include("SDL_main_private.h") && __has_include("SDL_main_impl_private.h") + #define SDL_PLATFORM_PRIVATE_MAIN + #endif +#endif + #ifndef SDL_MAIN_HANDLED - #ifdef SDL_PLATFORM_WIN32 + #if defined(SDL_PLATFORM_PRIVATE_MAIN) + /* Private platforms may have their own ideas about entry points. */ + #include "SDL_main_private.h" + + #elif defined(SDL_PLATFORM_WIN32) /* On Windows SDL provides WinMain(), which parses the command line and passes the arguments to your main function. @@ -48,20 +152,6 @@ */ #define SDL_MAIN_AVAILABLE - #elif defined(SDL_PLATFORM_WINRT) - /* On WinRT, SDL provides a main function that initializes CoreApplication, - creating an instance of IFrameworkView in the process. - - Ideally, #include'ing SDL_main.h is enough to get a main() function working. - However, that requires the source file your main() is in to be compiled - as C++ *and* with the /ZW compiler flag. If that's not feasible, add an - otherwise empty .cpp file that only contains `#include ` - and build that with /ZW (still include SDL_main.h in your other file with main()!). - In XAML apps, instead the function SDL_RunApp() must be called with a pointer - to the Direct3D-hosted XAML control passed in as the "reserved" argument. - */ - #define SDL_MAIN_NEEDED - #elif defined(SDL_PLATFORM_GDK) /* On GDK, SDL provides a main function that initializes the game runtime. @@ -91,8 +181,14 @@ */ #define SDL_MAIN_NEEDED - /* We need to export SDL_main so it can be launched from Java */ - #define SDLMAIN_DECLSPEC SDL_DECLSPEC + /* As this is launched from Java, the real entry point (main() function) + is outside of the the binary built from this code. + This define makes sure that, unlike on other platforms, SDL_main.h + and SDL_main_impl.h export an `SDL_main()` function (to be called + from Java), but don't implement a native `int main(int argc, char* argv[])` + or similar. + */ + #define SDL_MAIN_EXPORTED #elif defined(SDL_PLATFORM_EMSCRIPTEN) /* On Emscripten, SDL provides a main function that converts URL @@ -129,60 +225,36 @@ */ #define SDL_MAIN_AVAILABLE - #elif defined(SDL_PLATFORM_NGAGE) - /* - TODO: not sure if it should be SDL_MAIN_NEEDED, in SDL2 ngage had a - main implementation, but wasn't mentioned in SDL_main.h - */ - #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: - * - * ```c - * #ifdef __cplusplus - * extern "C" - * #endif - * int main(int argc, char *argv[]) - * { - * } - * ``` - */ #ifdef SDL_WIKI_DOCUMENTATION_SECTION /** - * Inform SDL to use the main callbacks instead of main. + * A macro to tag a main entry point function as exported. * - * SDL does not define this macro, but will check if it is defined when - * including `SDL_main.h`. If defined, SDL will expect the app to provide - * several functions: SDL_AppInit, SDL_AppEvent, SDL_AppIterate, and - * SDL_AppQuit. The app should not provide a `main` function in this case, and - * doing so will likely cause the build to fail. + * Most platforms don't need this, and the macro will be defined to nothing. + * Some, like Android, keep the entry points in a shared library and need to + * explicitly export the symbols. * - * Please see [README/main-functions](README/main-functions), (or - * docs/README-main-functions.md in the source tree) for a more detailed - * explanation. + * External code rarely needs this, and if it needs something, it's almost + * always SDL_DECLSPEC instead. * - * \since This macro is used by the headers since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * - * \sa SDL_AppInit - * \sa SDL_AppEvent - * \sa SDL_AppIterate - * \sa SDL_AppQuit + * \sa SDL_DECLSPEC */ -#define SDL_MAIN_USE_CALLBACKS 1 -#endif +#define SDLMAIN_DECLSPEC + +#elif defined(SDL_MAIN_EXPORTED) +/* We need to export SDL_main so it can be launched from external code, + like SDLActivity.java on Android */ +#define SDLMAIN_DECLSPEC SDL_DECLSPEC +#else +/* usually this is empty */ +#define SDLMAIN_DECLSPEC +#endif /* SDL_MAIN_EXPORTED */ #if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) || defined(SDL_MAIN_USE_CALLBACKS) #define main SDL_main @@ -248,6 +320,8 @@ extern "C" { * SDL_APP_SUCCESS, SDL calls SDL_AppQuit and terminates with an exit code * that reports success to the platform. * + * This function is called by SDL on the main thread. + * * \param appstate a place where the app can optionally store a pointer for * future use. * \param argc the standard ANSI C main's argc; number of elements in `argv`. @@ -256,9 +330,7 @@ extern "C" { * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * - * \threadsafety This function is not thread safe. - * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppIterate * \sa SDL_AppEvent @@ -301,13 +373,16 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppInit(void **appstate, int a * SDL_AppQuit and terminates with an exit code that reports success to the * platform. * + * This function is called by SDL on the main thread. + * * \param appstate an optional pointer, provided by the app in SDL_AppInit. * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * - * \threadsafety This function is not thread safe. + * \threadsafety This function may get called concurrently with SDL_AppEvent() + * for events not pushed on the main thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppInit * \sa SDL_AppEvent @@ -320,15 +395,15 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppIterate(void *appstate); * Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a * standard "main" function, you should not supply this. * - * This function is called as needed by SDL after SDL_AppInit returns 0; It is - * called once for each new event. + * This function is called as needed by SDL after SDL_AppInit returns + * SDL_APP_CONTINUE. It is called once for each new event. * * There is (currently) no guarantee about what thread this will be called * from; whatever thread pushes an event onto SDL's queue will trigger this * function. SDL is responsible for pumping the event queue between each call * to SDL_AppIterate, so in normal operation one should only get events in a * serial fashion, but be careful if you have a thread that explicitly calls - * SDL_PushEvent. + * SDL_PushEvent. SDL itself will push events to the queue on the main thread. * * Events sent to this function are not owned by the app; if you need to save * the data, you should copy it. @@ -352,14 +427,16 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppIterate(void *appstate); * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * - * \threadsafety This function is not thread safe. + * \threadsafety This function may get called concurrently with + * SDL_AppIterate() or SDL_AppQuit() for events not pushed from + * the main thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppInit * \sa SDL_AppIterate */ -extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, const SDL_Event *event); +extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, SDL_Event *event); /** * App-implemented deinit entry point for SDL_MAIN_USE_CALLBACKS apps. @@ -385,15 +462,19 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, const * function call is the last time this pointer will be provided, so any * resources to it should be cleaned up here. * + * This function is called by SDL on the main thread. + * * \param appstate an optional pointer, provided by the app in SDL_AppInit. + * \param result the result code that terminated the app (success or failure). * - * \threadsafety This function is not thread safe. + * \threadsafety SDL_AppEvent() may get called concurrently with this function + * if other threads that push events are still active. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppInit */ -extern SDLMAIN_DECLSPEC void SDLCALL SDL_AppQuit(void *appstate); +extern SDLMAIN_DECLSPEC void SDLCALL SDL_AppQuit(void *appstate, SDL_AppResult result); #endif /* SDL_MAIN_USE_CALLBACKS */ @@ -407,7 +488,7 @@ extern SDLMAIN_DECLSPEC void SDLCALL SDL_AppQuit(void *appstate); * program completion, and small non-zero values are considered * errors. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef int (SDLCALL *SDL_main_func)(int argc, char *argv[]); @@ -440,7 +521,7 @@ typedef int (SDLCALL *SDL_main_func)(int argc, char *argv[]); * * \threadsafety This is the program entry point. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDLMAIN_DECLSPEC int SDLCALL SDL_main(int argc, char *argv[]); @@ -453,7 +534,7 @@ extern SDLMAIN_DECLSPEC int SDLCALL SDL_main(int argc, char *argv[]); * will not be changed it is necessary to define SDL_MAIN_HANDLED before * including SDL.h. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init */ @@ -485,7 +566,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetMainReady(void); * \threadsafety Generally this is called once, near startup, from the * process's initial thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_RunApp(int argc, char *argv[], SDL_main_func mainFunction, void *reserved); @@ -512,12 +593,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_RunApp(int argc, char *argv[], SDL_main_func * \threadsafety It is not safe to call this anywhere except as the only * function call in SDL_main. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_EnterAppMainCallbacks(int argc, char *argv[], SDL_AppInit_func appinit, SDL_AppIterate_func appiter, SDL_AppEvent_func appevent, SDL_AppQuit_func appquit); -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) /** * Register a win32 window class for SDL's use. @@ -538,12 +619,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_EnterAppMainCallbacks(int argc, char *argv[] * what is specified here. * \param hInst the HINSTANCE to use in WNDCLASSEX::hInstance. If zero, SDL * will use `GetModuleHandle(NULL)` instead. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst); +extern SDL_DECLSPEC bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst); /** * Deregister the win32 window class from an SDL_RegisterApp call. @@ -558,23 +639,22 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RegisterApp(const char *name, Uint32 st * deregistered when the registration counter in SDL_RegisterApp decrements to * zero through calls to this function. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnregisterApp(void); -#endif /* defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) */ - -#ifdef SDL_PLATFORM_GDK +#endif /* defined(SDL_PLATFORM_WINDOWS) */ /** * Callback from the application to let the suspend continue. * - * \since This function is available since SDL 3.0.0. + * This function is only needed for Xbox GDK support; all other platforms will + * do nothing and set an "unsupported" error message. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void); -#endif /* SDL_PLATFORM_GDK */ - #ifdef __cplusplus } #endif @@ -583,29 +663,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void); #if !defined(SDL_MAIN_HANDLED) && !defined(SDL_MAIN_NOIMPL) /* include header-only SDL_main implementations */ - #if defined(SDL_MAIN_USE_CALLBACKS) \ - || defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) || defined(SDL_PLATFORM_IOS) || defined(SDL_PLATFORM_TVOS) \ - || defined(SDL_PLATFORM_3DS) || defined(SDL_PLATFORM_NGAGE) || defined(SDL_PLATFORM_PS2) || defined(SDL_PLATFORM_PSP) \ - || defined(SDL_PLATFORM_EMSCRIPTEN) - + #if defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) /* platforms which main (-equivalent) can be implemented in plain C */ #include - - #elif defined(SDL_PLATFORM_WINRT) /* C++ platforms */ - #ifdef __cplusplus - #include - #else - /* Note: to get rid of the following warning, you can #define SDL_MAIN_NOIMPL before including SDL_main.h - * in your C sourcefile that contains the standard main. Do *not* use SDL_MAIN_HANDLED for that, then SDL_main won't find your main()! - */ - #ifdef _MSC_VER - #pragma message("Note: Your platform needs the SDL_main implementation in a C++ source file. You can keep your main() in plain C (then continue including SDL_main.h there!) and create a fresh .cpp file that only contains #include ") - #elif defined(__GNUC__) /* gcc, clang, mingw and compatible are matched by this and have #warning */ - #warning "Note: Your platform needs the SDL_main implementation in a C++ source file. You can keep your main() in plain C and create a fresh .cpp file that only contains #include " - #endif /* __GNUC__ */ - #endif /* __cplusplus */ - - #endif /* C++ platforms like SDL_PLATFORM_WINRT etc */ + #endif #endif #endif /* SDL_main_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main_impl.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main_impl.h index ad122df..14ebb42 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main_impl.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main_impl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -29,7 +29,7 @@ #endif /* if someone wants to include SDL_main.h but doesn't want the main handing magic, - (maybe to call SDL_RegisterApp()) they can #define SDL_MAIN_HANDLED first + (maybe to call SDL_RegisterApp()) they can #define SDL_MAIN_HANDLED first. SDL_MAIN_NOIMPL is for SDL-internal usage (only affects implementation, not definition of SDL_MAIN_AVAILABLE etc in SDL_main.h) and if the user wants to have the SDL_main implementation (from this header) in another source file @@ -64,10 +64,15 @@ #endif /* SDL_MAIN_USE_CALLBACKS */ - /* set up the usual SDL_main stuff if we're not using callbacks or if we are but need the normal entry point. */ - #if !defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_CALLBACK_STANDARD) + /* set up the usual SDL_main stuff if we're not using callbacks or if we are but need the normal entry point, + unless the real entry point needs to be somewhere else entirely, like Android where it's in Java code */ + #if (!defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_CALLBACK_STANDARD)) && !defined(SDL_MAIN_EXPORTED) - #if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) + #if defined(SDL_PLATFORM_PRIVATE_MAIN) + /* Private platforms may have their own ideas about entry points. */ + #include "SDL_main_impl_private.h" + + #elif defined(SDL_PLATFORM_WINDOWS) /* these defines/typedefs are needed for the WinMain() definition */ #ifndef WINAPI @@ -82,7 +87,7 @@ #if defined(_MSC_VER) && !defined(SDL_PLATFORM_GDK) /* This is where execution begins [console apps] */ - #if defined( UNICODE ) && UNICODE + #if defined(UNICODE) && UNICODE int wmain(int argc, wchar_t *wargv[], wchar_t *wenvp) { (void)argc; @@ -107,7 +112,7 @@ extern "C" { #endif - #if defined( UNICODE ) && UNICODE + #if defined(UNICODE) && UNICODE int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrev, PWSTR szCmdLine, int sw) #else /* ANSI */ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) @@ -124,83 +129,7 @@ } /* extern "C" */ #endif - /* end of SDL_PLATFORM_WIN32 and SDL_PLATFORM_GDK impls */ - - #elif defined(SDL_PLATFORM_WINRT) - - /* WinRT main based on SDL_winrt_main_NonXAML.cpp, placed in the public domain by David Ludwig 3/13/14 */ - - #include - - /* At least one file in any SDL/WinRT app appears to require compilation - with C++/CX, otherwise a Windows Metadata file won't get created, and - an APPX0702 build error can appear shortly after linking. - - The following set of preprocessor code forces this file to be compiled - as C++/CX, which appears to cause Visual C++ 2012's build tools to - create this .winmd file, and will help allow builds of SDL/WinRT apps - to proceed without error. - - If other files in an app's project enable C++/CX compilation, then it might - be possible for the .cpp file including SDL_main.h to be compiled without /ZW, - for Visual C++'s build tools to create a winmd file, and for the app to - build without APPX0702 errors. In this case, if - SDL_WINRT_METADATA_FILE_AVAILABLE is defined as a C/C++ macro, then - the #error (to force C++/CX compilation) will be disabled. - - Please note that /ZW can be specified on a file-by-file basis. To do this, - right click on the file in Visual C++, click Properties, then change the - setting through the dialog that comes up. - */ - #ifndef SDL_WINRT_METADATA_FILE_AVAILABLE - #if !defined(__cplusplus) || (!defined(__cplusplus_winrt) && _MSVC_LANG < 202002L) - #error The C++ file that includes SDL_main.h must be compiled as C++ code with /ZW, otherwise build errors due to missing .winmd files can occur. - #endif - #endif - - /* Prevent MSVC++ from warning about threading models when defining our - custom WinMain. The threading model will instead be set via a direct - call to Windows::Foundation::Initialize (rather than via an attributed - function). - - To note, this warning (C4447) does not seem to come up unless this file - is compiled with C++/CX enabled (via the /ZW compiler flag). - */ - #ifdef _MSC_VER - #pragma warning(disable : 4447) - /* Make sure the function to initialize the Windows Runtime gets linked in. */ - #pragma comment(lib, "runtimeobject.lib") - #endif - - #ifdef __cplusplus - extern "C" { - #endif - int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int) - { - return SDL_RunApp(0, NULL, SDL_main, NULL); - } - #if _MSVC_LANG >= 202002L - int main(int argc, char** argv) { - return SDL_RunApp(argc, argv, SDL_main, NULL); - } - #endif - #ifdef __cplusplus - } /* extern "C" */ - #endif - - /* end of WinRT impl */ - - #elif defined(SDL_PLATFORM_NGAGE) - /* same typedef as in ngage SDKs e32def.h */ - typedef signed int TInt; - /* TODO: if it turns out that this only works when built as C++, - move SDL_PLATFORM_NGAGE into the C++ section in SDL_main.h */ - TInt E32Main() - { - return SDL_RunApp(0, NULL, SDL_main, NULL); - } - - /* end of SDL_PLATFORM_NGAGE impl */ + /* end of SDL_PLATFORM_WINDOWS impls */ #else /* platforms that use a standard main() and just call SDL_RunApp(), like iOS and 3DS */ int main(int argc, char *argv[]) diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_messagebox.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_messagebox.h index c626b22..365ae36 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_messagebox.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_messagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,18 @@ /** * # CategoryMessagebox * - * Message box support routines. + * SDL offers a simple message box API, which is useful for simple alerts, + * such as informing the user when something fatal happens at startup without + * the need to build a UI for it (or informing the user _before_ your UI is + * ready). + * + * These message boxes are native system dialogs where possible. + * + * There is both a customizable function (SDL_ShowMessageBox()) that offers + * lots of options for what to display and reports on what choice the user + * made, and also a much-simplified version (SDL_ShowSimpleMessageBox()), + * merely takes a text message and title, and waits until the user presses a + * single "OK" UI button. Often, this is all that is necessary. */ #ifndef SDL_messagebox_h_ @@ -39,11 +50,11 @@ extern "C" { #endif /** - * SDL_MessageBox flags. + * Message box flags. * * If supported will display warning icon, etc. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_MessageBoxFlags; @@ -56,7 +67,7 @@ typedef Uint32 SDL_MessageBoxFlags; /** * SDL_MessageBoxButtonData flags. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_MessageBoxButtonFlags; @@ -66,7 +77,7 @@ typedef Uint32 SDL_MessageBoxButtonFlags; /** * Individual button data. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxButtonData { @@ -78,7 +89,7 @@ typedef struct SDL_MessageBoxButtonData /** * RGB value used in a message box color scheme * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxColor { @@ -96,23 +107,23 @@ typedef enum SDL_MessageBoxColorType SDL_MESSAGEBOX_COLOR_BUTTON_BORDER, SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND, SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED, - SDL_MESSAGEBOX_COLOR_MAX /**< Size of the colors array of SDL_MessageBoxColorScheme. */ + SDL_MESSAGEBOX_COLOR_COUNT /**< Size of the colors array of SDL_MessageBoxColorScheme. */ } SDL_MessageBoxColorType; /** * A set of colors to use for message box dialogs * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxColorScheme { - SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_MAX]; + SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_COUNT]; } SDL_MessageBoxColorScheme; /** * MessageBox structure containing title, text, window, etc. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxData { @@ -154,14 +165,14 @@ typedef struct SDL_MessageBoxData * other options. * \param buttonid the pointer to which user id of hit button should be * copied. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowSimpleMessageBox */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); /** * Display a simple modal message box. @@ -193,17 +204,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData * to stderr if you can. * * \param flags an SDL_MessageBoxFlags value. - * \param title uTF-8 title text. - * \param message uTF-8 message text. + * \param title UTF-8 title text. + * \param message UTF-8 message text. * \param window the parent window, or NULL for no parent. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowMessageBox */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowSimpleMessageBox(SDL_MessageBoxFlags flags, const char *title, const char *message, SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowSimpleMessageBox(SDL_MessageBoxFlags flags, const char *title, const char *message, SDL_Window *window); /* Ends C function definitions when using C++ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_metal.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_metal.h index 7c9aece..14b1bc8 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_metal.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_metal.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,10 @@ * # CategoryMetal * * Functions to creating Metal layers and views on SDL windows. + * + * This provides some platform-specific glue for Apple platforms. Most macOS + * and iOS apps can use SDL without these functions, but this API they can be + * useful for specific OS-level integration tasks. */ #ifndef SDL_metal_h_ @@ -39,7 +43,7 @@ extern "C" { /** * A handle to a CAMetalLayer-backed NSView (macOS) or UIView (iOS/tvOS). * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef void *SDL_MetalView; @@ -61,7 +65,7 @@ typedef void *SDL_MetalView; * \param window the window. * \returns handle NSView or UIView. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Metal_DestroyView * \sa SDL_Metal_GetLayer @@ -76,7 +80,7 @@ extern SDL_DECLSPEC SDL_MetalView SDLCALL SDL_Metal_CreateView(SDL_Window *windo * * \param view the SDL_MetalView object. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Metal_CreateView */ @@ -88,7 +92,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_Metal_DestroyView(SDL_MetalView view); * \param view the SDL_MetalView object. * \returns a pointer. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void * SDLCALL SDL_Metal_GetLayer(SDL_MetalView view); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_misc.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_misc.h index 23317e0..3dd6fcd 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_misc.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_misc.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -62,12 +62,12 @@ extern "C" { * * \param url a valid URL/URI to open. Use `file:///full/path/to/file` for * local files, if supported. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_OpenURL(const char *url); +extern SDL_DECLSPEC bool SDLCALL SDL_OpenURL(const char *url); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mouse.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mouse.h index 90c8560..18856e2 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mouse.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,36 @@ /** * # CategoryMouse * - * SDL mouse handling. + * Any GUI application has to deal with the mouse, and SDL provides functions + * to manage mouse input and the displayed cursor. + * + * Most interactions with the mouse will come through the event subsystem. + * Moving a mouse generates an SDL_EVENT_MOUSE_MOTION event, pushing a button + * generates SDL_EVENT_MOUSE_BUTTON_DOWN, etc, but one can also query the + * current state of the mouse at any time with SDL_GetMouseState(). + * + * For certain games, it's useful to disassociate the mouse cursor from mouse + * input. An FPS, for example, would not want the player's motion to stop as + * the mouse hits the edge of the window. For these scenarios, use + * SDL_SetWindowRelativeMouseMode(), which hides the cursor, grabs mouse input + * to the window, and reads mouse input no matter how far it moves. + * + * Games that want the system to track the mouse but want to draw their own + * cursor can use SDL_HideCursor() and SDL_ShowCursor(). It might be more + * efficient to let the system manage the cursor, if possible, using + * SDL_SetCursor() with a custom image made through SDL_CreateColorCursor(), + * or perhaps just a specific system cursor from SDL_CreateSystemCursor(). + * + * SDL can, on many platforms, differentiate between multiple connected mice, + * allowing for interesting input scenarios and multiplayer games. They can be + * enumerated with SDL_GetMice(), and SDL will send SDL_EVENT_MOUSE_ADDED and + * SDL_EVENT_MOUSE_REMOVED events as they are connected and unplugged. + * + * Since many apps only care about basic mouse input, SDL offers a virtual + * mouse device for touch and pen input, which often can make a desktop + * application work on a touchscreen phone without any code changes. Apps that + * care about touch/pen separately from mouse input should filter out events + * with a `which` field of SDL_TOUCH_MOUSEID/SDL_PEN_MOUSEID. */ #ifndef SDL_mouse_h_ @@ -30,6 +59,7 @@ #include #include +#include #include #include @@ -46,7 +76,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_MouseID; @@ -55,14 +85,14 @@ typedef Uint32 SDL_MouseID; * * This is opaque data. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Cursor SDL_Cursor; /** * Cursor types for SDL_CreateSystemCursor(). * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_SystemCursor { @@ -86,13 +116,13 @@ typedef enum SDL_SystemCursor SDL_SYSTEM_CURSOR_S_RESIZE, /**< Window resize bottom. May be NS_RESIZE. */ SDL_SYSTEM_CURSOR_SW_RESIZE, /**< Window resize bottom-left. May be NESW_RESIZE. */ SDL_SYSTEM_CURSOR_W_RESIZE, /**< Window resize left. May be EW_RESIZE. */ - SDL_NUM_SYSTEM_CURSORS + SDL_SYSTEM_CURSOR_COUNT } SDL_SystemCursor; /** * Scroll direction types for the Scroll event * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_MouseWheelDirection { @@ -109,7 +139,7 @@ typedef enum SDL_MouseWheelDirection * - Button 4: Side mouse button 1 * - Button 5: Side mouse button 2 * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetMouseState * \sa SDL_GetGlobalMouseState @@ -123,12 +153,12 @@ typedef Uint32 SDL_MouseButtonFlags; #define SDL_BUTTON_X1 4 #define SDL_BUTTON_X2 5 -#define SDL_BUTTON(X) (1u << ((X)-1)) -#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) +#define SDL_BUTTON_MASK(X) (1u << ((X)-1)) +#define SDL_BUTTON_LMASK SDL_BUTTON_MASK(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON_MASK(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON_MASK(SDL_BUTTON_RIGHT) +#define SDL_BUTTON_X1MASK SDL_BUTTON_MASK(SDL_BUTTON_X1) +#define SDL_BUTTON_X2MASK SDL_BUTTON_MASK(SDL_BUTTON_X2) /* Function prototypes */ @@ -136,13 +166,15 @@ typedef Uint32 SDL_MouseButtonFlags; /** * Return whether a mouse is currently connected. * - * \returns SDL_TRUE if a mouse is connected, SDL_FALSE otherwise. + * \returns true if a mouse is connected, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMice */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasMouse(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HasMouse(void); /** * Get a list of currently connected mice. @@ -158,7 +190,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasMouse(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMouseNameForID * \sa SDL_HasMouse @@ -174,7 +208,9 @@ extern SDL_DECLSPEC SDL_MouseID * SDLCALL SDL_GetMice(int *count); * \returns the name of the selected mouse, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMice */ @@ -185,26 +221,39 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetMouseNameForID(SDL_MouseID insta * * \returns the window with mouse focus. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); /** - * Retrieve the current state of the mouse. + * Query SDL's cache for the synchronous mouse button state and the + * window-relative SDL-cursor position. * - * The current button state is returned as a button bitmask, which can be - * tested using the SDL_BUTTON(X) macro (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`. + * This function returns the cached synchronous state as SDL understands it + * from the last pump of the event queue. * - * \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. + * To query the platform for immediate asynchronous state, use + * SDL_GetGlobalMouseState. * - * \since This function is available since SDL 3.0.0. + * Passing non-NULL pointers to `x` or `y` will write the destination with + * respective x or y coordinates relative to the focused window. + * + * In Relative Mode, the SDL-cursor's position usually contradicts the + * platform-cursor's position as manually calculated from + * SDL_GetGlobalMouseState() and SDL_GetWindowPosition. + * + * \param x a pointer to receive the SDL-cursor's x-position from the focused + * window's top left corner, can be NULL if unused. + * \param y a pointer to receive the SDL-cursor's y-position from the focused + * window's top left corner, can be NULL if unused. + * \returns a 32-bit bitmask of the button state that can be bitwise-compared + * against the SDL_BUTTON_MASK(X) macro. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGlobalMouseState * \sa SDL_GetRelativeMouseState @@ -212,51 +261,74 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetMouseState(float *x, float *y); /** - * Get the current state of the mouse in relation to the desktop. + * Query the platform for the asynchronous mouse button state and the + * desktop-relative platform-cursor position. * - * 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. + * This function immediately queries the platform for the most recent + * asynchronous state, more costly than retrieving SDL's cached state in + * SDL_GetMouseState(). * - * 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. + * Passing non-NULL pointers to `x` or `y` will write the destination with + * respective x or y coordinates relative to the desktop. * - * \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. + * In Relative Mode, the platform-cursor's position usually contradicts the + * SDL-cursor's position as manually calculated from SDL_GetMouseState() and + * SDL_GetWindowPosition. * - * \since This function is available since SDL 3.0.0. + * This function 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. + * + * \param x a pointer to receive the platform-cursor's x-position from the + * desktop's top left corner, can be NULL if unused. + * \param y a pointer to receive the platform-cursor's y-position from the + * desktop's top left corner, can be NULL if unused. + * \returns a 32-bit bitmask of the button state that can be bitwise-compared + * against the SDL_BUTTON_MASK(X) macro. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CaptureMouse * \sa SDL_GetMouseState + * \sa SDL_GetGlobalMouseState */ extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetGlobalMouseState(float *x, float *y); /** - * Retrieve the relative state of the mouse. + * Query SDL's cache for the synchronous mouse button state and accumulated + * mouse delta since last call. * - * 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`. + * This function returns the cached synchronous state as SDL understands it + * from the last pump of the event queue. * - * \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. + * To query the platform for immediate asynchronous state, use + * SDL_GetGlobalMouseState. * - * \since This function is available since SDL 3.0.0. + * Passing non-NULL pointers to `x` or `y` will write the destination with + * respective x or y deltas accumulated since the last call to this function + * (or since event initialization). + * + * This function is useful for reducing overhead by processing relative mouse + * inputs in one go per-frame instead of individually per-event, at the + * expense of losing the order between events within the frame (e.g. quickly + * pressing and releasing a button within the same frame). + * + * \param x a pointer to receive the x mouse delta accumulated since last + * call, can be NULL if unused. + * \param y a pointer to receive the y mouse delta accumulated since last + * call, can be NULL if unused. + * \returns a 32-bit bitmask of the button state that can be bitwise-compared + * against the SDL_BUTTON_MASK(X) macro. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMouseState + * \sa SDL_GetGlobalMouseState */ extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetRelativeMouseState(float *x, float *y); @@ -275,7 +347,9 @@ extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetRelativeMouseState(float * \param x the x coordinate within the window. * \param y the y coordinate within the window. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_WarpMouseGlobal */ @@ -295,14 +369,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, * * \param x the x coordinate. * \param y the y coordinate. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_WarpMouseInWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WarpMouseGlobal(float x, float y); +extern SDL_DECLSPEC bool SDLCALL SDL_WarpMouseGlobal(float x, float y); /** * Set relative mouse mode for a window. @@ -312,31 +388,39 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WarpMouseGlobal(float x, float y); * report continuous relative mouse motion even if the mouse is at the edge of * the window. * + * If you'd like to keep the mouse position fixed while in relative mode you + * can use SDL_SetWindowMouseRect(). If you'd like the cursor to be at a + * specific location when relative mode ends, you should use + * SDL_WarpMouseInWindow() before disabling relative mode. + * * This function will flush any pending mouse motion for this window. * * \param window the window to change. - * \param enabled SDL_TRUE to enable relative mode, SDL_FALSE to disable. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param enabled true to enable relative mode, false to disable. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowRelativeMouseMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowRelativeMouseMode(SDL_Window *window, SDL_bool enabled); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowRelativeMouseMode(SDL_Window *window, bool enabled); /** * Query whether relative mouse mode is enabled for a window. * * \param window the window to query. - * \returns SDL_TRUE if relative mode is enabled for a window or SDL_FALSE - * otherwise. + * \returns true if relative mode is enabled for a window or false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowRelativeMouseMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowRelativeMouseMode(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowRelativeMouseMode(SDL_Window *window); /** * Capture the mouse and to track input outside an SDL window. @@ -374,15 +458,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowRelativeMouseMode(SDL_Window * * 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param enabled true to enable capturing, false to disable. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGlobalMouseState */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CaptureMouse(SDL_bool enabled); +extern SDL_DECLSPEC bool SDLCALL SDL_CaptureMouse(bool enabled); /** * Create a cursor using the specified bitmap data and mask (in MSB format). @@ -419,7 +505,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CaptureMouse(SDL_bool enabled); * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateColorCursor * \sa SDL_CreateSystemCursor @@ -450,7 +538,9 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor(const Uint8 * data, * \returns the new cursor on success or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateCursor * \sa SDL_CreateSystemCursor @@ -468,7 +558,9 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateColorCursor(SDL_Surface *surf * \returns a cursor on success or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyCursor */ @@ -483,14 +575,16 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateSystemCursor(SDL_SystemCursor * this is desired for any reason. * * \param cursor a cursor to make active. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCursor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetCursor(SDL_Cursor *cursor); +extern SDL_DECLSPEC bool SDLCALL SDL_SetCursor(SDL_Cursor *cursor); /** * Get the active cursor. @@ -500,7 +594,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetCursor(SDL_Cursor *cursor); * * \returns the active cursor or NULL if there is no mouse. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetCursor */ @@ -515,7 +611,9 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void); * \returns the default cursor on success or NULL on failuree; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetDefaultCursor(void); @@ -527,7 +625,9 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetDefaultCursor(void); * * \param cursor the cursor to free. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateColorCursor * \sa SDL_CreateCursor @@ -538,41 +638,47 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyCursor(SDL_Cursor *cursor); /** * Show the cursor. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CursorVisible * \sa SDL_HideCursor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowCursor(void); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowCursor(void); /** * Hide the cursor. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CursorVisible * \sa SDL_ShowCursor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HideCursor(void); +extern SDL_DECLSPEC bool SDLCALL SDL_HideCursor(void); /** * Return whether the cursor is currently being shown. * - * \returns `SDL_TRUE` if the cursor is being shown, or `SDL_FALSE` if the - * cursor is hidden. + * \returns `true` if the cursor is being shown, or `false` if the cursor is + * hidden. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HideCursor * \sa SDL_ShowCursor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CursorVisible(void); +extern SDL_DECLSPEC bool SDLCALL SDL_CursorVisible(void); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mutex.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mutex.h index 3a7ce56..c88ec15 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mutex.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mutex.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -25,84 +25,245 @@ /** * # CategoryMutex * - * Functions to provide thread synchronization primitives. + * SDL offers several thread synchronization primitives. This document can't + * cover the complicated topic of thread safety, but reading up on what each + * of these primitives are, why they are useful, and how to correctly use them + * is vital to writing correct and safe multithreaded programs. + * + * - Mutexes: SDL_CreateMutex() + * - Read/Write locks: SDL_CreateRWLock() + * - Semaphores: SDL_CreateSemaphore() + * - Condition variables: SDL_CreateCondition() + * + * SDL also offers a datatype, SDL_InitState, which can be used to make sure + * only one thread initializes/deinitializes some resource that several + * threads might try to use for the first time simultaneously. */ #include +#include #include +#include -/******************************************************************************/ -/* Enable thread safety attributes only with clang. +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Enable thread safety attributes, only with clang. + * * The attributes can be safely erased when compiling with other compilers. * * To enable analysis, set these environment variables before running cmake: - * export CC=clang - * export CFLAGS="-DSDL_THREAD_SAFETY_ANALYSIS -Wthread-safety" + * + * ```bash + * export CC=clang + * export CFLAGS="-DSDL_THREAD_SAFETY_ANALYSIS -Wthread-safety" + * ``` */ -#if defined(SDL_THREAD_SAFETY_ANALYSIS) && \ - defined(__clang__) && (!defined(SWIG)) +#define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) + +#elif defined(SDL_THREAD_SAFETY_ANALYSIS) && defined(__clang__) && (!defined(SWIG)) #define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) #else #define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) /* no-op */ #endif +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_SCOPED_CAPABILITY \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_GUARDED_BY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PT_GUARDED_BY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ACQUIRED_BEFORE(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ACQUIRED_AFTER(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_REQUIRES(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_REQUIRES_SHARED(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ACQUIRE(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ACQUIRE_SHARED(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_RELEASE(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_RELEASE_SHARED(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_RELEASE_GENERIC(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_generic_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_TRY_ACQUIRE(x, y) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(x, y)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_TRY_ACQUIRE_SHARED(x, y) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(x, y)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_EXCLUDES(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ASSERT_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ASSERT_SHARED_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_RETURN_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) +/** + * Wrapper around Clang thread safety analysis annotations. + * + * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NO_THREAD_SAFETY_ANALYSIS \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) @@ -130,7 +291,7 @@ extern "C" { * * https://en.wikipedia.org/wiki/Mutex * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Mutex SDL_Mutex; @@ -147,7 +308,7 @@ typedef struct SDL_Mutex SDL_Mutex; * \returns the initialized and unlocked mutex or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyMutex * \sa SDL_LockMutex @@ -173,7 +334,7 @@ extern SDL_DECLSPEC SDL_Mutex * SDLCALL SDL_CreateMutex(void); * * \param mutex the mutex to lock. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_TryLockMutex * \sa SDL_UnlockMutex @@ -184,22 +345,22 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockMutex(SDL_Mutex *mutex) SDL_ACQUIRE(mut * Try to lock a mutex without blocking. * * This works just like SDL_LockMutex(), but if the mutex is not available, - * this function returns SDL_FALSE immediately. + * this function returns false 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. * - * This function returns SDL_TRUE if passed a NULL mutex. + * This function returns true if passed a NULL mutex. * * \param mutex the mutex to try to lock. - * \returns SDL_TRUE on success, SDL_FALSE if the mutex would block. + * \returns true on success, false if the mutex would block. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockMutex * \sa SDL_UnlockMutex */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ACQUIRE(0, mutex); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ACQUIRE(0, mutex); /** * Unlock the mutex. @@ -213,7 +374,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ * * \param mutex the mutex to unlock. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockMutex * \sa SDL_TryLockMutex @@ -231,7 +392,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockMutex(SDL_Mutex *mutex) SDL_RELEASE(m * * \param mutex the mutex to destroy. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateMutex */ @@ -261,7 +422,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_Mutex *mutex); * about how threads are scheduled and when they can be recursively locked. * These are documented in the other rwlock functions. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_RWLock SDL_RWLock; @@ -296,7 +457,7 @@ typedef struct SDL_RWLock SDL_RWLock; * \returns the initialized and unlocked read/write lock or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyRWLock * \sa SDL_LockRWLockForReading @@ -336,7 +497,7 @@ extern SDL_DECLSPEC SDL_RWLock * SDLCALL SDL_CreateRWLock(void); * * \param rwlock the read/write lock to lock. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForWriting * \sa SDL_TryLockRWLockForReading @@ -367,7 +528,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForReading(SDL_RWLock *rwlock) SD * * \param rwlock the read/write lock to lock. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading * \sa SDL_TryLockRWLockForWriting @@ -379,7 +540,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForWriting(SDL_RWLock *rwlock) SD * Try to lock a read/write lock _for reading_ without blocking. * * This works just like SDL_LockRWLockForReading(), but if the rwlock is not - * available, then this function returns SDL_FALSE immediately. + * available, then this function returns false immediately. * * This technique is useful if you need access to a resource but don't want to * wait for it, and will return to it to try again later. @@ -387,24 +548,24 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForWriting(SDL_RWLock *rwlock) SD * Trying to lock for read-only access can succeed if other threads are * holding read-only locks, as this won't prevent access. * - * This function returns SDL_TRUE if passed a NULL rwlock. + * This function returns true if passed a NULL rwlock. * * \param rwlock the rwlock to try to lock. - * \returns SDL_TRUE on success, SDL_FALSE if the lock would block. + * \returns true on success, false if the lock would block. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading * \sa SDL_TryLockRWLockForWriting * \sa SDL_UnlockRWLock */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE_SHARED(0, rwlock); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE_SHARED(0, rwlock); /** * Try to lock a read/write lock _for writing_ without blocking. * * This works just like SDL_LockRWLockForWriting(), but if the rwlock is not - * available, then this function returns SDL_FALSE immediately. + * available, then this function returns false 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. @@ -417,18 +578,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwl * read-only lock. Doing so results in undefined behavior. Unlock the * read-only lock before requesting a write lock. * - * This function returns SDL_TRUE if passed a NULL rwlock. + * This function returns true if passed a NULL rwlock. * * \param rwlock the rwlock to try to lock. - * \returns SDL_TRUE on success, SDL_FALSE if the lock would block. + * \returns true on success, false if the lock would block. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForWriting * \sa SDL_TryLockRWLockForReading * \sa SDL_UnlockRWLock */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE(0, rwlock); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE(0, rwlock); /** * Unlock the read/write lock. @@ -446,7 +607,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwl * * \param rwlock the rwlock to unlock. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading * \sa SDL_LockRWLockForWriting @@ -466,7 +627,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockRWLock(SDL_RWLock *rwlock) SDL_RELEAS * * \param rwlock the rwlock to destroy. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRWLock */ @@ -492,7 +653,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyRWLock(SDL_RWLock *rwlock); * * https://en.wikipedia.org/wiki/Semaphore_(programming) * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Semaphore SDL_Semaphore; @@ -509,7 +670,7 @@ typedef struct SDL_Semaphore SDL_Semaphore; * \returns a new semaphore or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySemaphore * \sa SDL_SignalSemaphore @@ -528,7 +689,7 @@ extern SDL_DECLSPEC SDL_Semaphore * SDLCALL SDL_CreateSemaphore(Uint32 initial_v * * \param sem the semaphore to destroy. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSemaphore */ @@ -546,7 +707,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_Semaphore *sem); * * \param sem the semaphore wait on. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore * \sa SDL_TryWaitSemaphore @@ -560,18 +721,18 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitSemaphore(SDL_Semaphore *sem); * 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_FALSE. + * returns false. * * \param sem the semaphore to wait on. - * \returns SDL_TRUE if the wait succeeds, SDL_FALSE if the wait would block. + * \returns true if the wait succeeds, false if the wait would block. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore * \sa SDL_WaitSemaphore * \sa SDL_WaitSemaphoreTimeout */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryWaitSemaphore(SDL_Semaphore *sem); +extern SDL_DECLSPEC bool SDLCALL SDL_TryWaitSemaphore(SDL_Semaphore *sem); /** * Wait until a semaphore has a positive value and then decrements it. @@ -583,22 +744,22 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryWaitSemaphore(SDL_Semaphore *sem); * \param sem the semaphore to wait on. * \param timeoutMS the length of the timeout, in milliseconds, or -1 to wait * indefinitely. - * \returns SDL_TRUE if the wait succeeds or SDL_FALSE if the wait times out. + * \returns true if the wait succeeds or false if the wait times out. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore * \sa SDL_TryWaitSemaphore * \sa SDL_WaitSemaphore */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitSemaphoreTimeout(SDL_Semaphore *sem, Sint32 timeoutMS); +extern SDL_DECLSPEC bool SDLCALL SDL_WaitSemaphoreTimeout(SDL_Semaphore *sem, Sint32 timeoutMS); /** * Atomically increment a semaphore's value and wake waiting threads. * * \param sem the semaphore to increment. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_TryWaitSemaphore * \sa SDL_WaitSemaphore @@ -612,7 +773,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SignalSemaphore(SDL_Semaphore *sem); * \param sem the semaphore to query. * \returns the current value of the semaphore. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetSemaphoreValue(SDL_Semaphore *sem); @@ -635,7 +796,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetSemaphoreValue(SDL_Semaphore *sem); * * https://en.wikipedia.org/wiki/Condition_variable * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Condition SDL_Condition; @@ -645,7 +806,7 @@ typedef struct SDL_Condition SDL_Condition; * \returns a new condition variable or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_SignalCondition @@ -660,7 +821,7 @@ extern SDL_DECLSPEC SDL_Condition * SDLCALL SDL_CreateCondition(void); * * \param cond the condition variable to destroy. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateCondition */ @@ -673,7 +834,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyCondition(SDL_Condition *cond); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_WaitCondition @@ -688,7 +849,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SignalCondition(SDL_Condition *cond); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalCondition * \sa SDL_WaitCondition @@ -716,7 +877,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BroadcastCondition(SDL_Condition *cond); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_SignalCondition @@ -741,22 +902,167 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitCondition(SDL_Condition *cond, SDL_Mute * \param mutex the mutex used to coordinate thread access. * \param timeoutMS the maximum time to wait, in milliseconds, or -1 to wait * indefinitely. - * \returns SDL_TRUE if the condition variable is signaled, SDL_FALSE if the - * condition is not signaled in the allotted time. + * \returns true if the condition variable is signaled, false if the condition + * is not signaled in the allotted time. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_SignalCondition * \sa SDL_WaitCondition */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitConditionTimeout(SDL_Condition *cond, +extern SDL_DECLSPEC bool SDLCALL SDL_WaitConditionTimeout(SDL_Condition *cond, SDL_Mutex *mutex, Sint32 timeoutMS); /* @} *//* Condition variable functions */ +/** + * \name Thread-safe initialization state functions + */ +/* @{ */ + +/** + * The current status of an SDL_InitState structure. + * + * \since This enum is available since SDL 3.2.0. + */ +typedef enum SDL_InitStatus +{ + SDL_INIT_STATUS_UNINITIALIZED, + SDL_INIT_STATUS_INITIALIZING, + SDL_INIT_STATUS_INITIALIZED, + SDL_INIT_STATUS_UNINITIALIZING +} SDL_InitStatus; + +/** + * A structure used for thread-safe initialization and shutdown. + * + * Here is an example of using this: + * + * ```c + * static SDL_AtomicInitState init; + * + * bool InitSystem(void) + * { + * if (!SDL_ShouldInit(&init)) { + * // The system is initialized + * return true; + * } + * + * // At this point, you should not leave this function without calling SDL_SetInitialized() + * + * bool initialized = DoInitTasks(); + * SDL_SetInitialized(&init, initialized); + * return initialized; + * } + * + * bool UseSubsystem(void) + * { + * if (SDL_ShouldInit(&init)) { + * // Error, the subsystem isn't initialized + * SDL_SetInitialized(&init, false); + * return false; + * } + * + * // Do work using the initialized subsystem + * + * return true; + * } + * + * void QuitSystem(void) + * { + * if (!SDL_ShouldQuit(&init)) { + * // The system is not initialized + * return; + * } + * + * // At this point, you should not leave this function without calling SDL_SetInitialized() + * + * DoQuitTasks(); + * SDL_SetInitialized(&init, false); + * } + * ``` + * + * Note that this doesn't protect any resources created during initialization, + * or guarantee that nobody is using those resources during cleanup. You + * should use other mechanisms to protect those, if that's a concern for your + * code. + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_InitState +{ + SDL_AtomicInt status; + SDL_ThreadID thread; + void *reserved; +} SDL_InitState; + +/** + * Return whether initialization should be done. + * + * This function checks the passed in state and if initialization should be + * done, sets the status to `SDL_INIT_STATUS_INITIALIZING` and returns true. + * If another thread is already modifying this state, it will wait until + * that's done before returning. + * + * If this function returns true, the calling code must call + * SDL_SetInitialized() to complete the initialization. + * + * \param state the initialization state to check. + * \returns true if initialization needs to be done, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetInitialized + * \sa SDL_ShouldQuit + */ +extern SDL_DECLSPEC bool SDLCALL SDL_ShouldInit(SDL_InitState *state); + +/** + * Return whether cleanup should be done. + * + * This function checks the passed in state and if cleanup should be done, + * sets the status to `SDL_INIT_STATUS_UNINITIALIZING` and returns true. + * + * If this function returns true, the calling code must call + * SDL_SetInitialized() to complete the cleanup. + * + * \param state the initialization state to check. + * \returns true if cleanup needs to be done, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetInitialized + * \sa SDL_ShouldInit + */ +extern SDL_DECLSPEC bool SDLCALL SDL_ShouldQuit(SDL_InitState *state); + +/** + * Finish an initialization state transition. + * + * This function sets the status of the passed in state to + * `SDL_INIT_STATUS_INITIALIZED` or `SDL_INIT_STATUS_UNINITIALIZED` and allows + * any threads waiting for the status to proceed. + * + * \param state the initialization state to check. + * \param initialized the new initialization state. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ShouldInit + * \sa SDL_ShouldQuit + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetInitialized(SDL_InitState *state, bool initialized); + +/* @} *//* Thread-safe initialization state functions */ /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_oldnames.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_oldnames.h index 02c881c..c93607e 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_oldnames.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_oldnames.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -38,11 +38,14 @@ #ifdef SDL_ENABLE_OLD_NAMES /* ##SDL_atomic.h */ -#define SDL_AtomicCAS SDL_AtomicCompareAndSwap -#define SDL_AtomicCASPtr SDL_AtomicCompareAndSwapPointer -#define SDL_AtomicGetPtr SDL_AtomicGetPointer +#define SDL_AtomicAdd SDL_AddAtomicInt +#define SDL_AtomicCAS SDL_CompareAndSwapAtomicInt +#define SDL_AtomicCASPtr SDL_CompareAndSwapAtomicPointer +#define SDL_AtomicGet SDL_GetAtomicInt +#define SDL_AtomicGetPtr SDL_GetAtomicPointer #define SDL_AtomicLock SDL_LockSpinlock -#define SDL_AtomicSetPtr SDL_AtomicSetPointer +#define SDL_AtomicSet SDL_SetAtomicInt +#define SDL_AtomicSetPtr SDL_SetAtomicPointer #define SDL_AtomicTryLock SDL_TryLockSpinlock #define SDL_AtomicUnlock SDL_UnlockSpinlock #define SDL_atomic_t SDL_AtomicInt @@ -74,6 +77,7 @@ #define SDL_NewAudioStream SDL_CreateAudioStream /* ##SDL_cpuinfo.h */ +#define SDL_GetCPUCount SDL_GetNumLogicalCPUCores #define SDL_SIMDGetAlignment SDL_GetSIMDAlignment /* ##SDL_endian.h */ @@ -166,14 +170,13 @@ #define SDL_WINDOWEVENT_RESTORED SDL_EVENT_WINDOW_RESTORED #define SDL_WINDOWEVENT_SHOWN SDL_EVENT_WINDOW_SHOWN #define SDL_WINDOWEVENT_SIZE_CHANGED SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED -#define SDL_WINDOWEVENT_TAKE_FOCUS SDL_EVENT_WINDOW_TAKE_FOCUS #define SDL_eventaction SDL_EventAction /* ##SDL_gamecontroller.h */ #define SDL_CONTROLLER_AXIS_INVALID SDL_GAMEPAD_AXIS_INVALID #define SDL_CONTROLLER_AXIS_LEFTX SDL_GAMEPAD_AXIS_LEFTX #define SDL_CONTROLLER_AXIS_LEFTY SDL_GAMEPAD_AXIS_LEFTY -#define SDL_CONTROLLER_AXIS_MAX SDL_GAMEPAD_AXIS_MAX +#define SDL_CONTROLLER_AXIS_MAX SDL_GAMEPAD_AXIS_COUNT #define SDL_CONTROLLER_AXIS_RIGHTX SDL_GAMEPAD_AXIS_RIGHTX #define SDL_CONTROLLER_AXIS_RIGHTY SDL_GAMEPAD_AXIS_RIGHTY #define SDL_CONTROLLER_AXIS_TRIGGERLEFT SDL_GAMEPAD_AXIS_LEFT_TRIGGER @@ -193,7 +196,7 @@ #define SDL_CONTROLLER_BUTTON_INVALID SDL_GAMEPAD_BUTTON_INVALID #define SDL_CONTROLLER_BUTTON_LEFTSHOULDER SDL_GAMEPAD_BUTTON_LEFT_SHOULDER #define SDL_CONTROLLER_BUTTON_LEFTSTICK SDL_GAMEPAD_BUTTON_LEFT_STICK -#define SDL_CONTROLLER_BUTTON_MAX SDL_GAMEPAD_BUTTON_MAX +#define SDL_CONTROLLER_BUTTON_MAX SDL_GAMEPAD_BUTTON_COUNT #define SDL_CONTROLLER_BUTTON_MISC1 SDL_GAMEPAD_BUTTON_MISC1 #define SDL_CONTROLLER_BUTTON_PADDLE1 SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1 #define SDL_CONTROLLER_BUTTON_PADDLE2 SDL_GAMEPAD_BUTTON_LEFT_PADDLE1 @@ -304,6 +307,8 @@ #define SDL_HINT_DIRECTINPUT_ENABLED SDL_HINT_JOYSTICK_DIRECTINPUT #define SDL_HINT_GDK_TEXTINPUT_DEFAULT SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT #define SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE +#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE SDL_HINT_JOYSTICK_ENHANCED_REPORTS +#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE SDL_HINT_JOYSTICK_ENHANCED_REPORTS #define SDL_HINT_LINUX_DIGITAL_HATS SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS #define SDL_HINT_LINUX_HAT_DEADZONES SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES #define SDL_HINT_LINUX_JOYSTICK_CLASSIC SDL_HINT_JOYSTICK_LINUX_CLASSIC @@ -419,9 +424,15 @@ #define SDL_LogSetAllPriority SDL_SetLogPriorities #define SDL_LogSetOutputFunction SDL_SetLogOutputFunction #define SDL_LogSetPriority SDL_SetLogPriority +#define SDL_NUM_LOG_PRIORITIES SDL_LOG_PRIORITY_COUNT + +/* ##SDL_messagebox.h */ +#define SDL_MESSAGEBOX_COLOR_MAX SDL_MESSAGEBOX_COLOR_COUNT /* ##SDL_mouse.h */ +#define SDL_BUTTON SDL_BUTTON_MASK #define SDL_FreeCursor SDL_DestroyCursor +#define SDL_NUM_SYSTEM_CURSORS SDL_SYSTEM_CURSOR_COUNT #define SDL_SYSTEM_CURSOR_ARROW SDL_SYSTEM_CURSOR_DEFAULT #define SDL_SYSTEM_CURSOR_HAND SDL_SYSTEM_CURSOR_POINTER #define SDL_SYSTEM_CURSOR_IBEAM SDL_SYSTEM_CURSOR_TEXT @@ -558,6 +569,7 @@ #define SDL_WriteLE64 SDL_WriteU64LE /* ##SDL_scancode.h */ +#define SDL_NUM_SCANCODES SDL_SCANCODE_COUNT #define SDL_SCANCODE_AUDIOFASTFORWARD SDL_SCANCODE_MEDIA_FAST_FORWARD #define SDL_SCANCODE_AUDIOMUTE SDL_SCANCODE_MUTE #define SDL_SCANCODE_AUDIONEXT SDL_SCANCODE_MEDIA_NEXT_TRACK @@ -580,7 +592,12 @@ #define SDL_SensorUpdate SDL_UpdateSensors /* ##SDL_stdinc.h */ +#define SDL_FALSE false #define SDL_TABLESIZE SDL_arraysize +#define SDL_TRUE true +#define SDL_bool bool +#define SDL_size_add_overflow SDL_size_add_check_overflow +#define SDL_size_mul_overflow SDL_size_mul_check_overflow #define SDL_strtokr SDL_strtok_r /* ##SDL_surface.h */ @@ -623,14 +640,13 @@ #define SDL_LinuxSetThreadPriorityAndPolicy SDL_SetLinuxThreadPriorityAndPolicy #define SDL_OnApplicationDidBecomeActive SDL_OnApplicationDidEnterForeground #define SDL_OnApplicationWillResignActive SDL_OnApplicationWillEnterBackground -#define SDL_WinRTGetDeviceFamily SDL_GetWinRTDeviceFamily -#define SDL_GetWinRTFSPathUTF8 SDL_GetWinRTFSPath #define SDL_iOSSetAnimationCallback SDL_SetiOSAnimationCallback #define SDL_iOSSetEventPump SDL_SetiOSEventPump #define SDL_iPhoneSetAnimationCallback SDL_SetiOSAnimationCallback #define SDL_iPhoneSetEventPump SDL_SetiOSEventPump /* ##SDL_thread.h */ +#define SDL_SetThreadPriority SDL_SetCurrentThreadPriority #define SDL_TLSCleanup SDL_CleanupTLS #define SDL_TLSGet SDL_GetTLS #define SDL_TLSSet SDL_SetTLS @@ -645,6 +661,10 @@ /* ##SDL_video.h */ #define SDL_GL_DeleteContext SDL_GL_DestroyContext +#define SDL_GLattr SDL_GLAttr +#define SDL_GLcontextFlag SDL_GLContextFlag +#define SDL_GLcontextReleaseFlag SDL_GLContextReleaseFlag +#define SDL_GLprofile SDL_GLProfile #define SDL_GetClosestDisplayMode SDL_GetClosestFullscreenDisplayMode #define SDL_GetDisplayOrientation SDL_GetCurrentDisplayOrientation #define SDL_GetPointDisplayIndex SDL_GetDisplayForPoint @@ -661,11 +681,14 @@ #elif !defined(SDL_DISABLE_OLD_NAMES) /* ##SDL_atomic.h */ -#define SDL_AtomicCAS SDL_AtomicCAS_renamed_SDL_AtomicCompareAndSwap -#define SDL_AtomicCASPtr SDL_AtomicCASPtr_renamed_SDL_AtomicCompareAndSwapPointer -#define SDL_AtomicGetPtr SDL_AtomicGetPtr_renamed_SDL_AtomicGetPointer +#define SDL_AtomicAdd SDL_AtomicAdd_renamed_SDL_AddAtomicInt +#define SDL_AtomicCAS SDL_AtomicCAS_renamed_SDL_CompareAndSwapAtomicInt +#define SDL_AtomicCASPtr SDL_AtomicCASPtr_renamed_SDL_CompareAndSwapAtomicPointer +#define SDL_AtomicGet SDL_AtomicGet_renamed_SDL_GetAtomicInt +#define SDL_AtomicGetPtr SDL_AtomicGetPtr_renamed_SDL_GetAtomicPointer #define SDL_AtomicLock SDL_AtomicLock_renamed_SDL_LockSpinlock -#define SDL_AtomicSetPtr SDL_AtomicSetPtr_renamed_SDL_AtomicSetPointer +#define SDL_AtomicSet SDL_AtomicSet_renamed_SDL_SetAtomicInt +#define SDL_AtomicSetPtr SDL_AtomicSetPtr_renamed_SDL_SetAtomicPointer #define SDL_AtomicTryLock SDL_AtomicTryLock_renamed_SDL_TryLockSpinlock #define SDL_AtomicUnlock SDL_AtomicUnlock_renamed_SDL_UnlockSpinlock #define SDL_atomic_t SDL_atomic_t_renamed_SDL_AtomicInt @@ -697,6 +720,7 @@ #define SDL_NewAudioStream SDL_NewAudioStream_renamed_SDL_CreateAudioStream /* ##SDL_cpuinfo.h */ +#define SDL_GetCPUCount SDL_GetCPUCount_renamed_SDL_GetNumLogicalCPUCores #define SDL_SIMDGetAlignment SDL_SIMDGetAlignment_renamed_SDL_GetSIMDAlignment /* ##SDL_endian.h */ @@ -789,14 +813,13 @@ #define SDL_WINDOWEVENT_RESTORED SDL_WINDOWEVENT_RESTORED_renamed_SDL_EVENT_WINDOW_RESTORED #define SDL_WINDOWEVENT_SHOWN SDL_WINDOWEVENT_SHOWN_renamed_SDL_EVENT_WINDOW_SHOWN #define SDL_WINDOWEVENT_SIZE_CHANGED SDL_WINDOWEVENT_SIZE_CHANGED_renamed_SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED -#define SDL_WINDOWEVENT_TAKE_FOCUS SDL_WINDOWEVENT_TAKE_FOCUS_renamed_SDL_EVENT_WINDOW_TAKE_FOCUS #define SDL_eventaction SDL_eventaction_renamed_SDL_EventAction /* ##SDL_gamecontroller.h */ #define SDL_CONTROLLER_AXIS_INVALID SDL_CONTROLLER_AXIS_INVALID_renamed_SDL_GAMEPAD_AXIS_INVALID #define SDL_CONTROLLER_AXIS_LEFTX SDL_CONTROLLER_AXIS_LEFTX_renamed_SDL_GAMEPAD_AXIS_LEFTX #define SDL_CONTROLLER_AXIS_LEFTY SDL_CONTROLLER_AXIS_LEFTY_renamed_SDL_GAMEPAD_AXIS_LEFTY -#define SDL_CONTROLLER_AXIS_MAX SDL_CONTROLLER_AXIS_MAX_renamed_SDL_GAMEPAD_AXIS_MAX +#define SDL_CONTROLLER_AXIS_MAX SDL_CONTROLLER_AXIS_MAX_renamed_SDL_GAMEPAD_AXIS_COUNT #define SDL_CONTROLLER_AXIS_RIGHTX SDL_CONTROLLER_AXIS_RIGHTX_renamed_SDL_GAMEPAD_AXIS_RIGHTX #define SDL_CONTROLLER_AXIS_RIGHTY SDL_CONTROLLER_AXIS_RIGHTY_renamed_SDL_GAMEPAD_AXIS_RIGHTY #define SDL_CONTROLLER_AXIS_TRIGGERLEFT SDL_CONTROLLER_AXIS_TRIGGERLEFT_renamed_SDL_GAMEPAD_AXIS_LEFT_TRIGGER @@ -816,7 +839,7 @@ #define SDL_CONTROLLER_BUTTON_INVALID SDL_CONTROLLER_BUTTON_INVALID_renamed_SDL_GAMEPAD_BUTTON_INVALID #define SDL_CONTROLLER_BUTTON_LEFTSHOULDER SDL_CONTROLLER_BUTTON_LEFTSHOULDER_renamed_SDL_GAMEPAD_BUTTON_LEFT_SHOULDER #define SDL_CONTROLLER_BUTTON_LEFTSTICK SDL_CONTROLLER_BUTTON_LEFTSTICK_renamed_SDL_GAMEPAD_BUTTON_LEFT_STICK -#define SDL_CONTROLLER_BUTTON_MAX SDL_CONTROLLER_BUTTON_MAX_renamed_SDL_GAMEPAD_BUTTON_MAX +#define SDL_CONTROLLER_BUTTON_MAX SDL_CONTROLLER_BUTTON_MAX_renamed_SDL_GAMEPAD_BUTTON_COUNT #define SDL_CONTROLLER_BUTTON_MISC1 SDL_CONTROLLER_BUTTON_MISC1_renamed_SDL_GAMEPAD_BUTTON_MISC1 #define SDL_CONTROLLER_BUTTON_PADDLE1 SDL_CONTROLLER_BUTTON_PADDLE1_renamed_SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1 #define SDL_CONTROLLER_BUTTON_PADDLE2 SDL_CONTROLLER_BUTTON_PADDLE2_renamed_SDL_GAMEPAD_BUTTON_LEFT_PADDLE1 @@ -928,6 +951,8 @@ #define SDL_HINT_DIRECTINPUT_ENABLED SDL_HINT_DIRECTINPUT_ENABLED_renamed_SDL_HINT_JOYSTICK_DIRECTINPUT #define SDL_HINT_GDK_TEXTINPUT_DEFAULT SDL_HINT_GDK_TEXTINPUT_DEFAULT_renamed_SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT #define SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE_renamed_SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE +#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE_renamed_SDL_HINT_JOYSTICK_ENHANCED_REPORTS +#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE_renamed_SDL_HINT_JOYSTICK_ENHANCED_REPORTS #define SDL_HINT_LINUX_DIGITAL_HATS SDL_HINT_LINUX_DIGITAL_HATS_renamed_SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS #define SDL_HINT_LINUX_HAT_DEADZONES SDL_HINT_LINUX_HAT_DEADZONES_renamed_SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES #define SDL_HINT_LINUX_JOYSTICK_CLASSIC SDL_HINT_LINUX_JOYSTICK_CLASSIC_renamed_SDL_HINT_JOYSTICK_LINUX_CLASSIC @@ -1043,9 +1068,15 @@ #define SDL_LogSetAllPriority SDL_LogSetAllPriority_renamed_SDL_SetLogPriorities #define SDL_LogSetOutputFunction SDL_LogSetOutputFunction_renamed_SDL_SetLogOutputFunction #define SDL_LogSetPriority SDL_LogSetPriority_renamed_SDL_SetLogPriority +#define SDL_NUM_LOG_PRIORITIES SDL_NUM_LOG_PRIORITIES_renamed_SDL_LOG_PRIORITY_COUNT + +/* ##SDL_messagebox.h */ +#define SDL_MESSAGEBOX_COLOR_MAX SDL_MESSAGEBOX_COLOR_MAX_renamed_SDL_MESSAGEBOX_COLOR_COUNT /* ##SDL_mouse.h */ +#define SDL_BUTTON SDL_BUTTON_renamed_SDL_BUTTON_MASK #define SDL_FreeCursor SDL_FreeCursor_renamed_SDL_DestroyCursor +#define SDL_NUM_SYSTEM_CURSORS SDL_NUM_SYSTEM_CURSORS_renamed_SDL_SYSTEM_CURSOR_COUNT #define SDL_SYSTEM_CURSOR_ARROW SDL_SYSTEM_CURSOR_ARROW_renamed_SDL_SYSTEM_CURSOR_DEFAULT #define SDL_SYSTEM_CURSOR_HAND SDL_SYSTEM_CURSOR_HAND_renamed_SDL_SYSTEM_CURSOR_POINTER #define SDL_SYSTEM_CURSOR_IBEAM SDL_SYSTEM_CURSOR_IBEAM_renamed_SDL_SYSTEM_CURSOR_TEXT @@ -1182,6 +1213,7 @@ #define SDL_WriteLE64 SDL_WriteLE64_renamed_SDL_WriteU64LE /* ##SDL_scancode.h */ +#define SDL_NUM_SCANCODES SDL_NUM_SCANCODES_renamed_SDL_SCANCODE_COUNT #define SDL_SCANCODE_AUDIOFASTFORWARD SDL_SCANCODE_AUDIOFASTFORWARD_renamed_SDL_SCANCODE_MEDIA_FAST_FORWARD #define SDL_SCANCODE_AUDIOMUTE SDL_SCANCODE_AUDIOMUTE_renamed_SDL_SCANCODE_MUTE #define SDL_SCANCODE_AUDIONEXT SDL_SCANCODE_AUDIONEXT_renamed_SDL_SCANCODE_MEDIA_NEXT_TRACK @@ -1204,7 +1236,12 @@ #define SDL_SensorUpdate SDL_SensorUpdate_renamed_SDL_UpdateSensors /* ##SDL_stdinc.h */ +#define SDL_FALSE SDL_FALSE_renamed_false #define SDL_TABLESIZE SDL_TABLESIZE_renamed_SDL_arraysize +#define SDL_TRUE SDL_TRUE_renamed_true +#define SDL_bool SDL_bool_renamed_bool +#define SDL_size_add_overflow SDL_size_add_overflow_renamed_SDL_size_add_check_overflow +#define SDL_size_mul_overflow SDL_size_mul_overflow_renamed_SDL_size_mul_check_overflow #define SDL_strtokr SDL_strtokr_renamed_SDL_strtok_r /* ##SDL_surface.h */ @@ -1247,14 +1284,13 @@ #define SDL_LinuxSetThreadPriorityAndPolicy SDL_LinuxSetThreadPriorityAndPolicy_renamed_SDL_SetLinuxThreadPriorityAndPolicy #define SDL_OnApplicationDidBecomeActive SDL_OnApplicationDidBecomeActive_renamed_SDL_OnApplicationDidEnterForeground #define SDL_OnApplicationWillResignActive SDL_OnApplicationWillResignActive_renamed_SDL_OnApplicationWillEnterBackground -#define SDL_WinRTGetDeviceFamily SDL_WinRTGetDeviceFamily_renamed_SDL_GetWinRTDeviceFamily -#define SDL_GetWinRTFSPathUTF8 SDL_GetWinRTFSPathUTF8_renamed_SDL_GetWinRTFSPath #define SDL_iOSSetAnimationCallback SDL_iOSSetAnimationCallback_renamed_SDL_SetiOSAnimationCallback #define SDL_iOSSetEventPump SDL_iOSSetEventPump_renamed_SDL_SetiOSEventPump #define SDL_iPhoneSetAnimationCallback SDL_iPhoneSetAnimationCallback_renamed_SDL_iOSSetAnimationCallback #define SDL_iPhoneSetEventPump SDL_iPhoneSetEventPump_renamed_SDL_iOSSetEventPump /* ##SDL_thread.h */ +#define SDL_SetThreadPriority SDL_SetThreadPriority_renamed_SDL_SetCurrentThreadPriority #define SDL_TLSCleanup SDL_TLSCleanup_renamed_SDL_CleanupTLS #define SDL_TLSGet SDL_TLSGet_renamed_SDL_GetTLS #define SDL_TLSSet SDL_TLSSet_renamed_SDL_SetTLS @@ -1269,6 +1305,10 @@ /* ##SDL_video.h */ #define SDL_GL_DeleteContext SDL_GL_DeleteContext_renamed_SDL_GL_DestroyContext +#define SDL_GLattr SDL_GLattr_renamed_SDL_GLAttr +#define SDL_GLcontextFlag SDL_GLcontextFlag_renamed_SDL_GLContextFlag +#define SDL_GLcontextReleaseFlag SDL_GLcontextReleaseFlag_renamed_SDL_GLContextReleaseFlag +#define SDL_GLprofile SDL_GLprofile_renamed_SDL_GLProfile #define SDL_GetClosestDisplayMode SDL_GetClosestDisplayMode_renamed_SDL_GetClosestFullscreenDisplayMode #define SDL_GetDisplayOrientation SDL_GetDisplayOrientation_renamed_SDL_GetCurrentDisplayOrientation #define SDL_GetPointDisplayIndex SDL_GetPointDisplayIndex_renamed_SDL_GetDisplayForPoint diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl.h index 6bdcbe0..d1b8b02 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -783,6 +783,7 @@ typedef double GLclampd; /* double precision float in [0,1] */ * Miscellaneous */ +#ifndef SDL_OPENGL_1_NO_PROTOTYPES GLAPI void GLAPIENTRY glClearIndex( GLfloat c ); GLAPI void GLAPIENTRY glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); @@ -1480,6 +1481,706 @@ GLAPI void GLAPIENTRY glPushName( GLuint name ); GLAPI void GLAPIENTRY glPopName( void ); +#endif +#ifdef SDL_OPENGL_1_FUNCTION_TYPEDEFS + +typedef void (APIENTRYP PFNGLCLEARINDEXPROC) ( GLfloat c ); + +typedef void (APIENTRYP PFNGLCLEARCOLORPROC) ( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); + +typedef void (APIENTRYP PFNGLCLEARPROC) ( GLbitfield mask ); + +typedef void (APIENTRYP PFNGLINDEXMASKPROC) ( GLuint mask ); + +typedef void (APIENTRYP PFNGLCOLORMASKPROC) ( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ); + +typedef void (APIENTRYP PFNGLALPHAFUNCPROC) ( GLenum func, GLclampf ref ); + +typedef void (APIENTRYP PFNGLBLENDFUNCPROC) ( GLenum sfactor, GLenum dfactor ); + +typedef void (APIENTRYP PFNGLLOGICOPPROC) ( GLenum opcode ); + +typedef void (APIENTRYP PFNGLCULLFACEPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLFRONTFACEPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLPOINTSIZEPROC) ( GLfloat size ); + +typedef void (APIENTRYP PFNGLLINEWIDTHPROC) ( GLfloat width ); + +typedef void (APIENTRYP PFNGLLINESTIPPLEPROC) ( GLint factor, GLushort pattern ); + +typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) ( GLenum face, GLenum mode ); + +typedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC) ( GLfloat factor, GLfloat units ); + +typedef void (APIENTRYP PFNGLPOLYGONSTIPPLEPROC) ( const GLubyte *mask ); + +typedef void (APIENTRYP PFNGLGETPOLYGONSTIPPLEPROC) ( GLubyte *mask ); + +typedef void (APIENTRYP PFNGLEDGEFLAGPROC) ( GLboolean flag ); + +typedef void (APIENTRYP PFNGLEDGEFLAGVPROC) ( const GLboolean *flag ); + +typedef void (APIENTRYP PFNGLSCISSORPROC) ( GLint x, GLint y, GLsizei width, GLsizei height); + +typedef void (APIENTRYP PFNGLCLIPPLANEPROC) ( GLenum plane, const GLdouble *equation ); + +typedef void (APIENTRYP PFNGLGETCLIPPLANEPROC) ( GLenum plane, GLdouble *equation ); + +typedef void (APIENTRYP PFNGLDRAWBUFFERPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLREADBUFFERPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLENABLEPROC) ( GLenum cap ); + +typedef void (APIENTRYP PFNGLDISABLEPROC) ( GLenum cap ); + +typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) ( GLenum cap ); + + +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEPROC) ( GLenum cap ); /* 1.1 */ + +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEPROC) ( GLenum cap ); /* 1.1 */ + + +typedef void (APIENTRYP PFNGLGETBOOLEANVPROC) ( GLenum pname, GLboolean *params ); + +typedef void (APIENTRYP PFNGLGETDOUBLEVPROC) ( GLenum pname, GLdouble *params ); + +typedef void (APIENTRYP PFNGLGETFLOATVPROC) ( GLenum pname, GLfloat *params ); + +typedef void (APIENTRYP PFNGLGETINTEGERVPROC) ( GLenum pname, GLint *params ); + + +typedef void (APIENTRYP PFNGLPUSHATTRIBPROC) ( GLbitfield mask ); + +typedef void (APIENTRYP PFNGLPOPATTRIBPROC) ( void ); + + +typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBPROC) ( GLbitfield mask ); /* 1.1 */ + +typedef void (APIENTRYP PFNGLPOPCLIENTATTRIBPROC) ( void ); /* 1.1 */ + + +typedef GLint (APIENTRYP PFNGLRENDERMODEPROC) ( GLenum mode ); + +typedef GLenum (APIENTRYP PFNGLGETERRORPROC) ( void ); + +typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) ( GLenum name ); + +typedef void (APIENTRYP PFNGLFINISHPROC) ( void ); + +typedef void (APIENTRYP PFNGLFLUSHPROC) ( void ); + +typedef void (APIENTRYP PFNGLHINTPROC) ( GLenum target, GLenum mode ); + + +/* + * Depth Buffer + */ + +typedef void (APIENTRYP PFNGLCLEARDEPTHPROC) ( GLclampd depth ); + +typedef void (APIENTRYP PFNGLDEPTHFUNCPROC) ( GLenum func ); + +typedef void (APIENTRYP PFNGLDEPTHMASKPROC) ( GLboolean flag ); + +typedef void (APIENTRYP PFNGLDEPTHRANGEPROC) ( GLclampd near_val, GLclampd far_val ); + + +/* + * Accumulation Buffer + */ + +typedef void (APIENTRYP PFNGLCLEARACCUMPROC) ( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); + +typedef void (APIENTRYP PFNGLACCUMPROC) ( GLenum op, GLfloat value ); + + +/* + * Transformation + */ + +typedef void (APIENTRYP PFNGLMATRIXMODEPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLORTHOPROC) ( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); + +typedef void (APIENTRYP PFNGLFRUSTUMPROC) ( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); + +typedef void (APIENTRYP PFNGLVIEWPORTPROC) ( GLint x, GLint y, + GLsizei width, GLsizei height ); + +typedef void (APIENTRYP PFNGLPUSHMATRIXPROC) ( void ); + +typedef void (APIENTRYP PFNGLPOPMATRIXPROC) ( void ); + +typedef void (APIENTRYP PFNGLLOADIDENTITYPROC) ( void ); + +typedef void (APIENTRYP PFNGLLOADMATRIXDPROC) ( const GLdouble *m ); +typedef void (APIENTRYP PFNGLLOADMATRIXFPROC) ( const GLfloat *m ); + +typedef void (APIENTRYP PFNGLMULTMATRIXDPROC) ( const GLdouble *m ); +typedef void (APIENTRYP PFNGLMULTMATRIXFPROC) ( const GLfloat *m ); + +typedef void (APIENTRYP PFNGLROTATEDPROC) ( GLdouble angle, + GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP PFNGLROTATEFPROC) ( GLfloat angle, + GLfloat x, GLfloat y, GLfloat z ); + +typedef void (APIENTRYP PFNGLSCALEDPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP PFNGLSCALEFPROC) ( GLfloat x, GLfloat y, GLfloat z ); + +typedef void (APIENTRYP PFNGLTRANSLATEDPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP PFNGLTRANSLATEFPROC) ( GLfloat x, GLfloat y, GLfloat z ); + + +/* + * Display Lists + */ + +typedef GLboolean (APIENTRYP PFNGLISLISTPROC) ( GLuint list ); + +typedef void (APIENTRYP PFNGLDELETELISTSPROC) ( GLuint list, GLsizei range ); + +typedef GLuint (APIENTRYP PFNGLGENLISTSPROC) ( GLsizei range ); + +typedef void (APIENTRYP PFNGLNEWLISTPROC) ( GLuint list, GLenum mode ); + +typedef void (APIENTRYP PFNGLENDLISTPROC) ( void ); + +typedef void (APIENTRYP PFNGLCALLLISTPROC) ( GLuint list ); + +typedef void (APIENTRYP PFNGLCALLLISTSPROC) ( GLsizei n, GLenum type, + const GLvoid *lists ); + +typedef void (APIENTRYP PFNGLLISTBASEPROC) ( GLuint base ); + + +/* + * Drawing Functions + */ + +typedef void (APIENTRYP PFNGLBEGINPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLENDPROC) ( void ); + + +typedef void (APIENTRYP PFNGLVERTEX2DPROC) ( GLdouble x, GLdouble y ); +typedef void (APIENTRYP PFNGLVERTEX2FPROC) ( GLfloat x, GLfloat y ); +typedef void (APIENTRYP PFNGLVERTEX2IPROC) ( GLint x, GLint y ); +typedef void (APIENTRYP PFNGLVERTEX2SPROC) ( GLshort x, GLshort y ); + +typedef void (APIENTRYP PFNGLVERTEX3DPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP PFNGLVERTEX3FPROC) ( GLfloat x, GLfloat y, GLfloat z ); +typedef void (APIENTRYP PFNGLVERTEX3IPROC) ( GLint x, GLint y, GLint z ); +typedef void (APIENTRYP PFNGLVERTEX3SPROC) ( GLshort x, GLshort y, GLshort z ); + +typedef void (APIENTRYP PFNGLVERTEX4DPROC) ( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +typedef void (APIENTRYP PFNGLVERTEX4FPROC) ( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +typedef void (APIENTRYP PFNGLVERTEX4IPROC) ( GLint x, GLint y, GLint z, GLint w ); +typedef void (APIENTRYP PFNGLVERTEX4SPROC) ( GLshort x, GLshort y, GLshort z, GLshort w ); + +typedef void (APIENTRYP PFNGLVERTEX2DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLVERTEX2FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLVERTEX2IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLVERTEX2SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLVERTEX3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLVERTEX3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLVERTEX3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLVERTEX3SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLVERTEX4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLVERTEX4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLVERTEX4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLVERTEX4SVPROC) ( const GLshort *v ); + + +typedef void (APIENTRYP PFNGLNORMAL3BPROC) ( GLbyte nx, GLbyte ny, GLbyte nz ); +typedef void (APIENTRYP PFNGLNORMAL3DPROC) ( GLdouble nx, GLdouble ny, GLdouble nz ); +typedef void (APIENTRYP PFNGLNORMAL3FPROC) ( GLfloat nx, GLfloat ny, GLfloat nz ); +typedef void (APIENTRYP PFNGLNORMAL3IPROC) ( GLint nx, GLint ny, GLint nz ); +typedef void (APIENTRYP PFNGLNORMAL3SPROC) ( GLshort nx, GLshort ny, GLshort nz ); + +typedef void (APIENTRYP PFNGLNORMAL3BVPROC) ( const GLbyte *v ); +typedef void (APIENTRYP PFNGLNORMAL3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLNORMAL3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLNORMAL3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLNORMAL3SVPROC) ( const GLshort *v ); + + +typedef void (APIENTRYP PFNGLINDEXDPROC) ( GLdouble c ); +typedef void (APIENTRYP PFNGLINDEXFPROC) ( GLfloat c ); +typedef void (APIENTRYP PFNGLINDEXIPROC) ( GLint c ); +typedef void (APIENTRYP PFNGLINDEXSPROC) ( GLshort c ); +typedef void (APIENTRYP PFNGLINDEXUBPROC) ( GLubyte c ); /* 1.1 */ + +typedef void (APIENTRYP PFNGLINDEXDVPROC) ( const GLdouble *c ); +typedef void (APIENTRYP PFNGLINDEXFVPROC) ( const GLfloat *c ); +typedef void (APIENTRYP PFNGLINDEXIVPROC) ( const GLint *c ); +typedef void (APIENTRYP PFNGLINDEXSVPROC) ( const GLshort *c ); +typedef void (APIENTRYP PFNGLINDEXUBVPROC) ( const GLubyte *c ); /* 1.1 */ + +typedef void (APIENTRYP PFNGLCOLOR3BPROC) ( GLbyte red, GLbyte green, GLbyte blue ); +typedef void (APIENTRYP PFNGLCOLOR3DPROC) ( GLdouble red, GLdouble green, GLdouble blue ); +typedef void (APIENTRYP PFNGLCOLOR3FPROC) ( GLfloat red, GLfloat green, GLfloat blue ); +typedef void (APIENTRYP PFNGLCOLOR3IPROC) ( GLint red, GLint green, GLint blue ); +typedef void (APIENTRYP PFNGLCOLOR3SPROC) ( GLshort red, GLshort green, GLshort blue ); +typedef void (APIENTRYP PFNGLCOLOR3UBPROC) ( GLubyte red, GLubyte green, GLubyte blue ); +typedef void (APIENTRYP PFNGLCOLOR3UIPROC) ( GLuint red, GLuint green, GLuint blue ); +typedef void (APIENTRYP PFNGLCOLOR3USPROC) ( GLushort red, GLushort green, GLushort blue ); + +typedef void (APIENTRYP PFNGLCOLOR4BPROC) ( GLbyte red, GLbyte green, + GLbyte blue, GLbyte alpha ); +typedef void (APIENTRYP PFNGLCOLOR4DPROC) ( GLdouble red, GLdouble green, + GLdouble blue, GLdouble alpha ); +typedef void (APIENTRYP PFNGLCOLOR4FPROC) ( GLfloat red, GLfloat green, + GLfloat blue, GLfloat alpha ); +typedef void (APIENTRYP PFNGLCOLOR4IPROC) ( GLint red, GLint green, + GLint blue, GLint alpha ); +typedef void (APIENTRYP PFNGLCOLOR4SPROC) ( GLshort red, GLshort green, + GLshort blue, GLshort alpha ); +typedef void (APIENTRYP PFNGLCOLOR4UBPROC) ( GLubyte red, GLubyte green, + GLubyte blue, GLubyte alpha ); +typedef void (APIENTRYP PFNGLCOLOR4UIPROC) ( GLuint red, GLuint green, + GLuint blue, GLuint alpha ); +typedef void (APIENTRYP PFNGLCOLOR4USPROC) ( GLushort red, GLushort green, + GLushort blue, GLushort alpha ); + + +typedef void (APIENTRYP PFNGLCOLOR3BVPROC) ( const GLbyte *v ); +typedef void (APIENTRYP PFNGLCOLOR3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLCOLOR3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLCOLOR3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLCOLOR3SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP PFNGLCOLOR3UBVPROC) ( const GLubyte *v ); +typedef void (APIENTRYP PFNGLCOLOR3UIVPROC) ( const GLuint *v ); +typedef void (APIENTRYP PFNGLCOLOR3USVPROC) ( const GLushort *v ); + +typedef void (APIENTRYP PFNGLCOLOR4BVPROC) ( const GLbyte *v ); +typedef void (APIENTRYP PFNGLCOLOR4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLCOLOR4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLCOLOR4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLCOLOR4SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP PFNGLCOLOR4UBVPROC) ( const GLubyte *v ); +typedef void (APIENTRYP PFNGLCOLOR4UIVPROC) ( const GLuint *v ); +typedef void (APIENTRYP PFNGLCOLOR4USVPROC) ( const GLushort *v ); + + +typedef void (APIENTRYP PFNGLTEXCOORD1DPROC) ( GLdouble s ); +typedef void (APIENTRYP PFNGLTEXCOORD1FPROC) ( GLfloat s ); +typedef void (APIENTRYP PFNGLTEXCOORD1IPROC) ( GLint s ); +typedef void (APIENTRYP PFNGLTEXCOORD1SPROC) ( GLshort s ); + +typedef void (APIENTRYP PFNGLTEXCOORD2DPROC) ( GLdouble s, GLdouble t ); +typedef void (APIENTRYP PFNGLTEXCOORD2FPROC) ( GLfloat s, GLfloat t ); +typedef void (APIENTRYP PFNGLTEXCOORD2IPROC) ( GLint s, GLint t ); +typedef void (APIENTRYP PFNGLTEXCOORD2SPROC) ( GLshort s, GLshort t ); + +typedef void (APIENTRYP PFNGLTEXCOORD3DPROC) ( GLdouble s, GLdouble t, GLdouble r ); +typedef void (APIENTRYP PFNGLTEXCOORD3FPROC) ( GLfloat s, GLfloat t, GLfloat r ); +typedef void (APIENTRYP PFNGLTEXCOORD3IPROC) ( GLint s, GLint t, GLint r ); +typedef void (APIENTRYP PFNGLTEXCOORD3SPROC) ( GLshort s, GLshort t, GLshort r ); + +typedef void (APIENTRYP PFNGLTEXCOORD4DPROC) ( GLdouble s, GLdouble t, GLdouble r, GLdouble q ); +typedef void (APIENTRYP PFNGLTEXCOORD4FPROC) ( GLfloat s, GLfloat t, GLfloat r, GLfloat q ); +typedef void (APIENTRYP PFNGLTEXCOORD4IPROC) ( GLint s, GLint t, GLint r, GLint q ); +typedef void (APIENTRYP PFNGLTEXCOORD4SPROC) ( GLshort s, GLshort t, GLshort r, GLshort q ); + +typedef void (APIENTRYP PFNGLTEXCOORD1DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLTEXCOORD1FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLTEXCOORD1IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLTEXCOORD1SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLTEXCOORD2DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLTEXCOORD2FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLTEXCOORD2IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLTEXCOORD2SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLTEXCOORD3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLTEXCOORD3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLTEXCOORD3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLTEXCOORD3SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLTEXCOORD4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLTEXCOORD4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLTEXCOORD4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLTEXCOORD4SVPROC) ( const GLshort *v ); + + +typedef void (APIENTRYP PFNGLRASTERPOS2DPROC) ( GLdouble x, GLdouble y ); +typedef void (APIENTRYP PFNGLRASTERPOS2FPROC) ( GLfloat x, GLfloat y ); +typedef void (APIENTRYP PFNGLRASTERPOS2IPROC) ( GLint x, GLint y ); +typedef void (APIENTRYP PFNGLRASTERPOS2SPROC) ( GLshort x, GLshort y ); + +typedef void (APIENTRYP PFNGLRASTERPOS3DPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP PFNGLRASTERPOS3FPROC) ( GLfloat x, GLfloat y, GLfloat z ); +typedef void (APIENTRYP PFNGLRASTERPOS3IPROC) ( GLint x, GLint y, GLint z ); +typedef void (APIENTRYP PFNGLRASTERPOS3SPROC) ( GLshort x, GLshort y, GLshort z ); + +typedef void (APIENTRYP PFNGLRASTERPOS4DPROC) ( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +typedef void (APIENTRYP PFNGLRASTERPOS4FPROC) ( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +typedef void (APIENTRYP PFNGLRASTERPOS4IPROC) ( GLint x, GLint y, GLint z, GLint w ); +typedef void (APIENTRYP PFNGLRASTERPOS4SPROC) ( GLshort x, GLshort y, GLshort z, GLshort w ); + +typedef void (APIENTRYP PFNGLRASTERPOS2DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLRASTERPOS2FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLRASTERPOS2IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLRASTERPOS2SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLRASTERPOS3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLRASTERPOS3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLRASTERPOS3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLRASTERPOS3SVPROC) ( const GLshort *v ); + +typedef void (APIENTRYP PFNGLRASTERPOS4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP PFNGLRASTERPOS4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP PFNGLRASTERPOS4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP PFNGLRASTERPOS4SVPROC) ( const GLshort *v ); + + +typedef void (APIENTRYP PFNGLRECTDPROC) ( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ); +typedef void (APIENTRYP PFNGLRECTFPROC) ( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ); +typedef void (APIENTRYP PFNGLRECTIPROC) ( GLint x1, GLint y1, GLint x2, GLint y2 ); +typedef void (APIENTRYP PFNGLRECTSPROC) ( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ); + + +typedef void (APIENTRYP PFNGLRECTDVPROC) ( const GLdouble *v1, const GLdouble *v2 ); +typedef void (APIENTRYP PFNGLRECTFVPROC) ( const GLfloat *v1, const GLfloat *v2 ); +typedef void (APIENTRYP PFNGLRECTIVPROC) ( const GLint *v1, const GLint *v2 ); +typedef void (APIENTRYP PFNGLRECTSVPROC) ( const GLshort *v1, const GLshort *v2 ); + + +/* + * Vertex Arrays (1.1) + */ + +typedef void (APIENTRYP PFNGLVERTEXPOINTERPROC) ( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLNORMALPOINTERPROC) ( GLenum type, GLsizei stride, + const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLCOLORPOINTERPROC) ( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLINDEXPOINTERPROC) ( GLenum type, GLsizei stride, + const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERPROC) ( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERPROC) ( GLsizei stride, const GLvoid *ptr ); + +typedef void (APIENTRYP PFNGLGETPOINTERVPROC) ( GLenum pname, GLvoid **params ); + +typedef void (APIENTRYP PFNGLARRAYELEMENTPROC) ( GLint i ); + +typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) ( GLenum mode, GLint first, GLsizei count ); + +typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) ( GLenum mode, GLsizei count, + GLenum type, const GLvoid *indices ); + +typedef void (APIENTRYP PFNGLINTERLEAVEDARRAYSPROC) ( GLenum format, GLsizei stride, + const GLvoid *pointer ); + +/* + * Lighting + */ + +typedef void (APIENTRYP PFNGLSHADEMODELPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLLIGHTFPROC) ( GLenum light, GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLLIGHTIPROC) ( GLenum light, GLenum pname, GLint param ); +typedef void (APIENTRYP PFNGLLIGHTFVPROC) ( GLenum light, GLenum pname, + const GLfloat *params ); +typedef void (APIENTRYP PFNGLLIGHTIVPROC) ( GLenum light, GLenum pname, + const GLint *params ); + +typedef void (APIENTRYP PFNGLGETLIGHTFVPROC) ( GLenum light, GLenum pname, + GLfloat *params ); +typedef void (APIENTRYP PFNGLGETLIGHTIVPROC) ( GLenum light, GLenum pname, + GLint *params ); + +typedef void (APIENTRYP PFNGLLIGHTMODELFPROC) ( GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLLIGHTMODELIPROC) ( GLenum pname, GLint param ); +typedef void (APIENTRYP PFNGLLIGHTMODELFVPROC) ( GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP PFNGLLIGHTMODELIVPROC) ( GLenum pname, const GLint *params ); + +typedef void (APIENTRYP PFNGLMATERIALFPROC) ( GLenum face, GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLMATERIALIPROC) ( GLenum face, GLenum pname, GLint param ); +typedef void (APIENTRYP PFNGLMATERIALFVPROC) ( GLenum face, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP PFNGLMATERIALIVPROC) ( GLenum face, GLenum pname, const GLint *params ); + +typedef void (APIENTRYP PFNGLGETMATERIALFVPROC) ( GLenum face, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP PFNGLGETMATERIALIVPROC) ( GLenum face, GLenum pname, GLint *params ); + +typedef void (APIENTRYP PFNGLCOLORMATERIALPROC) ( GLenum face, GLenum mode ); + + +/* + * Raster functions + */ + +typedef void (APIENTRYP PFNGLPIXELZOOMPROC) ( GLfloat xfactor, GLfloat yfactor ); + +typedef void (APIENTRYP PFNGLPIXELSTOREFPROC) ( GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) ( GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLPIXELTRANSFERFPROC) ( GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLPIXELTRANSFERIPROC) ( GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLPIXELMAPFVPROC) ( GLenum map, GLsizei mapsize, + const GLfloat *values ); +typedef void (APIENTRYP PFNGLPIXELMAPUIVPROC) ( GLenum map, GLsizei mapsize, + const GLuint *values ); +typedef void (APIENTRYP PFNGLPIXELMAPUSVPROC) ( GLenum map, GLsizei mapsize, + const GLushort *values ); + +typedef void (APIENTRYP PFNGLGETPIXELMAPFVPROC) ( GLenum map, GLfloat *values ); +typedef void (APIENTRYP PFNGLGETPIXELMAPUIVPROC) ( GLenum map, GLuint *values ); +typedef void (APIENTRYP PFNGLGETPIXELMAPUSVPROC) ( GLenum map, GLushort *values ); + +typedef void (APIENTRYP PFNGLBITMAPPROC) ( GLsizei width, GLsizei height, + GLfloat xorig, GLfloat yorig, + GLfloat xmove, GLfloat ymove, + const GLubyte *bitmap ); + +typedef void (APIENTRYP PFNGLREADPIXELSPROC) ( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + GLvoid *pixels ); + +typedef void (APIENTRYP PFNGLDRAWPIXELSPROC) ( GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); + +typedef void (APIENTRYP PFNGLCOPYPIXELSPROC) ( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum type ); + +/* + * Stenciling + */ + +typedef void (APIENTRYP PFNGLSTENCILFUNCPROC) ( GLenum func, GLint ref, GLuint mask ); + +typedef void (APIENTRYP PFNGLSTENCILMASKPROC) ( GLuint mask ); + +typedef void (APIENTRYP PFNGLSTENCILOPPROC) ( GLenum fail, GLenum zfail, GLenum zpass ); + +typedef void (APIENTRYP PFNGLCLEARSTENCILPROC) ( GLint s ); + + + +/* + * Texture mapping + */ + +typedef void (APIENTRYP PFNGLTEXGENDPROC) ( GLenum coord, GLenum pname, GLdouble param ); +typedef void (APIENTRYP PFNGLTEXGENFPROC) ( GLenum coord, GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLTEXGENIPROC) ( GLenum coord, GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLTEXGENDVPROC) ( GLenum coord, GLenum pname, const GLdouble *params ); +typedef void (APIENTRYP PFNGLTEXGENFVPROC) ( GLenum coord, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP PFNGLTEXGENIVPROC) ( GLenum coord, GLenum pname, const GLint *params ); + +typedef void (APIENTRYP PFNGLGETTEXGENDVPROC) ( GLenum coord, GLenum pname, GLdouble *params ); +typedef void (APIENTRYP PFNGLGETTEXGENFVPROC) ( GLenum coord, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP PFNGLGETTEXGENIVPROC) ( GLenum coord, GLenum pname, GLint *params ); + + +typedef void (APIENTRYP PFNGLTEXENVFPROC) ( GLenum target, GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLTEXENVIPROC) ( GLenum target, GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLTEXENVFVPROC) ( GLenum target, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP PFNGLTEXENVIVPROC) ( GLenum target, GLenum pname, const GLint *params ); + +typedef void (APIENTRYP PFNGLGETTEXENVFVPROC) ( GLenum target, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP PFNGLGETTEXENVIVPROC) ( GLenum target, GLenum pname, GLint *params ); + + +typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC) ( GLenum target, GLenum pname, GLfloat param ); +typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) ( GLenum target, GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC) ( GLenum target, GLenum pname, + const GLfloat *params ); +typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC) ( GLenum target, GLenum pname, + const GLint *params ); + +typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC) ( GLenum target, + GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC) ( GLenum target, + GLenum pname, GLint *params ); + +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) ( GLenum target, GLint level, + GLenum pname, GLfloat *params ); +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) ( GLenum target, GLint level, + GLenum pname, GLint *params ); + + +typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC) ( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels ); + +typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) ( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, + GLint border, GLenum format, GLenum type, + const GLvoid *pixels ); + +typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC) ( GLenum target, GLint level, + GLenum format, GLenum type, + GLvoid *pixels ); + + +/* 1.1 functions */ + +typedef void (APIENTRYP PFNGLGENTEXTURESPROC) ( GLsizei n, GLuint *textures ); + +typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) ( GLsizei n, const GLuint *textures); + +typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) ( GLenum target, GLuint texture ); + +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESPROC) ( GLsizei n, + const GLuint *textures, + const GLclampf *priorities ); + +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTPROC) ( GLsizei n, + const GLuint *textures, + GLboolean *residences ); + +typedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC) ( GLuint texture ); + + +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC) ( GLenum target, GLint level, + GLint xoffset, + GLsizei width, GLenum format, + GLenum type, const GLvoid *pixels ); + + +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) ( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); + + +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC) ( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLint border ); + + +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) ( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLsizei height, + GLint border ); + + +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC) ( GLenum target, GLint level, + GLint xoffset, GLint x, GLint y, + GLsizei width ); + + +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) ( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint x, GLint y, + GLsizei width, GLsizei height ); + + +/* + * Evaluators + */ + +typedef void (APIENTRYP PFNGLMAP1DPROC) ( GLenum target, GLdouble u1, GLdouble u2, + GLint stride, + GLint order, const GLdouble *points ); +typedef void (APIENTRYP PFNGLMAP1FPROC) ( GLenum target, GLfloat u1, GLfloat u2, + GLint stride, + GLint order, const GLfloat *points ); + +typedef void (APIENTRYP PFNGLMAP2DPROC) ( GLenum target, + GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, + GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, + const GLdouble *points ); +typedef void (APIENTRYP PFNGLMAP2FPROC) ( GLenum target, + GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, + GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, + const GLfloat *points ); + +typedef void (APIENTRYP PFNGLGETMAPDVPROC) ( GLenum target, GLenum query, GLdouble *v ); +typedef void (APIENTRYP PFNGLGETMAPFVPROC) ( GLenum target, GLenum query, GLfloat *v ); +typedef void (APIENTRYP PFNGLGETMAPIVPROC) ( GLenum target, GLenum query, GLint *v ); + +typedef void (APIENTRYP PFNGLEVALCOORD1DPROC) ( GLdouble u ); +typedef void (APIENTRYP PFNGLEVALCOORD1FPROC) ( GLfloat u ); + +typedef void (APIENTRYP PFNGLEVALCOORD1DVPROC) ( const GLdouble *u ); +typedef void (APIENTRYP PFNGLEVALCOORD1FVPROC) ( const GLfloat *u ); + +typedef void (APIENTRYP PFNGLEVALCOORD2DPROC) ( GLdouble u, GLdouble v ); +typedef void (APIENTRYP PFNGLEVALCOORD2FPROC) ( GLfloat u, GLfloat v ); + +typedef void (APIENTRYP PFNGLEVALCOORD2DVPROC) ( const GLdouble *u ); +typedef void (APIENTRYP PFNGLEVALCOORD2FVPROC) ( const GLfloat *u ); + +typedef void (APIENTRYP PFNGLMAPGRID1DPROC) ( GLint un, GLdouble u1, GLdouble u2 ); +typedef void (APIENTRYP PFNGLMAPGRID1FPROC) ( GLint un, GLfloat u1, GLfloat u2 ); + +typedef void (APIENTRYP PFNGLMAPGRID2DPROC) ( GLint un, GLdouble u1, GLdouble u2, + GLint vn, GLdouble v1, GLdouble v2 ); +typedef void (APIENTRYP PFNGLMAPGRID2FPROC) ( GLint un, GLfloat u1, GLfloat u2, + GLint vn, GLfloat v1, GLfloat v2 ); + +typedef void (APIENTRYP PFNGLEVALPOINT1PROC) ( GLint i ); + +typedef void (APIENTRYP PFNGLEVALPOINT2PROC) ( GLint i, GLint j ); + +typedef void (APIENTRYP PFNGLEVALMESH1PROC) ( GLenum mode, GLint i1, GLint i2 ); + +typedef void (APIENTRYP PFNGLEVALMESH2PROC) ( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); + + +/* + * Fog + */ + +typedef void (APIENTRYP PFNGLFOGFPROC) ( GLenum pname, GLfloat param ); + +typedef void (APIENTRYP PFNGLFOGIPROC) ( GLenum pname, GLint param ); + +typedef void (APIENTRYP PFNGLFOGFVPROC) ( GLenum pname, const GLfloat *params ); + +typedef void (APIENTRYP PFNGLFOGIVPROC) ( GLenum pname, const GLint *params ); + + +/* + * Selection and Feedback + */ + +typedef void (APIENTRYP PFNGLFEEDBACKBUFFERPROC) ( GLsizei size, GLenum type, GLfloat *buffer ); + +typedef void (APIENTRYP PFNGLPASSTHROUGHPROC) ( GLfloat token ); + +typedef void (APIENTRYP PFNGLSELECTBUFFERPROC) ( GLsizei size, GLuint *buffer ); + +typedef void (APIENTRYP PFNGLINITNAMESPROC) ( void ); + +typedef void (APIENTRYP PFNGLLOADNAMEPROC) ( GLuint name ); + +typedef void (APIENTRYP PFNGLPUSHNAMEPROC) ( GLuint name ); + +typedef void (APIENTRYP PFNGLPOPNAMEPROC) ( void ); +#endif /* @@ -1528,6 +2229,8 @@ GLAPI void GLAPIENTRY glPopName( void ); #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_TEXTURE_BINDING_3D 0x806A +#ifndef SDL_OPENGL_1_NO_PROTOTYPES + GLAPI void GLAPIENTRY glDrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); @@ -1551,6 +2254,34 @@ GLAPI void GLAPIENTRY glCopyTexSubImage3D( GLenum target, GLint level, GLint y, GLsizei width, GLsizei height ); +#endif +#ifdef SDL_OPENGL_1_FUNCTION_TYPEDEFS + +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 ); + +#endif + 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); @@ -1638,6 +2369,8 @@ typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, #define GL_BLEND_COLOR 0x8005 +#ifndef SDL_OPENGL_1_NO_PROTOTYPES + GLAPI void GLAPIENTRY glColorTable( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table ); @@ -1746,6 +2479,119 @@ GLAPI void GLAPIENTRY glSeparableFilter2D( GLenum target, GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); +#endif +#ifdef SDL_OPENGL_1_FUNCTION_TYPEDEFS + +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) ( GLenum target, GLenum internalformat, + GLsizei width, GLenum format, + GLenum type, const GLvoid *table ); + +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) ( GLenum target, + GLsizei start, GLsizei count, + GLenum format, GLenum type, + const GLvoid *data ); + +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, + const GLint *params); + +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, + const GLfloat *params); + +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) ( GLenum target, GLsizei start, + GLint x, GLint y, GLsizei width ); + +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) ( GLenum target, GLenum internalformat, + GLint x, GLint y, GLsizei width ); + +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) ( GLenum target, GLenum format, + GLenum type, GLvoid *table ); + +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) ( GLenum target, GLenum pname, + GLfloat *params ); + +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) ( GLenum target, GLenum pname, + GLint *params ); + +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) ( GLenum mode ); + +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) ( GLclampf red, GLclampf green, + GLclampf blue, GLclampf alpha ); + +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) ( GLenum target, GLsizei width, + GLenum internalformat, GLboolean sink ); + +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) ( GLenum target ); + +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) ( GLenum target, GLboolean reset, + GLenum format, GLenum type, + GLvoid *values ); + +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) ( GLenum target, GLenum pname, + GLfloat *params ); + +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) ( GLenum target, GLenum pname, + GLint *params ); + +typedef void (APIENTRYP PFNGLMINMAXPROC) ( GLenum target, GLenum internalformat, + GLboolean sink ); + +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) ( GLenum target ); + +typedef void (APIENTRYP PFNGLGETMINMAXPROC) ( GLenum target, GLboolean reset, + GLenum format, GLenum types, + GLvoid *values ); + +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) ( GLenum target, GLenum pname, + GLfloat *params ); + +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) ( GLenum target, GLenum pname, + GLint *params ); + +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) ( GLenum target, + GLenum internalformat, GLsizei width, GLenum format, GLenum type, + const GLvoid *image ); + +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) ( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *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, GLvoid *image ); + +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) ( GLenum target, GLenum pname, + GLfloat *params ); + +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) ( GLenum target, GLenum pname, + GLint *params ); + +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) ( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *row, const GLvoid *column ); + +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) ( GLenum target, GLenum format, + GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); + +#endif + @@ -1858,6 +2704,8 @@ GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format, /* texture_border_clamp */ #define GL_CLAMP_TO_BORDER 0x812D +#ifndef SDL_OPENGL_1_NO_PROTOTYPES + GLAPI void GLAPIENTRY glActiveTexture( GLenum texture ); GLAPI void GLAPIENTRY glClientActiveTexture( GLenum texture ); @@ -1951,6 +2799,104 @@ GLAPI void GLAPIENTRY glMultTransposeMatrixf( const GLfloat m[16] ); GLAPI void GLAPIENTRY glSampleCoverage( GLclampf value, GLboolean invert ); +#endif +#ifdef SDL_OPENGL_1_FUNCTION_TYPEDEFS + +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) ( GLenum texture ); + +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) ( GLenum texture ); + +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) ( GLenum target, GLint level, GLenum internalformat, GLsizei width, 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 PFNGLCOMPRESSEDTEXIMAGE3DPROC) ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, 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 PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, 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 PFNGLGETCOMPRESSEDTEXIMAGEPROC) ( GLenum target, GLint lod, GLvoid *img ); + +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 PFNGLLOADTRANSPOSEMATRIXDPROC) ( const GLdouble m[16] ); + +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) ( const GLfloat m[16] ); + +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) ( const GLdouble m[16] ); + +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) ( const GLfloat m[16] ); + +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) ( GLclampf value, GLboolean invert ); + +#endif + typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); @@ -2006,6 +2952,8 @@ typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint le #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#ifndef SDL_OPENGL_1_NO_PROTOTYPES + GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture); GLAPI void GLAPIENTRY glClientActiveTextureARB(GLenum texture); GLAPI void GLAPIENTRY glMultiTexCoord1dARB(GLenum target, GLdouble s); @@ -2041,6 +2989,46 @@ 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); +#endif +#ifdef SDL_OPENGL_1_FUNCTION_TYPEDEFS + +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 + typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles.h index bde4d74..4fb9a4b 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2.h index ba19601..365898a 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pen.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pen.h index cda4f0f..5182eeb 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pen.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pen.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -39,7 +39,9 @@ #ifndef SDL_pen_h_ #define SDL_pen_h_ -#include +#include +#include +#include /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus @@ -55,24 +57,39 @@ extern "C" { * consistent as long as SDL can recognize a tool to be the same pen; but if a * pen physically leaves the area and returns, it might get a new ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_PenID; +/** + * The SDL_MouseID for mouse events simulated with pen input. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PEN_MOUSEID ((SDL_MouseID)-2) + +/** + * The SDL_TouchID for touch events simulated with pen input. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PEN_TOUCHID ((SDL_TouchID)-2) + /** * Pen input flags, as reported by various pen events' `pen_state` field. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_PenInputFlags; -#define SDL_PEN_INPUT_DOWN (1u << 0) /**< & to see if pen is pressed down */ -#define SDL_PEN_INPUT_BUTTON_1 (1u << 1) /**< & to see if button 1 is pressed */ -#define SDL_PEN_INPUT_BUTTON_2 (1u << 2) /**< & to see if button 2 is pressed */ -#define SDL_PEN_INPUT_BUTTON_3 (1u << 3) /**< & to see if button 3 is pressed */ -#define SDL_PEN_INPUT_BUTTON_4 (1u << 4) /**< & to see if button 4 is pressed */ -#define SDL_PEN_INPUT_BUTTON_5 (1u << 5) /**< & to see if button 5 is pressed */ -#define SDL_PEN_INPUT_ERASER_TIP (1u << 30) /**< & to see if eraser tip is used */ + +#define SDL_PEN_INPUT_DOWN (1u << 0) /**< pen is pressed down */ +#define SDL_PEN_INPUT_BUTTON_1 (1u << 1) /**< button 1 is pressed */ +#define SDL_PEN_INPUT_BUTTON_2 (1u << 2) /**< button 2 is pressed */ +#define SDL_PEN_INPUT_BUTTON_3 (1u << 3) /**< button 3 is pressed */ +#define SDL_PEN_INPUT_BUTTON_4 (1u << 4) /**< button 4 is pressed */ +#define SDL_PEN_INPUT_BUTTON_5 (1u << 5) /**< button 5 is pressed */ +#define SDL_PEN_INPUT_ERASER_TIP (1u << 30) /**< eraser tip is used */ /** * Pen axis indices. @@ -87,20 +104,18 @@ typedef Uint32 SDL_PenInputFlags; * * `SDL_sinf(xtilt * SDL_PI_F / 180.0)`. * - * \since This enum is available since SDL 3.0.0 + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PenAxis { SDL_PEN_AXIS_PRESSURE, /**< Pen pressure. Unidirectional: 0 to 1.0 */ - SDL_PEN_AXIS_XTILT, /**< Pen horizontal tilt angle. Bidirectional: -90.0 to 90.0 (left-to-right). - The physical max/min tilt may be smaller than -90.0 / 90.0, check SDL_PenCapabilityInfo */ - SDL_PEN_AXIS_YTILT, /**< Pen vertical tilt angle. Bidirectional: -90.0 to 90.0 (top-to-down). - The physical max/min tilt may be smaller than -90.0 / 90.0 check SDL_PenCapabilityInfo */ + SDL_PEN_AXIS_XTILT, /**< Pen horizontal tilt angle. Bidirectional: -90.0 to 90.0 (left-to-right). */ + SDL_PEN_AXIS_YTILT, /**< Pen vertical tilt angle. Bidirectional: -90.0 to 90.0 (top-to-down). */ SDL_PEN_AXIS_DISTANCE, /**< Pen distance to drawing surface. Unidirectional: 0.0 to 1.0 */ SDL_PEN_AXIS_ROTATION, /**< Pen barrel rotation. Bidirectional: -180 to 179.9 (clockwise, 0 is facing up, -180.0 is facing down). */ SDL_PEN_AXIS_SLIDER, /**< Pen finger wheel or slider (e.g., Airbrush Pen). Unidirectional: 0 to 1.0 */ SDL_PEN_AXIS_TANGENTIAL_PRESSURE, /**< Pressure from squeezing the pen ("barrel pressure"). */ - SDL_PEN_NUM_AXES /**< Total known pen axis types in this version of SDL. This number may grow in future releases! */ + SDL_PEN_AXIS_COUNT /**< Total known pen axis types in this version of SDL. This number may grow in future releases! */ } SDL_PenAxis; /* Ends C function definitions when using C++ */ @@ -110,4 +125,3 @@ typedef enum SDL_PenAxis #endif /* SDL_pen_h_ */ -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pixels.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pixels.h index 3825dd5..b6f38ac 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pixels.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pixels.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,59 @@ /** * # CategoryPixels * - * Pixel management. + * SDL offers facilities for pixel management. + * + * Largely these facilities deal with pixel _format_: what does this set of + * bits represent? + * + * If you mostly want to think of a pixel as some combination of red, green, + * blue, and maybe alpha intensities, this is all pretty straightforward, and + * in many cases, is enough information to build a perfectly fine game. + * + * However, the actual definition of a pixel is more complex than that: + * + * Pixels are a representation of a color in a particular color space. + * + * The first characteristic of a color space is the color type. SDL + * understands two different color types, RGB and YCbCr, or in SDL also + * referred to as YUV. + * + * RGB colors consist of red, green, and blue channels of color that are added + * together to represent the colors we see on the screen. + * + * https://en.wikipedia.org/wiki/RGB_color_model + * + * YCbCr colors represent colors as a Y luma brightness component and red and + * blue chroma color offsets. This color representation takes advantage of the + * fact that the human eye is more sensitive to brightness than the color in + * an image. The Cb and Cr components are often compressed and have lower + * resolution than the luma component. + * + * https://en.wikipedia.org/wiki/YCbCr + * + * When the color information in YCbCr is compressed, the Y pixels are left at + * full resolution and each Cr and Cb pixel represents an average of the color + * information in a block of Y pixels. The chroma location determines where in + * that block of pixels the color information is coming from. + * + * The color range defines how much of the pixel to use when converting a + * pixel into a color on the display. When the full color range is used, the + * entire numeric range of the pixel bits is significant. When narrow color + * range is used, for historical reasons, the pixel uses only a portion of the + * numeric range to represent colors. + * + * The color primaries and white point are a definition of the colors in the + * color space relative to the standard XYZ color space. + * + * https://en.wikipedia.org/wiki/CIE_1931_color_space + * + * The transfer characteristic, or opto-electrical transfer function (OETF), + * is the way a color is converted from mathematically linear space into a + * non-linear output signals. + * + * https://en.wikipedia.org/wiki/Rec._709#Transfer_characteristics + * + * The matrix coefficients are used to convert between YCbCr and RGB colors. */ #ifndef SDL_pixels_h_ @@ -41,22 +93,44 @@ extern "C" { /** * A fully opaque 8-bit alpha value. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_ALPHA_TRANSPARENT */ #define SDL_ALPHA_OPAQUE 255 +/** + * A fully opaque floating point alpha value. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_ALPHA_TRANSPARENT_FLOAT + */ +#define SDL_ALPHA_OPAQUE_FLOAT 1.0f + /** * A fully transparent 8-bit alpha value. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_ALPHA_OPAQUE */ #define SDL_ALPHA_TRANSPARENT 0 -/** Pixel type. */ +/** + * A fully transparent floating point alpha value. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_ALPHA_OPAQUE_FLOAT + */ +#define SDL_ALPHA_TRANSPARENT_FLOAT 0.0f + +/** + * Pixel type. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_PixelType { SDL_PIXELTYPE_UNKNOWN, @@ -75,7 +149,11 @@ typedef enum SDL_PixelType SDL_PIXELTYPE_INDEX2 } SDL_PixelType; -/** Bitmap pixel order, high bit -> low bit. */ +/** + * Bitmap pixel order, high bit -> low bit. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_BitmapOrder { SDL_BITMAPORDER_NONE, @@ -83,7 +161,11 @@ typedef enum SDL_BitmapOrder SDL_BITMAPORDER_1234 } SDL_BitmapOrder; -/** Packed component order, high bit -> low bit. */ +/** + * Packed component order, high bit -> low bit. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_PackedOrder { SDL_PACKEDORDER_NONE, @@ -97,7 +179,11 @@ typedef enum SDL_PackedOrder SDL_PACKEDORDER_BGRA } SDL_PackedOrder; -/** Array component order, low byte -> high byte. */ +/** + * Array component order, low byte -> high byte. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_ArrayOrder { SDL_ARRAYORDER_NONE, @@ -109,7 +195,11 @@ typedef enum SDL_ArrayOrder SDL_ARRAYORDER_ABGR } SDL_ArrayOrder; -/** Packed component layout. */ +/** + * Packed component layout. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_PackedLayout { SDL_PACKEDLAYOUT_NONE, @@ -123,25 +213,172 @@ typedef enum SDL_PackedLayout SDL_PACKEDLAYOUT_1010102 } SDL_PackedLayout; +/** + * A macro for defining custom FourCC pixel formats. + * + * For example, defining SDL_PIXELFORMAT_YV12 looks like this: + * + * ```c + * SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2') + * ``` + * + * \param A the first character of the FourCC code. + * \param B the second character of the FourCC code. + * \param C the third character of the FourCC code. + * \param D the fourth character of the FourCC code. + * \returns a format value in the style of SDL_PixelFormat. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_DEFINE_PIXELFOURCC(A, B, C, D) SDL_FOURCC(A, B, C, D) +/** + * A macro for defining custom non-FourCC pixel formats. + * + * For example, defining SDL_PIXELFORMAT_RGBA8888 looks like this: + * + * ```c + * SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA, SDL_PACKEDLAYOUT_8888, 32, 4) + * ``` + * + * \param type the type of the new format, probably a SDL_PixelType value. + * \param order the order of the new format, probably a SDL_BitmapOrder, + * SDL_PackedOrder, or SDL_ArrayOrder value. + * \param layout the layout of the new format, probably an SDL_PackedLayout + * value or zero. + * \param bits the number of bits per pixel of the new format. + * \param bytes the number of bytes per pixel of the new format. + * \returns a format value in the style of SDL_PixelFormat. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #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) \ - (SDL_ISPIXELFORMAT_FOURCC(X) ? 0 : (((X) >> 8) & 0xFF)) -#define SDL_BYTESPERPIXEL(X) \ - (SDL_ISPIXELFORMAT_FOURCC(X) ? \ - ((((X) == SDL_PIXELFORMAT_YUY2) || \ - ((X) == SDL_PIXELFORMAT_UYVY) || \ - ((X) == SDL_PIXELFORMAT_YVYU) || \ - ((X) == SDL_PIXELFORMAT_P010)) ? 2 : 1) : (((X) >> 0) & 0xFF)) +/** + * A macro to retrieve the flags of an SDL_PixelFormat. + * + * This macro is generally not needed directly by an app, which should use + * specific tests, like SDL_ISPIXELFORMAT_FOURCC, instead. + * + * \param format an SDL_PixelFormat to check. + * \returns the flags of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PIXELFLAG(format) (((format) >> 28) & 0x0F) +/** + * A macro to retrieve the type of an SDL_PixelFormat. + * + * This is usually a value from the SDL_PixelType enumeration. + * + * \param format an SDL_PixelFormat to check. + * \returns the type of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PIXELTYPE(format) (((format) >> 24) & 0x0F) + +/** + * A macro to retrieve the order of an SDL_PixelFormat. + * + * This is usually a value from the SDL_BitmapOrder, SDL_PackedOrder, or + * SDL_ArrayOrder enumerations, depending on the format type. + * + * \param format an SDL_PixelFormat to check. + * \returns the order of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PIXELORDER(format) (((format) >> 20) & 0x0F) + +/** + * A macro to retrieve the layout of an SDL_PixelFormat. + * + * This is usually a value from the SDL_PackedLayout enumeration, or zero if a + * layout doesn't make sense for the format type. + * + * \param format an SDL_PixelFormat to check. + * \returns the layout of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PIXELLAYOUT(format) (((format) >> 16) & 0x0F) + +/** + * A macro to determine an SDL_PixelFormat's bits per pixel. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * FourCC formats will report zero here, as it rarely makes sense to measure + * them per-pixel. + * + * \param format an SDL_PixelFormat to check. + * \returns the bits-per-pixel of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_BYTESPERPIXEL + */ +#define SDL_BITSPERPIXEL(format) \ + (SDL_ISPIXELFORMAT_FOURCC(format) ? 0 : (((format) >> 8) & 0xFF)) + +/** + * A macro to determine an SDL_PixelFormat's bytes per pixel. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * FourCC formats do their best here, but many of them don't have a meaningful + * measurement of bytes per pixel. + * + * \param format an SDL_PixelFormat to check. + * \returns the bytes-per-pixel of `format`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_BITSPERPIXEL + */ +#define SDL_BYTESPERPIXEL(format) \ + (SDL_ISPIXELFORMAT_FOURCC(format) ? \ + ((((format) == SDL_PIXELFORMAT_YUY2) || \ + ((format) == SDL_PIXELFORMAT_UYVY) || \ + ((format) == SDL_PIXELFORMAT_YVYU) || \ + ((format) == SDL_PIXELFORMAT_P010)) ? 2 : 1) : (((format) >> 0) & 0xFF)) + + +/** + * A macro to determine if an SDL_PixelFormat is an indexed format. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format is indexed, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ISPIXELFORMAT_INDEXED(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \ @@ -149,12 +386,38 @@ typedef enum SDL_PackedLayout (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \ (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8))) +/** + * A macro to determine if an SDL_PixelFormat is a packed format. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format is packed, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #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))) +/** + * A macro to determine if an SDL_PixelFormat is an array format. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format is an array, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ISPIXELFORMAT_ARRAY(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8) || \ @@ -163,25 +426,84 @@ typedef enum SDL_PackedLayout (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)))) - +/** + * A macro to determine if an SDL_PixelFormat is a 10-bit format. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format is 10-bit, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ISPIXELFORMAT_10BIT(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32) && \ (SDL_PIXELLAYOUT(format) == SDL_PACKEDLAYOUT_2101010))) +/** + * A macro to determine if an SDL_PixelFormat is a floating point format. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format is 10-bit, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ISPIXELFORMAT_FLOAT(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16) || \ (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32))) -/* The flag is set to 1 because 0x1? is not in the printable ASCII range */ -#define SDL_ISPIXELFORMAT_FOURCC(format) \ +/** + * A macro to determine if an SDL_PixelFormat has an alpha channel. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format has alpha, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#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)))) + + +/** + * A macro to determine if an SDL_PixelFormat is a "FourCC" format. + * + * This covers custom and other unusual formats. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param format an SDL_PixelFormat to check. + * \returns true if the format has alpha, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISPIXELFORMAT_FOURCC(format) /* The flag is set to 1 because 0x1? is not in the printable ASCII range */ \ ((format) && (SDL_PIXELFLAG(format) != 1)) /* Note: If you modify this enum, update SDL_GetPixelFormatName() */ @@ -221,7 +543,7 @@ typedef enum SDL_PackedLayout * an alias for ABGR8888 on little-endian CPUs like x86, or an alias for * RGBA8888 on big-endian CPUs. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PixelFormat { @@ -351,59 +673,35 @@ typedef enum SDL_PixelFormat /* SDL_DEFINE_PIXELFOURCC('N', 'V', '2', '1'), */ SDL_PIXELFORMAT_P010 = 0x30313050u, /**< Planar mode: Y + U/V interleaved (2 planes) */ /* SDL_DEFINE_PIXELFOURCC('P', '0', '1', '0'), */ - SDL_PIXELFORMAT_EXTERNAL_OES = 0x2053454fu /**< Android video texture format */ + SDL_PIXELFORMAT_EXTERNAL_OES = 0x2053454fu, /**< Android video texture format */ /* SDL_DEFINE_PIXELFOURCC('O', 'E', 'S', ' ') */ + + /* 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, + SDL_PIXELFORMAT_RGBX32 = SDL_PIXELFORMAT_RGBX8888, + SDL_PIXELFORMAT_XRGB32 = SDL_PIXELFORMAT_XRGB8888, + SDL_PIXELFORMAT_BGRX32 = SDL_PIXELFORMAT_BGRX8888, + SDL_PIXELFORMAT_XBGR32 = SDL_PIXELFORMAT_XBGR8888 + #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, + SDL_PIXELFORMAT_RGBX32 = SDL_PIXELFORMAT_XBGR8888, + SDL_PIXELFORMAT_XRGB32 = SDL_PIXELFORMAT_BGRX8888, + SDL_PIXELFORMAT_BGRX32 = SDL_PIXELFORMAT_XRGB8888, + SDL_PIXELFORMAT_XBGR32 = SDL_PIXELFORMAT_RGBX8888 + #endif } SDL_PixelFormat; -/* Aliases for RGBA byte arrays of color data, for the current platform */ -#if SDL_BYTEORDER == SDL_BIG_ENDIAN -#define SDL_PIXELFORMAT_RGBA32 SDL_PIXELFORMAT_RGBA8888 -#define SDL_PIXELFORMAT_ARGB32 SDL_PIXELFORMAT_ARGB8888 -#define SDL_PIXELFORMAT_BGRA32 SDL_PIXELFORMAT_BGRA8888 -#define SDL_PIXELFORMAT_ABGR32 SDL_PIXELFORMAT_ABGR8888 -#define SDL_PIXELFORMAT_RGBX32 SDL_PIXELFORMAT_RGBX8888 -#define SDL_PIXELFORMAT_XRGB32 SDL_PIXELFORMAT_XRGB8888 -#define SDL_PIXELFORMAT_BGRX32 SDL_PIXELFORMAT_BGRX8888 -#define SDL_PIXELFORMAT_XBGR32 SDL_PIXELFORMAT_XBGR8888 -#else -#define SDL_PIXELFORMAT_RGBA32 SDL_PIXELFORMAT_ABGR8888 -#define SDL_PIXELFORMAT_ARGB32 SDL_PIXELFORMAT_BGRA8888 -#define SDL_PIXELFORMAT_BGRA32 SDL_PIXELFORMAT_ARGB8888 -#define SDL_PIXELFORMAT_ABGR32 SDL_PIXELFORMAT_RGBA8888 -#define SDL_PIXELFORMAT_RGBX32 SDL_PIXELFORMAT_XBGR8888 -#define SDL_PIXELFORMAT_XRGB32 SDL_PIXELFORMAT_BGRX8888 -#define SDL_PIXELFORMAT_BGRX32 SDL_PIXELFORMAT_XRGB8888 -#define SDL_PIXELFORMAT_XBGR32 SDL_PIXELFORMAT_RGBX8888 -#endif - -/** - * Pixels are a representation of a color in a particular color space. - * - * The first characteristic of a color space is the color type. SDL understands two different color types, RGB and YCbCr, or in SDL also referred to as YUV. - * - * RGB colors consist of red, green, and blue channels of color that are added together to represent the colors we see on the screen. - * https://en.wikipedia.org/wiki/RGB_color_model - * - * YCbCr colors represent colors as a Y luma brightness component and red and blue chroma color offsets. This color representation takes advantage of the fact that the human eye is more sensitive to brightness than the color in an image. The Cb and Cr components are often compressed and have lower resolution than the luma component. - * https://en.wikipedia.org/wiki/YCbCr - * - * When the color information in YCbCr is compressed, the Y pixels are left at full resolution and each Cr and Cb pixel represents an average of the color information in a block of Y pixels. The chroma location determines where in that block of pixels the color information is coming from. - * - * The color range defines how much of the pixel to use when converting a pixel into a color on the display. When the full color range is used, the entire numeric range of the pixel bits is significant. When narrow color range is used, for historical reasons, the pixel uses only a portion of the numeric range to represent colors. - * - * The color primaries and white point are a definition of the colors in the color space relative to the standard XYZ color space. - * https://en.wikipedia.org/wiki/CIE_1931_color_space - * - * The transfer characteristic, or opto-electrical transfer function (OETF), is the way a color is converted from mathematically linear space into a non-linear output signals. - * https://en.wikipedia.org/wiki/Rec._709#Transfer_characteristics - * - * The matrix coefficients are used to convert between YCbCr and RGB colors. - */ - /** * Colorspace color type. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ColorType { @@ -416,7 +714,7 @@ typedef enum SDL_ColorType * Colorspace color range, as described by * https://www.itu.int/rec/R-REC-BT.2100-2-201807-I/en * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ColorRange { @@ -429,7 +727,7 @@ typedef enum SDL_ColorRange * Colorspace color primaries, as described by * https://www.itu.int/rec/T-REC-H.273-201612-S/en * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ColorPrimaries { @@ -454,7 +752,7 @@ typedef enum SDL_ColorPrimaries * * These are as described by https://www.itu.int/rec/T-REC-H.273-201612-S/en * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_TransferCharacteristics { @@ -484,7 +782,7 @@ typedef enum SDL_TransferCharacteristics * * These are as described by https://www.itu.int/rec/T-REC-H.273-201612-S/en * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_MatrixCoefficients { @@ -508,7 +806,7 @@ typedef enum SDL_MatrixCoefficients /** * Colorspace chroma sample location. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ChromaLocation { @@ -520,22 +818,177 @@ typedef enum SDL_ChromaLocation /* Colorspace definition */ + +/** + * A macro for defining custom SDL_Colorspace formats. + * + * For example, defining SDL_COLORSPACE_SRGB looks like this: + * + * ```c + * SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_RGB, + * SDL_COLOR_RANGE_FULL, + * SDL_COLOR_PRIMARIES_BT709, + * SDL_TRANSFER_CHARACTERISTICS_SRGB, + * SDL_MATRIX_COEFFICIENTS_IDENTITY, + * SDL_CHROMA_LOCATION_NONE) + * ``` + * + * \param type the type of the new format, probably an SDL_ColorType value. + * \param range the range of the new format, probably a SDL_ColorRange value. + * \param primaries the primaries of the new format, probably an + * SDL_ColorPrimaries value. + * \param transfer the transfer characteristics of the new format, probably an + * SDL_TransferCharacteristics value. + * \param matrix the matrix coefficients of the new format, probably an + * SDL_MatrixCoefficients value. + * \param chroma the chroma sample location of the new format, probably an + * SDL_ChromaLocation value. + * \returns a format value in the style of SDL_Colorspace. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_DEFINE_COLORSPACE(type, range, primaries, transfer, matrix, chroma) \ (((Uint32)(type) << 28) | ((Uint32)(range) << 24) | ((Uint32)(chroma) << 20) | \ ((Uint32)(primaries) << 10) | ((Uint32)(transfer) << 5) | ((Uint32)(matrix) << 0)) -#define SDL_COLORSPACETYPE(X) (SDL_ColorType)(((X) >> 28) & 0x0F) -#define SDL_COLORSPACERANGE(X) (SDL_ColorRange)(((X) >> 24) & 0x0F) -#define SDL_COLORSPACECHROMA(X) (SDL_ChromaLocation)(((X) >> 20) & 0x0F) -#define SDL_COLORSPACEPRIMARIES(X) (SDL_ColorPrimaries)(((X) >> 10) & 0x1F) -#define SDL_COLORSPACETRANSFER(X) (SDL_TransferCharacteristics)(((X) >> 5) & 0x1F) -#define SDL_COLORSPACEMATRIX(X) (SDL_MatrixCoefficients)((X) & 0x1F) +/** + * A macro to retrieve the type of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_ColorType for `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACETYPE(cspace) (SDL_ColorType)(((cspace) >> 28) & 0x0F) -#define SDL_ISCOLORSPACE_MATRIX_BT601(X) (SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT601 || SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT470BG) -#define SDL_ISCOLORSPACE_MATRIX_BT709(X) (SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT709) -#define SDL_ISCOLORSPACE_MATRIX_BT2020_NCL(X) (SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT2020_NCL) -#define SDL_ISCOLORSPACE_LIMITED_RANGE(X) (SDL_COLORSPACERANGE(X) != SDL_COLOR_RANGE_FULL) -#define SDL_ISCOLORSPACE_FULL_RANGE(X) (SDL_COLORSPACERANGE(X) == SDL_COLOR_RANGE_FULL) +/** + * A macro to retrieve the range of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_ColorRange of `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACERANGE(cspace) (SDL_ColorRange)(((cspace) >> 24) & 0x0F) + +/** + * A macro to retrieve the chroma sample location of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_ChromaLocation of `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACECHROMA(cspace) (SDL_ChromaLocation)(((cspace) >> 20) & 0x0F) + +/** + * A macro to retrieve the primaries of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_ColorPrimaries of `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACEPRIMARIES(cspace) (SDL_ColorPrimaries)(((cspace) >> 10) & 0x1F) + +/** + * A macro to retrieve the transfer characteristics of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_TransferCharacteristics of `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACETRANSFER(cspace) (SDL_TransferCharacteristics)(((cspace) >> 5) & 0x1F) + +/** + * A macro to retrieve the matrix coefficients of an SDL_Colorspace. + * + * \param cspace an SDL_Colorspace to check. + * \returns the SDL_MatrixCoefficients of `cspace`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_COLORSPACEMATRIX(cspace) (SDL_MatrixCoefficients)((cspace) & 0x1F) + +/** + * A macro to determine if an SDL_Colorspace uses BT601 (or BT470BG) matrix + * coefficients. + * + * Note that this macro double-evaluates its parameter, so do not use + * expressions with side-effects here. + * + * \param cspace an SDL_Colorspace to check. + * \returns true if BT601 or BT470BG, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISCOLORSPACE_MATRIX_BT601(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT601 || SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT470BG) + +/** + * A macro to determine if an SDL_Colorspace uses BT709 matrix coefficients. + * + * \param cspace an SDL_Colorspace to check. + * \returns true if BT709, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISCOLORSPACE_MATRIX_BT709(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT709) + +/** + * A macro to determine if an SDL_Colorspace uses BT2020_NCL matrix + * coefficients. + * + * \param cspace an SDL_Colorspace to check. + * \returns true if BT2020_NCL, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISCOLORSPACE_MATRIX_BT2020_NCL(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT2020_NCL) + +/** + * A macro to determine if an SDL_Colorspace has a limited range. + * + * \param cspace an SDL_Colorspace to check. + * \returns true if limited range, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISCOLORSPACE_LIMITED_RANGE(cspace) (SDL_COLORSPACERANGE(cspace) != SDL_COLOR_RANGE_FULL) + +/** + * A macro to determine if an SDL_Colorspace has a full range. + * + * \param cspace an SDL_Colorspace to check. + * \returns true if full range, false otherwise. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_ISCOLORSPACE_FULL_RANGE(cspace) (SDL_COLORSPACERANGE(cspace) == SDL_COLOR_RANGE_FULL) /** * Colorspace definitions. @@ -544,7 +997,7 @@ typedef enum SDL_ChromaLocation * function, etc.), this is not an exhaustive list, but rather a * representative sample of the kinds of colorspaces supported in SDL. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_ColorPrimaries * \sa SDL_ColorRange @@ -631,7 +1084,7 @@ typedef enum SDL_Colorspace SDL_MATRIX_COEFFICIENTS_BT2020_NCL, SDL_CHROMA_LOCATION_LEFT), */ - SDL_COLORSPACE_BT2020_FULL = 0x22102609u /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 */ + SDL_COLORSPACE_BT2020_FULL = 0x22102609u, /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 */ /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_YCBCR, SDL_COLOR_RANGE_FULL, SDL_COLOR_PRIMARIES_BT2020, @@ -639,15 +1092,10 @@ typedef enum SDL_Colorspace SDL_MATRIX_COEFFICIENTS_BT2020_NCL, SDL_CHROMA_LOCATION_LEFT), */ + SDL_COLORSPACE_RGB_DEFAULT = SDL_COLORSPACE_SRGB, /**< The default colorspace for RGB surfaces if no colorspace is specified */ + SDL_COLORSPACE_YUV_DEFAULT = SDL_COLORSPACE_JPEG /**< The default colorspace for YUV surfaces if no colorspace is specified */ } SDL_Colorspace; - -/* The default colorspace for RGB surfaces if no colorspace is specified */ -#define SDL_COLORSPACE_RGB_DEFAULT SDL_COLORSPACE_SRGB - -/* The default colorspace for YUV surfaces if no colorspace is specified */ -#define SDL_COLORSPACE_YUV_DEFAULT SDL_COLORSPACE_JPEG - /** * A structure that represents a color as RGBA components. * @@ -656,7 +1104,7 @@ typedef enum SDL_Colorspace * (SDL_PIXELFORMAT_ABGR8888 on little-endian systems and * SDL_PIXELFORMAT_RGBA8888 on big-endian systems). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Color { @@ -670,7 +1118,7 @@ typedef struct SDL_Color * The bits of this structure can be directly reinterpreted as a float-packed * color which uses the SDL_PIXELFORMAT_RGBA128_FLOAT format * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_FColor { @@ -683,7 +1131,7 @@ typedef struct SDL_FColor /** * A set of indexed colors representing a palette. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_SetPaletteColors */ @@ -698,7 +1146,7 @@ typedef struct SDL_Palette /** * Details about the format of a pixel. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PixelFormatDetails { @@ -729,7 +1177,7 @@ typedef struct SDL_PixelFormatDetails * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetPixelFormatName(SDL_PixelFormat format); @@ -742,16 +1190,16 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetPixelFormatName(SDL_PixelFormat * \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 on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatForMasks */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetMasksForPixelFormat(SDL_PixelFormat format, int *bpp, Uint32 *Rmask, Uint32 *Gmask, Uint32 *Bmask, Uint32 *Amask); +extern SDL_DECLSPEC bool SDLCALL SDL_GetMasksForPixelFormat(SDL_PixelFormat format, int *bpp, Uint32 *Rmask, Uint32 *Gmask, Uint32 *Bmask, Uint32 *Amask); /** * Convert a bpp value and RGBA masks to an enumerated pixel format. @@ -769,7 +1217,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetMasksForPixelFormat(SDL_PixelFormat * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMasksForPixelFormat */ @@ -788,7 +1236,7 @@ extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetPixelFormatForMasks(int bpp, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const SDL_PixelFormatDetails * SDLCALL SDL_GetPixelFormatDetails(SDL_PixelFormat format); @@ -804,7 +1252,7 @@ extern SDL_DECLSPEC const SDL_PixelFormatDetails * SDLCALL SDL_GetPixelFormatDet * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyPalette * \sa SDL_SetPaletteColors @@ -819,15 +1267,15 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_CreatePalette(int ncolors); * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified or destroyed in another thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPaletteColors(SDL_Palette *palette, const SDL_Color *colors, int firstcolor, int ncolors); +extern SDL_DECLSPEC bool SDLCALL SDL_SetPaletteColors(SDL_Palette *palette, const SDL_Color *colors, int firstcolor, int ncolors); /** * Free a palette created with SDL_CreatePalette(). @@ -837,7 +1285,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPaletteColors(SDL_Palette *palette, * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified or destroyed in another thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePalette */ @@ -872,7 +1320,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyPalette(SDL_Palette *palette); * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGB @@ -911,7 +1359,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapRGB(const SDL_PixelFormatDetails *form * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGBA @@ -939,7 +1387,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormatDetails *for * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGBA @@ -971,7 +1419,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, const SDL_PixelFormatD * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGB diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform.h index bfdfa3a..e40f009 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -51,7 +51,7 @@ extern "C" { * \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 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetPlatform(void); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform_defines.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform_defines.h index e7f91cf..7e9a0a9 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform_defines.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform_defines.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -29,180 +29,450 @@ #define SDL_platform_defines_h_ #ifdef _AIX -#define SDL_PLATFORM_AIX 1 + +/** + * A preprocessor macro that is only defined if compiling for AIX. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_AIX 1 #endif + #ifdef __HAIKU__ -#define SDL_PLATFORM_HAIKU 1 + +/** + * A preprocessor macro that is only defined if compiling for Haiku OS. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_HAIKU 1 #endif + #if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) -#define SDL_PLATFORM_BSDI 1 + +/** + * A preprocessor macro that is only defined if compiling for BSDi + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_BSDI 1 #endif + #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) + +/** + * A preprocessor macro that is only defined if compiling for FreeBSD. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_FREEBSD 1 #endif + #if defined(hpux) || defined(__hpux) || defined(__hpux__) -#define SDL_PLATFORM_HPUX 1 + +/** + * A preprocessor macro that is only defined if compiling for HP-UX. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_HPUX 1 #endif + #if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) -#define SDL_PLATFORM_IRIX 1 + +/** + * A preprocessor macro that is only defined if compiling for IRIX. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_IRIX 1 #endif + #if (defined(linux) || defined(__linux) || defined(__linux__)) -#define SDL_PLATFORM_LINUX 1 + +/** + * A preprocessor macro that is only defined if compiling for Linux. + * + * Note that Android, although ostensibly a Linux-based system, will not + * define this. It defines SDL_PLATFORM_ANDROID instead. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_LINUX 1 #endif + #if defined(ANDROID) || defined(__ANDROID__) -#undef SDL_PLATFORM_LINUX /* do we need to do this? */ -#define SDL_PLATFORM_ANDROID 1 -#endif -#ifdef __NGAGE__ -#define SDL_PLATFORM_NGAGE 1 + +/** + * A preprocessor macro that is only defined if compiling for Android. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_ANDROID 1 +#undef SDL_PLATFORM_LINUX #endif #if defined(__unix__) || defined(__unix) || defined(unix) -#define SDL_PLATFORM_UNIX 1 + +/** + * A preprocessor macro that is only defined if compiling for a Unix-like + * system. + * + * Other platforms, like Linux, might define this in addition to their primary + * define. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_UNIX 1 #endif #ifdef __APPLE__ -#define SDL_PLATFORM_APPLE 1 + +/** + * A preprocessor macro that is only defined if compiling for Apple platforms. + * + * iOS, macOS, etc will additionally define a more specific platform macro. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_MACOS + * \sa SDL_PLATFORM_IOS + * \sa SDL_PLATFORM_TVOS + * \sa SDL_PLATFORM_VISIONOS + */ +#define SDL_PLATFORM_APPLE 1 + /* lets us know what version of macOS we're compiling on */ #include #ifndef __has_extension /* Older compilers don't support this */ -#define __has_extension(x) 0 -#include -#undef __has_extension + #define __has_extension(x) 0 + #include + #undef __has_extension #else -#include + #include #endif /* 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 + 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 + #define TARGET_OS_MACCATALYST 0 #endif #ifndef TARGET_OS_IOS -#define TARGET_OS_IOS 0 + #define TARGET_OS_IOS 0 #endif #ifndef TARGET_OS_IPHONE -#define TARGET_OS_IPHONE 0 + #define TARGET_OS_IPHONE 0 #endif #ifndef TARGET_OS_TV -#define TARGET_OS_TV 0 + #define TARGET_OS_TV 0 #endif #ifndef TARGET_OS_SIMULATOR -#define TARGET_OS_SIMULATOR 0 + #define TARGET_OS_SIMULATOR 0 #endif #ifndef TARGET_OS_VISION -#define TARGET_OS_VISION 0 + #define TARGET_OS_VISION 0 #endif #if TARGET_OS_TV -#define SDL_PLATFORM_TVOS 1 + +/** + * A preprocessor macro that is only defined if compiling for tvOS. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_APPLE + */ +#define SDL_PLATFORM_TVOS 1 #endif + #if TARGET_OS_VISION + +/** + * A preprocessor macro that is only defined if compiling for VisionOS. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_APPLE + */ #define SDL_PLATFORM_VISIONOS 1 #endif + #if TARGET_OS_IPHONE -#define SDL_PLATFORM_IOS 1 + +/** + * A preprocessor macro that is only defined if compiling for iOS. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_APPLE + */ +#define SDL_PLATFORM_IOS 1 + #else -#define SDL_PLATFORM_MACOS 1 + +/** + * A preprocessor macro that is only defined if compiling for macOS. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_APPLE + */ +#define SDL_PLATFORM_MACOS 1 + #if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 -# error SDL for macOS only supports deploying on 10.7 and above. + #error SDL for macOS only supports deploying on 10.7 and above. #endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1070 */ #endif /* TARGET_OS_IPHONE */ -#endif /* defined(SDL_PLATFORM_APPLE) */ +#endif /* defined(__APPLE__) */ #ifdef __EMSCRIPTEN__ + +/** + * A preprocessor macro that is only defined if compiling for Emscripten. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_EMSCRIPTEN 1 #endif + #ifdef __NetBSD__ + +/** + * A preprocessor macro that is only defined if compiling for NetBSD. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_NETBSD 1 #endif + #ifdef __OpenBSD__ -#define SDL_PLATFORM_OPENBSD 1 + +/** + * A preprocessor macro that is only defined if compiling for OpenBSD. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_OPENBSD 1 #endif + #if defined(__OS2__) || defined(__EMX__) -#define SDL_PLATFORM_OS2 1 + +/** + * A preprocessor macro that is only defined if compiling for OS/2. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_OS2 1 #endif + #if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) -#define SDL_PLATFORM_OSF 1 + +/** + * A preprocessor macro that is only defined if compiling for Tru64 (OSF/1). + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_OSF 1 #endif + #ifdef __QNXNTO__ + +/** + * A preprocessor macro that is only defined if compiling for QNX Neutrino. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_QNXNTO 1 #endif + #if defined(riscos) || defined(__riscos) || defined(__riscos__) + +/** + * A preprocessor macro that is only defined if compiling for RISC OS. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_RISCOS 1 #endif + #if defined(__sun) && defined(__SVR4) -#define SDL_PLATFORM_SOLARIS 1 + +/** + * A preprocessor macro that is only defined if compiling for SunOS/Solaris. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_SOLARIS 1 #endif #if defined(__CYGWIN__) + +/** + * A preprocessor macro that is only defined if compiling for Cygwin. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_CYGWIN 1 #endif #if defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN) -#define SDL_PLATFORM_WINDOWS 1 /* Win32 api and Windows-based OSs */ + +/** + * A preprocessor macro that is only defined if compiling for Windows. + * + * This also covers several other platforms, like Microsoft GDK, Xbox, WinRT, + * etc. Each will have their own more-specific platform macros, too. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PLATFORM_WIN32 + * \sa SDL_PLATFORM_XBOXONE + * \sa SDL_PLATFORM_XBOXSERIES + * \sa SDL_PLATFORM_WINGDK + * \sa SDL_PLATFORM_GDK + */ +#define SDL_PLATFORM_WINDOWS 1 /* 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 __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. */ + /* 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 + #define HAVE_WINAPIFAMILY_H 1 #else -#define HAVE_WINAPIFAMILY_H 0 + #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)) + #include + #define WINAPI_FAMILY_WINRT (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)) #else -#define WINAPI_FAMILY_WINRT 0 + #define WINAPI_FAMILY_WINRT 0 #endif /* HAVE_WINAPIFAMILY_H */ -#if HAVE_WINAPIFAMILY_H && HAVE_WINAPIFAMILY_H +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A preprocessor macro that defined to 1 if compiling for Windows Phone. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_WINAPI_FAMILY_PHONE (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) + +#elif defined(HAVE_WINAPIFAMILY_H) && HAVE_WINAPIFAMILY_H + #define SDL_WINAPI_FAMILY_PHONE (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) #else -#define SDL_WINAPI_FAMILY_PHONE 0 + #define SDL_WINAPI_FAMILY_PHONE 0 #endif #if WINAPI_FAMILY_WINRT -#define SDL_PLATFORM_WINRT 1 +#error Windows RT/UWP is no longer supported in SDL + #elif defined(_GAMING_DESKTOP) /* GDK project configuration always defines _GAMING_XXX */ + +/** + * A preprocessor macro that is only defined if compiling for Microsoft GDK + * for Windows. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_WINGDK 1 + #elif defined(_GAMING_XBOX_XBOXONE) -#define SDL_PLATFORM_XBOXONE 1 + +/** + * A preprocessor macro that is only defined if compiling for Xbox One. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_XBOXONE 1 + #elif defined(_GAMING_XBOX_SCARLETT) + +/** + * A preprocessor macro that is only defined if compiling for Xbox Series. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_PLATFORM_XBOXSERIES 1 + #else -#define SDL_PLATFORM_WIN32 1 + +/** + * A preprocessor macro that is only defined if compiling for desktop Windows. + * + * Despite the "32", this also covers 64-bit Windows; as an informal + * convention, its system layer tends to still be referred to as "the Win32 + * API." + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_WIN32 1 + #endif -#endif /* defined(WIN32) || defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN) */ +#endif /* defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN) */ + /* This is to support generic "any GDK" separate from a platform-specific GDK */ #if defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES) -#define SDL_PLATFORM_GDK 1 + +/** + * A preprocessor macro that is only defined if compiling for Microsoft GDK on + * any platform. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_GDK 1 #endif + #if defined(__PSP__) || defined(__psp__) -#define SDL_PLATFORM_PSP 1 + +/** + * A preprocessor macro that is only defined if compiling for Sony PSP. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_PSP 1 #endif + #if defined(__PS2__) || defined(PS2) -#define SDL_PLATFORM_PS2 1 + +/** + * A preprocessor macro that is only defined if compiling for Sony PlayStation + * 2. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_PS2 1 #endif #if defined(__vita__) || defined(__psp2__) -#define SDL_PLATFORM_VITA 1 + +/** + * A preprocessor macro that is only defined if compiling for Sony Vita. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_VITA 1 #endif #ifdef __3DS__ + +/** + * A preprocessor macro that is only defined if compiling for Nintendo 3DS. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PLATFORM_3DS 1 + #undef __3DS__ -#define SDL_PLATFORM_3DS 1 #endif #endif /* SDL_platform_defines_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_power.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_power.h index 1fdef78..4056ce3 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_power.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_power.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -26,6 +26,15 @@ * # CategoryPower * * SDL power management routines. + * + * There is a single function in this category: SDL_GetPowerInfo(). + * + * This function is useful for games on the go. This allows an app to know if + * it's running on a draining battery, which can be useful if the app wants to + * reduce processing, or perhaps framerate, to extend the duration of the + * battery's charge. Perhaps the app just wants to show a battery meter when + * fullscreen, or alert the user when the power is getting extremely low, so + * they can save their game. */ #include @@ -42,7 +51,7 @@ extern "C" { * * These are results returned by SDL_GetPowerInfo(). * - * \since This enum is available since SDL 3.0.0 + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PowerState { @@ -80,7 +89,7 @@ typedef enum SDL_PowerState * \returns the current battery state or `SDL_POWERSTATE_ERROR` on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetPowerInfo(int *seconds, int *percent); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_process.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_process.h new file mode 100644 index 0000000..2cc7739 --- /dev/null +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_process.h @@ -0,0 +1,430 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 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. +*/ + +/** + * # CategoryProcess + * + * Process control support. + * + * These functions provide a cross-platform way to spawn and manage OS-level + * processes. + * + * You can create a new subprocess with SDL_CreateProcess() and optionally + * read and write to it using SDL_ReadProcess() or SDL_GetProcessInput() and + * SDL_GetProcessOutput(). If more advanced functionality like chaining input + * between processes is necessary, you can use + * SDL_CreateProcessWithProperties(). + * + * You can get the status of a created process with SDL_WaitProcess(), or + * terminate the process with SDL_KillProcess(). + * + * Don't forget to call SDL_DestroyProcess() to clean up, whether the process + * process was killed, terminated on its own, or is still running! + */ + +#ifndef SDL_process_h_ +#define SDL_process_h_ + +#include +#include +#include +#include + +#include +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * An opaque handle representing a system process. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + */ +typedef struct SDL_Process SDL_Process; + +/** + * Create a new process. + * + * The path to the executable is supplied in args[0]. args[1..N] are + * additional arguments passed on the command line of the new process, and the + * argument list should be terminated with a NULL, e.g.: + * + * ```c + * const char *args[] = { "myprogram", "argument", NULL }; + * ``` + * + * Setting pipe_stdio to true is equivalent to setting + * `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER` and + * `SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER` to `SDL_PROCESS_STDIO_APP`, and + * will allow the use of SDL_ReadProcess() or SDL_GetProcessInput() and + * SDL_GetProcessOutput(). + * + * See SDL_CreateProcessWithProperties() for more details. + * + * \param args the path and arguments for the new process. + * \param pipe_stdio true to create pipes to the process's standard input and + * from the process's standard output, false for the process + * to have no input and inherit the application's standard + * output. + * \returns the newly created and running process, or NULL if the process + * couldn't be created. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcessWithProperties + * \sa SDL_GetProcessProperties + * \sa SDL_ReadProcess + * \sa SDL_GetProcessInput + * \sa SDL_GetProcessOutput + * \sa SDL_KillProcess + * \sa SDL_WaitProcess + * \sa SDL_DestroyProcess + */ +extern SDL_DECLSPEC SDL_Process *SDLCALL SDL_CreateProcess(const char * const *args, bool pipe_stdio); + +/** + * Description of where standard I/O should be directed when creating a + * process. + * + * If a standard I/O stream is set to SDL_PROCESS_STDIO_INHERITED, it will go + * to the same place as the application's I/O stream. This is the default for + * standard output and standard error. + * + * If a standard I/O stream is set to SDL_PROCESS_STDIO_NULL, it is connected + * to `NUL:` on Windows and `/dev/null` on POSIX systems. This is the default + * for standard input. + * + * If a standard I/O stream is set to SDL_PROCESS_STDIO_APP, it is connected + * to a new SDL_IOStream that is available to the application. Standard input + * will be available as `SDL_PROP_PROCESS_STDIN_POINTER` and allows + * SDL_GetProcessInput(), standard output will be available as + * `SDL_PROP_PROCESS_STDOUT_POINTER` and allows SDL_ReadProcess() and + * SDL_GetProcessOutput(), and standard error will be available as + * `SDL_PROP_PROCESS_STDERR_POINTER` in the properties for the created + * process. + * + * If a standard I/O stream is set to SDL_PROCESS_STDIO_REDIRECT, it is + * connected to an existing SDL_IOStream provided by the application. Standard + * input is provided using `SDL_PROP_PROCESS_CREATE_STDIN_POINTER`, standard + * output is provided using `SDL_PROP_PROCESS_CREATE_STDOUT_POINTER`, and + * standard error is provided using `SDL_PROP_PROCESS_CREATE_STDERR_POINTER` + * in the creation properties. These existing streams should be closed by the + * application once the new process is created. + * + * In order to use an SDL_IOStream with SDL_PROCESS_STDIO_REDIRECT, it must + * have `SDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER` or + * `SDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER` set. This is true for streams + * representing files and process I/O. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_CreateProcessWithProperties + * \sa SDL_GetProcessProperties + * \sa SDL_ReadProcess + * \sa SDL_GetProcessInput + * \sa SDL_GetProcessOutput + */ +typedef enum SDL_ProcessIO +{ + SDL_PROCESS_STDIO_INHERITED, /**< The I/O stream is inherited from the application. */ + SDL_PROCESS_STDIO_NULL, /**< The I/O stream is ignored. */ + SDL_PROCESS_STDIO_APP, /**< The I/O stream is connected to a new SDL_IOStream that the application can read or write */ + SDL_PROCESS_STDIO_REDIRECT /**< The I/O stream is redirected to an existing SDL_IOStream. */ +} SDL_ProcessIO; + +/** + * Create a new process with the specified properties. + * + * These are the supported properties: + * + * - `SDL_PROP_PROCESS_CREATE_ARGS_POINTER`: an array of strings containing + * the program to run, any arguments, and a NULL pointer, e.g. const char + * *args[] = { "myprogram", "argument", NULL }. This is a required property. + * - `SDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER`: an SDL_Environment + * pointer. If this property is set, it will be the entire environment for + * the process, otherwise the current environment is used. + * - `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER`: an SDL_ProcessIO value describing + * where standard input for the process comes from, defaults to + * `SDL_PROCESS_STDIO_NULL`. + * - `SDL_PROP_PROCESS_CREATE_STDIN_POINTER`: an SDL_IOStream pointer used for + * standard input when `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER` is set to + * `SDL_PROCESS_STDIO_REDIRECT`. + * - `SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER`: an SDL_ProcessIO value + * describing where standard output for the process goes go, defaults to + * `SDL_PROCESS_STDIO_INHERITED`. + * - `SDL_PROP_PROCESS_CREATE_STDOUT_POINTER`: an SDL_IOStream pointer used + * for standard output when `SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER` is set + * to `SDL_PROCESS_STDIO_REDIRECT`. + * - `SDL_PROP_PROCESS_CREATE_STDERR_NUMBER`: an SDL_ProcessIO value + * describing where standard error for the process goes go, defaults to + * `SDL_PROCESS_STDIO_INHERITED`. + * - `SDL_PROP_PROCESS_CREATE_STDERR_POINTER`: an SDL_IOStream pointer used + * for standard error when `SDL_PROP_PROCESS_CREATE_STDERR_NUMBER` is set to + * `SDL_PROCESS_STDIO_REDIRECT`. + * - `SDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN`: true if the error + * output of the process should be redirected into the standard output of + * the process. This property has no effect if + * `SDL_PROP_PROCESS_CREATE_STDERR_NUMBER` is set. + * - `SDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN`: true if the process should + * run in the background. In this case the default input and output is + * `SDL_PROCESS_STDIO_NULL` and the exitcode of the process is not + * available, and will always be 0. + * + * On POSIX platforms, wait() and waitpid(-1, ...) should not be called, and + * SIGCHLD should not be ignored or handled because those would prevent SDL + * from properly tracking the lifetime of the underlying process. You should + * use SDL_WaitProcess() instead. + * + * \param props the properties to use. + * \returns the newly created and running process, or NULL if the process + * couldn't be created. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_GetProcessProperties + * \sa SDL_ReadProcess + * \sa SDL_GetProcessInput + * \sa SDL_GetProcessOutput + * \sa SDL_KillProcess + * \sa SDL_WaitProcess + * \sa SDL_DestroyProcess + */ +extern SDL_DECLSPEC SDL_Process *SDLCALL SDL_CreateProcessWithProperties(SDL_PropertiesID props); + +#define SDL_PROP_PROCESS_CREATE_ARGS_POINTER "SDL.process.create.args" +#define SDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER "SDL.process.create.environment" +#define SDL_PROP_PROCESS_CREATE_STDIN_NUMBER "SDL.process.create.stdin_option" +#define SDL_PROP_PROCESS_CREATE_STDIN_POINTER "SDL.process.create.stdin_source" +#define SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER "SDL.process.create.stdout_option" +#define SDL_PROP_PROCESS_CREATE_STDOUT_POINTER "SDL.process.create.stdout_source" +#define SDL_PROP_PROCESS_CREATE_STDERR_NUMBER "SDL.process.create.stderr_option" +#define SDL_PROP_PROCESS_CREATE_STDERR_POINTER "SDL.process.create.stderr_source" +#define SDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN "SDL.process.create.stderr_to_stdout" +#define SDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN "SDL.process.create.background" + +/** + * Get the properties associated with a process. + * + * The following read-only properties are provided by SDL: + * + * - `SDL_PROP_PROCESS_PID_NUMBER`: the process ID of the process. + * - `SDL_PROP_PROCESS_STDIN_POINTER`: an SDL_IOStream that can be used to + * write input to the process, if it was created with + * `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER` set to `SDL_PROCESS_STDIO_APP`. + * - `SDL_PROP_PROCESS_STDOUT_POINTER`: a non-blocking SDL_IOStream that can + * be used to read output from the process, if it was created with + * `SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER` set to `SDL_PROCESS_STDIO_APP`. + * - `SDL_PROP_PROCESS_STDERR_POINTER`: a non-blocking SDL_IOStream that can + * be used to read error output from the process, if it was created with + * `SDL_PROP_PROCESS_CREATE_STDERR_NUMBER` set to `SDL_PROCESS_STDIO_APP`. + * - `SDL_PROP_PROCESS_BACKGROUND_BOOLEAN`: true if the process is running in + * the background. + * + * \param process the process to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetProcessProperties(SDL_Process *process); + +#define SDL_PROP_PROCESS_PID_NUMBER "SDL.process.pid" +#define SDL_PROP_PROCESS_STDIN_POINTER "SDL.process.stdin" +#define SDL_PROP_PROCESS_STDOUT_POINTER "SDL.process.stdout" +#define SDL_PROP_PROCESS_STDERR_POINTER "SDL.process.stderr" +#define SDL_PROP_PROCESS_BACKGROUND_BOOLEAN "SDL.process.background" + +/** + * Read all the output from a process. + * + * If a process was created with I/O enabled, you can use this function to + * read the output. This function blocks until the process is complete, + * capturing all output, and providing the process exit code. + * + * 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 process The process to read. + * \param datasize a pointer filled in with the number of bytes read, may be + * NULL. + * \param exitcode a pointer filled in with the process exit code if the + * process has exited, may be NULL. + * \returns the data or NULL on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_DestroyProcess + */ +extern SDL_DECLSPEC void * SDLCALL SDL_ReadProcess(SDL_Process *process, size_t *datasize, int *exitcode); + +/** + * Get the SDL_IOStream associated with process standard input. + * + * The process must have been created with SDL_CreateProcess() and pipe_stdio + * set to true, or with SDL_CreateProcessWithProperties() and + * `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER` set to `SDL_PROCESS_STDIO_APP`. + * + * Writing to this stream can return less data than expected if the process + * hasn't read its input. It may be blocked waiting for its output to be read, + * if so you may need to call SDL_GetProcessOutput() and read the output in + * parallel with writing input. + * + * \param process The process to get the input stream for. + * \returns the input stream or NULL on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_GetProcessOutput + */ +extern SDL_DECLSPEC SDL_IOStream *SDLCALL SDL_GetProcessInput(SDL_Process *process); + +/** + * Get the SDL_IOStream associated with process standard output. + * + * The process must have been created with SDL_CreateProcess() and pipe_stdio + * set to true, or with SDL_CreateProcessWithProperties() and + * `SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER` set to `SDL_PROCESS_STDIO_APP`. + * + * Reading from this stream can return 0 with SDL_GetIOStatus() returning + * SDL_IO_STATUS_NOT_READY if no output is available yet. + * + * \param process The process to get the output stream for. + * \returns the output stream or NULL on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_GetProcessInput + */ +extern SDL_DECLSPEC SDL_IOStream *SDLCALL SDL_GetProcessOutput(SDL_Process *process); + +/** + * Stop a process. + * + * \param process The process to stop. + * \param force true to terminate the process immediately, false to try to + * stop the process gracefully. In general you should try to stop + * the process gracefully first as terminating a process may + * leave it with half-written data or in some other unstable + * state. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_WaitProcess + * \sa SDL_DestroyProcess + */ +extern SDL_DECLSPEC bool SDLCALL SDL_KillProcess(SDL_Process *process, bool force); + +/** + * Wait for a process to finish. + * + * This can be called multiple times to get the status of a process. + * + * The exit code will be the exit code of the process if it terminates + * normally, a negative signal if it terminated due to a signal, or -255 + * otherwise. It will not be changed if the process is still running. + * + * If you create a process with standard output piped to the application + * (`pipe_stdio` being true) then you should read all of the process output + * before calling SDL_WaitProcess(). If you don't do this the process might be + * blocked indefinitely waiting for output to be read and SDL_WaitProcess() + * will never return true; + * + * \param process The process to wait for. + * \param block If true, block until the process finishes; otherwise, report + * on the process' status. + * \param exitcode a pointer filled in with the process exit code if the + * process has exited, may be NULL. + * \returns true if the process exited, false otherwise. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_KillProcess + * \sa SDL_DestroyProcess + */ +extern SDL_DECLSPEC bool SDLCALL SDL_WaitProcess(SDL_Process *process, bool block, int *exitcode); + +/** + * Destroy a previously created process object. + * + * Note that this does not stop the process, just destroys the SDL object used + * to track it. If you want to stop the process you should use + * SDL_KillProcess(). + * + * \param process The process object to destroy. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateProcess + * \sa SDL_CreateProcessWithProperties + * \sa SDL_KillProcess + */ +extern SDL_DECLSPEC void SDLCALL SDL_DestroyProcess(SDL_Process *process); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include + +#endif /* SDL_process_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_properties.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_properties.h index c3a2c82..1f47d5f 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_properties.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_properties.h @@ -1,6 +1,6 @@ /* - Simple DiretMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2025 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 @@ -61,14 +61,14 @@ extern "C" { /** * SDL properties ID * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_PropertiesID; /** * SDL property type * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PropertyType { @@ -86,7 +86,7 @@ typedef enum SDL_PropertyType * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGlobalProperties(void); @@ -100,7 +100,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGlobalProperties(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyProperties */ @@ -116,14 +116,14 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_CreateProperties(void); * * \param src the properties to copy. * \param dst the destination properties. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyProperties(SDL_PropertiesID src, SDL_PropertiesID dst); +extern SDL_DECLSPEC bool SDLCALL SDL_CopyProperties(SDL_PropertiesID src, SDL_PropertiesID dst); /** * Lock a group of properties. @@ -138,16 +138,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyProperties(SDL_PropertiesID src, SD * thread. * * \param props the properties to lock. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UnlockProperties */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockProperties(SDL_PropertiesID props); +extern SDL_DECLSPEC bool SDLCALL SDL_LockProperties(SDL_PropertiesID props); /** * Unlock a group of properties. @@ -156,7 +156,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockProperties(SDL_PropertiesID props); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockProperties */ @@ -180,7 +180,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockProperties(SDL_PropertiesID props); * \threadsafety This callback may fire without any locks held; if this is a * concern, the app should provide its own locking. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetPointerPropertyWithCleanup */ @@ -204,18 +204,18 @@ typedef void (SDLCALL *SDL_CleanupPropertyCallback)(void *userdata, void *value) * \param cleanup the function to call when this property is deleted, or NULL * if no cleanup is necessary. * \param userdata a pointer that is passed to the cleanup function. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPointerProperty * \sa SDL_SetPointerProperty * \sa SDL_CleanupPropertyCallback */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPointerPropertyWithCleanup(SDL_PropertiesID props, const char *name, void *value, SDL_CleanupPropertyCallback cleanup, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_SetPointerPropertyWithCleanup(SDL_PropertiesID props, const char *name, void *value, SDL_CleanupPropertyCallback cleanup, void *userdata); /** * Set a pointer property in a group of properties. @@ -223,12 +223,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPointerPropertyWithCleanup(SDL_Prope * \param props the properties to modify. * \param name the name of the property to modify. * \param value the new value of the property, or NULL to delete the property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPointerProperty * \sa SDL_HasProperty @@ -238,7 +238,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPointerPropertyWithCleanup(SDL_Prope * \sa SDL_SetPointerPropertyWithCleanup * \sa SDL_SetStringProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPointerProperty(SDL_PropertiesID props, const char *name, void *value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetPointerProperty(SDL_PropertiesID props, const char *name, void *value); /** * Set a string property in a group of properties. @@ -249,16 +249,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetPointerProperty(SDL_PropertiesID pro * \param props the properties to modify. * \param name the name of the property to modify. * \param value the new value of the property, or NULL to delete the property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetStringProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetStringProperty(SDL_PropertiesID props, const char *name, const char *value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetStringProperty(SDL_PropertiesID props, const char *name, const char *value); /** * Set an integer property in a group of properties. @@ -266,16 +266,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetStringProperty(SDL_PropertiesID prop * \param props the properties to modify. * \param name the name of the property to modify. * \param value the new value of the property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumberProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetNumberProperty(SDL_PropertiesID props, const char *name, Sint64 value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetNumberProperty(SDL_PropertiesID props, const char *name, Sint64 value); /** * Set a floating point property in a group of properties. @@ -283,16 +283,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetNumberProperty(SDL_PropertiesID prop * \param props the properties to modify. * \param name the name of the property to modify. * \param value the new value of the property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetFloatProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetFloatProperty(SDL_PropertiesID props, const char *name, float value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetFloatProperty(SDL_PropertiesID props, const char *name, float value); /** * Set a boolean property in a group of properties. @@ -300,31 +300,31 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetFloatProperty(SDL_PropertiesID props * \param props the properties to modify. * \param name the name of the property to modify. * \param value the new value of the property. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetBooleanProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetBooleanProperty(SDL_PropertiesID props, const char *name, SDL_bool value); +extern SDL_DECLSPEC bool SDLCALL SDL_SetBooleanProperty(SDL_PropertiesID props, const char *name, bool value); /** * Return whether a property exists in a group of properties. * * \param props the properties to query. * \param name the name of the property to query. - * \returns SDL_TRUE if the property exists, or SDL_FALSE if it doesn't. + * \returns true if the property exists, or false if it doesn't. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasProperty(SDL_PropertiesID props, const char *name); +extern SDL_DECLSPEC bool SDLCALL SDL_HasProperty(SDL_PropertiesID props, const char *name); /** * Get the type of a property in a group of properties. @@ -336,7 +336,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasProperty(SDL_PropertiesID props, con * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasProperty */ @@ -363,7 +363,7 @@ extern SDL_DECLSPEC SDL_PropertyType SDLCALL SDL_GetPropertyType(SDL_PropertiesI * If you need to avoid this, use SDL_LockProperties() and * SDL_UnlockProperties(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetBooleanProperty * \sa SDL_GetFloatProperty @@ -391,7 +391,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetPointerProperty(SDL_PropertiesID props * If you need to avoid this, use SDL_LockProperties() and * SDL_UnlockProperties(). * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty @@ -413,7 +413,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetStringProperty(SDL_PropertiesID * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty @@ -435,7 +435,7 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetNumberProperty(SDL_PropertiesID props, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty @@ -457,27 +457,27 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetFloatProperty(SDL_PropertiesID props, c * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty * \sa SDL_SetBooleanProperty */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetBooleanProperty(SDL_PropertiesID props, const char *name, SDL_bool default_value); +extern SDL_DECLSPEC bool SDLCALL SDL_GetBooleanProperty(SDL_PropertiesID props, const char *name, bool default_value); /** * Clear a property from a group of properties. * * \param props the properties to modify. * \param name the name of the property to clear. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearProperty(SDL_PropertiesID props, const char *name); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearProperty(SDL_PropertiesID props, const char *name); /** * A callback used to enumerate all the properties in a group of properties. @@ -492,7 +492,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearProperty(SDL_PropertiesID props, c * \threadsafety SDL_EnumerateProperties holds a lock on `props` during this * callback. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_EnumerateProperties */ @@ -507,14 +507,14 @@ typedef void (SDLCALL *SDL_EnumeratePropertiesCallback)(void *userdata, SDL_Prop * \param props the properties to query. * \param callback the function to call for each property. * \param userdata a pointer that is passed to `callback`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnumerateProperties(SDL_PropertiesID props, SDL_EnumeratePropertiesCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateProperties(SDL_PropertiesID props, SDL_EnumeratePropertiesCallback callback, void *userdata); /** * Destroy a group of properties. @@ -528,7 +528,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnumerateProperties(SDL_PropertiesID pr * locked or other threads might be setting or getting values * from these properties. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_rect.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_rect.h index ea97df9..8998de6 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_rect.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_rect.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,7 +23,7 @@ * # CategoryRect * * Some helper functions for managing rectangles and 2D points, in both - * interger and floating point versions. + * integer and floating point versions. */ #ifndef SDL_rect_h_ @@ -41,7 +41,7 @@ extern "C" { /** * The structure that defines a point (using integers). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetRectEnclosingPoints * \sa SDL_PointInRect @@ -55,7 +55,7 @@ typedef struct SDL_Point /** * The structure that defines a point (using floating point values). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetRectEnclosingPointsFloat * \sa SDL_PointInRectFloat @@ -70,7 +70,7 @@ typedef struct SDL_FPoint /** * A rectangle, with the origin at the upper left (using integers). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_RectEmpty * \sa SDL_RectsEqual @@ -91,7 +91,7 @@ typedef struct SDL_Rect * A rectangle, with the origin at the upper left (using floating point * values). * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_RectEmptyFloat * \sa SDL_RectsEqualFloat @@ -121,7 +121,7 @@ typedef struct SDL_FRect * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE void SDL_RectToFRect(const SDL_Rect *rect, SDL_FRect *frect) { @@ -146,16 +146,16 @@ SDL_FORCE_INLINE void SDL_RectToFRect(const SDL_Rect *rect, SDL_FRect *frect) * * \param p the point to test. * \param r the rectangle to test. - * \returns SDL_TRUE if `p` is contained by `r`, SDL_FALSE otherwise. + * \returns true if `p` is contained by `r`, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) +SDL_FORCE_INLINE bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) { return ( p && r && (p->x >= r->x) && (p->x < (r->x + r->w)) && - (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? SDL_TRUE : SDL_FALSE; + (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? true : false; } /** @@ -170,15 +170,15 @@ SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) * be able to find this function inside SDL itself). * * \param r the rectangle to test. - * \returns SDL_TRUE if the rectangle is "empty", SDL_FALSE otherwise. + * \returns true if the rectangle is "empty", false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r) +SDL_FORCE_INLINE bool SDL_RectEmpty(const SDL_Rect *r) { - return ((!r) || (r->w <= 0) || (r->h <= 0)) ? SDL_TRUE : SDL_FALSE; + return ((!r) || (r->w <= 0) || (r->h <= 0)) ? true : false; } /** @@ -194,51 +194,51 @@ SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r) * * \param a the first rectangle to test. * \param b the second rectangle to test. - * \returns SDL_TRUE if the rectangles are equal, SDL_FALSE otherwise. + * \returns true if the rectangles are equal, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_RectsEqual(const SDL_Rect *a, const SDL_Rect *b) +SDL_FORCE_INLINE bool SDL_RectsEqual(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; + (a->w == b->w) && (a->h == b->h)) ? true : false; } /** * Determine whether two rectangles intersect. * - * If either pointer is NULL the function will return SDL_FALSE. + * If either pointer is NULL the function will return 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. + * \returns true if there is an intersection, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRectIntersection */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasRectIntersection(const SDL_Rect *A, const SDL_Rect *B); +extern SDL_DECLSPEC bool SDLCALL SDL_HasRectIntersection(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. + * If `result` is NULL then this function will return 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. + * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasRectIntersection */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectIntersection(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectIntersection(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result); /** * Calculate the union of two rectangles. @@ -247,12 +247,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectIntersection(const SDL_Rect *A, * \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`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result); /** * Calculate a minimal rectangle enclosing a set of points. @@ -266,12 +266,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const S * \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. + * \returns true if any points were enclosed or false if all the points were + * outside of the clipping rectangle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point *points, int count, const SDL_Rect *clip, SDL_Rect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point *points, int count, const SDL_Rect *clip, SDL_Rect *result); /** * Calculate the intersection of a rectangle and line segment. @@ -287,11 +287,11 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point * \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. + * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectAndLineIntersection(const SDL_Rect *rect, int *X1, int *Y1, int *X2, int *Y2); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersection(const SDL_Rect *rect, int *X1, int *Y1, int *X2, int *Y2); /* SDL_FRect versions... */ @@ -311,16 +311,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectAndLineIntersection(const SDL_Re * * \param p the point to test. * \param r the rectangle to test. - * \returns SDL_TRUE if `p` is contained by `r`, SDL_FALSE otherwise. + * \returns true if `p` is contained by `r`, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_PointInRectFloat(const SDL_FPoint *p, const SDL_FRect *r) +SDL_FORCE_INLINE bool SDL_PointInRectFloat(const SDL_FPoint *p, const SDL_FRect *r) { return ( p && r && (p->x >= r->x) && (p->x <= (r->x + r->w)) && - (p->y >= r->y) && (p->y <= (r->y + r->h)) ) ? SDL_TRUE : SDL_FALSE; + (p->y >= r->y) && (p->y <= (r->y + r->h)) ) ? true : false; } /** @@ -335,15 +335,15 @@ SDL_FORCE_INLINE SDL_bool SDL_PointInRectFloat(const SDL_FPoint *p, const SDL_FR * be able to find this function inside SDL itself). * * \param r the rectangle to test. - * \returns SDL_TRUE if the rectangle is "empty", SDL_FALSE otherwise. + * \returns true if the rectangle is "empty", false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE SDL_bool SDL_RectEmptyFloat(const SDL_FRect *r) +SDL_FORCE_INLINE bool SDL_RectEmptyFloat(const SDL_FRect *r) { - return ((!r) || (r->w < 0.0f) || (r->h < 0.0f)) ? SDL_TRUE : SDL_FALSE; + return ((!r) || (r->w < 0.0f) || (r->h < 0.0f)) ? true : false; } /** @@ -363,22 +363,22 @@ SDL_FORCE_INLINE SDL_bool SDL_RectEmptyFloat(const SDL_FRect *r) * \param a the first rectangle to test. * \param b the second rectangle to test. * \param epsilon the epsilon value for comparison. - * \returns SDL_TRUE if the rectangles are equal, SDL_FALSE otherwise. + * \returns true if the rectangles are equal, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RectsEqualFloat */ -SDL_FORCE_INLINE SDL_bool SDL_RectsEqualEpsilon(const SDL_FRect *a, const SDL_FRect *b, const float epsilon) +SDL_FORCE_INLINE bool SDL_RectsEqualEpsilon(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; + ? true : false; } /** @@ -398,15 +398,15 @@ SDL_FORCE_INLINE SDL_bool SDL_RectsEqualEpsilon(const SDL_FRect *a, const SDL_FR * * \param a the first rectangle to test. * \param b the second rectangle to test. - * \returns SDL_TRUE if the rectangles are equal, SDL_FALSE otherwise. + * \returns true if the rectangles are equal, false otherwise. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RectsEqualEpsilon */ -SDL_FORCE_INLINE SDL_bool SDL_RectsEqualFloat(const SDL_FRect *a, const SDL_FRect *b) +SDL_FORCE_INLINE bool SDL_RectsEqualFloat(const SDL_FRect *a, const SDL_FRect *b) { return SDL_RectsEqualEpsilon(a, b, SDL_FLT_EPSILON); } @@ -414,34 +414,34 @@ SDL_FORCE_INLINE SDL_bool SDL_RectsEqualFloat(const SDL_FRect *a, const SDL_FRec /** * Determine whether two rectangles intersect with float precision. * - * If either pointer is NULL the function will return SDL_FALSE. + * If either pointer is NULL the function will return 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. + * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRectIntersection */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasRectIntersectionFloat(const SDL_FRect *A, const SDL_FRect *B); +extern SDL_DECLSPEC bool SDLCALL SDL_HasRectIntersectionFloat(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. + * If `result` is NULL then this function will return 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. + * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasRectIntersectionFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectIntersectionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectIntersectionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result); /** * Calculate the union of two rectangles with float precision. @@ -450,12 +450,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectIntersectionFloat(const SDL_FRec * \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`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result); /** * Calculate a minimal rectangle enclosing a set of points with float @@ -470,12 +470,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, c * \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. + * \returns true if any points were enclosed or false if all the points were + * outside of the clipping rectangle. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_FPoint *points, int count, const SDL_FRect *clip, SDL_FRect *result); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_FPoint *points, int count, const SDL_FRect *clip, SDL_FRect *result); /** * Calculate the intersection of a rectangle and line segment with float @@ -492,11 +492,11 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_F * \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. + * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRectAndLineIntersectionFloat(const SDL_FRect *rect, float *X1, float *Y1, float *X2, float *Y2); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersectionFloat(const SDL_FRect *rect, float *X1, float *Y1, float *X2, float *Y2); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_render.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_render.h index 706308c..891e994 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_render.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_render.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -40,8 +40,8 @@ * * 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. + * should use SDL's OpenGL/Direct3D support, the SDL3 GPU API, or one of the + * many good 3D engines. * * These functions must be called from the main thread. See this bug for * details: https://github.com/libsdl-org/SDL/issues/986 @@ -51,10 +51,13 @@ #define SDL_render_h_ #include +#include #include #include +#include #include #include +#include #include #include @@ -66,14 +69,14 @@ extern "C" { /** * The name of the software renderer. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SOFTWARE_RENDERER "software" /** * Vertex structure. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Vertex { @@ -85,7 +88,7 @@ typedef struct SDL_Vertex /** * The access pattern allowed for a texture. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_TextureAccess { @@ -97,7 +100,7 @@ typedef enum SDL_TextureAccess /** * How the logical size is mapped to the output. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_RendererLogicalPresentation { @@ -111,15 +114,32 @@ typedef enum SDL_RendererLogicalPresentation /** * A structure representing rendering state * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Renderer SDL_Renderer; +#ifndef SDL_INTERNAL + /** * An efficient driver-specific representation of pixel data * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateTexture + * \sa SDL_CreateTextureFromSurface + * \sa SDL_CreateTextureWithProperties + * \sa SDL_DestroyTexture */ +struct SDL_Texture +{ + SDL_PixelFormat format; /**< The format of the texture, read-only */ + int w; /**< The width of the texture, read-only. */ + int h; /**< The height of the texture, read-only. */ + + int refcount; /**< Application reference count, used when freeing texture */ +}; +#endif /* !SDL_INTERNAL */ + typedef struct SDL_Texture SDL_Texture; /* Function prototypes */ @@ -135,7 +155,9 @@ typedef struct SDL_Texture SDL_Texture; * * \returns the number of built in render drivers. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_GetRenderDriver @@ -158,7 +180,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumRenderDrivers(void); * \returns the name of the rendering driver at the requested index, or NULL * if an invalid index was specified. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumRenderDrivers */ @@ -174,36 +198,43 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetRenderDriver(int index); * 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_CreateWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CreateWindowAndRenderer(const char *title, int width, int height, SDL_WindowFlags window_flags, SDL_Window **window, SDL_Renderer **renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_CreateWindowAndRenderer(const char *title, int width, int height, SDL_WindowFlags window_flags, SDL_Window **window, SDL_Renderer **renderer); /** * Create a 2D rendering context for a window. * * If you want a specific renderer, you can specify its name here. A list of - * available renderers can be obtained by calling SDL_GetRenderDriver multiple - * times, with indices from 0 to SDL_GetNumRenderDrivers()-1. If you don't - * need a specific renderer, specify NULL and SDL will attempt to choose the - * best option for you, based on what is available on the user's system. + * available renderers can be obtained by calling SDL_GetRenderDriver() + * multiple times, with indices from 0 to SDL_GetNumRenderDrivers()-1. If you + * don't need a specific renderer, specify NULL and SDL will attempt to choose + * the best option for you, based on what is available on the user's system. + * + * If `name` is a comma-separated list, SDL will try each name, in the order + * listed, until one succeeds or all of them fail. * * By default the rendering size matches the window size in pixels, but you * can call SDL_SetRenderLogicalPresentation() to change the content size and * scaling options. * * \param window the window where rendering is displayed. - * \param name the name of the rendering driver to initialize, or NULL to - * initialize the first one supporting the requested flags. + * \param name the name of the rendering driver to initialize, or NULL to let + * SDL choose one. * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRendererWithProperties * \sa SDL_CreateSoftwareRenderer @@ -225,7 +256,7 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window *window * displayed, required if this isn't a software renderer using a surface * - `SDL_PROP_RENDERER_CREATE_SURFACE_POINTER`: the surface where rendering * is displayed, if you want a software renderer without a window - * - `SDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER`: an SDL_ColorSpace + * - `SDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER`: an SDL_Colorspace * value describing the colorspace for output to the display, defaults to * SDL_COLORSPACE_SRGB. The direct3d11, direct3d12, and metal renderers * support SDL_COLORSPACE_SRGB_LINEAR, which is a linear color space and @@ -255,7 +286,9 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window *window * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties * \sa SDL_CreateRenderer @@ -290,7 +323,9 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRendererWithProperties(SDL_ * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyRenderer */ @@ -303,7 +338,9 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surfac * \returns the rendering context on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window *window); @@ -314,7 +351,9 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window *window); * \returns the window on success or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetRenderWindow(SDL_Renderer *renderer); @@ -325,7 +364,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetRenderWindow(SDL_Renderer *rende * \returns the name of the selected renderer, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_CreateRendererWithProperties @@ -348,21 +389,21 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetRendererName(SDL_Renderer *rende * - `SDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER`: a (const SDL_PixelFormat *) * array of pixel formats, terminated with SDL_PIXELFORMAT_UNKNOWN, * representing the available texture formats for this renderer. - * - `SDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER`: an SDL_ColorSpace value + * - `SDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER`: an SDL_Colorspace value * describing the colorspace for output to the display, defaults to * SDL_COLORSPACE_SRGB. * - `SDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN`: true if the output colorspace is * SDL_COLORSPACE_SRGB_LINEAR and the renderer is showing on a display with * HDR enabled. This property can change dynamically when - * SDL_EVENT_DISPLAY_HDR_STATE_CHANGED is sent. + * SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent. * - `SDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT`: the value of SDR white in the * SDL_COLORSPACE_SRGB_LINEAR colorspace. When HDR is enabled, this value is * automatically multiplied into the color scale. This property can change - * dynamically when SDL_EVENT_DISPLAY_HDR_STATE_CHANGED is sent. + * dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent. * - `SDL_PROP_RENDERER_HDR_HEADROOM_FLOAT`: the additional high dynamic range * that can be displayed, in terms of the SDR white point. When HDR is not * enabled, this will be 1.0. This property can change dynamically when - * SDL_EVENT_DISPLAY_HDR_STATE_CHANGED is sent. + * SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent. * * With the direct3d renderer: * @@ -403,11 +444,18 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetRendererName(SDL_Renderer *rende * swapchain images, or potential frames in flight, used by the Vulkan * renderer * + * With the gpu renderer: + * + * - `SDL_PROP_RENDERER_GPU_DEVICE_POINTER`: the SDL_GPUDevice associated with + * the renderer + * * \param renderer the rendering context. * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetRendererProperties(SDL_Renderer *renderer); @@ -434,6 +482,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetRendererProperties(SDL_Rende #define SDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER "SDL.renderer.vulkan.graphics_queue_family_index" #define SDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER "SDL.renderer.vulkan.present_queue_family_index" #define SDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER "SDL.renderer.vulkan.swapchain_image_count" +#define SDL_PROP_RENDERER_GPU_DEVICE_POINTER "SDL.renderer.gpu.device" /** * Get the output size in pixels of a rendering context. @@ -444,14 +493,16 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetRendererProperties(SDL_Rende * \param renderer the rendering context. * \param w a pointer filled in with the width in pixels. * \param h a pointer filled in with the height in pixels. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCurrentRenderOutputSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderOutputSize(SDL_Renderer *renderer, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderOutputSize(SDL_Renderer *renderer, int *w, int *h); /** * Get the current output size in pixels of a rendering context. @@ -464,28 +515,33 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderOutputSize(SDL_Renderer *rende * \param renderer the rendering context. * \param w a pointer filled in with the current width. * \param h a pointer filled in with the current height. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderOutputSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCurrentRenderOutputSize(SDL_Renderer *renderer, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetCurrentRenderOutputSize(SDL_Renderer *renderer, int *w, int *h); /** * Create a texture for a rendering context. * + * The contents of a texture when first created are not defined. + * * \param renderer the rendering context. * \param format one of the enumerated values in SDL_PixelFormat. * \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. + * \returns the created texture or NULL on failure; call SDL_GetError() for + * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTextureFromSurface * \sa SDL_CreateTextureWithProperties @@ -513,7 +569,9 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer *render * \returns the created texture or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTexture * \sa SDL_CreateTextureWithProperties @@ -526,7 +584,7 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Rende * * These are the supported properties: * - * - `SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER`: an SDL_ColorSpace value + * - `SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER`: an SDL_Colorspace value * describing the texture colorspace, defaults to SDL_COLORSPACE_SRGB_LINEAR * for floating point textures, SDL_COLORSPACE_HDR10 for 10-bit textures, * SDL_COLORSPACE_SRGB for other RGB textures and SDL_COLORSPACE_JPEG for @@ -617,11 +675,12 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Rende * * \param renderer the rendering context. * \param props the properties to use. - * \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. + * \returns the created texture or NULL on failure; call SDL_GetError() for + * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties * \sa SDL_CreateTexture @@ -661,7 +720,7 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureWithProperties(SDL_Re * * The following read-only properties are provided by SDL: * - * - `SDL_PROP_TEXTURE_COLORSPACE_NUMBER`: an SDL_ColorSpace value describing + * - `SDL_PROP_TEXTURE_COLORSPACE_NUMBER`: an SDL_Colorspace value describing * the texture colorspace. * - `SDL_PROP_TEXTURE_FORMAT_NUMBER`: one of the enumerated values in * SDL_PixelFormat. @@ -701,14 +760,8 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureWithProperties(SDL_Re * * With the vulkan renderer: * - * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_POINTER`: the VkImage associated with - * the texture - * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_U_POINTER`: the VkImage associated with - * the U plane of a YUV texture - * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_V_POINTER`: the VkImage associated with - * the V plane of a YUV texture - * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_UV_POINTER`: the VkImage associated with - * the UV plane of a NV12/NV21 texture + * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER`: the VkImage associated with the + * texture * * With the opengl renderer: * @@ -740,16 +793,13 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureWithProperties(SDL_Re * - `SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER`: the GLenum for the * texture target (`GL_TEXTURE_2D`, `GL_TEXTURE_EXTERNAL_OES`, etc) * - * With the vulkan renderer: - * - * - `SDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER`: the VkImage associated with the - * texture - * * \param texture the texture to query. * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetTextureProperties(SDL_Texture *texture); @@ -789,7 +839,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetTextureProperties(SDL_Textur * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRendererFromTexture(SDL_Texture *texture); @@ -801,12 +851,14 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRendererFromTexture(SDL_Textur * 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureSize(SDL_Texture *texture, float *w, float *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureSize(SDL_Texture *texture, float *w, float *h); /** * Set an additional color value multiplied into render copy operations. @@ -818,22 +870,24 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureSize(SDL_Texture *texture, fl * `srcC = srcC * (color / 255)` * * Color modulation is not always supported by the renderer; it will return - * SDL_FALSE if color modulation is not supported. + * false 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureColorMod * \sa SDL_SetTextureAlphaMod * \sa SDL_SetTextureColorModFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureColorMod(SDL_Texture *texture, Uint8 r, Uint8 g, Uint8 b); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureColorMod(SDL_Texture *texture, Uint8 r, Uint8 g, Uint8 b); /** @@ -846,22 +900,24 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureColorMod(SDL_Texture *texture * `srcC = srcC * color` * * Color modulation is not always supported by the renderer; it will return - * SDL_FALSE if color modulation is not supported. + * false 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureColorModFloat * \sa SDL_SetTextureAlphaModFloat * \sa SDL_SetTextureColorMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureColorModFloat(SDL_Texture *texture, float r, float g, float b); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureColorModFloat(SDL_Texture *texture, float r, float g, float b); /** @@ -871,16 +927,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureColorModFloat(SDL_Texture *te * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaMod * \sa SDL_GetTextureColorModFloat * \sa SDL_SetTextureColorMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureColorMod(SDL_Texture *texture, Uint8 *r, Uint8 *g, Uint8 *b); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureColorMod(SDL_Texture *texture, Uint8 *r, Uint8 *g, Uint8 *b); /** * Get the additional color value multiplied into render copy operations. @@ -889,16 +947,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureColorMod(SDL_Texture *texture * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaModFloat * \sa SDL_GetTextureColorMod * \sa SDL_SetTextureColorModFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureColorModFloat(SDL_Texture *texture, float *r, float *g, float *b); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureColorModFloat(SDL_Texture *texture, float *r, float *g, float *b); /** * Set an additional alpha value multiplied into render copy operations. @@ -909,20 +969,22 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureColorModFloat(SDL_Texture *te * `srcA = srcA * (alpha / 255)` * * Alpha modulation is not always supported by the renderer; it will return - * SDL_FALSE if alpha modulation is not supported. + * false if alpha modulation is not supported. * * \param texture the texture to update. * \param alpha the source alpha value multiplied into copy operations. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaMod * \sa SDL_SetTextureAlphaModFloat * \sa SDL_SetTextureColorMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureAlphaMod(SDL_Texture *texture, Uint8 alpha); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureAlphaMod(SDL_Texture *texture, Uint8 alpha); /** * Set an additional alpha value multiplied into render copy operations. @@ -933,83 +995,93 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureAlphaMod(SDL_Texture *texture * `srcA = srcA * alpha` * * Alpha modulation is not always supported by the renderer; it will return - * SDL_FALSE if alpha modulation is not supported. + * false if alpha modulation is not supported. * * \param texture the texture to update. * \param alpha the source alpha value multiplied into copy operations. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaModFloat * \sa SDL_SetTextureAlphaMod * \sa SDL_SetTextureColorModFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureAlphaModFloat(SDL_Texture *texture, float alpha); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureAlphaModFloat(SDL_Texture *texture, float 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaModFloat * \sa SDL_GetTextureColorMod * \sa SDL_SetTextureAlphaMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureAlphaMod(SDL_Texture *texture, Uint8 *alpha); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureAlphaMod(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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaMod * \sa SDL_GetTextureColorModFloat * \sa SDL_SetTextureAlphaModFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureAlphaModFloat(SDL_Texture *texture, float *alpha); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureAlphaModFloat(SDL_Texture *texture, float *alpha); /** * Set the blend mode for a texture, used by SDL_RenderTexture(). * * If the blend mode is not supported, the closest supported mode is chosen - * and this function returns -1. + * and this function returns false. * * \param texture the texture to update. * \param blendMode the SDL_BlendMode to use for texture blending. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureBlendMode(SDL_Texture *texture, SDL_BlendMode blendMode); +extern SDL_DECLSPEC bool 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextureBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureBlendMode(SDL_Texture *texture, SDL_BlendMode *blendMode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureBlendMode(SDL_Texture *texture, SDL_BlendMode *blendMode); /** * Set the scale mode used for texture scale operations. @@ -1020,28 +1092,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureBlendMode(SDL_Texture *textur * * \param texture the texture to update. * \param scaleMode the SDL_ScaleMode to use for texture scaling. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureScaleMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTextureScaleMode(SDL_Texture *texture, SDL_ScaleMode scaleMode); +extern SDL_DECLSPEC bool 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextureScaleMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureScaleMode(SDL_Texture *texture, SDL_ScaleMode *scaleMode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureScaleMode(SDL_Texture *texture, SDL_ScaleMode *scaleMode); /** * Update the given texture rectangle with new pixel data. @@ -1063,17 +1139,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetTextureScaleMode(SDL_Texture *textur * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTexture * \sa SDL_UnlockTexture * \sa SDL_UpdateNVTexture * \sa SDL_UpdateYUVTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateTexture(SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch); +extern SDL_DECLSPEC bool 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 @@ -1095,15 +1173,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateTexture(SDL_Texture *texture, con * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_UpdateNVTexture * \sa SDL_UpdateTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateYUVTexture(SDL_Texture *texture, +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateYUVTexture(SDL_Texture *texture, const SDL_Rect *rect, const Uint8 *Yplane, int Ypitch, const Uint8 *Uplane, int Upitch, @@ -1125,15 +1205,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateYUVTexture(SDL_Texture *texture, * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_UpdateTexture * \sa SDL_UpdateYUVTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateNVTexture(SDL_Texture *texture, +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateNVTexture(SDL_Texture *texture, const SDL_Rect *rect, const Uint8 *Yplane, int Ypitch, const Uint8 *UVplane, int UVpitch); @@ -1157,16 +1239,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateNVTexture(SDL_Texture *texture, * 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 SDL_TRUE on success or SDL_FALSE if the texture is not valid or - * was not created with `SDL_TEXTUREACCESS_STREAMING`; call - * SDL_GetError() for more information. + * \returns true on success or false 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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTextureToSurface * \sa SDL_UnlockTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockTexture(SDL_Texture *texture, +extern SDL_DECLSPEC bool SDLCALL SDL_LockTexture(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch); @@ -1192,17 +1276,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockTexture(SDL_Texture *texture, * `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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param surface a pointer to an SDL surface of size **rect**. Don't assume + * any specific pixel content. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTexture * \sa SDL_UnlockTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockTextureToSurface(SDL_Texture *texture, const SDL_Rect *rect, SDL_Surface **surface); +extern SDL_DECLSPEC bool SDLCALL SDL_LockTextureToSurface(SDL_Texture *texture, const SDL_Rect *rect, SDL_Surface **surface); /** * Unlock a texture, uploading the changes to video memory, if needed. @@ -1217,7 +1303,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockTextureToSurface(SDL_Texture *textu * * \param texture a texture locked by SDL_LockTexture(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTexture */ @@ -1234,14 +1322,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_Texture *texture); * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderTarget */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture); /** * Get the current render target. @@ -1252,7 +1342,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, * \param renderer the rendering context. * \returns the current render target or NULL for the default render target. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderTarget */ @@ -1261,13 +1353,23 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *rend /** * Set a device independent resolution and presentation mode for rendering. * - * This function sets the width and height of the logical rendering output. A - * render target is created at the specified size and used for rendering and - * then copied to the output during presentation. + * This function sets the width and height of the logical rendering output. + * The renderer will act as if the window is always the requested dimensions, + * scaling to the actual window resolution as necessary. + * + * This can be useful for games that expect a fixed size, but would like to + * scale the output to whatever is available, regardless of how a user resizes + * a window, or if the display is high DPI. * * You can disable logical coordinates by setting the mode to * SDL_LOGICAL_PRESENTATION_DISABLED, and in that case you get the full pixel - * resolution of the output window. + * resolution of the output window; it is safe to toggle logical presentation + * during the rendering of a frame: perhaps most of the rendering is done to + * specific dimensions but to make fonts look sharp, the app turns off logical + * presentation while drawing text. + * + * Letterboxing will only happen if logical presentation is enabled during + * SDL_RenderPresent; be sure to reenable it first if you were using it. * * You can convert coordinates in an event into rendering coordinates using * SDL_ConvertEventToRenderCoordinates(). @@ -1276,17 +1378,18 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *rend * \param w the width of the logical resolution. * \param h the height of the logical resolution. * \param mode the presentation mode used. - * \param scale_mode the scale mode used. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertEventToRenderCoordinates * \sa SDL_GetRenderLogicalPresentation * \sa SDL_GetRenderLogicalPresentationRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderLogicalPresentation(SDL_Renderer *renderer, int w, int h, SDL_RendererLogicalPresentation mode, SDL_ScaleMode scale_mode); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderLogicalPresentation(SDL_Renderer *renderer, int w, int h, SDL_RendererLogicalPresentation mode); /** * Get device independent resolution and presentation mode for rendering. @@ -1297,16 +1400,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderLogicalPresentation(SDL_Render * \param renderer the rendering context. * \param w an int to be filled with the width. * \param h an int to be filled with the height. - * \param mode a pointer filled in with the presentation mode. - * \param scale_mode a pointer filled in with the scale mode. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param mode the presentation mode used. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderLogicalPresentation(SDL_Renderer *renderer, int *w, int *h, SDL_RendererLogicalPresentation *mode, SDL_ScaleMode *scale_mode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderLogicalPresentation(SDL_Renderer *renderer, int *w, int *h, SDL_RendererLogicalPresentation *mode); /** * Get the final presentation rectangle for rendering. @@ -1319,36 +1423,54 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderLogicalPresentation(SDL_Render * \param renderer the rendering context. * \param rect a pointer filled in with the final presentation rectangle, may * be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderLogicalPresentationRect(SDL_Renderer *renderer, SDL_FRect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderLogicalPresentationRect(SDL_Renderer *renderer, SDL_FRect *rect); /** * Get a point in render coordinates when given a point in window coordinates. * + * This takes into account several states: + * + * - The window dimensions. + * - The logical presentation settings (SDL_SetRenderLogicalPresentation) + * - The scale (SDL_SetRenderScale) + * - The viewport (SDL_SetRenderViewport) + * * \param renderer the rendering context. * \param window_x the x coordinate in window coordinates. * \param window_y the y coordinate in window coordinates. * \param x a pointer filled with the x coordinate in render coordinates. * \param y a pointer filled with the y coordinate in render coordinates. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation * \sa SDL_SetRenderScale */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderCoordinatesFromWindow(SDL_Renderer *renderer, float window_x, float window_y, float *x, float *y); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderCoordinatesFromWindow(SDL_Renderer *renderer, float window_x, float window_y, float *x, float *y); /** * Get a point in window coordinates when given a point in render coordinates. * + * This takes into account several states: + * + * - The window dimensions. + * - The logical presentation settings (SDL_SetRenderLogicalPresentation) + * - The scale (SDL_SetRenderScale) + * - The viewport (SDL_SetRenderViewport) + * * \param renderer the rendering context. * \param x the x coordinate in render coordinates. * \param y the y coordinate in render coordinates. @@ -1356,65 +1478,95 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderCoordinatesFromWindow(SDL_Rendere * coordinates. * \param window_y a pointer filled with the y coordinate in window * coordinates. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation * \sa SDL_SetRenderScale + * \sa SDL_SetRenderViewport */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderCoordinatesToWindow(SDL_Renderer *renderer, float x, float y, float *window_x, float *window_y); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderCoordinatesToWindow(SDL_Renderer *renderer, float x, float y, float *window_x, float *window_y); /** * Convert the coordinates in an event to render coordinates. * + * This takes into account several states: + * + * - The window dimensions. + * - The logical presentation settings (SDL_SetRenderLogicalPresentation) + * - The scale (SDL_SetRenderScale) + * - The viewport (SDL_SetRenderViewport) + * + * Various event types are converted with this function: mouse, touch, pen, + * etc. + * * Touch coordinates are converted from normalized coordinates in the window * to non-normalized rendering coordinates. * - * Once converted, the coordinates may be outside the rendering area. + * Relative mouse coordinates (xrel and yrel event fields) are _also_ + * converted. Applications that do not want these fields converted should use + * SDL_RenderCoordinatesFromWindow() on the specific event fields instead of + * converting the entire event structure. + * + * Once converted, coordinates may be outside the rendering area. * * \param renderer the rendering context. * \param event the event to modify. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderCoordinatesFromWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertEventToRenderCoordinates(SDL_Renderer *renderer, SDL_Event *event); +extern SDL_DECLSPEC bool SDLCALL SDL_ConvertEventToRenderCoordinates(SDL_Renderer *renderer, SDL_Event *event); /** * Set the drawing area for rendering on the current target. * + * Drawing will clip to this area (separately from any clipping done with + * SDL_SetRenderClipRect), and the top left of the area will become coordinate + * (0, 0) for future drawing commands. + * + * The area's width and height must be >= 0. + * * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderViewport * \sa SDL_RenderViewportSet */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderViewport(SDL_Renderer *renderer, const SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderViewport(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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderViewportSet * \sa SDL_SetRenderViewport */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderViewport(SDL_Renderer *renderer, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderViewport(SDL_Renderer *renderer, SDL_Rect *rect); /** * Return whether an explicit rectangle was set as the viewport. @@ -1424,15 +1576,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderViewport(SDL_Renderer *rendere * viewport is always reset when changing rendering targets. * * \param renderer the rendering context. - * \returns SDL_TRUE if the viewport was set to a specific rectangle, or - * SDL_FALSE if it was set to NULL (the entire target). + * \returns true if the viewport was set to a specific rectangle, or false if + * it was set to NULL (the entire target). * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderViewport * \sa SDL_SetRenderViewport */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderViewportSet(SDL_Renderer *renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderViewportSet(SDL_Renderer *renderer); /** * Get the safe area for rendering within the current viewport. @@ -1447,12 +1601,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderViewportSet(SDL_Renderer *rendere * \param renderer the rendering context. * \param rect a pointer filled in with the area that is safe for interactive * content. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderSafeArea(SDL_Renderer *renderer, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderSafeArea(SDL_Renderer *renderer, SDL_Rect *rect); /** * Set the clip rectangle for rendering on the specified target. @@ -1460,15 +1616,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderSafeArea(SDL_Renderer *rendere * \param renderer the rendering context. * \param rect an SDL_Rect structure representing the clip area, relative to * the viewport, or NULL to disable clipping. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderClipRect * \sa SDL_RenderClipEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderClipRect(SDL_Renderer *renderer, const SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderClipRect(SDL_Renderer *renderer, const SDL_Rect *rect); /** * Get the clip rectangle for the current target. @@ -1476,29 +1634,33 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderClipRect(SDL_Renderer *rendere * \param renderer the rendering context. * \param rect an SDL_Rect structure filled in with the current clipping area * or an empty rectangle if clipping is disabled. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderClipEnabled * \sa SDL_SetRenderClipRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderClipRect(SDL_Renderer *renderer, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderClipRect(SDL_Renderer *renderer, SDL_Rect *rect); /** * Get whether clipping is enabled on the given renderer. * * \param renderer the rendering context. - * \returns SDL_TRUE if clipping is enabled or SDL_FALSE if not; call - * SDL_GetError() for more information. + * \returns true if clipping is enabled or false if not; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderClipRect * \sa SDL_SetRenderClipRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderClipEnabled(SDL_Renderer *renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderClipEnabled(SDL_Renderer *renderer); /** * Set the drawing scale for rendering on the current target. @@ -1514,14 +1676,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderClipEnabled(SDL_Renderer *rendere * \param renderer the rendering context. * \param scaleX the horizontal scaling factor. * \param scaleY the vertical scaling factor. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderScale */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderScale(SDL_Renderer *renderer, float scaleX, float scaleY); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderScale(SDL_Renderer *renderer, float scaleX, float scaleY); /** * Get the drawing scale for the current target. @@ -1529,14 +1693,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderScale(SDL_Renderer *renderer, * \param renderer the rendering context. * \param scaleX a pointer filled in with the horizontal scaling factor. * \param scaleY a pointer filled in with the vertical scaling factor. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderScale */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderScale(SDL_Renderer *renderer, float *scaleX, float *scaleY); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderScale(SDL_Renderer *renderer, float *scaleX, float *scaleY); /** * Set the color used for drawing operations. @@ -1551,15 +1717,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderScale(SDL_Renderer *renderer, * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawColor * \sa SDL_SetRenderDrawColorFloat */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderDrawColor(SDL_Renderer *renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderDrawColor(SDL_Renderer *renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /** * Set the color used for drawing operations (Rect, Line and Clear). @@ -1574,15 +1742,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderDrawColor(SDL_Renderer *render * \param a the alpha value used to draw on the rendering target. Use * SDL_SetRenderDrawBlendMode to specify how the alpha channel is * used. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawColorFloat * \sa SDL_SetRenderDrawColor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderDrawColorFloat(SDL_Renderer *renderer, float r, float g, float b, float a); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderDrawColorFloat(SDL_Renderer *renderer, float r, float g, float b, float a); /** * Get the color used for drawing operations (Rect, Line and Clear). @@ -1596,15 +1766,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderDrawColorFloat(SDL_Renderer *r * 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawColorFloat * \sa SDL_SetRenderDrawColor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawColor(SDL_Renderer *renderer, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderDrawColor(SDL_Renderer *renderer, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); /** * Get the color used for drawing operations (Rect, Line and Clear). @@ -1618,15 +1790,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawColor(SDL_Renderer *render * rendering target. * \param a a pointer filled in with the alpha value used to draw on the * rendering target. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawColorFloat * \sa SDL_GetRenderDrawColor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawColorFloat(SDL_Renderer *renderer, float *r, float *g, float *b, float *a); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderDrawColorFloat(SDL_Renderer *renderer, float *r, float *g, float *b, float *a); /** * Set the color scale used for render operations. @@ -1641,28 +1815,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawColorFloat(SDL_Renderer *r * * \param renderer the rendering context. * \param scale the color scale value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderColorScale */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderColorScale(SDL_Renderer *renderer, float scale); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderColorScale(SDL_Renderer *renderer, float scale); /** * Get the color scale used for render operations. * * \param renderer the rendering context. * \param scale a pointer filled in with the current color scale value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderColorScale */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderColorScale(SDL_Renderer *renderer, float *scale); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderColorScale(SDL_Renderer *renderer, float *scale); /** * Set the blend mode used for drawing operations (Fill and Line). @@ -1671,28 +1849,32 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderColorScale(SDL_Renderer *rende * * \param renderer the rendering context. * \param blendMode the SDL_BlendMode to use for blending. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderDrawBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode); +extern SDL_DECLSPEC bool 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer *renderer, SDL_BlendMode *blendMode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer *renderer, SDL_BlendMode *blendMode); /** * Clear the current rendering target with the drawing color. @@ -1703,14 +1885,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer *re * SDL_SetRenderDrawColor() when needed. * * \param renderer the rendering context. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawColor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderClear(SDL_Renderer *renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderClear(SDL_Renderer *renderer); /** * Draw a point on the current rendering target at subpixel precision. @@ -1718,14 +1902,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderClear(SDL_Renderer *renderer); * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderPoints */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPoint(SDL_Renderer *renderer, float x, float y); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderPoint(SDL_Renderer *renderer, float x, float y); /** * Draw multiple points on the current rendering target at subpixel precision. @@ -1733,14 +1919,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPoint(SDL_Renderer *renderer, flo * \param renderer the renderer which should draw multiple points. * \param points the points to draw. * \param count the number of points to draw. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderPoint */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPoints(SDL_Renderer *renderer, const SDL_FPoint *points, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderPoints(SDL_Renderer *renderer, const SDL_FPoint *points, int count); /** * Draw a line on the current rendering target at subpixel precision. @@ -1750,14 +1938,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPoints(SDL_Renderer *renderer, co * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderLines */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderLine(SDL_Renderer *renderer, float x1, float y1, float x2, float y2); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderLine(SDL_Renderer *renderer, float x1, float y1, float x2, float y2); /** * Draw a series of connected lines on the current rendering target at @@ -1766,14 +1956,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderLine(SDL_Renderer *renderer, floa * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderLine */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderLines(SDL_Renderer *renderer, const SDL_FPoint *points, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderLines(SDL_Renderer *renderer, const SDL_FPoint *points, int count); /** * Draw a rectangle on the current rendering target at subpixel precision. @@ -1781,14 +1973,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderLines(SDL_Renderer *renderer, con * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderRects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderRect(SDL_Renderer *renderer, const SDL_FRect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderRect(SDL_Renderer *renderer, const SDL_FRect *rect); /** * Draw some number of rectangles on the current rendering target at subpixel @@ -1797,14 +1991,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderRect(SDL_Renderer *renderer, cons * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count); /** * Fill a rectangle on the current rendering target with the drawing color at @@ -1813,14 +2009,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderRects(SDL_Renderer *renderer, con * \param renderer the renderer which should fill a rectangle. * \param rect a pointer to the destination rectangle, or NULL for the entire * rendering target. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderFillRects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderFillRect(SDL_Renderer *renderer, const SDL_FRect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderFillRect(SDL_Renderer *renderer, const SDL_FRect *rect); /** * Fill some number of rectangles on the current rendering target with the @@ -1829,14 +2027,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderFillRect(SDL_Renderer *renderer, * \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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderFillRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderFillRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderFillRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count); /** * Copy a portion of the texture to the current rendering target at subpixel @@ -1848,15 +2048,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderFillRects(SDL_Renderer *renderer, * texture. * \param dstrect a pointer to the destination rectangle, or NULL for the * entire rendering target. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTextureRotated * \sa SDL_RenderTextureTiled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect); /** * Copy a portion of the source texture to the current rendering target, with @@ -1875,17 +2077,49 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTexture(SDL_Renderer *renderer, S * around dstrect.w/2, dstrect.h/2). * \param flip an SDL_FlipMode value stating which flipping actions should be * performed on the texture. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture, +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect, - const double angle, const SDL_FPoint *center, - const SDL_FlipMode flip); + double angle, const SDL_FPoint *center, + SDL_FlipMode flip); + +/** + * Copy a portion of the source texture to the current rendering target, with + * affine transform, 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 origin a pointer to a point indicating where the top-left corner of + * srcrect should be mapped to, or NULL for the rendering + * target's origin. + * \param right a pointer to a point indicating where the top-right corner of + * srcrect should be mapped to, or NULL for the rendering + * target's top-right corner. + * \param down a pointer to a point indicating where the bottom-left corner of + * srcrect should be mapped to, or NULL for the rendering target's + * bottom-left corner. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety You may only call this function from the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_RenderTexture + */ +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTextureAffine(SDL_Renderer *renderer, SDL_Texture *texture, + const SDL_FRect *srcrect, const SDL_FPoint *origin, + const SDL_FPoint *right, const SDL_FPoint *down); /** * Tile a portion of the texture to the current rendering target at subpixel @@ -1903,14 +2137,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTextureRotated(SDL_Renderer *rend * 64x64 tiles. * \param dstrect a pointer to the destination rectangle, or NULL for the * entire rendering target. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTextureTiled(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float scale, const SDL_FRect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTextureTiled(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float scale, const SDL_FRect *dstrect); /** * Perform a scaled copy using the 9-grid algorithm to the current rendering @@ -1935,14 +2171,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTextureTiled(SDL_Renderer *render * corner of `dstrect`, or 0.0f for an unscaled copy. * \param dstrect a pointer to the destination rectangle, or NULL for the * entire rendering target. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTexture */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTexture9Grid(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float left_width, float right_width, float top_height, float bottom_height, float scale, const SDL_FRect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTexture9Grid(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float left_width, float right_width, float top_height, float bottom_height, float scale, const SDL_FRect *dstrect); /** * Render a list of triangles, optionally using a texture and indices into the @@ -1957,14 +2195,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderTexture9Grid(SDL_Renderer *render * array, if NULL all vertices will be rendered in sequential * order. * \param num_indices number of indices. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderGeometryRaw */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, +extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Vertex *vertices, int num_vertices, const int *indices, int num_indices); @@ -1987,14 +2227,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, * 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). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderGeometry */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, +extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, SDL_Texture *texture, const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, @@ -2017,7 +2259,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *rendere * \returns a new SDL_Surface on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect); @@ -2041,18 +2285,20 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RenderReadPixels(SDL_Renderer *ren * pixel. * * Please note, that in case of rendering to a texture - there is **no need** - * to call `SDL_RenderPresent` after drawing needed objects to a texture, you - * are only required to change back the rendering target to default via - * `SDL_SetRenderTarget(renderer, NULL)` afterwards, as textures by themselves - * do not have a concept of backbuffers. + * to call `SDL_RenderPresent` after drawing needed objects to a texture, and + * should not be done; you are only required to change back the rendering + * target to default via `SDL_SetRenderTarget(renderer, NULL)` afterwards, as + * textures by themselves do not have a concept of backbuffers. Calling + * SDL_RenderPresent while rendering to a texture will still update the screen + * with any current drawing that has been done _to the window itself_. * * \param renderer the rendering context. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \threadsafety You may only call this function on the main thread. + * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_RenderClear @@ -2067,7 +2313,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RenderReadPixels(SDL_Renderer *ren * \sa SDL_SetRenderDrawBlendMode * \sa SDL_SetRenderDrawColor */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPresent(SDL_Renderer *renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_RenderPresent(SDL_Renderer *renderer); /** * Destroy the specified texture. @@ -2077,7 +2323,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenderPresent(SDL_Renderer *renderer); * * \param texture the texture to destroy. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTexture * \sa SDL_CreateTextureFromSurface @@ -2092,7 +2340,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture *texture); * * \param renderer the rendering context. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer */ @@ -2122,12 +2372,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_Renderer *renderer); * be prepared to make changes if specific state needs to be protected. * * \param renderer the rendering context. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlushRenderer(SDL_Renderer *renderer); +extern SDL_DECLSPEC bool SDLCALL SDL_FlushRenderer(SDL_Renderer *renderer); /** * Get the CAMetalLayer associated with the given Metal renderer. @@ -2139,7 +2391,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlushRenderer(SDL_Renderer *renderer); * \returns a `CAMetalLayer *` on success, or NULL if the renderer isn't a * Metal renderer. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderMetalCommandEncoder */ @@ -2160,7 +2414,9 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetRenderMetalLayer(SDL_Renderer *rendere * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderMetalLayer */ @@ -2187,15 +2443,15 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetRenderMetalCommandEncoder(SDL_Renderer * \param signal_semaphore a VkSempahore that SDL will signal when rendering * for the current frame is complete, or 0 if not * needed. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is **NOT** safe to call this function from two threads at * once. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddVulkanRenderSemaphores(SDL_Renderer *renderer, Uint32 wait_stage_mask, Sint64 wait_semaphore, Sint64 signal_semaphore); +extern SDL_DECLSPEC bool SDLCALL SDL_AddVulkanRenderSemaphores(SDL_Renderer *renderer, Uint32 wait_stage_mask, Sint64 wait_semaphore, Sint64 signal_semaphore); /** * Toggle VSync of the given renderer. @@ -2204,21 +2460,23 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddVulkanRenderSemaphores(SDL_Renderer * * The `vsync` parameter can be 1 to synchronize present with every vertical * refresh, 2 to synchronize present with every second vertical refresh, etc., - * SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), - * or SDL_WINDOW_SURFACE_VSYNC_DISABLED to disable. Not every value is - * supported by every driver, so you should check the return value to see - * whether the requested setting is supported. + * SDL_RENDERER_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or + * SDL_RENDERER_VSYNC_DISABLED to disable. Not every value is supported by + * every driver, so you should check the return value to see whether the + * requested setting is supported. * * \param renderer the renderer to toggle. * \param vsync the vertical refresh sync interval. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderVSync */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderVSync(SDL_Renderer *renderer, int vsync); +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderVSync(SDL_Renderer *renderer, int vsync); #define SDL_RENDERER_VSYNC_DISABLED 0 #define SDL_RENDERER_VSYNC_ADAPTIVE (-1) @@ -2229,14 +2487,96 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetRenderVSync(SDL_Renderer *renderer, * \param renderer the renderer to toggle. * \param vsync an int filled with the current vertical refresh sync interval. * See SDL_SetRenderVSync() for the meaning of the value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderVSync */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetRenderVSync(SDL_Renderer *renderer, int *vsync); +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderVSync(SDL_Renderer *renderer, int *vsync); + +/** + * The size, in pixels, of a single SDL_RenderDebugText() character. + * + * The font is monospaced and square, so this applies to all characters. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_RenderDebugText + */ +#define SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE 8 + +/** + * Draw debug text to an SDL_Renderer. + * + * This function will render a string of text to an SDL_Renderer. Note that + * this is a convenience function for debugging, with severe limitations, and + * not intended to be used for production apps and games. + * + * Among these limitations: + * + * - It accepts UTF-8 strings, but will only renders ASCII characters. + * - It has a single, tiny size (8x8 pixels). One can use logical presentation + * or scaling to adjust it, but it will be blurry. + * - It uses a simple, hardcoded bitmap font. It does not allow different font + * selections and it does not support truetype, for proper scaling. + * - It does no word-wrapping and does not treat newline characters as a line + * break. If the text goes out of the window, it's gone. + * + * For serious text rendering, there are several good options, such as + * SDL_ttf, stb_truetype, or other external libraries. + * + * On first use, this will create an internal texture for rendering glyphs. + * This texture will live until the renderer is destroyed. + * + * The text is drawn in the color specified by SDL_SetRenderDrawColor(). + * + * \param renderer the renderer which should draw a line of text. + * \param x the x coordinate where the top-left corner of the text will draw. + * \param y the y coordinate where the top-left corner of the text will draw. + * \param str the string to render. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_RenderDebugTextFormat + * \sa SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE + */ +extern SDL_DECLSPEC bool SDLCALL SDL_RenderDebugText(SDL_Renderer *renderer, float x, float y, const char *str); + +/** + * Draw debug text to an SDL_Renderer. + * + * This function will render a printf()-style format string to a renderer. + * Note that this is a convinence function for debugging, with severe + * limitations, and is not intended to be used for production apps and games. + * + * For the full list of limitations and other useful information, see + * SDL_RenderDebugText. + * + * \param renderer the renderer which should draw the text. + * \param x the x coordinate where the top-left corner of the text will draw. + * \param y the y coordinate where the top-left corner of the text will draw. + * \param fmt the format string to draw. + * \param ... additional parameters matching % tokens in the `fmt` string, if + * any. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_RenderDebugText + * \sa SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE + */ +extern SDL_DECLSPEC bool SDLCALL SDL_RenderDebugTextFormat(SDL_Renderer *renderer, float x, float y, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(4); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_revision.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_revision.h index f78e5d9..18f7c4d 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_revision.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_revision.h @@ -1,22 +1,22 @@ /* - Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2025 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. + 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: + 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. + 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. */ /* WIKI CATEGORY: Version */ @@ -48,9 +48,9 @@ */ #define SDL_REVISION "Some arbitrary string decided at SDL build time" #elif defined(SDL_VENDOR_INFO) -#define SDL_REVISION SDL_VENDOR_INFO +#define SDL_REVISION "release-3.2.0-0-g535d80bad (" SDL_VENDOR_INFO ")" #else -#define SDL_REVISION "" +#define SDL_REVISION "release-3.2.0-0-g535d80bad" #endif #endif /* SDL_revision_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_scancode.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_scancode.h index ccf8bb5..9650a6c 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_scancode.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_scancode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,11 @@ * # CategoryScancode * * Defines keyboard scancodes. + * + * Please refer to the Best Keyboard Practices document for details on what + * this information means and how best to use it. + * + * https://wiki.libsdl.org/SDL3/BestKeyboardPractices */ #ifndef SDL_scancode_h_ @@ -42,7 +47,7 @@ * The values in this enumeration are based on the USB usage page standard: * https://usb.org/sites/default/files/hut1_5.pdf * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_Scancode { @@ -417,8 +422,8 @@ typedef enum SDL_Scancode SDL_SCANCODE_RESERVED = 400, /**< 400-500 reserved for dynamic keycodes */ - SDL_NUM_SCANCODES = 512 /**< not a key, just marks the number of scancodes - for array bounds */ + SDL_SCANCODE_COUNT = 512 /**< not a key, just marks the number of scancodes for array bounds */ + } SDL_Scancode; #endif /* SDL_scancode_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_sensor.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_sensor.h index 3ae4856..b220f05 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_sensor.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_sensor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -23,6 +23,12 @@ * # CategorySensor * * SDL sensor management. + * + * These APIs grant access to gyros and accelerometers on various platforms. + * + * 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. */ #ifndef SDL_sensor_h_ @@ -41,14 +47,10 @@ extern "C" { #endif /** - * SDL_sensor.h + * The opaque structure used to identify an opened SDL sensor. * - * 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. + * \since This struct is available since SDL 3.2.0. */ - -struct SDL_Sensor; typedef struct SDL_Sensor SDL_Sensor; /** @@ -57,7 +59,7 @@ typedef struct SDL_Sensor SDL_Sensor; * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_SensorID; @@ -69,7 +71,7 @@ typedef Uint32 SDL_SensorID; * rest will have an value of SDL_STANDARD_GRAVITY away from the center of the * earth, which is a positive Y value. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_STANDARD_GRAVITY 9.80665f @@ -123,7 +125,7 @@ typedef Uint32 SDL_SensorID; * * The gyroscope axis data is not changed when the device is rotated. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetCurrentDisplayOrientation */ @@ -151,7 +153,7 @@ typedef enum SDL_SensorType * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorID * SDLCALL SDL_GetSensors(int *count); @@ -163,7 +165,7 @@ extern SDL_DECLSPEC SDL_SensorID * SDLCALL SDL_GetSensors(int *count); * \param instance_id the sensor instance ID. * \returns the sensor name, or NULL if `instance_id` is not valid. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorNameForID(SDL_SensorID instance_id); @@ -176,7 +178,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorNameForID(SDL_SensorID ins * \returns the SDL_SensorType, or `SDL_SENSOR_INVALID` if `instance_id` is * not valid. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorTypeForID(SDL_SensorID instance_id); @@ -189,7 +191,7 @@ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorTypeForID(SDL_SensorID i * \returns the sensor platform dependent type, or -1 if `instance_id` is not * valid. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableTypeForID(SDL_SensorID instance_id); @@ -200,7 +202,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableTypeForID(SDL_SensorID i * \returns an SDL_Sensor object or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_OpenSensor(SDL_SensorID instance_id); @@ -211,7 +213,7 @@ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_OpenSensor(SDL_SensorID instance_id * \returns an SDL_Sensor object or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_GetSensorFromID(SDL_SensorID instance_id); @@ -222,7 +224,7 @@ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_GetSensorFromID(SDL_SensorID instan * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSensorProperties(SDL_Sensor *sensor); @@ -233,7 +235,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSensorProperties(SDL_Sensor * \returns the sensor name or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorName(SDL_Sensor *sensor); @@ -244,7 +246,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorName(SDL_Sensor *sensor); * \returns the SDL_SensorType type, or `SDL_SENSOR_INVALID` if `sensor` is * NULL. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorType(SDL_Sensor *sensor); @@ -254,7 +256,7 @@ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorType(SDL_Sensor *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 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableType(SDL_Sensor *sensor); @@ -265,7 +267,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableType(SDL_Sensor *sensor) * \returns the sensor instance ID, or 0 on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorID SDLCALL SDL_GetSensorID(SDL_Sensor *sensor); @@ -277,19 +279,19 @@ extern SDL_DECLSPEC SDL_SensorID SDLCALL SDL_GetSensorID(SDL_Sensor *sensor); * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSensorData(SDL_Sensor *sensor, float *data, int num_values); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSensorData(SDL_Sensor *sensor, float *data, int num_values); /** * Close a sensor previously opened with SDL_OpenSensor(). * * \param sensor the SDL_Sensor object to close. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CloseSensor(SDL_Sensor *sensor); @@ -302,7 +304,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseSensor(SDL_Sensor *sensor); * This needs to be called from the thread that initialized the sensor * subsystem. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateSensors(void); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_stdinc.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_stdinc.h index 5539f2a..4e15a3c 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_stdinc.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_stdinc.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,9 +22,25 @@ /** * # CategoryStdinc * - * This is a general header that includes C language support. It implements a - * subset of the C runtime: these should all behave the same way as their C - * runtime equivalents, but with an SDL_ prefix. + * SDL provides its own implementation of some of the most important C runtime + * functions. + * + * Using these functions allows an app to have access to common C + * functionality without depending on a specific C runtime (or a C runtime at + * all). More importantly, the SDL implementations work identically across + * platforms, so apps can avoid surprises like snprintf() behaving differently + * between Windows and Linux builds, or itoa() only existing on some + * platforms. + * + * For many of the most common functions, like SDL_memcpy, SDL might just call + * through to the usual C runtime behind the scenes, if it makes sense to do + * so (if it's faster and always available/reliable on a given platform), + * reducing library size and offering the most optimized option. + * + * SDL also offers other C-runtime-adjacent functionality in this header that + * either isn't, strictly speaking, part of any C runtime standards, like + * SDL_crc32() and SDL_reinterpret_cast, etc. It also offers a few better + * options, like SDL_strlcpy(), which functions as a safer form of strcpy(). */ #ifndef SDL_stdinc_h_ @@ -32,17 +48,34 @@ #include -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#include -#endif #include -#ifndef __cplusplus -#include -#endif #include #include #include +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ + defined(SDL_INCLUDE_INTTYPES_H) +#include +#endif + +#ifndef __cplusplus +#if defined(__has_include) && !defined(SDL_INCLUDE_STDBOOL_H) +#if __has_include() +#define SDL_INCLUDE_STDBOOL_H +#endif +#endif +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ + (defined(_MSC_VER) && (_MSC_VER >= 1910 /* Visual Studio 2017 */)) || \ + defined(SDL_INCLUDE_STDBOOL_H) +#include +#elif !defined(__bool_true_false_are_defined) && !defined(bool) +#define bool unsigned char +#define false 0 +#define true 1 +#define __bool_true_false_are_defined 1 +#endif +#endif /* !__cplusplus */ + #ifndef SDL_DISABLE_ALLOCA # ifndef alloca # ifdef HAVE_ALLOCA_H @@ -74,31 +107,120 @@ void *alloca(size_t); # endif #endif -#ifdef SIZE_MAX + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Don't let SDL use "long long" C types. + * + * SDL will define this if it believes the compiler doesn't understand the + * "long long" syntax for C datatypes. This can happen on older compilers. + * + * If _your_ compiler doesn't support "long long" but SDL doesn't know it, it + * is safe to define this yourself to build against the SDL headers. + * + * If this is defined, it will remove access to some C runtime support + * functions, like SDL_ulltoa and SDL_strtoll that refer to this datatype + * explicitly. The rest of SDL will still be available. + * + * SDL's own source code cannot be built with a compiler that has this + * defined, for various technical reasons. + */ +#define SDL_NOLONGLONG 1 + +#elif defined(_MSC_VER) && (_MSC_VER < 1310) /* long long introduced in Visual Studio.NET 2003 */ +# define SDL_NOLONGLONG 1 +#endif + + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * The largest value that a `size_t` can hold for the target platform. + * + * `size_t` is generally the same size as a pointer in modern times, but this + * can get weird on very old and very esoteric machines. For example, on a + * 16-bit Intel 286, you might have a 32-bit "far" pointer (16-bit segment + * plus 16-bit offset), but `size_t` is 16 bits, because it can only deal with + * the offset into an individual segment. + * + * In modern times, it's generally expected to cover an entire linear address + * space. But be careful! + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_SIZE_MAX SIZE_MAX + +#elif defined(SIZE_MAX) # define SDL_SIZE_MAX SIZE_MAX #else # define SDL_SIZE_MAX ((size_t) -1) #endif +#ifndef SDL_COMPILE_TIME_ASSERT +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + /** - * 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. + * A compile-time assertion. + * + * This can check constant values _known to the compiler at build time_ for + * correctness, and end the compile with the error if they fail. + * + * Often times these are used to verify basic truths, like the size of a + * datatype is what is expected: + * + * ```c + * SDL_COMPILE_TIME_ASSERT(uint32_size, sizeof(Uint32) == 4); + * ``` + * + * The `name` parameter must be a valid C symbol, and must be unique across + * all compile-time asserts in the same compilation unit (one run of the + * compiler), or the build might fail with cryptic errors on some targets. + * This is used with a C language trick that works on older compilers that + * don't support better assertion techniques. + * + * If you need an assertion that operates at runtime, on variable data, you + * should try SDL_assert instead. + * + * \param name a unique identifier for this assertion. + * \param x the value to test. Must be a boolean value. + * + * \threadsafety This macro doesn't generate any code to run. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_assert */ -#ifdef __has_builtin -#define SDL_HAS_BUILTIN(x) __has_builtin(x) -#else -#define SDL_HAS_BUILTIN(x) 0 +#define SDL_COMPILE_TIME_ASSERT(name, x) FailToCompileIf_x_IsFalse(x) +#elif defined(__cplusplus) +/* Keep C++ case alone: Some versions of gcc will define __STDC_VERSION__ even when compiling in C++ mode. */ +#if (__cplusplus >= 201103L) +#define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) +#endif +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L) +#define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) +#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 /** - * The number of elements in an array. + * The number of elements in a static array. + * + * This will compile but return incorrect results for a pointer to an array; + * it has to be an array the compiler knows the size of. * * This macro looks like it double-evaluates the argument, but it does so * inside of `sizeof`, so there are no side-effects here, as expressions do * not actually run any code in these cases. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) @@ -111,7 +233,9 @@ void *alloca(size_t); * #define LOG_ERROR(X) OutputDebugString(SDL_STRINGIFY_ARG(__FUNCTION__) ": " X "\n")` * ``` * - * \since This macro is available since SDL 3.0.0. + * \param arg the text to turn into a string literal. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_STRINGIFY_ARG(arg) #arg @@ -122,7 +246,76 @@ void *alloca(size_t); * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above). */ /* @{ */ -#ifdef __cplusplus + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Handle a Reinterpret Cast properly whether using C or C++. + * + * If compiled as C++, this macro offers a proper C++ reinterpret_cast<>. + * + * If compiled as C, this macro does a normal C-style cast. + * + * This is helpful to avoid compiler warnings in C++. + * + * \param type the type to cast the expression to. + * \param expression the expression to cast to a different type. + * \returns `expression`, cast to `type`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_static_cast + * \sa SDL_const_cast + */ +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) /* or `((type)(expression))` in C */ + +/** + * Handle a Static Cast properly whether using C or C++. + * + * If compiled as C++, this macro offers a proper C++ static_cast<>. + * + * If compiled as C, this macro does a normal C-style cast. + * + * This is helpful to avoid compiler warnings in C++. + * + * \param type the type to cast the expression to. + * \param expression the expression to cast to a different type. + * \returns `expression`, cast to `type`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_reinterpret_cast + * \sa SDL_const_cast + */ +#define SDL_static_cast(type, expression) static_cast(expression) /* or `((type)(expression))` in C */ + +/** + * Handle a Const Cast properly whether using C or C++. + * + * If compiled as C++, this macro offers a proper C++ const_cast<>. + * + * If compiled as C, this macro does a normal C-style cast. + * + * This is helpful to avoid compiler warnings in C++. + * + * \param type the type to cast the expression to. + * \param expression the expression to cast to a different type. + * \returns `expression`, cast to `type`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_reinterpret_cast + * \sa SDL_static_cast + */ +#define SDL_const_cast(type, expression) const_cast(expression) /* or `((type)(expression))` in C */ + +#elif defined(__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) @@ -131,9 +324,23 @@ void *alloca(size_t); #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 a four character code as a Uint32. + * + * \param A the first ASCII character. + * \param B the second ASCII character. + * \param C the third ASCII character. + * \param D the fourth ASCII character. + * \returns the four characters converted into a Uint32, one character + * per-byte. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #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) | \ @@ -149,7 +356,7 @@ void *alloca(size_t); * 0xFFFFFFFF is overflowing a 32-bit value. Use `SDL_SINT64_C(0xFFFFFFFF1)` * instead of `0xFFFFFFFF1` by itself. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_UINT64_C */ @@ -162,63 +369,49 @@ void *alloca(size_t); * 0xFFFFFFFF is overflowing a 32-bit value. Use `SDL_UINT64_C(0xFFFFFFFF1)` * instead of `0xFFFFFFFF1` by itself. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SINT64_C */ #define SDL_UINT64_C(c) c ## ULL /* or whatever the current compiler uses. */ -#elif defined(INT64_C) +#else /* !SDL_WIKI_DOCUMENTATION_SECTION */ + +#ifndef SDL_SINT64_C +#if defined(INT64_C) #define SDL_SINT64_C(c) INT64_C(c) -#define SDL_UINT64_C(c) UINT64_C(c) #elif defined(_MSC_VER) #define SDL_SINT64_C(c) c ## i64 -#define SDL_UINT64_C(c) c ## ui64 #elif defined(__LP64__) || defined(_LP64) #define SDL_SINT64_C(c) c ## L -#define SDL_UINT64_C(c) c ## UL #else #define SDL_SINT64_C(c) c ## LL +#endif +#endif /* !SDL_SINT64_C */ + +#ifndef SDL_UINT64_C +#if defined(UINT64_C) +#define SDL_UINT64_C(c) UINT64_C(c) +#elif defined(_MSC_VER) +#define SDL_UINT64_C(c) c ## ui64 +#elif defined(__LP64__) || defined(_LP64) +#define SDL_UINT64_C(c) c ## UL +#else #define SDL_UINT64_C(c) c ## ULL #endif +#endif /* !SDL_UINT64_C */ + +#endif /* !SDL_WIKI_DOCUMENTATION_SECTION */ /** * \name Basic data types */ /* @{ */ -/** - * A boolean false. - * - * \since This macro is available since SDL 3.0.0. - * - * \sa SDL_bool - */ -#define SDL_FALSE false - -/** - * A boolean true. - * - * \since This macro is available since SDL 3.0.0. - * - * \sa SDL_bool - */ -#define SDL_TRUE true - -/** - * A boolean type: true or false. - * - * \since This datatype is available since SDL 3.0.0. - * - * \sa SDL_TRUE - * \sa SDL_FALSE - */ -typedef bool SDL_bool; - /** * A signed 8-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef int8_t Sint8; #define SDL_MAX_SINT8 ((Sint8)0x7F) /* 127 */ @@ -227,7 +420,7 @@ typedef int8_t Sint8; /** * An unsigned 8-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef uint8_t Uint8; #define SDL_MAX_UINT8 ((Uint8)0xFF) /* 255 */ @@ -236,7 +429,7 @@ typedef uint8_t Uint8; /** * A signed 16-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef int16_t Sint16; #define SDL_MAX_SINT16 ((Sint16)0x7FFF) /* 32767 */ @@ -245,7 +438,7 @@ typedef int16_t Sint16; /** * An unsigned 16-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef uint16_t Uint16; #define SDL_MAX_UINT16 ((Uint16)0xFFFF) /* 65535 */ @@ -254,7 +447,7 @@ typedef uint16_t Uint16; /** * A signed 32-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef int32_t Sint32; #define SDL_MAX_SINT32 ((Sint32)0x7FFFFFFF) /* 2147483647 */ @@ -263,7 +456,7 @@ typedef int32_t Sint32; /** * An unsigned 32-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ typedef uint32_t Uint32; #define SDL_MAX_UINT32 ((Uint32)0xFFFFFFFFu) /* 4294967295 */ @@ -272,7 +465,7 @@ typedef uint32_t Uint32; /** * A signed 64-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SINT64_C */ @@ -283,7 +476,7 @@ typedef int64_t Sint64; /** * An unsigned 64-bit integer type. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_UINT64_C */ @@ -299,7 +492,7 @@ typedef uint64_t Uint64; * and SDL_SECONDS_TO_NS(), and between Windows FILETIME values with * SDL_TimeToWindows() and SDL_TimeFromWindows(). * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_MAX_SINT64 * \sa SDL_MIN_SINT64 @@ -325,40 +518,217 @@ typedef Sint64 SDL_Time; * Equals by default to platform-defined `FLT_EPSILON`, or * `1.1920928955078125e-07F` if that's not available. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_FLT_EPSILON 1.1920928955078125e-07F /* 0x0.000002p0 */ #endif /* @} *//* Floating-point constants */ +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A printf-formatting string for an Sint64 value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIs64 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIs64 "lld" + +/** + * A printf-formatting string for a Uint64 value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIu64 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIu64 "llu" + +/** + * A printf-formatting string for a Uint64 value as lower-case hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIx64 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIx64 "llx" + +/** + * A printf-formatting string for a Uint64 value as upper-case hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIX64 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIX64 "llX" + +/** + * A printf-formatting string for an Sint32 value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIs32 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIs32 "d" + +/** + * A printf-formatting string for a Uint32 value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIu32 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIu32 "u" + +/** + * A printf-formatting string for a Uint32 value as lower-case hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIx32 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIx32 "x" + +/** + * A printf-formatting string for a Uint32 value as upper-case hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRIX32 " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRIX32 "X" + +/** + * A printf-formatting string prefix for a `long long` value. + * + * This is just the prefix! You probably actually want SDL_PRILLd, SDL_PRILLu, + * SDL_PRILLx, or SDL_PRILLX instead. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRILL_PREFIX "d bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRILL_PREFIX "ll" + +/** + * A printf-formatting string for a `long long` value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRILLd " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRILLd SDL_PRILL_PREFIX "d" + +/** + * A printf-formatting string for a `unsigned long long` value. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRILLu " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRILLu SDL_PRILL_PREFIX "u" + +/** + * A printf-formatting string for an `unsigned long long` value as lower-case + * hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRILLx " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRILLx SDL_PRILL_PREFIX "x" + +/** + * A printf-formatting string for an `unsigned long long` value as upper-case + * hexadecimal. + * + * Use it like this: + * + * ```c + * SDL_Log("There are %" SDL_PRILLX " bottles of beer on the wall.", bottles); + * ``` + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRILLX SDL_PRILL_PREFIX "X" +#endif /* SDL_WIKI_DOCUMENTATION_SECTION */ + /* Make sure we have macros for printing width-based integers. - * should define these but this is not true all platforms. + * should define these but this is not true all platforms. * (for example win32) */ #ifndef SDL_PRIs64 -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) #define SDL_PRIs64 "I64d" -#elif defined(PRIs64) -#define SDL_PRIs64 PRIs64 -#elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) +#elif defined(PRId64) +#define SDL_PRIs64 PRId64 +#elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) && !defined(__EMSCRIPTEN__) #define SDL_PRIs64 "ld" #else #define SDL_PRIs64 "lld" #endif #endif #ifndef SDL_PRIu64 -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) #define SDL_PRIu64 "I64u" #elif defined(PRIu64) #define SDL_PRIu64 PRIu64 -#elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) +#elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) && !defined(__EMSCRIPTEN__) #define SDL_PRIu64 "lu" #else #define SDL_PRIu64 "llu" #endif #endif #ifndef SDL_PRIx64 -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) #define SDL_PRIx64 "I64x" #elif defined(PRIx64) #define SDL_PRIx64 PRIx64 @@ -369,7 +739,7 @@ typedef Sint64 SDL_Time; #endif #endif #ifndef SDL_PRIX64 -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) #define SDL_PRIX64 "I64X" #elif defined(PRIX64) #define SDL_PRIX64 PRIX64 @@ -407,9 +777,318 @@ typedef Sint64 SDL_Time; #define SDL_PRIX32 "X" #endif #endif +/* Specifically for the `long long` -- SDL-specific. */ +#ifdef SDL_PLATFORM_WINDOWS +#ifndef SDL_NOLONGLONG +SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 for windows - make sure `long long` is 64 bits. */ +#endif +#define SDL_PRILL_PREFIX "I64" +#else +#define SDL_PRILL_PREFIX "ll" +#endif +#ifndef SDL_PRILLd +#define SDL_PRILLd SDL_PRILL_PREFIX "d" +#endif +#ifndef SDL_PRILLu +#define SDL_PRILLu SDL_PRILL_PREFIX "u" +#endif +#ifndef SDL_PRILLx +#define SDL_PRILLx SDL_PRILL_PREFIX "x" +#endif +#ifndef SDL_PRILLX +#define SDL_PRILLX SDL_PRILL_PREFIX "X" +#endif /* Annotations to help code analysis tools */ -#ifdef SDL_DISABLE_ANALYZE_MACROS +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Macro that annotates function params with input buffer size. + * + * If we were to annotate `memcpy`: + * + * ```c + * void *memcpy(void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); + * ``` + * + * This notes that `src` should be `len` bytes in size and is only read by the + * function. The compiler or other analysis tools can warn when this doesn't + * appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_IN_BYTECAP(x) _In_bytecount_(x) + +/** + * Macro that annotates function params with input/output string buffer size. + * + * If we were to annotate `strlcat`: + * + * ```c + * size_t strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); + * ``` + * + * This notes that `dst` is a null-terminated C string, should be `maxlen` + * bytes in size, and is both read from and written to by the function. The + * compiler or other analysis tools can warn when this doesn't appear to be + * the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x) + +/** + * Macro that annotates function params with output string buffer size. + * + * If we were to annotate `snprintf`: + * + * ```c + * int snprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, ...); + * ``` + * + * This notes that `text` is a null-terminated C string, should be `maxlen` + * bytes in size, and is only written to by the function. The compiler or + * other analysis tools can warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_OUT_Z_CAP(x) _Out_z_cap_(x) + +/** + * Macro that annotates function params with output buffer size. + * + * If we were to annotate `wcsncpy`: + * + * ```c + * char *wcscpy(SDL_OUT_CAP(bufsize) wchar_t *dst, const wchar_t *src, size_t bufsize); + * ``` + * + * This notes that `dst` should have a capacity of `bufsize` wchar_t in size, + * and is only written to by the function. The compiler or other analysis + * tools can warn when this doesn't appear to be the case. + * + * This operates on counts of objects, not bytes. Use SDL_OUT_BYTECAP for + * bytes. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_OUT_CAP(x) _Out_cap_(x) + +/** + * Macro that annotates function params with output buffer size. + * + * If we were to annotate `memcpy`: + * + * ```c + * void *memcpy(SDL_OUT_BYTECAP(bufsize) void *dst, const void *src, size_t bufsize); + * ``` + * + * This notes that `dst` should have a capacity of `bufsize` bytes in size, + * and is only written to by the function. The compiler or other analysis + * tools can warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_OUT_BYTECAP(x) _Out_bytecap_(x) + +/** + * Macro that annotates function params with output buffer string size. + * + * If we were to annotate `strcpy`: + * + * ```c + * char *strcpy(SDL_OUT_Z_BYTECAP(bufsize) char *dst, const char *src, size_t bufsize); + * ``` + * + * This notes that `dst` should have a capacity of `bufsize` bytes in size, + * and a zero-terminated string is written to it by the function. The compiler + * or other analysis tools can warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x) + +/** + * Macro that annotates function params as printf-style format strings. + * + * If we were to annotate `fprintf`: + * + * ```c + * int fprintf(FILE *f, SDL_PRINTF_FORMAT_STRING const char *fmt, ...); + * ``` + * + * This notes that `fmt` should be a printf-style format string. The compiler + * or other analysis tools can warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRINTF_FORMAT_STRING _Printf_format_string_ + +/** + * Macro that annotates function params as scanf-style format strings. + * + * If we were to annotate `fscanf`: + * + * ```c + * int fscanf(FILE *f, SDL_SCANF_FORMAT_STRING const char *fmt, ...); + * ``` + * + * This notes that `fmt` should be a scanf-style format string. The compiler + * or other analysis tools can warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_ + +/** + * Macro that annotates a vararg function that operates like printf. + * + * If we were to annotate `fprintf`: + * + * ```c + * int fprintf(FILE *f, const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + * ``` + * + * This notes that the second parameter should be a printf-style format + * string, followed by `...`. The compiler or other analysis tools can warn + * when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 ))) + +/** + * Macro that annotates a va_list function that operates like printf. + * + * If we were to annotate `vfprintf`: + * + * ```c + * int vfprintf(FILE *f, const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2); + * ``` + * + * This notes that the second parameter should be a printf-style format + * string, followed by a va_list. The compiler or other analysis tools can + * warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PRINTF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __printf__, fmtargnumber, 0 ))) + +/** + * Macro that annotates a vararg function that operates like scanf. + * + * If we were to annotate `fscanf`: + * + * ```c + * int fscanf(FILE *f, const char *fmt, ...) SDL_PRINTF_VARARG_FUNCV(2); + * ``` + * + * This notes that the second parameter should be a scanf-style format string, + * followed by `...`. The compiler or other analysis tools can warn when this + * doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_SCANF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 ))) + +/** + * Macro that annotates a va_list function that operates like scanf. + * + * If we were to annotate `vfscanf`: + * + * ```c + * int vfscanf(FILE *f, const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2); + * ``` + * + * This notes that the second parameter should be a scanf-style format string, + * followed by a va_list. The compiler or other analysis tools can warn when + * this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_SCANF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __scanf__, fmtargnumber, 0 ))) + +/** + * Macro that annotates a vararg function that operates like wprintf. + * + * If we were to annotate `fwprintf`: + * + * ```c + * int fwprintf(FILE *f, const wchar_t *fmt, ...) SDL_WPRINTF_VARARG_FUNC(2); + * ``` + * + * This notes that the second parameter should be a wprintf-style format wide + * string, followed by `...`. The compiler or other analysis tools can warn + * when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_WPRINTF_VARARG_FUNC( fmtargnumber ) /* __attribute__ (( format( __wprintf__, fmtargnumber, fmtargnumber+1 ))) */ + +/** + * Macro that annotates a va_list function that operates like wprintf. + * + * If we were to annotate `vfwprintf`: + * + * ```c + * int vfwprintf(FILE *f, const wchar_t *fmt, va_list ap) SDL_WPRINTF_VARARG_FUNC(2); + * ``` + * + * This notes that the second parameter should be a wprintf-style format wide + * string, followed by a va_list. The compiler or other analysis tools can + * warn when this doesn't appear to be the case. + * + * On compilers without this annotation mechanism, this is defined to nothing. + * + * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which + * between them will cover at least Visual Studio, GCC, and Clang. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_WPRINTF_VARARG_FUNCV( fmtargnumber ) /* __attribute__ (( format( __wprintf__, fmtargnumber, 0 ))) */ + +#elif defined(SDL_DISABLE_ANALYZE_MACROS) #define SDL_IN_BYTECAP(x) #define SDL_INOUT_Z_CAP(x) #define SDL_OUT_Z_CAP(x) @@ -423,7 +1102,7 @@ typedef Sint64 SDL_Time; #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) #define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) #define SDL_WPRINTF_VARARG_FUNC( fmtargnumber ) -#define SDL_WSCANF_VARARG_FUNC( fmtargnumber ) +#define SDL_WPRINTF_VARARG_FUNCV( fmtargnumber ) #else #if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */ #include @@ -447,53 +1126,45 @@ typedef Sint64 SDL_Time; #define SDL_PRINTF_FORMAT_STRING #define SDL_SCANF_FORMAT_STRING #endif -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 ))) #define SDL_PRINTF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __printf__, fmtargnumber, 0 ))) #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 ))) #define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __scanf__, fmtargnumber, 0 ))) #define SDL_WPRINTF_VARARG_FUNC( fmtargnumber ) /* __attribute__ (( format( __wprintf__, fmtargnumber, fmtargnumber+1 ))) */ -#define SDL_WSCANF_VARARG_FUNC( fmtargnumber ) /* __attribute__ (( format( __wscanf__, fmtargnumber, fmtargnumber+1 ))) */ +#define SDL_WPRINTF_VARARG_FUNCV( fmtargnumber ) /* __attribute__ (( format( __wprintf__, fmtargnumber, 0 ))) */ #else #define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) #define SDL_PRINTF_VARARG_FUNCV( fmtargnumber ) #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) #define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) #define SDL_WPRINTF_VARARG_FUNC( fmtargnumber ) -#define SDL_WSCANF_VARARG_FUNC( fmtargnumber ) +#define SDL_WPRINTF_VARARG_FUNCV( fmtargnumber ) #endif #endif /* SDL_DISABLE_ANALYZE_MACROS */ -#ifndef SDL_COMPILE_TIME_ASSERT -#if defined(__cplusplus) -/* Keep C++ case alone: Some versions of gcc will define __STDC_VERSION__ even when compiling in C++ mode. */ -#if (__cplusplus >= 201103L) -#define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) -#endif -#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L) -#define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) -#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(bool, sizeof(SDL_bool) == 1); -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); +SDL_COMPILE_TIME_ASSERT(bool_size, sizeof(bool) == 1); +SDL_COMPILE_TIME_ASSERT(uint8_size, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8_size, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16_size, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16_size, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32_size, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32_size, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64_size, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64_size, sizeof(Sint64) == 8); +#ifndef SDL_NOLONGLONG +SDL_COMPILE_TIME_ASSERT(uint64_longlong, sizeof(Uint64) <= sizeof(unsigned long long)); +SDL_COMPILE_TIME_ASSERT(size_t_longlong, sizeof(size_t) <= sizeof(unsigned long long)); +#endif +typedef struct SDL_alignment_test +{ + Uint8 a; + void *b; +} SDL_alignment_test; +SDL_COMPILE_TIME_ASSERT(struct_alignment, sizeof(SDL_alignment_test) == (2 * sizeof(void *))); +SDL_COMPILE_TIME_ASSERT(two_s_complement, (int)~(int)0 == (int)(-1)); #endif /* DOXYGEN_SHOULD_IGNORE_THIS */ /** \endcond */ @@ -523,7 +1194,96 @@ SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); extern "C" { #endif -#ifndef SDL_DISABLE_ALLOCA +/** + * A macro to initialize an SDL interface. + * + * This macro will initialize an SDL interface structure and should be called + * before you fill out the fields with your implementation. + * + * You can use it like this: + * + * ```c + * SDL_IOStreamInterface iface; + * + * SDL_INIT_INTERFACE(&iface); + * + * // Fill in the interface function pointers with your implementation + * iface.seek = ... + * + * stream = SDL_OpenIO(&iface, NULL); + * ``` + * + * If you are using designated initializers, you can use the size of the + * interface as the version, e.g. + * + * ```c + * SDL_IOStreamInterface iface = { + * .version = sizeof(iface), + * .seek = ... + * }; + * stream = SDL_OpenIO(&iface, NULL); + * ``` + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_IOStreamInterface + * \sa SDL_StorageInterface + * \sa SDL_VirtualJoystickDesc + */ +#define SDL_INIT_INTERFACE(iface) \ + do { \ + SDL_zerop(iface); \ + (iface)->version = sizeof(*(iface)); \ + } while (0) + + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Allocate memory on the stack (maybe). + * + * If SDL knows how to access alloca() on the current platform, it will use it + * to stack-allocate memory here. If it doesn't, it will use SDL_malloc() to + * heap-allocate memory. + * + * Since this might not be stack memory at all, it's important that you check + * the returned pointer for NULL, and that you call SDL_stack_free on the + * memory when done with it. Since this might be stack memory, it's important + * that you don't allocate large amounts of it, or allocate in a loop without + * returning from the function, so the stack doesn't overflow. + * + * \param type the datatype of the memory to allocate. + * \param count the number of `type` objects to allocate. + * \returns newly-allocated memory, or NULL on failure. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_stack_free + */ +#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) + +/** + * Free memory previously allocated with SDL_stack_alloc. + * + * If SDL used alloca() to allocate this memory, this macro does nothing and + * the allocated memory will be automatically released when the function that + * called SDL_stack_alloc() returns. If SDL used SDL_malloc(), it will + * SDL_free the memory immediately. + * + * \param data the pointer, from SDL_stack_alloc(), to free. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_stack_alloc + */ +#define SDL_stack_free(data) +#elif !defined(SDL_DISABLE_ALLOCA) #define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) #define SDL_stack_free(data) #else @@ -531,14 +1291,184 @@ extern "C" { #define SDL_stack_free(data) SDL_free(data) #endif +/** + * Allocate uninitialized memory. + * + * The allocated memory returned by this function must be freed with + * SDL_free(). + * + * If `size` is 0, it will be set to 1. + * + * If you want to allocate memory aligned to a specific alignment, consider + * using SDL_aligned_alloc(). + * + * \param size the size to allocate. + * \returns a pointer to the allocated memory, or NULL if allocation failed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_free + * \sa SDL_calloc + * \sa SDL_realloc + * \sa SDL_aligned_alloc + */ extern SDL_DECLSPEC SDL_MALLOC void * SDLCALL SDL_malloc(size_t size); + +/** + * Allocate a zero-initialized array. + * + * The memory returned by this function must be freed with SDL_free(). + * + * If either of `nmemb` or `size` is 0, they will both be set to 1. + * + * \param nmemb the number of elements in the array. + * \param size the size of each element of the array. + * \returns a pointer to the allocated array, or NULL if allocation failed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_free + * \sa SDL_malloc + * \sa SDL_realloc + */ extern SDL_DECLSPEC SDL_MALLOC SDL_ALLOC_SIZE2(1, 2) void * SDLCALL SDL_calloc(size_t nmemb, size_t size); + +/** + * Change the size of allocated memory. + * + * The memory returned by this function must be freed with SDL_free(). + * + * If `size` is 0, it will be set to 1. Note that this is unlike some other C + * runtime `realloc` implementations, which may treat `realloc(mem, 0)` the + * same way as `free(mem)`. + * + * If `mem` is NULL, the behavior of this function is equivalent to + * SDL_malloc(). Otherwise, the function can have one of three possible + * outcomes: + * + * - If it returns the same pointer as `mem`, it means that `mem` was resized + * in place without freeing. + * - If it returns a different non-NULL pointer, it means that `mem` was freed + * and cannot be dereferenced anymore. + * - If it returns NULL (indicating failure), then `mem` will remain valid and + * must still be freed with SDL_free(). + * + * \param mem a pointer to allocated memory to reallocate, or NULL. + * \param size the new size of the memory. + * \returns a pointer to the newly allocated memory, or NULL if allocation + * failed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_free + * \sa SDL_malloc + * \sa SDL_calloc + */ extern SDL_DECLSPEC SDL_ALLOC_SIZE(2) void * SDLCALL SDL_realloc(void *mem, size_t size); + +/** + * Free allocated memory. + * + * The pointer is no longer valid after this call and cannot be dereferenced + * anymore. + * + * If `mem` is NULL, this function does nothing. + * + * \param mem a pointer to allocated memory, or NULL. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_malloc + * \sa SDL_calloc + * \sa SDL_realloc + */ extern SDL_DECLSPEC void SDLCALL SDL_free(void *mem); +/** + * A callback used to implement SDL_malloc(). + * + * SDL will always ensure that the passed `size` is greater than 0. + * + * \param size the size to allocate. + * \returns a pointer to the allocated memory, or NULL if allocation failed. + * + * \threadsafety It should be safe to call this callback from any thread. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_malloc + * \sa SDL_GetOriginalMemoryFunctions + * \sa SDL_GetMemoryFunctions + * \sa SDL_SetMemoryFunctions + */ typedef void *(SDLCALL *SDL_malloc_func)(size_t size); + +/** + * A callback used to implement SDL_calloc(). + * + * SDL will always ensure that the passed `nmemb` and `size` are both greater + * than 0. + * + * \param nmemb the number of elements in the array. + * \param size the size of each element of the array. + * \returns a pointer to the allocated array, or NULL if allocation failed. + * + * \threadsafety It should be safe to call this callback from any thread. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_calloc + * \sa SDL_GetOriginalMemoryFunctions + * \sa SDL_GetMemoryFunctions + * \sa SDL_SetMemoryFunctions + */ typedef void *(SDLCALL *SDL_calloc_func)(size_t nmemb, size_t size); + +/** + * A callback used to implement SDL_realloc(). + * + * SDL will always ensure that the passed `size` is greater than 0. + * + * \param mem a pointer to allocated memory to reallocate, or NULL. + * \param size the new size of the memory. + * \returns a pointer to the newly allocated memory, or NULL if allocation + * failed. + * + * \threadsafety It should be safe to call this callback from any thread. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_realloc + * \sa SDL_GetOriginalMemoryFunctions + * \sa SDL_GetMemoryFunctions + * \sa SDL_SetMemoryFunctions + */ typedef void *(SDLCALL *SDL_realloc_func)(void *mem, size_t size); + +/** + * A callback used to implement SDL_free(). + * + * SDL will always ensure that the passed `mem` is a non-NULL pointer. + * + * \param mem a pointer to allocated memory. + * + * \threadsafety It should be safe to call this callback from any thread. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_free + * \sa SDL_GetOriginalMemoryFunctions + * \sa SDL_GetMemoryFunctions + * \sa SDL_SetMemoryFunctions + */ typedef void (SDLCALL *SDL_free_func)(void *mem); /** @@ -556,7 +1486,7 @@ typedef void (SDLCALL *SDL_free_func)(void *mem); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func *malloc_func, SDL_calloc_func *calloc_func, @@ -575,7 +1505,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func * unlikely event of a background thread calling * SDL_SetMemoryFunctions simultaneously. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetMemoryFunctions * \sa SDL_GetOriginalMemoryFunctions @@ -599,42 +1529,42 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetMemoryFunctions(SDL_malloc_func *malloc_ * \param calloc_func custom calloc function. * \param realloc_func custom realloc function. * \param free_func custom free function. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread, but one * should not replace the memory functions once any allocations * are made! * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMemoryFunctions * \sa SDL_GetOriginalMemoryFunctions */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func, +extern SDL_DECLSPEC bool SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func, SDL_calloc_func calloc_func, SDL_realloc_func realloc_func, SDL_free_func free_func); /** - * Allocate memory aligned to a specific value. - * - * If `alignment` is less than the size of `void *`, then it will be increased - * to match that. - * - * The returned memory address will be a multiple of the alignment value, and - * the amount of memory allocated will be a multiple of the alignment value. + * Allocate memory aligned to a specific alignment. * * The memory returned by this function must be freed with SDL_aligned_free(), - * and _not_ SDL_free. + * _not_ SDL_free(). * - * \param alignment the alignment requested. + * If `alignment` is less than the size of `void *`, it will be increased to + * match that. + * + * The returned memory address will be a multiple of the alignment value, and + * the size of the memory allocated will be a multiple of the alignment value. + * + * \param alignment the alignment of the memory. * \param size the size to allocate. - * \returns a pointer to the aligned memory. + * \returns a pointer to the aligned memory, or NULL if allocation failed. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_aligned_free */ @@ -646,11 +1576,13 @@ extern SDL_DECLSPEC SDL_MALLOC void * SDLCALL SDL_aligned_alloc(size_t alignment * The pointer is no longer valid after this call and cannot be dereferenced * anymore. * - * \param mem a pointer previously returned by SDL_aligned_alloc. + * If `mem` is NULL, this function does nothing. + * + * \param mem a pointer previously returned by SDL_aligned_alloc(), or NULL. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_aligned_alloc */ @@ -659,31 +1591,552 @@ extern SDL_DECLSPEC void SDLCALL SDL_aligned_free(void *mem); /** * Get the number of outstanding (unfreed) allocations. * - * \returns the number of allocations. + * \returns the number of allocations or -1 if allocation counting is + * disabled. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetNumAllocations(void); -extern SDL_DECLSPEC const char * SDLCALL SDL_getenv(const char *name); -extern SDL_DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite); -extern SDL_DECLSPEC int SDLCALL SDL_unsetenv(const char *name); +/** + * A thread-safe set of environment variables + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironment + * \sa SDL_CreateEnvironment + * \sa SDL_GetEnvironmentVariable + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + * \sa SDL_DestroyEnvironment + */ +typedef struct SDL_Environment SDL_Environment; +/** + * Get the process environment. + * + * This is initialized at application start and is not affected by setenv() + * and unsetenv() calls after that point. Use SDL_SetEnvironmentVariable() and + * SDL_UnsetEnvironmentVariable() if you want to modify this environment, or + * SDL_setenv_unsafe() or SDL_unsetenv_unsafe() if you want changes to persist + * in the C runtime environment after SDL_Quit(). + * + * \returns a pointer to the environment for the process or NULL on failure; + * call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironmentVariable + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC SDL_Environment * SDLCALL SDL_GetEnvironment(void); + +/** + * Create a set of environment variables + * + * \param populated true to initialize it from the C runtime environment, + * false to create an empty environment. + * \returns a pointer to the new environment or NULL on failure; call + * SDL_GetError() for more information. + * + * \threadsafety If `populated` is false, it is safe to call this function + * from any thread, otherwise it is safe if no other threads are + * calling setenv() or unsetenv() + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironmentVariable + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + * \sa SDL_DestroyEnvironment + */ +extern SDL_DECLSPEC SDL_Environment * SDLCALL SDL_CreateEnvironment(bool populated); + +/** + * Get the value of a variable in the environment. + * + * \param env the environment to query. + * \param name the name of the variable to get. + * \returns a pointer to the value of the variable or NULL if it can't be + * found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironment + * \sa SDL_CreateEnvironment + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC const char * SDLCALL SDL_GetEnvironmentVariable(SDL_Environment *env, const char *name); + +/** + * Get all variables in the environment. + * + * \param env the environment to query. + * \returns a NULL terminated array of pointers to environment variables in + * the form "variable=value" or NULL on failure; call SDL_GetError() + * for more information. This is a single allocation that should be + * freed with SDL_free() when it is no longer needed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironment + * \sa SDL_CreateEnvironment + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC char ** SDLCALL SDL_GetEnvironmentVariables(SDL_Environment *env); + +/** + * Set the value of a variable in the environment. + * + * \param env the environment to modify. + * \param name the name of the variable to set. + * \param value the value of the variable to set. + * \param overwrite true to overwrite the variable if it exists, false to + * return success without setting the variable if it already + * exists. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironment + * \sa SDL_CreateEnvironment + * \sa SDL_GetEnvironmentVariable + * \sa SDL_GetEnvironmentVariables + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetEnvironmentVariable(SDL_Environment *env, const char *name, const char *value, bool overwrite); + +/** + * Clear a variable from the environment. + * + * \param env the environment to modify. + * \param name the name of the variable to unset. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetEnvironment + * \sa SDL_CreateEnvironment + * \sa SDL_GetEnvironmentVariable + * \sa SDL_GetEnvironmentVariables + * \sa SDL_SetEnvironmentVariable + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC bool SDLCALL SDL_UnsetEnvironmentVariable(SDL_Environment *env, const char *name); + +/** + * Destroy a set of environment variables. + * + * \param env the environment to destroy. + * + * \threadsafety It is safe to call this function from any thread, as long as + * the environment is no longer in use. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateEnvironment + */ +extern SDL_DECLSPEC void SDLCALL SDL_DestroyEnvironment(SDL_Environment *env); + +/** + * Get the value of a variable in the environment. + * + * This function uses SDL's cached copy of the environment and is thread-safe. + * + * \param name the name of the variable to get. + * \returns a pointer to the value of the variable or NULL if it can't be + * found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC const char * SDLCALL SDL_getenv(const char *name); + +/** + * Get the value of a variable in the environment. + * + * This function bypasses SDL's cached copy of the environment and is not + * thread-safe. + * + * \param name the name of the variable to get. + * \returns a pointer to the value of the variable or NULL if it can't be + * found. + * + * \threadsafety This function is not thread safe, consider using SDL_getenv() + * instead. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_getenv + */ +extern SDL_DECLSPEC const char * SDLCALL SDL_getenv_unsafe(const char *name); + +/** + * Set the value of a variable in the environment. + * + * \param name the name of the variable to set. + * \param value the value of the variable to set. + * \param overwrite 1 to overwrite the variable if it exists, 0 to return + * success without setting the variable if it already exists. + * \returns 0 on success, -1 on error. + * + * \threadsafety This function is not thread safe, consider using + * SDL_SetEnvironmentVariable() instead. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetEnvironmentVariable + */ +extern SDL_DECLSPEC int SDLCALL SDL_setenv_unsafe(const char *name, const char *value, int overwrite); + +/** + * Clear a variable from the environment. + * + * \param name the name of the variable to unset. + * \returns 0 on success, -1 on error. + * + * \threadsafety This function is not thread safe, consider using + * SDL_UnsetEnvironmentVariable() instead. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_UnsetEnvironmentVariable + */ +extern SDL_DECLSPEC int SDLCALL SDL_unsetenv_unsafe(const char *name); + +/** + * A callback used with SDL sorting and binary search functions. + * + * \param a a pointer to the first element being compared. + * \param b a pointer to the second element being compared. + * \returns -1 if `a` should be sorted before `b`, 1 if `b` should be sorted + * before `a`, 0 if they are equal. If two elements are equal, their + * order in the sorted array is undefined. + * + * \since This callback is available since SDL 3.2.0. + * + * \sa SDL_bsearch + * \sa SDL_qsort + */ typedef int (SDLCALL *SDL_CompareCallback)(const void *a, const void *b); + +/** + * Sort an array. + * + * For example: + * + * ```c + * typedef struct { + * int key; + * const char *string; + * } data; + * + * int SDLCALL compare(const void *a, const void *b) + * { + * const data *A = (const data *)a; + * const data *B = (const data *)b; + * + * if (A->n < B->n) { + * return -1; + * } else if (B->n < A->n) { + * return 1; + * } else { + * return 0; + * } + * } + * + * data values[] = { + * { 3, "third" }, { 1, "first" }, { 2, "second" } + * }; + * + * SDL_qsort(values, SDL_arraysize(values), sizeof(values[0]), compare); + * ``` + * + * \param base a pointer to the start of the array. + * \param nmemb the number of elements in the array. + * \param size the size of the elements in the array. + * \param compare a function used to compare elements in the array. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_bsearch + * \sa SDL_qsort_r + */ extern SDL_DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, SDL_CompareCallback compare); + +/** + * Perform a binary search on a previously sorted array. + * + * For example: + * + * ```c + * typedef struct { + * int key; + * const char *string; + * } data; + * + * int SDLCALL compare(const void *a, const void *b) + * { + * const data *A = (const data *)a; + * const data *B = (const data *)b; + * + * if (A->n < B->n) { + * return -1; + * } else if (B->n < A->n) { + * return 1; + * } else { + * return 0; + * } + * } + * + * data values[] = { + * { 1, "first" }, { 2, "second" }, { 3, "third" } + * }; + * data key = { 2, NULL }; + * + * data *result = SDL_bsearch(&key, values, SDL_arraysize(values), sizeof(values[0]), compare); + * ``` + * + * \param key a pointer to a key equal to the element being searched for. + * \param base a pointer to the start of the array. + * \param nmemb the number of elements in the array. + * \param size the size of the elements in the array. + * \param compare a function used to compare elements in the array. + * \returns a pointer to the matching element in the array, or NULL if not + * found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_bsearch_r + * \sa SDL_qsort + */ extern SDL_DECLSPEC void * SDLCALL SDL_bsearch(const void *key, const void *base, size_t nmemb, size_t size, SDL_CompareCallback compare); +/** + * A callback used with SDL sorting and binary search functions. + * + * \param userdata the `userdata` pointer passed to the sort function. + * \param a a pointer to the first element being compared. + * \param b a pointer to the second element being compared. + * \returns -1 if `a` should be sorted before `b`, 1 if `b` should be sorted + * before `a`, 0 if they are equal. If two elements are equal, their + * order in the sorted array is undefined. + * + * \since This callback is available since SDL 3.2.0. + * + * \sa SDL_qsort_r + * \sa SDL_bsearch_r + */ typedef int (SDLCALL *SDL_CompareCallback_r)(void *userdata, const void *a, const void *b); + +/** + * Sort an array, passing a userdata pointer to the compare function. + * + * For example: + * + * ```c + * typedef enum { + * sort_increasing, + * sort_decreasing, + * } sort_method; + * + * typedef struct { + * int key; + * const char *string; + * } data; + * + * int SDLCALL compare(const void *userdata, const void *a, const void *b) + * { + * sort_method method = (sort_method)(uintptr_t)userdata; + * const data *A = (const data *)a; + * const data *B = (const data *)b; + * + * if (A->key < B->key) { + * return (method == sort_increasing) ? -1 : 1; + * } else if (B->key < A->key) { + * return (method == sort_increasing) ? 1 : -1; + * } else { + * return 0; + * } + * } + * + * data values[] = { + * { 3, "third" }, { 1, "first" }, { 2, "second" } + * }; + * + * SDL_qsort_r(values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing); + * ``` + * + * \param base a pointer to the start of the array. + * \param nmemb the number of elements in the array. + * \param size the size of the elements in the array. + * \param compare a function used to compare elements in the array. + * \param userdata a pointer to pass to the compare function. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_bsearch_r + * \sa SDL_qsort + */ extern SDL_DECLSPEC void SDLCALL SDL_qsort_r(void *base, size_t nmemb, size_t size, SDL_CompareCallback_r compare, void *userdata); + +/** + * Perform a binary search on a previously sorted array, passing a userdata + * pointer to the compare function. + * + * For example: + * + * ```c + * typedef enum { + * sort_increasing, + * sort_decreasing, + * } sort_method; + * + * typedef struct { + * int key; + * const char *string; + * } data; + * + * int SDLCALL compare(const void *userdata, const void *a, const void *b) + * { + * sort_method method = (sort_method)(uintptr_t)userdata; + * const data *A = (const data *)a; + * const data *B = (const data *)b; + * + * if (A->key < B->key) { + * return (method == sort_increasing) ? -1 : 1; + * } else if (B->key < A->key) { + * return (method == sort_increasing) ? 1 : -1; + * } else { + * return 0; + * } + * } + * + * data values[] = { + * { 1, "first" }, { 2, "second" }, { 3, "third" } + * }; + * data key = { 2, NULL }; + * + * data *result = SDL_bsearch_r(&key, values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing); + * ``` + * + * \param key a pointer to a key equal to the element being searched for. + * \param base a pointer to the start of the array. + * \param nmemb the number of elements in the array. + * \param size the size of the elements in the array. + * \param compare a function used to compare elements in the array. + * \param userdata a pointer to pass to the compare function. + * \returns a pointer to the matching element in the array, or NULL if not + * found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_bsearch + * \sa SDL_qsort_r + */ extern SDL_DECLSPEC void * SDLCALL SDL_bsearch_r(const void *key, const void *base, size_t nmemb, size_t size, SDL_CompareCallback_r compare, void *userdata); +/** + * Compute the absolute value of `x`. + * + * \param x an integer value. + * \returns the absolute value of x. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_abs(int x); -/* NOTE: these double-evaluate their arguments, so you should never have side effects in the parameters */ +/** + * Return the lesser of two values. + * + * This is a helper macro that might be more clear than writing out the + * comparisons directly, and works with any type that can be compared with the + * `<` operator. However, it double-evaluates both its parameters, so do not + * use expressions with side-effects here. + * + * \param x the first value to compare. + * \param y the second value to compare. + * \returns the lesser of `x` and `y`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) + +/** + * Return the greater of two values. + * + * This is a helper macro that might be more clear than writing out the + * comparisons directly, and works with any type that can be compared with the + * `>` operator. However, it double-evaluates both its parameters, so do not + * use expressions with side-effects here. + * + * \param x the first value to compare. + * \param y the second value to compare. + * \returns the lesser of `x` and `y`. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) + +/** + * Return a value clamped to a range. + * + * If `x` is outside the range a values between `a` and `b`, the returned + * value will be `a` or `b` as appropriate. Otherwise, `x` is returned. + * + * This macro will produce incorrect results if `b` is less than `a`. + * + * This is a helper macro that might be more clear than writing out the + * comparisons directly, and works with any type that can be compared with the + * `<` and `>` operators. However, it double-evaluates all its parameters, so + * do not use expressions with side-effects here. + * + * \param x the value to compare. + * \param a the low end value. + * \param b the high end value. + * \returns x, clamped between a and b. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_clamp(x, a, b) (((x) < (a)) ? (a) : (((x) > (b)) ? (b) : (x))) /** @@ -697,7 +2150,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_abs(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isalpha(int x); @@ -712,7 +2165,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isalpha(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isalnum(int x); @@ -727,7 +2180,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isalnum(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isblank(int x); @@ -742,7 +2195,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isblank(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_iscntrl(int x); @@ -757,7 +2210,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_iscntrl(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isdigit(int x); @@ -772,7 +2225,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isdigit(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isxdigit(int x); @@ -787,7 +2240,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isxdigit(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isgraph * \sa SDL_isalnum @@ -812,7 +2265,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_ispunct(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isspace(int x); @@ -827,7 +2280,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isspace(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isupper(int x); @@ -842,7 +2295,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isupper(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_islower(int x); @@ -861,7 +2314,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_islower(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isprint(int x); @@ -880,7 +2333,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isprint(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isprint */ @@ -900,7 +2353,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isgraph(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_toupper(int x); @@ -918,13 +2371,96 @@ extern SDL_DECLSPEC int SDLCALL SDL_toupper(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_tolower(int x); +/** + * Calculate a CRC-16 value. + * + * https://en.wikipedia.org/wiki/Cyclic_redundancy_check + * + * This function can be called multiple times, to stream data to be + * checksummed in blocks. Each call must provide the previous CRC-16 return + * value to be updated with the next block. The first call to this function + * for a set of blocks should pass in a zero CRC value. + * + * \param crc the current checksum for this data set, or 0 for a new data set. + * \param data a new block of data to add to the checksum. + * \param len the size, in bytes, of the new block of data. + * \returns a CRC-16 checksum value of all blocks in the data set. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_crc16(Uint16 crc, const void *data, size_t len); + +/** + * Calculate a CRC-32 value. + * + * https://en.wikipedia.org/wiki/Cyclic_redundancy_check + * + * This function can be called multiple times, to stream data to be + * checksummed in blocks. Each call must provide the previous CRC-32 return + * value to be updated with the next block. The first call to this function + * for a set of blocks should pass in a zero CRC value. + * + * \param crc the current checksum for this data set, or 0 for a new data set. + * \param data a new block of data to add to the checksum. + * \param len the size, in bytes, of the new block of data. + * \returns a CRC-32 checksum value of all blocks in the data set. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_crc32(Uint32 crc, const void *data, size_t len); +/** + * Calculate a 32-bit MurmurHash3 value for a block of data. + * + * https://en.wikipedia.org/wiki/MurmurHash + * + * A seed may be specified, which changes the final results consistently, but + * this does not work like SDL_crc16 and SDL_crc32: you can't feed a previous + * result from this function back into itself as the next seed value to + * calculate a hash in chunks; it won't produce the same hash as it would if + * the same data was provided in a single call. + * + * If you aren't sure what to provide for a seed, zero is fine. Murmur3 is not + * cryptographically secure, so it shouldn't be used for hashing top-secret + * data. + * + * \param data the data to be hashed. + * \param len the size of data, in bytes. + * \param seed a value that alters the final hash value. + * \returns a Murmur3 32-bit hash value. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_murmur3_32(const void *data, size_t len, Uint32 seed); + +/** + * Copy non-overlapping memory. + * + * The memory regions must not overlap. If they do, use SDL_memmove() instead. + * + * \param dst The destination memory region. Must not be NULL, and must not + * overlap with `src`. + * \param src The source memory region. Must not be NULL, and must not overlap + * with `dst`. + * \param len The length in bytes of both `dst` and `src`. + * \returns `dst`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_memmove + */ extern SDL_DECLSPEC void * SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); /* Take advantage of compiler optimizations for memcpy */ @@ -935,10 +2471,52 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SD #define SDL_memcpy memcpy #endif + +/** + * A macro to copy memory between objects, with basic type checking. + * + * SDL_memcpy and SDL_memmove do not care where you copy memory to and from, + * which can lead to bugs. This macro aims to avoid most of those bugs by + * making sure that the source and destination are both pointers to objects + * that are the same size. It does not check that the objects are the same + * _type_, just that the copy will not overflow either object. + * + * The size check happens at compile time, and the compiler will throw an + * error if the objects are different sizes. + * + * Generally this is intended to copy a single object, not an array. + * + * This macro looks like it double-evaluates its parameters, but the extras + * them are in `sizeof` sections, which generate no code nor side-effects. + * + * \param dst a pointer to the destination object. Must not be NULL. + * \param src a pointer to the source object. Must not be NULL. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ #define SDL_copyp(dst, src) \ { SDL_COMPILE_TIME_ASSERT(SDL_copyp, sizeof (*(dst)) == sizeof (*(src))); } \ SDL_memcpy((dst), (src), sizeof(*(src))) +/** + * Copy memory ranges that might overlap. + * + * It is okay for the memory regions to overlap. If you are confident that the + * regions never overlap, using SDL_memcpy() may improve performance. + * + * \param dst The destination memory region. Must not be NULL. + * \param src The source memory region. Must not be NULL. + * \param len The length in bytes of both `dst` and `src`. + * \returns `dst`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_memcpy + */ extern SDL_DECLSPEC void * SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); /* Take advantage of compiler optimizations for memmove */ @@ -949,7 +2527,44 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, S #define SDL_memmove memmove #endif +/** + * Initialize all bytes of buffer of memory to a specific value. + * + * This function will set `len` bytes, pointed to by `dst`, to the value + * specified in `c`. + * + * Despite `c` being an `int` instead of a `char`, this only operates on + * bytes; `c` must be a value between 0 and 255, inclusive. + * + * \param dst the destination memory region. Must not be NULL. + * \param c the byte value to set. + * \param len the length, in bytes, to set in `dst`. + * \returns `dst`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC void * SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len); + +/** + * Initialize all 32-bit words of buffer of memory to a specific value. + * + * This function will set a buffer of `dwords` Uint32 values, pointed to by + * `dst`, to the value specified in `val`. + * + * Unlike SDL_memset, this sets 32-bit values, not bytes, so it's not limited + * to a range of 0-255. + * + * \param dst the destination memory region. Must not be NULL. + * \param val the Uint32 value to set. + * \param dwords the number of Uint32 values to set in `dst`. + * \returns `dst`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC void * SDLCALL SDL_memset4(void *dst, Uint32 val, size_t dwords); /* Take advantage of compiler optimizations for memset */ @@ -960,18 +2575,255 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memset4(void *dst, Uint32 val, size_t dwo #define SDL_memset memset #endif +/** + * Clear an object's memory to zero. + * + * This is wrapper over SDL_memset that handles calculating the object size, + * so there's no chance of copy/paste errors, and the code is cleaner. + * + * This requires an object, not a pointer to an object, nor an array. + * + * \param x the object to clear. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_zerop + * \sa SDL_zeroa + */ #define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) + +/** + * Clear an object's memory to zero, using a pointer. + * + * This is wrapper over SDL_memset that handles calculating the object size, + * so there's no chance of copy/paste errors, and the code is cleaner. + * + * This requires a pointer to an object, not an object itself, nor an array. + * + * \param x a pointer to the object to clear. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_zero + * \sa SDL_zeroa + */ #define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) + +/** + * Clear an array's memory to zero. + * + * This is wrapper over SDL_memset that handles calculating the array size, so + * there's no chance of copy/paste errors, and the code is cleaner. + * + * This requires an array, not an object, nor a pointer to an object. + * + * \param x an array to clear. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_zero + * \sa SDL_zeroa + */ #define SDL_zeroa(x) SDL_memset((x), 0, sizeof((x))) + +/** + * Compare two buffers of memory. + * + * \param s1 the first buffer to compare. NULL is not permitted! + * \param s2 the second buffer to compare. NULL is not permitted! + * \param len the number of bytes to compare between the buffers. + * \returns less than zero if s1 is "less than" s2, greater than zero if s1 is + * "greater than" s2, and zero if the buffers match exactly for `len` + * bytes. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); +/** + * This works exactly like wcslen() but doesn't require access to a C runtime. + * + * Counts the number of wchar_t values in `wstr`, excluding the null + * terminator. + * + * Like SDL_strlen only counts bytes and not codepoints in a UTF-8 string, + * this counts wchar_t values in a string, even if the string's encoding is of + * variable width, like UTF-16. + * + * Also be aware that wchar_t is different sizes on different platforms (4 + * bytes on Linux, 2 on Windows, etc). + * + * \param wstr The null-terminated wide string to read. Must not be NULL. + * \returns the length (in wchar_t values, excluding the null terminator) of + * `wstr`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_wcsnlen + * \sa SDL_utf8strlen + * \sa SDL_utf8strnlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); + +/** + * This works exactly like wcsnlen() but doesn't require access to a C + * runtime. + * + * Counts up to a maximum of `maxlen` wchar_t values in `wstr`, excluding the + * null terminator. + * + * Like SDL_strnlen only counts bytes and not codepoints in a UTF-8 string, + * this counts wchar_t values in a string, even if the string's encoding is of + * variable width, like UTF-16. + * + * Also be aware that wchar_t is different sizes on different platforms (4 + * bytes on Linux, 2 on Windows, etc). + * + * Also, `maxlen` is a count of wide characters, not bytes! + * + * \param wstr The null-terminated wide string to read. Must not be NULL. + * \param maxlen The maximum amount of wide characters to count. + * \returns the length (in wide characters, excluding the null terminator) of + * `wstr` but never more than `maxlen`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_wcslen + * \sa SDL_utf8strlen + * \sa SDL_utf8strnlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_wcsnlen(const wchar_t *wstr, size_t maxlen); + +/** + * Copy a wide string. + * + * This function copies `maxlen` - 1 wide characters from `src` to `dst`, then + * appends a null terminator. + * + * `src` and `dst` must not overlap. + * + * If `maxlen` is 0, no wide characters are copied and no null terminator is + * written. + * + * \param dst The destination buffer. Must not be NULL, and must not overlap + * with `src`. + * \param src The null-terminated wide string to copy. Must not be NULL, and + * must not overlap with `dst`. + * \param maxlen The length (in wide characters) of the destination buffer. + * \returns the length (in wide characters, excluding the null terminator) of + * `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_wcslcat + */ extern SDL_DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); + +/** + * Concatenate wide strings. + * + * This function appends up to `maxlen` - SDL_wcslen(dst) - 1 wide characters + * from `src` to the end of the wide string in `dst`, then appends a null + * terminator. + * + * `src` and `dst` must not overlap. + * + * If `maxlen` - SDL_wcslen(dst) - 1 is less than or equal to 0, then `dst` is + * unmodified. + * + * \param dst The destination buffer already containing the first + * null-terminated wide string. Must not be NULL and must not + * overlap with `src`. + * \param src The second null-terminated wide string. Must not be NULL, and + * must not overlap with `dst`. + * \param maxlen The length (in wide characters) of the destination buffer. + * \returns the length (in wide characters, excluding the null terminator) of + * the string in `dst` plus the length of `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_wcslcpy + */ extern SDL_DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); + +/** + * Allocate a copy of a wide string. + * + * This allocates enough space for a null-terminated copy of `wstr`, using + * SDL_malloc, and then makes a copy of the string into this space. + * + * The returned string is owned by the caller, and should be passed to + * SDL_free when no longer needed. + * + * \param wstr the string to copy. + * \returns a pointer to the newly-allocated wide string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsdup(const wchar_t *wstr); + +/** + * Search a wide string for the first instance of a specific substring. + * + * The search ends once it finds the requested substring, or a null terminator + * byte to end the string. + * + * Note that this looks for strings of _wide characters_, not _codepoints_, so + * it's legal to search for malformed and incomplete UTF-16 sequences. + * + * \param haystack the wide string to search. Must not be NULL. + * \param needle the wide string to search for. Must not be NULL. + * \returns a pointer to the first instance of `needle` in the string, or NULL + * if not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsstr(const wchar_t *haystack, const wchar_t *needle); + +/** + * Search a wide string, up to n wide chars, for the first instance of a + * specific substring. + * + * The search ends once it finds the requested substring, or a null terminator + * value to end the string, or `maxlen` wide character have been examined. It + * is possible to use this function on a wide string without a null + * terminator. + * + * Note that this looks for strings of _wide characters_, not _codepoints_, so + * it's legal to search for malformed and incomplete UTF-16 sequences. + * + * \param haystack the wide string to search. Must not be NULL. + * \param needle the wide string to search for. Must not be NULL. + * \param maxlen the maximum number of wide characters to search in + * `haystack`. + * \returns a pointer to the first instance of `needle` in the string, or NULL + * if not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsnstr(const wchar_t *haystack, const wchar_t *needle, size_t maxlen); /** @@ -989,7 +2841,7 @@ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsnstr(const wchar_t *haystack, const * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *str2); @@ -1020,7 +2872,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *s * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcsncmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen); @@ -1050,7 +2902,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_wcsncmp(const wchar_t *str1, const wchar_t * * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcscasecmp(const wchar_t *str1, const wchar_t *str2); @@ -1092,19 +2944,228 @@ extern SDL_DECLSPEC int SDLCALL SDL_wcscasecmp(const wchar_t *str1, const wchar_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcsncasecmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen); +/** + * Parse a `long` from a wide string. + * + * If `str` starts with whitespace, then those whitespace characters are + * skipped before attempting to parse the number. + * + * If the parsed number does not fit inside a `long`, the result is clamped to + * the minimum and maximum representable `long` values. + * + * \param str The null-terminated wide string to read. Must not be NULL. + * \param endp If not NULL, the address of the first invalid wide character + * (i.e. the next character after the parsed number) will be + * written to this pointer. + * \param base The base of the integer to read. Supported values are 0 and 2 + * to 36 inclusive. If 0, the base will be inferred from the + * number's prefix (0x for hexadecimal, 0 for octal, decimal + * otherwise). + * \returns the parsed `long`, or 0 if no number could be parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strtol + */ extern SDL_DECLSPEC long SDLCALL SDL_wcstol(const wchar_t *str, wchar_t **endp, int base); +/** + * This works exactly like strlen() but doesn't require access to a C runtime. + * + * Counts the bytes in `str`, excluding the null terminator. + * + * If you need the length of a UTF-8 string, consider using SDL_utf8strlen(). + * + * \param str The null-terminated string to read. Must not be NULL. + * \returns the length (in bytes, excluding the null terminator) of `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strnlen + * \sa SDL_utf8strlen + * \sa SDL_utf8strnlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_strlen(const char *str); + +/** + * This works exactly like strnlen() but doesn't require access to a C + * runtime. + * + * Counts up to a maximum of `maxlen` bytes in `str`, excluding the null + * terminator. + * + * If you need the length of a UTF-8 string, consider using SDL_utf8strnlen(). + * + * \param str The null-terminated string to read. Must not be NULL. + * \param maxlen The maximum amount of bytes to count. + * \returns the length (in bytes, excluding the null terminator) of `src` but + * never more than `maxlen`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strlen + * \sa SDL_utf8strlen + * \sa SDL_utf8strnlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_strnlen(const char *str, size_t maxlen); + +/** + * Copy a string. + * + * This function copies up to `maxlen` - 1 characters from `src` to `dst`, + * then appends a null terminator. + * + * If `maxlen` is 0, no characters are copied and no null terminator is + * written. + * + * If you want to copy an UTF-8 string but need to ensure that multi-byte + * sequences are not truncated, consider using SDL_utf8strlcpy(). + * + * \param dst The destination buffer. Must not be NULL, and must not overlap + * with `src`. + * \param src The null-terminated string to copy. Must not be NULL, and must + * not overlap with `dst`. + * \param maxlen The length (in characters) of the destination buffer. + * \returns the length (in characters, excluding the null terminator) of + * `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strlcat + * \sa SDL_utf8strlcpy + */ extern SDL_DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); + +/** + * Copy an UTF-8 string. + * + * This function copies up to `dst_bytes` - 1 bytes from `src` to `dst` while + * also ensuring that the string written to `dst` does not end in a truncated + * multi-byte sequence. Finally, it appends a null terminator. + * + * `src` and `dst` must not overlap. + * + * Note that unlike SDL_strlcpy(), this function returns the number of bytes + * written, not the length of `src`. + * + * \param dst The destination buffer. Must not be NULL, and must not overlap + * with `src`. + * \param src The null-terminated UTF-8 string to copy. Must not be NULL, and + * must not overlap with `dst`. + * \param dst_bytes The length (in bytes) of the destination buffer. Must not + * be 0. + * \returns the number of bytes written, excluding the null terminator. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strlcpy + */ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes); + +/** + * Concatenate strings. + * + * This function appends up to `maxlen` - SDL_strlen(dst) - 1 characters from + * `src` to the end of the string in `dst`, then appends a null terminator. + * + * `src` and `dst` must not overlap. + * + * If `maxlen` - SDL_strlen(dst) - 1 is less than or equal to 0, then `dst` is + * unmodified. + * + * \param dst The destination buffer already containing the first + * null-terminated string. Must not be NULL and must not overlap + * with `src`. + * \param src The second null-terminated string. Must not be NULL, and must + * not overlap with `dst`. + * \param maxlen The length (in characters) of the destination buffer. + * \returns the length (in characters, excluding the null terminator) of the + * string in `dst` plus the length of `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_strlcpy + */ extern SDL_DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); + +/** + * Allocate a copy of a string. + * + * This allocates enough space for a null-terminated copy of `str`, using + * SDL_malloc, and then makes a copy of the string into this space. + * + * The returned string is owned by the caller, and should be passed to + * SDL_free when no longer needed. + * + * \param str the string to copy. + * \returns a pointer to the newly-allocated string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC SDL_MALLOC char * SDLCALL SDL_strdup(const char *str); + +/** + * Allocate a copy of a string, up to n characters. + * + * This allocates enough space for a null-terminated copy of `str`, up to + * `maxlen` bytes, using SDL_malloc, and then makes a copy of the string into + * this space. + * + * If the string is longer than `maxlen` bytes, the returned string will be + * `maxlen` bytes long, plus a null-terminator character that isn't included + * in the count. + * + * The returned string is owned by the caller, and should be passed to + * SDL_free when no longer needed. + * + * \param str the string to copy. + * \param maxlen the maximum length of the copied string, not counting the + * null-terminator character. + * \returns a pointer to the newly-allocated string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC SDL_MALLOC char * SDLCALL SDL_strndup(const char *str, size_t maxlen); + +/** + * Reverse a string's contents. + * + * This reverses a null-terminated string in-place. Only the content of the + * string is reversed; the null-terminator character remains at the end of the + * reversed string. + * + * **WARNING**: This function reverses the _bytes_ of the string, not the + * codepoints. If `str` is a UTF-8 string with Unicode codepoints > 127, this + * will ruin the string data. You should only use this function on strings + * that are completely comprised of low ASCII characters. + * + * \param str the string to reverse. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strrev(char *str); /** @@ -1122,7 +3183,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strrev(char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strlwr */ @@ -1143,34 +3204,592 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strupr(char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strupr */ extern SDL_DECLSPEC char * SDLCALL SDL_strlwr(char *str); +/** + * Search a string for the first instance of a specific byte. + * + * The search ends once it finds the requested byte value, or a null + * terminator byte to end the string. + * + * Note that this looks for _bytes_, not _characters_, so you cannot match + * against a Unicode codepoint > 255, regardless of character encoding. + * + * \param str the string to search. Must not be NULL. + * \param c the byte value to search for. + * \returns a pointer to the first instance of `c` in the string, or NULL if + * not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strchr(const char *str, int c); + +/** + * Search a string for the last instance of a specific byte. + * + * The search must go until it finds a null terminator byte to end the string. + * + * Note that this looks for _bytes_, not _characters_, so you cannot match + * against a Unicode codepoint > 255, regardless of character encoding. + * + * \param str the string to search. Must not be NULL. + * \param c the byte value to search for. + * \returns a pointer to the last instance of `c` in the string, or NULL if + * not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strrchr(const char *str, int c); + +/** + * Search a string for the first instance of a specific substring. + * + * The search ends once it finds the requested substring, or a null terminator + * byte to end the string. + * + * Note that this looks for strings of _bytes_, not _characters_, so it's + * legal to search for malformed and incomplete UTF-8 sequences. + * + * \param haystack the string to search. Must not be NULL. + * \param needle the string to search for. Must not be NULL. + * \returns a pointer to the first instance of `needle` in the string, or NULL + * if not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char *needle); + +/** + * Search a string, up to n bytes, for the first instance of a specific + * substring. + * + * The search ends once it finds the requested substring, or a null terminator + * byte to end the string, or `maxlen` bytes have been examined. It is + * possible to use this function on a string without a null terminator. + * + * Note that this looks for strings of _bytes_, not _characters_, so it's + * legal to search for malformed and incomplete UTF-8 sequences. + * + * \param haystack the string to search. Must not be NULL. + * \param needle the string to search for. Must not be NULL. + * \param maxlen the maximum number of bytes to search in `haystack`. + * \returns a pointer to the first instance of `needle` in the string, or NULL + * if not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strnstr(const char *haystack, const char *needle, size_t maxlen); + +/** + * Search a UTF-8 string for the first instance of a specific substring, + * case-insensitively. + * + * This will work with Unicode strings, using a technique called + * "case-folding" to handle the vast majority of case-sensitive human + * languages regardless of system locale. It can deal with expanding values: a + * German Eszett character can compare against two ASCII 's' chars and be + * considered a match, for example. A notable exception: it does not handle + * the Turkish 'i' character; human language is complicated! + * + * Since this handles Unicode, it expects the strings to be well-formed UTF-8 + * and not a null-terminated string of arbitrary bytes. Bytes that are not + * valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT + * CHARACTER), which is to say two strings of random bits may turn out to + * match if they convert to the same amount of replacement characters. + * + * \param haystack the string to search. Must not be NULL. + * \param needle the string to search for. Must not be NULL. + * \returns a pointer to the first instance of `needle` in the string, or NULL + * if not found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC char * SDLCALL SDL_strcasestr(const char *haystack, const char *needle); -extern SDL_DECLSPEC char * SDLCALL SDL_strtok_r(char *s1, const char *s2, char **saveptr); + +/** + * This works exactly like strtok_r() but doesn't require access to a C + * runtime. + * + * Break a string up into a series of tokens. + * + * To start tokenizing a new string, `str` should be the non-NULL address of + * the string to start tokenizing. Future calls to get the next token from the + * same string should specify a NULL. + * + * Note that this function will overwrite pieces of `str` with null chars to + * split it into tokens. This function cannot be used with const/read-only + * strings! + * + * `saveptr` just needs to point to a `char *` that can be overwritten; SDL + * will use this to save tokenizing state between calls. It is initialized if + * `str` is non-NULL, and used to resume tokenizing when `str` is NULL. + * + * \param str the string to tokenize, or NULL to continue tokenizing. + * \param delim the delimiter string that separates tokens. + * \param saveptr pointer to a char *, used for ongoing state. + * \returns A pointer to the next token, or NULL if no tokens remain. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC char * SDLCALL SDL_strtok_r(char *str, const char *delim, char **saveptr); + +/** + * Count the number of codepoints in a UTF-8 string. + * + * Counts the _codepoints_, not _bytes_, in `str`, excluding the null + * terminator. + * + * If you need to count the bytes in a string instead, consider using + * SDL_strlen(). + * + * Since this handles Unicode, it expects the strings to be well-formed UTF-8 + * and not a null-terminated string of arbitrary bytes. Bytes that are not + * valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT + * CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the + * count by several replacement characters. + * + * \param str The null-terminated UTF-8 string to read. Must not be NULL. + * \returns The length (in codepoints, excluding the null terminator) of + * `src`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_utf8strnlen + * \sa SDL_strlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strlen(const char *str); + +/** + * Count the number of codepoints in a UTF-8 string, up to n bytes. + * + * Counts the _codepoints_, not _bytes_, in `str`, excluding the null + * terminator. + * + * If you need to count the bytes in a string instead, consider using + * SDL_strnlen(). + * + * The counting stops at `bytes` bytes (not codepoints!). This seems + * counterintuitive, but makes it easy to express the total size of the + * string's buffer. + * + * Since this handles Unicode, it expects the strings to be well-formed UTF-8 + * and not a null-terminated string of arbitrary bytes. Bytes that are not + * valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT + * CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the + * count by several replacement characters. + * + * \param str The null-terminated UTF-8 string to read. Must not be NULL. + * \param bytes The maximum amount of bytes to count. + * \returns The length (in codepoints, excluding the null terminator) of `src` + * but never more than `maxlen`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_utf8strlen + * \sa SDL_strnlen + */ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strnlen(const char *str, size_t bytes); +/** + * Convert an integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget possible negative + * signs, null terminator bytes, etc). + * + * \param value the integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_uitoa + * \sa SDL_ltoa + * \sa SDL_lltoa + */ extern SDL_DECLSPEC char * SDLCALL SDL_itoa(int value, char *str, int radix); -extern SDL_DECLSPEC char * SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); -extern SDL_DECLSPEC char * SDLCALL SDL_ltoa(long value, char *str, int radix); -extern SDL_DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); -extern SDL_DECLSPEC char * SDLCALL SDL_lltoa(Sint64 value, char *str, int radix); -extern SDL_DECLSPEC char * SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix); +/** + * Convert an unsigned integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget null terminator + * bytes, etc). + * + * \param value the unsigned integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_itoa + * \sa SDL_ultoa + * \sa SDL_ulltoa + */ +extern SDL_DECLSPEC char * SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); + +/** + * Convert a long integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget possible negative + * signs, null terminator bytes, etc). + * + * \param value the long integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ultoa + * \sa SDL_itoa + * \sa SDL_lltoa + */ +extern SDL_DECLSPEC char * SDLCALL SDL_ltoa(long value, char *str, int radix); + +/** + * Convert an unsigned long integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget null terminator + * bytes, etc). + * + * \param value the unsigned long integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ltoa + * \sa SDL_uitoa + * \sa SDL_ulltoa + */ +extern SDL_DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); + +#ifndef SDL_NOLONGLONG + +/** + * Convert a long long integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget possible negative + * signs, null terminator bytes, etc). + * + * \param value the long long integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ulltoa + * \sa SDL_itoa + * \sa SDL_ltoa + */ +extern SDL_DECLSPEC char * SDLCALL SDL_lltoa(long long value, char *str, int radix); + +/** + * Convert an unsigned long long integer into a string. + * + * This requires a radix to specified for string format. Specifying 10 + * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * to 36. + * + * Note that this function will overflow a buffer if `str` is not large enough + * to hold the output! It may be safer to use SDL_snprintf to clamp output, or + * SDL_asprintf to allocate a buffer. Otherwise, it doesn't hurt to allocate + * much more space than you expect to use (and don't forget null terminator + * bytes, etc). + * + * \param value the unsigned long long integer to convert. + * \param str the buffer to write the string into. + * \param radix the radix to use for string generation. + * \returns `str`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_lltoa + * \sa SDL_uitoa + * \sa SDL_ultoa + */ +extern SDL_DECLSPEC char * SDLCALL SDL_ulltoa(unsigned long long value, char *str, int radix); +#endif + +/** + * Parse an `int` from a string. + * + * The result of calling `SDL_atoi(str)` is equivalent to + * `(int)SDL_strtol(str, NULL, 10)`. + * + * \param str The null-terminated string to read. Must not be NULL. + * \returns the parsed `int`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atof + * \sa SDL_strtol + * \sa SDL_strtoul + * \sa SDL_strtoll + * \sa SDL_strtoull + * \sa SDL_strtod + * \sa SDL_itoa + */ extern SDL_DECLSPEC int SDLCALL SDL_atoi(const char *str); + +/** + * Parse a `double` from a string. + * + * The result of calling `SDL_atof(str)` is equivalent to `SDL_strtod(str, + * NULL)`. + * + * \param str The null-terminated string to read. Must not be NULL. + * \returns the parsed `double`. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_strtol + * \sa SDL_strtoul + * \sa SDL_strtoll + * \sa SDL_strtoull + * \sa SDL_strtod + */ extern SDL_DECLSPEC double SDLCALL SDL_atof(const char *str); + +/** + * Parse a `long` from a string. + * + * If `str` starts with whitespace, then those whitespace characters are + * skipped before attempting to parse the number. + * + * If the parsed number does not fit inside a `long`, the result is clamped to + * the minimum and maximum representable `long` values. + * + * \param str The null-terminated string to read. Must not be NULL. + * \param endp If not NULL, the address of the first invalid character (i.e. + * the next character after the parsed number) will be written to + * this pointer. + * \param base The base of the integer to read. Supported values are 0 and 2 + * to 36 inclusive. If 0, the base will be inferred from the + * number's prefix (0x for hexadecimal, 0 for octal, decimal + * otherwise). + * \returns the parsed `long`, or 0 if no number could be parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_atof + * \sa SDL_strtoul + * \sa SDL_strtoll + * \sa SDL_strtoull + * \sa SDL_strtod + * \sa SDL_ltoa + * \sa SDL_wcstol + */ extern SDL_DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base); + +/** + * Parse an `unsigned long` from a string. + * + * If `str` starts with whitespace, then those whitespace characters are + * skipped before attempting to parse the number. + * + * If the parsed number does not fit inside an `unsigned long`, the result is + * clamped to the maximum representable `unsigned long` value. + * + * \param str The null-terminated string to read. Must not be NULL. + * \param endp If not NULL, the address of the first invalid character (i.e. + * the next character after the parsed number) will be written to + * this pointer. + * \param base The base of the integer to read. Supported values are 0 and 2 + * to 36 inclusive. If 0, the base will be inferred from the + * number's prefix (0x for hexadecimal, 0 for octal, decimal + * otherwise). + * \returns the parsed `unsigned long`, or 0 if no number could be parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_atof + * \sa SDL_strtol + * \sa SDL_strtoll + * \sa SDL_strtoull + * \sa SDL_strtod + * \sa SDL_ultoa + */ extern SDL_DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base); -extern SDL_DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base); -extern SDL_DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base); + +#ifndef SDL_NOLONGLONG + +/** + * Parse a `long long` from a string. + * + * If `str` starts with whitespace, then those whitespace characters are + * skipped before attempting to parse the number. + * + * If the parsed number does not fit inside a `long long`, the result is + * clamped to the minimum and maximum representable `long long` values. + * + * \param str The null-terminated string to read. Must not be NULL. + * \param endp If not NULL, the address of the first invalid character (i.e. + * the next character after the parsed number) will be written to + * this pointer. + * \param base The base of the integer to read. Supported values are 0 and 2 + * to 36 inclusive. If 0, the base will be inferred from the + * number's prefix (0x for hexadecimal, 0 for octal, decimal + * otherwise). + * \returns the parsed `long long`, or 0 if no number could be parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_atof + * \sa SDL_strtol + * \sa SDL_strtoul + * \sa SDL_strtoull + * \sa SDL_strtod + * \sa SDL_lltoa + */ +extern SDL_DECLSPEC long long SDLCALL SDL_strtoll(const char *str, char **endp, int base); + +/** + * Parse an `unsigned long long` from a string. + * + * If `str` starts with whitespace, then those whitespace characters are + * skipped before attempting to parse the number. + * + * If the parsed number does not fit inside an `unsigned long long`, the + * result is clamped to the maximum representable `unsigned long long` value. + * + * \param str The null-terminated string to read. Must not be NULL. + * \param endp If not NULL, the address of the first invalid character (i.e. + * the next character after the parsed number) will be written to + * this pointer. + * \param base The base of the integer to read. Supported values are 0 and 2 + * to 36 inclusive. If 0, the base will be inferred from the + * number's prefix (0x for hexadecimal, 0 for octal, decimal + * otherwise). + * \returns the parsed `unsigned long long`, or 0 if no number could be + * parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_atof + * \sa SDL_strtol + * \sa SDL_strtoll + * \sa SDL_strtoul + * \sa SDL_strtod + * \sa SDL_ulltoa + */ +extern SDL_DECLSPEC unsigned long long SDLCALL SDL_strtoull(const char *str, char **endp, int base); +#endif + +/** + * Parse a `double` from a string. + * + * This function makes fewer guarantees than the C runtime `strtod`: + * + * - Only decimal notation is guaranteed to be supported. The handling of + * scientific and hexadecimal notation is unspecified. + * - Whether or not INF and NAN can be parsed is unspecified. + * - The precision of the result is unspecified. + * + * \param str the null-terminated string to read. Must not be NULL. + * \param endp if not NULL, the address of the first invalid character (i.e. + * the next character after the parsed number) will be written to + * this pointer. + * \returns the parsed `double`, or 0 if no number could be parsed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_atoi + * \sa SDL_atof + * \sa SDL_strtol + * \sa SDL_strtoll + * \sa SDL_strtoul + * \sa SDL_strtoull + */ extern SDL_DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); /** @@ -1189,7 +3808,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); @@ -1219,7 +3838,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); @@ -1247,7 +3866,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); @@ -1287,20 +3906,39 @@ extern SDL_DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); +/** + * Searches a string for the first occurence of any character contained in a + * breakset, and returns a pointer from the string to that character. + * + * \param str The null-terminated string to be searched. Must not be NULL, and + * must not overlap with `breakset`. + * \param breakset A null-terminated string containing the list of characters + * to look for. Must not be NULL, and must not overlap with + * `str`. + * \returns A pointer to the location, in str, of the first occurence of a + * character present in the breakset, or NULL if none is found. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC char * SDLCALL SDL_strpbrk(const char *str, const char *breakset); + /** * The Unicode REPLACEMENT CHARACTER codepoint. * - * SDL_StepUTF8() reports this codepoint when it encounters a UTF-8 string - * with encoding errors. + * SDL_StepUTF8() and SDL_StepBackUTF8() report this codepoint when they + * encounter a UTF-8 string with encoding errors. * * This tends to render as something like a question mark in most places. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. * + * \sa SDL_StepBackUTF8 * \sa SDL_StepUTF8 */ #define SDL_INVALID_UNICODE_CODEPOINT 0xFFFD @@ -1346,10 +3984,41 @@ extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *st * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_StepUTF8(const char **pstr, size_t *pslen); +/** + * Decode a UTF-8 string in reverse, one Unicode codepoint at a time. + * + * This will go to the start of the previous Unicode codepoint in the string, + * move `*pstr` to that location and return that codepoint. + * + * If `*pstr` is already at the start of the string), it will not advance + * `*pstr` at all. + * + * Generally this function is called in a loop until it returns zero, + * adjusting its parameter each iteration. + * + * If an invalid UTF-8 sequence is encountered, this function returns + * SDL_INVALID_UNICODE_CODEPOINT. + * + * Several things can generate invalid UTF-8 sequences, including overlong + * encodings, the use of UTF-16 surrogate values, and truncated data. Please + * refer to + * [RFC3629](https://www.ietf.org/rfc/rfc3629.txt) + * for details. + * + * \param start a pointer to the beginning of the UTF-8 string. + * \param pstr a pointer to a UTF-8 string pointer to be read and adjusted. + * \returns the previous Unicode codepoint in the string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_StepBackUTF8(const char *start, const char **pstr); + /** * Convert a single Unicode codepoint to UTF-8. * @@ -1375,18 +4044,200 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_StepUTF8(const char **pstr, size_t *pslen * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_UCS4ToUTF8(Uint32 codepoint, char *dst); - +/** + * This works exactly like sscanf() but doesn't require access to a C runtime. + * + * Scan a string, matching a format string, converting each '%' item and + * storing it to pointers provided through variable arguments. + * + * \param text the string to scan. Must not be NULL. + * \param fmt a printf-style format string. Must not be NULL. + * \param ... a list of pointers to values to be filled in with scanned items. + * \returns the number of items that matched the format string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2); + +/** + * This works exactly like vsscanf() but doesn't require access to a C + * runtime. + * + * Functions identically to SDL_sscanf(), except it takes a `va_list` instead + * of using `...` variable arguments. + * + * \param text the string to scan. Must not be NULL. + * \param fmt a printf-style format string. Must not be NULL. + * \param ap a `va_list` of pointers to values to be filled in with scanned + * items. + * \returns the number of items that matched the format string. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_vsscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, va_list ap) SDL_SCANF_VARARG_FUNCV(2); -extern SDL_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 SDL_DECLSPEC int SDLCALL SDL_swprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const wchar_t *fmt, ... ) SDL_WPRINTF_VARARG_FUNC(3); + +/** + * This works exactly like snprintf() but doesn't require access to a C + * runtime. + * + * Format a string of up to `maxlen`-1 bytes, converting each '%' item with + * values provided through variable arguments. + * + * While some C runtimes differ on how to deal with too-large strings, this + * function null-terminates the output, by treating the null-terminator as + * part of the `maxlen` count. Note that if `maxlen` is zero, however, no + * bytes will be written at all. + * + * This function returns the number of _bytes_ (not _characters_) that should + * be written, excluding the null-terminator character. If this returns a + * number >= `maxlen`, it means the output string was truncated. A negative + * return value means an error occurred. + * + * Referencing the output string's pointer with a format item is undefined + * behavior. + * + * \param text the buffer to write the string into. Must not be NULL. + * \param maxlen the maximum bytes to write, including the null-terminator. + * \param fmt a printf-style format string. Must not be NULL. + * \param ... a list of values to be used with the format string. + * \returns the number of bytes that should be written, not counting the + * null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_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); + +/** + * This works exactly like swprintf() but doesn't require access to a C + * runtime. + * + * Format a wide string of up to `maxlen`-1 wchar_t values, converting each + * '%' item with values provided through variable arguments. + * + * While some C runtimes differ on how to deal with too-large strings, this + * function null-terminates the output, by treating the null-terminator as + * part of the `maxlen` count. Note that if `maxlen` is zero, however, no wide + * characters will be written at all. + * + * This function returns the number of _wide characters_ (not _codepoints_) + * that should be written, excluding the null-terminator character. If this + * returns a number >= `maxlen`, it means the output string was truncated. A + * negative return value means an error occurred. + * + * Referencing the output string's pointer with a format item is undefined + * behavior. + * + * \param text the buffer to write the wide string into. Must not be NULL. + * \param maxlen the maximum wchar_t values to write, including the + * null-terminator. + * \param fmt a printf-style format string. Must not be NULL. + * \param ... a list of values to be used with the format string. + * \returns the number of wide characters that should be written, not counting + * the null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC int SDLCALL SDL_swprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const wchar_t *fmt, ...) SDL_WPRINTF_VARARG_FUNC(3); + +/** + * This works exactly like vsnprintf() but doesn't require access to a C + * runtime. + * + * Functions identically to SDL_snprintf(), except it takes a `va_list` + * instead of using `...` variable arguments. + * + * \param text the buffer to write the string into. Must not be NULL. + * \param maxlen the maximum bytes to write, including the null-terminator. + * \param fmt a printf-style format string. Must not be NULL. + * \param ap a `va_list` values to be used with the format string. + * \returns the number of bytes that should be written, not counting the + * null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(3); -extern SDL_DECLSPEC int SDLCALL SDL_vswprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, const wchar_t *fmt, va_list ap); + +/** + * This works exactly like vswprintf() but doesn't require access to a C + * runtime. + * + * Functions identically to SDL_swprintf(), except it takes a `va_list` + * instead of using `...` variable arguments. + * + * \param text the buffer to write the string into. Must not be NULL. + * \param maxlen the maximum wide characters to write, including the + * null-terminator. + * \param fmt a printf-style format wide string. Must not be NULL. + * \param ap a `va_list` values to be used with the format string. + * \returns the number of wide characters that should be written, not counting + * the null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC int SDLCALL SDL_vswprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const wchar_t *fmt, va_list ap) SDL_WPRINTF_VARARG_FUNCV(3); + +/** + * This works exactly like asprintf() but doesn't require access to a C + * runtime. + * + * Functions identically to SDL_snprintf(), except it allocates a buffer large + * enough to hold the output string on behalf of the caller. + * + * On success, this function returns the number of bytes (not characters) + * comprising the output string, not counting the null-terminator character, + * and sets `*strp` to the newly-allocated string. + * + * On error, this function returns a negative number, and the value of `*strp` + * is undefined. + * + * The returned string is owned by the caller, and should be passed to + * SDL_free when no longer needed. + * + * \param strp on output, is set to the new string. Must not be NULL. + * \param fmt a printf-style format string. Must not be NULL. + * \param ... a list of values to be used with the format string. + * \returns the number of bytes in the newly-allocated string, not counting + * the null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_asprintf(char **strp, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * This works exactly like vasprintf() but doesn't require access to a C + * runtime. + * + * Functions identically to SDL_asprintf(), except it takes a `va_list` + * instead of using `...` variable arguments. + * + * \param strp on output, is set to the new string. Must not be NULL. + * \param fmt a printf-style format string. Must not be NULL. + * \param ap a `va_list` values to be used with the format string. + * \returns the number of bytes in the newly-allocated string, not counting + * the null-terminator char, or a negative value on error. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + */ extern SDL_DECLSPEC int SDLCALL SDL_vasprintf(char **strp, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2); /** @@ -1401,7 +4252,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_vasprintf(char **strp, SDL_PRINTF_FORMAT_STR * \threadsafety This should be called on the same thread that calls * SDL_rand*() * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand * \sa SDL_rand_bits @@ -1436,7 +4287,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_srand(Uint64 seed); * * \threadsafety All calls should be made from a single thread * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_srand * \sa SDL_randf @@ -1459,7 +4310,7 @@ extern SDL_DECLSPEC Sint32 SDLCALL SDL_rand(Sint32 n); * * \threadsafety All calls should be made from a single thread * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_srand * \sa SDL_rand @@ -1481,7 +4332,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_randf(void); * * \threadsafety All calls should be made from a single thread * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand * \sa SDL_randf @@ -1516,7 +4367,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_rand_bits(void); * \threadsafety This function is thread-safe, as long as the state pointer * isn't shared between threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand * \sa SDL_rand_bits_r @@ -1543,7 +4394,7 @@ extern SDL_DECLSPEC Sint32 SDLCALL SDL_rand_r(Uint64 *state, Sint32 n); * \threadsafety This function is thread-safe, as long as the state pointer * isn't shared between threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand_bits_r * \sa SDL_rand_r @@ -1569,18 +4420,34 @@ extern SDL_DECLSPEC float SDLCALL SDL_randf_r(Uint64 *state); * \threadsafety This function is thread-safe, as long as the state pointer * isn't shared between threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand_r * \sa SDL_randf_r */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_rand_bits_r(Uint64 *state); - #ifndef SDL_PI_D + +/** + * The value of Pi, as a double-precision floating point literal. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PI_F + */ #define SDL_PI_D 3.141592653589793238462643383279502884 /**< pi (double) */ #endif + #ifndef SDL_PI_F + +/** + * The value of Pi, as a single-precision floating point literal. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_PI_D + */ #define SDL_PI_F 3.141592653589793238462643383279502884F /**< pi (float) */ #endif @@ -1606,7 +4473,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_rand_bits_r(Uint64 *state); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_acosf * \sa SDL_asin @@ -1636,7 +4503,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_acos(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_acos * \sa SDL_asinf @@ -1666,7 +4533,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_acosf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_asinf * \sa SDL_acos @@ -1696,7 +4563,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_asin(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_asin * \sa SDL_acosf @@ -1728,7 +4595,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_asinf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atanf * \sa SDL_atan2 @@ -1760,7 +4627,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_atan(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atan * \sa SDL_atan2f @@ -1796,7 +4663,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_atanf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atan2f * \sa SDL_atan @@ -1832,7 +4699,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_atan2(double y, double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atan2f * \sa SDL_atan @@ -1858,7 +4725,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_atan2f(float y, float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ceilf * \sa SDL_floor @@ -1886,7 +4753,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_ceil(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ceil * \sa SDL_floorf @@ -1915,7 +4782,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_ceilf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_copysignf * \sa SDL_fabs @@ -1941,7 +4808,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_copysign(double x, double y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_copysignf * \sa SDL_fabsf @@ -1968,7 +4835,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_copysignf(float x, float y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_cosf * \sa SDL_acos @@ -1996,7 +4863,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_cos(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_cos * \sa SDL_acosf @@ -2029,7 +4896,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_cosf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_expf * \sa SDL_log @@ -2061,7 +4928,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_exp(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_exp * \sa SDL_logf @@ -2083,7 +4950,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_expf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fabsf */ @@ -2104,7 +4971,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_fabs(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fabs */ @@ -2128,7 +4995,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_fabsf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_floorf * \sa SDL_ceil @@ -2156,7 +5023,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_floor(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_floor * \sa SDL_ceilf @@ -2184,7 +5051,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_floorf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_truncf * \sa SDL_fmod @@ -2213,7 +5080,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_trunc(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_trunc * \sa SDL_fmodf @@ -2242,7 +5109,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_truncf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fmodf * \sa SDL_modf @@ -2272,7 +5139,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_fmod(double x, double y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fmod * \sa SDL_truncf @@ -2292,7 +5159,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_fmodf(float x, float y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isinff */ @@ -2306,7 +5173,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isinf(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isinf */ @@ -2320,7 +5187,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isinff(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isnanf */ @@ -2334,7 +5201,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isnan(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isnan */ @@ -2362,7 +5229,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isnanf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_logf * \sa SDL_log10 @@ -2392,7 +5259,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_log(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_log * \sa SDL_expf @@ -2421,7 +5288,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_logf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_log10f * \sa SDL_log @@ -2451,7 +5318,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_log10(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_log10 * \sa SDL_logf @@ -2471,7 +5338,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_log10f(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_modff * \sa SDL_trunc @@ -2491,7 +5358,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_modf(double x, double *y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_modf * \sa SDL_truncf @@ -2523,7 +5390,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_modff(float x, float *y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_powf * \sa SDL_exp @@ -2555,7 +5422,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_pow(double x, double y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_pow * \sa SDL_expf @@ -2582,7 +5449,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_powf(float x, float y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_roundf * \sa SDL_lround @@ -2611,7 +5478,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_round(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_round * \sa SDL_lroundf @@ -2640,7 +5507,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_roundf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_lroundf * \sa SDL_round @@ -2669,7 +5536,7 @@ extern SDL_DECLSPEC long SDLCALL SDL_lround(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_lround * \sa SDL_roundf @@ -2697,7 +5564,7 @@ extern SDL_DECLSPEC long SDLCALL SDL_lroundf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_scalbnf * \sa SDL_pow @@ -2722,7 +5589,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_scalbn(double x, int n); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_scalbn * \sa SDL_powf @@ -2749,7 +5616,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_scalbnf(float x, int n); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sinf * \sa SDL_asin @@ -2765,7 +5632,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_sin(double x); * Range: `-1 <= y <= 1` * * This function operates on single-precision floating point values, use - * SDL_sinf for double-precision floats. + * SDL_sin for double-precision floats. * * This function may use a different approximation across different versions, * platforms and configurations. i.e, it can return a different value given @@ -2777,7 +5644,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_sin(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sin * \sa SDL_asinf @@ -2805,7 +5672,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_sinf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sqrtf */ @@ -2831,7 +5698,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_sqrt(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sqrt */ @@ -2857,7 +5724,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_sqrtf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_tanf * \sa SDL_sin @@ -2887,7 +5754,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_tan(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_tan * \sa SDL_sinf @@ -2897,12 +5764,13 @@ extern SDL_DECLSPEC double SDLCALL SDL_tan(double x); */ extern SDL_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 - +/** + * An opaque handle representing string encoding conversion state. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_iconv_open + */ typedef struct SDL_iconv_data_t *SDL_iconv_t; /** @@ -2914,7 +5782,7 @@ typedef struct SDL_iconv_data_t *SDL_iconv_t; * \returns a handle that must be freed with SDL_iconv_close, or * SDL_ICONV_ERROR on failure. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv * \sa SDL_iconv_close @@ -2929,7 +5797,7 @@ extern SDL_DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, * \param cd The character set conversion handle. * \returns 0 on success, or -1 on failure. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv * \sa SDL_iconv_open @@ -2941,7 +5809,22 @@ extern SDL_DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); * This function converts text between encodings, reading from and writing to * a buffer. * - * It returns the number of succesful conversions. + * It returns the number of succesful conversions on success. On error, + * SDL_ICONV_E2BIG is returned when the output buffer is too small, or + * SDL_ICONV_EILSEQ is returned when an invalid input sequence is encountered, + * or SDL_ICONV_EINVAL is returned when an incomplete input sequence is + * encountered. + * + * On exit: + * + * - inbuf will point to the beginning of the next multibyte sequence. On + * error, this is the location of the problematic input sequence. On + * success, this is the end of the input sequence. + * - inbytesleft will be set to the number of bytes left to convert, which + * will be 0 on success. + * - outbuf will point to the location where to store the next output byte. + * - outbytesleft will be set to the number of bytes left in the output + * buffer. * * \param cd The character set conversion context, created in * SDL_iconv_open(). @@ -2950,23 +5833,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); * \param inbytesleft The number of bytes in the input buffer. * \param outbuf Address of variable that points to the output buffer. * \param outbytesleft The number of bytes in the output buffer. - * \returns the number of conversions on success, else SDL_ICONV_E2BIG is - * returned when the output buffer is too small, or SDL_ICONV_EILSEQ - * is returned when an invalid input sequence is encountered, or - * SDL_ICONV_EINVAL is returned when an incomplete input sequence is - * encountered. + * \returns the number of conversions on success, or a negative error code. * - * On exit: - * - * - inbuf will point to the beginning of the next multibyte - * sequence. On error, this is the location of the problematic - * input sequence. On success, this is the end of the input - * sequence. - inbytesleft will be set to the number of bytes left - * to convert, which will be 0 on success. - outbuf will point to - * the location where to store the next output byte. - outbytesleft - * will be set to the number of bytes left in the output buffer. - * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv_open * \sa SDL_iconv_close @@ -2976,6 +5845,12 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); +#define SDL_ICONV_ERROR (size_t)-1 /**< Generic error. Check SDL_GetError()? */ +#define SDL_ICONV_E2BIG (size_t)-2 /**< Output buffer was too small. */ +#define SDL_ICONV_EILSEQ (size_t)-3 /**< Invalid input sequence was encountered. */ +#define SDL_ICONV_EINVAL (size_t)-4 /**< Incomplete input sequence was encountered. */ + + /** * Helper function to convert a string's encoding in one call. * @@ -2995,7 +5870,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, * \param inbytesleft the size of the input string _in bytes_. * \returns a new string, converted to the new encoding, or NULL on error. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv_open * \sa SDL_iconv_close @@ -3006,12 +5881,65 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *inbuf, size_t inbytesleft); -/* Some helper macros for common cases... */ +/* Some helper macros for common SDL_iconv_string cases... */ + +/** + * Convert a UTF-8 string to the current locale's character encoding. + * + * This is a helper macro that might be more clear than calling + * SDL_iconv_string directly. However, it double-evaluates its parameter, so + * do not use an expression with side-effects here. + * + * \param S the string to convert. + * \returns a new string, converted to the new encoding, or NULL on error. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) + +/** + * Convert a UTF-8 string to UCS-2. + * + * This is a helper macro that might be more clear than calling + * SDL_iconv_string directly. However, it double-evaluates its parameter, so + * do not use an expression with side-effects here. + * + * \param S the string to convert. + * \returns a new string, converted to the new encoding, or NULL on error. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) + +/** + * Convert a UTF-8 string to UCS-4. + * + * This is a helper macro that might be more clear than calling + * SDL_iconv_string directly. However, it double-evaluates its parameter, so + * do not use an expression with side-effects here. + * + * \param S the string to convert. + * \returns a new string, converted to the new encoding, or NULL on error. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) + +/** + * Convert a wchar_t string to UTF-8. + * + * This is a helper macro that might be more clear than calling + * SDL_iconv_string directly. However, it double-evaluates its parameter, so + * do not use an expression with side-effects here. + * + * \param S the string to convert. + * \returns a new string, converted to the new encoding, or NULL on error. + * + * \since This macro is available since SDL 3.2.0. + */ #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) @@ -3034,6 +5962,9 @@ size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t size); size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size); #endif +/* strdup is not ANSI but POSIX, and its prototype might be hidden... */ +char *strdup(const char *str); + /* Starting LLVM 16, the analyser errors out if these functions do not have their prototype defined (clang-diagnostic-implicit-function-declaration) */ #include @@ -3073,6 +6004,7 @@ size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size); #define SDL_wcsncmp wcsncmp #define SDL_strcasecmp strcasecmp #define SDL_strncasecmp strncasecmp +#define SDL_strpbrk strpbrk #define SDL_sscanf sscanf #define SDL_vsscanf vsscanf #define SDL_snprintf snprintf @@ -3082,29 +6014,27 @@ size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size); /** * Multiply two integers, checking for overflow. * - * If `a * b` would overflow, return -1. + * If `a * b` would overflow, return false. * - * Otherwise store `a * b` via ret and return 0. + * Otherwise store `a * b` via ret and return true. * * \param a the multiplicand. * \param b the multiplier. - * \param ret on non-overflow output, stores the multiplication result. May + * \param ret on non-overflow output, stores the multiplication result, may * not be NULL. - * \returns -1 on overflow, 0 if result doesn't overflow. + * \returns false on overflow, true if result is multiplied without overflow. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE int SDL_size_mul_overflow (size_t a, - size_t b, - size_t *ret) +SDL_FORCE_INLINE bool SDL_size_mul_check_overflow(size_t a, size_t b, size_t *ret) { if (a != 0 && b > SDL_SIZE_MAX / a) { - return -1; + return false; } *ret = a * b; - return 0; + return true; } #ifndef SDL_WIKI_DOCUMENTATION_SECTION @@ -3112,60 +6042,72 @@ SDL_FORCE_INLINE int SDL_size_mul_overflow (size_t a, /* 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) +SDL_FORCE_INLINE bool SDL_size_mul_check_overflow_builtin(size_t a, size_t b, size_t *ret) { - return __builtin_mul_overflow(a, b, ret) == 0 ? 0 : -1; + return (__builtin_mul_overflow(a, b, ret) == 0); } -#define SDL_size_mul_overflow(a, b, ret) (SDL_size_mul_overflow_builtin(a, b, ret)) +#define SDL_size_mul_check_overflow(a, b, ret) SDL_size_mul_check_overflow_builtin(a, b, ret) #endif #endif /** * Add two integers, checking for overflow. * - * If `a + b` would overflow, return -1. + * If `a + b` would overflow, return false. * - * Otherwise store `a + b` via ret and return 0. + * Otherwise store `a + b` via ret and return true. * * \param a the first addend. * \param b the second addend. - * \param ret on non-overflow output, stores the addition result. May not be + * \param ret on non-overflow output, stores the addition result, may not be * NULL. - * \returns -1 on overflow, 0 if result doesn't overflow. + * \returns false on overflow, true if result is added without overflow. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE int SDL_size_add_overflow (size_t a, - size_t b, - size_t *ret) +SDL_FORCE_INLINE bool SDL_size_add_check_overflow(size_t a, size_t b, size_t *ret) { if (b > SDL_SIZE_MAX - a) { - return -1; + return false; } *ret = a + b; - return 0; + return true; } #ifndef SDL_WIKI_DOCUMENTATION_SECTION #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) +SDL_FORCE_INLINE bool SDL_size_add_check_overflow_builtin(size_t a, size_t b, size_t *ret) { - return __builtin_add_overflow(a, b, ret) == 0 ? 0 : -1; + return (__builtin_add_overflow(a, b, ret) == 0); } -#define SDL_size_add_overflow(a, b, ret) (SDL_size_add_overflow_builtin(a, b, ret)) +#define SDL_size_add_check_overflow(a, b, ret) SDL_size_add_check_overflow_builtin(a, b, ret) #endif #endif /* This is a generic function pointer which should be cast to the type you expect */ -#ifdef SDL_FUNCTION_POINTER_IS_VOID_POINTER +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A generic function pointer. + * + * In theory, generic function pointers should use this, instead of `void *`, + * since some platforms could treat code addresses differently than data + * addresses. Although in current times no popular platforms make this + * distinction, it is more correct and portable to use the correct type for a + * generic pointer. + * + * If for some reason you need to force this typedef to be an actual `void *`, + * perhaps to work around a compiler or existing code, you can define + * `SDL_FUNCTION_POINTER_IS_VOID_POINTER` before including any SDL headers. + * + * \since This datatype is available since SDL 3.2.0. + */ +typedef void (*SDL_FunctionPointer)(void); +#elif defined(SDL_FUNCTION_POINTER_IS_VOID_POINTER) typedef void *SDL_FunctionPointer; #else typedef void (*SDL_FunctionPointer)(void); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_storage.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_storage.h index 91a90bc..8b89ace 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_storage.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_storage.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,222 @@ /** * # CategoryStorage * - * SDL storage container management. + * The storage API is a high-level API designed to abstract away the + * portability issues that come up when using something lower-level (in SDL's + * case, this sits on top of the [Filesystem](CategoryFilesystem) and + * [IOStream](CategoryIOStream) subsystems). It is significantly more + * restrictive than a typical filesystem API, for a number of reasons: + * + * 1. **What to Access:** A common pitfall with existing filesystem APIs is + * the assumption that all storage is monolithic. However, many other + * platforms (game consoles in particular) are more strict about what _type_ + * of filesystem is being accessed; for example, game content and user data + * are usually two separate storage devices with entirely different + * characteristics (and possibly different low-level APIs altogether!). + * + * 2. **How to Access:** Another common mistake is applications assuming that + * all storage is universally writeable - again, many platforms treat game + * content and user data as two separate storage devices, and only user data + * is writeable while game content is read-only. + * + * 3. **When to Access:** The most common portability issue with filesystem + * access is _timing_ - you cannot always assume that the storage device is + * always accessible all of the time, nor can you assume that there are no + * limits to how long you have access to a particular device. + * + * Consider the following example: + * + * ```c + * void ReadGameData(void) + * { + * extern char** fileNames; + * extern size_t numFiles; + * for (size_t i = 0; i < numFiles; i += 1) { + * FILE *data = fopen(fileNames[i], "rwb"); + * if (data == NULL) { + * // Something bad happened! + * } else { + * // A bunch of stuff happens here + * fclose(data); + * } + * } + * } + * + * void ReadSave(void) + * { + * FILE *save = fopen("saves/save0.sav", "rb"); + * if (save == NULL) { + * // Something bad happened! + * } else { + * // A bunch of stuff happens here + * fclose(save); + * } + * } + * + * void WriteSave(void) + * { + * FILE *save = fopen("saves/save0.sav", "wb"); + * if (save == NULL) { + * // Something bad happened! + * } else { + * // A bunch of stuff happens here + * fclose(save); + * } + * } + * ``` + * + * Going over the bullet points again: + * + * 1. **What to Access:** This code accesses a global filesystem; game data + * and saves are all presumed to be in the current working directory (which + * may or may not be the game's installation folder!). + * + * 2. **How to Access:** This code assumes that content paths are writeable, + * and that save data is also writeable despite being in the same location as + * the game data. + * + * 3. **When to Access:** This code assumes that they can be called at any + * time, since the filesystem is always accessible and has no limits on how + * long the filesystem is being accessed. + * + * Due to these assumptions, the filesystem code is not portable and will fail + * under these common scenarios: + * + * - The game is installed on a device that is read-only, both content loading + * and game saves will fail or crash outright + * - Game/User storage is not implicitly mounted, so no files will be found + * for either scenario when a platform requires explicitly mounting + * filesystems + * - Save data may not be safe since the I/O is not being flushed or + * validated, so an error occurring elsewhere in the program may result in + * missing/corrupted save data + * + * When using SDL_Storage, these types of problems are virtually impossible to + * trip over: + * + * ```c + * void ReadGameData(void) + * { + * extern char** fileNames; + * extern size_t numFiles; + * + * SDL_Storage *title = SDL_OpenTitleStorage(NULL, 0); + * if (title == NULL) { + * // Something bad happened! + * } + * while (!SDL_StorageReady(title)) { + * SDL_Delay(1); + * } + * + * for (size_t i = 0; i < numFiles; i += 1) { + * void* dst; + * Uint64 dstLen = 0; + * + * if (SDL_GetStorageFileSize(title, fileNames[i], &dstLen) && dstLen > 0) { + * dst = SDL_malloc(dstLen); + * if (SDL_ReadStorageFile(title, fileNames[i], dst, dstLen)) { + * // A bunch of stuff happens here + * } else { + * // Something bad happened! + * } + * SDL_free(dst); + * } else { + * // Something bad happened! + * } + * } + * + * SDL_CloseStorage(title); + * } + * + * void ReadSave(void) + * { + * SDL_Storage *user = SDL_OpenUserStorage("libsdl", "Storage Example", 0); + * if (user == NULL) { + * // Something bad happened! + * } + * while (!SDL_StorageReady(user)) { + * SDL_Delay(1); + * } + * + * Uint64 saveLen = 0; + * if (SDL_GetStorageFileSize(user, "save0.sav", &saveLen) && saveLen > 0) { + * void* dst = SDL_malloc(saveLen); + * if (SDL_ReadStorageFile(user, "save0.sav", dst, saveLen)) { + * // A bunch of stuff happens here + * } else { + * // Something bad happened! + * } + * SDL_free(dst); + * } else { + * // Something bad happened! + * } + * + * SDL_CloseStorage(user); + * } + * + * void WriteSave(void) + * { + * SDL_Storage *user = SDL_OpenUserStorage("libsdl", "Storage Example", 0); + * if (user == NULL) { + * // Something bad happened! + * } + * while (!SDL_StorageReady(user)) { + * SDL_Delay(1); + * } + * + * extern void *saveData; // A bunch of stuff happened here... + * extern Uint64 saveLen; + * if (!SDL_WriteStorageFile(user, "save0.sav", saveData, saveLen)) { + * // Something bad happened! + * } + * + * SDL_CloseStorage(user); + * } + * ``` + * + * Note the improvements that SDL_Storage makes: + * + * 1. **What to Access:** This code explicitly reads from a title or user + * storage device based on the context of the function. + * + * 2. **How to Access:** This code explicitly uses either a read or write + * function based on the context of the function. + * + * 3. **When to Access:** This code explicitly opens the device when it needs + * to, and closes it when it is finished working with the filesystem. + * + * The result is an application that is significantly more robust against the + * increasing demands of platforms and their filesystems! + * + * A publicly available example of an SDL_Storage backend is the + * [Steam Cloud](https://partner.steamgames.com/doc/features/cloud) + * backend - you can initialize Steamworks when starting the program, and then + * SDL will recognize that Steamworks is initialized and automatically use + * ISteamRemoteStorage when the application opens user storage. More + * importantly, when you _open_ storage it knows to begin a "batch" of + * filesystem operations, and when you _close_ storage it knows to end and + * flush the batch. This is used by Steam to support + * [Dynamic Cloud Sync](https://steamcommunity.com/groups/steamworks/announcements/detail/3142949576401813670) + * ; users can save data on one PC, put the device to sleep, and then continue + * playing on another PC (and vice versa) with the save data fully + * synchronized across all devices, allowing for a seamless experience without + * having to do full restarts of the program. + * + * ## Notes on valid paths + * + * All paths in the Storage API use Unix-style path separators ('/'). Using a + * different path separator will not work, even if the underlying platform + * would otherwise accept it. This is to keep code using the Storage API + * portable between platforms and Storage implementations and simplify app + * code. + * + * Paths with relative directories ("." and "..") are forbidden by the Storage + * API. + * + * All valid UTF-8 strings (discounting the NULL terminator character and the + * '/' path separator) are usable for filenames, however, an underlying + * Storage implementation may not support particularly strange sequences and + * refuse to create files with those names, etc. */ #ifndef SDL_storage_h_ @@ -40,8 +255,6 @@ extern "C" { #endif -/* !!! FIXME: Don't let this ship without async R/W support!!! */ - /** * Function interface for SDL_Storage. * @@ -52,44 +265,61 @@ extern "C" { * It is not usually necessary to do this; SDL provides standard * implementations for many things you might expect to do with an SDL_Storage. * - * \since This struct is available since SDL 3.0.0. + * This structure should be initialized using SDL_INIT_INTERFACE() + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_INIT_INTERFACE */ typedef struct SDL_StorageInterface { + /* The version of this interface */ + Uint32 version; + /* Called when the storage is closed */ - SDL_bool (SDLCALL *close)(void *userdata); + bool (SDLCALL *close)(void *userdata); /* Optional, returns whether the storage is currently ready for access */ - SDL_bool (SDLCALL *ready)(void *userdata); + bool (SDLCALL *ready)(void *userdata); /* Enumerate a directory, optional for write-only storage */ - SDL_bool (SDLCALL *enumerate)(void *userdata, const char *path, SDL_EnumerateDirectoryCallback callback, void *callback_userdata); + bool (SDLCALL *enumerate)(void *userdata, const char *path, SDL_EnumerateDirectoryCallback callback, void *callback_userdata); /* Get path information, optional for write-only storage */ - SDL_bool (SDLCALL *info)(void *userdata, const char *path, SDL_PathInfo *info); + bool (SDLCALL *info)(void *userdata, const char *path, SDL_PathInfo *info); /* Read a file from storage, optional for write-only storage */ - SDL_bool (SDLCALL *read_file)(void *userdata, const char *path, void *destination, Uint64 length); + bool (SDLCALL *read_file)(void *userdata, const char *path, void *destination, Uint64 length); /* Write a file to storage, optional for read-only storage */ - SDL_bool (SDLCALL *write_file)(void *userdata, const char *path, const void *source, Uint64 length); + bool (SDLCALL *write_file)(void *userdata, const char *path, const void *source, Uint64 length); /* Create a directory, optional for read-only storage */ - SDL_bool (SDLCALL *mkdir)(void *userdata, const char *path); + bool (SDLCALL *mkdir)(void *userdata, const char *path); /* Remove a file or empty directory, optional for read-only storage */ - SDL_bool (SDLCALL *remove)(void *userdata, const char *path); + bool (SDLCALL *remove)(void *userdata, const char *path); /* Rename a path, optional for read-only storage */ - SDL_bool (SDLCALL *rename)(void *userdata, const char *oldpath, const char *newpath); + bool (SDLCALL *rename)(void *userdata, const char *oldpath, const char *newpath); /* Copy a file, optional for read-only storage */ - SDL_bool (SDLCALL *copy)(void *userdata, const char *oldpath, const char *newpath); + bool (SDLCALL *copy)(void *userdata, const char *oldpath, const char *newpath); /* Get the space remaining, optional for read-only storage */ Uint64 (SDLCALL *space_remaining)(void *userdata); } SDL_StorageInterface; +/* Check the size of SDL_StorageInterface + * + * If this assert fails, either the compiler is padding to an unexpected size, + * or the interface has been updated and this should be updated to match and + * the code using this interface should be updated to handle the old version. + */ +SDL_COMPILE_TIME_ASSERT(SDL_StorageInterface_SIZE, + (sizeof(void *) == 4 && sizeof(SDL_StorageInterface) == 48) || + (sizeof(void *) == 8 && sizeof(SDL_StorageInterface) == 96)); + /** * An abstract interface for filesystem access. * @@ -97,7 +327,7 @@ typedef struct SDL_StorageInterface * functions like SDL_OpenTitleStorage or SDL_OpenUserStorage, etc, or create * an object with a custom implementation using SDL_OpenStorage. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Storage SDL_Storage; @@ -109,7 +339,7 @@ typedef struct SDL_Storage SDL_Storage; * \returns a title storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize @@ -132,7 +362,7 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenTitleStorage(const char *overr * \returns a user storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize @@ -156,7 +386,7 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenUserStorage(const char *org, c * \returns a filesystem storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize @@ -176,16 +406,21 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenFileStorage(const char *path); * should use the built-in implementations in SDL, like SDL_OpenTitleStorage() * or SDL_OpenUserStorage(). * - * \param iface the function table to be used by this container. - * \param userdata the pointer that will be passed to the store interface. + * This function makes a copy of `iface` and the caller does not need to keep + * it around after this call. + * + * \param iface the interface that implements this storage, initialized using + * SDL_INIT_INTERFACE(). + * \param userdata the pointer that will be passed to the interface functions. * \returns a storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize * \sa SDL_GetStorageSpaceRemaining + * \sa SDL_INIT_INTERFACE * \sa SDL_ReadStorageFile * \sa SDL_StorageReady * \sa SDL_WriteStorageFile @@ -196,33 +431,33 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenStorage(const SDL_StorageInter * Closes and frees a storage container. * * \param storage a storage container to close. - * \returns SDL_TRUE if the container was freed with no errors, SDL_FALSE - * otherwise; call SDL_GetError() for more information. Even if the - * function returns an error, the container data will be freed; the - * error is only for informational purposes. + * \returns true if the container was freed with no errors, false otherwise; + * call SDL_GetError() for more information. Even if the function + * returns an error, the container data will be freed; the error is + * only for informational purposes. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenFileStorage * \sa SDL_OpenStorage * \sa SDL_OpenTitleStorage * \sa SDL_OpenUserStorage */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CloseStorage(SDL_Storage *storage); +extern SDL_DECLSPEC bool SDLCALL SDL_CloseStorage(SDL_Storage *storage); /** * Checks if the storage container is ready to use. * - * This function should be called in regular intervals until it returns - * SDL_TRUE - however, it is not recommended to spinwait on this call, as the - * backend may depend on a synchronous message loop. + * This function should be called in regular intervals until it returns true - + * however, it is not recommended to spinwait on this call, as the backend may + * depend on a synchronous message loop. * * \param storage a storage container to query. - * \returns SDL_TRUE if the container is ready, SDL_FALSE otherwise. + * \returns true if the container is ready, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StorageReady(SDL_Storage *storage); +extern SDL_DECLSPEC bool SDLCALL SDL_StorageReady(SDL_Storage *storage); /** * Query the size of a file within a storage container. @@ -230,34 +465,38 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_StorageReady(SDL_Storage *storage); * \param storage a storage container to query. * \param path the relative path of the file to query. * \param length a pointer to be filled with the file's length. - * \returns SDL_TRUE if the file could be queried or SDL_FALSE on failure; - * call SDL_GetError() for more information. + * \returns true if the file could be queried or false on failure; call + * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ReadStorageFile * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetStorageFileSize(SDL_Storage *storage, const char *path, Uint64 *length); +extern SDL_DECLSPEC bool SDLCALL SDL_GetStorageFileSize(SDL_Storage *storage, const char *path, Uint64 *length); /** * Synchronously read a file from a storage container into a client-provided * buffer. * + * The value of `length` must match the length of the file exactly; call + * SDL_GetStorageFileSize() to get this value. This behavior may be relaxed in + * a future release. + * * \param storage a storage container to read from. * \param path the relative path of the file to read. * \param destination a client-provided buffer to read the file into. * \param length the length of the destination buffer. - * \returns SDL_TRUE if the file was read or SDL_FALSE on failure; call - * SDL_GetError() for more information. + * \returns true if the file was read or false on failure; call SDL_GetError() + * for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetStorageFileSize * \sa SDL_StorageReady * \sa SDL_WriteStorageFile */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadStorageFile(SDL_Storage *storage, const char *path, void *destination, Uint64 length); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadStorageFile(SDL_Storage *storage, const char *path, void *destination, Uint64 length); /** * Synchronously write a file from client memory into a storage container. @@ -266,64 +505,73 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadStorageFile(SDL_Storage *storage, c * \param path the relative path of the file to write. * \param source a client-provided buffer to write from. * \param length the length of the source buffer. - * \returns SDL_TRUE if the file was written or SDL_FALSE on failure; call + * \returns true if the file was written or false on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetStorageSpaceRemaining * \sa SDL_ReadStorageFile * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteStorageFile(SDL_Storage *storage, const char *path, const void *source, Uint64 length); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteStorageFile(SDL_Storage *storage, const char *path, const void *source, Uint64 length); /** * Create a directory in a writable storage container. * * \param storage a storage container. * \param path the path of the directory to create. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CreateStorageDirectory(SDL_Storage *storage, const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_CreateStorageDirectory(SDL_Storage *storage, const char *path); /** * Enumerate a directory in a storage container through a callback function. * * This function provides every directory entry through an app-provided * callback, called once for each directory entry, until all results have been - * provided or the callback returns <= 0. + * provided or the callback returns either SDL_ENUM_SUCCESS or + * SDL_ENUM_FAILURE. + * + * This will return false if there was a system problem in general, or if a + * callback returns SDL_ENUM_FAILURE. A successful return means a callback + * returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries + * were enumerated. + * + * If `path` is NULL, this is treated as a request to enumerate the root of + * the storage container's tree. An empty string also works for this. * * \param storage a storage container. - * \param path the path of the directory to enumerate. + * \param path the path of the directory to enumerate, or NULL for the root. * \param callback a function that is called for each entry in the directory. * \param userdata a pointer that is passed to `callback`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnumerateStorageDirectory(SDL_Storage *storage, const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateStorageDirectory(SDL_Storage *storage, const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata); /** * Remove a file or an empty directory in a writable storage container. * * \param storage a storage container. * \param path the path of the directory to enumerate. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RemoveStoragePath(SDL_Storage *storage, const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_RemoveStoragePath(SDL_Storage *storage, const char *path); /** * Rename a file or directory in a writable storage container. @@ -331,14 +579,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RemoveStoragePath(SDL_Storage *storage, * \param storage a storage container. * \param oldpath the old path. * \param newpath the new path. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenameStoragePath(SDL_Storage *storage, const char *oldpath, const char *newpath); +extern SDL_DECLSPEC bool SDLCALL SDL_RenameStoragePath(SDL_Storage *storage, const char *oldpath, const char *newpath); /** * Copy a file in a writable storage container. @@ -346,14 +594,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RenameStoragePath(SDL_Storage *storage, * \param storage a storage container. * \param oldpath the old path. * \param newpath the new path. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyStorageFile(SDL_Storage *storage, const char *oldpath, const char *newpath); +extern SDL_DECLSPEC bool SDLCALL SDL_CopyStorageFile(SDL_Storage *storage, const char *oldpath, const char *newpath); /** * Get information about a filesystem path in a storage container. @@ -362,14 +610,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_CopyStorageFile(SDL_Storage *storage, c * \param path the path to query. * \param info a pointer filled in with information about the path, or NULL to * check for the existence of a file. - * \returns SDL_TRUE on success or SDL_FALSE if the file doesn't exist, or - * another failure; call SDL_GetError() for more information. + * \returns true on success or false if the file doesn't exist, or another + * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetStoragePathInfo(SDL_Storage *storage, const char *path, SDL_PathInfo *info); +extern SDL_DECLSPEC bool SDLCALL SDL_GetStoragePathInfo(SDL_Storage *storage, const char *path, SDL_PathInfo *info); /** * Queries the remaining space in a storage container. @@ -377,7 +625,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetStoragePathInfo(SDL_Storage *storage * \param storage a storage container to query. * \returns the amount of remaining space, in bytes. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady * \sa SDL_WriteStorageFile @@ -401,8 +649,11 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetStorageSpaceRemaining(SDL_Storage *sto * convenience, but if `count` is non-NULL, on return it will contain the * number of items in the array, not counting the NULL terminator. * + * If `path` is NULL, this is treated as a request to enumerate the root of + * the storage container's tree. An empty string also works for this. + * * \param storage a storage container. - * \param path the path of the directory to enumerate. + * \param path the path of the directory to enumerate, or NULL for the root. * \param pattern the pattern that files in the directory must match. Can be * NULL. * \param flags `SDL_GLOB_*` bitflags that affect this search. @@ -417,7 +668,7 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetStorageSpaceRemaining(SDL_Storage *sto * \threadsafety It is safe to call this function from any thread, assuming * the `storage` object is thread-safe. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char ** SDLCALL SDL_GlobStorageDirectory(SDL_Storage *storage, const char *path, const char *pattern, SDL_GlobFlags flags, int *count); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_surface.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_surface.h index aafe574..0752f53 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_surface.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_surface.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,19 @@ /** * # CategorySurface * - * SDL_Surface definition and management functions. + * SDL surfaces are buffers of pixels in system RAM. These are useful for + * passing around and manipulating images that are not stored in GPU memory. + * + * SDL_Surface makes serious efforts to manage images in various formats, and + * provides a reasonable toolbox for transforming the data, including copying + * between surfaces, filling rectangles in the image data, etc. + * + * There is also a simple .bmp loader, SDL_LoadBMP(). SDL itself does not + * provide loaders for various other file formats, but there are several + * excellent external libraries that do, including its own satellite library, + * SDL_image: + * + * https://github.com/libsdl-org/SDL_image */ #ifndef SDL_surface_h_ @@ -47,7 +59,7 @@ extern "C" { * * These are generally considered read-only. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_SurfaceFlags; @@ -59,14 +71,14 @@ typedef Uint32 SDL_SurfaceFlags; /** * Evaluates to true if the surface needs to be locked before access. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MUSTLOCK(S) ((((S)->flags & SDL_SURFACE_LOCK_NEEDED)) == SDL_SURFACE_LOCK_NEEDED) /** * The scaling mode. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ScaleMode { @@ -77,7 +89,7 @@ typedef enum SDL_ScaleMode /** * The flip mode. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_FlipMode { @@ -86,8 +98,7 @@ typedef enum SDL_FlipMode SDL_FLIP_VERTICAL /**< flip vertically */ } SDL_FlipMode; -/* Internal surface data */ -typedef struct SDL_SurfaceData SDL_SurfaceData; +#ifndef SDL_INTERNAL /** * A collection of pixels used in software blitting. @@ -104,22 +115,32 @@ typedef struct SDL_SurfaceData SDL_SurfaceData; * remaining bytes to reach the pitch are used as padding to reach a desired * alignment, and have undefined contents. * - * \since This struct is available since SDL 3.0.0. + * When a surface holds YUV format data, the planes are assumed to be + * contiguous without padding between them, e.g. a 32x32 surface in NV12 + * format with a pitch of 32 would consist of 32x32 bytes of Y plane followed + * by 32x16 bytes of UV plane. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_CreateSurface + * \sa SDL_DestroySurface */ -typedef struct SDL_Surface +struct SDL_Surface { - SDL_SurfaceFlags flags; /**< Read-only */ - SDL_PixelFormat format; /**< Read-only */ - int w, h; /**< Read-only */ - int pitch; /**< Read-only */ - void *pixels; /**< Read-only pointer, writable pixels if non-NULL */ + SDL_SurfaceFlags flags; /**< The flags of the surface, read-only */ + SDL_PixelFormat format; /**< The format of the surface, read-only */ + int w; /**< The width of the surface, read-only. */ + int h; /**< The height of the surface, read-only. */ + int pitch; /**< The distance in bytes between rows of pixels, read-only */ + void *pixels; /**< A pointer to the pixels of the surface, the pixels are writeable if non-NULL */ int refcount; /**< Application reference count, used when freeing surface */ - SDL_SurfaceData *internal; /**< Private */ - -} SDL_Surface; + void *reserved; /**< Reserved for internal use */ +}; +#endif /* !SDL_INTERNAL */ +typedef struct SDL_Surface SDL_Surface; /** * Allocate a new surface with a specific pixel format. @@ -132,7 +153,7 @@ typedef struct SDL_Surface * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSurfaceFrom * \sa SDL_DestroySurface @@ -160,7 +181,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_CreateSurface(int width, int heigh * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSurface * \sa SDL_DestroySurface @@ -174,9 +195,8 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_CreateSurfaceFrom(int width, int h * * \param surface the SDL_Surface to free. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_CreateStackSurface * \sa SDL_CreateSurface * \sa SDL_CreateSurfaceFrom */ @@ -206,7 +226,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroySurface(SDL_Surface *surface); * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSurfaceProperties(SDL_Surface *surface); @@ -221,16 +241,16 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSurfaceProperties(SDL_Surfac * interpreted in color operations. * * \param surface the SDL_Surface structure to update. - * \param colorspace an SDL_ColorSpace value describing the surface + * \param colorspace an SDL_Colorspace value describing the surface * colorspace. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorspace */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceColorspace(SDL_Surface *surface, SDL_Colorspace colorspace); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorspace(SDL_Surface *surface, SDL_Colorspace colorspace); /** * Get the colorspace used by a surface. @@ -243,7 +263,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceColorspace(SDL_Surface *surfa * \returns the colorspace used by the surface, or SDL_COLORSPACE_UNKNOWN if * the surface is NULL. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceColorspace */ @@ -271,7 +291,7 @@ extern SDL_DECLSPEC SDL_Colorspace SDLCALL SDL_GetSurfaceColorspace(SDL_Surface * the surface didn't have an index format); call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetPaletteColors */ @@ -284,15 +304,15 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_CreateSurfacePalette(SDL_Surface * * * \param surface the SDL_Surface structure to update. * \param palette the SDL_Palette structure to use. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePalette * \sa SDL_GetSurfacePalette */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette); /** * Get the palette used by a surface. @@ -301,7 +321,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfacePalette(SDL_Surface *surface, * \returns a pointer to the palette used by the surface, or NULL if there is * no palette used. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfacePalette */ @@ -321,31 +341,30 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_GetSurfacePalette(SDL_Surface *sur * \param surface the SDL_Surface structure to update. * \param image a pointer to an alternate SDL_Surface to associate with this * surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RemoveSurfaceAlternateImages * \sa SDL_GetSurfaceImages * \sa SDL_SurfaceHasAlternateImages */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AddSurfaceAlternateImage(SDL_Surface *surface, SDL_Surface *image); +extern SDL_DECLSPEC bool SDLCALL SDL_AddSurfaceAlternateImage(SDL_Surface *surface, SDL_Surface *image); /** * Return whether a surface has alternate versions available. * * \param surface the SDL_Surface structure to query. - * \returns SDL_TRUE if alternate versions are available or SDL_TRUE - * otherwise. + * \returns true if alternate versions are available or false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddSurfaceAlternateImage * \sa SDL_RemoveSurfaceAlternateImages * \sa SDL_GetSurfaceImages */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasAlternateImages(SDL_Surface *surface); +extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasAlternateImages(SDL_Surface *surface); /** * Get an array including all versions of a surface. @@ -364,7 +383,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasAlternateImages(SDL_Surface * * failure; call SDL_GetError() for more information. This should be * freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddSurfaceAlternateImage * \sa SDL_RemoveSurfaceAlternateImages @@ -380,7 +399,7 @@ extern SDL_DECLSPEC SDL_Surface ** SDLCALL SDL_GetSurfaceImages(SDL_Surface *sur * * \param surface the SDL_Surface structure to update. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddSurfaceAlternateImage * \sa SDL_GetSurfaceImages @@ -401,22 +420,22 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveSurfaceAlternateImages(SDL_Surface *s * format of the surface will not change. * * \param surface the SDL_Surface structure to be locked. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MUSTLOCK * \sa SDL_UnlockSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_LockSurface(SDL_Surface *surface); +extern SDL_DECLSPEC bool 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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockSurface */ @@ -429,18 +448,18 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); * will result in a memory leak. * * \param src the data stream for the surface. - * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning, - * even in the case of an error. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. * \returns a pointer to a new SDL_Surface structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface * \sa SDL_LoadBMP * \sa SDL_SaveBMP_IO */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_IO(SDL_IOStream *src, SDL_bool closeio); +extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_IO(SDL_IOStream *src, bool closeio); /** * Load a BMP image from a file. @@ -452,7 +471,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_IO(SDL_IOStream *src, SDL_ * \returns a pointer to a new SDL_Surface structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface * \sa SDL_LoadBMP_IO @@ -471,17 +490,17 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP(const char *file); * * \param surface the SDL_Surface structure containing the image to be saved. * \param dst a data stream to save to. - * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `dst` before returning, - * even in the case of an error. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param closeio if true, calls SDL_CloseIO() on `dst` before returning, even + * in the case of an error. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadBMP_IO * \sa SDL_SaveBMP */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IOStream *dst, SDL_bool closeio); +extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); /** * Save a surface to a file. @@ -494,15 +513,15 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IO * * \param surface the SDL_Surface structure containing the image to be saved. * \param file a file to save to. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadBMP * \sa SDL_SaveBMP_IO */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SaveBMP(SDL_Surface *surface, const char *file); +extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP(SDL_Surface *surface, const char *file); /** * Set the RLE acceleration hint for a surface. @@ -511,32 +530,31 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SaveBMP(SDL_Surface *surface, const cha * the surface must be locked before directly accessing the pixels. * * \param surface the SDL_Surface structure to optimize. - * \param enabled SDL_TRUE to enable RLE acceleration, SDL_FALSE to disable - * it. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param enabled true to enable RLE acceleration, false to disable it. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface * \sa SDL_LockSurface * \sa SDL_UnlockSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceRLE(SDL_Surface *surface, SDL_bool enabled); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceRLE(SDL_Surface *surface, bool enabled); /** * Returns whether the surface is RLE enabled. * - * It is safe to pass a NULL `surface` here; it will return SDL_FALSE. + * It is safe to pass a NULL `surface` here; it will return false. * * \param surface the SDL_Surface structure to query. - * \returns SDL_TRUE if the surface is RLE enabled, SDL_FALSE otherwise. + * \returns true if the surface is RLE enabled, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceRLE */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasRLE(SDL_Surface *surface); +extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasRLE(SDL_Surface *surface); /** * Set the color key (transparent pixel) in a surface. @@ -549,34 +567,33 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasRLE(SDL_Surface *surface); * SDL_MapRGB(). * * \param surface the SDL_Surface structure to update. - * \param enabled SDL_TRUE to enable color key, SDL_FALSE to disable color - * key. + * \param enabled true to enable color key, false to disable color key. * \param key the transparent pixel. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorKey * \sa SDL_SetSurfaceRLE * \sa SDL_SurfaceHasColorKey */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceColorKey(SDL_Surface *surface, SDL_bool enabled, Uint32 key); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorKey(SDL_Surface *surface, bool enabled, Uint32 key); /** * Returns whether the surface has a color key. * - * It is safe to pass a NULL `surface` here; it will return SDL_FALSE. + * It is safe to pass a NULL `surface` here; it will return false. * * \param surface the SDL_Surface structure to query. - * \returns SDL_TRUE if the surface has a color key, SDL_FALSE otherwise. + * \returns true if the surface has a color key, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceColorKey * \sa SDL_GetSurfaceColorKey */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasColorKey(SDL_Surface *surface); +extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasColorKey(SDL_Surface *surface); /** * Get the color key (transparent pixel) for a surface. @@ -584,19 +601,19 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SurfaceHasColorKey(SDL_Surface *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. + * If the surface doesn't have color key enabled this function returns false. * * \param surface the SDL_Surface structure to query. * \param key a pointer filled in with the transparent pixel. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceColorKey * \sa SDL_SurfaceHasColorKey */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceColorKey(SDL_Surface *surface, Uint32 *key); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceColorKey(SDL_Surface *surface, Uint32 *key); /** * Set an additional color value multiplied into blit operations. @@ -611,15 +628,15 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceColorKey(SDL_Surface *surface * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorMod * \sa SDL_SetSurfaceAlphaMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceColorMod(SDL_Surface *surface, Uint8 r, Uint8 g, Uint8 b); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorMod(SDL_Surface *surface, Uint8 r, Uint8 g, Uint8 b); /** @@ -629,15 +646,15 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceColorMod(SDL_Surface *surface * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceAlphaMod * \sa SDL_SetSurfaceColorMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceColorMod(SDL_Surface *surface, Uint8 *r, Uint8 *g, Uint8 *b); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceColorMod(SDL_Surface *surface, Uint8 *r, Uint8 *g, Uint8 *b); /** * Set an additional alpha value used in blit operations. @@ -649,30 +666,30 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceColorMod(SDL_Surface *surface * * \param surface the SDL_Surface structure to update. * \param alpha the alpha value multiplied into blit operations. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceAlphaMod * \sa SDL_SetSurfaceColorMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceAlphaMod(SDL_Surface *surface, Uint8 alpha); +extern SDL_DECLSPEC bool 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorMod * \sa SDL_SetSurfaceAlphaMod */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface *surface, Uint8 *alpha); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface *surface, Uint8 *alpha); /** * Set the blend mode used for blit operations. @@ -683,28 +700,28 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface *surface * * \param surface the SDL_Surface structure to update. * \param blendMode the SDL_BlendMode to use for blit blending. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode blendMode); +extern SDL_DECLSPEC bool 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceBlendMode */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode *blendMode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode *blendMode); /** * Set the clipping rectangle for a surface. @@ -718,14 +735,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface *surfac * \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. + * \returns true if the rectangle intersects the surface, otherwise false and + * blits will be completely clipped. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceClipRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceClipRect(SDL_Surface *surface, const SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceClipRect(SDL_Surface *surface, const SDL_Rect *rect); /** * Get the clipping rectangle for a surface. @@ -737,26 +754,26 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetSurfaceClipRect(SDL_Surface *surface * clipped. * \param rect an SDL_Rect structure filled in with the clipping rectangle for * the surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceClipRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetSurfaceClipRect(SDL_Surface *surface, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceClipRect(SDL_Surface *surface, SDL_Rect *rect); /** * Flip a surface vertically or horizontally. * * \param surface the surface to flip. * \param flip the direction to flip. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_FlipMode flip); +extern SDL_DECLSPEC bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_FlipMode flip); /** * Creates a new surface identical to the existing surface. @@ -770,7 +787,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_F * \returns a copy of the surface or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface */ @@ -789,7 +806,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_DuplicateSurface(SDL_Surface *surf * \returns a copy of the surface or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface */ @@ -814,7 +831,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ScaleSurface(SDL_Surface *surface, * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertSurfaceAndColorspace * \sa SDL_DestroySurface @@ -840,10 +857,9 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface(SDL_Surface *surfac * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertSurface - * \sa SDL_ConvertSurface * \sa SDL_DestroySurface */ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurfaceAndColorspace(SDL_Surface *surface, SDL_PixelFormat format, SDL_Palette *palette, SDL_Colorspace colorspace, SDL_PropertiesID props); @@ -859,14 +875,14 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurfaceAndColorspace(SDL_Su * \param dst_format an SDL_PixelFormat 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 SDL_FALSE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertPixelsAndColorspace */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertPixels(int width, int height, SDL_PixelFormat src_format, const void *src, int src_pitch, SDL_PixelFormat dst_format, void *dst, int dst_pitch); +extern SDL_DECLSPEC bool SDLCALL SDL_ConvertPixels(int width, int height, SDL_PixelFormat src_format, const void *src, int src_pitch, SDL_PixelFormat dst_format, void *dst, int dst_pitch); /** * Copy a block of pixels of one format and colorspace to another format and @@ -875,27 +891,27 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertPixels(int width, int height, SD * \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_PixelFormat value of the `src` pixels format. - * \param src_colorspace an SDL_ColorSpace value describing the colorspace of + * \param src_colorspace an SDL_Colorspace value describing the colorspace of * the `src` pixels. * \param src_properties an SDL_PropertiesID with additional source color * properties, or 0. * \param src a pointer to the source pixels. * \param src_pitch the pitch of the source pixels, in bytes. * \param dst_format an SDL_PixelFormat value of the `dst` pixels format. - * \param dst_colorspace an SDL_ColorSpace value describing the colorspace of + * \param dst_colorspace an SDL_Colorspace value describing the colorspace of * the `dst` pixels. * \param dst_properties an SDL_PropertiesID with additional destination color * properties, or 0. * \param dst a pointer to be filled in with new pixel data. * \param dst_pitch the pitch of the destination pixels, in bytes. - * \returns SDL_FALSE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertPixels */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertPixelsAndColorspace(int width, int height, SDL_PixelFormat src_format, SDL_Colorspace src_colorspace, SDL_PropertiesID src_properties, const void *src, int src_pitch, SDL_PixelFormat dst_format, SDL_Colorspace dst_colorspace, SDL_PropertiesID dst_properties, void *dst, int dst_pitch); +extern SDL_DECLSPEC bool SDLCALL SDL_ConvertPixelsAndColorspace(int width, int height, SDL_PixelFormat src_format, SDL_Colorspace src_colorspace, SDL_PropertiesID src_properties, const void *src, int src_pitch, SDL_PixelFormat dst_format, SDL_Colorspace dst_colorspace, SDL_PropertiesID dst_properties, void *dst, int dst_pitch); /** * Premultiply the alpha on a block of pixels. @@ -910,14 +926,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ConvertPixelsAndColorspace(int width, i * \param dst_format an SDL_PixelFormat 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. - * \param linear SDL_TRUE to convert from sRGB to linear space for the alpha - * multiplication, SDL_FALSE to do multiplication in sRGB space. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param linear true to convert from sRGB to linear space for the alpha + * multiplication, false to do multiplication in sRGB space. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PremultiplyAlpha(int width, int height, SDL_PixelFormat src_format, const void *src, int src_pitch, SDL_PixelFormat dst_format, void *dst, int dst_pitch, SDL_bool linear); +extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplyAlpha(int width, int height, SDL_PixelFormat src_format, const void *src, int src_pitch, SDL_PixelFormat dst_format, void *dst, int dst_pitch, bool linear); /** * Premultiply the alpha in a surface. @@ -925,14 +941,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PremultiplyAlpha(int width, int height, * This is safe to use with src == dst, but not for other overlapping areas. * * \param surface the surface to modify. - * \param linear SDL_TRUE to convert from sRGB to linear space for the alpha - * multiplication, SDL_FALSE to do multiplication in sRGB space. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param linear true to convert from sRGB to linear space for the alpha + * multiplication, false to do multiplication in sRGB space. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *surface, SDL_bool linear); +extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *surface, bool linear); /** * Clear a surface with a specific color, with floating point precision. @@ -947,12 +963,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *su * \param g the green component of the pixel, normally in the range 0-1. * \param b the blue component of the pixel, normally in the range 0-1. * \param a the alpha component of the pixel, normally in the range 0-1. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearSurface(SDL_Surface *surface, float r, float g, float b, float a); +extern SDL_DECLSPEC bool SDLCALL SDL_ClearSurface(SDL_Surface *surface, float r, float g, float b, float a); /** * Perform a fast fill of a rectangle with a specific color. @@ -970,14 +986,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ClearSurface(SDL_Surface *surface, floa * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_FillSurfaceRects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FillSurfaceRect(SDL_Surface *dst, const SDL_Rect *rect, Uint32 color); +extern SDL_DECLSPEC bool SDLCALL SDL_FillSurfaceRect(SDL_Surface *dst, const SDL_Rect *rect, Uint32 color); /** * Perform a fast fill of a set of rectangles with a specific color. @@ -995,22 +1011,24 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FillSurfaceRect(SDL_Surface *dst, const * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_FillSurfaceRect */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FillSurfaceRects(SDL_Surface *dst, const SDL_Rect *rects, int count, Uint32 color); +extern SDL_DECLSPEC bool SDLCALL SDL_FillSurfaceRects(SDL_Surface *dst, const SDL_Rect *rects, int count, Uint32 color); /** - * Performs a fast blit from the source surface to the destination surface. + * Performs a fast blit from the source surface to the destination surface + * with clipping. * - * This assumes that the source and destination rectangles are the same size. * If either `srcrect` or `dstrect` are NULL, the entire surface (`src` or - * `dst`) is copied. The final blit rectangles are saved in `srcrect` and - * `dstrect` after all clipping is performed. + * `dst`) is copied while ensuring clipping to `dst->clip_rect`. + * + * The final blit rectangles are saved in `srcrect` and `dstrect` after all + * clipping is performed. * * The blit function should not be called on a locked surface. * @@ -1066,18 +1084,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FillSurfaceRects(SDL_Surface *dst, cons * height are ignored, and are copied from `srcrect`. If you * want a specific width and height, you should use * SDL_BlitSurfaceScaled(). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurfaceScaled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurface(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurface(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); /** * Perform low-level surface blitting only. @@ -1091,18 +1109,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurface(SDL_Surface *src, const SDL * \param dst the SDL_Surface structure that is the blit target. * \param dstrect the SDL_Rect structure representing the target rectangle in * the destination surface, may not be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceUnchecked(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceUnchecked(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); /** * Perform a scaled blit to a destination surface, which may be of a different @@ -1116,18 +1134,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceUnchecked(SDL_Surface *src, * the destination surface, or NULL to fill the entire * destination surface. * \param scaleMode the SDL_ScaleMode to be used. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceScaled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect, SDL_ScaleMode scaleMode); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceScaled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect, SDL_ScaleMode scaleMode); /** * Perform low-level surface scaled blitting only. @@ -1142,18 +1160,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceScaled(SDL_Surface *src, con * \param dstrect the SDL_Rect structure representing the target rectangle in * the destination surface, may not be NULL. * \param scaleMode the SDL_ScaleMode to be used. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurfaceScaled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceUncheckedScaled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect, SDL_ScaleMode scaleMode); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceUncheckedScaled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect, SDL_ScaleMode scaleMode); /** * Perform a tiled blit to a destination surface, which may be of a different @@ -1168,18 +1186,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceUncheckedScaled(SDL_Surface * \param dst the SDL_Surface structure that is the blit target. * \param dstrect the SDL_Rect structure representing the target rectangle in * the destination surface, or NULL to fill the entire surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceTiled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceTiled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect); /** * Perform a scaled and tiled blit to a destination surface, which may be of a @@ -1198,18 +1216,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceTiled(SDL_Surface *src, cons * \param dst the SDL_Surface structure that is the blit target. * \param dstrect the SDL_Rect structure representing the target rectangle in * the destination surface, or NULL to fill the entire surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceTiledWithScale(SDL_Surface *src, const SDL_Rect *srcrect, float scale, SDL_ScaleMode scaleMode, SDL_Surface *dst, const SDL_Rect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceTiledWithScale(SDL_Surface *src, const SDL_Rect *srcrect, float scale, SDL_ScaleMode scaleMode, SDL_Surface *dst, const SDL_Rect *dstrect); /** * Perform a scaled blit using the 9-grid algorithm to a destination surface, @@ -1235,18 +1253,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurfaceTiledWithScale(SDL_Surface * * \param dst the SDL_Surface structure that is the blit target. * \param dstrect the SDL_Rect structure representing the target rectangle in * the destination surface, or NULL to fill the entire surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety The same destination surface should not be used from two * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurface9Grid(SDL_Surface *src, const SDL_Rect *srcrect, int left_width, int right_width, int top_height, int bottom_height, float scale, SDL_ScaleMode scaleMode, SDL_Surface *dst, const SDL_Rect *dstrect); +extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurface9Grid(SDL_Surface *src, const SDL_Rect *srcrect, int left_width, int right_width, int top_height, int bottom_height, float scale, SDL_ScaleMode scaleMode, SDL_Surface *dst, const SDL_Rect *dstrect); /** * Map an RGB triple to an opaque pixel value for a surface. @@ -1272,7 +1290,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_BlitSurface9Grid(SDL_Surface *src, cons * \param b the blue component of the pixel in the range 0-255. * \returns a pixel value. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MapSurfaceRGBA */ @@ -1303,7 +1321,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapSurfaceRGB(SDL_Surface *surface, Uint8 * \param a the alpha component of the pixel in the range 0-255. * \returns a pixel value. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MapSurfaceRGB */ @@ -1329,12 +1347,12 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapSurfaceRGBA(SDL_Surface *surface, Uint * ignore this channel. * \param a a pointer filled in with the alpha channel, 0-255, or NULL to * ignore this channel. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadSurfacePixel(SDL_Surface *surface, int x, int y, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixel(SDL_Surface *surface, int x, int y, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); /** * Retrieves a single pixel from a surface. @@ -1353,12 +1371,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadSurfacePixel(SDL_Surface *surface, * 0-1, or NULL to ignore this channel. * \param a a pointer filled in with the alpha channel, normally in the range * 0-1, or NULL to ignore this channel. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadSurfacePixelFloat(SDL_Surface *surface, int x, int y, float *r, float *g, float *b, float *a); +extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixelFloat(SDL_Surface *surface, int x, int y, float *r, float *g, float *b, float *a); /** * Writes a single pixel to a surface. @@ -1376,12 +1394,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadSurfacePixelFloat(SDL_Surface *surf * \param g the green channel value, 0-255. * \param b the blue channel value, 0-255. * \param a the alpha channel value, 0-255. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteSurfacePixel(SDL_Surface *surface, int x, int y, Uint8 r, Uint8 g, Uint8 b, Uint8 a); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteSurfacePixel(SDL_Surface *surface, int x, int y, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /** * Writes a single pixel to a surface. @@ -1396,12 +1414,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteSurfacePixel(SDL_Surface *surface, * \param g the green channel value, normally in the range 0-1. * \param b the blue channel value, normally in the range 0-1. * \param a the alpha channel value, normally in the range 0-1. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteSurfacePixelFloat(SDL_Surface *surface, int x, int y, float r, float g, float b, float a); +extern SDL_DECLSPEC bool SDLCALL SDL_WriteSurfacePixelFloat(SDL_Surface *surface, int x, int y, float r, float g, float b, float a); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_system.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_system.h index 17ac0a1..294089f 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_system.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_system.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,13 @@ /** * # CategorySystem * - * Platform-specific SDL API functions. + * Platform-specific SDL API functions. These are functions that deal with + * needs of specific operating systems, that didn't make sense to offer as + * platform-independent, generic APIs. + * + * Most apps can make do without these functions, but they can be useful for + * integrating with other parts of a specific system, adding platform-specific + * polish to an app, or solving problems that only affect one target. */ #ifndef SDL_system_h_ @@ -31,7 +37,6 @@ #include #include #include -#include #include #include @@ -44,16 +49,15 @@ extern "C" { /* * Platform specific functions for Windows */ -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) +#if defined(SDL_PLATFORM_WINDOWS) typedef struct tagMSG MSG; /** * A callback to be used with SDL_SetWindowsMessageHook. * - * This callback may modify the message, and should return SDL_TRUE if the - * message should continue to be processed, or SDL_FALSE to prevent further - * processing. + * This callback may modify the message, and should return true if the message + * should continue to be processed, or false to prevent further processing. * * As this is processing a message directly from the Windows event loop, this * callback should do the minimum required work and return quickly. @@ -61,36 +65,35 @@ typedef struct tagMSG MSG; * \param userdata the app-defined pointer provided to * SDL_SetWindowsMessageHook. * \param msg a pointer to a Win32 event structure to process. - * \returns SDL_TRUE to let event continue on, SDL_FALSE to drop it. + * \returns true to let event continue on, false to drop it. * * \threadsafety This may only be called (by SDL) from the thread handling the * Windows event loop. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetWindowsMessageHook * \sa SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP */ -typedef SDL_bool (SDLCALL *SDL_WindowsMessageHook)(void *userdata, MSG *msg); +typedef bool (SDLCALL *SDL_WindowsMessageHook)(void *userdata, MSG *msg); /** * Set a callback for every Windows message, run before TranslateMessage(). * - * The callback may modify the message, and should return SDL_TRUE if the - * message should continue to be processed, or SDL_FALSE to prevent further - * processing. + * The callback may modify the message, and should return true if the message + * should continue to be processed, or false to prevent further processing. * * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WindowsMessageHook * \sa SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP */ extern SDL_DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata); -#endif /* defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK) */ +#endif /* defined(SDL_PLATFORM_WINDOWS) */ #if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) @@ -104,14 +107,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHoo * \returns the D3D9 adapter index on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDirect3D9AdapterIndex(SDL_DisplayID displayID); -#endif /* defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) */ - -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) - /** * Get the DXGI Adapter and Output indices for the specified display. * @@ -122,33 +121,55 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDirect3D9AdapterIndex(SDL_DisplayID displ * \param displayID the instance of the display to query. * \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. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDXGIOutputInfo(SDL_DisplayID displayID, int *adapterIndex, int *outputIndex); +extern SDL_DECLSPEC bool SDLCALL SDL_GetDXGIOutputInfo(SDL_DisplayID displayID, int *adapterIndex, int *outputIndex); #endif /* defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) */ + /* * Platform specific functions for UNIX */ +/* this is defined in Xlib's headers, just need a simple declaration here. */ typedef union _XEvent XEvent; -typedef SDL_bool (SDLCALL *SDL_X11EventHook)(void *userdata, XEvent *xevent); + +/** + * A callback to be used with SDL_SetX11EventHook. + * + * This callback may modify the event, and should return true if the event + * should continue to be processed, or false to prevent further processing. + * + * As this is processing an event directly from the X11 event loop, this + * callback should do the minimum required work and return quickly. + * + * \param userdata the app-defined pointer provided to SDL_SetX11EventHook. + * \param xevent a pointer to an Xlib XEvent union to process. + * \returns true to let event continue on, false to drop it. + * + * \threadsafety This may only be called (by SDL) from the thread handling the + * X11 event loop. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_SetX11EventHook + */ +typedef bool (SDLCALL *SDL_X11EventHook)(void *userdata, XEvent *xevent); /** * Set a callback for every X11 event. * - * The callback may modify the event, and should return SDL_TRUE if the event - * should continue to be processed, or SDL_FALSE to prevent further - * processing. + * The callback may modify the event, and should return true if the event + * should continue to be processed, or false to prevent further processing. * * \param callback the SDL_X11EventHook function to call. * \param userdata a pointer to pass to every iteration of `callback`. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetX11EventHook(SDL_X11EventHook callback, void *userdata); @@ -162,12 +183,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetX11EventHook(SDL_X11EventHook callback, * * \param threadID the Unix thread ID to change priority of. * \param priority the new, Unix-specific, priority value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLinuxThreadPriority(Sint64 threadID, int priority); +extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriority(Sint64 threadID, int priority); /** * Sets the priority (not nice level) and scheduling policy for a thread. @@ -178,12 +199,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLinuxThreadPriority(Sint64 threadID, * \param sdlPriority the new SDL_ThreadPriority value. * \param schedPolicy the new scheduling policy (SCHED_FIFO, SCHED_RR, * SCHED_OTHER, etc...). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLinuxThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy); +extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy); #endif /* SDL_PLATFORM_LINUX */ @@ -204,7 +225,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetLinuxThreadPriorityAndPolicy(Sint64 * \param userdata what was passed as `callbackParam` to * SDL_SetiOSAnimationCallback as `callbackParam`. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetiOSAnimationCallback */ @@ -240,27 +261,27 @@ typedef void (SDLCALL *SDL_iOSAnimationCallback)(void *userdata); * called. * \param callback the function to call for every frame. * \param callbackParam a pointer that is passed to `callback`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetiOSEventPump */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetiOSAnimationCallback(SDL_Window *window, int interval, SDL_iOSAnimationCallback callback, void *callbackParam); +extern SDL_DECLSPEC bool SDLCALL SDL_SetiOSAnimationCallback(SDL_Window *window, int interval, SDL_iOSAnimationCallback callback, void *callbackParam); /** * Use this function to enable or disable the SDL event pump on Apple iOS. * * This function is only available on Apple iOS. * - * \param enabled SDL_TRUE to enable the event pump, SDL_FALSE to disable it. + * \param enabled true to enable the event pump, false to disable it. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetiOSAnimationCallback */ -extern SDL_DECLSPEC void SDLCALL SDL_SetiOSEventPump(SDL_bool enabled); +extern SDL_DECLSPEC void SDLCALL SDL_SetiOSEventPump(bool enabled); #endif /* SDL_PLATFORM_IOS */ @@ -286,7 +307,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetiOSEventPump(SDL_bool enabled); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidActivity */ @@ -311,7 +332,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetAndroidJNIEnv(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidJNIEnv */ @@ -349,43 +370,34 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetAndroidActivity(void); * * \returns the Android API level. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_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 3.0.0. - */ -extern SDL_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. + * \returns true if this is a Chromebook, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsChromebook(void); +extern SDL_DECLSPEC 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. + * \returns true if this is a DeX docking station, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsDeXMode(void); +extern SDL_DECLSPEC bool SDLCALL SDL_IsDeXMode(void); /** * Trigger the Android system back button behavior. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); @@ -393,9 +405,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); * See the official Android developer guide for more information: * http://developer.android.com/guide/topics/data/data-storage.html * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ANDROID_EXTERNAL_STORAGE_READ 0x01 + +/** + * See the official Android developer guide for more information: + * http://developer.android.com/guide/topics/data/data-storage.html + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_ANDROID_EXTERNAL_STORAGE_WRITE 0x02 /** @@ -414,9 +433,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); * \returns the path used for internal storage or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_GetAndroidExternalStorageState + * \sa SDL_GetAndroidExternalStoragePath + * \sa SDL_GetAndroidCachePath */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidInternalStoragePath(void); @@ -431,7 +451,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidInternalStoragePath(void) * \returns the current state of external storage, or 0 if external storage is * currently unavailable. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidExternalStoragePath */ @@ -453,9 +473,11 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAndroidExternalStorageState(void); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidExternalStorageState + * \sa SDL_GetAndroidInternalStoragePath + * \sa SDL_GetAndroidCachePath */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidExternalStoragePath(void); @@ -474,12 +496,25 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidExternalStoragePath(void) * \returns the path used for caches for this application on success or NULL * on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetAndroidInternalStoragePath + * \sa SDL_GetAndroidExternalStoragePath */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidCachePath(void); - -typedef void (SDLCALL *SDL_RequestAndroidPermissionCallback)(void *userdata, const char *permission, SDL_bool granted); +/** + * Callback that presents a response from a SDL_RequestAndroidPermission call. + * + * \param userdata an app-controlled pointer that is passed to the callback. + * \param permission the Android-specific permission name that was requested. + * \param granted true if permission is granted, false if denied. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_RequestAndroidPermission + */ +typedef void (SDLCALL *SDL_RequestAndroidPermissionCallback)(void *userdata, const char *permission, bool granted); /** * Request permissions at runtime, asynchronously. @@ -500,18 +535,22 @@ typedef void (SDLCALL *SDL_RequestAndroidPermissionCallback)(void *userdata, con * like memory running out. Normally there will be a yes or no to the request * through the callback. * + * For the `permission` parameter, choose a value from here: + * + * https://developer.android.com/reference/android/Manifest.permission + * * \param permission the permission to request. * \param cb the callback to trigger when the request has a response. * \param userdata an app-controlled pointer that is passed to the callback. - * \returns SDL_TRUE if the request was submitted, SDL_FALSE if there was an - * error submitting. The result of the request is only ever reported + * \returns true if the request was submitted, false if there was an error + * submitting. The result of the request is only ever reported * through the callback, not this return value. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RequestAndroidPermission(const char *permission, SDL_RequestAndroidPermissionCallback cb, void *userdata); +extern SDL_DECLSPEC bool SDLCALL SDL_RequestAndroidPermission(const char *permission, SDL_RequestAndroidPermissionCallback cb, void *userdata); /** * Shows an Android toast notification. @@ -532,14 +571,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RequestAndroidPermission(const char *pe * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowAndroidToast(const char *message, int duration, int gravity, int xoffset, int yoffset); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowAndroidToast(const char *message, int duration, int gravity, int xoffset, int yoffset); /** * Send a user command to SDLActivity. @@ -548,111 +587,63 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowAndroidToast(const char *message, i * * \param command user command that must be greater or equal to 0x8000. * \param param user parameter. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SendAndroidMessage(Uint32 command, int param); +extern SDL_DECLSPEC bool SDLCALL SDL_SendAndroidMessage(Uint32 command, int param); #endif /* SDL_PLATFORM_ANDROID */ -/* - * Platform specific functions for WinRT - */ -#ifdef SDL_PLATFORM_WINRT - -/** - * WinRT / Windows Phone path types - * - * \since This enum is available since SDL 3.0.0. - */ -typedef enum SDL_WinRT_Path -{ - /** The installed app's root directory. - Files here are likely to be read-only. */ - SDL_WINRT_PATH_INSTALLED_LOCATION, - - /** The app's local data store. Files may be written here */ - SDL_WINRT_PATH_LOCAL_FOLDER, - - /** 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, - - /** 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; - - -/** - * WinRT Device Family - * - * \since This enum is available since SDL 3.0.0. - */ -typedef enum SDL_WinRT_DeviceFamily -{ - /** Unknown family */ - SDL_WINRT_DEVICEFAMILY_UNKNOWN, - - /** Desktop family*/ - SDL_WINRT_DEVICEFAMILY_DESKTOP, - - /** Mobile family (for example smartphone) */ - SDL_WINRT_DEVICEFAMILY_MOBILE, - - /** 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 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 3.0.0. - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetWinRTFSPath(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 3.0.0. - */ -extern SDL_DECLSPEC SDL_WinRT_DeviceFamily SDLCALL SDL_GetWinRTDeviceFamily(); - -#endif /* SDL_PLATFORM_WINRT */ - /** * Query if the current device is a tablet. * - * If SDL can't determine this, it will return SDL_FALSE. + * If SDL can't determine this, it will return false. * - * \returns SDL_TRUE if the device is a tablet, SDL_FALSE otherwise. + * \returns true if the device is a tablet, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsTablet(void); +extern SDL_DECLSPEC bool SDLCALL SDL_IsTablet(void); + +/** + * Query if the current device is a TV. + * + * If SDL can't determine this, it will return false. + * + * \returns true if the device is a TV, false otherwise. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_IsTV(void); + +/** + * Application sandbox environment. + * + * \since This enum is available since SDL 3.2.0. + */ +typedef enum SDL_Sandbox +{ + SDL_SANDBOX_NONE = 0, + SDL_SANDBOX_UNKNOWN_CONTAINER, + SDL_SANDBOX_FLATPAK, + SDL_SANDBOX_SNAP, + SDL_SANDBOX_MACOS +} SDL_Sandbox; + +/** + * Get the application sandbox environment, if any. + * + * \returns the application sandbox environment or SDL_SANDBOX_NONE if the + * application is not running in a sandbox environment. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC SDL_Sandbox SDLCALL SDL_GetSandbox(void); + /* Functions used by iOS app delegates to notify SDL about state changes. */ @@ -669,7 +660,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsTablet(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillTerminate(void); @@ -686,7 +677,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillTerminate(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidReceiveMemoryWarning(void); @@ -703,7 +694,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidReceiveMemoryWarning(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterBackground(void); @@ -720,7 +711,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterBackground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterBackground(void); @@ -737,7 +728,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterBackground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterForeground(void); @@ -754,7 +745,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterForeground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterForeground(void); @@ -773,7 +764,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterForeground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidChangeStatusBarOrientation(void); #endif @@ -794,12 +785,12 @@ typedef struct XUser *XUserHandle; * leak. * * \param outTaskQueue a pointer to be filled in with task queue handle. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGDKTaskQueue(XTaskQueueHandle *outTaskQueue); +extern SDL_DECLSPEC bool SDLCALL SDL_GetGDKTaskQueue(XTaskQueueHandle *outTaskQueue); /** * Gets a reference to the default user handle for GDK. @@ -809,12 +800,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGDKTaskQueue(XTaskQueueHandle *outTa * * \param outUserHandle a pointer to be filled in with the default user * handle. - * \returns SDL_TRUE if success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true if success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetGDKDefaultUser(XUserHandle *outUserHandle); +extern SDL_DECLSPEC bool SDLCALL SDL_GetGDKDefaultUser(XUserHandle *outUserHandle); #endif diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_thread.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_thread.h index 0fdc8a0..277535f 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_thread.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_thread.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -25,7 +25,19 @@ /** * # CategoryThread * - * SDL thread management routines. + * SDL offers cross-platform thread management functions. These are mostly + * concerned with starting threads, setting their priority, and dealing with + * their termination. + * + * In addition, there is support for Thread Local Storage (data that is unique + * to each thread, but accessed from a single key). + * + * On platforms without thread support (such as Emscripten when built without + * pthreads), these functions still exist, but things like SDL_CreateThread() + * will report failure without doing anything. + * + * If you're going to work with threads, you almost certainly need to have a + * good understanding of [CategoryMutex](CategoryMutex) as well. */ #include @@ -34,9 +46,8 @@ /* Thread synchronization primitives */ #include -#include -#if (defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK)) && !defined(SDL_PLATFORM_WINRT) +#if defined(SDL_PLATFORM_WINDOWS) #include /* _beginthreadex() and _endthreadex() */ #endif @@ -51,7 +62,7 @@ extern "C" { * * These are opaque data. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_WaitThread @@ -65,7 +76,7 @@ typedef struct SDL_Thread SDL_Thread; * application will operate on, but having a way to uniquely identify a thread * can be useful at times. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetThreadID * \sa SDL_GetCurrentThreadID @@ -78,7 +89,7 @@ typedef Uint64 SDL_ThreadID; * 0 is the invalid ID. An app can create these and then set data for these * IDs that is unique to each thread. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetTLS * \sa SDL_SetTLS @@ -90,11 +101,11 @@ typedef SDL_AtomicInt SDL_TLSID; * * 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. + * should be aware that calling SDL_SetCurrentThreadPriority may alter such + * state. SDL_HINT_THREAD_PRIORITY_POLICY can be used to control aspects of + * this behavior. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ThreadPriority { SDL_THREAD_PRIORITY_LOW, @@ -103,13 +114,30 @@ typedef enum SDL_ThreadPriority { SDL_THREAD_PRIORITY_TIME_CRITICAL } SDL_ThreadPriority; +/** + * The SDL thread state. + * + * The current state of a thread can be checked by calling SDL_GetThreadState. + * + * \since This enum is available since SDL 3.2.0. + * + * \sa SDL_GetThreadState + */ +typedef enum SDL_ThreadState +{ + SDL_THREAD_UNKNOWN, /**< The thread is not valid */ + SDL_THREAD_ALIVE, /**< The thread is currently running */ + SDL_THREAD_DETACHED, /**< The thread is detached and can't be waited on */ + SDL_THREAD_COMPLETE /**< The thread has finished and should be cleaned up with SDL_WaitThread() */ +} SDL_ThreadState; + /** * The function passed to SDL_CreateThread() as the new thread's entry point. * * \param data what was passed as `data` to SDL_CreateThread(). * \returns a value that can be reported through SDL_WaitThread(). * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef int (SDLCALL * SDL_ThreadFunction) (void *data); @@ -179,7 +207,7 @@ typedef int (SDLCALL * SDL_ThreadFunction) (void *data); * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThreadWithProperties * \sa SDL_WaitThread @@ -245,7 +273,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(SDL_ThreadFunction fn, * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_WaitThread @@ -263,7 +291,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithProperties(SDL_Prop /* The real implementation, hidden from the wiki, so it can show this as real functions that don't have macro magic. */ #ifndef SDL_WIKI_DOCUMENTATION_SECTION -# if (defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_GDK)) && !defined(SDL_PLATFORM_WINRT) +# if defined(SDL_PLATFORM_WINDOWS) # ifndef SDL_BeginThreadFunction # define SDL_BeginThreadFunction _beginthreadex # endif @@ -300,7 +328,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithProperties(SDL_Prop * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadRuntime(SDL_ThreadFunction fn, const char *name, void *data, SDL_FunctionPointer pfnBeginThread, SDL_FunctionPointer pfnEndThread); @@ -314,7 +342,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadRuntime(SDL_ThreadFunct * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithPropertiesRuntime(SDL_PropertiesID props, SDL_FunctionPointer pfnBeginThread, SDL_FunctionPointer pfnEndThread); @@ -334,7 +362,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithPropertiesRuntime(S * \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 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetThreadName(SDL_Thread *thread); @@ -350,7 +378,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetThreadName(SDL_Thread *thread); * * \returns the ID of the current thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetThreadID */ @@ -367,7 +395,7 @@ extern SDL_DECLSPEC SDL_ThreadID SDLCALL SDL_GetCurrentThreadID(void); * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCurrentThreadID */ @@ -381,25 +409,25 @@ extern SDL_DECLSPEC SDL_ThreadID SDLCALL SDL_GetThreadID(SDL_Thread *thread); * an administrator account. Be prepared for this to fail. * * \param priority the SDL_ThreadPriority to set. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority priority); +extern SDL_DECLSPEC bool SDLCALL SDL_SetCurrentThreadPriority(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. + * Threads that haven't been detached will remain 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. + * The return code from 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 @@ -412,17 +440,30 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority pr * * \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. + * \param status a pointer filled in with the value returned from the thread + * function by its 'return', or -1 if the thread has been + * detached or isn't valid, may be NULL. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_DetachThread */ extern SDL_DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status); +/** + * Get the current state of a thread. + * + * \param thread the thread to query. + * \returns the current state of a thread, or SDL_THREAD_UNKNOWN if the thread + * isn't valid. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_ThreadState + */ +extern SDL_DECLSPEC SDL_ThreadState SDLCALL SDL_GetThreadState(SDL_Thread *thread); + /** * Let a thread clean up on exit without intervention. * @@ -452,7 +493,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status) * \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 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_WaitThread @@ -468,7 +509,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DetachThread(SDL_Thread *thread); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTLS */ @@ -481,7 +522,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetTLS(SDL_TLSID *id); * * \param value a pointer previously handed to SDL_SetTLS. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetTLS */ @@ -504,16 +545,16 @@ typedef void (SDLCALL *SDL_TLSDestructorCallback)(void *value); * \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, may be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTLS */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTLS(SDL_TLSID *id, const void *value, SDL_TLSDestructorCallback destructor); +extern SDL_DECLSPEC bool SDLCALL SDL_SetTLS(SDL_TLSID *id, const void *value, SDL_TLSDestructorCallback destructor); /** * Cleanup all TLS data for this thread. @@ -524,7 +565,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetTLS(SDL_TLSID *id, const void *value * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CleanupTLS(void); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_time.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_time.h index 86c1fad..b6d3f6d 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_time.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_time.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer -Copyright (C) 1997-2024 Sam Lantinga +Copyright (C) 1997-2025 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 @@ -26,6 +26,14 @@ freely, subject to the following restrictions: * # CategoryTime * * SDL realtime clock and date/time routines. + * + * There are two data types that are used in this category: SDL_Time, which + * represents the nanoseconds since a specific moment (an "epoch"), and + * SDL_DateTime, which breaks time down into human-understandable components: + * years, months, days, hours, etc. + * + * Much of the functionality is involved in converting those two types to + * other useful forms. */ #include @@ -41,7 +49,7 @@ extern "C" { * A structure holding a calendar date and time broken down into its * components. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_DateTime { @@ -59,7 +67,7 @@ typedef struct SDL_DateTime /** * The preferred date format of the current system locale. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetDateTimeLocalePreferences */ @@ -73,7 +81,7 @@ typedef enum SDL_DateFormat /** * The preferred time format of the current system locale. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetDateTimeLocalePreferences */ @@ -95,24 +103,24 @@ typedef enum SDL_TimeFormat * format, may be NULL. * \param timeFormat a pointer to the SDL_TimeFormat to hold the returned time * format, may be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDateTimeLocalePreferences(SDL_DateFormat *dateFormat, SDL_TimeFormat *timeFormat); +extern SDL_DECLSPEC bool SDLCALL SDL_GetDateTimeLocalePreferences(SDL_DateFormat *dateFormat, SDL_TimeFormat *timeFormat); /** * Gets the current value of the system realtime clock in nanoseconds since * Jan 1, 1970 in Universal Coordinated Time (UTC). * * \param ticks the SDL_Time to hold the returned tick count. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCurrentTime(SDL_Time *ticks); +extern SDL_DECLSPEC bool SDLCALL SDL_GetCurrentTime(SDL_Time *ticks); /** * Converts an SDL_Time in nanoseconds since the epoch to a calendar time in @@ -123,12 +131,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetCurrentTime(SDL_Time *ticks); * \param localTime the resulting SDL_DateTime will be expressed in local time * if true, otherwise it will be in Universal Coordinated * Time (UTC). - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TimeToDateTime(SDL_Time ticks, SDL_DateTime *dt, SDL_bool localTime); +extern SDL_DECLSPEC bool SDLCALL SDL_TimeToDateTime(SDL_Time ticks, SDL_DateTime *dt, bool localTime); /** * Converts a calendar time to an SDL_Time in nanoseconds since the epoch. @@ -138,12 +146,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TimeToDateTime(SDL_Time ticks, SDL_Date * * \param dt the source SDL_DateTime. * \param ticks the resulting SDL_Time. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DateTimeToTime(const SDL_DateTime *dt, SDL_Time *ticks); +extern SDL_DECLSPEC bool SDLCALL SDL_DateTimeToTime(const SDL_DateTime *dt, SDL_Time *ticks); /** * Converts an SDL time into a Windows FILETIME (100-nanosecond intervals @@ -157,7 +165,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DateTimeToTime(const SDL_DateTime *dt, * \param dwHighDateTime a pointer filled in with the high portion of the * Windows FILETIME value. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_TimeToWindows(SDL_Time ticks, Uint32 *dwLowDateTime, Uint32 *dwHighDateTime); @@ -172,7 +180,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_TimeToWindows(SDL_Time ticks, Uint32 *dwLow * \param dwHighDateTime the high portion of the Windows FILETIME value. * \returns the converted SDL time. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Time SDLCALL SDL_TimeFromWindows(Uint32 dwLowDateTime, Uint32 dwHighDateTime); @@ -184,7 +192,7 @@ extern SDL_DECLSPEC SDL_Time SDLCALL SDL_TimeFromWindows(Uint32 dwLowDateTime, U * \returns the number of days in the requested month or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDaysInMonth(int year, int month); @@ -197,7 +205,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDaysInMonth(int year, int month); * \returns the day of year [0-365] if the date is valid or -1 on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfYear(int year, int month, int day); @@ -210,7 +218,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfYear(int year, int month, int day); * \returns a value between 0 and 6 (0 being Sunday) if the date is valid or * -1 on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfWeek(int year, int month, int day); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_timer.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_timer.h index 9d05161..cf94881 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_timer.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_timer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -25,7 +25,20 @@ /** * # CategoryTimer * - * SDL time management routines. + * SDL provides time management functionality. It is useful for dealing with + * (usually) small durations of time. + * + * This is not to be confused with _calendar time_ management, which is + * provided by [CategoryTime](CategoryTime). + * + * This category covers measuring time elapsed (SDL_GetTicks(), + * SDL_GetPerformanceCounter()), putting a thread to sleep for a certain + * amount of time (SDL_Delay(), SDL_DelayNS(), SDL_DelayPrecise()), and firing + * a callback function after a certain amount of time has elasped + * (SDL_AddTimer(), etc). + * + * There are also useful macros to convert between time units, like + * SDL_SECONDS_TO_NS() and such. */ #include @@ -38,16 +51,137 @@ extern "C" { #endif /* SDL time constants */ + +/** + * Number of milliseconds in a second. + * + * This is always 1000. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_MS_PER_SECOND 1000 + +/** + * Number of microseconds in a second. + * + * This is always 1000000. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_US_PER_SECOND 1000000 + +/** + * Number of nanoseconds in a second. + * + * This is always 1000000000. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_PER_SECOND 1000000000LL + +/** + * Number of nanoseconds in a millisecond. + * + * This is always 1000000. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_PER_MS 1000000 + +/** + * Number of nanoseconds in a microsecond. + * + * This is always 1000. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_PER_US 1000 + +/** + * Convert seconds to nanoseconds. + * + * This only converts whole numbers, not fractional seconds. + * + * \param S the number of seconds to convert. + * \returns S, expressed in nanoseconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_SECONDS_TO_NS(S) (((Uint64)(S)) * SDL_NS_PER_SECOND) + +/** + * Convert nanoseconds to seconds. + * + * This performs a division, so the results can be dramatically different if + * `NS` is an integer or floating point value. + * + * \param NS the number of nanoseconds to convert. + * \returns NS, expressed in seconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_TO_SECONDS(NS) ((NS) / SDL_NS_PER_SECOND) + +/** + * Convert milliseconds to nanoseconds. + * + * This only converts whole numbers, not fractional milliseconds. + * + * \param MS the number of milliseconds to convert. + * \returns MS, expressed in nanoseconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_MS_TO_NS(MS) (((Uint64)(MS)) * SDL_NS_PER_MS) + +/** + * Convert nanoseconds to milliseconds. + * + * This performs a division, so the results can be dramatically different if + * `NS` is an integer or floating point value. + * + * \param NS the number of nanoseconds to convert. + * \returns NS, expressed in milliseconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_TO_MS(NS) ((NS) / SDL_NS_PER_MS) + +/** + * Convert microseconds to nanoseconds. + * + * This only converts whole numbers, not fractional microseconds. + * + * \param US the number of microseconds to convert. + * \returns US, expressed in nanoseconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_US_TO_NS(US) (((Uint64)(US)) * SDL_NS_PER_US) + +/** + * Convert nanoseconds to microseconds. + * + * This performs a division, so the results can be dramatically different if + * `NS` is an integer or floating point value. + * + * \param NS the number of nanoseconds to convert. + * \returns NS, expressed in microseconds. + * + * \threadsafety It is safe to call this macro from any thread. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_NS_TO_US(NS) ((NS) / SDL_NS_PER_US) /** @@ -56,7 +190,9 @@ extern "C" { * \returns an unsigned 64-bit value representing the number of milliseconds * since the SDL library initialized. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicks(void); @@ -66,7 +202,9 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicks(void); * \returns an unsigned 64-bit value representing the number of nanoseconds * since the SDL library initialized. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicksNS(void); @@ -81,7 +219,9 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicksNS(void); * * \returns the current counter value. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPerformanceFrequency */ @@ -92,7 +232,9 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetPerformanceCounter(void); * * \returns a platform-specific count per second. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPerformanceCounter */ @@ -107,10 +249,33 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetPerformanceFrequency(void); * * \param ms the number of milliseconds to delay. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_DelayNS + * \sa SDL_DelayPrecise */ extern SDL_DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); +/** + * Wait a specified number of nanoseconds before returning. + * + * This function waits a specified number of nanoseconds before returning. It + * waits at least the specified time, but possibly longer due to OS + * scheduling. + * + * \param ns the number of nanoseconds to delay. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_Delay + * \sa SDL_DelayPrecise + */ +extern SDL_DECLSPEC void SDLCALL SDL_DelayNS(Uint64 ns); + /** * Wait a specified number of nanoseconds before returning. * @@ -120,14 +285,19 @@ extern SDL_DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); * * \param ns the number of nanoseconds to delay. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_Delay + * \sa SDL_DelayNS */ -extern SDL_DECLSPEC void SDLCALL SDL_DelayNS(Uint64 ns); +extern SDL_DECLSPEC void SDLCALL SDL_DelayPrecise(Uint64 ns); /** * Definition of the timer ID type. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_TimerID; @@ -151,7 +321,7 @@ typedef Uint32 SDL_TimerID; * thread; the application is responsible for locking resources * the callback touches that need to be protected. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_AddTimer */ @@ -160,8 +330,6 @@ typedef Uint32 (SDLCALL *SDL_TimerCallback)(void *userdata, SDL_TimerID 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 @@ -188,7 +356,7 @@ typedef Uint32 (SDLCALL *SDL_TimerCallback)(void *userdata, SDL_TimerID timerID, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddTimerNS * \sa SDL_RemoveTimer @@ -215,7 +383,7 @@ extern SDL_DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_TimerC * thread; the application is responsible for locking resources * the callback touches that need to be protected. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_AddTimerNS */ @@ -224,8 +392,6 @@ typedef Uint64 (SDLCALL *SDL_NSTimerCallback)(void *userdata, SDL_TimerID timerI /** * 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_AddTimerNS() call and should return the * next timer interval. If the value returned from the callback is 0, the @@ -252,7 +418,7 @@ typedef Uint64 (SDLCALL *SDL_NSTimerCallback)(void *userdata, SDL_TimerID timerI * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddTimer * \sa SDL_RemoveTimer @@ -263,14 +429,16 @@ extern SDL_DECLSPEC SDL_TimerID SDLCALL SDL_AddTimerNS(Uint64 interval, SDL_NSTi * Remove a timer created with SDL_AddTimer(). * * \param id the ID of the timer to remove. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddTimer */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID id); +extern SDL_DECLSPEC bool SDLCALL SDL_RemoveTimer(SDL_TimerID id); /* Ends C function definitions when using C++ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_touch.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_touch.h index 6889f36..64845a1 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_touch.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_touch.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,18 @@ /** * # CategoryTouch * - * SDL touch management. + * SDL offers touch input, on platforms that support it. It can manage + * multiple touch devices and track multiple fingers on those devices. + * + * Touches are mostly dealt with through the event system, in the + * SDL_EVENT_FINGER_DOWN, SDL_EVENT_FINGER_MOTION, and SDL_EVENT_FINGER_UP + * events, but there are also functions to query for hardware details, etc. + * + * The touch system, by default, will also send virtual mouse events; this can + * be useful for making a some desktop apps work on a phone without + * significant changes. For apps that care about mouse and touch input + * separately, they should ignore mouse events that have a `which` field of + * SDL_TOUCH_MOUSEID. */ #ifndef SDL_touch_h_ @@ -31,7 +42,6 @@ #include #include #include -#include #include /* Set up for C function definitions, even when using C++ */ @@ -39,25 +49,53 @@ extern "C" { #endif +/** + * A unique ID for a touch device. + * + * This ID is valid for the time the device is connected to the system, and is + * never reused for the lifetime of the application. + * + * The value 0 is an invalid ID. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef Uint64 SDL_TouchID; + +/** + * A unique ID for a single finger on a touch device. + * + * This ID is valid for the time the finger (stylus, etc) is touching and will + * be unique for all fingers currently in contact, so this ID tracks the + * lifetime of a single continuous touch. This value may represent an index, a + * pointer, or some other unique ID, depending on the platform. + * + * The value 0 is an invalid ID. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef Uint64 SDL_FingerID; +/** + * An enum that describes the type of a touch device. + * + * \since This enum is available since SDL 3.2.0. + */ typedef enum SDL_TouchDeviceType { 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_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; /** * Data about a single finger in a multitouch event. * - * Each touch even is a collection of fingers that are simultaneously in + * Each touch event is a collection of fingers that are simultaneously in * contact with the touch device (so a "touch" can be a "multitouch," in * reality), and this struct reports details of the specific fingers. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetTouchFingers */ @@ -69,10 +107,18 @@ typedef struct SDL_Finger float pressure; /**< the quantity of pressure applied, normalized (0...1) */ } SDL_Finger; -/* Used as the device ID for mouse events simulated with touch input */ +/** + * The SDL_MouseID for mouse events simulated with touch input. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_TOUCH_MOUSEID ((SDL_MouseID)-1) -/* Used as the SDL_TouchID for touch events simulated with mouse input */ +/** + * The SDL_TouchID for touch events simulated with mouse input. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_MOUSE_TOUCHID ((SDL_TouchID)-1) @@ -89,7 +135,7 @@ typedef struct SDL_Finger * SDL_GetError() for more information. This should be freed with * SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_TouchID * SDLCALL SDL_GetTouchDevices(int *count); @@ -100,7 +146,7 @@ extern SDL_DECLSPEC SDL_TouchID * SDLCALL SDL_GetTouchDevices(int *count); * \returns touch device name, or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetTouchDeviceName(SDL_TouchID touchID); @@ -110,7 +156,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetTouchDeviceName(SDL_TouchID touc * \param touchID the ID of a touch device. * \returns touch device type. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_TouchID touchID); @@ -125,7 +171,7 @@ extern SDL_DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_Touch * allocation that should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Finger ** SDLCALL SDL_GetTouchFingers(SDL_TouchID touchID, int *count); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_tray.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_tray.h new file mode 100644 index 0000000..0b05db2 --- /dev/null +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_tray.h @@ -0,0 +1,544 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 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. +*/ + +/** + * # CategoryTray + * + * SDL offers a way to add items to the "system tray" (more correctly called + * the "notification area" on Windows). On platforms that offer this concept, + * an SDL app can add a tray icon, submenus, checkboxes, and clickable + * entries, and register a callback that is fired when the user clicks on + * these pieces. + */ + +#ifndef SDL_tray_h_ +#define SDL_tray_h_ + +#include +#include +#include +#include + +#include +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * An opaque handle representing a toplevel system tray object. + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_Tray SDL_Tray; + +/** + * An opaque handle representing a menu/submenu on a system tray object. + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_TrayMenu SDL_TrayMenu; + +/** + * An opaque handle representing an entry on a system tray object. + * + * \since This struct is available since SDL 3.2.0. + */ +typedef struct SDL_TrayEntry SDL_TrayEntry; + +/** + * Flags that control the creation of system tray entries. + * + * Some of these flags are required; exactly one of them must be specified at + * the time a tray entry is created. Other flags are optional; zero or more of + * those can be OR'ed together with the required flag. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_InsertTrayEntryAt + */ +typedef Uint32 SDL_TrayEntryFlags; + +#define SDL_TRAYENTRY_BUTTON 0x00000001u /**< Make the entry a simple button. Required. */ +#define SDL_TRAYENTRY_CHECKBOX 0x00000002u /**< Make the entry a checkbox. Required. */ +#define SDL_TRAYENTRY_SUBMENU 0x00000004u /**< Prepare the entry to have a submenu. Required */ +#define SDL_TRAYENTRY_DISABLED 0x80000000u /**< Make the entry disabled. Optional. */ +#define SDL_TRAYENTRY_CHECKED 0x40000000u /**< Make the entry checked. This is valid only for checkboxes. Optional. */ + +/** + * A callback that is invoked when a tray entry is selected. + * + * \param userdata an optional pointer to pass extra data to the callback when + * it will be invoked. + * \param entry the tray entry that was selected. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_SetTrayEntryCallback + */ +typedef void (SDLCALL *SDL_TrayCallback)(void *userdata, SDL_TrayEntry *entry); + +/** + * Create an icon to be placed in the operating system's tray, or equivalent. + * + * Many platforms advise not using a system tray unless persistence is a + * necessary feature. Avoid needlessly creating a tray icon, as the user may + * feel like it clutters their interface. + * + * Using tray icons require the video subsystem. + * + * \param icon a surface to be used as icon. May be NULL. + * \param tooltip a tooltip to be displayed when the mouse hovers the icon in + * UTF-8 encoding. Not supported on all platforms. May be NULL. + * \returns The newly created system tray icon. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTrayMenu + * \sa SDL_GetTrayMenu + * \sa SDL_DestroyTray + */ +extern SDL_DECLSPEC SDL_Tray *SDLCALL SDL_CreateTray(SDL_Surface *icon, const char *tooltip); + +/** + * Updates the system tray icon's icon. + * + * \param tray the tray icon to be updated. + * \param icon the new icon. May be NULL. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTray + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *icon); + +/** + * Updates the system tray icon's tooltip. + * + * \param tray the tray icon to be updated. + * \param tooltip the new tooltip in UTF-8 encoding. May be NULL. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTray + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayTooltip(SDL_Tray *tray, const char *tooltip); + +/** + * Create a menu for a system tray. + * + * This should be called at most once per tray icon. + * + * This function does the same thing as SDL_CreateTraySubmenu(), except that + * it takes a SDL_Tray instead of a SDL_TrayEntry. + * + * A menu does not need to be destroyed; it will be destroyed with the tray. + * + * \param tray the tray to bind the menu to. + * \returns the newly created menu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTray + * \sa SDL_GetTrayMenu + * \sa SDL_GetTrayMenuParentTray + */ +extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_CreateTrayMenu(SDL_Tray *tray); + +/** + * Create a submenu for a system tray entry. + * + * This should be called at most once per tray entry. + * + * This function does the same thing as SDL_CreateTrayMenu, except that it + * takes a SDL_TrayEntry instead of a SDL_Tray. + * + * A menu does not need to be destroyed; it will be destroyed with the tray. + * + * \param entry the tray entry to bind the menu to. + * \returns the newly created menu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_InsertTrayEntryAt + * \sa SDL_GetTraySubmenu + * \sa SDL_GetTrayMenuParentEntry + */ +extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_CreateTraySubmenu(SDL_TrayEntry *entry); + +/** + * Gets a previously created tray menu. + * + * You should have called SDL_CreateTrayMenu() on the tray object. This + * function allows you to fetch it again later. + * + * This function does the same thing as SDL_GetTraySubmenu(), except that it + * takes a SDL_Tray instead of a SDL_TrayEntry. + * + * A menu does not need to be destroyed; it will be destroyed with the tray. + * + * \param tray the tray entry to bind the menu to. + * \returns the newly created menu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTray + * \sa SDL_CreateTrayMenu + */ +extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_GetTrayMenu(SDL_Tray *tray); + +/** + * Gets a previously created tray entry submenu. + * + * You should have called SDL_CreateTraySubmenu() on the entry object. This + * function allows you to fetch it again later. + * + * This function does the same thing as SDL_GetTrayMenu(), except that it + * takes a SDL_TrayEntry instead of a SDL_Tray. + * + * A menu does not need to be destroyed; it will be destroyed with the tray. + * + * \param entry the tray entry to bind the menu to. + * \returns the newly created menu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_InsertTrayEntryAt + * \sa SDL_CreateTraySubmenu + */ +extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_GetTraySubmenu(SDL_TrayEntry *entry); + +/** + * Returns a list of entries in the menu, in order. + * + * \param menu The menu to get entries from. + * \param size An optional pointer to obtain the number of entries in the + * menu. + * \returns a NULL-terminated list of entries within the given menu. The + * pointer becomes invalid when any function that inserts or deletes + * entries in the menu is called. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_RemoveTrayEntry + * \sa SDL_InsertTrayEntryAt + */ +extern SDL_DECLSPEC const SDL_TrayEntry **SDLCALL SDL_GetTrayEntries(SDL_TrayMenu *menu, int *size); + +/** + * Removes a tray entry. + * + * \param entry The entry to be deleted. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + */ +extern SDL_DECLSPEC void SDLCALL SDL_RemoveTrayEntry(SDL_TrayEntry *entry); + +/** + * Insert a tray entry at a given position. + * + * If label is NULL, the entry will be a separator. Many functions won't work + * for an entry that is a separator. + * + * An entry does not need to be destroyed; it will be destroyed with the tray. + * + * \param menu the menu to append the entry to. + * \param pos the desired position for the new entry. Entries at or following + * this place will be moved. If pos is -1, the entry is appended. + * \param label the text to be displayed on the entry, in UTF-8 encoding, or + * NULL for a separator. + * \param flags a combination of flags, some of which are mandatory. + * \returns the newly created entry, or NULL if pos is out of bounds. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_TrayEntryFlags + * \sa SDL_GetTrayEntries + * \sa SDL_RemoveTrayEntry + * \sa SDL_GetTrayEntryParent + */ +extern SDL_DECLSPEC SDL_TrayEntry *SDLCALL SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *label, SDL_TrayEntryFlags flags); + +/** + * Sets the label of an entry. + * + * An entry cannot change between a separator and an ordinary entry; that is, + * it is not possible to set a non-NULL label on an entry that has a NULL + * label (separators), or to set a NULL label to an entry that has a non-NULL + * label. The function will silently fail if that happens. + * + * \param entry the entry to be updated. + * \param label the new label for the entry in UTF-8 encoding. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_GetTrayEntryLabel + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryLabel(SDL_TrayEntry *entry, const char *label); + +/** + * Gets the label of an entry. + * + * If the returned value is NULL, the entry is a separator. + * + * \param entry the entry to be read. + * \returns the label of the entry in UTF-8 encoding. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_SetTrayEntryLabel + */ +extern SDL_DECLSPEC const char *SDLCALL SDL_GetTrayEntryLabel(SDL_TrayEntry *entry); + +/** + * Sets whether or not an entry is checked. + * + * The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag. + * + * \param entry the entry to be updated. + * \param checked true if the entry should be checked; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_GetTrayEntryChecked + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryChecked(SDL_TrayEntry *entry, bool checked); + +/** + * Gets whether or not an entry is checked. + * + * The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag. + * + * \param entry the entry to be read. + * \returns true if the entry is checked; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_SetTrayEntryChecked + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GetTrayEntryChecked(SDL_TrayEntry *entry); + +/** + * Sets whether or not an entry is enabled. + * + * \param entry the entry to be updated. + * \param enabled true if the entry should be enabled; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_GetTrayEntryEnabled + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryEnabled(SDL_TrayEntry *entry, bool enabled); + +/** + * Gets whether or not an entry is enabled. + * + * \param entry the entry to be read. + * \returns true if the entry is enabled; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + * \sa SDL_SetTrayEntryEnabled + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GetTrayEntryEnabled(SDL_TrayEntry *entry); + +/** + * Sets a callback to be invoked when the entry is selected. + * + * \param entry the entry to be updated. + * \param callback a callback to be invoked when the entry is selected. + * \param userdata an optional pointer to pass extra data to the callback when + * it will be invoked. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTrayEntries + * \sa SDL_InsertTrayEntryAt + */ +extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryCallback(SDL_TrayEntry *entry, SDL_TrayCallback callback, void *userdata); + +/** + * Simulate a click on a tray entry. + * + * \param entry The entry to activate. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_ClickTrayEntry(SDL_TrayEntry *entry); + +/** + * Destroys a tray object. + * + * This also destroys all associated menus and entries. + * + * \param tray the tray icon to be destroyed. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTray + */ +extern SDL_DECLSPEC void SDLCALL SDL_DestroyTray(SDL_Tray *tray); + +/** + * Gets the menu containing a certain tray entry. + * + * \param entry the entry for which to get the parent menu. + * \returns the parent menu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_InsertTrayEntryAt + */ +extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_GetTrayEntryParent(SDL_TrayEntry *entry); + +/** + * Gets the entry for which the menu is a submenu, if the current menu is a + * submenu. + * + * Either this function or SDL_GetTrayMenuParentTray() will return non-NULL + * for any given menu. + * + * \param menu the menu for which to get the parent entry. + * \returns the parent entry, or NULL if this menu is not a submenu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTraySubmenu + * \sa SDL_GetTrayMenuParentTray + */ +extern SDL_DECLSPEC SDL_TrayEntry *SDLCALL SDL_GetTrayMenuParentEntry(SDL_TrayMenu *menu); + +/** + * Gets the tray for which this menu is the first-level menu, if the current + * menu isn't a submenu. + * + * Either this function or SDL_GetTrayMenuParentEntry() will return non-NULL + * for any given menu. + * + * \param menu the menu for which to get the parent enttrayry. + * \returns the parent tray, or NULL if this menu is a submenu. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateTrayMenu + * \sa SDL_GetTrayMenuParentEntry + */ +extern SDL_DECLSPEC SDL_Tray *SDLCALL SDL_GetTrayMenuParentTray(SDL_TrayMenu *menu); + +/** + * Update the trays. + * + * This is called automatically by the event loop and is only needed if you're + * using trays but aren't handling SDL events. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_UpdateTrays(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include + +#endif /* SDL_tray_h_ */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_version.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_version.h index c0f518d..55014e3 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_version.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_version.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -30,7 +30,6 @@ #define SDL_version_h_ #include -#include #include /* Set up for C function definitions, even when using C++ */ @@ -43,7 +42,7 @@ extern "C" { * * If this were SDL version 3.2.1, this value would be 3. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MAJOR_VERSION 3 @@ -52,18 +51,18 @@ extern "C" { * * If this were SDL version 3.2.1, this value would be 2. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ -#define SDL_MINOR_VERSION 1 +#define SDL_MINOR_VERSION 2 /** * The current micro (or patchlevel) version of the SDL headers. * * If this were SDL version 3.2.1, this value would be 1. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ -#define SDL_MICRO_VERSION 2 +#define SDL_MICRO_VERSION 0 /** * This macro turns the version numbers into a numeric value. @@ -74,7 +73,7 @@ extern "C" { * \param minor the minorversion number. * \param patch the patch version number. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM(major, minor, patch) \ ((major) * 1000000 + (minor) * 1000 + (patch)) @@ -86,7 +85,7 @@ extern "C" { * * \param version the version number. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MAJOR(version) ((version) / 1000000) @@ -97,7 +96,7 @@ extern "C" { * * \param version the version number. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MINOR(version) (((version) / 1000) % 1000) @@ -108,14 +107,16 @@ extern "C" { * * \param version the version number. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MICRO(version) ((version) % 1000) /** * This is the version number macro for the current SDL version. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_GetVersion */ #define SDL_VERSION \ SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_MICRO_VERSION) @@ -123,7 +124,7 @@ extern "C" { /** * This macro will evaluate to true if compiled with SDL at least X.Y.Z. * - * \since This macro is available since SDL 3.0.0. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSION_ATLEAST(X, Y, Z) \ (SDL_VERSION >= SDL_VERSIONNUM(X, Y, Z)) @@ -140,7 +141,7 @@ extern "C" { * * \returns the version of the linked library. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRevision */ @@ -166,7 +167,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetVersion(void); * \returns an arbitrary string, uniquely identifying the exact revision of * the SDL library in use. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetVersion */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_video.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_video.h index 7cce828..a7afc32 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_video.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_video.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 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 @@ -22,7 +22,28 @@ /** * # CategoryVideo * - * SDL video functions. + * SDL's video subsystem is largely interested in abstracting window + * management from the underlying operating system. You can create windows, + * manage them in various ways, set them fullscreen, and get events when + * interesting things happen with them, such as the mouse or keyboard + * interacting with a window. + * + * The video subsystem is also interested in abstracting away some + * platform-specific differences in OpenGL: context creation, swapping + * buffers, etc. This may be crucial to your app, but also you are not + * required to use OpenGL at all. In fact, SDL can provide rendering to those + * windows as well, either with an easy-to-use + * [2D API](https://wiki.libsdl.org/SDL3/CategoryRender) + * or with a more-powerful + * [GPU API](https://wiki.libsdl.org/SDL3/CategoryGPU) + * . Of course, it can simply get out of your way and give you the window + * handles you need to use Vulkan, Direct3D, Metal, or whatever else you like + * directly, too. + * + * The video subsystem covers a lot of functionality, out of necessity, so it + * is worth perusing the list of functions just to see what's available, but + * most apps can get by with simply creating a window and listening for + * events, so start with SDL_CreateWindow() and SDL_PollEvent(). */ #ifndef SDL_video_h_ @@ -49,7 +70,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_DisplayID; @@ -58,7 +79,7 @@ typedef Uint32 SDL_DisplayID; * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_WindowID; @@ -82,7 +103,7 @@ typedef Uint32 SDL_WindowID; /** * System theme. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_SystemTheme { @@ -91,13 +112,21 @@ typedef enum SDL_SystemTheme SDL_SYSTEM_THEME_DARK /**< Dark colored system theme */ } SDL_SystemTheme; -/* Internal display mode data */ +/** + * Internal display mode data. + * + * This lives as a field in SDL_DisplayMode, as opaque data. + * + * \since This struct is available since SDL 3.2.0. + * + * \sa SDL_DisplayMode + */ typedef struct SDL_DisplayModeData SDL_DisplayModeData; /** * The structure that defines a display mode. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetFullscreenDisplayModes * \sa SDL_GetDesktopDisplayMode @@ -123,7 +152,7 @@ typedef struct SDL_DisplayMode /** * Display orientation values; the way a display is rotated. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_DisplayOrientation { @@ -137,7 +166,7 @@ typedef enum SDL_DisplayOrientation /** * The struct used as an opaque handle to a window. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateWindow */ @@ -151,7 +180,7 @@ typedef struct SDL_Window SDL_Window; * changed on existing windows by the app, and some of it might be altered by * the user or system outside of the app's control. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ @@ -185,31 +214,91 @@ typedef Uint64 SDL_WindowFlags; /** - * Used to indicate that you don't care what the window position is. + * A magic value used with SDL_WINDOWPOS_UNDEFINED. * - * \since This macro is available since SDL 3.0.0. + * Generally this macro isn't used directly, but rather through + * SDL_WINDOWPOS_UNDEFINED or SDL_WINDOWPOS_UNDEFINED_DISPLAY. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINDOWPOS_UNDEFINED_MASK 0x1FFF0000u + +/** + * Used to indicate that you don't care what the window position is. + * + * If you _really_ don't care, SDL_WINDOWPOS_UNDEFINED is the same, but always + * uses the primary display instead of specifying one. + * + * \param X the SDL_DisplayID of the display to use. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_WINDOWPOS_UNDEFINED_DISPLAY(X) (SDL_WINDOWPOS_UNDEFINED_MASK|(X)) + +/** + * Used to indicate that you don't care what the window position/display is. + * + * This always uses the primary display. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_WINDOWPOS_UNDEFINED SDL_WINDOWPOS_UNDEFINED_DISPLAY(0) -#define SDL_WINDOWPOS_ISUNDEFINED(X) \ - (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK) + +/** + * A macro to test if the window position is marked as "undefined." + * + * \param X the window position value. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_WINDOWPOS_ISUNDEFINED(X) (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK) + +/** + * A magic value used with SDL_WINDOWPOS_CENTERED. + * + * Generally this macro isn't used directly, but rather through + * SDL_WINDOWPOS_CENTERED or SDL_WINDOWPOS_CENTERED_DISPLAY. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_WINDOWPOS_CENTERED_MASK 0x2FFF0000u /** * Used to indicate that the window position should be centered. * - * \since This macro is available since SDL 3.0.0. + * SDL_WINDOWPOS_CENTERED is the same, but always uses the primary display + * instead of specifying one. + * + * \param X the SDL_DisplayID of the display to use. + * + * \since This macro is available since SDL 3.2.0. */ -#define SDL_WINDOWPOS_CENTERED_MASK 0x2FFF0000u #define SDL_WINDOWPOS_CENTERED_DISPLAY(X) (SDL_WINDOWPOS_CENTERED_MASK|(X)) + +/** + * Used to indicate that the window position should be centered. + * + * This always uses the primary display. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_WINDOWPOS_CENTERED SDL_WINDOWPOS_CENTERED_DISPLAY(0) + +/** + * A macro to test if the window position is marked as "centered." + * + * \param X the window position value. + * + * \since This macro is available since SDL 3.2.0. + */ #define SDL_WINDOWPOS_ISCENTERED(X) \ (((X)&0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK) + /** * Window flash operation. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_FlashOperation { @@ -221,30 +310,102 @@ typedef enum SDL_FlashOperation /** * An opaque handle to an OpenGL context. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GL_CreateContext */ typedef struct SDL_GLContextState *SDL_GLContext; /** - * Opaque EGL types. + * Opaque type for an EGL display. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ typedef void *SDL_EGLDisplay; + +/** + * Opaque type for an EGL config. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef void *SDL_EGLConfig; + +/** + * Opaque type for an EGL surface. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef void *SDL_EGLSurface; + +/** + * An EGL attribute, used when creating an EGL context. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef intptr_t SDL_EGLAttrib; + +/** + * An EGL integer attribute, used when creating an EGL surface. + * + * \since This datatype is available since SDL 3.2.0. + */ typedef int SDL_EGLint; /** - * EGL attribute initialization callback types. + * EGL platform attribute initialization callback. * - * \since This datatype is available since SDL 3.0.0. + * This is called when SDL is attempting to create an EGL context, to let the + * app add extra attributes to its eglGetPlatformDisplay() call. + * + * The callback should return a pointer to an EGL attribute array terminated + * with `EGL_NONE`. If this function returns NULL, the SDL_CreateWindow + * process will fail gracefully. + * + * The returned pointer should be allocated with SDL_malloc() and will be + * passed to SDL_free(). + * + * The arrays returned by each callback will be appended to the existing + * attribute arrays defined by SDL. + * + * \param userdata an app-controlled pointer that is passed to the callback. + * \returns a newly-allocated array of attributes, terminated with `EGL_NONE`. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_EGL_SetAttributeCallbacks */ -typedef SDL_EGLAttrib *(SDLCALL *SDL_EGLAttribArrayCallback)(void); -typedef SDL_EGLint *(SDLCALL *SDL_EGLIntArrayCallback)(void); +typedef SDL_EGLAttrib *(SDLCALL *SDL_EGLAttribArrayCallback)(void *userdata); + +/** + * EGL surface/context attribute initialization callback types. + * + * This is called when SDL is attempting to create an EGL surface, to let the + * app add extra attributes to its eglCreateWindowSurface() or + * eglCreateContext calls. + * + * For convenience, the EGLDisplay and EGLConfig to use are provided to the + * callback. + * + * The callback should return a pointer to an EGL attribute array terminated + * with `EGL_NONE`. If this function returns NULL, the SDL_CreateWindow + * process will fail gracefully. + * + * The returned pointer should be allocated with SDL_malloc() and will be + * passed to SDL_free(). + * + * The arrays returned by each callback will be appended to the existing + * attribute arrays defined by SDL. + * + * \param userdata an app-controlled pointer that is passed to the callback. + * \param display the EGL display to be used. + * \param config the EGL config to be used. + * \returns a newly-allocated array of attributes, terminated with `EGL_NONE`. + * + * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_EGL_SetAttributeCallbacks + */ +typedef SDL_EGLint *(SDLCALL *SDL_EGLIntArrayCallback)(void *userdata, SDL_EGLDisplay display, SDL_EGLConfig config); /** * An enumeration of OpenGL configuration attributes. @@ -261,9 +422,9 @@ typedef SDL_EGLint *(SDLCALL *SDL_EGLIntArrayCallback)(void); * fail if the GL can't provide your requested attributes at a minimum, but * you should check to see exactly what you got. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ -typedef enum SDL_GLattr +typedef enum SDL_GLAttr { SDL_GL_RED_SIZE, /**< the minimum number of bits for the red channel of the color buffer; defaults to 3. */ SDL_GL_GREEN_SIZE, /**< the minimum number of bits for the green channel of the color buffer; defaults to 3. */ @@ -284,64 +445,64 @@ typedef enum SDL_GLattr SDL_GL_RETAINED_BACKING, /**< not used (deprecated). */ SDL_GL_CONTEXT_MAJOR_VERSION, /**< OpenGL context major version. */ SDL_GL_CONTEXT_MINOR_VERSION, /**< OpenGL context minor version. */ - SDL_GL_CONTEXT_FLAGS, /**< some combination of 0 or more of elements of the SDL_GLcontextFlag enumeration; defaults to 0. */ - SDL_GL_CONTEXT_PROFILE_MASK, /**< type of GL context (Core, Compatibility, ES). See SDL_GLprofile; default value depends on platform. */ + SDL_GL_CONTEXT_FLAGS, /**< some combination of 0 or more of elements of the SDL_GLContextFlag enumeration; defaults to 0. */ + SDL_GL_CONTEXT_PROFILE_MASK, /**< type of GL context (Core, Compatibility, ES). See SDL_GLProfile; default value depends on platform. */ SDL_GL_SHARE_WITH_CURRENT_CONTEXT, /**< OpenGL context sharing; defaults to 0. */ SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, /**< requests sRGB capable visual; defaults to 0. */ - SDL_GL_CONTEXT_RELEASE_BEHAVIOR, /**< sets context the release behavior. See SDL_GLcontextReleaseFlag; defaults to FLUSH. */ + SDL_GL_CONTEXT_RELEASE_BEHAVIOR, /**< sets context the release behavior. See SDL_GLContextReleaseFlag; defaults to FLUSH. */ SDL_GL_CONTEXT_RESET_NOTIFICATION, /**< set context reset notification. See SDL_GLContextResetNotification; defaults to NO_NOTIFICATION. */ SDL_GL_CONTEXT_NO_ERROR, SDL_GL_FLOATBUFFERS, SDL_GL_EGL_PLATFORM -} SDL_GLattr; +} SDL_GLAttr; /** * Possible values to be set for the SDL_GL_CONTEXT_PROFILE_MASK attribute. * - * \since This enum is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ -typedef enum SDL_GLprofile -{ - 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 Uint32 SDL_GLProfile; + +#define SDL_GL_CONTEXT_PROFILE_CORE 0x0001 /**< OpenGL Core Profile context */ +#define SDL_GL_CONTEXT_PROFILE_COMPATIBILITY 0x0002 /**< OpenGL Compatibility Profile context */ +#define SDL_GL_CONTEXT_PROFILE_ES 0x0004 /**< GLX_CONTEXT_ES2_PROFILE_BIT_EXT */ + /** - * Possible values to be set for the SDL_GL_CONTEXT_FLAGS attribute. + * Possible flags to be set for the SDL_GL_CONTEXT_FLAGS attribute. * - * \since This enum is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ -typedef enum SDL_GLcontextFlag -{ - 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 Uint32 SDL_GLContextFlag; + +#define SDL_GL_CONTEXT_DEBUG_FLAG 0x0001 +#define SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG 0x0002 +#define SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG 0x0004 +#define SDL_GL_CONTEXT_RESET_ISOLATION_FLAG 0x0008 + /** * Possible values to be set for the SDL_GL_CONTEXT_RELEASE_BEHAVIOR * attribute. * - * \since This enum is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ -typedef enum SDL_GLcontextReleaseFlag -{ - SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE = 0x0000, - SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x0001 -} SDL_GLcontextReleaseFlag; +typedef Uint32 SDL_GLContextReleaseFlag; + +#define SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE 0x0000 +#define SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x0001 + /** * Possible values to be set SDL_GL_CONTEXT_RESET_NOTIFICATION attribute. * - * \since This enum is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. */ -typedef enum SDL_GLContextResetNotification -{ - SDL_GL_CONTEXT_RESET_NO_NOTIFICATION = 0x0000, - SDL_GL_CONTEXT_RESET_LOSE_CONTEXT = 0x0001 -} SDL_GLContextResetNotification; +typedef Uint32 SDL_GLContextResetNotification; + +#define SDL_GL_CONTEXT_RESET_NO_NOTIFICATION 0x0000 +#define SDL_GL_CONTEXT_RESET_LOSE_CONTEXT 0x0001 + /* Function prototypes */ @@ -350,7 +511,9 @@ typedef enum SDL_GLContextResetNotification * * \returns the number of built in video drivers. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetVideoDriver */ @@ -369,7 +532,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void); * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumVideoDrivers */ @@ -385,7 +550,9 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetVideoDriver(int index); * \returns the name of the current video driver or NULL if no driver has been * initialized. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumVideoDrivers * \sa SDL_GetVideoDriver @@ -397,7 +564,9 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentVideoDriver(void); * * \returns the current system theme, light, dark, or unknown. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SystemTheme SDLCALL SDL_GetSystemTheme(void); @@ -410,7 +579,9 @@ extern SDL_DECLSPEC SDL_SystemTheme SDLCALL SDL_GetSystemTheme(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_DisplayID * SDLCALL SDL_GetDisplays(int *count); @@ -420,7 +591,9 @@ extern SDL_DECLSPEC SDL_DisplayID * SDLCALL SDL_GetDisplays(int *count); * \returns the instance ID of the primary display on success or 0 on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -448,7 +621,9 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetPrimaryDisplay(void); * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetDisplayProperties(SDL_DisplayID displayID); @@ -462,7 +637,9 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetDisplayProperties(SDL_Displa * \returns the name of a display or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -471,19 +648,22 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetDisplayName(SDL_DisplayID displa /** * Get the desktop area represented by a display. * - * The primary display is always located at (0,0). + * The primary display is often located at (0,0), but may be placed at a + * different location depending on monitor layout. * * \param displayID the instance ID of the display to query. * \param rect the SDL_Rect structure filled in with the display bounds. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayUsableBounds * \sa SDL_GetDisplays */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDisplayBounds(SDL_DisplayID displayID, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetDisplayBounds(SDL_DisplayID displayID, SDL_Rect *rect); /** * Get the usable desktop area represented by a display, in screen @@ -499,15 +679,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDisplayBounds(SDL_DisplayID displayI * * \param displayID the instance ID of the display to query. * \param rect the SDL_Rect structure filled in with the display bounds. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDisplayUsableBounds(SDL_DisplayID displayID, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetDisplayUsableBounds(SDL_DisplayID displayID, SDL_Rect *rect); /** * Get the orientation of a display when it is unrotated. @@ -516,7 +698,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetDisplayUsableBounds(SDL_DisplayID di * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -529,7 +713,9 @@ extern SDL_DECLSPEC SDL_DisplayOrientation SDLCALL SDL_GetNaturalDisplayOrientat * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -543,12 +729,21 @@ extern SDL_DECLSPEC SDL_DisplayOrientation SDLCALL SDL_GetCurrentDisplayOrientat * display scale, which means that the user expects UI elements to be twice as * big on this display, to aid in readability. * + * After window creation, SDL_GetWindowDisplayScale() should be used to query + * the content scale factor for individual windows instead of querying the + * display for a window and calling this function, as the per-window content + * scale factor may differ from the base value of the display it is on, + * particularly on high-DPI and/or multi-monitor desktop configurations. + * * \param displayID the instance ID of the display to query. * \returns the content scale of the display, or 0.0f on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetWindowDisplayScale * \sa SDL_GetDisplays */ extern SDL_DECLSPEC float SDLCALL SDL_GetDisplayContentScale(SDL_DisplayID displayID); @@ -573,7 +768,9 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetDisplayContentScale(SDL_DisplayID displ * single allocation that should be freed with SDL_free() when it is * no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -587,7 +784,7 @@ extern SDL_DECLSPEC SDL_DisplayMode ** SDLCALL SDL_GetFullscreenDisplayModes(SDL * 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. + * small, then false is returned. * * \param displayID the instance ID of the display to query. * \param w the width in pixels of the desired display mode. @@ -596,17 +793,19 @@ extern SDL_DECLSPEC SDL_DisplayMode ** SDLCALL SDL_GetFullscreenDisplayModes(SDL * for the desktop refresh rate. * \param include_high_density_modes boolean to include high density modes in * the search. - * \param mode a pointer filled in with the closest display mode equal to or - * larger than the desired mode. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param closest a pointer filled in with the closest display mode equal to + * or larger than the desired mode. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays * \sa SDL_GetFullscreenDisplayModes */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID displayID, int w, int h, float refresh_rate, SDL_bool include_high_density_modes, SDL_DisplayMode *mode); +extern SDL_DECLSPEC bool SDLCALL SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID displayID, int w, int h, float refresh_rate, bool include_high_density_modes, SDL_DisplayMode *closest); /** * Get information about the desktop's display mode. @@ -620,7 +819,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetClosestFullscreenDisplayMode(SDL_Dis * \returns a pointer to the desktop display mode or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCurrentDisplayMode * \sa SDL_GetDisplays @@ -639,7 +840,9 @@ extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetDesktopDisplayMode(SD * \returns a pointer to the desktop display mode or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDesktopDisplayMode * \sa SDL_GetDisplays @@ -653,7 +856,9 @@ extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetCurrentDisplayMode(SD * \returns the instance ID of the display containing the point or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays @@ -668,7 +873,9 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetDisplayForPoint(const SDL_Point * closest to the center of the rect on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays @@ -683,7 +890,9 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetDisplayForRect(const SDL_Rect * * on success or 0 on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays @@ -701,7 +910,9 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetDisplayForWindow(SDL_Window *wi * \returns the pixel density or 0.0f on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowDisplayScale */ @@ -725,7 +936,9 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowPixelDensity(SDL_Window *window); * \returns the display scale, or 0.0f on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowDisplayScale(SDL_Window *window); @@ -743,24 +956,26 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowDisplayScale(SDL_Window *window); * taken effect. * * When the new mode takes effect, an SDL_EVENT_WINDOW_RESIZED and/or an - * SDL_EVENT_WINDOOW_PIXEL_SIZE_CHANGED event will be emitted with the new - * mode dimensions. + * SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event will be emitted with the new mode + * dimensions. * * \param window the window to affect. * \param mode a pointer to the display mode to use, which can be NULL for * borderless fullscreen desktop mode, or one of the fullscreen * modes returned by SDL_GetFullscreenDisplayModes() to set an * exclusive fullscreen mode. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFullscreenMode * \sa SDL_SetWindowFullscreen * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFullscreenMode(SDL_Window *window, const SDL_DisplayMode *mode); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFullscreenMode(SDL_Window *window, const SDL_DisplayMode *mode); /** * Query the display mode to use when a window is visible at fullscreen. @@ -769,7 +984,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFullscreenMode(SDL_Window *win * \returns a pointer to the exclusive fullscreen mode to use or NULL for * borderless fullscreen desktop mode. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowFullscreenMode * \sa SDL_SetWindowFullscreen @@ -785,7 +1002,9 @@ extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetWindowFullscreenMode( * SDL_GetError() for more information. This should be freed with * SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void * SDLCALL SDL_GetWindowICCProfile(SDL_Window *window, size_t *size); @@ -797,7 +1016,9 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetWindowICCProfile(SDL_Window *window, s * SDL_PIXELFORMAT_UNKNOWN on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetWindowPixelFormat(SDL_Window *window); @@ -811,7 +1032,9 @@ extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetWindowPixelFormat(SDL_Window * allocation that should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window ** SDLCALL SDL_GetWindows(int *count); @@ -870,7 +1093,7 @@ extern SDL_DECLSPEC SDL_Window ** SDLCALL SDL_GetWindows(int *count); * 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. + * 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. @@ -890,8 +1113,11 @@ extern SDL_DECLSPEC SDL_Window ** SDLCALL SDL_GetWindows(int *count); * \returns the window that was created or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateWindowAndRenderer * \sa SDL_CreatePopupWindow * \sa SDL_CreateWindowWithProperties * \sa SDL_DestroyWindow @@ -901,36 +1127,41 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, int /** * Create a child popup window of the specified parent window. * - * 'flags' **must** contain exactly one of the following: - - * 'SDL_WINDOW_TOOLTIP': The popup window is a tooltip and will not pass any - * input events. - 'SDL_WINDOW_POPUP_MENU': The popup window is a popup menu. - * The topmost popup menu will implicitly gain the keyboard focus. + * The flags parameter **must** contain at least one of the following: + * + * - `SDL_WINDOW_TOOLTIP`: The popup window is a tooltip and will not pass any + * input events. + * - `SDL_WINDOW_POPUP_MENU`: The popup window is a popup menu. The topmost + * popup menu will implicitly gain the keyboard focus. * * The following flags are not relevant to popup window creation and will be * ignored: * - * - 'SDL_WINDOW_MINIMIZED' - * - 'SDL_WINDOW_MAXIMIZED' - * - 'SDL_WINDOW_FULLSCREEN' - * - 'SDL_WINDOW_BORDERLESS' + * - `SDL_WINDOW_MINIMIZED` + * - `SDL_WINDOW_MAXIMIZED` + * - `SDL_WINDOW_FULLSCREEN` + * - `SDL_WINDOW_BORDERLESS` + * + * The following flags are incompatible with popup window creation and will + * cause it to fail: + * + * - `SDL_WINDOW_UTILITY` + * - `SDL_WINDOW_MODAL` * * The parent parameter **must** be non-null and a valid window. The parent of * a popup window can be either a regular, toplevel window, or another popup * window. * * Popup windows cannot be minimized, maximized, made fullscreen, raised, - * flash, be made a modal window, be the parent of a modal window, or grab the - * mouse and/or keyboard. Attempts to do so will fail. + * flash, be made a modal window, be the parent of a toplevel window, or grab + * the mouse and/or keyboard. Attempts to do so will fail. * * Popup windows implicitly do not have a border/decorations and do not appear * on the taskbar/dock or in lists of windows such as alt-tab menus. * - * If a parent window is hidden, any child popup windows will be recursively - * hidden as well. Child popup windows not explicitly hidden will be restored - * when the parent is shown. - * - * If the parent window is destroyed, any child popup windows will be - * recursively destroyed as well. + * If a parent window is hidden or destroyed, any child popup windows will be + * recursively hidden or destroyed as well. Child popup windows not explicitly + * hidden will be restored when the parent is shown. * * \param parent the parent of the window, must not be NULL. * \param offset_x the x position of the popup window relative to the origin @@ -944,7 +1175,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, int * \returns the window that was created or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateWindow * \sa SDL_CreateWindowWithProperties @@ -987,7 +1220,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * - `SDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN`: true if the window will be used * with OpenGL rendering * - `SDL_PROP_WINDOW_CREATE_PARENT_POINTER`: an SDL_Window that will be the - * parent of this window, required for windows with the "toolip", "menu", + * parent of this window, required for windows with the "tooltip", "menu", * and "modal" properties * - `SDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN`: true if the window should be * resizable @@ -1003,10 +1236,12 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * - `SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER`: the width of the window * - `SDL_PROP_WINDOW_CREATE_X_NUMBER`: the x position of the window, or * `SDL_WINDOWPOS_CENTERED`, defaults to `SDL_WINDOWPOS_UNDEFINED`. This is - * relative to the parent for windows with the "parent" property set. + * relative to the parent for windows with the "tooltip" or "menu" property + * set. * - `SDL_PROP_WINDOW_CREATE_Y_NUMBER`: the y position of the window, or * `SDL_WINDOWPOS_CENTERED`, defaults to `SDL_WINDOWPOS_UNDEFINED`. This is - * relative to the parent for windows with the "parent" property set. + * relative to the parent for windows with the "tooltip" or "menu" property + * set. * * These are additional supported properties on macOS: * @@ -1024,8 +1259,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * [README/wayland](README/wayland) for more information on using custom * surfaces. * - `SDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN` - true if the - * application wants an associated `wl_egl_window` object to be created, - * even if the window does not have the OpenGL property or flag set. + * application wants an associated `wl_egl_window` object to be created and + * attached to the window, even if the window does not have the OpenGL + * property or `SDL_WINDOW_OPENGL` flag set. * - `SDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER` - the wl_surface * associated with the window, if you want to wrap an existing window. See * [README/wayland](README/wayland) for more information. @@ -1061,7 +1297,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * \returns the window that was created or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties * \sa SDL_CreateWindow @@ -1114,7 +1352,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindowWithProperties(SDL_Prop * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFromID */ @@ -1130,7 +1370,9 @@ extern SDL_DECLSPEC SDL_WindowID SDLCALL SDL_GetWindowID(SDL_Window *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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowID */ @@ -1143,7 +1385,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowFromID(SDL_WindowID id); * \returns the parent of the window on success or NULL if the window has no * parent. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePopupWindow */ @@ -1181,7 +1425,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * - `SDL_PROP_WINDOW_UIKIT_WINDOW_POINTER`: the `(__unsafe_unretained)` * UIWindow associated with the window * - `SDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER`: the NSInteger tag - * assocated with metal views on the window + * associated with metal views on the window * - `SDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER`: the OpenGL view's * framebuffer object. It must be bound when rendering to the screen using * OpenGL. @@ -1206,6 +1450,11 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * - `SDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER`: the NSInteger tag * assocated with metal views on the window * + * On OpenVR: + * + * - `SDL_PROP_WINDOW_OPENVR_OVERLAY_ID`: the OpenVR Overlay Handle ID for the + * associated overlay window. + * * On Vivante: * * - `SDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER`: the EGLNativeDisplayType @@ -1215,11 +1464,6 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * - `SDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER`: the EGLSurface associated with * the window * - * On UWP: - * - * - `SDL_PROP_WINDOW_WINRT_WINDOW_POINTER`: the IInspectable CoreWindow - * associated with the window - * * On Windows: * * - `SDL_PROP_WINDOW_WIN32_HWND_POINTER`: the HWND associated with the window @@ -1237,6 +1481,8 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * the window * - `SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER`: the wl_surface associated with * the window + * - `SDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER`: the wp_viewport associated + * with the window * - `SDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER`: the wl_egl_window * associated with the window * - `SDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER`: the xdg_surface associated @@ -1263,7 +1509,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window *window); @@ -1283,15 +1531,16 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window #define SDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER "SDL.window.kmsdrm.gbm_dev" #define SDL_PROP_WINDOW_COCOA_WINDOW_POINTER "SDL.window.cocoa.window" #define SDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER "SDL.window.cocoa.metal_view_tag" +#define SDL_PROP_WINDOW_OPENVR_OVERLAY_ID "SDL.window.openvr.overlay_id" #define SDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER "SDL.window.vivante.display" #define SDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER "SDL.window.vivante.window" #define SDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER "SDL.window.vivante.surface" -#define SDL_PROP_WINDOW_WINRT_WINDOW_POINTER "SDL.window.winrt.window" #define SDL_PROP_WINDOW_WIN32_HWND_POINTER "SDL.window.win32.hwnd" #define SDL_PROP_WINDOW_WIN32_HDC_POINTER "SDL.window.win32.hdc" #define SDL_PROP_WINDOW_WIN32_INSTANCE_POINTER "SDL.window.win32.instance" #define SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER "SDL.window.wayland.display" #define SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER "SDL.window.wayland.surface" +#define SDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER "SDL.window.wayland.viewport" #define SDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER "SDL.window.wayland.egl_window" #define SDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER "SDL.window.wayland.xdg_surface" #define SDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER "SDL.window.wayland.xdg_toplevel" @@ -1308,7 +1557,9 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window * \param window the window to query. * \returns a mask of the SDL_WindowFlags associated with `window`. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateWindow * \sa SDL_HideWindow @@ -1327,14 +1578,16 @@ extern SDL_DECLSPEC SDL_WindowFlags SDLCALL SDL_GetWindowFlags(SDL_Window *windo * * \param window the window to change. * \param title the desired window title in UTF-8 format. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowTitle */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowTitle(SDL_Window *window, const char *title); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowTitle(SDL_Window *window, const char *title); /** * Get the title of a window. @@ -1343,7 +1596,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowTitle(SDL_Window *window, cons * \returns the title of the window in UTF-8 format or "" if there is no * title. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowTitle */ @@ -1364,23 +1619,24 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetWindowTitle(SDL_Window *window); * * \param window the window to change. * \param icon an SDL_Surface structure containing the icon for the window. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowIcon(SDL_Window *window, SDL_Surface *icon); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowIcon(SDL_Window *window, SDL_Surface *icon); /** * Request that the window's position be set. * - * If, at the time of this request, the window is in a fixed-size state such - * as maximized, this request may be deferred until the window returns to a - * resizable state. + * If the window is in an exclusive fullscreen or maximized state, this + * request has no effect. * * This can be used to reposition fullscreen-desktop windows onto a different - * display, however, exclusive fullscreen windows are locked to a specific - * display and can only be repositioned programmatically via + * display, however, as exclusive fullscreen windows are locked to a specific + * display, they can only be repositioned programmatically via * SDL_SetWindowFullscreenMode(). * * On some windowing systems this request is asynchronous and the new @@ -1401,15 +1657,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowIcon(SDL_Window *window, SDL_S * `SDL_WINDOWPOS_UNDEFINED`. * \param y the y coordinate of the window, or `SDL_WINDOWPOS_CENTERED` or * `SDL_WINDOWPOS_UNDEFINED`. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowPosition * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowPosition(SDL_Window *window, int x, int y); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowPosition(SDL_Window *window, int x, int y); /** * Get the position of a window. @@ -1425,24 +1683,25 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowPosition(SDL_Window *window, i * NULL. * \param y a pointer filled in with the y position of the window, may be * NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowPosition */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowPosition(SDL_Window *window, int *x, int *y); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowPosition(SDL_Window *window, int *x, int *y); /** * Request that the size of a window's client area be set. * - * If, at the time of this request, the window in a fixed-size state, such as - * maximized or fullscreen, the request will be deferred until the window - * exits this state and becomes resizable again. + * If the window is in a fullscreen or maximized state, this request has no + * effect. * - * To change the fullscreen mode of a window, use - * SDL_SetWindowFullscreenMode() + * To change the exclusive fullscreen mode of a window, use + * SDL_SetWindowFullscreenMode(). * * On some windowing systems, this request is asynchronous and the new window * size may not have have been applied immediately upon the return of this @@ -1459,16 +1718,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowPosition(SDL_Window *window, i * \param window the window to change. * \param w the width of the window, must be > 0. * \param h the height of the window, must be > 0. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSize * \sa SDL_SetWindowFullscreenMode * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowSize(SDL_Window *window, int w, int h); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowSize(SDL_Window *window, int w, int h); /** * Get the size of a window's client area. @@ -1480,16 +1741,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowSize(SDL_Window *window, int w * \param window the window to query the width and height from. * \param w a pointer filled in with the width of the window, may be NULL. * \param h a pointer filled in with the height of the window, may be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderOutputSize * \sa SDL_GetWindowSizeInPixels * \sa SDL_SetWindowSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSize(SDL_Window *window, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSize(SDL_Window *window, int *w, int *h); /** * Get the safe area for this window. @@ -1497,19 +1760,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSize(SDL_Window *window, int * * Some devices have portions of the screen which are partially obscured or * not interactive, possibly due to on-screen controls, curved edges, camera * notches, TV overscan, etc. This function provides the area of the window - * which is safe to have interactible content. You should continue rendering + * which is safe to have interactable content. You should continue rendering * into the rest of the window, but it should not contain visually important * or interactible content. * * \param window the window to query. * \param rect a pointer filled in with the client area that is safe for * interactive content. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSafeArea(SDL_Window *window, SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSafeArea(SDL_Window *window, SDL_Rect *rect); /** * Request that the aspect ratio of a window's client area be set. @@ -1540,15 +1805,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSafeArea(SDL_Window *window, S * limit. * \param max_aspect the maximum aspect ratio of the window, or 0.0f for no * limit. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowAspectRatio * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowAspectRatio(SDL_Window *window, float min_aspect, float max_aspect); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowAspectRatio(SDL_Window *window, float min_aspect, float max_aspect); /** * Get the size of a window's client area. @@ -1558,19 +1825,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowAspectRatio(SDL_Window *window * window, may be NULL. * \param max_aspect a pointer filled in with the maximum aspect ratio of the * window, may be NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowAspectRatio */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowAspectRatio(SDL_Window *window, float *min_aspect, float *max_aspect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowAspectRatio(SDL_Window *window, float *min_aspect, float *max_aspect); /** * 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 + * Note: If this function fails (returns false), 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. * @@ -1580,7 +1849,8 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowAspectRatio(SDL_Window *window * 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. + * This function also returns false if getting the information is not + * supported. * * \param window the window to query the size values of the border * (decorations) from. @@ -1592,14 +1862,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowAspectRatio(SDL_Window *window * border; NULL is permitted. * \param right pointer to variable for storing the size of the right border; * NULL is permitted. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowBordersSize(SDL_Window *window, int *top, int *left, int *bottom, int *right); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowBordersSize(SDL_Window *window, int *top, int *left, int *bottom, int *right); /** * Get the size of a window's client area, in pixels. @@ -1609,15 +1881,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowBordersSize(SDL_Window *window * NULL. * \param h a pointer to variable for storing the height in pixels, may be * NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateWindow * \sa SDL_GetWindowSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSizeInPixels(SDL_Window *window, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSizeInPixels(SDL_Window *window, int *w, int *h); /** * Set the minimum size of a window's client area. @@ -1625,15 +1899,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSizeInPixels(SDL_Window *windo * \param window the window to change. * \param min_w the minimum width of the window, or 0 for no limit. * \param min_h the minimum height of the window, or 0 for no limit. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMinimumSize * \sa SDL_SetWindowMaximumSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMinimumSize(SDL_Window *window, int min_w, int min_h); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMinimumSize(SDL_Window *window, int min_w, int min_h); /** * Get the minimum size of a window's client area. @@ -1643,15 +1919,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMinimumSize(SDL_Window *window * NULL. * \param h a pointer filled in with the minimum height of the window, may be * NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMaximumSize * \sa SDL_SetWindowMinimumSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowMinimumSize(SDL_Window *window, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowMinimumSize(SDL_Window *window, int *w, int *h); /** * Set the maximum size of a window's client area. @@ -1659,15 +1937,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowMinimumSize(SDL_Window *window * \param window the window to change. * \param max_w the maximum width of the window, or 0 for no limit. * \param max_h the maximum height of the window, or 0 for no limit. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMaximumSize * \sa SDL_SetWindowMinimumSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMaximumSize(SDL_Window *window, int max_w, int max_h); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMaximumSize(SDL_Window *window, int max_w, int max_h); /** * Get the maximum size of a window's client area. @@ -1677,15 +1957,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMaximumSize(SDL_Window *window * NULL. * \param h a pointer filled in with the maximum height of the window, may be * NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMinimumSize * \sa SDL_SetWindowMaximumSize */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowMaximumSize(SDL_Window *window, int *w, int *h); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowMaximumSize(SDL_Window *window, int *w, int *h); /** * Set the border state of a window. @@ -1697,15 +1979,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowMaximumSize(SDL_Window *window * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param bordered false to remove border, true to add border. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowBordered(SDL_Window *window, SDL_bool bordered); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowBordered(SDL_Window *window, bool bordered); /** * Set the user-resizable state of a window. @@ -1717,15 +2001,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowBordered(SDL_Window *window, S * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param resizable true to allow resizing, false to disallow. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowResizable(SDL_Window *window, SDL_bool resizable); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowResizable(SDL_Window *window, bool resizable); /** * Set the window to always be above the others. @@ -1734,43 +2020,49 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowResizable(SDL_Window *window, * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param on_top true to set the window always on top, false to disable. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowAlwaysOnTop(SDL_Window *window, SDL_bool on_top); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowAlwaysOnTop(SDL_Window *window, bool on_top); /** * Show a window. * * \param window the window to show. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_HideWindow * \sa SDL_RaiseWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowWindow(SDL_Window *window); /** * Hide a window. * * \param window the window to hide. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowWindow + * \sa SDL_WINDOW_HIDDEN */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HideWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_HideWindow(SDL_Window *window); /** * Request that a window be raised above other windows and gain the input @@ -1783,12 +2075,14 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HideWindow(SDL_Window *window); * the window will have the SDL_WINDOW_INPUT_FOCUS flag set. * * \param window the window to raise. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RaiseWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_RaiseWindow(SDL_Window *window); /** * Request that the window be made as large as possible. @@ -1811,22 +2105,27 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RaiseWindow(SDL_Window *window); * and Wayland window managers may vary. * * \param window the window to maximize. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_MinimizeWindow * \sa SDL_RestoreWindow * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MaximizeWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_MaximizeWindow(SDL_Window *window); /** * Request that the window be minimized to an iconic representation. * + * If the window is in a fullscreen state, this request has no direct effect. + * It may alter the state the window is returned to when leaving fullscreen. + * * On some windowing systems this request is asynchronous and the new window - * state may not have have been applied immediately upon the return of this + * state may not have been applied immediately upon the return of this * function. If an immediate change is required, call SDL_SyncWindow() to * block until the changes have taken effect. * @@ -1835,21 +2134,26 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MaximizeWindow(SDL_Window *window); * deny the state change. * * \param window the window to minimize. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_MaximizeWindow * \sa SDL_RestoreWindow * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MinimizeWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_MinimizeWindow(SDL_Window *window); /** * Request that the size and position of a minimized or maximized window be * restored. * + * If the window is in a fullscreen state, this request has no direct effect. + * It may alter the state the window is returned to when leaving fullscreen. + * * On some windowing systems this request is asynchronous and the new window * state may not have have been applied immediately upon the return of this * function. If an immediate change is required, call SDL_SyncWindow() to @@ -1860,16 +2164,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_MinimizeWindow(SDL_Window *window); * deny the state change. * * \param window the window to restore. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_MaximizeWindow * \sa SDL_MinimizeWindow * \sa SDL_SyncWindow */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RestoreWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_RestoreWindow(SDL_Window *window); /** * Request that the window's fullscreen state be changed. @@ -1888,18 +2194,20 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_RestoreWindow(SDL_Window *window); * is just a request, it can be denied by the windowing system. * * \param window the window to change. - * \param fullscreen SDL_TRUE for fullscreen mode, SDL_FALSE for windowed - * mode. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param fullscreen true for fullscreen mode, false for windowed mode. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFullscreenMode * \sa SDL_SetWindowFullscreenMode * \sa SDL_SyncWindow + * \sa SDL_WINDOW_FULLSCREEN */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFullscreen(SDL_Window *window, SDL_bool fullscreen); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFullscreen(SDL_Window *window, bool fullscreen); /** * Block until any pending window state is finalized. @@ -1915,10 +2223,12 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFullscreen(SDL_Window *window, * * \param window the window for which to wait for the pending state to be * applied. - * \returns SDL_TRUE on success or SDL_FALSE if the operation timed out before - * the window was in the requested state. + * \returns true on success or false if the operation timed out before the + * window was in the requested state. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowSize * \sa SDL_SetWindowPosition @@ -1928,20 +2238,22 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFullscreen(SDL_Window *window, * \sa SDL_RestoreWindow * \sa SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SyncWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_SyncWindow(SDL_Window *window); /** * Return whether the window has a surface associated with it. * * \param window the window to query. - * \returns SDL_TRUE if there is a surface associated with the window, or - * SDL_FALSE otherwise. + * \returns true if there is a surface associated with the window, or false + * otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WindowHasSurface(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_WindowHasSurface(SDL_Window *window); /** * Get the SDL surface associated with the window. @@ -1961,7 +2273,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WindowHasSurface(SDL_Window *window); * \returns the surface associated with the window, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyWindowSurface * \sa SDL_WindowHasSurface @@ -1985,14 +2299,16 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_GetWindowSurface(SDL_Window *windo * * \param window the window. * \param vsync the vertical refresh sync interval. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurfaceVSync */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowSurfaceVSync(SDL_Window *window, int vsync); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowSurfaceVSync(SDL_Window *window, int vsync); #define SDL_WINDOW_SURFACE_VSYNC_DISABLED 0 #define SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE (-1) @@ -2003,14 +2319,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowSurfaceVSync(SDL_Window *windo * \param window the window to query. * \param vsync an int filled with the current vertical refresh sync interval. * See SDL_SetWindowSurfaceVSync() for the meaning of the value. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowSurfaceVSync */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSurfaceVSync(SDL_Window *window, int *vsync); +extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSurfaceVSync(SDL_Window *window, int *vsync); /** * Copy the window surface to the screen. @@ -2021,15 +2339,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowSurfaceVSync(SDL_Window *windo * This function is equivalent to the SDL 1.2 API SDL_Flip(). * * \param window the window to update. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface * \sa SDL_UpdateWindowSurfaceRects */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateWindowSurface(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateWindowSurface(SDL_Window *window); /** * Copy areas of the window surface to the screen. @@ -2048,29 +2368,33 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateWindowSurface(SDL_Window *window) * \param rects an array of SDL_Rect structures representing areas of the * surface to copy, in pixels. * \param numrects the number of rectangles. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface * \sa SDL_UpdateWindowSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window *window, const SDL_Rect *rects, int numrects); +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window *window, const SDL_Rect *rects, int numrects); /** * Destroy the surface associated with the window. * * \param window the window to update. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface * \sa SDL_WindowHasSurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DestroyWindowSurface(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_DestroyWindowSurface(SDL_Window *window); /** * Set a window's keyboard grab mode. @@ -2092,16 +2416,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DestroyWindowSurface(SDL_Window *window * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param grabbed this is true to grab keyboard, and false to release. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowKeyboardGrab * \sa SDL_SetWindowMouseGrab */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowKeyboardGrab(SDL_Window *window, SDL_bool grabbed); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowKeyboardGrab(SDL_Window *window, bool grabbed); /** * Set a window's mouse grab mode. @@ -2109,47 +2435,60 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowKeyboardGrab(SDL_Window *windo * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param grabbed this is true to grab mouse, and false to release. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. * - * \sa SDL_GetWindowMouseGrab + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetWindowMouseRect + * \sa SDL_SetWindowMouseRect + * \sa SDL_SetWindowMouseGrab * \sa SDL_SetWindowKeyboardGrab */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMouseGrab(SDL_Window *window, SDL_bool grabbed); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMouseGrab(SDL_Window *window, bool grabbed); /** * Get a window's keyboard grab mode. * * \param window the window to query. - * \returns SDL_TRUE if keyboard is grabbed, and SDL_FALSE otherwise. + * \returns true if keyboard is grabbed, and false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowKeyboardGrab */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowKeyboardGrab(SDL_Window *window); +extern SDL_DECLSPEC 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. + * \returns true if mouse is grabbed, and false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetWindowMouseRect + * \sa SDL_SetWindowMouseRect + * \sa SDL_SetWindowMouseGrab * \sa SDL_SetWindowKeyboardGrab */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetWindowMouseGrab(SDL_Window *window); +extern SDL_DECLSPEC 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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowMouseGrab * \sa SDL_SetWindowKeyboardGrab @@ -2165,15 +2504,18 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetGrabbedWindow(void); * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMouseRect + * \sa SDL_GetWindowMouseGrab * \sa SDL_SetWindowMouseGrab */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMouseRect(SDL_Window *window, const SDL_Rect *rect); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMouseRect(SDL_Window *window, const SDL_Rect *rect); /** * Get the mouse confinement rectangle of a window. @@ -2182,9 +2524,13 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowMouseRect(SDL_Window *window, * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowMouseRect + * \sa SDL_GetWindowMouseGrab + * \sa SDL_SetWindowMouseGrab */ extern SDL_DECLSPEC const SDL_Rect * SDLCALL SDL_GetWindowMouseRect(SDL_Window *window); @@ -2194,18 +2540,20 @@ extern SDL_DECLSPEC const SDL_Rect * SDLCALL SDL_GetWindowMouseRect(SDL_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. + * This function also returns false 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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowOpacity */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowOpacity(SDL_Window *window, float opacity); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowOpacity(SDL_Window *window, float opacity); /** * Get the opacity of a window. @@ -2217,43 +2565,81 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowOpacity(SDL_Window *window, fl * \returns the opacity, (0.0f - transparent, 1.0f - opaque), or -1.0f on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowOpacity */ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowOpacity(SDL_Window *window); /** - * Set the window as a modal to a parent window. + * Set the window as a child of a parent window. * - * If the window is already modal to an existing window, it will be reparented - * to the new owner. Setting the parent window to null unparents the modal - * window and removes modal status. + * If the window is already the child of an existing window, it will be + * reparented to the new owner. Setting the parent window to NULL unparents + * the window and removes child window status. * - * Setting a window as modal to a parent that is a descendent of the modal - * window results in undefined behavior. + * If a parent window is hidden or destroyed, the operation will be + * recursively applied to child windows. Child windows hidden with the parent + * that did not have their hidden status explicitly set will be restored when + * the parent is shown. * - * \param modal_window the window that should be set modal. - * \param parent_window the parent window for the modal window. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * Attempting to set the parent of a window that is currently in the modal + * state will fail. Use SDL_SetWindowModal() to cancel the modal status before + * attempting to change the parent. * - * \since This function is available since SDL 3.0.0. + * Popup windows cannot change parents and attempts to do so will fail. + * + * Setting a parent window that is currently the sibling or descendent of the + * child window results in undefined behavior. + * + * \param window the window that should become the child of a parent. + * \param parent the new parent window for the child window. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetWindowModal */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowModalFor(SDL_Window *modal_window, SDL_Window *parent_window); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowParent(SDL_Window *window, SDL_Window *parent); + +/** + * Toggle the state of the window as modal. + * + * To enable modal status on a window, the window must currently be the child + * window of a parent, or toggling modal status on will fail. + * + * \param window the window on which to set the modal state. + * \param modal true to toggle modal status on, false to toggle it off. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetWindowParent + * \sa SDL_WINDOW_MODAL + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowModal(SDL_Window *window, bool modal); /** * Set whether the window may have input focus. * * \param window the window to set focusable state. - * \param focusable SDL_TRUE to allow input focus, SDL_FALSE to not allow - * input focus. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \param focusable true to allow input focus, false to not allow input focus. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFocusable(SDL_Window *window, SDL_bool focusable); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFocusable(SDL_Window *window, bool focusable); /** @@ -2272,17 +2658,21 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowFocusable(SDL_Window *window, * the client area. * \param y the y coordinate of the menu, relative to the origin (top-left) of * the client area. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ShowWindowSystemMenu(SDL_Window *window, int x, int y); +extern SDL_DECLSPEC bool SDLCALL SDL_ShowWindowSystemMenu(SDL_Window *window, int x, int y); /** * Possible return values from the SDL_HitTest callback. * - * \since This enum is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This enum is available since SDL 3.2.0. * * \sa SDL_HitTest */ @@ -2335,7 +2725,7 @@ typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win, * Specifying NULL for a callback disables hit-testing. Hit-testing is * disabled by default. * - * Platforms that don't support this functionality will return SDL_FALSE + * Platforms that don't support this functionality will return false * unconditionally, even if you're attempting to disable hit-testing. * * Your callback may fire at any time, and its firing does not indicate any @@ -2349,58 +2739,72 @@ typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win, * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowHitTest(SDL_Window *window, SDL_HitTest callback, void *callback_data); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowHitTest(SDL_Window *window, SDL_HitTest callback, void *callback_data); /** * Set the shape of a transparent window. * * This sets the alpha channel of a transparent window and any fully * transparent areas are also transparent to mouse clicks. If you are using - * something besides the SDL render API, then you are responsible for setting - * the alpha channel of the window yourself. + * something besides the SDL render API, then you are responsible for drawing + * the alpha channel of the window to match the shape alpha channel to get + * consistent cross-platform results. * * The shape is copied inside this function, so you can free it afterwards. If * your shape surface changes, you should call SDL_SetWindowShape() again to - * update the window. + * update the window. This is an expensive operation, so should be done + * sparingly. * * The window must have been created with the SDL_WINDOW_TRANSPARENT flag. * * \param window the window. * \param shape the surface representing the shape of the window, or NULL to * remove any current shape. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetWindowShape(SDL_Window *window, SDL_Surface *shape); +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowShape(SDL_Window *window, SDL_Surface *shape); /** * Request a window to demand attention from the user. * * \param window the window to be flashed. * \param operation the operation to perform. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_FlashWindow(SDL_Window *window, SDL_FlashOperation operation); +extern SDL_DECLSPEC bool SDLCALL SDL_FlashWindow(SDL_Window *window, SDL_FlashOperation operation); /** * Destroy a window. * - * Any popups or modal windows owned by the window will be recursively - * destroyed as well. + * Any child windows owned by the window will be recursively destroyed as + * well. + * + * Note that on some platforms, the visible window may not actually be removed + * from the screen until the SDL event loop is pumped again, even though the + * SDL_Window is no longer valid after this call. * * \param window the window to destroy. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePopupWindow * \sa SDL_CreateWindow @@ -2416,28 +2820,31 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_Window *window); * * 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. + * \returns true if the screensaver is enabled, false if it is disabled. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DisableScreenSaver * \sa SDL_EnableScreenSaver */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ScreenSaverEnabled(void); +extern SDL_DECLSPEC bool SDLCALL SDL_ScreenSaverEnabled(void); /** * Allow the screen to be blanked by a screen saver. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_DisableScreenSaver * \sa SDL_ScreenSaverEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnableScreenSaver(void); +extern SDL_DECLSPEC bool SDLCALL SDL_EnableScreenSaver(void); /** * Prevent the screen from being blanked by a screen saver. @@ -2448,15 +2855,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EnableScreenSaver(void); * The screensaver is disabled by default, but this may by changed by * SDL_HINT_VIDEO_ALLOW_SCREENSAVER. * - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_EnableScreenSaver * \sa SDL_ScreenSaverEnabled */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DisableScreenSaver(void); +extern SDL_DECLSPEC bool SDLCALL SDL_DisableScreenSaver(void); /** @@ -2476,15 +2885,17 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_DisableScreenSaver(void); * * \param path the platform dependent OpenGL library name, or NULL to open the * default OpenGL library. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetProcAddress * \sa SDL_GL_UnloadLibrary */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_LoadLibrary(const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_LoadLibrary(const char *path); /** * Get an OpenGL function by name. @@ -2531,7 +2942,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_LoadLibrary(const char *path); * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_ExtensionSupported * \sa SDL_GL_LoadLibrary @@ -2550,7 +2963,9 @@ extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_GL_GetProcAddress(const char * \returns a pointer to the named EGL function. The returned pointer should * be cast to the appropriate function signature. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_EGL_GetCurrentDisplay */ @@ -2559,7 +2974,9 @@ extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_EGL_GetProcAddress(const cha /** * Unload the OpenGL library previously loaded by SDL_GL_LoadLibrary(). * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_LoadLibrary */ @@ -2580,16 +2997,20 @@ extern SDL_DECLSPEC void SDLCALL SDL_GL_UnloadLibrary(void); * 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. + * \returns true if the extension is supported, false otherwise. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char *extension); +extern SDL_DECLSPEC 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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetAttribute * \sa SDL_GL_SetAttribute @@ -2604,34 +3025,38 @@ extern SDL_DECLSPEC void SDLCALL SDL_GL_ResetAttributes(void); * 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 + * \param attr an SDL_GLAttr enum value specifying the OpenGL attribute to * set. * \param value the desired value for the attribute. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetAttribute * \sa SDL_GL_ResetAttributes */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); +extern SDL_DECLSPEC bool 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 + * \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 SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_ResetAttributes * \sa SDL_GL_SetAttribute */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *value); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_GetAttribute(SDL_GLAttr attr, int *value); /** * Create an OpenGL context for an OpenGL window, and make it current. @@ -2648,7 +3073,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *v * \returns the OpenGL context associated with `window` or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_DestroyContext * \sa SDL_GL_MakeCurrent @@ -2662,14 +3089,16 @@ extern SDL_DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_Window *windo * * \param window the window to associate with the context. * \param context the OpenGL context to associate with the window. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_CreateContext */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_MakeCurrent(SDL_Window *window, SDL_GLContext context); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_MakeCurrent(SDL_Window *window, SDL_GLContext context); /** * Get the currently active OpenGL window. @@ -2677,7 +3106,9 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_MakeCurrent(SDL_Window *window, SDL_ * \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 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GL_GetCurrentWindow(void); @@ -2687,7 +3118,9 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GL_GetCurrentWindow(void); * \returns the currently active OpenGL context or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_MakeCurrent */ @@ -2699,7 +3132,9 @@ extern SDL_DECLSPEC SDL_GLContext SDLCALL SDL_GL_GetCurrentContext(void); * \returns the currently active EGL display or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_EGLDisplay SDLCALL SDL_EGL_GetCurrentDisplay(void); @@ -2709,7 +3144,9 @@ extern SDL_DECLSPEC SDL_EGLDisplay SDLCALL SDL_EGL_GetCurrentDisplay(void); * \returns the currently active EGL config or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_EGLConfig SDLCALL SDL_EGL_GetCurrentConfig(void); @@ -2720,7 +3157,9 @@ extern SDL_DECLSPEC SDL_EGLConfig SDLCALL SDL_EGL_GetCurrentConfig(void); * \returns the EGLSurface pointer associated with the window, or NULL on * failure. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_EGLSurface SDLCALL SDL_EGL_GetWindowSurface(SDL_Window *window); @@ -2728,27 +3167,25 @@ extern SDL_DECLSPEC SDL_EGLSurface SDLCALL SDL_EGL_GetWindowSurface(SDL_Window * * Sets the callbacks for defining custom EGLAttrib arrays for EGL * initialization. * - * Each callback should return a pointer to an EGL attribute array terminated - * with EGL_NONE. Callbacks may return NULL pointers to signal an error, which - * will cause the SDL_CreateWindow process to fail gracefully. - * - * The arrays returned by each callback will be appended to the existing - * attribute arrays defined by SDL. + * Callbacks that aren't needed can be set to NULL. * * NOTE: These callback pointers will be reset after SDL_GL_ResetAttributes. * * \param platformAttribCallback callback for attributes to pass to - * eglGetPlatformDisplay. + * eglGetPlatformDisplay. May be NULL. * \param surfaceAttribCallback callback for attributes to pass to - * eglCreateSurface. + * eglCreateSurface. May be NULL. * \param contextAttribCallback callback for attributes to pass to - * eglCreateContext. + * eglCreateContext. May be NULL. + * \param userdata a pointer that is passed to the callbacks. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EGL_SetAttributeCallbacks(SDL_EGLAttribArrayCallback platformAttribCallback, - SDL_EGLIntArrayCallback surfaceAttribCallback, - SDL_EGLIntArrayCallback contextAttribCallback); + SDL_EGLIntArrayCallback surfaceAttribCallback, + SDL_EGLIntArrayCallback contextAttribCallback, void *userdata); /** * Set the swap interval for the current OpenGL context. @@ -2758,7 +3195,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_EGL_SetAttributeCallbacks(SDL_EGLAttribArra * 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 SDL_FALSE. In such a case, you should + * this function will fail and return false. In such a case, you should * probably retry the call with 1 for the interval. * * Adaptive vsync is implemented for some glX drivers with @@ -2770,14 +3207,16 @@ extern SDL_DECLSPEC void SDLCALL SDL_EGL_SetAttributeCallbacks(SDL_EGLAttribArra * * \param interval 0 for immediate updates, 1 for updates synchronized with * the vertical retrace, -1 for adaptive vsync. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetSwapInterval */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_SetSwapInterval(int interval); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_SetSwapInterval(int interval); /** * Get the swap interval for the current OpenGL context. @@ -2789,14 +3228,16 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_SetSwapInterval(int interval); * 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. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_SetSwapInterval */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_GetSwapInterval(int *interval); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_GetSwapInterval(int *interval); /** * Update a window with OpenGL rendering. @@ -2809,25 +3250,29 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_GetSwapInterval(int *interval); * extra. * * \param window the window to change. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_SwapWindow(SDL_Window *window); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_SwapWindow(SDL_Window *window); /** * Delete an OpenGL context. * * \param context the OpenGL context to be deleted. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_CreateContext */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GL_DestroyContext(SDL_GLContext context); +extern SDL_DECLSPEC bool SDLCALL SDL_GL_DestroyContext(SDL_GLContext context); /* @} *//* OpenGL support functions */ diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_vulkan.h b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_vulkan.h index c31d33c..5a48756 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_vulkan.h +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_vulkan.h @@ -23,11 +23,25 @@ * # CategoryVulkan * * Functions for creating Vulkan surfaces on SDL windows. + * + * For the most part, Vulkan operates independent of SDL, but it benefits from + * a little support during setup. + * + * Use SDL_Vulkan_GetInstanceExtensions() to get platform-specific bits for + * creating a VkInstance, then SDL_Vulkan_GetVkGetInstanceProcAddr() to get + * the appropriate function for querying Vulkan entry points. Then + * SDL_Vulkan_CreateSurface() will get you the final pieces you need to + * prepare for rendering into an SDL_Window with Vulkan. + * + * Unlike OpenGL, most of the details of "context" creation and window buffer + * swapping are handled by the Vulkan API directly, so SDL doesn't provide + * Vulkan equivalents of SDL_GL_SwapWindow(), etc; they aren't necessary. */ #ifndef SDL_vulkan_h_ #define SDL_vulkan_h_ +#include #include #include @@ -55,6 +69,10 @@ VK_DEFINE_HANDLE(VkPhysicalDevice) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) struct VkAllocationCallbacks; +/* Make sure to undef to avoid issues in case of later vulkan include */ +#undef VK_DEFINE_HANDLE +#undef VK_DEFINE_NON_DISPATCHABLE_HANDLE + #endif /* !NO_SDL_VULKAN_TYPEDEFS */ /** @@ -69,6 +87,13 @@ struct VkAllocationCallbacks; * creating any Vulkan windows. If no Vulkan loader library is loaded, the * default library will be loaded upon creation of the first Vulkan window. * + * SDL keeps a counter of how many times this function has been successfully + * called, so it is safe to call this function multiple times, so long as it + * is eventually paired with an equivalent number of calls to + * SDL_Vulkan_UnloadLibrary. The `path` argument is ignored unless there is no + * library currently loaded, and and the library isn't actually unloaded until + * there have been an equivalent number of calls to SDL_Vulkan_UnloadLibrary. + * * 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 @@ -95,15 +120,17 @@ struct VkAllocationCallbacks; * library version. * * \param path the platform dependent Vulkan loader library name or NULL. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetVkGetInstanceProcAddr * \sa SDL_Vulkan_UnloadLibrary */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Vulkan_LoadLibrary(const char *path); +extern SDL_DECLSPEC bool SDLCALL SDL_Vulkan_LoadLibrary(const char *path); /** * Get the address of the `vkGetInstanceProcAddr` function. @@ -122,14 +149,27 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Vulkan_LoadLibrary(const char *path); * \returns the function pointer for `vkGetInstanceProcAddr` or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_Vulkan_GetVkGetInstanceProcAddr(void); /** * Unload the Vulkan library previously loaded by SDL_Vulkan_LoadLibrary(). * - * \since This function is available since SDL 3.0.0. + * SDL keeps a counter of how many times this function has been called, so it + * is safe to call this function multiple times, so long as it is paired with + * an equivalent number of calls to SDL_Vulkan_LoadLibrary. The library isn't + * actually unloaded until there have been an equivalent number of calls to + * SDL_Vulkan_UnloadLibrary. + * + * Once the library has actually been unloaded, if any Vulkan instances + * remain, they will likely crash the program. Clean up any existing Vulkan + * resources, and destroy appropriate windows, renderers and GPU devices + * before calling this function. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_LoadLibrary */ @@ -153,7 +193,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_Vulkan_UnloadLibrary(void); * \returns an array of extension name strings on success, NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_CreateSurface */ @@ -175,15 +215,15 @@ extern SDL_DECLSPEC char const * const * SDLCALL SDL_Vulkan_GetInstanceExtension * allocator that creates the surface. Can be NULL. * \param surface a pointer to a VkSurfaceKHR handle to output the newly * created surface. - * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() - * for more information. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetInstanceExtensions * \sa SDL_Vulkan_DestroySurface */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Vulkan_CreateSurface(SDL_Window *window, +extern SDL_DECLSPEC bool SDLCALL SDL_Vulkan_CreateSurface(SDL_Window *window, VkInstance instance, const struct VkAllocationCallbacks *allocator, VkSurfaceKHR* surface); @@ -206,7 +246,7 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Vulkan_CreateSurface(SDL_Window *window * \param allocator a VkAllocationCallbacks struct, which lets the app set the * allocator that destroys the surface. Can be NULL. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetInstanceExtensions * \sa SDL_Vulkan_CreateSurface @@ -226,14 +266,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_Vulkan_DestroySurface(VkInstance instance, * \param physicalDevice a valid Vulkan physical device handle. * \param queueFamilyIndex a valid queue family index for the given physical * device. - * \returns SDL_TRUE if supported, SDL_FALSE if unsupported or an error - * occurred. + * \returns true if supported, false if unsupported or an error occurred. * - * \since This function is available since SDL 3.0.0. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetInstanceExtensions */ -extern SDL_DECLSPEC SDL_bool SDLCALL SDL_Vulkan_GetPresentationSupport(VkInstance instance, +extern SDL_DECLSPEC bool SDLCALL SDL_Vulkan_GetPresentationSupport(VkInstance instance, VkPhysicalDevice physicalDevice, Uint32 queueFamilyIndex); diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/INSTALL.md b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/INSTALL.md new file mode 100644 index 0000000..97e4ab6 --- /dev/null +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/INSTALL.md @@ -0,0 +1,41 @@ + +# Using this package + +This package contains SDL built for Xcode. + +To use this package in Xcode, drag `SDL3.framework` into your project. + +# Documentation + +An API reference, tutorials, and additional documentation is available at: + +https://wiki.libsdl.org/SDL3 + +# Example code + +There are simple example programs available at: + +https://examples.libsdl.org/SDL3 + +# Discussions + +## Discord + +You can join the official Discord server at: + +https://discord.com/invite/BwpFGBWsv8 + +## Forums/mailing lists + +You can join SDL development discussions at: + +https://discourse.libsdl.org/ + +Once you sign up, you can use the forum through the website or as a mailing list from your email client. + +## Announcement list + +You can sign up for the low traffic announcement list at: + +https://www.libsdl.org/mailing-list.php + diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Info.plist b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/Info.plist index 2948e7ef8488ce6d73d8f72b0ebaaf21bc7ead17..6f47d9811426864aa6000dbc2650f270b0235da8 100644 GIT binary patch delta 146 zcmX@Xc8G1mEk^b*BV!L^L&M3B8RM9Z^b97uFxfeU8X3Boo5u_AXBK4S=cN{B=9cCp zmgE%D*6C0BRlMItNlMRy- jlRJ|qQ#4ZpQybF^rnyX;nRYPkXF9@kY_bNkJmU!f;$167 delta 178 zcmX@ac7kogEk@1=BNHc617p+F$qyOhm<{!eCOa|NxkVTm0Y#0Bli~&VGYc~E^HPg5 zb4zm)OY)0C3@!8w;{}A#gh8SqhGvEa5r$?!tpP`4OpFkkK^ICxDW-D(P46s= diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/License.txt b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/License.txt index 42f3736..23abb73 100644 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/License.txt +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/License.txt @@ -1,6 +1,4 @@ - -Simple DirectMedia Layer -Copyright (C) 1997-2024 Sam Lantinga +Copyright (C) 1997-2025 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 @@ -17,3 +15,4 @@ freely, subject to the following restrictions: 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/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/README.md b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/README.md new file mode 100644 index 0000000..68b0923 --- /dev/null +++ b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/README.md @@ -0,0 +1,17 @@ + +Simple DirectMedia Layer (SDL for short) is a cross-platform library +designed to make it easy to write multi-media software, such as games +and emulators. + +You can find the latest release and additional information at: +https://www.libsdl.org/ + +Installation instructions and a quick introduction is available in +[INSTALL.md](INSTALL.md) + +This library is distributed under the terms of the zlib license, +available in [LICENSE.txt](LICENSE.txt). + +Enjoy! + +Sam Lantinga (slouken@libsdl.org) diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/ReadMe.txt b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/ReadMe.txt deleted file mode 100644 index 6ea9347..0000000 --- a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/ReadMe.txt +++ /dev/null @@ -1,44 +0,0 @@ -The Simple DirectMedia Layer (SDL for short) is a cross-platform -library designed to make it easy to write multi-media software, -such as games and emulators. - -The Simple DirectMedia Layer library source code is available from: -http://www.libsdl.org/ - -This library is distributed under the terms of the zlib license: -http://zlib.net/zlib_license.html - - -This packages contains the SDL framework for macOS. -Conforming with Apple guidelines, this framework -contains both the SDL runtime component and development header files. - - -To Install: -Copy "SDL3.xcframework" and "share" to /Library/Frameworks - -You may alternatively install it in /Library/Frameworks -if your access privileges are not high enough. - - -Use in CMake projects: -SDL3.xcframework can be used in CMake projects using the following pattern: -```cmake -find_package(SDL3 REQUIRED COMPONENTS SDL3) -add_executable(my_game ${MY_SOURCES}) -target_link_libraries(my_game PRIVATE SDL3::SDL3) -``` -If SDL3.framework is installed in a non-standard location, -please refer to the following link for ways to configure CMake: -https://cmake.org/cmake/help/latest/command/find_package.html#config-mode-search-procedure - - -Additional References: - - - Screencast tutorials for getting started with OpenSceneGraph/macOS are - available at: - http://www.openscenegraph.org/projects/osg/wiki/Support/Tutorials/MacOSXTips - Though these are OpenSceneGraph centric, the same exact concepts apply to - SDL, thus the videos are recommended for everybody getting started with - developing on macOS. (You can skim over the PlugIns stuff since SDL - doesn't have any PlugIns to worry about.) diff --git a/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/SDL3 b/Frameworks/SDL3.xcframework/ios-arm64_x86_64-simulator/SDL3.framework/SDL3 index 7b3915c64b24671b403af383ddd1c4db1709b941..73f45aacdcc5164c0fc5730027ada86367bb9d00 100755 GIT binary patch literal 3566640 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
    y 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
    kyOBm0Y@ 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�iIz`}K9>w5N)w?3bgnM}+rohcHHF#b< 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 z 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

    b0;3gN!k*b(eVI#19+kNf(55#G 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

    &wE=bbV>;gnyk>U&_!&^P;zO zO8XOXg#rH4{Rw#)_Gt=*KZie|O+OOBg32D=BPC|qr@0WSI22Op%Aw#)ITXY`%?+J~ zeVX@=`xElo+pDMHPsp@a%XjCc?bTfMU^x`*&TI*ay_y^PYUTH?Z@YH`x82)$H&<=KD+)I z;{)mbgZ>1Im~DRo#Qa(QgpI-$0om#M6J)~cbNUnVKEt1oZI74lkt*8TWm*1^+I`NB z+P^!q{rD3y+plopALHL0`xDCTAy-#`Gu;ACwm)HF+Mi%#+KXBKghC*9Qh$Qw>`6Hk zeuqOLFH~n+0*QsTn$gQf__ThLVm84&qHle`icX*m?0!#2nZ zEl<_`dS-u43g46a6Fx76)!N`bU4Mc_Uv2g{@)B>|Df|g}q4xfSYWLj1X$_6)Sqy+W&g+|h~-dt8!4X`)aZgZ6!Jui-jz5f%b%bU z|J(fupiSET&28sT5L|9=|E5syRQ9hmzasz;e}XIr?bx5t_U0e-C#38}G3S*-VWTh& z%b$bipp$?<+n1Vzc#1zkV2QL#!?L|Uq3z8-!=GT2Ps*Pl zX2ogy6K2{R^F)*F6#fL6I}jVn_9t|={Ry@E7|@hMVI5Ft=THy~RR;ds84iV&nI@a% zP_X@dX?rb@VXyUUv(NR~J*TR#cE7N)6YGONiPy%Cmv>tJ&QtTJ_Wpzi=usK|ga=OM zPxyAqpP&rnq zJ_CQn0dQ*kO*sHoXJW7Ia7gjDH2z-uS@_#weOdUMuFoFYw0v#vtru@&hQGlflb|}2 zpty5g|&5q#XqMiOM)x2}; z=KVyj4Ev9{swqrsxxp80er!2>ubcmS8rhDWyk*Aaf6YHpR?B*TGg z8$8byPGK)`S`rru>&0ph_8_ho!M{UX@_Ve{fZUWUUCgl=)>F z-hy=}w6D!fzSTyT5@}mj|Jvb?-9Cjs9W-y9Y96*C_){g#`;i*BjPXCIy>>eMr6Y4V z6oOkmAaQ8vd7^8IO9W5H{v8HLPGSFwJ(X$yI{sPqZ!VY;-hJxYl{M66|2jU8{oBs= z751GmpZ+;1;&(PheA#A4L>FsE5rZdB?d*(v2^TcC7X2Xo=o z^eQF9B&M(cVZAM5S1B2LEFp)9w$0x;R@n35&+$5?Hm2=YXNLXiNZYSkNA{~q?8tuo zj@^zib~{E`?MS)rPBtHYKG`hThb~sod@u0>#g5weC9*d)Cm^V1%_T@XLfu8?ySD`2 zWwx>{zs%FyFP14~Ad$Tu#g=)T=f~Wuj9sWt1`4Nbt?@E9?NovD}b9YyMlN#%(n@rO(wu=V^P@k+xTz0`3#+Rh8P_Ud=YLPC5V0wC~>m z-@1KLZ>YPVeTVS1UwmHpB9hWz%z|&`i%j^Ql%7tsw@#cN&sJJ9t%1*)9WMuJGPE(d z!dZ53g|oEHj(0r&cv5?o0ne~!9qsH{Q6o;YFEcHI&uh<~s=nI&q86N3AE5rc_Ux%R zR(osqLHaWbnT<-xLLEpv&HvN#`{eel63c4B8hh3PUz@7lE9YPYjh;PYhy^oJ2zZLL3jn9%*zUed}o=aXeIhcv>8Sjsl zb?{!kEs{*JmAr=iJWf=Gd5-k@ptkofbof4_{Kr-K0+ft@@?OPql>Lze032c;=0(U9 zJ>JaODZ!$-xuI@zi$Z-lh$Jpbpj-+1NU)bP7ZngJBAWlBTL?GDInb%+`*`+8%W4S* z!aKg0Sc3%BM zZCd-0w29MWXv8pSP#@JGt@1_cnVYLs$)Xeeb<~&~8dfEpPgA{wWMY|AiBtU+t%7k ztk&LO<(WdB(*&DOwMwdDPcKKWTLf^2)w;f_b*tHrB&~a%0DmCgrL^v=`WqIag-SrO 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 z zC=ICEs|Yu#!fkwX!y`tW>7-6U?jDeJtljDR(P1p{+qdxcS1Z?5n23 zrS!My^ia(mn{Xgfx2;t?su`9wx;uji)m+i{X4U9b^saL?xA(pBcEHnX?>$~uI!D%5 z?J_Y4UW=PIkfPpfag&8!(WV$msQG}Dqx{T357pKO7DqOj&T>`sJ;kotWAa*Tiz&n> zO3;9(NcAewOWD~8bW>EiQ2C_q)XNGc0(HGR`6VmGF zt+Ukd6ok@KSQ4B*iqKQh_gWVp(nu$2Hz=i$rW8;}qUA_i!48Yu5Yn}ZB({T4x5Q}a zrkM1(3i{GCXs0ELq&6V}RL@}#$Oqn5t;$ zY-%Y|jU;k{Qɿ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

    PI^wO#-+<=Z=n{r!t` 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

    %#T{m|()#D#D z{9?q<9>(3dpKREzvrk8q=QQ2z8}Q=J zDNSm2Zs6ucG&<hwyRO~M6C*O$2ZitToVV@Ds0HE6KYpwp|NBQ@ zjaW4_jp8@|7$fa8jF=|-fBI?pjxQT7*%>x}PCfpRUn3*j4EwlxVZ3qN*jVm*HB4c}R0W_A-O4{i-#l>N8$s*-JTbBhk|I$%g}_#bc1 zMiQ@L>V{XwjvxIu$l=MI^!b`yd#87h!;`zmri*qzXlm{uKX}~dG7rgrc)(-3d@`Nn z@Z>HF(nKn<$-bNX_D>zP%P>duS{%9S!#8fo?}+42&AaZ9?_@CV#6F1K1d40?1Y7;*muuR}D=LJ}C7Yu?S!{EUok zud%Y{*tYMO!g7v4=G{mPU^7G~|GOKxZ=p01WYcW($&Prixy@rEJp*C~|LSdjALg`3 zVxssId1O<%72_Emj;&IjOjwwW5*9WE|H2rTZoFvJ<8KKmA)YR2DU2>mm(?XCi&3j> zp*>x2kkrMK0X*@H17zVf;c1A&#U;Xp{sckBg*=!D`Pt@Xl8oTyS*BY`-o)&Y-53{F zI>ivdh#^LuI>crhLqw)ycv#33<9H^5*Bi;LQ}g-|*byO!00Klf$c>+FMo(9gRTpZK zLg|ymBL#RS$s`9`BV8bW;>3x($haVah>#E_A}y_3T3Q4Xp2qWhS~#N*OG`@&(=$_g zG!>inm}0ZlZnA$~+9W1K4i>_QlzbPF8E-@~k)DxhVPaU?NX8At(<5yPlQM3~lu;=u zOv=dYiFvSfVJRsoVLDl!8u3AVNEflA?51#Hh{m-ec#4ue@;uN7A-*~vQ(&YH%ipMy)baQc$=>1VJN(Tj_iiP}7p~{K^kh26j z(u4Qh+@)0n)6vC6^Kji*s`a*=oX;eFWR zV<0^ZiQAVFvh&)H-|?^~f^dW1pR(cORhP}E>uP$R8mf6yQZNs-*}5<^0k}~vvYjH6 zQ>Yo?g@-Vc(ELI|@@%yMay3kZT2!Na?Y2u3n>)g8H16 zjZc9`pfd>R5YZ(BD@)Jtv~W+P$7YA8*=#vIDczWTaFRb0rbE@m`Qb417hzrqhw?%D z%(2_(b7XgjTu(%qPCc3%RcESSVu(IO&*Kmf)$_@eKG~kUFFa{d+Hc6e&5d-*bfi_b z8RoX}cF1iMyvU;`)FHgw4iH|p5k76QI-K$+yEXQ9ptIZEQgo<7SSsx4im6Lo&0nr*`_Cs~OA)}V~t@nc63W&o=zlKDFQEY`~lVNLD3XSGl#7AvJq0uwZsLk|*4?PoK94Jj;lTiW0 zueg0>YJD0_Z?$#!NIvmJ)}c|nL`wij7R5)jo{&Z3iVr~H6t_2?$&j1!j2=oh|;r6pq|92cYy(c;Y8F zl|RuaO(YMK9N7@RAD$@9lrG{YcPl%M{9EIhWRZUu(n!ygelis97ARE5qVP-kZvs#m zQaN=42f3+?$e+^sFhJ?2a_NegDBUdpqLZ7_O?89PJOE)Ry#_$3FAB}uPNRG!Aa#^J zAHV>RALWtc&O;pJ=L?V=;-R!qK3f8mR!R${mE6Qf{*-TjfYM5Np|nvvZ2+PZKa~@? zp-sauN-3!|z8P65nFXmPL-=S@esX3ax{1t;5#5|?>3JEWQy-z9!1Qj;&INfHStAWu z$)inqImsy|gB+@hvvXd4Zb3@EAu%}Ed7`rcM*d_*==e}W;%H-+Iuy8r>bQg94({Uo zOl=g@3mFr$3-aqlWEhs4Mlq_SLC!eenPpDyJW@18iUPgXKb{6<@ z?2q-BY&;oR`GYbhm}DkAC+5LHY`;rGMpoS<1S1K-oe(NHKR-8PL_xmE-1C0`e zY*QPpT+m7w`>V<|l25b*fMij8M58f<`Vk+1!YOWVJd+_eJzD)C_M3# zo647H${0g^Eg8j4;}ByXC%y5+1C#~|Pi}f2M5FkrZ>G2uf2FS`+8>QUlvWxmDg8>n zP3fj_ljzisQ@Uxqp)@Pw35_>IBcsr$J`j!MDq{?dE6RL^@<{no#ux*hNe=PQ7~&1v z2dFz9lG^|%;|Yx+RQG5+p)w%%|HOC_)Uj?K{MU{r?a}A{E91$Z87L_3I|mBtxNXBC zjbJ?LdyE$}@1gmQ()Z)>!MK4kP{s`!SE!8Yx~aU#P5tMCapk{vT%mEN zHQo`8LCUyBZhD_YQ^q-ZpEMpQ>$`S%rgux>CHpgl|Nmi}QpVD@$S;)(jd@fC0RWA^ zR5l7vpq)MgJXAi902GesH1<(B6HOWWYS&4B&HCx@8t-Uz6G|h8V?eZxNOi`ndoQs5 za|5D7yqvzEdP8RL|D_?57H#qyun(o7L54?YEXP2Mo1zWk@@GwQ;j^9 z)*Vk9APyR3>FdZur}-_78APWsf(*HdM{)nNV+Qp@P6$tZmNI`PH_0Fx`O`X+`Y^?x z+$57|_v^QmIV(!TG6&hagdUonQdF%|Dm!W6hVTh zx;vUSSG`xLcs^Q5_^cs?$^l$qme#?v7F5>3#7}ENii_yPPj1R1(UdhStrr>lnw8diJ`ykQs*DNb5*6A#gq^(U<*iB3kLDY{dVtI%j2tE}ObbtJvzY(hn&84bhc;fM|950XSvz-`pSEWqhwU-~C_PAKbSia5Vq> zO*53&$LJ?j^L26lSKJg;2i}-W)WtW?)c@x#)c>cyRjsLu^FJZJI`GCMv@X7xSpT25 zQ~iIpZ{KF>0{8JU^?0D{vq=1okbXH@yvq66gesxgmW8=UtrpL9={|5d# zsP(aN+4n9?sbkZ#1Ga*`F$MDn02i$~&M(~i;DRlT?H3!=IYAgKh@xJUq$eb+^%2^=vH<$8u_6sGt+QL@)hA`atO^=}qfL4u6j2S&cAE zP^&a5o!&$Lh?FQTvn;o)u%3~5)SQN6gaqMXv4z+|@2>ZkhD&c-KXrr`aDIRl1_+Fb zRXwb4qHiNTDlN6VVOecGFZ19~4#x=t1y8ZL*j(RO-&T4|ddvEWBfOf`u)Ht`Y`n@- zuhqBmKEk(?9+%23ODwCb=iHsShMbG=gwRxMCi+Q(r8lhaIl@u_IML|^;YqJk2e&o^tRwaSb?E;VHpGd`N8P{W;T08Y;bI$>f$;Ps%*bY(v&fNEBREZmPE4 zqnOsxFlm(~nJc%Rko{dbH_k~IE;JF{MT3+eSuIa+7VC$O_+4;zqJi+J;G}Ax@|Ffj zD=leUh4q74f36YdEIcM?#m1tKG*DV@ec$0n>33z_*oMO6g0rfj%2ygBt+2dlS!O-$ z;Az6Sa~?vd;3~R_ZhDP=yY(xFABES_$qk{s;Gud*<*HZfH(54Ywpp(_c(hz&uBi|v zxQLC!MtYTgtMyBVABAtiy0guM4nk8^GnI>8&^WI?DXxU=DBJ(xnnsHjeC^(A^ z#fExbzuq#)y4(7VBMuLo8)+;A30hTSm9w7Hud^)Xc3H32`g0F)O@v^}6YHd5zm)z2@+Lm}|l5gm6JEYQ*){i|(FuN=4`@ z=u}>+U6$RJb=J=uyp$h&pO+JbZh|1H#I@E7?hmsq@R8yOIQ6O>mYtS0*6MovBB$p( zg^mIz^5SOe7w$TofoU#u5+$P2FYaNXv%rX~xY7E#yU6O<7D5-{ zVO0y&7Ry%42J5AI{63s7=O@Gp-NXnnLf=8}B85xSD@rS7Ter)62G*NxDRdY7R4rBA z^kMo&QdeoZrPMOZy3OX#y~ef@dI;fSSFx+Uz1~&oCY4l7tC(rsD*OAezHDour_f5( zS{1Gj)w@X%Qi)}nWrlT&?B9xO%^8G9p|jXU?1G((PEto{YDICybJpFmzaP%~cneX2 zLFKLLtPj>VkUB|IEyb3()?GG#t|jLqL<=3oPGTp0kltD9ESW2cDxS6Ow8hW1W_^Vi z!AIq*>ZmvB8%kXyv!%!~$GSuIZ_BmgBq3f16FZ246e`WFc&?(@x?c99_vKHgjfB2} zqzX`}r1sKO>pF*@?9a8~0)>7;sMuaqOJUNSif1dHwV1df>snj zI!I>gntI^_xkosEAx;Puu_;nAO0z0vSIoA|v6Naj%X|{fI<*mc3I3`!Dpm@Trdv1F z3omg2Tw9^HU=)KyP70Q0RLrcHX5HxE31lB(+X;PywyJh2UJ8*)tQ#DDl>T5Ygln%d zsRG4E#7Fe4^*SkDT2S#)#Vgi#WWG>Uswz<5O7A80l@?fDvMjP5tryBtC&}@ z*m}&t6UKI6gH1+O{8dPVa3Z8FIo>cWOU^gv7J>Y8RD4uFKtIxZoSd%i+#D`im8(kg9_u|y%9MI@eYn1= zXH-MQVPb}Np?9kE3>UAOq)PW5FZ0K7y}16WDXPKZ5OI|EMDN~gAGV)rvg&E?3Em^6 zbg3WLpX;S6R1FjdiKD%r@lKMGrFfhdj8lzQWqMEYj_3MveN+=w3E}`T+k1-l2x*if zuaw??Y=5@5YJw`ud$Mvr6NiIUC8~I_uh>`LT|Zfh;C`_DXc@>3 zVuz}xtK#*s`YBQ*H$YXS>MiyW`{-lzgK?fn=cdySz@-BtshBKS%=BN$;(`vKFrdm=|8Z1Xc;Sv6Eelo;%L1|pNq56Is6zt zQ=h8O5yl8li=)I*`V@UW&T5XudBvyoBlNjKo{%nPh#C51{aAJ!o32mNpRk;?6tWZ8 zNy0NinmAG%&(<&#*-7kVVTzC{niTb(oQ7xE$?O!IUK}qJ3M0f6aSEHqOb{jtNn)~i z#`2M+h#kbesynA$CA}pr)_tOFWod1BO?O_qT6$ZW$`-S)>ps=`Sz21mLXoggcSgHH zdb3{rEx~!x>HI4GW!*>GR}iO<#n)2G&R`em&T3amR%tprn0rO{F{$ZfGm{<4%@Ljz z=Ic&tmr2W|SvY(7qV9cdpyd$@G0bM?urvA9{9NHVVS(-g?R@b?u|l#qWX@uTaWnY0 z_?L7aY9&j6PUS#TnN*d=>wK?mex)rHy4C`#k#sPJ_-DUKHkv&xt#vol+V5IQKlijt{eR zu)M$~ar5}K`~u-6VUGB$xXJH?-!5slwAt^ZU#O+Mp?*qRL(nd#`7vj|JB7Pe`4gNd*KJ@EmiIDS2VadFVe&jXbbz!=$w@@NZ6L|sQxA~p+TPLlzh39wh#kweA zyWjhM9W9+KZ{UROGGV!}Myn0jCGHmINY6UbM(HodiR87~#sNEZ|IqHzZ{?Tpm3)O@ z5!Pv&1nkn?*6t8@ipAa~-gBkr~T*r4?Y*rL0o z-6n1qx9i8~XGk+;{$)7tT)`jYH)73^~U0KZgtL)fHk8n8|G zi*}2+RotpytDhy!mMT~?w~XJ-CBLXdfj*R;#o$uuu6ALyIOo(d{tU3Ezz<8Z|T0)u4gx} zn}p56QY{y-T6bN$N_%OTM-$r&5yGB?mEYk`BD|A=1D@Cig zPb|VUznOiWTPLg+Dzxf=mAb3i72=!XBIy;$qSXXgbzf5UX-@rWcr)h1_8@;pKEssyM>in=YR^`W$iL?xwt@jNwR7i23T}o z$a1y_TZL6xmw<9zwRWlahFB)elXl=-`&-&Z0ZVijwA+O3!fLH+z*603+H!G;_`LLj z^tRS5;0@hH?H;C@IWK-Hrd5orpt2`Zi4*vHQD+Yb2ZgVt>r$F!q-8HI4nHS;BBoZD zD)uoKnM1;1A=P4%+r@t75_5n($nFu|70!wuiy!O9=|@zgIO02i^ZfhaUn%Sr&g#eN zM_5uUoonzN2fI0ln==mK1pXQEBk?2sNqtg9az&?_M;-o$m@k-p!hYe5{)GN3>6(;e zNw##X8D4Xkxx#!PekgXR8Rp=nD39RwfWvg6UpOvgS+Xr*HACz9A7!pG@32+uY4LqA zvto2b`htxJt*hPJ*7SD7 z@d5KA^C5eNeII?wDd9cguy{l~qR-PmV|~lLO--+wL)z8>hxNJoN!C^F{xxwmXR!1B zBlawNPWVJPC>|2?tZ%rtuIcHB?<3sua27WYOtwt1k{{tHQi;tkC|VYGyF$ zSuO6qH8GAjKY^C`JnlI-rVR)fYprnisfl*@k-YQFZRV`-v9L$16mLr3NrjdPmICW? zcki00n)B?Z>^c4uKHs{`F~`0nd@kG;YsCG2=l!arV^WWbo{qXt@m1qSiO+DW!U4Ze z{d!n>S}qG;2)~K{5D)rQ`yH3wm0~Np*W>?;y~tMc7x+Vd7yM!^-7VF^1>qO*SMgW< zGx|M#XZ;RKN2KVA7)O{(xUb?e?riu)KS^Kd_px8JC8pkZ^_g%{xF!B9{;V(5@AW(9 zcT{>uimZrogul#w!CvA&=Wpr9>-YJ6;umR&su%v6@U`%(`*-d?ia&`}ewY3BO9!NW z75yFIui&u2d-FZ^}k8{ud7Z{5Eae-MxRUGY089g^ZJ`Z~g2 zWxryt@L%$`+;6zQ>-VK!yrplw@K=N{g`47c;$gqf{PswdQtygBj<8g|*Kk+Ib=+5R z#P6bCZ%ZG`RpBe)AMQW6-w?kQkNREm+bivp;wpMM!dz#+VXyID^S`-&@BWV8=YDaP zUiIXC%YMgxFZ>`}7rznDNuNkVD~44JwG4Cce2ekKw$ z!r#Dr<(mF;{b0)w%TN3*{)X_aa8>+D{7OGje@6O98dx!?;(OdLa#cS;KhQGB5jTbZ ziQUcqfcer*;XC1q_@(%z{(}Cj^s$ssF+i5{BknQz9&P`MzFMDP8DRNM_=j*={6ah} zy)QjgkyvpHx0d{Zn>(JeB+Bvr%-`g13pK(e@pJJ5=|ky>iYF_6VSiZ-cYI$Zs2e_4A1dYO0ekIl$wLZ2O7K-B-XMQF$ zfm`{Pp;Oq(zloJdE!WFpA^c}R6S$RM2%W-Keg#%2wf?=>9b6W(Kul+X_)@u4UXn}2 zBA1H$ulZOzD`_SBB{83I;-||cvp_DH3b|x9A(zqoLF6);{{Znv^OyAp@cScj9L;mT zrpaHk!{5Z@l6z4ux#e=nvGB`qh$xZEZ@yf9%jELgpkIYD+pk}Z-%I*R-ktwmf1FAY z;nJ95x#V7uOYRN1~OLm@IvPloG5k>3 zj^xjtO8yHb^vo+Sf&bi6*vd10^Xuo{>Pna6?G zfb+m=;5x7pvX27WfU`h6WM=|T0F!`*kR1TD0J;Ji#Qg}+42S?)1O0)`z^A|=;2U5p zWG)7#18)J(LDsv#>%gbL+rT$~6*AuewgVpneIau+@FegI;0&1(@GuY#Fo@e9&;lI+ z0}uzS0nPw>fGfZW;1)0jvKInHzzSd?6R- zz(>HFz?Z;VNW(E;C-4c-2Wc1uJPu3*T#$x9KnHXKILK%VGyysTK0t3^9dH)d3tRcLckSiF#;kG3AjK;D4+vkfgQjlpbGdNcm}eT0nY*(fD*{q56lNn1IvI* zKsjXX0oDK~fF6*Q1`Gwp0+_}zzCdFj1n>r8fJTtf9`FLX13Q7wfn&fAz$D0g1DFG> z2c|*R0pLa8ePB88Ij{sWD}lAZNuVcWjs%7Q;{XP-d;l#F3>biDz!fsW01@Z`>;f(W z$AKS#DUewKJO^w7rbE_2U;*#}Pyt*9mO|!UU>$G@h=t5lU@(vm@Q~FKa0l80igAOC z4uBr$3G4>G0Nw?D0wzP|a$qj75h#VML%>VGhkyn60(b*5_W|pH_kiw@X#$1-1po(` zen1l-w2piy$S?w)KqRmQs0I!LH-JLOEC*%+YXCE3?E%Vw6F@mo4Xgof0LvhIKd=Ef z4Maos2w)(P3#cHwHSiG70cZdjK|pgL3fKx<0FD6P0^=d`bzlbYHc$i^mB2jUB(May z0IUVR1(rkR0bnEWJ`e+$DZn5g4-g=;72pAc0nU&S3_J`(1KWVlfTO@oU@GF=3p@{; z0+s@w0qcO9Km}wR1U3O50FjW91S9}CfCe(!0L_3-KtseC0<-{PfbGCV;2q#QU;^^E z1egV^1&SeKAMgV39`FWm5wJkkAz(A`ArJ*w$-n?$44{TAf1oMQ5hz)7yJjJ<3fK-D z1+DshK?q+3pfUdLB00N*Qw;6j= zfrfwvZ~|?W_%vlOrHmaVF4A;0BFRpoEi6LnsI-o z8TV&`!~g=|1h|+Ho=12M!Z$>CH{4BY#vQe0d~eu{?+t^eUUasP^{PR31`r+cejMn> z*p0cS{y(T6>iw&(ssE2*BALgSt2L);#$YdCAIyNisHu`az!Qn@M1NoNSDUr-m%nvmm*A&VU>1`N_fO)pE)0(m8p$u-=2H0e%OdULM-;IZ83Qyhe6u~YPT_%EikJB6@zn9ZXFSNW9FIL6cZ&zfcbM8gtWAh@ z5E&-1&NI_@aC|g+Lq@O@OI&OZ!xgvPzGSy4&1A0GEJy43-tI1=P0cVYPy+Oe>f7Co z=~0lGnU|7lGGz_L!F^`%qY2%?5EnHl&cOV(=uC~r)axr}1WS7754uau3s3OpqOIFT z4Ew~X(QbpjZ|op^ELVxQe~%u6m3^rsr@k55ec&J`V)NcVoRg9((ky7u`!&E!;i zfS!*hw6U7#m_6s)gMcQ=jBqjfnYF6J7)tl~Z$3m_5R*?aoC%-!QsF8|=~1$+M4haP*A0G7m#cj~UCE=E2cIFW0ihKKm1* z1{BS?Q2hBU!Mlfg05X$_cw0>HyG7|>%a~bCn(<~$;dsrYbUtr|W}Ihfm{Bu6y?CsX zW?|Z?zp$^%#udemgo)^iRYulv(@6MBHb0%3s+C5$Bi!y z)0R$%(~K=I&Ce+*Ri4w0a(J_0y z&M#?H6(#On;&pUMqv{J@rz*X!EYV$B(&%WB*Qq65XZLuWuk<==_B!gVt76MFg)2&P zZIL5FV`(8$ZY~W=FU={}=@Yk4gO2?%a7si$5 z<&@?cO2bZ2s>Ut6Yu?XYfN1fOx2~EMk+9=;Mzv5g!Krl2aAc5*ae{y8nDWwb$Rmov zsLAu!6p|p#GyWQExnC+GJ$oy4$YvEQo-OyI-r!lv9-p9<2tyqm$gm7%1_zzbDi`YBhxh%>;v{0L=0)*m4snFSWm5 zOQ28_>ikk{j3zgdBF`~U`PiJJt6fP1VxtmhytnLl&w$x}vBJq6v7wD-GSIoDDl-S2fCJ%hK`-efV&IJ3)+;w~p*I&I*?cNB-0@Lj5Ic#KWbOib5wNJrJubTF6Z zl$GWrX~v=-xTQk0op@k;xKgux+?kiT(S#ow%U;O}*=QrsIQo#JB_KYNzjvKETzi>eO_hoKW0^-x+(PZ5fZ|bQgv*w3}X3g>s#>MyHZFD1C%GWvdYEm^m> z$m`67X4kyEE_-|J_x8dYyyC4-Gc4}1Bc|&XzSI2TPF2Hq;O!%`6Ohih(s4N`y;9fD zwXQeh)P7@h{jSXQdz65`(Wx}QOw++wIw6Pp!2I!=akr-BpGo@-&158-qgvJ9RYp%ZGH+OaTg|O<%h8C^;iHFeQ6*PDZ9FFx8Zm zojW=&F*PGEc|@kEu2))eUVh@}o`Gq;AM7mo^K2Q^^kck3baw^vv*-qTRMMQi2 z8L0)h4QOmH#@DIDIJMl<*J;0TYNXcJDK=GmA~$(p1&rvQ?u>Cowfz<7{G;~ z9=wUZswM1(&bj{R12hwc=PX3M+lSWH>BPRNmvsl1G{PJKT@YA7jd@qC%hj?nD)0VVED{hea*-RUgz&O}d~z^iWlhA3NB+LLrnk ztqO7}N@aa-H#JsA9M&378)Eh(tZx+0R)q=CWk}o@gKfSL?5g!C!Af3^6h9`+FR8qn z@bmpC4>YGBw-bOSD9@vZ!zM#E4Lvi+0TTe|pp$tLX`?egNZTrM*Pq2xOTevK)EENO0@Ff*0}BE(LV}f+4)3tgfMn_& z0y47ma8wO-u zy|-p_+ixRxY+Pwyi`e7*tJfkqh?mO$eru7Ls33o8E#hHYi!5`jMF#$EEi$j}TBMC_ zEmDj!YO&Y878%Y*a&3KRmW@&O1}4Z$Fj>~!ZStN@%Zo6~Qahr_mxiq=&GnS0rRl{J z<7j4?&wLi?dV}$#nR}$}Du%Tpnz>(Q4Mf?a!(9IC65UxwJdb5fk$4pAm~xuDoKNffyOGYH+~yUp(9ICC(Qy3cwAz1;CiucJk}vypnF>ioUe zE% z;XXamvz1G1a=g>r25fM0oHOd-OasHThF`ExoV?z7fz~@ODC?bBSnn*0*QV2YM=;JY zFnK~!&I_U4=No@s71Nzt+eH0Y=nU-$bCeL>vG*dM-V1-5; z8JB`(l)ABytWDPTK)N5SqyCdboQ6H_gZ;7*zud(*~+jdos>TBb}#R9UhJG>cJZ8 z!5Ztod5u*=^|}5U>$KVBdIS3!%cFUd<>6RnohlD+65Z0J$Rj>KsA_4_vD{FE``@ze z$~9%BnsO8Kv9!V}@2+dCP$Db$E8uF@`z+8>Oj-F@xq&|i%gP*6N`A)JKVGO2e^z#4 zognr_n{BN~-u6`^T|-MwTyC38m)IgTskTL5t|>W{d~A2@+E$4fS!vlrhQ^!H@&{+< z3>g}mG1`_~b%UZvWg^Q%-(5#o}0KDgqsZ{*-!PNK5C~W05JX1|t@9g^&dZJa7|oO<=l5CNp)vCRtwk+{L%FxW^d)=9 zxq@jiIoa*%9_QdD3(IGpIdkpo6KBsKzIx{96IEyS9>3h9@zp)9{gPAGkIL)i+b-{o z7A?0FKfd?Wr6;Z(y>$81`ExxQ+^Akb3*=44&FiAEf$h`t zaM=K#xc)?Yci*F)t#GkT_UNpPoa}tGWdo^<24zqUHpH}RXBZqE6@^+FfL4&47m$~d zony-LuU(jtlBTX-0Gf?|@b9Qf<-U{K-bnHi9~(RLVHE}+=baM8-^bfDsx*o zeXu^dTs35P&}lAU)!tc^P1B1W8tSq+vf*26yyK=d;@ehpQl@9FceAAAn1qHcN*-S` ztDFElCogH1%D&>#BV>T#a4Y`i6CO?@NHL(T-hE_G zyiQd-$I~;`Y3j5oaf!weCp^5J)Cry)8&yj2JizHUZEYHuy#*U^a|l{(|Vco z1VmHT)MV2;EeFWN0*YRN?omo1B22mbYx^O7#Sjk}vT5}|dIfr>yO0!{=%iO@2^#4c z6kDN#B-AHwXLlduLL+_N}k%jZ(R6AM>E9HT@l}YC-7RD|gzI5K6>GV?Wr-XP7Z~uW3;`e_&eV~N+dz27u(Xj5T zgvkFhN{GJoln|2*vzTkIA9R9#!gouY?3KtZ9O=Du%EP{ly0LbNXH-dUlQ%nY`<;r8 zH5T?c?M+xP_Ic0iofvhck2z|c6R-7hiYp4jDz(^Ys&NM6RP0o2!&Xk|X!_=KboT zrRC@WA2s~3lA^?}q`3Y-N%7zh!TF@eh;~GzYDtarnc(CKLbv zFG`BUWSZgHuEqS zaxhfiPg#M#3)z(wGvqb!yYA|y(|hs%y0SuE#r;k<@t0~W+=W#y8U&9@!|#OivAjUf0# zNid#xNfGfBa4*FMP4Kn=WYPddu|a>sR~GY%Kk*R1Vu*(f*|a7m#Rffl+i7GIofI21 zJtW13Vk`8XcDiCKbdY6*M@!hqOH0a2t-?dDPOShKMC3ggw*49Z=FSXC zF!Q_p;%l@vy4;TNXtp_-YP(IZh0GP3<M((`RzG_W6l7SfhVa)@2dTwlQ9I zicHou1-kNq0(mst*ckI(>ulaNPH1h2#kZTWA zAP-a^|Me=62m3T^Tit06`Cy-hZSTjww@)L){!Ng7P5DuOpGMOM`!pWx)41>X2ijP# zs6J@T9Gb>ld7r85q%L05gSpa_#g2_8bk2kJY;=eH7w*{ziT%%NKp6KD?AdtYm~a7m zHa`4|_iWTxf%MLo_iluYro9_}w08rCI&|-}iYYO9n1c=(g{oHk#(8Y*UXJ*Y+Bu$~ z-JPaJ%~ucY9)Hp!Jk_{Ji(4G_qm1vR0^u9j_jBm_C@PTjd#gYy>Zw5fuk7sziM@-K zBjm5!+i~Z94vr25!6^EQsWvBW+_V`*Uvc#g_f5N7Yu^t-`U(n5`ie#l#Z64X2vhyd z9J8;?cx8EN@G~RdYQA|`;beYo@!UB#_x`e=(?!h-yVouAuxTumSpRB`#SLg@{zzkS z?t#YQfyUy$=tK$iZ1>ezO!_k#i#~NWb0n5?pZ&?59F2Tk_UNJ#%Al`cT&8wsic=e_ z4V~+rDq*!1Ob=#y7ukAY0N>VNUiW~q9^O=%S37S@3wik_*X@hu!josw0in^!ZYW*PWWjIehy75>Y%9{ z^Lhsjt4?Cn=V_sShi2q(f1>J=Gpg>yDHau@5I0W~dh5 zdOXrx;~5>PZW{SnHmkaw;`jQa|TAXs3?f zpN>!atzcY&g;b;F6_<$yXKQ4o!B?$rOqY6`YA5)r`{0o|5Usz#F3}X}R_#rXW>U3U z{$3iKHyj$AOs#p}l7@!^Guxc2KBJ1Ioggq{41azT%P{c&nN2K-;8QlSP`V}qWbU8sv~O?2ACLVqo$q${>UkF?VjTcLw2Z({L4TcoD}%e7@R|AJ z?Azzx4fE|idFt%&xcPq)N1xZ?ax zPzpUz3jG%;g(Nhse_tuo?+&GqW~tMjKYQ7TZ8J;DjMiJf#pTem8TAn#m&klv+jvmN z`n&iz?KNEUF~Rv!t>E<_0z;Q4iR*?K4h~67AiPf9n(xt(X7f=ZOC2 z6h&u-$%>-#X;HGG=ry~dDB*63qDb|qJ++FW(_X?uWl@d3bEzC7OpA1JN%mNn{8VG8 zbRIRT)#~1)3Svn&)Jjc?qnt`o79F=Ki#|!wq^bK7N0Cig^!j`#i`f07EP6AFltsx2 z-;!Er4=IaA=Sl|?H_S!9aT6nt5k8GI|M%@(e9%TL@oZ22)_ z%MTmdu>6KbRjFaUw)}a8QIp@S?dj9S5l!l(`Xy|%8x=w9cZ zNNe;rpM0XE+y1~zHr4~Ok$VF?33m6L7G;pko&3t1#U^^$DB)Fhx3UkZf!$4u4>F{& zBSZJqpN@Iu*V<-S^^G=t?*xp9=k6@hEhKPYI`#pW?5? ztMJ`vD|}R*?E!i(RELysO1w%r-&s#C^toMg4fq*Q#ow-J0*F8xAQXrO1_F-)h}L09 zMqMcHjTn?PDYhdJ9{lZ&1iL-nZu{c;JKN2ChMw_>{ksoJ><&9)bn-}3B6;OzC1)Bs z8*)u!3Nms{&Pp}1hejutYD&wsG%S+CpY_Py7@6XtBZ4TetvGoh=P0*zB7;#Y)DR2F6Y0)D->QS*_qk7chD&a z7Ai5>*}17*oW~~T7G`9Pw8b^{?jE6ru}VzNW3w|-k*bU=|2EDOoeeOxfec;iMNOU~ zGZPcC^D-#q@U5E>LtBy=>R+3F$$+cTB|}i4u}v2_W;rnKsT+hVDiInUHo84EvN(GV zpShz3E7?-sIElJ%E+DH%Zt}<&DlkOs$gn+P<$c)i*$a+EUhJ#A+A_SmFeNGXs9N$% ztSv*-%HJ399f`9G4vzJABtok58fr_gHb-sm$kN}NpLzwAJYpo3_`i@TR5yfm)D=f= z11Uc83LJ44&k>5}T|ye}EGMNyd{ADwfp;mdz+@Drqg~dkruQmITZ#VPF3*3yRPI|I z_wh_D=;C}o@3FPs=x9RFYh|aU<(cwp$rxdX3@bNd{Qp2-R;TTU7zzuJKpH1#CPCvt zh#_|*8m&xwNM&ONo|x`OCbvH9wM=z zUhi2q#Dsf<82h^rN{VB%d$CXqY+R-SeyaUQP@(UqI9tOnP*Pui< zI6XPvFfKXIU`oy_3^a6ZW6OWNmWHmK22wnn=znNh z^3T*CT7&)Xu0P%FDlsU^FbVr#ys%$*t)`~q*EKaWfH*vFfqm;bp1-N7@w`z}v+yRK zzpbfR@g3Yh*3=Bg*OnLlQd4v0H@NZF31z)&X6pY_=!%}$XeY$k?Hj)Ny{0Vid}n8e z>Fr_T?;U13UQZ_S!i19Db~{3*;3pFb)VlgiJ!qs0C!2KOb?v&(ieGi0DH?xniD8%x zdx2=1K6V3WHWQW5i;3wu5IVD=v}|AoNBV^040Nn%Y(|Qyn~&5=>L(3N9G#z;DpO?t zm?-(HoUysd!IpIr$kW-LpnQN2)|-l3j|V=z_E~Q?4Tp zd|hRfDOHK$sj-Uqu^Fau_XvW-fqzUvaw@*af>h@*Lx%K<9hQ-wJ_t*-tdX6Sa534V zM<-{c4k$1c)Jt^A=+rSpV-k^@L8jb{q;A^E+Jj5Fl6`PTllbKu?pOH06DKC8KR3R~m z^kmAFd81?SfsEu7=%_RDP{;~9@=)KS7kxE{0VBSLlarBS%7m~yTMP*Zo0E>O=493h zJt*IlJUS*jD?c|oGZV6sGc)^`3gr-}8MeYmNY2ZPHQ^KO89DekqY@ZpkpquZcrf%O z#|+z-a)xDOW_G8K^YqBhHI2;8F33ui-$}ngeGBrb2FZWLs}qUxkq%}AbhxHmeD5IA zr{AFdBS^Iy-hU8%`!y$-zTqmrHb<%6@%Etl&Ckw?wgt9T1s`dk6vNm&9wiUx8bcBX z7K}#FzS(thl1U%#$;}u!(v&OH8RWz?GCQ}hKk75SxpTj;2$p_FV0@=Gt02c7D6t@8 zR7O5NUy?O4ld83n@x0W`p;XK9bqah9DJ!o|?H$r z;vu~#aP4bz#EM)Mj>t~VO|9>bu++rmoDAtT3{59nNl8J*IN8ahX2)k|=g_;7n<3t9 zzDbU%|A;(OF23Z+{6F^I1WvA^Y9FqXt($s}PX zJ((qGnWdSYY(TU@R8)jkL_kGbSws+MH$XNU0R>zbMG?iN6$D-ZZNvox2ni!!U!2%wT3j_E=di+C(dCM2CTCi+w=Y}ry#FTE*^H!Wbn>jjcVORHt-g#PHhjxzOW^T)5GAm|oJ9C>< z7}Z$s8u|-Q9fMS5Q0A=j$S1uJWgPB8Y6Q@7d$(+xnUP?@$k0HhyJK)G=f>f_uI}D#L3H}u^O&&=-JiA6q7+lb zBIdSjXZqm;vi~!pGc)aDs%lJtD&eXP^g*p{9T^2v!e5MD3 zx)`J`Ri8Dq=wOPr%m&wYcEfKa1~Gp04pZ}O9~$aMdy(m(xyrtBd@qd$0^Pkk(|`OB zdX1WsGStEkSwk}>0#45KjBJ3A9*^64GCi0Jx=9{WlI*H&V)e>p{&_9CF}Gn6zG}UG zDF#*aQ=0e0aPI&j=^ol9)|w-~8lN^mX__|9mb2b?Glm*ta%xsI=7d~tjy4K0-^nlf z(zUATlcd*Fz;miFDztYClu-9;c~_QL3)LjK9K9K=zTPhSKH19N?9lKCv3+wO*m|@8 zW7$y8^334Ee%x7NjB~#rw7fnEK`4_`HGwKVacCsd$5T>{@=0a3^!8&;f=d^Y0n3B9 z!@V#}hI@NDw_?~ESlXK-E#=rDr8h63O<~;Ct!joqlum4)=7xsJnt}+L7wi&LP;R7a za75DJ+))maRw z7|kiy+8jL6wO$6WtszE+Hg<35=s}U|dB`3>fBfBOZLoo#%XjtA?k!tzC)IcEU^aHp zHn~_e1B0_PUZhzlzh|dsA81oESdP`^U`o#FgDJ_W&EDFwQ4>YO`-Y6jKvk`)7TK)p zRdQ^h8zDzj)&12S#wPa&sY|JF-yWM-{l0Mb(J_`~)(vAP*q?E~3PN9i;RjP{dDkGS zMcQbT2j5kH41GWJCgSdHvHI&Wa~Yh^8N*W$ybj1h^xU5DCX(_Ba9Tf8RI(>p{n*-0BmV4C|U zszts1z3b7D>$RY8%_vkxu&e|!L!>E51*f`J_Buxm2Fmz!FHm-EOw#bn!rGu5Ap5F^ zzC^iTWCXSoK3d69d)GP`w-Do7AmtQO>6&r05+~1DP}fmu7O* zDVAh<`!N=EZ_M@f9I}R5ia$j3$$`0MIqGQubmb5XILtUJQBm56B$Ht)%*Y;`(&@%G zH|0P_%r&|LXL2-7F4)wS>8Ex^HYF`>QE`}J$4p?Dz5iznP1*iyompTE9NLJ1uq*~kD0dLR~%SvRNdNc>l(%~pIX7nu0fhZR5aDf=5@?e zP@A*LR?cMl`e3uK=xcB9=rG3j?ZftVWqh(>K@ERi2NI?9R8BsQGBIU>zR(Hf=g;fw z+twG<8~M_Y)Hf9DPzu#2C{qB7h)o^-N|9>$1GuJDmHkIR-jU7dGeeujmU^E8%D6Slrfz329{YgK-3)tZ9{7L+y>iGZ&8L7pKJMx~Bq2IV-opg+5ztGypfk|mgPs4~}%xo?O; z)^pdEn)N((ri09K>CKX3HByn^TULdU<}0|`H3RM#9|__sn@$`3K7$K9HP0<1^98Y~ z!PT9G#D?auo2YX#JLuGd$f_I<55Ye|Q$b-AH_bVqK>UESSiYQwU@ zz!@k3>@k=qG_pwd;LxC)&NCzZy=}RXt@yhE?ovc*WACAW;YS7>dM#Zp+>q%vyh^qwAGKcN>6tslfWMM{*+NOW&`r41Vd*4C~ylVT7n{I((K|6^h0e}YAO zqK~E8?ZzAyd+pTrl&l;=s3Q5Hx5eo77Pv5=(&xz2fJv*eLo*_*@X z#K*J8eXd(*FxZz_&#IxiQ9U%2p@uuL&d{rs+F<2(`%+v8ZtPu+ndm*l?8QHZ1GHbi6@&jYc-GM|zBg=xM!JYAwU(>idK1Eh9}99IHp8B*&5L z>xDZWt7&f7jqdEk#a6cOs-d%cX^aWp7#*A1lfOiry(82h$KE966bUrHK$>W07~a%~ zMs?l+mmm3v&?qn{jIFtP&mFgb|88=dktJGX7Cjw~$G#z7cmEI4ALp+8ztVS{^!_u2 z7jHtX=Frl~j8fY_@ME%{u~f!PAQLgRMv1nv-eM=!DG3V*Sj=O7h_4 zMldL4Y4Z2CHx+|AC}$qv((VmqqV3snnYp2j!`;0Le2utkaFExo!OYSGi_P|7?=D16!2T~)Rpcm#g3~lW1S%7V$&9!Ps4P^#Le2qU)8Wll}p8mqf zQ8ZYLfM{ng-0g2GLTA^ew=MU!QdKrxuX0k+-idE^poXZ{OhMh@g&2mHY5^>x?8w6Y zp^ZIgDA-{d?xjj4&t?zoq+lE}CTI#!ju(>SNroocdVQw4VCu_V<6!j7n1v^v>&B7t z6{oF7n+<`RCL?WcavCG8_O)662_{KOeaYLKiQx5vfu^jCKc0uM6dw*x60`ZhBx-|F+|Woh~R{&qVR}#JT{i$1l%}+ zfhcqCShK1VrlZ_U85~)a8K46Pu-F0$laBHRpuh2^zrTKnjmB29K)1&mlkTeC;Q?Cv z!pyD@u9RYpfhgK*Tw7QK1E}z3i1axiTt7IL6J63*rd;yUoF3jNJs1%3*Nw7OQPSmj z46sXWu0Q}KS3ZTVjaxGP8SERh%QFc`SKl>Sc>tc989;h+>7aL=$;3yaVpj(vwN1#! zBIIU}J|iKAW3f&;*_Xf}GlJTMWdQ?Mpf}?N`TWu9M97$6c3V*AhvQlwf{|lE@I=VE zep&#_Hl&6P^s!5Rc~|aiec3y>kuUXmigjCQ_o`bhR#(#s zPNodnhO-xg3u;S61(fGpvTE}^I5^MJSDQ!M$Xw~9;|Z|w!Nihx!C=qIUM%Sc*}7Jt zh{dO1^y-EdxZP?$hI8t{cI@y_R{1d4)zCLQMCWAWdT87jD((bv$o9+8BdD}7LX$V9 z9Lk+NRK{*j5Mox**-I-6gUCtUn0Cp0t(OX^!FsCiOvyEtinx6tS_zGj<7Lg*B*&E= z!RU}1p$*$i4g(^qi@Uo0WZ;tbsn*p4Jd(-vk}Hx1%eIxBogL#9tF|noo8n8MVQy-P zu;9dnoq@p)UD+4gtiR1_@S^_BR#31ua2r&*nk$D#-t}H2cPKDxNV7n6>z=tld#t+q zafS*THgHGex_f&tUdwX?2*Kuzd|sx$IYV-I5K}csD2>q`A+l$xFo`lMkUFhzHP0-} zKjeoegz*9uoa@9<9<0#e_uQ)bBWfB<_>#~(Y2whG9=DUaTW-}5O=Uw+g(PK*^wnO? zMrIaH1>uSedK{nV?^Qla9Yh6^yqsi8q|7VH8E>lw5vX~fb&a%9ms}%VJl#Xtt%#l7 zx&%SoVU=PXCql#&)%g7LG=#M8)QnckL>sn;3fl^*&uC7(STtby43n|?jX5h=xUm4>Bs~Y)l z&_$QRm&dsidC#P)8Ar+xx>z2vBq3!8!4)MG zNBOLYgB}Tsv9=|Fft1d2E~ExY9YjIpq0ngYqLr|fdWMIF26PZj>H3;|j2h}=p|q5s z3}uD4!E-M+1A6Ev&mulmi4_EPV*9!__Kz%7y--hxwP5Im*`0;-se_(gI!jj@G-~?` za#vS10v;!1h&s->PMtx){g5X*Ro*$QYtVb@hpX6)u86cDs0^w;^mwkAbk0XzNne)F zD#Gz9S{%U?qPWU7%h7ZNjca!dlkIYxVZyM2xo~iVIyBt`H4e04|9KdFUGMSs@F}UF zi6hg58AAuBD26&or7L%6n3jRT7m(9 z({3a;wlab>K<5ww9gI)Z2RkJP(i|kPo*)}2hXWOA7N%ti zQ9s-Z`%?MFiGe|*w@2Roz}2WtdAFnzKG`;WOCZQ4+{8voY$=3tt@$y2El${)X`=(lONYBQ zVS54#1m!OFZI*%S8^D0*WMBq|8gaQnY>)>W)VIm`NqQiCCvt6g%mHRE7#m9=KXK)G_Xk52bME+@uh zR@-V1i1ZCDs*URMB)9xSkuxK0cyG=~AGRwLtknVWXr#mQCv7?MvdMu`2~l`pW~|?5 z9gWW(wqd6R+m!H8=muU-!8c>{(;f(IK1r3-Ag<0;jT6F~-#RB*5pql-qgZa3=HM^x zhff4E6jnDr4_qKluFV&L*B@Gdx3q##m8GVll2L)fa6e`S$(2R-ZMZ!%l51Np|E`mN zyX0Rr#S;%(OLW>;hUQi-ZEqWZ8Ie)@+BC~bgQi|~+!eixgzdtOy&7N%+|?bZw`Jx@ zx3=TQoFiykW;{I6wvtXj`yZ#MXMJL3o!r4y?t*$aW`0%K9gEtePTOMzZbz*GeM^v9 z*h)0-_4MdO+d7o9o@QTp5^*09se=-hfz@j5x8O#H0bF2Aa zBm;A_1MMF!mY`_^0hBcZ>#!G(K9DOKJJM>CzJ6{E47`(SXgws_$ z+$57*jOU`TD&q^t@*`219G`H{912=87E$Q#V#+|Ohx@3+X_mJyeET*9fxemM^w$;E&Y7c-xhX1GQjt;PDyxXLv|INi=|YwZE5Z z4BlQ}x;V!Vqhw$RTQ=(E(^DV;n@I)W{L7|*eHA=&L@0Q~NS!R=#gGDW>cM?gNX`v( ztrj))(+s~x^|cd*R+g;|A3f}00Rr7xy+3QA{<{<+i*E*Ya6!aXe(CES#X%s zdR^4c4@zexVC|7K!4E_!(m}2mk)?wgz4Ange)t9}C(MSZWqp=~{eirQ9xsYK+bLtn zb@q57w8OEOvf^aanM4{-$5BBFZ^@vjGCjX6mi_wiM8s4FAn5`IV*MZ+0%$h?=CI$J zn$>;@sz^T0i7<5la~bxVH)2hk!-;NvCR08-ytoH}i)0Yy)PQB|mqlBaXA9MWU8Rvb z-v2-$wu6S)L}oTGxR*(*iSxxn+MH5dmYgkm9zlI6?~C6&sRahDe?It$6-s?nR-!l% z+>XbB2IWA;D|1R0;S1%yWT8;--nyrjk8*bXdt z>TtOBugIXS_)9H-ZkXJSse3ReJ$ft^=Z@4soZ|r6o$1_&ZnlX`StTSph>oFW3&m0h zD#^J|hheD&7hD@zOSMzN%;Uqq!|0W;?gQIbq^55uK;|R^pO){<1{|nN!cIE4ienDs z{HWhxIy;7`l^eg`X(f#ld0)o*xwOxV_f)8n$mc($S%h54qA<4c5h(31+BYN#+TF+2 zTYa)sUIMVlSs*=?bPeAK?JM(=Fjbqmq-VZ9gxORa@EkW%OD` ziQsQ-F+(1Ed8k2PgT(OTBM5y5oz#DTM}_gDUBfWC`g?ue1oV)el|Ekr+K3dPJL&gK zkX*noL4t#{FVnWJw-39vZ~|gL&UN+S)f2s4aLV@5^SJ?t@t&qnJe#B}c)6sJ-WY+u zG~hO>%9=e+a;Wa{5F)ilWt#iX8cNBU8wG1@c~VEur<9E8B$Y9AkJg(~5X2+Ra7NG~1QN>R zz{Q9Pf}XWYwj^o+&`&;FT??qqb}AMfLd5PfJ*-DYJ=G7=@*S$@06gAOziNkOJuq?9 z8FCdaPtjxKS%`y9bW)}b(`@iUR)iA9zz)Y&W`q{a@??`-P{^!_HH1w+=`{@m*N#!? zH8c&q@_}8o|AnIBY!3PvcH?W=P&YoeH>W)Z!Em&EIuauT$w0?GI8GBt>zc#lyHA!6 z!BYeWCmo2P{Q_zjaGZ~Oq-T7VI@Y6k=<)h!Pc10;aK8>7?2)B0TxMPLuu)ya)Jtw8 zj(G@&G?ttkvvP7+l+XUjv=(B{^c_&4A}++yDU8^2nys*F`mW6rj)QF4~xg6JzTamW@QwudgwPTs;f~TVXFpQGMgk?T-s-kV| z$LfmwT_hLSf%XUSPO=P=HrBGPbyyHnB)!wZJU9gESM`%4{)M%Q1;O@A7pkwXM_Sdq~snIKqBcMqLkS zU;DcQrg42B1Kw^qLip~D>Y*H+HiWS~tq^am!5GJQGLqpDNYCxG<0j=)R!rY>^fkgBRSWX(GbM!I{9l{*aFcHc?3>xHm1(CAsdRRg4;Nk%Jf*^G*U!S5b zgEOHs%0aqgJ)!>A8u0Dve?FDVgsY565lT|BciTK1*3PUTi^1uCEZ8k9CmLN%F-?QVyfF@g^`8 ztY5_?of#^qe#2Ceu&Vd9?OK=|L&(Oi+XO*geFs6MTU+*HhU!Nw81!}X6H#d=dz_BC z5+{j?S)0aIQc;H0AX;zi#P4Z9eef1u$1)@rD3(%#CW3 z1N6WvgVwJb$GG(`cea^UoH0+l zQ!;XOJkI>ziFY32L7QH=dtMukYkk%?Pt?MsUq~sZO!CHt6PqaGSwhSj*A`;lO6ukq z@zl92ontmI(?c{X8@Q}2yznU-9D~U(p{5_hp`_%8t(}=i=l9Nvty4 z4Bbt|!37((wQ3`#e|NVgC<6^kiiD*%N4kS#W(a{@Sc`>gv!$()51>n7ELG@fYD`Ua zn|L)A$#MsuBs3V%7V~O;ccIK+wR~!uPQ!;)> zQY~WOE-E>{wPqGvNl=}QQ!DbNL7lZHT`3QE%w#d?q8pZ#J|D?EdGJXV9(>i0PNo-; zE#`MNF4_u*S*BYKxO|soa`G7yzM^-7s7rcr6px5~om&Ui4fU&2T=MWvkMDq&sDQjuil_Y;|?Z12Bjjm zNA#f`oD_yF4+$deTgeEL)_rZjVFpb(J~g=~LSb0EVWosM_! zuQ{?Dk5EC)nlYE_7*v*1ZX?{UXkKh(q2E(FG6@{Cqu!>5!Lc#fkxl1I^^L1Xr9B=j zo(AxO!^NCE-5b>=$>kLkm9zWc$ONMBv0`5%Ge}}`F<48a=6zM2TP}tC%*8nVI$k7S zI2^k6c0b@rmSlr9(jw)b3R@7v9^ELF4Qx zarnaV_LP{1q6c@5I9x6a{d-WxTXOtWfc265*pC>2(^u$s&($tyE(c(zH@-3e0~PNz z-8k4k&M77Y*A8FMxePhc3%qN2qkJJI6HIUFL>x>h|GTZxJCvN?<-!4{@gUe9jUB zm&@1NBdlPFQ-nAr^juVY!aC!>qT)~1Pr>_+^GWNasCdG~r$&G89)`=0d-zK1?cU@+ zM8)?!ylDTo-c(4x;>{4^Q=xWTJ{dX=m*F@rZx2rsVl=!5E?*4e7jF-ntLHb`f)gm^0@VTlC|rukXv@;xE>T zczr&2t@QEJBair;B{p=(7wRKyvbYalp}j8@`9+KPZs-Q}MOuXKAV!23Iry`-_&k-B z>){+B&N<+Fmbl82@8o~$GkYR|8^ONOI^)(Ior~;;iwyCv=~&_r~S>9eiE)5{E*I4nn`?OvB|5=<+wt4!C^D zxuI4M?-t_SJ3L^CQ!l0Ta2iZvEyW!%<2xj z$)WbnO$s7+-!MPPO)to%rx_@Gbq7UP(``)wqeu8;^a@(&chd`Nmeggf%o5Wjo!yYC zSanS}m>dw2MHz9Jd_RdezGG4Qvc>v&F7qv~wM?h5pz>~uh3)nI$eK*`o!>h(@P9%L zbj$W%dt0qo-NBws*%iB_v%A)6XVp84GQ(v*aq3C%JWzSd=JoV!!!_9vbh&NToSxZp+mD=+nUl!OnVp$4H*?hCnWN@p z<|f+b&d$u8n>_k((ZOkMs->;+$T02@8PP6+FOe3T4xdf=CuhwOXX%I>Mp)>tI^Z2W zbZkevp8vzIKxhqBrvKe(qcE~EQD79)|A8HbFs$godbtI5-1K0eS{>Fx)y&5c7OU^h z)R=sXTj4R^=|Q?D2EVz&In}Z_YZF2^9!$;NVbZ11S6}{{Z-Hp9-2_=#fMP{0NHzvQ zVZ7s23mkE{Y^~@SYsuNDUi)6FZZ->0FDrZrOy4p+Gkq)mZN|S1(=*#d5@n(!d@nBk zzwSNEy2f-<|G&Sy|3A2?qFr@>Hr(CAXN&gw;0Z`Q0}PQ2$RuaWZl+>@r6XYm(3ccx zjUIf@I&bZXou^?1HxGk8C8?#7)Aj2=rppd@VyE&S0ZFkjqlyMj`>f_t#e-rpS?@O1TUHYGYUplp}BV?P#M1I!% z!xLw1I()9!r23K1C_=kOcj7r8#t)A_%9wrUZvC&_Ej9Z1=ec)ofi{i)S3WQxr-R@} z4aHgWF?Pb{@DJMvsg14gbQZ(H{a?9LdS0RBR{aw(Wc>#|7lXl0&)zfObvjD zs=~ykBc(B}0(y=(yd46wXZz$Z>8cS@E%E3BM1cdqavs<7^*BswF7>A(Xbpv2zhhBK=2hH;Hh+*Qdr>%95%79Kc%9ufR-)!DJ)^jSwPJoBJ!gXh7gpMKO)a}S@r@XYC5cq>INM`u!}pSM-m@bi+go(&dtPG1Ic7Y||oUiwJ5 zJ~q@cm_RA14VD38y`#QW0BNU&;fbAdx^>XFzM}4g@_X}C6M#TFH11Q4iNt+1;MZD) zD?5s&2l5`&{JQm>!|CE2+&Nk#QZj3>t5|owPS=Z7H9`1Rg!MUvri|L%mUBfd07DxF zLyVp>eWWo_Eyx>TOk4A5-m0Zg%QrcHcFmwy+9l^xUiG#&AE~XVL!h9lQk*LhCHFa% zX;R}=I@L*#V@yeuY`wva6~$v;)V}mudfeoc3?4MYu0z;(40`(vC*OZ{9`vI=O5>5%wsCqNGD)8AptZGUlDMdIYsIQs?Yqp zDgN6kH7MHlG^>sEW9!UU8q}LqX2o&7K0LNKEJL@iQ8PC>ERF%yzR!T0sB&qSxin6p z)(>@r3FXHrigCXv2|Y26E!gyq6KUig98nFeVWs)RR8f+(m^h}6BYL^s>6DWm_r}So z_Q6Ng;&w+a9*ZDGb!tou+p9cnJ5miS#OC=hX5{T>rKGmsD|K3=_V#k8p+-LNiid=1 zcbrsFYE5`6YsIEGb>nk;>k)qHIq;P`Jf6_IgV&JKc?rlo29w4{nXGCXa)Q3d|2rLq z&fKbg`2XGAd8fmu@o?M!DIJE+j?w{A98DECeToAe3NHe6@DD%h$ESGKKEk#vVOd?4 zV@-~_6t)6%1@MZ8hj$YxoRxhM!k6G*;h;&Pic`41!u4fu?u5UJCod-WGwNC5uLtZV zMnjf}9Jrf^Z48MbXlheP+yk0EKO{y$M?Vu0&x6LViHJ8qv!87iv4eIK;^tg;mAj+QL*}mG%*Ca$jL3??D~hE4=Ex!inD} zyvlvTt$thBg$IR*KP24ZL&6^Yo^a!j3aj{-@X9|HR{3!uVm}jZ`3YP~>3JZwK!V%PHS!S%teTJAIF3CGNFEylgq8GVbJeEGPLL%Sz&C zuy_!0evkBj5Bv<$dd9L!Z&;%IhGmuCwCvKqaQ!cY?PS~4oouVTt1T+K+IC?#+Y$%c zZs}mqS+El4>+oCkzwo)r>kzHjw)z!AhpKN=j(`+Yyy6q;b9L^53bJ!uiy4!1Gb$Vu${_)Z6$}0_xo%ob^+431o~WNi}KaB zQ^wJ8ag*)DaRNR01ay1e7NgJGZvF+^%fDz_u`2SY+II0}+Zlb?wqt*>-Qp|I?G;D&~l6%&}6ZIU;?UW0y~JEOCb8CeCz3>P*Kjo$0uRvm9Hb z9Vd}?yhNAdWV;+I+3h%`Zlu?ZI6aW<1-}nXcs=r2?^wli9H%^jd@giE^8JpL_>f~K zKZShmcf9l?jyw9O$=7BUq_jQ-BCN>#^=z2aE; zzdLU6A4t=3Jz=|6JnY)puqz5-*DCGpit^sBm7d|+iTz!-aDeM2X1Z4XVArc2>^kK` zTsPk4ie#JXR6%3MxK?Gk>%>lU-Pj7qu5#VfDXv{S-4)q0T&H-3E8=TiJG~Zhx?H!? z<%;w=@Yf-3w`-@mksoNW$F)Y+gKluG@;0P(5%Rp;^~#@yF4wwV_Bz)}-sZa166hnY zCmwaJ?DMWW`aER*=(?2`fnP@6e{rqS>!5GBR;tPK63w0%jpBy2dUm1Jb7GS`tFp7_ z7IyJOYFE!nPV+<|?%DBuJU2Vtb5b)rQJ&#h#r;6{!+>?LC*lWtPW)Y-l|RfArG#fC z4oBR>Jv%nr6Y1HWot}d<=6G)ED9F6qbCV}{PVofKt(@pV5b;x<7w^Pnr{`2b#Tw6z zor<`pLiRMzO7(blq8ITuc%qm=y6^Ga^7-Iz^W4!7L5GieZu%0$`4%Uo{F&!ue}=L>2|b_myvmcnzkp7^LK;s)zh^wJ^k1llKYDiMkDgWi z6Vm@P=-)jz{wj2O)wAQTc~<^Sr2Qt!_m*du-}2m&6|zRXkf?YeyATRl$w>RSiE+I!uLpswy zcMsXc-9uh!uaKMAJLJUnL3;auHzQu9h2x%S?64^sSPVtbCS51UOdREAa z&kl+5?2uPJ3Te*;og1=J^T3-2-fF~M6B5ZaAt$>gXeXOIwj;JP7Qgf z(?WLsw2)IiEff}Kgd*iLAb%#p(;-nzhul~fa979?>p~*7E)>dd2zg>4B=Q3xXLJC1 z4Th}bXTl=?nXr|(ChV542|Mx6g+=mnVXyqTuoW+c?Q{|0#jqH~b@mIOUkKZYFGA*v zVXJg~*h$?Gc8gyMi|UucUhzi6`AXPL+!FS(w}$P}TM>RM!oCUlZ-(8({BkYde3z;XwUi`OVD>XUdCiaL}$psO+v>+l9?GZ1zFyiDFMy%A*h*MY^ zu}a5B++s(>8eJW6;%g$PqX_CKBJyh@mRK8cE9r=n?25SMu83D$2ifk3m+y&K+1`j4 z?M0lvh)DHC>~bICt&eyjgE*OpmwFH4yeDGE&qg|fNMjIb4nmLNh$wD~So!l1=RD90 zBH_}7NbAB#r1XBIaZ$w0egJVUM%cv>C-z~)`EbO|eJIQ z_?JaQ;j)MozbYcc)hOH5z*k4?DyaB$#Hw5qu@j$zj-QKQ%t4yhMjUZnM8vK`Ij%!F zu8+8**GIh64H1#P0r`Fj;a`e~;+G;;;--j5-V|}GH%08^%}D!ZTz@6v6>f=Ggfgzd-m?(CI0}4>x(~NlhX{#+105{R(5C5ots2_mnJ8*Ym;5vwaFXZt;x;qjyQWX zIh8${?8Kgs-?PcC?1Q)m;rbBp4sCMsvzkP49%PPd5`{%gR_qL1r<>g3I;4AXlc-+Y zWXC?z{U%p>8d6>dv%jl{z8+N{9=X5j=utvhzSd-wzTRYuZy?=oG})uygzW82 zUg37&+mYWLO>X*5=zV9CEAB#`cR}~Np!?lO<8J78H}u-pY-hJMTd{nzSI9TJ=?j`g z`GRIQeqnPc`_X1AacQ$iU)pS!K}Robwknr3i+G{gDHWPS<;$DB)F;9JWV4mNqFEHK zK)frP?aGzSLR^LPu4=YQS2w${Pd8g-*t5xNK);Ci*EV~lYnw&o+GaO-eX|$8p;;7f z0Pp5zH~p1nyY!W2FL7(LQ@*v?E#KB`7r)xxb+w6{h58>Zyc1sU8i}J(GZsCz;QGBG?%|6;J@{c0z?>CF=_Ywc6%~tvemyp-XDC=LKix+i7Q`Cz^qoNv(I>|{oaNe`M4t9~l*?IZ-Ql6l9J9|LCZfKPD>5$3~sxaY*O5 zs3n#}o%9muvm|PjmqKo7)GKvFMf`-Q6JHj!vdg1RX*u#gG3q8xidu!vs59CbwNj@d z|5L#~BWjn=h>FoOpzGSG8%swq4@B)mSJXt~~EfKv8<+%)H`2^Ct9CdIx^tuZ2S4XYH=b-23QHC3$UiL<$^W~_h zemUw@ZbF_nL(f~IcIr07{Xx{p|1jzneuO-J7IjlkM4iGDxW@CQqc26h(LaIz=ct>l zM(s*9>cn1-isZ{tC;k`I=POYWdnM|mUO{?)g-(A({{M=K#J^B((c+9+EpEzbv4z{> z=0h!ZCDh^+!!2&Ssl`giTAXsMMZ~AH*!d|fR%%c1_H6MId$ri+@boh@#q6S}Q} z%$gQYoZMn1PHPc`(^@Ri3w~dV72kj|Wm>Gl5b`_+;pexA%K4D{An+wEPWF-(EB2Wd zuW(I^HF^W;;6|i>Q;S!+sYR4-ZSjh?wOGY(wAhtzLWiHUi1g#YzeKs7LfXGVUcYMb z5-*_KF9QF$MI`==^8W+;S6kfTtH}Gc7B~AE;{UV7OTN(}Qg5`l`F|nazmT8XDq>!% zllNLJ5pMNFq}5I|wR**-R<{ss6_u7&H#GxvMyoTrFJ$*?wbT2xiacn3|5i7C0Im;g zwMs{~+U53ESG>E`j&-)W+0$C>cyFtl%(Ob?Osh!0r_~xAMBE|B4LSd*MI9*Zu8CON6_ zB#{kIax0+e$RsP?G)W|zCVAziNmjOXl3i?_%P7H(+`@;XI$=`)0zI#XEHUg3^zKt5-qjQ!AQ2w_>InG=@S z3_Ul)Pq9VViSv-=dBRR@Lp{7#c=^0=V;7=6-jDKs06KqEScQ+FZVITgPawTd3$OGU zEDR=w239;(o|K zgzN7jjqgI{VdM!vOW{XI<45qNJdW}_E^P9(6yR&A{ucHAG<11Jh{7|_Eex|E0)Ix6 zWha~A?`VeKV|PoWcelL49+nl~+j6pdTUO;@_(Tq|tm0wtvCM+};g%gc0{)lTmMi91 zc6knbFre9^5O$R1rRE||n`Kvyu|)Ye#7TlKu)J8i<&G}2yyEfj#Voh%>T>vRPO+Tw zsYw4cxXVVM!-!?YHd!LM3A$VWAI$~8AF%BF2av}HknXcs$3KU)|8tI2dEW72e{@9r zk67Qo;E2Ktj$H*!zvx)vPmY6iIebP~)BhFg^H&{FdKK&Z*C6+rIK)Xyx@xJ z3$B}Z(RIX2u1LS+IwjCi(CnYE{)TfS{xa6-F9U<-L1S1?7hiY1)SIp-yoo$)&&$Jo zQn0b6^gJiwVSVX&RtZa-atJi++10S;6e6ArGs+TJdzYi0hqbqxo#fet9XwIp!E=%^ z&noQdIr-f@F}j;)r>1#cbsEy#6J2Oe&l=qea(j6g_mL*n=jG|1i0|vUDXhu!2Vi}A zAl8`&A)T4Ho{6>R!JZXA#tW6_VI6#u7b;-QU0Q*-t2{5g8tdlOo?SWFbCaidcK#I4 zt-$Y@?nRz`$YZ_dj;==<8$36?0eQa%GG{}V&5(Z|=!Hn@Ldbu}^RgFvZtPOeOJfb5 zy%c&~3VpEtE`8Fo%2#`K?9-koei~_f5pvg}eAl8Lu0z;$kh>oAde2JS=sD>dJ-c)x z()lv?5A2KH^!`Cp?k*x#x`j+!HaZ;S;~`MEMt}qhETW@Jr7r{}N?=%5w@&A-~^v-so>U z*liv%g6@#%{M~cn|A1bvB7gV{V*i9L|Mcw9 z*FC5B24vra?r$L<5%Tiz8&sW;sJJ1k(1P`SYY6QezJf_1FTDe<;U}oXLLxpnWXGq5 z+`?3Z!#_~kC1e%%2s!aR;Y-*%?l!#w?^eC*&rM z3OV_skl%43w=zFuXBS}o-j2K$hU~(^kW&RME<&88;2$5d^Bp0#ye#CTmjf>kS)(V0 z-1ti51D`?ZZr+8+uz;^L5qUmWtPpotGd$B!VLkD|;4l^-3OhV1mWq1(4ZZnBL0%ONZM0Ky*#+3^Q~A3{10 zLH|dP{-eO(2mL_^{>_k=ehfN37IN~VAyN7<>h>q_&paM-Q$Gz^*$UFEK<4)$H~lQi z_-x3nK8O7O2z_1%Iq?@mV)V};yYw>fUqV*pm5`J8Ye%SVJp@Q|4K_3?Jevjb_(0Yox@gnm#|ab74o~mPcsevn?2yG z*#o|nJ;Qcs@35%s9d@emu$?*pbSBb21U{d`!lHOs*ebMzz2q@rE4dhQi;?e=un(28pK-@ z_6jE>?Nh?=UBP#Bde|8~J#5F$2wTN|=+ck!4WL|uC{Gq?Z48U*#;_aP4EfDrrv#ck z7rvr%k^Xr||9s?oK6JkvKBddU*60;s5&IO<`V{1^47;hT5dW&MmAWP@((q>`K8LW+ zLl%ClVlgb>yRr(`qFmR7y~=fAHwzzD0zNG9rLbMN5%|ktk-sJER&NW70w$4aDeM%! z5q8V)VZnE0i912>3|pmdL6^J2Ug>U>;cn<~PuMHp6BeWQpbYmS&-=o5^?s!H9hCPw zVJrVYSd<>X^#fr$`4GzVP}nMbFYG11552!1wqlQko8pg!o8zP5XaYt?_3^O4YjoUr zEMm_Eg~cMK(jWY+b5{y$OU#P3gd_CU8QNE)f6rh1##{8m3OMj1-m&=irGMx5 zP7S-eT3=bOn=SvIi@c&eVwW2s`PhY zx*O9OOy9-yD5eXTp1^c9)3r=9Omj@PG5rwJk2C!Y)9abu#`IfEA7J`Jrax!;JEku% z{TtJ_m^OK;JX4tN$@BoGvzQ*kbTQMDn4ZeCo9O`4%}g&~`cbA=F#SB!FEjl*(|ehI zkLiz@KE?D8O#jUEHKtBTm7|sEE=>1fdN9)?na*e0!L*a6uP}X+X*jIPGnwh`O!s4Y7}KMfE@Zl#>B&sHn4Zma zBh&XW{V>zZnO?*6OH9AY^lqjPF@22bFPJ{f^d+YMU}{BFIigH=V!AiegP0z{bRN^C zOjj^HooO%AA*NfIzMtvGm|n^B3rufj`c0_`>2pk9X8Jl)uSu0>2d29* zox${7Opju^fawWLS2JD9G{ZE1|BE#qr&-BYozs~etrr%@w zW2R3r{R7iKGkuMz6IJDCWx5N~eV881^hl=jnRYPkWO^pk^-RxUdLGjcFujcF)l9Et zdJEG#nBLFy`%Hhv^tVj^i|H#&-((tYQRSJ;ba$rvF+Ggw(M%UIUC#7mrd>?WX1bB- z`E%qXVfrPeUuAkX(}$Qo#`G6VpJw_J(|<6vT2(osOm||sH`9Zd9>H`T)1^#T zFg=}VFH>z&VBIEvF>E)`FTr&0-BrHoc%Wp-KaJ!U81l(|RC=1G_f%L@ono9XbbdPA zM^kj2#d$sYmA7FN0>6vDtLTkPA7=VI)3lTlB8BsH{$E<-H7Y#IG#^6fQAM zoyvTs|8Dwz9p29MznlKQtH0KvJgCZ5{IH^hk0_e|DC0{M&3=sWrHU5MR#c}`!dXN5 zl?sZMKdxy06HG7X@J}j=SHDX6!j+6A5+Z%I!s*W_nxM0b_{FbLH1;_~t4u3Jg)3iF zl#>y$>lxp`@=Qx#R=9kVqN%SaTDVow(UPJ%9r1OAW8YwUhoXr)6|HU4^q#6e~J;-@L9!!?cb#mS#gpf@v*1 z)t$9CQI%dHBExh)*8+{wtBo5*dUHOj^j^#~b)nKP&oujfh07NO_15{BG~Pw0!hOG2 zv1f;(VJlQQzQkL2sj>WD3YBpdhki9bmLU&O7M53{GJ(93_GNJG_R}X_{29bed17zp zXO`EW969>@n373fr}U9K$ueD~E6GX6piw`jyg$A1vE-#a5_-A|dIbQl^{b*%LkMZ<3<^B4OC$Gz^c%=5*E3cOKr@y`X zRcrsg^v7#ITA%Uc<;dmhKcsEyCeg^rE#8+ zeyRHvEtM6`->GOB=M3o==kOxaQI1!-SMf)gR++|_AJ^$K9p!vvqWE(lUzp?RhHH6z z=8A~Fxr>z4G|jkZ(2AD(7t1qEGflp(!Zp=;B;HWr8mAeTnT~Qi&2L1rET?HBxdNwK zHS&eLoG&UpIFE&&IbXzODBiz+=l18X@_H42*Nex@12TP)**?F5^J?^K6u+1opT95b z_ZaK<%|nCvYyN)UQu>>G-5wh8b^PTG;%okU8t|(euKU;D4g3~kZB>NsQhI7UnQ<$Z zb2r9%{CI@pYrGfpU6$Y1zy~w-n16(Uk7bMitiN|_-w{% z6cHk4;PV;leXR=&{2|7wHQ;$LgMX#LzkzWJm*-{!f0ePW-)|ZG`wc!PQyWK8H!4kV zwo$UKxm(>oeZMD?*LIgFk9e}*#GV_!-D`fj0YAYRo8w&DJ=~9t40S(PTOPlk#5uj% zILX*YR6mcXnvP$h`eFK1WfvDNQZ&W5xOIGcxt884bw|o4Gd)$&`04si)g`WD& zN-J9GQnb2meEC$53Xg4I`W{8IXOAzR9#G-MEc1sIP3Oj!FOM*Pv!d~>ie}FpUp{_5 z^WUfFXkO98g+cjBWLH_<+34UjM#NhcJ`y0tRYJEmy@LvOSuQ(8;i-mPVJ8(n%5v#x z3U4*!IB8MYL-FS#6Pf>B3eN=A`IBsFZxv3v~&2nOYg}-XZ zDQT4JC9Wr?d8S3CT5j5JxSb<_@{0Q~>9ap$x~8%75XK}+W9Jc!(+4Si^mv(PtjEWq zfy<2b_*gOcVx~$@^W%(ldP&B5{7f^hc+6QBOzmkk~`O}7c-ryGve%atx80+-KVMh5G*UE43(*{3p@QaLf z`elP(G58{3v=0L(8Q02h;5=j9UJ8u0{w0H7W~}wAFxKgdSw?*@*6Al0>-Z^ypEmeg z7;Ag2z__NL5x>k>>+@5_G;YzaV#rqwEDjIqKb5i0KW^}ojCJ`^jCFpe7&vXnXAPWZ ztn<6Xz*iagIs=y&>-pjvjI}=Z82qwlYd}9)q7{tkcgk*7_F=`66RI{*(>*Q3F?u_*KSQpV*PAK6HL@#+pByv97NqW1asg zjJ5u0BmRgHKX33qX~Zuw*6EiG`HI08bAtNE80+yh!C03kW$?2`{JbGwH25VW{;0vP z7<_S*(og3fXRPhLBx7CwDaKm=e#W}~^Ne-f z?{D1T&t<-4Dr4P$;|6~=W1WA};IA^` zry1AEW5^c`ewnc@Z`I((l1g8le}b`2KV{%7W1U`+vG$Kv40*9YrC;lBjCK8{4Ss>K zZf_;VI=_k`A8%LbYkf_7DrxZ3jPbo&`KuZ@zfh%D^BpY;;yh!#R!jb3ixpqvB4eF? zVo8u+W~|dsE)Aw%X1oKZpFCdiH7+x*#qTiUGoHlp6Ymbjf8%N8hiZC8(H)r1WqK^r zA*P#|Uc~gn2ELN<^-OPNdOy=gnJ%8J^7{?rH<*e)upUfzGVlz>I{tYtD*2Bx{VdZ1 zeyzea{VIoZH4sVBpY$*B&1U?}eWe3ss1S=@Rq5z`nQ6Oj75gxc$RY#p^!1ZmKR-Mg z#6Ny?Ai&>XFZ2BJJH!VAc#47D*qs4>$iUP8er?E~UVhfxupg%m58?}E2XX#_Af9`1 z5L+S^@u!EUc>~xJ`!)IbeHRDu#RhJ&h9>#t_cHK-2A*mM<)=;wV!JztBjU0^`Wq8L z+&U|Wn?&mletni3c&&loW8gspf55;WH1Nd+7LyZ!{AV5U)?~jvBDQ#nAA9K_7OT&m z>gUgi%%0}QV)Z?7KOQ*wi6DM7h-Y}+`}yTJGJcHv#RKoJ2Kf8jAH+_4`XT=K_6!5> z7sQUpzuzw(aW1~tk9S9Zo9^p>lhD8X_(5-(=f@8j_ym z@J9^%Spydh{1Px;4^jL5$>8r{1@)U@;B^M>0rsb7CCiij<#R%3PxbR%1A7Jz8Mw*7 zR_obQ{ps5V4jDLN;3fmdCcsk+zB4(PzvUjjlV2YZ3u4#6VFO1D++^Tp1B=PQ^k;5; zA|A*e{XKxu-~HGD_TLYI{vY52`}sS!e&BFFe-{J0*5ZwR{=VXaSNY@b2khrR+p^4i zSFQC4@t4*hUOOp>o6vv!^4(}}eteOEqo^-Gzs0~i8hBTf$1lH|fnDn(NBa38u~qEl z)BmR!5B1q63bx;R!SUn$VUPInrS@48AHsIjWd{B@<7aq$FEZ9ye!<{>*}%JnRr)&q zp5GY=6<;G}`~zayC6pYID|`};xc z7L$Pb;u}G{YosMU?#*~t#``f&Fg}2B2jf|c(~OT` zyp{1n#-C!ml=01sE%XP{=TXK}7}xY+to5-RL!PmgpK4&sHRKuV_Gfv)`Vg-LaWm!< ze|@zWxYfWr8+dmEUt-{=82_HjzZd$yKflD(xp;Mw5U(SA1Qb>gq=(`{TRf z<{kama)Q_~aM4ao^~)c>G>ENN4UGBBFE8dlvy&e;8#rd*Ki_xg&VG6E=7$5=GO+kp zkU!1s*p1@H{;ArpEpFM}pPpmjovT6qt_I%C!21|@hJp7p@Bs!s(7=Zpc#eVR8u(}f zw;6bzfsZrrd;_-|IB#I>4;^VC$d3^u?P& zY#CUjzPqo#y@<{rb`0EX;AsZF(!gSMFg?q_wt*c3hYZ|m;7JCK7&vBNae7c6+rW;2 z-7|yo|NLhVzi!|+4E&~n|7GAS+^Q4TgBR$ISbzEPk6{lGPO^RRYXespAHe-0rb<##g2_YB<3ILG`J1MkTA66Q}aaGbH$cON7EbjCV=>)mt1{`xo? z^C#i!IsIc8-@~|#F+}8VG2>q|e+lC%OURUGi8H^8Rd?w=##%me(F-|jnFXJx8 zpJu#{@mCmkGk%b9596m8_cDH!aUbI;Zz%oNGd`NJ2m2t7lAg&p#CR*?C5&}>yBOE> zW32TnGX50D{{rK$GX5gtA27a_@gEpp$M`MA*E62>rqcfg#z!#z65|sY-^f^}_hrUf zpPLwKeQsu~_4x|p^_<=Rs##rl9VyyM~Dr2qB*BR^f_f5tZaDKNlR;^En zdl`R``S&r_>3^HCE?=3k*7ttKTHo(5*7`ocSl7pcjCJ`RVyyH3E@NF^-(#%H_b}so zSl>q&|B~^ejQ`5``v(3Y&T!@*}uj7c#45V^Wi)B`Hq378h9rI z<3-zXivJAjZyVS#uxnt?z##)S8MxWNQ3JOaxYfXu47`JZCmVQ21Mg(uoejK;fp<0V zZU&xaU@NKW(|t>|N1O2s#?cQeKB`>)rmgz!zHz=LGSk3qjF)iyX|ON+^3&EB_!I-5 z8pJaVJZ)=`Z^s{gmp}c`tRP+)+V@aDf7hLZ_+kT3#(KpsFYxo*e_w<>;Kx&^2G@h9 zV*c^--!kl(0rVd~|2hL7ZunQ;XW;i6*fRVtufm_}PhZ4>{*Vy-_kRA4hQGr$)@!#K z`dMx;J|(v{#~;Uf-H*R);HXi)OYK{B_sbUzELI2ke_nmF9FGP6nvDLQ5j*ea zPcQ9!HGrMz(+~0UCmZ$OY2Z5yEJUzAU88;@2DV-a$`|dR{oFkq#BstMIcLR$_LfQ+0e>08ts_j|L z*Y>Q&+FsT8YexIk_MGNx`%PnQziF)PEsd`<`qNzoe$v2Su-^*w$Mq4lKGW&V-(hs; zxCWq?8STgVo3fv@h$X(_?W+N(ZQxM+z1{&nei&Hq-BWM`_#hv@33z`Wz90I}^x;n! z`0v1e`CkDa;*-zge);2HVBm`k`~d@h5ZIsohYbG32ENJAZ}OL(i2L*3(ZEv-Jk`KE z8F*&{?`q)JaggO;U-_-czd6wMVcWo-fkOs<3)sJ((Qfdq9e;D6K8r-z*ar518=Uo# z=Q~o(>P@Bkx!oK2`M$_`+kd_<^(z&x@M}dYzfm+^QPfvtd71s43Qs@7{AU?I7nHAD zq4G^LHPgBMH_Gn&)qaXDa@BL#yY8>>=cXzA1*X?Cy^(41ztr~!3x8BJ@q(gxrs72o zXBvA+;dld@jXgHC@g^LNk;rkZ~|^Yu9|EvEUWGhd(kGWi1&Pk2K-^>2cMR&x1URx zAM9Oq{`m(g{mijJ=YIk7{bLuYqWL@X`*4yC^gI4j+fRQv^VMm)dLlagKIVIMmb}vZ ze&)|;z%MYrQTw}=`G+@%{{-{>b0dlB{Kb{3eEzxB&p(j){=IcS{{-f@QK0Xq)Bhmz z{c|6QY5pzDZ`A%CV7@+Qs4G!W<^R?M@qaS`-?>`p-zfcKnBVCBtz&+p_ICyI8@2EB7gYXM zgYvCoexvy%%lt<3%lnwG&mrq;Ay8>K&Q0{%(N*XP2`^iO7f zqxwCE`RXp|*!BK*@dW7?CP@Da%x_e_uQR{V_)}(nqw(zt=Bu}BjMe|7J5|a2YaNo( z^}mJrYwA(umFC~{EfwEyd;8LFPAV ze_JNtU&#DM^?w!f8}*;tnICFUzxOh~QT;s1{6_uz*$Mdey%XFY<~OpB+L_;|{HHKq zGmiusM^-&dHgPXCWBU-&*%@<#dZ$^1s? zAIbbi^>aM)8|8ln^Bdj2bC};~{JU_1{I8fG{hOHIsQo|8{6_8f8Rj>d->h$|`fZf{ z-pp@g{~yi#M)|L1exvbu{RI52%x|>5`7rYv)&HlN-^f0>af0;kWPT(4ADw{zs|nJ7 zk@=1Ef0Ox*^pEm;m>Sj3Rm|7%cU_?T9tEZqripeHo@aU^(^r`uzfkeZOk;}_p35}N z^hu@%E>`?4OshC_6!J*^P_yoM%?jD zWyxL5`NTP&*4I?{A2>Wcs`7vB)nIs*!`Ij8I)sqSz!u>V=ONATt>qA*i$DfFj*0c}%4Zd%>omaSh z?y;-NZyMKEmBVi|*h5o9 zy{1r=K+J|>xh6}pKqO_|O$6@sURN(Fie>d$xT3Na6f0{7>mnBHix(9EbuCD+u3*8+ zd(O=FZ1$OC#r5~|ec%7*FMOWoWWICe%$b=pedbw- zTKqoXXTu)%N4bQ6Pe*zW2Ob9gq$NKB{9r48qQGCb_~XDQzV0mF1n`=d3_b$!=B+pR zv#FaY-^+o!fIks;^5+BZmgnRz0IoV2T-w`G;4kiB@Xe543EXaPeZXC0>pa#7OM8NP zZnqap;qQ6Z=(!d0rM-y2e-E_BS%Zuo;=dgJKO(<+S^iP@4~G0hE&tWecn@kPoOgL(tzyz37B|kp3k| z>F0mN=nte{=(EAtsqv-0=v}8f@t$#~>t9Cyj{b$`rk_~tiP~V=htXF1lL!18i$5Ru zB#XZQ_!5jirG2Ob-oK|wkF*ay;IG53cO7i}gTQNn?+!c!d`+(56aFyp^U(eXe+2lU zTTOZG136LP+jXBk}j7q!vkr_1Uu@_=6i{=tYh zANU~fj|E-;+-^ThMLv}!ua)&d{hRcjNvAztbHV>j!k5DTqBQN}RQPX%egTB%@j8zs`QdyLyWfEJ zKA+`Xl)!@;kn5 z;!l@vlHTyg&V1{*+3C)QJ6*nA{5$fE({th%M!#{xOnf2wZDal?`f^#P{*!ptS^A~& zr2fru@W14GjdAMr7oNWd2AFuKAbxnOudzNMZXEL; z%g*9koavMBLfN|beB3#|7&{wul;MxT&g}K0Jo-&-{`dC&hEK}V2fPULoXBwF9|C@! z%eZBIDsP36bKt&C-1n%#Z$Nt{@*}`UpubPbq2Kf7e+OZGNpKhNsr`-ovuA~$$!$wKkEm>FX>fLgAd=w z=qY#@_-RP*D&%uMet+sDw3`xd0e)|4)!s(V2Jk0E1yAnAO;3r!769sOMcVoa^lpDP69YlY5(sxFW_m45@l>Tx){N3*x ze|x+dg8#wr-)e)Z@Z_lSA@OPno{l*IKga0Pf4|_a42mU{zTy6j5@IM>t!yS%w zrf(_yPibdx+dm5bX((@7{%ZJ3`P%uj4*nxB-nRY2@E7~r&C)Lhf3df8<8cY!VLi$T zb}|p^X`=s^SoarsC754}{%gViIP&`d%*Tt-j;_MI-w*wr);l9C~+D7WPboXJ6YqByuTWI__nLl9zwu7U_DsuBE;93hZs4-w>kCI zh2F+1-FRQ*v=O9Dh||sXxe5K6*n0%OH_86Iu5~*4C41bz8`{z2ek}3wzeACJk!Mh< z_h?tAS>yQkfY(`g|Mn(7{%+y@P;aH56#3^u&r2-+8`9uUKz}=3!_j|SYsnc8+)mfU zXg6=R_}62eYxBDyN5+q${}&i{+-1p;_Sfc@cG%8;X^-uArM!1V`)vDjJHzdw#P@sK zd&y7HOX87omvWYJm2#AF6Z!=5LCQhoNIr{O@hygrSdKZ9@2 zznJyRKYGJiPO+;EUWxvx4*KR@WALZZzRSEJw#eXat9^IfVDMIUaHGNP@{9tv%d=py z;kWG~3fwMd-%W-;FURDIjO$BpHuw#F3@-Xt0?)SieZUu3{6XOR!d|5Qgn;MvF!Cjz z!@y%!dl3a*i}g3*j{*Pp=cZgleggQc?oRpY7LzV}{Nw`eqO#{Z9|?>PuEBWI9yf1? z|0=AH+WxA*?8Ci;b-+2W3mJcPg#Tu&lV4)_=fVF{tY=?m`;(5m4ld=kEN0R#KUuEaRhrq#OSmf%+%)Foyak^)U8>DIdeF)SMrUTk3gR z?IrIsU(nGiR|pu`!Qghgw;233UJHJ^-Rp{SvH24iAK3ioq`_CGkv|an*m5pT!~bv^ z`9GxLKRJ#3C)4EH=rnRx!0uiL{SI`m0+Y|;o&dMdbKy=$AA`S8iRUZeQvL}!$A|Jw z*UldcI}vv8=LkP=+a7(l8-Cj^Vs{waw#PVd+a5#r7=GIx z!}l57wnyLn2LBA>SQ$r!fUibA2p$H0)1D?@B;O*yZ?@X)DDZz;?RE@!wZ)$RKGfn@ z4;VfFZt=T-Pqg^+f!qB;DR39rir$|^yL>(NCoe@gal1Y?KTEmbpN;jFFX2z#iqDD< zg#VH6nfBW5H}c^>4ehnqCe+YDg6Hh|8_;D z+@#-{3jbAz-}dM6Jm-_x$7`>cbc$URVn0>NeJ;*pNVy&bx0Ks?$cO)}erZ0H5&t_K z?S-@(%h6s)yV0yn|E-znm6vVY(k`{tFY!F)aGa;w1NkQ5J-`pP@Oi-Pe&D_|_;7^( z59qrV75(IVv&5gS-Q04RDPQ3W(vEo z3_b?!nyha})*9T-uNZJUzw+NO{DaY6%lOX+e7c3lf&T-z^y98Kjhw|69(&8+TQH6i z`T6S%ejnBg1P=m#%ECjyk3;oCr&1s(@p4F1``^WHZ4T!?ly z1Uv}53H*}YFz`DpJpUad=TZxg#tpvG!b?9g_yVjy$$C|Mv%xn4mvlv&4Zbh*6n%nQ z4BlYju}=+tw1vCAF!&@3_azK&x7X?`gS*H^xjxQ8d(|KPt-Zco3ICzr8hf_StIUM| z1hiYWzYqQ=!k!kPJfyw+-&)_W$JM(ZZtO_vZvypJ>hHq#&U)H$-}A@XCpFtt#$qV-wC zlYl-gK5hS%&Q6d09s2T)>6O-azVur2WrE{jN79}}f!q7@mDd^mx?PMtu1ERDfnTw& z(|#k141eL?PWz1kx9u?j+(o)_{w{<)?S*mT2bR6DJu#oeI~w*R?F9StKiR*Ld<*a5 zw2#uxPWK$R)7i`Eza#&7J;iP(@~$`ev;Ak&?#j5x2i!hq5nO8ccc6aD{2~P0K4%dI zp3WX69j;xS>DQUo#*4M&^K>f_zqC^k#PcD}$qJr#htXHYV{MHW`P&T(J~8Q+_E4g} z1LxAdMY#*^`q1#(c&9XSI$7u5L{7oSZOd5=Ja?qATj9S8cpnRYB~84?r-}FOPuos! zFQoS%Oa8$h7=HVFR-)P9BP{-Q;J5L;KQjC>4v}=dhy1kh4F9pBUXUXT? z)5xh!V?S?W9%$E#z0<_|RT?>CVJ8n+`QSzV*!Ac>@Z0mZJ%QW&E7QoC3wyThXHpuw z+L}hrHEHk@)3gsU>|3m|(t8Kuwda`=($tH8AicK!S3$m=Kl9S0Ydp$J_UFVNHN~7f(zYqlxffY0_q19f1BP8|K~wJvZ!mck#{oaKS6H= zeGN2gjNuyxx(IY5=&-TI{|wN}Kx3e4obea^is3%P!o}aF_keFL=#QYspJ3z)^};Pw zaG?@@0r*}5{RQ-p6OFu+L05pj1Nt3kr}2hQ`bD{aE#;qX+&2f~j%M`N!*~Dnew$lA z9)qsMx`T}GTl5_0j1DxfTKh1oJ<_oloQm(4n;Gd%%50De2>VNza|z?Y+*OL_T#+x0mJ+(r4$>i`jy z<4q_Zd!2qc{BvG1UwTWTZ2K{5-y^X$Q^#9=_9*`(74a zdY8d%dkfxe@T;+2#v0^GK@7;qQm9j}9~hP^z3c4LlZFERMf!M>L5zYhM7rty!%|2ynE+2Pq9 zSr5tQJF&hc`Pc}z;#?+%88Sa2LhF?SC`!c^9-tmssT}?Z3qPc}l*q zpJ@eJ)`gPk-P@T@Gc9)rZVu0S*x$uTG@CDBrR(QEN4_R3xg@I1e;g0DUq7S0zXj>c z+hXFe*B@iR&$Y${u1^eqh-7j9$4}}%(Q9fyXZlllQvXh8H|hw}ex&mL+TWZ$93;E0!&Ait6v(T9amwOUoPo;i?cSpUJcA*luZBIeqE{dDWF#&rz2=&^&ewGlpei^-o4t@;)MUTK{( zivTahcabDNqrf+RZE8>)`U)^f-agnZU-`kP@yP-bsTVm`;`gw)# zaP2@lGR*St2>;h!G2H^bWOzmr2+Ni{C4mO75S;(?_wG0+My#Yy9)Mq>MijL zm3sOn>ghL#KOg02>+b_@>mOTU%3bdLUOv&3a~!zbD?Z>PgC~HyND)qB9?Dtn6-UdQ zcEaV%?TN_073bCer}MuM$>cUu>N)+X|4BZ^k$;kpmHRpKb3WWbj6Wa4xN{!dhoiop z1N$z4`%1Vc!LCn1{ip#w3v@oHjAP}y9`^!Y0lEhCW6+;KA3}X-kMDnU2OR=h0eS}L zS)iAI-h%c}zPs}x@O7X&K;_)9wCi%dSk@=y9=gn5W!@_-;4T842rB1wui+!Pf}Bo8j(=cA+ci0MJ38$Aikf^_g)06I9_Gav#v8kT2(CH{twx z)>kI|Zy{c}cOvtLJ>Y)`Xg;VL)B`#b^kUH4LDzuFIjMnIui5Pt6Ysb1@3hspdw{w? z<$D#yaGwl%I_M{$2W~Ur9{?SU{%bgB73e=euLr#gbOq?kpzA=TzxWnz8UOB${&Xm4 z5vbe?mVW2oNUz)*k?#je`}F|A$$90!Az#)5Pk{FP)}*fpbUNrIpf`fP4*CnIjAtH% z9)JDL$dP;Bv*4Z$dN$~}pcjIE2YSkO6aF&Lhe74Lb@DyC{#d6t0(3a2%+oi&W#l}C z^qvU+DWE>kOF{n)x+muE^4*h%fv*OY{mCEU9*Fs?oXe7Pr***PK6o5@oDcjK(EC6K zAzt}j%1Yp}?ke*;xi{Pw{pbOpa-K`hZ^?NrIiK}3_+sQ1LZLXZn>Wpf?L)FpNCuSe=kJ1LtZuUeguEH zKQH%lM_~O~?%T_K{954iK(7Xsd766L$bA6#a?n+vG0^uwzXp}{fbLj7=>ysiv>0?M z=vB~vI^6Qz9{FC6tUufa|NB562mKCuz6$pS(5;{yvdy?_SI|8`4*(qkIs#O_Qz_p! zlkb@Q9scs2H2FT-QsDA^HTjO2d@oJDVH%E<`V8bRg!^{TM?u$sz6tsc=x3nq+Zp-2 zL5F}Af;NEev(cpMO1R~_M0dk2=Q`yar<~iAbDBSbZ(Ms5-=`f7mG8iH!+No-pZ16Q z9neofWnZb?E++h*pofFX`5`%96a)S~=(nJ9Zc@%e%K1k*H!0^o8<6hf)|mAFr?ZJy z?jy*#>sNtq0sR5A>#l~sFX%y_Wsr9q+$V$109^nY27MY-zHia1i;;T>sN8R@fcqlQ z%Rv``1`zKZa6bhq>wxdV-3;0d>%6kwE9=2Cfu9X}3+TO|4}!|M)i2?e`_*!vdJ**L z+s&j$*41Qx?^NJ&pF{3@+ys0XsLa1*zhD*cwV?7n&+p-u?{&KHJ)46;<@+{YqTCyR zUkrK^=$oKlfac)7LvK*IFCq6JVG2ET7ZY1~kdgFe~0ieS` zM}wAvR)7XTF9enQHTS~(Ea+RH@}0k~Sa0bIx)plKI*feRTGny?3ceYj7l1ASeFQWH z`U&XwpuMq=bQtK7NOv*ZGJlu*iLxH|H~3!xdNZi(OT7m7deEOh<@<_9^)z-j74&S- zg`kgst^|Dp^b^o5>@Udo4*S7<5UA`|$oE^SfX@Y$eK^^dycf8959ckon?YqiqXYI$ zx`WF16Xm;zGm(D>zi!$s*=Lyy{%X*(K<9y833@xId{??;9dhN>$YFQowb*#5Bq^0209kh13DXY z0qBjOPl2un{T4J2=XCc4Jsh;dyT(30g}!p0_jLHzfHr~#K@Uc_E8xBkH2EDYxIYK& zgmtm+;m(tD@}Tk^82R3boTEPl{?(v`i1%!`7lA$nx)yXZXeXR!Jpfd`_a*1<%Yn}V z4S~wJmjj^p65#Tk*9YMKFQ|O)<7>F{T&5fk2OR<`-$QZ3T?cv|=oO&1f<6TLH0Ud! z8$mw+{SH*VtI~B}6Tf`_Z5Z4INY5C!<(|HLkL(QK=Yz`m>pS6o7W8G%O`sk6oA~ws zJpyzB=xoq1=!2j^l;;|_H-XCUGj!R{$o(ty?hChk-%P%M6KC0Br`9@5U}cKFRv`|5sFgpJiw9 z%kQ_?eDZrPHZE@YofmP-@4bjysQm7W{N9WF{)_zXi}2Z0ehm#QncT?cc3QCs%&YMt*-M9iNTczkg%BiXOwE=m1bT*I{<;TlVYaciIjGUp}b(ew7Pu(_6Rf zSIK_A>|cq$@JoCmPxL8(ys@CApi@CBL1%*cK<9u;ymH>ooboikNy99^RUeTfRP-EV z#gk5+=vx5(fuNGkv2c$EtpqIvm3VC`<&iF4;V;E~>uS)MptYcNpgzz!ph3``$(ML+ zKEcz`bo@5%LOuv?%M-khm0tzeua$ZO?V0Ka>cbmNchZ(4jd1Kcsln~8YS zu&L(wZ&upeRjeZvhI`Ga>P9q`pw*lyzp9iVrC-UGS}^ghrBKpz5q z1at-HW1vrfJ_WiGbQS2cpwEN80QwT>E1<7|t^xfo=o_GKfxZp80rVZv_dwqV{Sb5$ z=w{F_K)(Uq0h+U$$-hpZok6>Rb_4AWx*KRu(B7bXfc6F58+0GgeL)WfJq$D-bO`8? zphtrq3wk_g5$Gt;aiArjCxQMIbS7v$XcOq)K+gr84|)mc)u4+&!=Ot*mx4w>SAaeZ z`V#0`(Dy+<0o?}r6KK2LO*wQ0?G5SzJqUC#=rN#DFGj*$3OX6I0<;Qr2Iwr%2G9WL zY|y`ho&)+X&2H-Rn%y$AFG(B+_ygRTU99`t3t z<)8~eZvwp!^l8x7LF1s?K->2=diMtH4|)V>A?QTV(?Dl|+U599;PXNM4SGH363__f z;LjZRGY9_6 zfj@KLx8#8DBg6G~^n0c6nj3EK>}&eRru_}Q4D=e%u$ynwDJA$Lzxn0~zu!&5(afhWv+>WR~9A4EgWOkbhf-{39l0rvJPQ`C}RK=S|E^ zpNSdrUy&jI+6?)7m1d^@i5c>5`IBF!5^d5<^QUWBX61E!hW!2v`5()Wzk@q7{g2L& z|Dp`}AIp&c%MAGo$}>yv1sU>x`6qvy^-91$^G9-`ZJKHRJTo~nd;U{?+xaeNruma; zf3bE-X64m>YG(Ww|6j&`%*lUj{`}GMGqs-wGfb~KCA0h)mLY#dhWvlDKG*-j`n;Q= z{69K>_B=JS^8No?{!GqL|4i*C)BO3P^~top|2M<@`8h-W5vOHlKbh*kG(-8%Wyt?U zhWvg1npt{FGvxnwhWzmi`Fot6nf@~~WV7cx1#qGJ=gqsDLKikL?f1&ps zZ0=1JG`D@vYHAw15(0v_2Pg7`M$a)fE@Pl7Xxw?AE>It65HtiD2F*Lyg!6$$K}-K- z@F-~hJmU_7=ADmlpr!MTI|Ld7U4OO7r#NW-<%UnvVbf=kUxJr@?aVjVw@!Bf+?5D0 z-|`nZLiatygdg~wp#`AgUun6MIQ|&8llyYxAb%?E=}CB@zBG6x7~(%W(I(l66h&<+Jf0oPgIbMF4 zpE3I%-@6`6&k%Zs(ld;n)PLU{X3~{Nb1$(Y?gOTV;lC>Z_|o|AyU5sA7Wjl*bhwGn z)uruwMZ+z8W)H(B@de=)c|z$r(mDKh7X9acc`B&Xooe`^Gqd&YAf_TY`U~T!NPA^k ziIz|u6n~vPm8ZMvZXxU}_^!7`3qgxP$AFfCR)PjWqo4)bO?b(tf``rTcm$Ul8UhW2 zMnDswYK7s;1FZxNgC;;-j~c#s)X>;UL!(a{>Uze|0?_yyxO?KFBr<#zp_~A zpiVwzy!o97X;l(vXJ#vNZTHkW+A;Q_jO_ z_}@x{8>^u2!~e@ECu?)t>Dng^F6Ya}TXIIH;XgGEF8Wkja^|Mtzcvjn`kZaac`^lb&Am^roi|J$ulzhMulDXSAExZhfb`-Pd<2 z&R^f@p+W0AU3>KUP797--|6d<)_1yS()v#Q|GvJ{Vdt#x6bi2IG$gdX({y@5^hD|D zkyzj9;BD(W?e^{ZP6OyUw(nkjbMBe4_X&spqu*ggVb?yY*Zu?P=@@)Fw-Y^A-u!m% zzv-EtJ-Fw2^xT~F>H*n`@`L_m=T6MsxBu`CyWBT1x98J!xd&wJz2AZKWT``sJfHHv zJLg-pYd75Bs$1yosJZd$#MmCp~-7lgqMh9xf)ULse5*UPW@Rre`5N|DoqP zdKS?$k)BF=JoHSXXC^&0^!VwiqoGaH?C+Eew+`m3NF}IGM+4NjPPdz;i^e}ch zJ=OHo&~pwwSI~1MJ^kDLD|gZ@|H{o$k95tYryV`*>FGdEcY0j(T$}Ys*UNGq>6+7( zuy#ATM|O1TaY~n1uL^o9>G9B`whbAOMNbYr?fLJVUPH6#QL27uHa)rYw4cx-3a4hne@fSQ{j-#r|CoJ4F%PQ|FCk}R1u+qXs z{xafI+6Hn?n(88f-Gk>@f7d=BqTR7xY9^=GC&+u^;4m}fvPF(cNA8Fwte{3q=VxRdXPF(a% zOt5gsiIzHX(NnoC9D3$Wb>gCD;uH&qd{+f<%FERDGg0NlMbC)W!XYP8OCKXFeg-eRAT`<=MxsUEa&(Q~;I zPwM%&g+tH$RZd*=bUkO`kRNZn2NX9XMVF27d=B;EF5w|pF45UGyIi>L(j-JPF(bierMs3AO0}~PqEL~4ks>p z2D8lUJ=aC~Py7kUiPETC_k+Mi&-`61T=dLy;-Y7KHw%aS{6498i+v{ca^j+AxSxeX zPQ1Sp7d;COv~cKIaF`PpJ%jlc4*7|pf}iEE&-l?!T=dL8#=<4N$2)P+(^YKYVxME2 zcv8=C77qE9C8>CeeTGhQ;-Y7%+rlBIbcz!fJu6SOaOfGYaN?q8XqtsXzHfR8o?@Tj zGn}~SnV4nakW=7u;-Y7`(ZZo;<=>sS=vn$t3y1vBd8v4deU@J6#6?eak%dD}{-sV_ z^bB5M;gX*Vow(@fy57PeKNuGL0*8H;E^*?bXXG{uhn&crPF(a1-)rH}Gkm`j7d;~n zS~%o~m#5+__L+FxiHn}$CoNp$Jnh6q&&YEY4m}HAa^j+A>=g@_d{~o$r`Tt~n@(Kx zOuS{`kW;YHiHn}0xP?Q{(8o?Zspl38hkVx;sd$ThCbl|p(KGzDg+oq!yAu~ZD}T0d zvCo_y=oiS|Xx=1x=5?@e$PaclxDM3DE7)TT0t)yK zyLT$`f9w7s>n;B{tgQdKdzy7^-_7QCBxU_q?!8vj{{w+U3; zX5yE4|D=EBz@ItrXAbYn4*Zz||99m;_kGvxQu%XMk-OMkSYG7oGr7>$ z@nm}3W0+2L{4Xo^^(iAxdWt5G4E7x8>sZ;X$X$3U^N%beyo@C9+ws3JxK~GCABsRT z@SCD3E-y;{r{KOkJbhCCE-wt`b}TCl&ZY3aKEZ!y5e;_lSlN#w$e-Wdx4bj4vnRjT zWe2-<^exQN&iUECbsd7;j9;JN0UWY-N8j?SV6Tq8;l4!oa@L@*tf+FgqTsn%B%yL& zPTHu-gA3hl|1UbNxUA4!?8~qGYugNh7LkH(PE;S_JzCHfT2$F1=|8#9T|_wt?$aDD zR>zlDR@nCc(+Yhqio;d;&lbt8|KhkN6|yE;b~4_RIVR)kNa-5m%Xg=V$BLaoRqj93pNV#yACwZnKk(GT6R5Ur6Qp!b2 zU1iUf1aq-;qr4?s--%*QHUG!1BC-aZN2F!ZDWY;eN1<1elmDlrpz^?!bc$i66lX^^ zl#@*|yE&6dsZJG^ED4wnbDvUNURb%lU4Af&z&u@f^2&>S11F6nt1Knk97UC)NB+8Y zRBySSx~LgQc~V`1Qy}6Imr%nQ%%Q-kf!tcG1kiMNWo2RI-o<74p{&zRtUSDEYX0i1 z%KrJyT`K!hYJ3A(``}GkObdJkq^66FnN-iK>{Col2DLV9^3)X3JC}f3<7=#`8acP#Q&&?} z>hXK(yp3M}xRC}QSKsKZ57acyEpDi9^f%P1lg~}P|t#j3GR{J>7J(A#Tsn#ha)Nu*oGLHbR|93uXoI;Vf>@9cl$|cLP%rkGTv{{7TU*pLouVG=t(h^i@kB3j)aj}D zMmPBDJdJF|%%w%A3Ybz;-8fVG^e(6vQ;b?u>-CSUsU}Cgx2kbMLu1YKq@mftwoQJW%yIS8YwBwnyF=-==>VXV(iNH#Akv^m(d{a=*qgu^y$MRUc^!D4*Ss z5}Nau%-KFHd^3Ql?dLX=%C;+K9yzPEuM*G?q`Rcv=^$ zj%ez%hB=gfWNf1wnqV-NhckCt0+i46dsFi*#YZxXYSpv`kH0!iP12U1!t-mDr-XVP z@2|-bhV()lT?^OS+6F)MKG!50LFvp=>oj#>X*0iAK&mJaCFSFb8|tV!dP{43-rAaa??`W;%3tGaj#({Q1xrZ$zgRSJl=%v(&2NhGt~Qi! zL+{nCijuS__s(f-@;mY(@@ra8_WB#Wb5diEwP?GirEYN{*_*G{Gk1JV{VWxnY3o^B zII3{W`0<{()K~=L=mDwIw#u})u*BQwsRiHC+)!U0v{03-uhyLf=@g)rZUVJ0EGX8T ze&kX_VR#G?zOq$jki?o=Z;7Yg!<|Dg+6F_3$5+n742QB-nkTqZ`@>=yO|rCbOD47E zhu*{+Q`I9Riq`#hEZ{ztyh@@6jG)z0As=`O*NyETe>gp@b%BK|nH>E%gi?_~4o>iWz znUo{zuFr`M;Yy%G*9B&{sW#G>YF$b&?dA8@dOZPZmci;Lv#P0Ap}i^U32qwBR1xAG zQ`<1jQ(II^y(9_g9u9R_5nj6MBhj2b;Y7O!!t=Aj^A8QLD`tIL0=XMKRkIK#_)f}T zuA+j*gjKUDs%Flrn9)Sdy$a^(qy`$P#qj%B8Rn_3si(gSD=Iu^d1`7s(`roejcHS8 zFZY|oT1_>|(^xgLqK;IrIFm7N{aH1B8j;eUb(A9&jh?`)ih#FvIt?r%G+L~lTU$*r zG)=3RR>RE{kFNU_R1{7wY^ttlaC-w>dy2`pW;FQc7S>IxA)}>S{|5HRgXp$-OQ~uX z)>oH#s~RX>zsfd^@*q9O&Lp_0Hxk8KMZ;4%zrRTjlTzzm>*!KBQ%1bb#PLWPgK8t8 zm?o6Ei9D;O%FDrunrdnr$JO&tsF-G#eh-&h;pAWAqhYjHcsV!I@s^W?`ersXHVE^t z38t|obp^kLb5d=i-}75_V7|io87-1i6o#=-a}@A4j-|n}$)XZ!ojja1lPN5X2d#F+ znZeYywjNbjS<+VfYq98|%voOlTP~EGq%j2# zYxXIqC@w0jCXE_v0^T~RL+r2TEEC8|cn%eeZAxj993!scBJL{up4wyw6uP!mLtk7p zY0|in9GNSRVjDx%rtuW7zk!;-)IM)k@fbaPbNf71-cfUC1XJy;rY_j)@w>~$6w#oq zBN?oNYh3xHvWmfj^7AW7PvVSpc78m#MJZq$J zh6>J4c5&f&a)zJUjX1bnq{xigLYl^$<;6IKdeS#jvXFcmsdb&{p6SsO4(2bSHjYq# z%{0z?J!jT(7&nt*PN3l%&8tJx^h~)0l&B0>E#=;*Gn=#^x7SDONjxjn0@!PGQ+<^M zYjJuR#IR|%yJ=brRLre;O5D_WH1e_$OD(1@il!RLKg~egxM}=KLzL9S7E_;2BU*pM z3`z+?X(*LxBsD6H)N1j90AevviV6KH| z@0qQg2s*01C8YT~O~BE#BoNRo&Wzd=)uG7XktY3Py!DQxk~@VNaT4g%e~h=WEu$fL zl;2M?1g$x_xC^22;aN!lc|{8r4dWYT*l^?_H~bixecrb#ZXRB42AXIvePge6zW zom>?~90ZY7JGh|jAaKArWV(?F=TN7!#6u~bGh{k)3QPtannVLmBTu!E(uNv6$kuvK zuJO+HHTWAj##yE{p^2RZrNW7}MA1rRu7YM!N2}b*pWB?#HQriE`TSj5N1-z;7~duX?{Ji- z3Rdqz6KTER5y3q_}Me86_sOxK(P5u6sBx`(kVN30PCyh(dF!qCRx6Nv_rRg|S zbPBT7T!?OaM^>ti&M=~9B-JX&@>`6V*0_quDC@jtRNxry2bZQ!`0QZCGd=Y)yr!ou z^7tqEd6uJlb%zj2j2&_mw=P_FXZU%^VQ1`AX}mOGDe=~kEllzF>#55BYM3cCwY549 zYNfotAr9s*^9E{W)VGldw*Jgq?)BGEW8dg)tp?RaJuV*EFuR`mWHJ&hK;ThlSaC7D+qXJZoHDllgv?S`g=)NK$e$0^hmqjfHo`%QP1 zx+|!oHnnuT_bhL%?zN0UDd+^=QmR!Ub>_NVXwslp8BS{QHhBwcX;FpjP=?{^%(#<* z^3vD93pDD?W~a}n`ZHNVOUQ)Ne{^jV4-M6s+nx9X?`$k5t2601e5y9&h1nYgoA2~1 z_0WPkiwik%x3^Jxe)e5x`8IlZZSKrtoZ>NV8a#~l zH`HN)l6(@KUERs2#0<$~A(?t)(pxVh(3p}}5?IRio$(4|a91PLERGu^;lVnOU|URP ze%o9o5LGW~sJX4-m_uOYN=Jg+)aTS!Q=O$EhmT$XXe$vTDF~e~puJ#b5ARBQvW_iT z5?4fvkjZ9%%wi`z6Q|Qc8}GuYGb3%X&TaGtO1=IvZobu-%Xh+)A}-n%tJyPVNvqR) zrwEC)#WilCyU9PD)*o2Ty0$oUnu@7M)dmx9i$!lfvw-GSzT*NMo@dHrQmuSxx-`qm z4GWU~dk(8dw%ipg{)hdyQ=1wOV66UASI2Mi?b}37RaW3ok?KC1hU6rixTSjXL%6oW!NAJ*!*V z%82%zR6m=>c@;D?XyUe>3_-&cv^dH$KWZn8yUtrz<)g*(nY18FWo*EfMe6C)N3ln& z%icR#ji!RtfxUBTOc}DvQ`MkT+AI#5?NJeFSAZAWsalIedj-34C^|R6Uh~B|Cy$UX!Y*ICQYp+Qlm_lu67RGXU8|#SCv_ zMI+T^hSvcO&^o8)i)#QW#ot&BF>>2Eq8iwPY zp|>C^beG2*^Bo+tPocwwTA>wMhlLJY3rUGB?C_;!T-q=2bEL`GmO44+*6VDHI8e!% zE)^`bKS~ z!94a%MmJwOr^{d~(uj7}HPE&OS&%riS5&(s zMXR-o%2IR2;4)UD9RaUbSG2fs(VT-tHfvX-w^pYjpi6kh2TE2*A= zqpih6$~1>>YQ(xQqT)?wf@oJPCGt^I%Q^nlU`X*v6~Zhru(Vp@BhzZ}N)4r>jwk(6 zmh-4cTHw?mEz4dy_Y>e6SAQ1mP*P2%@lDDiG8G;e#(SoDYbWZ494QL+FlCe~omUKK zkiw~%pWeHKPUq2@D)0O=XDG=TXsD&BW{Yo%E`_C~<3};~!X9isb!;vbx-kkfFtZ^* z?F?0Ws#w(8(GnFiA3)82 z{h%Y+V|ixH5^5zykE>oIcHSn$hjkKH|lHuE1VCv85$N&Z=!JbmK z0gYoQH$MqC)dxJ&y>ythrYa!>`>TC2< zEi|LYNGl)8fojV5s+lx6H6x|vZSm-#Yk(%2ocw4i2T$56ruoSrs%R~ly;ryLhW)W; ztd*zewyu>A56sOPN4%9EH!#(+JtkSrt-Qr2;qXb02DhieCjG2juovejGLADOD{D!QLswiI|CDwqGR7Z-b#F<)JowTf#0(^_AW+>;xOD zJT#4{m7G{=`8v%jV*93;*K&tn&5SxaeWc5kaUK^-*9NzAvoYhAesrC2nsrKA7&K0v z(Xy~+?d0Wmb|sQ7)9MTzlP@Jbb74LGlzwR(s`qz zXm8p-H-qo6cGk?mh7*Nf3IxqT#5lDk%kj5XBdQ&wX1#W<)=ta@V#Y!12YP_EPMl^0 z5*H_$emJX}^e7+!XL1g-9Y8Jh!JNS09-JSI{#u&#vwOa{&6F$zXT6Mf;Py@P>v9ak zEy^v0n%wRK`1oTX2b&J!iG9=wi+PyBtt%0}(=JLe>oo~(JHuJwk zi*p)Z`O%%gb_TJc5Zu%JZA?Ks{B&kRmweKtJr}Z*y1SOLX5g$qJy}eBqh?uZkYpi7 z*gd-{fTCCqXT8a3`u=o@@Se%^PF&cF-tpJz@Ab|K@ZziT<*Mj=hZ0jFdK?G%PfreTb~t?tg^!OOUboLHR$H)QK$L6d9zjkGL%LIW-1@x6mv zviZQHdMKM>UCd<=S;l2xPKDEAoBB_VZ!T}8sKq&yO;6KTTBv~3k{qMH_IaFrF4D?g zT9Oq|Z<0HD3kyr!s^7P3!MCwsQ>p>AH3!8RP}_4!tFes+T1SL!$Yv;z5Fl`8Lw zc1d~Hwri2MpdIAhK%gY${B~~jU^~?gXX(|Qxn!6#__Ui_eUv-KPvu)v6-XxL``mGK z_-qc$dq=K0x1nAjiRSRBE?c!Rhwb|9c4Pt1uzum6*iPf?`5pd7+w7OeW%0&@o0@sA zTGgJ)?jy!yZyuMWv1+w}!0=ngU@Qu)Nr3UFaRXd>8)v znojhNyjDiGRa@gTTdA~`s9x?%rew39VHv)byC^&O}_H+ZuN9Wzq+^+NxY#y%UZ=%Hne3tX<+J{ign^j zg~jnVi8J=E$;1=f)`$7u9YF8+64oZTSXcC)%Nf6TKaxQEB((T;q3KaSbTYTYRB#t++Ai27S)ni4#jS3noT15y*?**Lri_I$k9YKX)MK5f=F?v0 zT-su%<4!Mj;)TllcA-R^%S~uRzr*xaIo$Lu>MX~JZt6T~$Y6DQXHxuPY96y`jhN0l za|3M}N_9_X5>?z3pk}j(j{@p_wP%Sx65_&&JU)otp_~6g@9HJ&uUY>ReCfh8oq1U1^ZJESBmlz zHz^rEmnvO0ou#6^OE!vIx=IDRgLop3P^HRlP|La+-{%R7nh>ZZ$Gx(;H_~?J>qnlArBvD*Q-&N0Cm+sF%89 zv+$knddCe$@HI(`Z{)}m&+$99Azw!*mi}}P?h;apcy$lb^9S8ve%FPviT1mBGOo5+ zjDmkp{ITn}VGAwN@9X+!m+&RbTXv&uXzJCP)E&F292mi?J%w z7IUeEo<1pCUxwf+N~wHrH%qxqyQy6Z)dgLP)hk_FlD?tqD06*-`%v|MSFUawyP5WG z6rI?m{q!61Xr;?LN8OTFsy@vtQ+IWDs~@_TtLG>NeX#3OQYHF0=ekF2?@+5Y@6wsViB8r z@S3Du-`Y#;`p#ZdL5*GC*o#a#(u;&?Qx0EAA0vd#{>Q_Jdt zUM*eCCA}Oac4aS9Vhekfs#U$p)O)?$YDcefbyIJY*m8;~{4*PB=&li@1}fXE{rk3`h@b_{ahVJ4vK5|E|EE;L)3Z*{iL%BwUZH_3pJ=8F( zjeYcvBxx)ow`LL%e}V&tA8Y9#)Z#s)KUlH{G2Ebgkn2*UM+r{Q4=Iu7t36vHeQOVu zO&WOTc&khObe4h-?FZCzd!#ttp^%}+XfV>Ax-Om{P~XF~^Xi^n^=zM-fcm}<9Yf>w zTW(djBHXnH9k=B_zSyJ5T!HsW-M?Z_D(a`oSdAxnJVYb1=`}OdyL<8(BF?doh#`76 zGlYpv<;bC!Pxhn+qe_ln?AX(kh=@JEFJE_&#OHle<`MJuqRiMdiS_@Nu4j*O&l|jodfuFt*5TH@ zQd+k=_d>_p;vdDHT~eoF+O?kvsT2@n_c}v-Dw~XZNOP^zbC0UL%(9 z4V*2p3wUS~{fWn`vDX+;; zuIopgTVN(?&epwad{S83_vRgna6gqzoBMC>3Zp%JAj->G>?Yhw_@|PU*{krR4%JGEn=9(QRGo(CZ zG6Ho{J+^}JXOZ=HPifjQ{YY)A61hCMO>7JDU~Cj9(K9ar!GEK(-P(v z(jvB2cQk9b7Nl77y#D6afteWv)W!WNB^#MF7Uy^3eGXuJ)kFQwDJ^qe=&}CdL2VU% z>Vnry_0(!vev6-AQ;2~pP;H}nWq+OT|J|RagFF@`fy?*TYcc9=4xyK+BKjSs zx0z$@*k9&Y=O4gxtOW-UXY+Vg;Uj*BE+}C|KA=fvE}u@V_tLF6pSt4!7{jsy#_*Y` zhYrxE6d$9|@jG}zYOXY_Jit#~k6&#jJb0a!^bSjn#`zt)M9XrjXtEUdsI=_9OK8>1^s`m~whfq_XO$Vk_lTQ!S^QLO`)q$$r zNcA}~K_`930dxp%E-%EH2}eMke;_r=dUiNNpaln-1vK>?38=63H_+n9YXhiXpsh7N zh=jQ2s@wJts89FTi-78i1N2JSYXhln{9AWV%XxT4yXM-IRvlyxr6$9^a1bT^DLu3Q zjBP1);bhK?2)~0D@jH6IMlRNW-#3{|flsCDtH;LTFFsfnFhU2L%QZZ+x#nOBdMO7A zFQ7mjMw-IidJt@3`$2Re@|S~jcFa4tR9$~?vJsPp<=KM+>Ln7B(5olmMY^ySQ}O2L z8+n%;Qo=(K+7SwTqizy73Wyw3*Csn#$q(vkB6jOI#A~xsYGE%kmbTdDY4J;;57Kt z?kw(Ru4;PHL8)ARC=ZsNB%a_h653ub5g`T|v`wuNw z&m3wlubPZ}lcRi$NA7-}e{4LITe&4PET@4Yw=jHdR0sX+AiWH&)*M``qKDAeQ0_X6 ziuo2!b?`P$Z|F{bhi_+mJ5--)mE`)mDvfdu5}CQB_pLJxYL zJOaJ!GZZ@Vk`DJ2zaua6JNy8J=upJlRRMMP5xS?P1yW9>y8j5WOZDOr+G0OCBBiE( za>OKkZ4%)UM+DTjM;Id+GVv&-)t=243e z_o|DIs8Or(DF@%@J|rAJng(Cz4x+y{9-TGW!~654QGB&_b*mOp&Tb z2fNj~6g=?*_whk`)1Zp`_$!8>kH2;Z36J$A-}uTtSv&)wc9VBJmJLzabOXuj9_^l6 zH?5&Iz(vP}c*77D@DPPde9BV8uXE_g3p$1uNk)TTA5h;$9MR|cn57FN^YbD4c$oU0 zWY^HVt$s#8Z62aO6s0a2N-AvD0yptH_6fg36a~$&Myh9qa-%Pn@ZwMs;IHHL73tBR z9Ljq>F_My4rbBMvcjRS$hkw!uyq{%_;k)FaVf4CY81a71KEe5xgVr{8b-?lk5cHwTROhC`(*JA3$>M? z(8ny0$8Wm9-+m;Sf2}(ID2hsFb5NICls3>PA+Po3R)!09$x*P3yN=Suc;8WEm7Y4& z@TkQ{v2k!-J;JzJa8#p;k;v$)9DhWoH~umSqd^2Ear;p%2K5WE#owi@Q1gb9xA_nk zU2f*@&TKu3k0$(QIO(QE#6FNLdyKHet(20kv=}j@NZmRVLr@;L>oMcXjqis`;pLb<6O{Gzp^QtQ<}gIf^U3j9cB% zwcPLPO$igpV@IbnSu2kwzJ)aVXgBgib>(21PF*;}Y!|9GhU+uT>iMJno@vv()o3t3 zq!5wMcnK)-xQZ0M{n+SxG+8H58_u zSsY`f=<58{BSx#+N09$xBXr819}!S*un@iN8Q*wl7Ov5#;4w6e;V(q04I^kLQ(bTj zDRe2ff#G}k9ihDns#3I1bN4Yu_WcwhCC#@T<5tTlP$I_L8Sz&}&>9G>cJSz%4Q>N@ zh2PR%>v?5|c1qQ^$C#S^6Zu7dIEI5I_#OU``9hnRk95EB*wmVR>#?nB_QGSiX5V=% zNqK|ACm!T?{y3?`|7H1`IZ?V2zki%m;_qqIm@Dz( z<5DW|1IHyR@yg?<67QhU(QO=4=sg|Zw-VnIe<5t0#x@JKhOlUm;_9O7?EA+Qsq>Dt zE5?<_(g6He-QIn4>{vP#@%^!sTRV=`rn2C;Qg!8D++N)%Jn|P^)mQxmmEoz-o&_+4Y^9le9!p%?ibxt&7fj&7(T8~x&V z4rxm2>*I~J{BV4L?oX>6y^OwAGpOd{^~RpMpnxQPqsM`-(atr%^&NedH`T@A|x$S{Q0O zJ+&CqrcN<#Dr%}z+ep<2jl9T)=S^XS=jr*``I9Ku^lA!qI#-SwEi+uTa1I-X^m$T8Bz%i+5+nFQMw{LP5gUK{#eSXueplF*Nx2@%_C`bJzDj(@Q@AlTYgAv7_qw<_xt2dICcwIM%`N;#m6N z2Cdq>OG2afuti5-9HiA6MA<}#4D@{GfpPqq3p0UPF^<&Sz&x=x_#OH0ASB?OaVooI zC;Y8(=F>GF5`Ua(2^s2a_0>4NHgn+#WHb-!&<_pD(orlTD0txz5*R+8x7%?zg4Cxr z*01h8VZ8oK;Da1;71z1wGdlchtS6mNE~M=)wc!Lk$9kV--O1j;D_LTEB{R8cT}lN{ zln;bla3bmcG)oG9$?uSndNuzYkL2qnSyl~~oTzR6t`k#?>An-yF2(ApaU=ce(i2dL z^>?xGSpjv^3Hq~z>d_O7E$V6X8z;Ec<`c^GjVtxT36s?&Ct_r@_(V$PBcxQEY7_0` z)#CJnHqXn((rEazv1DreX#xJ)r)g>L;rSr#HJ*4D?e9@BJ~*Dn^+oEJF<$lPcuLti zF3~VmHF~dLlSw>DKQflh*Xb9O=rmnXLS7owebBWAy^YZ=dr*MLk1Qhi8NcJ(wSmO- zJ5i2dz*^!BZqi)e3f5dgg+i+p>uIiEN=wQ--P8&Bf|%oCHJqMpvB!ZA)uB`psg2kuFPDLe!N7l)jmW5<6F7q zi!I=->(HhA4*rLCSor9IE{_W)aua0g_(c7|tTNg(q(i>cbzV7IsEa<#Fnb{*+i~d zYF;T@BL|AV@QzD=esI7xLJS2D7&mX5LOjprTXJ@wV}xm$I9iHvLRF7c}7 z34C3y%BwS$T0As*!HJFP`H9$4eX~^W*{e%Vq9knTLP?0c$~zZ{@3|@^w&$aH_=)`E zKk4fA4ZkDX#OIna;#;q|f6;HMkkm#~>h;1|q>P8-50|AR{JgT3gony>L&N!TeOXFQ z-C5>Vw4Fn{lJtc(-8_7I5+A92jbaP^$a==~JIF@`a>&RQx^<1X(QWG1t!~os240bf zEY?RQqXfjB;;ts4-?7KJ!_i^ZxV1UHBDk9@1(YnXX3j4SqS$fIU^Lg%3&_`R=Gat5S%0j9WI}w+S7Tj#7VpY zI?rv6I^5}|(^IsKOP_|KUFV0K~e@N5q-< z{3On>FZBCde#hSCcPPv?GrW#=sItwz-*uCz48oI1%S#BPU2j?wxoR@ccy6OZq*!;= z2JsLvg|5@G-s14Z#Z>Im`RMEV$s<*qeXrGfXWueUcpJZiG)?7Dyj4c0a;B+^r|5ns zG=+8->3&&Loo)|)nM`$G9P_4dORKJ#LP9R(;6bf=@P|_RJ4Om{8S7sYP;X2@)!0DH zu@7{NH&MRinnHVR3J)37`%|bZ)+>|WPH7pI{KP@7XZi74_#OU<|UHVxrjCh zsJL``=TFA)%5?6RO&+Ztn>RWJJN`9VeMwS$V)qlb-DALfrz_YNAZ-WfDTZ8>_Z zy5<<#>Ro+Iay0zuU%0VcTEI8!UoN2Ls%V1xXe2eebQqI9jcCmzE*Mp+qGQU`*JQTW zpH!}vP2yF>(GB|JxndNbq#EzC(py%!0X&5&^dEy zV}1tM#_AF>VV_$>EoP2=V2OsVpipt*+&t>P{iBNR-_Nx?&tG|7Gt3)I9)SZph z3vl7@YL#rP*4=rY+Hz+T72t{+P}^>Kg?jr=y+sq(V98ST)tz+y>a+hei;vE#F>Sc# zd9+P@(sXH?VqIL-CJsQYZ*!g6-sXDsahn^iXmNx3zD*7T_MOyy95k0+bZ1NT{he4W zrq!h>|G~4yZIKe*ym&?TQ+y<9P+qF#h&+aP^;27PnQCkvDVVNLM$FVJ@(=6p$ykk| zz2@H4sQqeLUVhhvV0B&}z}%20@ZsHCM_!zb@WKlU&*bINg|G8{<*y$onuzM5{V>f6 z?S(fd_|BB;pL)0*1_XZZg__n5jt3qNXAun?bY%K+ye_jdk4R6pD;}$Diu<5;DCuf7 z8(V}p2Ko|w`pfj(3*Xqo8qk|=a@8O0uq>gU92nFdO#z$Q2wQ*qIO&8d@8~A7gl@*! zEakPAGf`>{yhIO?)ef8?>+qNa4^unaQ~eVUZ@`(Or@Xel$84>BZBO&hYPGLD4jAht z1%8-7jcDJj3kDdxWv*v8HM9NY6}Re+Y;OCwJ}hcqtPh*oU$5S4-%1VXppq@rZ~02~ z4Yv6o>HwSGqZNc`)g`b=mYy(#@9A*xv4Ah((w$AS2YbwgBCUvXxlDV?oW^E;A$DfI4>XCrJH;8t~v_qLwJb?*tf&GdfJ{>Gi9!`stQm0Wgx zPEG6BT)o(lA3#^{cf6%(YxO0(IC^{A|57*dku=cwF5R~~Be24*JbcsUemmNdP>U*V z!IM(-msbHJCe(lndngWYCGaQ+9lB6ED&i3b4*VI7;2@mb$U;vj*T1fiESF8_hbrO> z?X4cclk3&k&6*j%O_8QGb1QDrCsENut2GrZ)tkjvzy5$IobMZwtzXf15b5u)>D%3- z|Nfz&)mnYl2`)a@`~`hG-_m#ZQN!|Plp3mrK_^|0)$5)35d6EH^c}#5ovz2ZT6!G+ zn@;rls|xjNCoF2Vrz7M0I?=n_)R4{?bUUhFIwJ8yJ9SngJ0pT+x{1u!Wigj-`M<uuq>218hgaBCsdu{I{rhdzgs!L|V`y3teogo2m?`bI@0G6ob=y*Jc10Gc z4R|yA#;#q}Zup5_I1zsQ540)xR*C(u(^I4GLQ%_m@6zaALZKDhHKt^@}+q+6@_MS05YMl*npYQtUh8aXwu z8xn!jA_($_>ny3t+v(z@*0^XtNOzXr?@|xu>JBQd>gxM${8-1Y@Z#;lUIxu- z_W_*I)O5o!dg1-kR`}aNSeQ-gJJ==N<;jSZ-4WGbeG|L$EDC-YIl_+=?d*>3Ha_?TiAgx&Q0t_1c;x43uvs+)9~6S||LarZwcHLpANIJ)bZTpalJ?l-IV zU`Bu^OR!UXz&jb$rf&3hm+$ZbhZbl+RBzNPJz(Sz$}oQ-9kP)F@qf^sYVlz%HK-Ed zeNA0C*PIcRV$U2XqKBHmyZyZ$5LW2FhtMfYyeyISq}8*Pg?K!=60evjs23@;t<>m( z*Qk%ucgZTksW$y0D#oAT$XQCEgk(k|6 zcN!eo{GRc1PX{_#+7sOcy0inYt?C)y;7scYgVp+;i0>CVe$u1BBZPXmCyp@=FI4MX zkQ~y-k_uRXq&tuWm3ZZYINn%^A(Zn;hU_QsKAT;YRTVwxJs^ed1JoZlw?3nQq`XJT z3TM-h87#UPCz|7teMm35V;cZ_n$zvQ+E>8XJ+c?_<2P#F&Q=`CivupxDC6U-vq{i5gmUp&DPs)mG1SCRcG;>boNKXcc0BMXhZQ-E!B#uo7HmocJ!H3cSjS1ik6{1?Jb4%HI&gZ-A4?gvT*dH zpPqhR%-4ShLvp=oYEP?iV@~TAPgEZ~j67Rid=_OS-ZpvA zZ`>%SnhSVR^?yBzGQGN`T2|dky@+V+mk@uFy9<8ObVxN-*3YVW^q~$*w>JHfm<4@c z*dE&3)<37QtPf6nN}nP-%)Qmya1%VO8`_7|WqCGLDf?k6_~sp8xW7b3Ot|Ps-f%KFuGCc3< z*Q%%d`Bp#lQfh0z10K_QA0DF_v=$vrIFHs%Y3pEgf5bDaFV%yIwQ#^qJ!zA>qgpqPQQuxZ)F15?Z>dEb^ZQ>}fhjf>*V_KHL7|@SpHrXrzX^vU z2asc`(;ElS6ogKi;=sN7m<;Vvp{Dnv#qBRBjz2D-Way)?0ZynQVQ=eN^~PC9*xPrb zSQgP;WEeC=GcFzylf$d8-c9vFg?AV4=)SlcOANAqO0&)gA=rQ1h!7$@YDEtpFlw#5 z=b%w*-93o?oBgBKmV0E>dh;HYg!Mn)jhY?L+Lqjd^Y&`@J*phD#;1CB?ur)*R;eF) zcUNH_{py2{`c|q9cT>uXR;%ak#&Of$)!5LX)0(;BK}q$}-M!U!h(7#Q-zO?SDZ7thWeVSCYD}>GyGJ zk-_E@m0oiMH7q7eI2sH*V;e@Q5<=K0GJjJ&kfYa}FJ`SgBv$xPq zrzHEa2jr%c&wcChfAIszAvr)h>;cJCaX;&UV%DxexZzkDa>LO#Te2QKK>dQt!9dED zKtFOC>F==k;ORu$icdvPwJkap?b>)oKGbKS!{IcQviImkl><&Dzi3q<3nAQm05Ufyi~x$8#;TD*aE zz_pnJtsET1Va^?B(H=1k4*Hn$6O@?V)jhiQFFJYFj_1vb;J9S}`D69x1Lm2|v9`s> zkmuQ!K8O6(K(ZODNvN-5DHDR3#RaWb23fkxd2*&SLi<3&&aiAn*RibX)BFMGeFI;|$zPK0X+iqi1Ox3!bFmJ+6Px47N~p zsWI;ujKuFhI$1njxqPst&roh0Z0QN>D-@KsL?FbvO=1!8o=K z;CV!eU8L?fd4p%I&^_Q(ZgcDfb*Wa9hgg@Xg+r{C>YX7vW6?cpGn}DT+()ZPLlIW+ z6E&VF(%&QKJN!U@zk(APJS_K)bL-uq)^%50u09-U#YfOS8>)|}#OD~l8ESD;i+%h! z6lH`N$n>F>bYFWZ((p~)UA@8GZ#AZ3`c`n~FiTgwH-^ED`w9&W0SxO7!^#+LhH(pbclLlxW#9=o*fRq(OS}m z8=x)G=Z`iHNAA5i+@eE9?+?d12p{fKdxoRV^PDhF;KJcLOO_8mC?6glj$GDntx#W5 z430iJ8x6aNo)ORW#LvJEP*042!uz=)qIP%CxA!4^2QM{5cT>@+Yk&302qcxpwQz(r zKz&7IoF0061l;P3QGaO1m3{gfjpf-97M9^hK8VPCUUi#y9YuzNP1NsK(kjsa_3VR| zu`K`MgH}&D2(*hl2aBo7M>EgHw=;+S_7UG|DjP9A6}R_N+*CE`#W^-bM*I?46e8vX`52-#k?`fiq93ihoH)usb5E0 z^gAGG=_u=eIvnuyD1L2)+CIvX(*Qe1p}+ZvA`CYtDJ6?2ubh|lrm)^;w)GBk^a5RR zU)0~l9p+a@TeJiE_GpXun8VRXQJf7gjn>(qJ{gVBovq|Ed>(V~{X5A|j<)tE|GCjt zGxgVK>>Tp5w-d)$H{m{M>KJr%vOBE1gf*ireVn;iJex+NE7fm(cE?amU+CU=2My`= zuasrZFY%u5$gz~ry*eMir*HeaSoIjGfa?XY2v?%^J(aLkV6ymNQZ>+-?|) zMDO449WoZ?RA9(JcrL%c0(-6K1mx{CBga{?-|CEmlSpsGI^-nTOidbR#Z7hTIE$CO zSCKPMKQQj&Tj{OT0c!m?>*@|Teeo(@dxHmKa1*ZH9*4ZbzSO=k7VW40IM$-A(~$fJ zpWcY%24CGs^|W8R0liyPw!)hjCpsv(;x64(hYb3dT-uJ#zlZ4W=+7Iem@Cu^4pK_T z3iUz$ryQ%eL#hJu>b|Evy`w!%pue3T>F+SoLGGk)|6zT73eC0jHs6f#d=}@?@d&&l z)=4Liw`locA^5;e(oy5leHM2~$B(yqs*U3jX*fzpI+nh@cPV|m`}reW$iC-Za%WG| z5r3j{z}Q5b^pMrN>)kq4(;tFcf42_vb28W&4pWm|=qD+je8{35&*vVJ3ddWbFOd&- zE4lSB|HHRR0j^K12+!{zpuW5sh#oex9DTi2`YT^st4tm~V{1D96whptd zQsalmCyRpC%n0i`weUft=B)=U{(aP9*h5AlQ7c9wQThncujr7}D`Tuy zYTr0?&isQh6RcYsHPVLae`~E8U}ll72U8J^5gxL9aZoE4kb*ajQ@+8yJOSp z^wsoM$FCo@ZtR2q|3EL9a`ZNjyPy@^xF6F99R*ws^xvPI1z*_VxEv>`G3-1#2|X6> z{sb3JLI}a9MI^ogcn$8cjnt~AK7;)^c?jO3nP~LJ;WV*{_cHWaV+@-trED8)Gt0zgQrV<>8&1|4x{%kB=uH* zPQxgo#!W{=zTTh<^wwN-(AM132tfAcwv$U6n{z73`)OOJTl@FWc22ii#=CW&lS^-3 z9aw_Hw%ydX2n4Sw-CyA*%%GO7KAeW;gjMJ178Y%$%pgzt^>zN3>!~U_^xm_V=(6(^ zP3nBTrD%UeH8JEZ#o2o5^5FTn66tNj=%8)G!87A|!h4gQy1u^f$$Tw znbP*?=?++SSFg^ny7yGS&$Q46QHzWnyK%E{zs+knv{v%)EDMjoAMj3);=SLrS%}Tm zPnEl$QTuZj>-!6*5&jMa>D7V1^sI-b5%F6{rnxjrz(Sx4-~LG5J3e@m9+UC5AG+v1 zh@2{ywFgv{S-8`n;|9{22fGJk+k>ukL+f~fZJaCjS9n&&MJGSsl?oUypgiGPx7}QH z9#CY#Dr%z63R;?$cC>kRF_X8=MkaSeg;uY-$g_4G(YkTJ_B<{po3(7xs;BOPo||D+ zs@b!w0=6L#r1ude%HE@srvLW!-~NYaOE|mT8*gpwP;o{4LW16E`W(8ap+!wSfW~Jz z=FG8Lcf)pN>;t2kex-+6FbA>Nt7!%h(Ay76dAl=Cr8CEpEzkJMq&XJ7>R{O%Ow;$j zx8UbF*1<0__=Ca?UZV{0U!bO3?6i>R|9WfVOOMJM32)-ZKXD9%&bl3 zp?#y&4v6LlQaV@}K^s$VKYGAu^Uz$LhNy*eX;GTWZ^v9}V|s_k9>Y9Dy2D3Ezzvknyp&1Lx(w@HZp>5^=nSP zjCZi!pO1S#Y$A=HZ(#v%@q7#0NKenVE>yebV?~RGOugLs)_m#ycpqyI1?vYCto@Qi zxM%?x=`A45Yg)5QG*4;G3tIEG*1Rd2-CFap)?oWhZ)dGpK$Zjx$dWG>z>;4VU?n2n z()w+lh0*IT8mf$FyrA{C1AlKtE+l*5q0;K>d8fzYU~D-w(qTW zEVSsCXx?0C(HUpF`&WIt5X07#MHtq<&;gCT1_AlwuCdzUJ*A7u0{s+{uMPIJ!K>(U zq%Q>e!c%m?T~C%e>nTaEEk@i0oNmJJ^t`Yb5xk?ljHI1pe;hpugX-|hVk(3`;k1Nv zXz5~$evfATVi^3%Vymiy8oY#3tONFRz{}`Ds4oQi!dALqZ_v4~F9h0)zTj;jTRxx* z0X;;8cLMcRPcK2YjMdK9msmY;qx|U-j9qvjmK-@>=uG_LB8y&li$kPp@={#(me4(m z_ZWSgqzImlmX(QD$LAuslHa^Nqd@90tb4i@O|x#R`Usw3xn^E1ys zEVVE##4Dlo3q^j@5zZsG&V21-F?~n)Th-{Omy-Dh8a`cWb>inkW3OK?MfFsFEyWmJ z*$1l)w1ZR?$1-afYE@5q@G!pe*fJ!X;-q(#cffC^qa~`v%P@4)BY$m?EId&aJ6^Gj z@?j#G;?LA(O+VG5UvlW8HZ7<0&ZdjuY+R%_%TX`Bldd~D?fx8{Q62G%H2R6w*y7KZ zTh;Uu|Mqlfiq2DgOMYAzt`EU(3cb7<+bK&e{*jy2OD)NO4*C!bUiweJlC@!}RiSnu zH&Bdtfj^f9J@oOxQmZq5$V07NMz`hFYRz&BHwkDD%aL$wJH4?SX;nWhxA+HUW_T3$ zIGUl^zv%fJ{#Hqjd&&y-J8Oj{#rD_=IFI(8jdvL@ra!|iR0VB(>nfpkt+4Pkf_h8q zp3pk|?QGSp#Mc#8*U~`O(%~x+h_3^2H)uc;qL0E6;?+a7{>DM3ac}{kX8*`iHzx_#;inx zz>{d|k(CyHNJGtCiD}8km9k*=BBCnbfiSgerPZGUcuU*#IJ%l7mUsH9=a4Dt{gvp- z+o^4h)IoL46!(8<`NFY625#tRepjg&7}A$32~s?KYRzH5$ls{K0J{uk*&WM7Rq-KVamE_63t@t4VnN<(KKQuP=N0@)Wx4K0zi0FOt&R zu6?egF^1lXzGf{o2DORY*(-H4wHDmHNe;p#vci;9tF@r4P9rUrA}CfwyCD9BlA{~cU#Ae@G1J0>nQMbr1h4PHqt@3utb$~ zP+Qhn^#1W+orU#l_4+z(>$^HE{c==?EnY^Z&x+n$a@%Q@A@tN-=T=Zlal?cvu?Pi(F0>O~6pIyU_5FIQpG++lZ=j%cVF$Xfhi$|KU-wWh zzHtMuyM)ObrS;Dsy{r2xNB382H|lz)MsLJm{pdzZzde34xeB-FqIyo};S-d-x+#CO zQMcXCbwHn!GC(yz*)7&3fO;@&6BYXCO$Z~>7rU#6Hd&Qae6u$pi@Q>f@ZLt`-?tkr zc_DqA74{~py3>VJ9p{sO_iYN=N8X{Rbj`M3K{UxYqdwgvIrH_VVxIhfIPfYb$)OM6 zLj9)0nn|IAGssM-dP_G`)myb0G5J$S8%@?R;ak`1otvp%zd?F;l1`p_Z!;zCOS%-f zN|alt{!v9fiqplH5U%bI;i!Vb+y{Q8QJpP zW>l*M>~!-MWOsM9ZHuK&YpUK!T&6bEXr`ium#fJ~U!fj5uDSZ`_$$>rcU-0B(#GaTc|gC3z;+}Bdg!kUa)Jp)tZ zUuMfI?c1tBk6O2=)eEh5>X$`U``-HZAJy!|RtGhH30D0JYV{IyI=?QV(HWIl%~)!6 z>57TyqaG%$&#yu{=AwsI3m&)VmvVMJZuP?EG)})zHyNx!sjS$5$?9{cnQF}@tFM~6 z*}`uPsOOQ=1YYIVwnZh~vZ|UbFUMmj-{NY}#7jCgqB?#ZH|ZYjlzOH1Aj>&CxY4QM z9Ol(@>V-)^8I|NR*{o+}e9K9=HM2R}@=Ah|pr&WJC3cBp*;Xo@@{)F~bX4xuaFd0| z@~whx`K2j4;ndEg(;4@eOe$@|WoU&p?AlJLTV^+K>bVV^22uU6epKeyh{|9|4ZGYw z6ww~)9qJ$I9vYq-mD-71I+sfOwNvR#ln5<9;Uohqu+k~S`rrTfYKlG%*#&3C5B|>D z2_)k*yCKvisnGH)ueMv}l=#Uo8PtQlk(KfjUeYbM4-3oel59|#&gFxeZf(1cM{$>@ zeYmlc85e#XD@^9Hft7Wwlxr0{EA3hNylVl&TK!qDUzJNa?D?$#3mYZ-B$T%1ZWAP8^P1+>^v=Q9NGYtT8I}fCKJEW2YT})k%EMNq zJ)I}tp_Q={2*9zj85BhUMUhSy3Mh>IMN)7Zx@At?pthTcYBNe3rqY-EmG?jgHuE0aoPykuZyL&WbQmDwEq zmqUIfs5nq1jmi4ZaC}`$1O4q_%?t?OF_ zlt);Ox`YoZAlV-z-0~D6hJjHc=OIIJIij4x75rrt@~DOISl~|{X)k2+VS-|D;2fdj zA4(oC?+U02CET)9CMZwmq9keoYD3CP1j#(gt7ghSH$)pidqz&@ZOct$vVOuxHO)I^ znREe)R8-rpna*T#1-B$@=3Ei9jau2c@UEau)=N65PByYCn@5wP_LXwc$PqHaqxJ#w zYuH4IeA=zyl%`!PSAaY2&+;j@nOujZPRc(Cu4{y~-8x<^zn)#!|C^64&932;1f|Ha zy3t8td4YmO?joVtphnhBMCinVq+cUM;#^eN93{{#56iIy`L<8Kn&)`+O^hjyjd~OWe||e~6bzhp>_Y^O7O*2OsS^ixRW49&1pW zQ(g_HJV5yu9b{AaR9GXIcFJw^nQ7Qjh%A_f9K#pNB1|Bka#3p_;9M9(vFsgUjK`%)E$gF_IF^pj8uq2yy(3nmO&JF9Jt0~weo>jb;_* zTgR^L*Fpg%U@kg&H{m5Rsa#N!wW$w59NDa!^pQ6{0(Y#egFeN|pqkY2lTj_FG@FM5 z*blQP5wIF=T?{B;5@9CuVck6HS~@^?E1z5@PYDhZSsUg!D21$jNH#3ZrTmgCeF_CH zftuJbjmC}K31D*GEwL^1M5(X@-41FMN`}lqL@=EGx%lTFVwdHR@iJL~{hsBa6u6nB z(%GOK!6j@A^ROk0#+c1z{5mLiM3E*d%j`td&^{$sa1x>A*G85*$?!A}L${sq;H;3L zQ5~5L+w)=lbeMFJWp+|mtt5;J5T#!?AC}}D%dd}mMpk<8TR`>{Y}6afZBX@avBX6l zA^1|yLS7{!)Xo5ogK{5XI7m`Zl1Gd_^3kyh5yEhxKx{w+jw}q3m{@=pLnjxNh2>sd zJ%H9lG3o9Cjf+ewO*x0=k@c`8M1N6|@@r!nf_SJa@nB*yn+dJxEUE$NbS`ZtT;!{N zXq576*d-y_tzQO)=L0zeyJ*2d!b=9w)4v=hy7)vWE)-ILRC#4~-Kf7^-#L*wy&w_R z2y1w7?VvAkF)AlAemP1s?ORcOw=ACt>Y;e!4|==;966GCaCwdutV4L~z(T$;z=c&icpyi?hWCQ#M%l%Sn zUinn6fd9c``7ln@w8a8>Q5sDl}B(k||!Ap|H!Hf_s(?%DNbQ0;H zmPh5A^k^yy$L^saI!_;E?I$ACRRn=GXq7hn!r4dp{#=Oogd@er(w;Ii4UB+^OD zQtSvFvD-Rq3eTyPv&%dbr{x|MH9(2iv~fd#`VLz?8VMSNiL{q+O3@WKrC$AX#!UvW z8u^<|=kl3cnD8y+1^Oq4X5+4v!M%Z1$RSP(qpqI}YDP8lZkb&J!#M5~N?=xlpxjGA zg@UyYD}-f*JjxdXeptgx;$I1BA!fQ>d5{P|7($`(%Mn!4FNrW~ho&YHlMFBub4!Q< zs<0*KY$%L!4#lqNAr!wnL?}LVC|~aVHC_V}$C=be`dVU$= zMhx&>?$wD(Lxh5?fj`79F|fZlcE3C-x9fOih!ZYhK{>kovZy>lDC94;lVV3~+D?R? z2;dT(V=2XlG$6jPE*h{-t&R`rBi|G|?5s(-b~u*XJc2wnpo=f*(KtQSqUGbje99g4U*yh1FP-(!>m%P? zOvjPaKHa}rm@uX?X_O{PwBTZ5lywrRAZa810_7uGwgYcAtcmD8ywoo9p>-&S6Inlz zwG%W~QQdvJ*m%3Xw!L#bNPAqWN+bGb||pUdUp0QVm* zZ1qr<%RIL1=J5&hj=~2Z?}8%%e*{myHUPL3KjnP+we&y82WW z*TO^^^*AWW*tk#jEQ}l&4moSmdDJ~Ona_C%A3+x~X}4AZiGtC(pU>yg0rl8!B7?Ep zMfwZbbjGo8H9Xco-bb=YqEa^*qIXXF7DhqjAv!XQBe`4}6}pgtABXBeB18awlG+u@ z#78RJgj>fx1UI>MdCtf1>L6n65S1c{`>SM*%y7}6V1*ohqc`rFu_J<;ghzp=Hn-$G8YR56sBJ*#QZBn z9wWoZg^dhCb3xL{6N)4YLXC2<(1WC7LSBlTM-7XT9<|G?i+NF4;vbfyg3iN>i$o$I zH-V`rme(?Q1i;M@|3@RwqS8QLa2jC#gG?&b(P149apgnYTcEE%Ib`#=SxD(Yk)|;Y za*-;5PwB#p$HtvD>XVzWOT9!k6C^Ws5)Bqz1K9@WAUb(H!i{=DppcBOQs1X2$_SDI>$Bb@l8gzZUqUId@hgrmXQxw=9)zmT~? zSPe|#FQxhk=l+JXC-{sMcD`lzvxV*NnV%32zhZu0*gy9W{H4^7!i9W2&Glg`*&ANN z?$g5db<7#z{8Kobh))aQ^lna1N8w;1r}qJ2|FQfSHgy+Qi3f6BG&W&dNP}mv8 zT!vzy{Bp$o-(w!Z`b&g^;mkJ+=N@D(#QKrUw=f-e{)XXR26_2btNw)liq;XyN>Fwr9Dpx0HFia8!@$ z!+WuQ9_#lC=la4>d}`q`+2;>O#^RF}&RxrVp|CffXzGJX(X#55nOqY>$F7 z3eO(L^}m6ze<_D|l5qBEwd$L9QKDeMVX3%kPOh1JvC{+0@7MsR*T6Z4&{|1$PJ zi}PcjaB4jB@#wh7-n7(@#=?c+tZymo`fPtY;oNj29G`oIQ`4BI2&cz#c`Oz7w{v=* z6wZFc;k_*!^kVzJi~Zv*&GadUH?l8O%*P3P$FTo%W4+jSxp1zM^ZyQE_kOmoAnZ^@ z!H22^g`erp{HSm!{ETp+CF}PH=X*2%F6;@XP%S7tr<(Pr2&W!kZYCTx=K6DoaIS>Y z*IhWgf%ESHVXqzQ@q;Tm{CsV$FAIfL9p)Ee{b=?d3Oj>&yujnB+P_qi-?E!nH; zF`p*vR-vNc^Dp5b&HCGf?dOqjeEJCcH*{M}mIusLBvNwE!`E+45gUkQ2m|x)XY8Sgd83ln)Z{f@t$OwE!2z$aah3&tydr#OM z%l1DZoEr?o@Oeczdq1~_&xE7;?Elx;eFNs2hqC>--RMa0Ib1k6gzMYs!s>Fi?-F6J z8FNeFNVt=5ZYJAzuW(^D^913%l-Dxha4PG!31_7I-V;{BKgaH+{OZ(a`!g>4KUp|; z8}miNY9jOX!s)}AD}+O-A9oA;65m5HOZblot8VOnqj2snt{<-phf-gD6wX$%{zy!l zsJ`S1%;yV7!nX-KhjDxDCLA{5{$ZeS{u1VC!kIMl^4S01n4cE*PGf#YID01ZPr|;` zcj^Xo`;+oMSJ)H2N;nXvY#{fM@HpYr6&wQJ3O78!<31@_9no8lNg(t-BWj?zi);C7R;Ilo}H)Ez~wLOiP ze-{oLGS|Zs1f*BjGoLE#pTm5)a5lr-UN|?5+v@|u8R5yo_Eqejo`j+BqrU8ZyKw4m z=C6g-J0Hq=F@~d;p>D8GJf7AoR|BHA+dXUUjsf53#;kezbzFGPhkBs!r8ve z?+6EjnIqx+Bh1#3Y@a=ZxuI|tuUw)}W8wTz=BtH$@!vk?VXPl0?27yG!UefMnjh=0 z=lpn5IBLQCrf|LyDk46A#{LiE{6F$2wl^>7Ya*O|f#bhkICBB}?;;$Y$~;oo{~PzO zi-gss+#ftCoTuL^#piWlTgK<_V*fH9R7bNt!J%y55yEO0`@cvy^&0cF!mjAs2xo+Q z2|Lo>#tR1$-+bZ1#cc0$!s+uleIE%&Vvlu<*mpGRj}XqE&U~J5bRqM#!i9^O+sFEo znC}txPG%k_9G<|uP&ji6^V7oaQOvIkr{#X@n{ z5LVN;J=_tyKZoPHTR4#MalCMi%&)NO^!s=w!?-lmwMjfAHk7s+r^O!FY zb{jL_E}WD23c`-?IN|6BcE2FjpUu2MICBc~E5fRT`E%j)KDM{U32aaPDAxa7xUiS? zm&E#WSl>c8MGF!5bP_GladbnXeR1OMY|`&V9@Jk;2X@=EsEn z-1&72WVf2gxVT`ue#fg1;W{v#Z{&-(7d z;bE*FBxjxrDmF+Jy;`)B7urGXN z%rc&}6;{7-d+aWp`Wwf8pK#`P);qC&FEc%RN9F4s#_fHBa8Bk=?+UvOc>Mf9xFGZI zLr!D=8JVA*B<#p|dU4D$e*8z+lku#-a8CM*vBGK&m)AUDe=hS@Vf!)Ww}tbMGJh{z zkoj?))7ie9te2f4tPbV$UmEjN&i|W*Gm^i3gws!Q{tOe&UB*0HI1t_{D zo^V(%sd;1UKgGN==DN&Z3Oke89(5+$8{EuXTR3$K^HH&0#-~QYO6CJM2J%{aeFJL}H*b(>t7WQkg z{&wL|>T@^Y^jVzW17nu@I$qd4mdj_Ma6$UtCu8@*Z^Z6t;|ZT{guQ=p_|~~>uR5Rk zaN+zvnNJnYUdViL%o*mJV*i&g7liG`%oBt|34e*OdlBom3g;U!zagBWg%o@~jrA9C ze_EPhdjr{TJ5Jc4jU9acA#CqpZYk_b|8SSE>QYa;9~A4mGEWnZ?qXggobANCT{zX5 z`6J=*Kg{$>HX0u??U)-hV$R8a{29VoaesNtXL5R53#%i!zr9P?tLFZtuW&~8Pe%(E z{>k-eu5cv$gm9iVCh&P%*t>}Nd*Se6=6a3U-on|;r^ozn=F5a5so$-I9ofI>EF1{m zEo{qv&RAiu1&`;`W2TK@e3r!iPvG=EB^(LAE1Wx?_1_7n(#&P&vHia62OTY(ll|iJ zgl*yLgww(uV*kST2p1&0(ZZqV7YHla@7N~niTgK%16iN?B4%mtdxZ-!zSeER_D6lW z{7(}u^kcp()@Pa92nXGndkLpf4Rn4!D4Z7kOyNv(cE2%pe?9Z7!hx(G?-6!Jv0nXy z?aSW7e6+ATfVqjVlKY+Ogi~W!-!XPSjQMV1TkIPb`~Mf~7YXOYzNcdD#rk(*|0(7l zW4-J@G(4Z}4ac+oOkq#Lzf?GVDeG?&&JJYmDV!R@JTi9QgL$TKbOZA;;qbY`bpAgf z>`Q<2j<759x1WWB3wXYA=mk=L&tU&23g?B-7Pf^i7IuZN5spq||F;W!*YSL&5WCMY z4--zw{>wz+g7BllO73@83FjZEtJC+Cuq*TT*M!s3pM4nn7yd@rJDu&@D;)jG`B#3S zl$WIEFyXw+#~KSqlMd1GHxtgDQeX3bgx$u>cMJOx-!S1&c!IE!_*~(%@G{}7FrK#8 z{d;-=+xxa~DC>`32p77tesAplrCQp)x)-tk+{?@-2}dt5H;H*Wb2H)0yUaHVJMS^) zh3!_HpLYqTFXZ}U$NFnnKS9{FrN0%9q`$)38g%-yM{xhKTR12Dn{aRim;WIbv-?Q+ zXyNRkJl{B7IFR*g{#@VF2atuzehMF^B??9yS7gWPY{llad?YjevA2O zVOQqsuL~C%upU1zufwy;n12xV-{kzYE@6HC6Sl9RaAp_lPZmzMt}?HMhcF6H_(O*rdtc*})TL+a@I^}KLK_#LfF57xlycd#P#K3;nYRU*T#H4^KHU8I_QN@XW>Bf)iI0zA;NBB zcK@)j(}ej^;oLu%SH=1Zn0?`toG*M^ICB%{&nLoBOXeS9_sb>y|Kjw!%b1TAR`+p! zpCg=;{kWWPR=6tWRqTF*aDFxOEMZ4@m9Qt{@3X?;&z#?QeX*{Og$ka(mR`#2dmP>w z!l7^r;hgXQ;k@uH;XwFl;jHkUSTFPIy~2^~=Ny4=?bn4<(tmy^T#)sVAB58%a{rgOjP1{Szf^t>Y+h&^8jN8E=-(1{MIQ-gL|^xEwpY!U`X=nk`Sh!W13Ay$Ryf~? z+hafBjGXTrE^N#BqnW~mj$9tTuzMZHw^KNj`N}84c?s`lVI}8N>s%rAtCIWI6urK_ZuwBjin$6kX zQ21!!6dfGI=S<;zf%#vt`?buuSpPV4C*j-!%zcGDn|XMwAHh6T*mjv$3g<^LZ;$n3 znfC~%CNlpi9JFI@cqOMNN3Yby=k%CmzIbKKrQF}Q6ZX#J`ce?ioXuLeEze=tWdoL){;T<6y3O9~r?r!4txGNK@PUrf|@a`Ky>O=Jr+ddbY1{A@i{@%Xx|OghM&MaD#CEbavk@X4x;t zPm}5Svv+1q9sgwEoa}$k6;7Xih}LfwwxxdUj9Km@6^Y$taAjBxHo=67N~f%#iu_c-RV z8`-{aw>D25Bb<};Hx_ne{r{R+FZ&4{gl*YBxJS4^2fy)|AneM1!s3`^Kj3L$r!Bju zp9rD-giz)~-wLPtBz1Vd3m4{be}Cvr?B2PA({sA8lKp_@!ufx(zOAr*A#*?BwCoQ| z6b@wnV5zVx>)+1`XN5!Ig79y`DdAL0wl5>|w-bf4!v7EsdUJa4TN*n3Iav?yDqN^y zy)CRpFh3$3$@sq_)?dx~mxSGA%pVKevYz`(?EgX5*Kft~r|xDxOE}-3xw)|2h52@2 zeIh6m;Ur!VMpc@-wUVZd6z_M zwm;pN!#hd1AnU6a3a8FveJ<8FVZKW^5d9!wXDO#|y09nv6-$KGGS)vMZ0|Wtx2N60 zd3iqP2jM{WPs?v%d&4>G|5)Kj_)_7*HQb-)gx#x{?-cfBK3FYm%lvbcaQb4-@7coH z$2h*#!j9~JJ|mntob&%p;b<}U|33-`OPEi%mF-tDU%XT}CH+xrVMm_->MCs89RC2} zK<1A_g(I17PL1_%aegirPQSvuP1qLw>%v)C-~3ECC+nA`x3Rqi;lBynvYvT?a7OCi z^)WZ+{B9$hm-Vb_VPBp%9xa?|&-H0$te5%Si*nN%NZx=3H z#qov0xu#q`KM04i-&=Nv)EDWWj}UfbKP)4hmHzAoVfS(lzoT$4h3nrvvHwSyCkT5h zxPC1aw&}qPe4dNli~b8?U-WhU!}euG-&k1P&i=0v&dGjeN8w-*$3H6eFYSMha9--u z82ccL-;N`^0*=e;69; zkKyv0Dx5!xd4;ee`$JoVBWcgC3afdXA3qD{9%DZ7PPX6qfWtda*nOMtKeEE%XUw@+ z|0#1`IR7PcK{)*dvmN{Yn%Rl{f5q&^{y$+}8oPh4T-T3n!ahAHhtJ!>!CK~@g|lK` zSzD>kV&CDyzSwh$u>Cp5cfN2|>}wwT7yDYr{$)L~gK%^_x3}&w%l&=d*#EJt9~kqA z%oBxO;d#O-aqkJIg*OU&-Pr&0F-v^AgahH-!lCdN!oKiN!r2NA?=RtuaLqjDpFh05 z&hNv8v%)6}hjKsBNH`<*UJ|<(ZZ4b?ZY5k0?jY<4cNcbr`^N6C;QBgH*ngJ$ztO^; zxPLg-3(pb`gck~j!mEWN;jO~zIL@E#!WrS$gtNk-a8AyDei6Hu{k@-sQ^GadasFmr zXZw#4_FiE=L)hKUe5J6ngZXyhl<4uZ1A6|fUSjHtCHyypL-GHya7Ogs38zKBPuLT# z-I4Pzyq(i`xUk=j`9xt);y*(;5dKH(U$|-PU-(+#ob;c!2S{&fT|3o+~ z9L3z8`_JEn3t8s!3dvuW!>cc><}jZqoE2^y^K8~%Dr^g1EgT597EVil)Im5S_EidJ zh4BNTI)4ko!-Q?&3BsvrE{}P_j_8*QyTa>ZeP?$6tgt8gox;BGyRm=Ck57ezPVE1O z*uRWV$xdu<`Zm@#5Vmh+K0(+O_h$;{TeJQG;hga0!hS2(-zXeP{c0nemGHX?I}-oh z!b*6!uqWY96pkdk*}|@bw@f%C&jW50c0~W2aQYUu@7377#23cyCB0t>M{+)JuW(NE zWu2wGg&PRxh10^e@HxUt?7290--YeDN;r`6yiqt5zC+lT{-=wuE8IsoCGF1^P799~ z&bQ_GCJU>M%#R8?dFExpuGH6U!hw|UtHR#R?EYinNcbn=bPv{-bm9EUN_raz+fu*N z!m2B~KUX;2g8ARV;SJ2!3j5bF-y$4c%iK}e7VagS7QRookYo2_g@fyvrwQl8{Q}{P z=pPqOi9JsUtDD&Wi(pGB28@?q8GLBhgY}IJZeehh!BY+1Z19@~@6((u+H=}n2gl!1 z^M3t32G29x?=<*pga2Yq=*a@Uj_Ri4EAm+eUtw@-gYPo<0fQZb=Nr7v;O8`FYsL2M zWT>sB3X-$@4l)8Ly7#*ZFRdnuOB z6oc0p{I+IQGp;YcG8g-Uy1gkpbx5o~-QbMDH#66b-B%gx7`(;c4-8h-I{spKr!p7& zw`K;n(Y(L^>(Banu|1OwUc&B+{m(9gzcsjFADzEN_l-5H`f>O<<_0m}#qNvcVY9x- z(+u8f@E*heK7$+f)%jB_zkeIt+2An-uQm8>ga0%*-S6P|E@Lj%ms^>O^##A$MD?er zA7bzngI62=14I9*p;!G64*xjjV*FWyZ(*(-mrtdkAHiI-*ERHO4SvaR{~>e3IQ)GE zA3s3bThw1{@Qs?~;T{Ci-_VaWc!9y&4BoAIe|Xm26#src!Qg*tRz>?-8eD1c2!m%B zyvg8Q%*FiuhPl{YYTu*tr&vCxG8gT+!r(g%9%%4%gP$>YpTTF|dvN)*F}PsxOoN{{ z_&bBk?mIaABMm;=;ARH5Hn@+$6AfN%@T&&@Wbk44A8g-+2H#?ErRM$hX|$oAZ}5`_ ze`fGs1~+)%V0%tut`oPfOAWr+;2s7KF?b?#u|BRb_<6(qD+Y(m#rpb-p|5Fc`-}D- zYw)QCH`1Ify1&8D=MC=6T#Wy2LvI^A+~6?=Pc(R{!LtosXs~DS8iO|({FK2j7`)Tq zcMSg0;GYcMYp@!4aCxK*KE>ds2ImZJXK;UmCm1}(;1vdMFnF86+YNrj;CBrEz~D~| z{>tDV4gTHWdP- zhcXw(uSo{aGkBB1FBtru!QUCI2J8GU#&?v#=NR17;1&kw4Zhpp!3K{vc#grV4Blq& zs|J5z@b3oKA98Sd|7LI#ga2*t9R^n$JjmeD2G2Kmg~2-v{@CE}4K5veaC(k1_%wt6 zW$@Jo-)e9VgYPqVn!(Er-eT}}gFi5Mufes49h|;n3_io)3k_~za4&-=8$8G0l?Fd) zaA5EU27hnxUk2A6esKDZGWcwRn;P80;7$ftF&D@Gdkvn*T&m==(%|QrQ?dRF&DkQC zj?nfO`AFun*nJ~|TN>Prx!C^uK z3~p=iy#|jpc!t5t4c=<-TLwo4?=!gmD4pJ-{ihh*#Neg|-)8W=2D=77Vel@4KQj17 zgG)vqZ1363#rl7~!Iv1^)ZkVI_cD02!E+7XVDO6ue`xStgX@erxV{}{@Yx1mZt!ge zcQ*JQgU1;>&)^LPzhv+pgMT-;!PtY-bB@8y4Zg$RDuYKGJkQ|G2ES_XhX(&n;HwPI8GNh3d4oF}+|%HG2HOTdVz6iMI)k?vyxriy;MWb_ZScnie`WBG z2LEAjiF0uN*ERSEgVP3|W^f~eFE+TD!Pgqx(%?1*R~TGra6f|w8a&eAhYWTNe$3#- z2Cp=DgTYT3{IbDs8XOw@xxpWlDD@%aBgn^)J&;czpF%!^d=B{n@+IVJ$TyI0Ara&| z$oG&RAU{EVgV66G{SNs9@+V{;hue9W$m!zdgtb$V$j6$ZE*rkTsCCkadvt zkPVQHkWG-ykS&m{5Fhdc1M(u|CCJN=0J0PE3S<}L zRmf|Q*CB5}-h{jbc^mQ$-*8tN`3()T}(IdR{m?1sNN{=7XPZazULa(B}6!LFK7IGP+ z8RT-v6%aZKb|vI0$kmW*AlE{!gIo`}0n!4JgWL$Y3DOeM3UV`~HRKk^t&rOxcR=oh zw1wm$?I7(T9UvVc6_8Gl&X6vUu8_MR-5}i|Js_2ko{$2h7o-Z(8$yq%^nvt+^n>(= z41nAXxd(DDMfHZ_0200vZ z1msA_QIMk{$3TvS90xfbasng`IT7+V$loC+K~9F80yz~zkG!7_IRkPg4Ub0Bjek3r@^=0g@hUVwZE`3UkcWDkVe`Dc*NAzwhgf_x33HvcUo zf_w-09`Xa^M+o%=KSO?n{07+z`5p2nWFO=&h(cK>AW29GqzqC6QVyvJsRcO%QU_8O zQV)`XG=MaO90oZGax~-^$gz;)Ajd;afTSTOLjDH%JLDwD$&gbZr$f$woC!G#ayH}~ z$hnXVq!FYsHo&3f1w^+3i&rA3%Lx^401W-3P^Lv zm5{3-S3|CWTno7lay{e*NDD{~awFs>NJ~g7$jy-d8=wCFH9o~_ac!@;;p(<6DzEF= zuA^$(^78B2Hto=>PuHr7X6<@ZRJChfh5sFN{mR_U&3g9e(XO)NWqmqzs;DxRE&H`A zbm-EqYh|m7{?&b|V$U5rHm&a2qict&E33sv$BtL@t*ETNrCoK0F2ze%BDzAmj@P#< z6uMS+{$DQlZeG>1NAs@T_lJG3H?6x!eY+0biWgh z)fH8h?W!xT?$NIE{s3EbMe2)gHQms%$gTTy@7AvJri#jr6;&-OdbBHa=~-3LThzS= zRCc(!g<)cKb-NB-T6e9g?$fUOH9ZIPuI^eirBBDMJuk25+qFYQu3ewr6>%xh<(Ab| z743TbxAL-z&Rr|HAPRk|;jgzuzF$!o@ZVS2-~+CAt?bxze>`meWd~o31IE<@BJ5hI z=-#zbvWtA|*R^cdqtLwqC$e;9GIZ5FtB}iFasIztNZmQu3F>0!9;h+@V+=**{~m?m z~X`FlbQv z2$S>R4mdgP;O;2J1{<*xL6K4{?8HXF?!tOiK*d%>G5)j9K6!We{lDM$%Cj@GvpqXI zGrOmx5Zo$bjK&I+sQRnRAyBETM684!CxK*71B{&0YJeebaxpot92qiRm_R~JHx@Vm z7M40O0Sy)_BZ*vUB?L;tB1K_Q8Zy!tPH}P&H(>&W(n%&2ij`uS6mx`C8Wtyk)yTBY zRVI%XD0$+kiNW(-DJl|BMkdq(=i5xE(tRs@4L?Dh1h6yT507j4tFD42p5=i4> z0z7$4TCTProFpQF+({yi36%-tLT7A)J&4@Ca#;+_kt9|| z&QJmOu&4mJAjw6ll+#o)g~$O56Dl8qFyev*#lo5eAO#`|;tqWy4r2i*0qG7*5+K8p&PgVd3&lvdbBTP#i6V(65VXcgCXvY% zF|adGl_B_YhYOcQ?I4;m#UwHNlanka31%J^904-603lK2LJp8|Ry0DAGe^v{ASQ_% z2UY>FODL(i;uj~1qw0>~suJFb022*$ijy;AOoF)!5(Cx9oIyhfgZV&BR)Wk$8ZVa1 zq)0}SokxJ_wyOZqBtW|tN7UlVsV-EC4_>`U45@VtMWR`P(`-putWp(TqyV;Z6(Dyo zDE_car3%n{IKxOF@d|SRr6`QkelKWbBAd4_$X%t9Gf2L&n79}$r#O^yS(u30+;JPA z;RsZJA876w|6orUrE*|Kc#UvdO~LBtPOCfYYVu^^$^=;ORCW#yOAU<^hP$eWP9#A{ zed2Jz+M0%*JBFCb9K5Js=WlDD;n$DnU79R}Le%88wlCfahd` zw3kR4rwZf6g~AfzfYoOPhJe7*)aMwLa0g~60WlGQ&5(mAwg^ zUEDnRZXzW}7CCHaFki#PQh$Hs+yA6qtSb!!Rr+*p#4*ImEZO2TkBW$|s5urX}mHhQ*qt zlMM6&k|fZ>IRM#kXiFA(Duc0>!nCJ{6x+P;9OtYPlHOgQa7YwWRmao-bBt3ese>~^ z$v(D`Pz>U77D;-uu$Vf%!gM0xPO!y*?MX>m z?-&G{yI@n3kmBI~LBdmlxKS;an1TOh1GY=h4^%VqoX3Fi1T7v01CkE*L?N8s$(cf` zVyM;%1=`p(V(I6DB?+3?yn$)&xS!fMfGSg%J?WVVH)}Ctw6& z&iPJ}0+=rnu!%A?V6dD?$;syiqFqxCZ`!0wmm`Obmep>=9rIPE^@Y6-8B+04jGB~W z!640vBX@*GEH-C4#0$g{w5f6HM%p@Q^9ofr5>6OMHRaIMew@cuE{cs4NyC!-1u(jr z@~Za`&gmhAgK2%;j!Astl>d`PO(v1OggFqpG9}eTN=Jc$yOW00>%9xYZ7`w(Y|l30%Ei{_)D z-I$)<%kZEvlLw<&X?1fO;!Z)m&~YUxhSCk$C?vy}W+Bs-Lg^YOkthi5mekc4dlJfu z_bSPF(1F%@Yu@B51u%1}m?kq_12@e*D zNVf`Ng&^a=21*YCKolNQFHn1!jlx+JE&$nCujD21&>Ng;;#{7x2wYj$I4NvRtlk4% zDoQDf(bV;LoCY`#aS(zbR3s;k8B86q4(|w?w~(2IBp*UG1GfX}1l1fckqKF@0nTW) zs9SIWK+e%>Xar~Jk;EF75s3*T4s4oh%T!ft7`C7(lVcqSn=s7_zySh96w90dg@Qtcw-uGijNsgLi&I+rItE-XS;3}3!BMYFa-bJCo z6u^>JEGSYZR97R3b_4wxYNMV{9l~{Apt*uOisMIC0|RqZhH6vEOd5+OacU#NS-)iA zbOQKVS$z{Sg%1F(03oKp)*31jz>KR`$CyA|( z0mqES6pN21jAKm`22?n;DajLo08^XFJSDiyu_muNu%LIrYJ%EnTF5j~^Wvh>nifZZ zEG{e(!WLYCJzI+5NvJUgEHRDUgox{3!a-napnP&nH({tocC3jik%bB*glkk~1rrDj zn+M>8p9Zo|>>?!vu1~g7 z`1*t^jpueP8_W_BYPI3WJ}Q&C&}Cyd!h}M&3z*)gV61_qK%Ajv1G$4sVK_pP4XlS; z!#+aiVsQ0jRuhzTRuxI90QF_NkJ4nE?Nt`p8Iw3G&L?Se24jdoG zu}aNB(26z}O73!;J@8)?931XxheXzX0ac@>TzzmPT{Œ!X_hypRify1-_r;h}g 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�z1>o9rPjo-Qbv`g$dtRw5 znbLDC?v2m<`{f*CKml`Epf6%eu#{abD|TB8As2*nBd-I zjI~x9hqx@zR15vl&N{^N7R9s4XtLhMIhm~YANNDMe@`kGssgc z|B|oxd_To=8|zhitIy$ApZE^`hj13__4&j3Yag6Cd?)?~@O5TOjQ&vMnu!?gW@5El z&|j_SuVKV)Fnapm=IHno*{j98k8^Yk96;O!3wsigP4nU1W9*eGg;tKSM`|;;txe2K z&cH94yltH=nYCOdyLkvPo~@jP9BqnLq7{4#t3QKBgO%OTydVN4yvnfj%2Aw0fWt@}q$fjPe?2$bLEyT;0Hpi-) zY}+G@5@BFpPiY?9JvOjn}qJkh5@Po8tsU0mXLxber=Jkee5fUa_zko!rrL1OYqSsk4JB(V?< z%uaveoU}P!>KfdZ0F3^ywa^yg*;)i1HoJRtILm-Z;L9+Y+FG8fwzc@+ll6rGu`Y=@Vm9`-wi=UD3XRa0`E6SYxR-vl^Nn-M zisUSI>9@X32R@0@>9 znmbN4xtr+Y7gtTxXsCUwTKUec6Q5XWh;upGI`i0XY?XE7bBs#*k3zk9ZZY=E)8@;w z!Wd_jd^$asa=x2CEOO>AF#P}-j4>878GR8(SwkC1?irAHs7u%paZ%E`nl@~o-%ZvV@gf7oT5X-JBnx)h+RNrS3-fuM2L=MRgbZ;4ZFYjMw32T#0FcMoi-_ed22S z=qFyij5A({qkkUW7dbqYxG>w1<*#$at6{Dt;q?o~BGsawa~)*C{@4rZu^qReCHR4X}WXyvc(N)9T^O%B?8 zmz?u#=lbIp|CxIkX@a^MTj{RsvCPosm#*en0LRFgFfz2$~|mmd5h z<92;!m?wfgpeA6{;jchWv>==5qaw-Ic%72R+-mLy{Q6>Zn1U2{D&x^6DUt34s?j+|336o-FGuoNY2W-HqkDLeie7ARt~La@v!WD_(O`5> zLROT&@RK8xKbe!ZHE!9nlbh$Hl`Fw@x0Ak&^gBp@ne;nI|D_UAH<`VgPtCf$eddhJ zu+VxBr$8M&K2B~_5=2AHq822dll(FWbdZz$-bI>*FR#f<{xI=+kTrpD>=v* zwEl?FfBjPOd{nSBZ6^CU%ZDGSddamQt-Uqs-*rdYZbPVZ z_bT&{j}mUN-eQc=o+}e?v6d?##QZQ1c`0F%^<|ZPvBTLr%ih=h>LBO+Blp|(C%kKW zMU8Wo4}Zm0o^ZsrUEvG>HH0fDrJy-JEr@-W3qFZYGZELmAXQ1r3gi5&AZ6@);{87i zj;D^vOuiF)@CJCKUJXl$Xx__Ooe0<5u}WTeb9HWs8tw{;zHxauSJM^5EQfB|=(p*r z)#^g0bnY9i@rAvCeJ;nUb6<_Gx$Dw|(%egxn!6I24m`*c;Y)R>+9zKggfB0JFXzFRYk(&lTFS91n$P*HF|zK? zBqepP(Ca`&ld0^Dv2K7~AA(+^uzj9k58hbxKZh}zb^ejlGlCrdXvCippQscO?;uY_ z-%V^UIWj|ucE7>?uhj;FMtkv!q3!*#Gd^E~93K{>coy8fa$~e1$hn$-kE;fjZW!Dj z8iVTo4h$~^HK8grUVDFBV$M@se-FB2ae3T`ocp#$Eh*m`b$NN*u$*mjMUftL$7SWQ zlXHTC$|i10@SZzgq6D>x4stKNc*YpT87-06hDu$+aL2N2_9g@=R?F>NTa_TpM zFpCm2$?6!cEE|hlYJwl{ByVT1;~zE1;`X&k_gZr=Cs-oX3sa)M$q>OUxdJ|`q<^^W}x z@GpDK6=R#|RsFyPz5s9^TqiPK?(*)KtmGo9`rHl#{n=W1)JT#*(==4GiYNf26i{xjGaz(he##zx#df?sKJKpn=A)*uXig#pe54`i9xN?<-_m4J%cgsb1FZSsMnqJqJZqOIr zo6*ZmjEhsztw$`zcL7`%R!l=5pNd|7J^J|+^z_N-?~}UD5YcoAZ0#;x0vM;FOSJS? z!L%|DQ%?MH>{S@XtZ$4>@g}r>f2jgTZyxZ&uq%NEdtiBl_lY`bN%8Rj5~F zR&W144Ns3{Z&wTFqenN5b<13SDZaHIpc@<@{)Gu0NktFHLN~Y#oxnJ2S^EdrD3j3% z{tnO2LLUg7Ros3HWB+IP3}}C@jWK%&c4?eC*!dNohn$IW}+U`O7oDG#HrSL>Z|8DeAtcHj1kVI=op9WGp(i(@7PTC7j5+; z-nG@+U$z|@@t*CF{m-166o&2)&J~f8G)39--=WIbeV=#c{Q`XX%M0S>6xEy(+uG|l zcNhnvcf}z02GnH=T^a_sj~WJ8j~NDO>wblo1~!d%KjPC_AHi1P{HJjXD7U&SvZ(Zj zqJKvgIk@lTu5j0UPN7PJ*c+!by*9#%4bpG`*>m&0B<(!57HpL$_?Ekurue@ZdziJF zUj3E+s|+!@PmOjo974|(-Sil;QfNzHlC-rxn3A9^p;@8NQ==9BGr252UO!EK>?KXF z9t|CxqFnMik0E2*pketg_TgpF*5$NGCd1ug9kFj_5jb}Vsj3p=ZwRly_c}RykbxY4g;<>$8TxQnk8ZURoK?_Tg_=ZC*Gxt$}BWqc)2;hNo47^E9+{ zQ^HNw_YJBu3%%5ykj3~l*s1WGFw9{+J>tJ@r|tV~_TdL?cJx$b_z|0ej(Qq;I<2Z) zN=oFyVaw*56c2jG*uOzrkAW|J+;S0PzywYk-|fs3J#8`e`V!Uv2ySDr$?Mfm=|~aGOncl=D38MBCd^G&))2)-_89f*LkjG=r_OMIvlcd@tKfk7WWJN&Ej#P zyBBB0jm()JHwsbE z$48>W&`!}|nu#YTbA?85g1+Y*hKveAZ@C?P<$kW0(N*T7JI+^vEc1gVTaD-~S=bZ% z=#R(2tMKeW=-34vOWd%Yx^`4u_#ZnpU0Y!uM*J5aH;r*W1pjUD`c6{6!cSEb9PZ|@ z22UgVYDJGto!hTzz1l483OSjLO z-#+D%%;Y1AVSOHav~=WKRnHM!tu$m`|E>mL$>XP(ip z{(ePlv$v|Y72J_F1wP9fzP~EVH81TWC20Le@Wv|(|2=I1c3wH@ld$WS8iF<1x-DU* z^;2v)k+UE1oTUV5e6kuoS%VCCa`-;m{Dik`<>~Vd*fO~mCfL+j!bc>tftRL$Nqb=iC3vlV-<8hfv1HL{p{K6fi=@r<_$&zd~GMrn{f z75`@aAH03ph|lFg#_4)B!up_ZoW2aZX(xKX^?u`Jxg5_x@0p1vD2><8AzjW%a&iFwFv!){~jG--WmV(k2Md&_Gi7(nrBaSkbzHDubTkG{`{zip`RZ4kdn;4E!v1{480FSCf!^iO9G4 zJm1dq8f4fViedUOY+?mDHEWLi3#-zw(f_>#$ZFR`vV2JD6$dzPwdsK zD<*$#3|I2@BO71AHby2oKji;O{7-!2ia*Fwu0&YMgQi#)VAtX!nK7I*=J!F{)!4Fs z<6e#}dmpy!9l*AqHcaNeO>0XqZJF}6Ki=LW5ouU)&HkhoB`gFpdqNk2S zPvw01L7ZuNQ5~%9DawDeGf(CjQG{Z|j&$JbeR0ZoO&?xG9S5jGY|Ew8Q$jt8ub%!* zSGo0iZl#{9sHcW{`f5wU!+vdHkCwMBtF*Q(khWMZYD=-NEt>75x8>*5;qTjCi~e~7 z`n2ZXo`8S*_xQJekAJ(oG&i}trrW>0qB{37(sci};5$%8DGz@CGU^Aw|9>*-|76tv z*JM=92kPa_6GbHAgUtd<6Wv*vwM`g(bJG6i?DlSjNiqcq-1o54Br_4 z0D4xk8m{SC51=D2#^zytm}c`}XLfv|nw{~;BpKuXq((VA(fzt@p76R?v3Y*}Mdu*) zXyl$omr@L7E51f&C${NnY|}IRFE)?(I}Do5V{k_yYohRfZ&st+o%r#e#9uY+vsFjX zQQfQYWB){na&It1xuX)r=83}Q$@2QViC;Bu*{Y2*7zd;9jgRG$@nm?HuX|X|2hW8r zc?!Swhuq7{w=FK;v?b@hn6xGG{!;l<+WXIW|A2qC#%{x!3ZI zwM6ulscjy5%Y5{o`25$=Crw& zWu?u<=G>NJ9QveYXNtXfAL-?!m&ZMY&G}2s?iBkot9-B-+z7oicitOngH=BD%{1V*vOhN&4y+ETKt0|Hy)hY2~VQ?VI%1NK=DUZ;*Y?O zmwF0&O#F>1JT((rcDtMS=v&6iHk{yLdU z$EWLj8^7#dvGsq5f9^DEQ@+Hv@fCXLUq(5W<+$eJryGQyZeP_+_~|zA95r%()y{&S zq&>&8?z20C{k&X_SU(%z?`-VWQl1t3b~Oe0X}{w6(1-(7zgoB$U!BeCs~dKc^>buL zltFPuVb?|_+-z+&L}>oHLw51k9l>9>&lbhm4^fHx@dN)AKk!lfbwlvgMWvj=Z+F>3 z`!e)$&nE2I&DgVIw~9~o{PR|)O%8)YuZf1N-R{-m}JuU|;?%i|-u=ZRAi zSnKVZC(cB^TIrJ;`YWCr*LcUivy4yfYdTX)eElOn1{X4r{waQtv5z$?sXxKTU|?*z z*=TTgW->M*?-;{oBrrZ<`)c+|2L67nkMp#ZAH&huqVAam4d)!?s~=#Jg_v47g}! zoVHJK>@nc?7>4aMiEE8!4_T0T*hJVvDt-rraY5#D-(v5Z3*V67Px_~gesiH~%w`S@ zSy)s?-;~og`W*UP=J)&3{STu1UyAPE*BttdmwA0b|2K#Je{<;nf1E@AU3=%CK>c0x z^y$be(Fmfs=`?OtTRb<<|u{obV$=Z=;h+BR6@>Ls8@n5(h!o8UPni)HeQ>Ug& z8)V(cchIFn$|fp4T{?sMHY0Cj4n2}~eT@Emit-;~&g&Cnc->2{qD!Msf0Hh~RaJg3 zdC{ed<|2dcHgj&68m8GV;~M~X61(|@%-d5d|23dRM& zWfS<<$8E7`<}xO9o~J+1kF9?Cac}*xtY*u&){ClJzmzy@~<7b zG_h{5g!yvu$;kc|Gkamyf}5nGORi$S!p_ra>9l(q?Vk!Bu4fI(lv?nj?PZoaU*kV3x_0sy%aG|( zH+yEZy8kxPqu2YN)LV0*Q`_&-ik_E5tZ~gI=BPCe@n zL~j2UJpPIOD9^JVKH=}mk}ttgi_u(nYJ#!$G<#Lfv42L^yPQK0t_9D@?AcmzFxlNY zI?J~&#q4TKW?#x6r9s9H@xc@^ew<-{jEQ_wrmP1(H6gq9^edBUckY|L=fvfl?Kwah ze~x-G)Nt1c@bTI}=2%xb(#HYQq80b-xj_xHRE#)it7aW_Gcp{XwC9*QpiSbnc3!SD zoI`$JLiu|Q;jZ=ckDmWo^yWqH_RKHqushZMZ3_Qgx_oI@+4#~uQogKtFEK>4onY^X zjC)f4r>yx9Usek3Il;Tw>E874x>M|{sWX_JbAUZ+V70B-Fo5TvqBiPrLxZv|w29|A z9ic@BGfH!vW8Jn|{!dn|PT~SYkA81WuB?Ar4V|?bO?7gvsN7`_iQFZ>LjKEq`xcV% z%}l*uoFV0zNSA#-eAD(i_+ z8O`37MeI*mXAg7AJ}oojnn{)YDPeUA`%~Bt#HDbl^(MdlDb=dAP5Pw8XsNplTC)IK zJg~|8T5y@sX)K!X?1Q$oz!FbecJ8z7k#RVM_Dt~GOTv3P@7i9HG}<`#;5c-ESk~JN zVw@VN?f;Ygc&2>`Zq^OCYCi7FJIDH)DB8kar}RPOokst};%EH2ypl)q3oX{LFGb*M zr4J`OyUw-_7&Cye4Bs1N7E@;NI?9w-*Fw)0wPd47wGifBiP30x)a2wSgPF6ml%kKH z%C0qYM!4{n(D>((j*e49nBRoXrLKj45ACAy{J*P91P>{Gv>Hh372pwi9NXeY?{Z#9 zC+l{E-evAe$`+b`&99t5ny)}Vs6J;bGVzbleL?`;%Xf|T`Ntec`_$Eg_IcN6UrUGf zGvcq*X}^uQ8*T80M*o?PqJu*7YJ|%<_Q5WCKZrbm?yaN0tj;}Xthr0*{zcj+bk4Va zv9w8^<$Tc53iPSy^tr@KpJSoV%x_PhQnpT`6NN^BLH0&;(Wo)bHR0J!Hk~HZ@E!I> zL$X#*+ZX4f!RFIm8vLB}3||>K-Ng1$hEBse9cIFpcS2t}e+X~14x>CDPm2%7_pa?* zI?H)fz3pB4af^5F(i7~9-rmRFr7Zpl+`BZ7H4~ji1Lw}GcYe9Vz_?>%{0U+l3T8Ya z?#YT!#$Snja`7Ie+3X>m${H1YpVGGZN@Xc$dag@x6uKBg7O`(}>L5q@AK90*3w+eG zFR5N)E6Lh;d{*M45*b^`zM(_tYsb*nEYOXtn~`_jPbGVISZ^_oy-P8Y=OOm=R$@o+ zU$Ly4^i03Por=yYc@D8&O3E1xE!U&(9ml`AeoV>}>B&h?>|vizno${7%Xs%1m&_~3 zcrJ1&e;jww6IdfZHIltQjQv70Q?1_TQhDz0eO7aoywA|*2cpmKVb1iEQ01mKB7$a9rnsP`ohGxv7Y`|M_;4>gVktqmaq?X5inTyt+g?ZJL_4mENgHo zo_WAl4Gd0f$!ctwdEkL{H*b!l+{<1W?Pkx0^YT~6xF0B5xl!!1<7(567uCjV#aBNG z|NMxcYnFs??bp`1Uy);Ht-Hc?eV5;UYtG-|#BV>Abz*!g-?G?V{^Vl&rfoUOreEe5 z@XZh7%I8}qmmS}{B3Eo?PGfM{MCN+V%%#nH)v&e%aJ(2@x{;K}fq=OF_!rk@I_^&2A_B_P7hyRbgbB~Xzx)%RAGl9$`5J)n45FRrD3YnlH z@=65FB%nml2m!02Z31ddh@t^S0WlM>HW;lLjM73Y0on?KSX!YnwwB|KKq<~_G9g})?RzDj!0q@d(<{SN|W$&Bxp91)#z}Qpx`ApOIc>?|X zTKfAn^!xGj|8eM@S?lWuWZsKh&~#7n@z!`TGI7^B*7&YrZBOo~6&_e{HaH>=KAfoY z;e70)kt^W=*>g7r9~9adr|OR5%o?|BPYFxU08JfB7Egbz+n-*_gCmDI@S{O z{Y!UU1|Eg)E-U}38d-jMWK{Wk+f#O3294P>#9o)lr^X2{JoqR)iM_JR_OYwsNlRGD zeOC6e)Uc*Ekg%3ed2ID;g|$AFwLSUHXMIS%!}#`+#?_}Pr{@uZVw5ARX&Y;2 z4Ku)n=(5PUeY@1iUGKtUFQSWG2ERQCpFL?IgwMXB{-@!!#zl!!Ygltt`lLjy#)gqh zXo=$cvDKGRUljEZbrGks7O3=D9o0h_)bH!Qwkvisz8t1s3IDx8-J$$f9>RaJr*Ad< zSIih?@+4=x6pQ{PJRth#gC!;VU4OZ<#Xq|F*$^3mpR`Fok?kU@3?9+eAjaSq!aZ&y zZ>9WD`67HR^5htLq{x_5`l2agmKywZo!Fd^Uvl=y8t^9eltZjHG|;ZW}WPfha`e7n%#t7oLspQf9 zu3c#@H24`b(E1PfPqZdQI_WGxybe>4cUHaq^&%Uej_%%N#Hq({v!S4>4-?pzPC;7(Xbf%-W&9n`=G($`HwE! z1us{UZUc|>AMbzAf8gbF`cIHPD*BV`#TPx{7_=5%xE`F!KKq}twy>N2Qr)h<9F*@) z`b!l3a>$U?L$LXo{X+UmDSoKG0hcGRFU4bDy3jbja6jum{{!QA zVrU=yzj6G3%{cB1;f?mXqsTmymqf;TU+-MTR#kp?8H-=u|H;^kl(7o)8tv>z{4cb# z+6e93f0fd==kOZlsK&p5giU#`p+BkUQI_?2tW8E@lPt*hq`$;o^Y>Uw-!Z?SsqlVJ z`m8%W>F>;+)l_sjdy*gUq~BM-JZJuWP51Tm1nz&B{o~{b$G&%jyNQ>O{>P-pw|LUy zqr&K2>6^Vs_m$2$7ED{jUg{5bDh2JKn# zLE(dG2e=RXK>s(API9;KN!GwmSmIN+;N!ie|Nf){maxXY6aPbUen+JcJ zV>f2erc89gH`YlTPu%=x+NZ9cK>Kz@(>~xU1g=@YQ}hUTZUcKyVDDz>Ht8w;{S??y zL?%5=8XvH;20h6~+8<9=e0e=}eZMO*dOAEW;at|QkFi$$U_NIcvW^|6ILfy$){Gz& zUGg#FXD+_!)X~AKl2);HyvBResZV*|W>Fiwi#?|}lW5ve&gFWO=P15DKVm(pCu=Oj zcyf8>@>KFv@qEBj%M;I>?Jv~XpYTrVU$Vn14HsSZPKO&qy;pN#2Cv4`an*ECjTXc(da~3#XW$*8wa+2^32VX~4qc4?Mx@zkx{lW34 ztoM9@J=mjkom2~KkHb52Cuh3nTDnHe9ke5feftrWgLWo8cuSUh3-4P7y_57d;oAdu zCB6NKb?V$fe`Qa=yGfOU-b0ce@2*y+zAk-BX+1{vgZW3BIASXpD0DomURS?E1wy1r4*U+ zqduALw-pt+u_NgV!Y>ByOqx463pt}AXWmIFB}^8XGVrgQ?eT8X7X#l*`ogt4X)dy4 zF0y2MzM9HD8J^hG)rRcIlrc$@9oyT;4Q;Fi&t;5-V#CMwTKu_nX_Ab+8;m`A1tDYa zEXLk@7>kPL-_vvtj+`|fE72{R~<5r{6bCQq$KPIh=zt7yGkG*em2FXtt z>)v+#CFu(pgULS}AI%4*Wx6XZv7CFdbA_Yu0nR#!W$gXyikldF=P|bL=X);W^4!9? zX{P*SY-ar3o3t63$(}9R{-!2Vk;kdAwEGKqIJspkZk3tm=o++N+WR8yeG*-xETp|p zh^`^+q#aMrzqjdP+xs}}GTSWYQawhSM?l+WAI;kT+@X2P-p`umpLctv`+&vKqI+zK z=^Jy>;)pmoXqTpcJWRVCRtICsyDKWe$pOZV1B@FdY4=ImEjmag?XE;0c^@3;`pBD% zLvg7N+RvIqvDn{qy0_Iu+T&n@p>O^Fz`=vJWHLTF7$0}8h!fq4_XD)~`{-W}(PkY7 z@2*&m4p#YS;?ym)dkgJ8K)VmnZqc<)(C!1Yn|(Rp;4k3dO^pxCc5m;r-G6G)GtVxx zVwYDq$JgpV0gaB)50BChU*R0zliys)Ih_gqh4arYugmf@ty7dOlO1a1IyvKaMtF0L zc6NAzznuRy{C|Xh1=!}-;lGWqNOVD0C9s~fDS@0o1mCHFDD7OtB5dWXA8U4U1-?`0 z|MNHt`N1S5kb({;`J@he;e_S~23gj}7KS%>RL&vzx&S*+3buICSJ=8|Y3Y*hn$Rrg zi^>{{6CJSzdy$+`>|~#stlMH2le38TD2-S8ZU^=Us8h~lJG*ckx~a({Z)!3^gU6zz zOB#X6R(qw-uCiv0t-{V+Ug6xdNwmAO{2tC8cHPBU$P2e|b|(9m3)D)9>rGs6oMrE+ zyTj0pyFibw)Xf^nLe6u;Ub>mOo}D#8&QsRfg)V!9HS-Gh-rl~j=<7~ZQz z!hG{MLsfgfKg`ED7L^BxKakti_mEYoIC*WX@9%_(lZN{~Buu|;xNkrI=ML)PTgO?` z>;0bf8=#rkF~77tw_+ps+=l$S)cUg(FC}>bU%p~le`t(~9amZ3z@C4>>vZba!nxFO z-v+m6_1@CecN1}Cz+1-|%dA;&)}oT`?4ksmahwx?eZMdm+_Gv`c=OA&D}UyM=6uq9 z7OPg4%nawu^=#Tc0UTTlF0R3L%$XUSXQ$7XXg_V1^(LF@T~Ti>UEv2O+1)MLS=08r z!kZ=CnfqQPpGtlUg@D+iM74F*p zK3A8_jY=1Fqbs`lDka)`RkG^YsIpFN>*;CM@cEJ5_c!o%@@>1%9>$sr_&Nl>y1nRG z-#yV2_-e4azHX?p{?KsC`qxR9Rb%rVU1IUo@Te}%%#4>cv#{cFc)!l7q{d;(l5;4> z*TRdOpDTS1pOa>6k}YLF`I2Y-Q_!HJvTMovDP`8EO{40lqr_rssG=_keeR`9ITwB1 zl3SbXwAoFY-LyGFwKaGXlxe%@Zvq>2f;)KVOjqA$^a<@fG2FN2N5SPDd}IV?X4%k7 zEBpJDy`4PCGR$ANxdfXkv(dS02mb}?+E$dZXWO&|&%Leds1~?tX`O^spayKK~uq*X3N+8mncaoVRKV<2=}L_`=gp+gstj zV{60KA05iM=#*1;2XYObs|$8r&)pBc+M|lE>?*agnlmNqGFZD~-$fzmq|M_gyAQPc z#eJF0OIWMbXk)Yak~x37KWTP8tyX%8{|#Yp(k+~u**ueP;P9!yu$FkC;d8)o;8e12 zIpIl5e~|^768GCg7HmrYht0PDnK1pgiO|F1le40w>^(7@7tLJ^BYD^36SVkuhzAbv zCutM4xVMNyh8uCcw76>Gs<@9xPnV>{{gF7}8PQQ&o-^7qmoT&qbEFNYgIk2g4TONNKS=o<<#(~3 z_Tf*}O5uST?B$Z~zX+ct{3oG|2MS}9$RBx^@v0s;Q;~nHRiz^%0vX7^de$ChA^)6= zW0IEfu0q+ZTLU8o|%6rY??wvMn4->J2P9$;9_ zv)TRaaye6-v|4$=H{^`aF0`*J?F^^AHrmbkpbPPVTOwzK>f?K`B#i6TySRflEAxZM z^?YQI$c`6p3@#VnIG3gAmBHD;<+Z0pPR07OsOyoO;Bv;$Bbkh$THkK8`)c?v|HeUI z7d)f!=^4B4-3h_v@$?PJE3(Q$ngx_i8yyAkp6!=uKIEX(TcI>secM~o$NOt0E0vP> z8E^yL;Ums|yg}}PiD!(SNPDiMUD>p60`0sOI$p!s`}%kxX;t!$nxfaQ7-zss+{=^o zI63d#O!txzSA8ltqV^NLt%J$ylJEWc_W-`Dnu8;>^N@#Ow}-E47wZ3>Cx3MlY3J(S zEBN;CZI=I>{6ES64f_9O^8aMG^!NEE#_+6#2H-yfyf|00euxaOeM3*1MZGo0$@{YY zeKp_te4AyLP?m<{W3A;ckn-jG89mQ2ssCteo<<{&CnT=Hh^zXhHQnb%oI+eJyd`zk z5|@9ZHO;?_G&PL|ZdA3n6u&)5o21b?ZjvosnNrVLLdmMFXuUCph>ST2FDYLKUpcY% z8aHyUxB;9VKsL`)7|*QnlNd__bKr>?@JI6aSl@mJJ|SNPN1ot3>zbQA^PPQ^;vMjz z=x4U%>LhnxnYYuyulYkc`|girR|*A3=w0C-i_ybgw6=l--u zw)?eN!R6A&YL{H&&b(34?yPVf3U1!Pcx+?bvUd-QiBQ(yV;526Wvxoip;*oSKxwP+ z_8Zck@TOO!Y{uLvq94##r%Brm;?pF&TT9xJ=t&;->ud1b(%omJjiZ6dHkLDX@$Zm5 zhR%HaO&MRDUi4M=5!q|DYELWu%2Qc8w32liZ3t*nw|@?9HtGC;svRcd}Bf!bdv?Q8#xw;qQcRPFV3w zctZSi8pxL?yapfMqvF@Ax{EBdvj|;mVi#-@_&k^}*f)DWI%%<&3mkWlUf{4YpL+No z!vEZ<03H9%I*8z)-lUD-0NMx+koO5YfltowMHenk*|L=KY+88-`%gb5I`JCjFQIK3 z7}BQ91NfT@pBru3L7U+B&9Z0AiGOJUZQ4nj4$&szHEGi%+Ek*Z6wSmRf%f>ox7H>( z`>KR>pmO-blv^jDw`+g+DA}tf?fw9GrR*|A8L9WFo!Xi6hwuS&!t;eKeNB(A*W&G3 zpVs(db2r~)_~J2eQfJ|wA9ySSo-BoS(g(^v53-)>-B;Ju)4Twjod!?%X_Tw@2@6g4 z0Z-L?$PxZ)@pe7_uf*4I7E()mcRl`Xf!~PlU3g`hc6K{{S<_<`UxwA*Fa+Et&?XJG zJ>7k7VEX~E2`obno*$OqQnu%vkU9-m))VjD84_>6vX=Pj9eTV;OG;H=lxGNueyH97keWT)$G0R~Mu`8%$>}3kHd*6#HCqzP!x;-D zF5Q|~Zl;|m_>9r?WX{=EM%0ec%NS35ezY>`C^C9F_X9{?#@2LX_LRB|B^|#fpR=zr zry71pv2x#!8sA_^zWLNabi4X7o^(5U+A;XVtmksdtKmM;)0A-&RyVA1OvY!GlRtjh>`2 z;dlc$JZHj3V;^y>JRCkseA|FEdJOMon_eXizD6Tm@KxwtULD;lqX<9JPWz_J!gB7> zDM4oJLXJhiyV=|?xis0m@=MlkpF-Yt4^u{pAJr<=-mnBYiho$S+(CJLU%`L3hN99Z zR}`rcySOKOZ^iUa!gBH=}&Q z%Vpd_X1gm~)Av1cuOs^YTjPVvuO#hJ;C$cE@uMdOmuFjDsRhi3Wxvans-n@$m@`z^ zHtKT*vy9D@A+);CxvS3TxH;sRW=Bs-QlYo_L%F#}DS(0n7TQdjR6|Dvy#=~6EALQIq(JAh}1w3=cwu^d~Dv#yve0$9t`6uaXpuNmx zONrl3{M|R{I%-Y0vRTJ<4AXvsxs>SzkHhdMmi#k-K?R1J$zP5A z_5^87I3`H_1CNk$rUp(ef+^Lw}_u$wZyy*Nje{PpZzN?v5^Ep_b_{3N#G=PkZHA>Z5O ze}YjiXQ{p>|BY|KcR>Ef%b25}UnQm%bW=tN4*A}k2o9Z$W4qv28+Pkn$f@L`d1+Gb zodRE+G9vjC{X1XAE^Kqj`}ObJ<-dGeb)L9I{>Lh#($Tl@F*>rH@kPq{1w0}ASDPwh zgg!TVgg94B(<_|SyG!E4cJwrGdhtE4%}Q&TL(L&wP0yxRepWJOr7hg^%~IOKUZhD* z-ghvU$mX81Q>@F04kvBc$s8kH#kZO9TIK@yIUD86oq&n{c*;8sy_`y7Lo)U}satU5 z2KK7%$|&w3(sbV)l%w7AW3-`&d{y0=UeVgYo>{XU69vA=w(a3-4)dN8g)Fo+|DJ*S^uYujkukesczHw){uW(Ej)K1jfsM^E<&4@W_A7 z=BBr2to#r8PLuzd{Z0QrLjH$*UoQWV;ZnZf;}ZEF@|`08nID_~2g?7DZt1vh_eiEHq@ zr_XC|Vr;q(9W?aL#X7^rrHzLbgP@O!DAoB!UY8zv?lQvf8S%znR=*F@4PCK+tYF>gn|#Jh7vEZa?em;br`V~3 zOFgDU)S(l&m0_t?Z%qGT6BpD2qjSDGtY-L99oEOFZ@$`6pV(zYe_-rMHS4oiKfcec zRDZ)*eJHeE=Ow^t(8}heoJDQRsq4W$1XuQgmNekOF6qFPYnZnMSHwk!#t95ziPyE{ z3%;T36~DT(3oY1r(UtL`bFwc!)?2nBMTy<;2Dm_1+IMzg7WPx@#n>1%yd>kd-^o9> zZU2fxR&|%#9lNp+TZp3CJ1u9~N9YdNrWN)K+wgI*+a<3pG_RaJ-fZ(ao7%$wzBVh~ zyryj*abKg@z1y`#*2bEDuHPq{@r1sfgUxDRpH=$0>t)0hhz&hGtNAGFl)P7{fooX{ zQG5gW*S#Q_v;e+L+Cd$a^GO$;H70F>CY!_ehnP9;#&MD z(9T_VT!YGE99ahd&6$S9zE9yHe_v`-HdgEx7uD0oNb-7QIwp zl6yXH|IOLuHcx&(H_t?#A|CN!_%-PSuWJbtK3)>AeKIZ(j8ckUg!d&(HtbXl=;bHj zAq{ulXx~b3E;bYN^nD3DtOc>A5%2eD3F@Oe!zHe zGVb25hG*Stu3gx6kJJ1kBC-AU-ajs2`X_UI9_P=FGVXgu zr+dLCFe$0bpBj_@8N=A#%m0sugjW;&>q7tC6RZ7u-}pC!eGD!66uIlVm;YVupME!N zI{i-8sieKOpxMt7{7JM?`0FN%oGp;xFGXjOy^}(l?4!Yv!W$;u3yuvP{X72KJ{}jK zZOs}Fjfn9@z(c}6viGU3Oz%g+lehmw?@KkriM=>fhmkq>zlhh?uIcAfw6qTY2gK?9 ztW{rW-=}wzM*7dK2H$*Rl!NTqJP&zP{T{v>6*>=d-04@4w?LiJsay4;AiVgMD_Fb-k8; z#$X@gLvxDY@ULomii@yk_`{}rYKsHbAxWoNn7e(*n)Hvv{{;Ta%}TGsPMts78#wlN zr4n5G^MAzH!un~p{C}J^m_?M!9SnuDSikAMGs$LC0vbKK#rbCakhurANQ+V`ZLa)& zLm0~o$gkQxuOfjmz?(h*i&x3KMod^Fat8bDg$oh2Kw9*#6jpxS89`f_;A3utp+Q|_3 z#{)n1r%_8;3n^qiSr+9Dq!4sGIpGn-eerK=D1#-r~_1w2EcD={A zbA2_kKPY>yu=Bpiy2kaaHN8llZW2=NDzVpyjf?$q_|O#9lb`bkA~MKdOWx}=TTf4I ztz$+^Z0b_xqWzhx?xxTF$iz!+TfB4uFX%n`*giSlmtdyrmEe=}HM09E=*;MWtPR+p z2WJ{oB;JwXyDkiW9`!2yzDVxhoM`8+Ce?YMpnq&?Y^E($OE+Mo&taBbk$~?*$9r>S zU+yOvoYy7##qEh&y>qi-^)mL4@rfOk@-`(tGu9{gDFQ#w!3(`u2Tj`bMDCRv{BwFo zJf1tI>u=`#DYZQJpQ#(>oU|sS_8?yh@Gpf1rQo7L&UIn!&OI=7rEO7UZx?g+Ph!Wp z<^FGlvpBY7DZZ0kl_UAI^WZp{Z_8L7?|<|ydLAzNLci(3tY_8MSf(c zNkxA}US+7gi#+t<)D2JMrcV0J9MPFF)ILR3{7VJSRN$0#+fvrQvdQ-m_|^HZbG!(T zUT9t8&PZj%QSMwj4NvMipyE%XFP7kQxB*k~K?rEx%2 zI`@xr21#PM_^2xEJ9)*@tGvFeXBm8Tq*|L_B>CC%uf3mO4UcuABgpV+uRm&;D&vQo z%^rE@x65~SRp!(ZuiXWSui|p-^mUv)a4cR)6CRTA1o9y?-`P9#d^O-?$Gmi4FD%y80{=0KGXEjgD9&JS3QeU@4mL2Ed&F&>|n1bkl-@qy{ZJS2%ZU+?wff2fQYz|%-On`xuy4Jq(qU6Im!BX^=q z=YEtDd?r$mV`bRp>WjE@NyEFn{QldO5j|;tuNls?q+(}Uk5Xq^Nf`4_;OXTfZZ&bg zBMy9dvBUJ*PTXGNYKiN{{FeUM>j-hsy$9##2>*K|&aR{!cl#&+jDGODhJ8W=X#9_1Pv9yM}o zm#9Hwtx;pfs!>DO7hb@fdDx7b!%3S!S{v!=b}0cHY3u$XVV9`7H_ZPYGDa zYa?&nHYHGU2H%Y&kz}8b98#; z)Bfr{)|{$-U2>E@;W@5;_8f1Y$eilF-E(AL|KS@m1J&Tk)h9Z~3m&S$Lv_D|98cd~ zIo`g#bLwL=11@mk0vAf@%CY&%;C>z{uTPg8Z@=)Ie9Eio7nxJjN5{8P+UHCOd(f+p z5uMdtMcwDCv!y=umlv*2?RTamQ#s;l`fsSO^!W?dSL!@dGK2PEi~P^q=e_EJ__Ql$ zOG;_qk^hGJN=q-?zBuYzP5U@=;XiI)_lsy>GWBhzecZSCpVl`6-pqtISHqj7@a7D7 zvliY|N*^0r3xC$a=jx@(S?cGUI_r?1<2kL0~O?>%^r<~^48INlR@ z@5Os>-uv=y$c5js7Xi6Yw?V>QQFW0jVM0`0xEdIUjQAchVz?yAoV`u*3;DS*R6zpUvSM<1kLBA>p_Qv)^hO&73u z=$AH;Q7?%60G7290?R51fn}wHaZz>4C5(-#dq%?OsJf>mM0S-+2wXpr5c#!4LgZ43 zgvh0Z5(3*pN+7Lp!7`h`H&^0-?>+@xH?iT=BsFk!d2jdO32NZPI5qHPh8j3CMh!HN zRs)BItAXP~)xfty)WDI!YT)z$HBjpW{@!Zf^8_`pI#roA`s}s)Pj*cxZ~A<}{!jnG zor95?frHQFxlerjLwDT^KX89OdYb#VbE^Bxp}FqQ!l$?o6-{=3GT}z|>4iD&ukZ5& z&TK%B*`PGb7%gK|<8CEzEIc!C__v-w&4A3;8WS=DNqf@>aFUXV07}7XKzGdv_4$t+-X&fTo zahwknol^?$G>((+gq#`BZZ%=!aQW_)(}*47=mt;o!{`ha>gvxJR@Tn|?^TCD0uHPW(C3Aged#(S5I zO`JWO&Y6%-{M+Pg)5DA}$AG(%b8{Pavyc2(aOA%jcfJCDpZ>)Y=&1izfhQSj>cOS! zJmX9q?NN+z#%u9jCAOWKZJvN)j5nWf?)s58JOLLt@<35$(H@`c~6E=0^W@y9#JdzCr^7`B4UL6UQX6g5za$fe)<+r)_;QJwrTE~2~*vN$K|?D z)6O%_DeiBP+XtuK=x*+vMON1%t6j*$`k@kb$*D(H zyBMGAk<~8nnNR<%M^3wBoCe=AhMTfwJL7&Pc&|rJyU^=Pk<;55)9aDbF66Pu=~Bk_ zdgQbVnOuvU-cEcya@vLNuOc(mJ_$MX$Y~ejeLb>npqfyA@N3U&^+!Dck<-b@@A{MS z4s53-q(0=eOLXO+eA{#Ct(k<8$l~5PYmnJ%7#l>Uh@76uSiT*(eUSR=!zCT{A){UB z6!naI{i!!g%0f;j6F0L@-y92Lyf;kQxL8p)mf9>Ey&`;5kGaKA~OT($+JyzZRSv2dAHd-_rv!8Jja1Gd<0xsOK>FJOX}ez_lA+ zp-&?{%_pJxSIF!y@Jp#j)_%sk_DgFY&N%AFJsURv8GID| zH?fzMeip8zf0dUR=pL!03-3SHO|vl-tITOL(Gi>S&fNpcne3XKz_jJeWBxpv2m8zv z-6kdXHply4%KLWt7E40;RL;8!wQV-#>3c?lywxO^-A)^*t0$}H@)#BZvA?;!g{YglhNyKp=(j02V|kpb+hR5dvw=VXVT zi!J`Sb=Y)T_eb_?Vvm}?K3uDBlhh|`uA}B?z95^m^*Q$OD1Ysx`JL6@f`5?ayXGcJ(-)^`6*xTl7+YjVi@4IQ*Gn=(49Kl1|c zrC;FxF#UgwS-#5NM;mr8`y-K4GwxN2Exjf$SjV}+wo-4B^Q>B22Ct+z6nx)QztGQl z)>(|N@ihCQu2bDzlCE$oO1d2$wZ|#L-C;^P{#RPRu`lX5bt(Ro_C?*My6wGN(nXLq z;?l0eQ%S4kv5^OvBW2qc#o*iBr)}D6x@l=!@{wN4*G)-J<~)!VxX!4>HsG>}kIP-` zc|upik0d%p(buH3@@c2d<(arM9JsK%XMCj=SJ7`Wj;qD_gm(BUg7`@MB8rj+`esc@ zEx$e)zj4-;BF8E*tI$K9{PC)!uh^^e5@!i=eq@msdo+F5Cufne{?UNUoEAYjc6_oa zXOomuIK^Fl3FQotHLf=0L>lGTi#+IhvKM7zFDWNNFNZxq;)9#d+KG)a_3~0QxF#8J zl>k!_FntM3PXW_5)?mEYF2#oYB=>%BhQ3yotUF2j(5GS|fNNs1+m}6s^Jgi?23&cR zGm&x{7}wbI!&;6~q<~LpTM^~t8Etcg;L~=48(X!9vj|#ooW01iY$t06woC0R?Oiyd z*3SKcF2(I3PH2#Qot9^Qn>;t9luOzONt>d$ZQVWdQ&@-0H}bS!w-uW$c6?;3>VMYa zX--yTKd-~j+2oaFd>8UyU*9EmKx91Yh;4m7ByA~WhsLYmXEl4D?Ua?Gvd_S-j96z& z8VJYd#0D;MA(eOhxy!NTgLC~{ zw$S~zrO+h>96D8{!A+TRzBubq4IbW8&*r5~G~mgnpNP-9;78VZ&3(D`(6%1`C}_6} z+0tCYcwb8yKgZV~G+n@}I`);Sj!f#SBM;^5vlr&4tp{#}Gk`MWzANf5<%9ee{Q))$Z;tbO_-<`-_2dj04rlEzHirtJCoTQ5|0dp?!1A6&49P_HkA`bM|%rDf}0o41vi$f8JKk()8`5{o5>-hAj9<UhP zemz=#&M}qzl1}ohfxZ&v6UN%&%ImEo{ci5QaUwTt!u)h^^I}mD;{t z?b{+aw1u>%fU}@dfhSUZjvC-re_pEgC3@n5)s!t`q2x*7oLl^IMzW`9vzv7IB2F@RT9ZRkjw7|bv&dLbILj>vRMP`b&!tGyG!gX{@91RgGtxHG}c<=`QYaaGp41P}1u zUg4ooJfyV4gW#alz=5h7xi)xXlj5YXlB^240lqET7V+}s{b<8CyC#IA)Ggp!M%18Le$Q*GD<)vFafo+yP zMb-2XWR@>!=h$-gl}2Y1k6(S!LCWNQ83*fQzFs@Wl;d|FZRROuJ+YvZ`sPv}erm`` z#V7ta;-@s0`pk0If}0&Yx1I`)gkQDuya{7uZ-`6U$sDo1-F!mEgY)@A2v6PqsD3uj znft8RUphXY$J`?&_!R$s>?FB@=Qg;-)^ZS;e}?(q$Cjib#*k@!WDgbXT~B{M1m2zW z4L`V_SZd<>iKKvK=?b}z1Y5i>ap#qCc6)RpxC}xc(d+8Qwc;^_cqcgS&p3Mtc?1v5 z$b%;G*7DqM&?$wzmA{BA+a*5q$C=BU<*lY4p2jbCA@W-2Pbk=%o4k6A$6Rl&B7N)kv}GUCawN{vJ+Y{r|+0n=bjC8=Du+)=K~#Cgs)%+ zb9tF#3ynmlve2*AMc_-bR4GOVXk!3v*tfrjvZaLfoB+;~%&n`h^=w^wjJ*l;vpV6) zE$FDEcW%TFLPEal@cmhD>2pO!CjElAIPxP;*u$0JH{(@k^e*|gZO5kwn%7hIr8juC z`qkc7L)%i7;u}b}@xPSlmwu>5 zi=09R=YC09dnmid>&lcMKJc=i5FZ^!j~}X2WPekS|5Bzz5`Jy%k?LL)u`)yLvEl0h zPp_y)XDk}IDyafE%)D8^wi8)*`J#7L2CY3C7$c?)p^nfrR&)(#SG8DKbHf7JQ|)|Q z-g6en{^b%?nR5tytYYsbnprZ%w&{eZkfj($(`iqPOT#%(+>k{A$dg> zFC~mn<95khD^7iOh3J9eyCk}xf~-XsWFCI54%2=gfb1`bg%3n`mU+%QXM)SI&H23a z*HHgd@)a|blGoypu^$i0y0M|%%J zyGhI=FX6c!zpx?4o#JDroim}+pw;)ZeVK~FS=hk*05D#A6d&AgoN3;8PnyWv?~-@y z1@hhtEuQFr9_Bs`p^Nm9hiRk2+*tG&Cpe^!Xy*xL!wWi(ia&U~znF9ax9}SHW=<2| z@H#vWFR~Y)tzWe8!d=uYFv$6S7t$fn7xtJoSN5bfYkUc8Q>atMF8XZ6mi_~M2jF+^ z5vw@aKgHLCPLnubpijo%Q;hMP|5dSYfZHeckw){#eR(QR4g4%~NV!L>f#*x!CHRm3TRRWh2PE?s+FmF!gU371$GdV?>cDOk> zay<2J!$(r=2fL9`L1a`Z?>(>)9AQqLVZjE#-p?c0GWKH2$oN(*UeEgKjg)nmb?1Ai z3tQBYPq0f&w)Kv2TFB4)<>Xhpl3%eDXL84s8n47;_9Q>{xSiaOK3U*{PH&Na8-AIe zFlOyWE(Vc{rM$PPADdk?Hj4g~mq&T4v8}z14dfs;h{MS4%i@*cABzoyb6ajq^Gpef z4TSgms6)ou5xcwTQxPv`pc}fq>##h8x@)A0-@Rd#NQNBAlXW|jDa~@W;dpR>s zpp&3y!2A0S5^tH>zkHm_lb(gWM*JA>ppH+$^N%@ue;ajhKHW5U+4mUpuo5L&t3%6+ z4RKBG`SaFLkCr#FH81z5$7Dp{FIg9yChb0w+i4r;OB=n=uYDV@ppBP3>RGni9>4N1 zHp8#686Mtdb>B#vFXbQOt45>AJ^RKuU)O0A$^-PpHaxHznhbzOcS568@PyDP%N8}& z65|*?8GG?2Xw(x}XF{X?j-=skXf(r>H8HuH5;J3Ja`^!8m)r(_s^BlMO|cZ!L@Lu* z6ZWw#2mX3$_=^L^HPGmC;B~7#%O_Ko+7G;ZY0&7HP9v2%t;AcW4k*8qI_{v3RnX`$ zX!IGp`WtBUF?A@|8)=j8*U)H{qH1+$dEue8x#!O-G}7`yqn5l~fd&87{C@?fNxN%v zJ8dI8Vkyc8U+vrYPxc94{)lH;s77Vfa=8R40KaGb?GnKu88e>vI1%HM-_+jze} zJGora?B;!F&d_q9=@FsnU##x0u>*h2n*Dv``-7Bu{pDI(RmuyuxO+x<<~R0M0{8QO zJO3{uKjjA2x26pQc&|Z!DJ4zWDc0onX!ELlb^1JNPv{z2GV;2kGgd?AQL7eQ%$!$0 z$4BPjGVhi7uFQMIuF!rQtF#crtbFy=K{0N zlU`1_sUbRFEOpvBlT_ek{fhE*xRQ-B{`>St!ILsVa3pm#Sd~;0SNGU=u6SyredP_b zsXH)~FwbZ(+GN7RIhvY2D|6n?U_NG~`R|0;gMRhz&~@)cz`Nsr0NzkuOhwQ9F1+|F z1D^Bo;tL zGS?bS86wYDSrUu9^uJf%Nh{~fm=^nR7Wu_q^x-?B%h?B}*@h)8W1l9+WsKWRS*9Ex z!@JCl(ui*_w|{>6y!ORSq2r>ejf>~*0h4`kGLQS{VaCKIt!MDAqs?{L4b~7kp;73% zU2nl@2WeCA)v;X@i!Q4iv8anztR-*vc6r;U>C#DAl9xO6+SGgM?myz!bFQyZaEZ#9 z=ej*8lz!`$^ln;fO=wyy>vQOHWz56u=tJ4)SskrES(u-wehxU;WkiO%^}0EROjgXX5+B zW(tqS+(0OM;u?4AHkNAaVFHV8|Iqh%|CV|=W01LiucGeIUi_*0zoS&ro<`+oNxrIK zI=^12l@;&rt^cb~XrtCv+AQ#YLOp-GQ}=@s+reC9{0?k{+1PF)fPW`8^lauZq3ci6 z!1q$I$1ygAt{cieM_I?adcN4fMr@UGQW)pNwy=Y8?DOZ!9TwUeW;X+_p75^vbjLi9)!C$K2FAds?Zs%2-Mh7kNMQdrt31o>*|9Jnil;>d$RK9=BJ2Eat z_EpLEYQDwh@SsK3{u8k8b?h_u4e~TpcY6lAOa7b*&0g$mA`6b)sNY8=YfqG2nLkJF zHfW7+Z_g7MCTV4V`%SI44wIfqH>?~5|=HQ>BL`lLdr5XRx}qPN-Mzmxi^9``iKIJOTR z85`VYfoFBNH}~?>oTq@T`XJw87xN;A^YE3*@5C^UZ0r0M`Ki~)4-Uqk_o)dYONmvG7 zfH&5gbe~}1522;>!5it5l2(&{OB1!d_#MGTvcBLuGVR|YJ2{bz>;I)Xn>BRN5D}vb(r|s$+z&kz%Mv4^XTxm zEw89 z{0Zxx`uQ{txl3ZXx1zZXK1g3SgQ{<)a-0y*<3i+(( zZxo`_w7$W&^JmcqPr#?b6&p8ZY@ZJW%JVc^aIW?^;JP zRPg;Q^}bBKFLUpdlz%zp3*1%IA+m@?g3U(_o+uN3hL-#6@gRA(ygtVFGCJ%iaAM--%!ad^jp=DFHegWU z)sw`n`vg z3lsh#uEJJ&bxT}4cL*BrO%eFkBezX@1xGhXHbJALt-GCG^{3G6baSJBVF)28H};mlWJ{VQl|KKnyj;=K`C zd?oQIlwV*`(}mwfE({<}`kth(p&TdQ(q}|(l<`jD^SR4L`p8Mj4*pcxD!wlt|5V*t zmx|8}eikw&DEKZu^)~0XP^RqnoWa??^RMs*`k#DszjdBk`7rmrxq5^}p}(G;c?Ih| zoB<>9RL*cK9-vgtTt?g)iPO)52_55PAB)UI?j9hzoqn%c4Pz+0lsf`=p}R(alIPY+y(w54!wIz3%}i< z^B~_kPquzHDogeJ^C(Z+XFD>+=gd@_&{^3>Tb4WFdbM(soXOh(uP@edvPqdgPJ_YZ zjhWPwRo&aS!2JK?kpJ+A`G1c2zjU0&LpSL#Y_ipIFWVyRyv0q*Q~JLg^IvA4mVdVG zyki$ux*&r?cvCCCrjKvBS^oMC>gRv1`Ty5?9V5*;)V?isD8JMHU1t89(fZF;%X??_ zEB$;|n&rRSLH+!{!u-EeuOrT^Be`E|{U7N6qRfA#t^aJQv-A30PG6E){*eyq=YNd( z|0}(YBtKe_#FId*;9Gt^aJ9$(`4qpX~d{EI+-2`uV@l{6A8!V~bfwDdn2=XX^i6 zGXK@K{K-+BGs{=Qeu@_*1l{rvyE`TthEj%Up}R#UE7|6TgOpPK*F0WJS*rM!2> ze^mo~E6nmsJE))k%gq0a^g13i>)75}hq6@vH{1Nj{u~oF=jws!{l|W*$weEw1+dJw zqhH{AQOueBfz{aF%yEnxww5FJM-+$*)%1$iJtn@BZFLLpNnN)nCp5>fGTudYhK_qh zjtxoGDJ6MByKZf&N{~2I?;j96GRU(;XTBER|<8Cose@L8$Zz68t0EEuA28`!jHAK#`*hcu*Lbq2=UvEgeQt? z{wDiH+v2Pv-&%odF6D>nypIEi=)9*-w2qyn#D(g-57Fk6i@W>km=l_92F{8Di?8HA;mok^*hx@=gBg&=h9U*0VTgxtzeR0Rw z?;+{nyFej$IiLP+^6gk~6Uw)*8h8txYnVQ%!nd0>S~~n|Nhf^!5~0qw4*v!%ufy*< zPZ=G}u|#*7%-B+m&+Bj=XtC)4^a;g95x5ZjPs5Rh1BZUEt`e*Hec=xm&AFjP$>5s* zsm;?I{$yzW;X3p^cs9qtpY+rBi7PYaX=U6)Z2J%JlaCKqX#2h^e$b8E+izw= zpU{5u<#BVoIhRjD`^^WWlYUb}X!e_bX?Y#~H_lVW#q!d%1~2{5C{uVTvmGz}FQV5b zg+BIas!p%2LLcsPHt995l_q;GAj|g1+}BP!^Yt-!kLV0P0SB@srt1M6(q)e+&+a3w z&}9LkNtcHV9R7gt=-J>Fm$4^*EAVz!X8Up37^C)tj#2-5K_8=Xwet1(-QS6O5S?Nh zXK*&a+hXr#Y~EvIz9styGgOCmj;QP-+=k!p4CI{L$)ly&zA$|Uc2e<=C10)?CwfW& zGQ`kRG#ph^kHNPZj;;m{cTfCm6>o zLdS7a&PzXL+{_Ifhgm-=av{eUi=#_uuZ$D7B8StLTez zG(WJ*IHB?IaCidQaZ!AlM_XLn6(e*KKK<9R(6uZ5yoeJwUkARj!P^AR-MN-?cdVK% zzZtuP`@rd-W*;aeu0Kx@ zyv~1KX?_4bVctw@`nu?Em*>xt^Rm4$1)nQ{l%djY*&D&W2=G$H-90I>t+>di-Y@Wd zXIyAb!4FMrBbu&5e67S|Q%M;d65rLbK0gaM#ZHfopUJ+GF~F5Si1nV_)_9fpkrICy z@iSZFlYx1t#E&9g&Vx3}k$AVnU(NYKQaB%XA3)-qoC~m;z2_6DL(1d+&{Wx5au6SCSzDh;UkmLYdC*Y$$1Fm# zf85Qx;PD2+GS)H*ax!)P%~3@^yC`0HpL+yqLS$MlWz93zJcXVXo^qp~M1zYwL7av8P4GjUunexJ*J*#$C<3$lHO0*weJN)PqU7eOh3Ds5g18?l~NutFYOx)6eBb zJ^_D)o4H;p`$?TjL=n2%H1XZF8GA6a^hdI_^!Ui>>6tg0>0Rt83r!ynJ|iA{blH$X z#dis9k~1Lg+1@Yho*B-xdziD{!a7=<{uKQl(N;l^^*wlz! zspL)lwRYa{k?o{=^*Z>Gb9d_uz25BOvToO*i~v^Y<02D9M%;{yILW-=qVoe&X#P+c zk?Pj(ovzdLM!nCxFYwWCSdVBf=m&pWxR)t|{wVTc8MtLW)Qx=unw;5lneSiRA5

      +X^|kNw2pF576v1T;Qy6E>o{DS3Pv(r~AF3oH9X|w<1H!^!0}+W!U$ZVry9carh|J=$Fq!1MX*zk$ZQQUU>_$*#~JmbN_xD zx=G5|`~3^!UH)_p~MW{iM(5t{(9}I&)l4 zpGf-8X|uo~@QBUdd>2{uw`y6BsK|ZsTD9`ZtqiTtdH6%DqG6X1Fp+=xFC0^Frjej1LiVKH|j8z|h;VTYjH=k!iO^ zbMlB>w(>mP4f@aQ_+Pi~{5yuHut zn#H6!rKg!CX`bg?=IdJdsAP?zjo|{nz+#~dqBq#k8&cq5ryAS9xH2tby{DN4<;`-A zh}@B#N4)eQJ2)?c?zXr-roTaj_!~424lYmSpZMw(pl_sRcJXo6z@DPyvD}@i94S_eIfNHG#-9GwS?(Nf)yLY; z_>6hXYD`nqG z+4JD3N0xa5D>;{6a8(fAyIei8Xn*52`V(tNW!AKnVylI>n-f^iAq*^B#yLSbO0)3b zx-+srGTt8}Wz&a~#f6kT&nSCG*Lbb$4=I~7{5Kbbl-4BP|!c* zAO1oG{qa{*tFKa;s%9&y_p1D)%-0l8a=-i}^))RIW#ljOoaO&z`OB2E`KiYLRQ0v< zoq^weo+on-(Y0i)c{8$8=nh9^oI`iL-w91(u5Ep8L6@HD_^sVMoa2`9WHh-H; zURMaOzNeMj*3NC%m|OI|t)vmX?+rpz@2fW8`AsMJFSdQDM*CJ7<*CTg?{(0=nZLVW z`!>lOKC!iZn`CbETqp2>>rLj|-Afv2Upb-KzA^)z*`4G+&p5Fube#BRtv*iNZImbN z`--^GaYF1V-$zgE$Yv>HtLP%3c3USlOU2MLR~dRH`S*m{pG`frv-~yelN3GE%x~Dg zD#V^rF-Wtg7xfaUjZxbi@-b-lW`#lXNhkvsco;&^sZ0MYuOgqjN(s?PPnsAk2$9c`j zyOt2UsiwDf)W**IrsXaqb5Fa>tF-kMjcy4V-I8fr4Rm`>t0zIDTOZ<>Q)%Q@8apyxCZ$fLZ{i3E9X>% z(&={Mgid!8nsmC8cNr5V5{g|qlqQpj6PnycXwu{sEq$#2YQk2UwE8HvJwvslb%xIS z(QC9p`q33y9eO|7N?b?%=vVZ$_WkJg??{WalpWfSl8v@?#A6-N=l1VFpE7A%2z|Oz zSNnc+>}#DqK|+&0XLuL-9Mr-K_oGipCp0@uXws~~$h()Ym1gJ4(2mER&gnJ9px4`4 z`8vI>?}T1y9ndT8JJM@(J9=#~+I6w?Y8-g+{i#nodaa0ty9+k#uH12}`m#MP z?)h}}i{QDCEc~z4x-6Wk)ve3I4~gqY7QO}VdbBaDtt|9py80#aSa{y}t*%#H>^M_R zU7>REYT)QhEaoNX%?fU zkM%bl4yD<((Bm5DG9H`xxb^h|vbfVUllx577XSB-_NKKz2V3^-Jj_^`$enX?ett4z z;T+nfyy0p3g8C#*bdGz8vxVzpmn~d$4({V5?XA#D(dZ?2qRD=$IP75#|EG*!zx$uywJdDlq>z?*Tj`|U`O*w-$l2Zi{1HRtd`xKemwy_0Uniu$#E4Cxqw)4) z=`!A+OF%2vp~A&r6p#+TMFFeOct1$ZggLM&+{>X|AuE=fZV_m(||^FYm5uu?1;(nFNg34qNuz znDvCVaU^M^jUGa?jaTt5{5GJI{O94hicnk03&10?ppRCb&U0&s>qr*JxS+`b)?VqK z7sUrY$}(hu*4`cl+!xDp6Tbs)=TVm-3$(h9eR(d=9VAY8?khr*=MM2MvS5!EUYO_h zl1}LHPePL(9~ybL5uTUlI$Y~$87nJ7$4U?Fk+E`%R<=G?jv+2|tQ5F~X9q(YY>cDI zkkhOa6g|awSccvHI%P=qqtDSb9IphnK{75fUgnDp zC9RL|Uz8_4e;3OmHp*nIm3hBb=HryF^Nm(l35MC@^$Z z4r6YG>CY=^g(nIKb)Jaz-({3DiLkRWI__g_=7bfYwy?iGug~E#wX*d&;a`Z`(Sa@O zW%`MWad(|YPe;*HtktiBo=fp7Wl!7YiO@B5QR>Qw!dVZ`;{I6qPD$pDx|G?=J~;dOQ5}S~(8?ZY}Is26RmCj{EKu+9-YZZLK`L?_N(_M}0R< zWFq5D8DqKh-5aFuvc?v>b8cE^Gz|L=G`zeW4POGLHZ-j2<7;$%HyZYCN5h|=2XCQ$ zb}{Ls&pt(H((nl*@BM@qOG8O3G+an%((qxe9EbmhTG$B$X+$~js~A6@i}t+0^u zI+TFKNuPd({}J8ooQ3ZR(4PY~-s#62neNRMy{RL)y#$(FY@horup*yZWbCE1LvVdr zsO+}&_06VCV@`8XD~59x3i^PrYK z+C;q2*Gf8*zKWK|;s2a}dO!az^PrCV>D|CD{q&z&nR-8+NnA($GzYqBV=Vel%NWZV zxQ%{#A(@-_9cVS4`a@;z>%i8gzdq2{7xo?d>rl!JmAM;RaCq*VER=T7kxpp0n$V=( z^G4ps2rst3N?M`k(}X5HpZtH!y?c06)w%e;XC}a&gnJSa0wxncoe7{QfiMDQ5)cD; z4b*E}0$808sRb|PqB4NmK&)jDMZq2dUQROBmRhi+l^V3R@p@2Os%?)Z;3Yt{Dz^** z^ZmSQ@15*SCK%2+&-45JG0)nw_S)<6-qyR`^{#iRdeR~bRoV%^Ce)YInzo%Dd*lg2 zkDX`MDQns<$*WATru`>$oHMC)uIwrw{Wo>m_1POw)AvL?`)E$rdG=-6vg@+} z+KOL8okyO))lX`{b*$=BT4bM+&o>(KVUAgs zjJ26Oe45zn%{x`ap_QE=&H=siNz3u0{u&Hx)qoZGSr{CjuZ~q?Kz1RqLi@(cX&cgq4h=!jR zK8EyHc($v!J+T3u(?&;2fJug-BX^*g-_cH2>;05^HFRW)W^OX@_wMO*O*=hJr@YY9 zHKZ0j&EQ$+i37;%XjrY%w8|%*rsy<`=`7(Jm<{T{hq1GJyOZX+g9K0NSO8>9Y z&P;Cpl6vj)?}*ckArT$iat3tpFm2iA-+r_uIG_9d<2a{RmHo#gq* zD|Dn+R5RD+$XOZqQg}9xcicOhcbVc>-t&#{>oSvH#edpEnMd&_-F5H158t{Cxt&Zb zxMD|3&>5=JbiJyc_-KC$~-__FXJ=$z=^s8Ny&a_2<$&RDX`F5Oh2jzH7sW-3a~uOImP22`De|1IVq~jx zB^L<1*N-yI z+{eLLjSB8x&C)gfSylcTEo$1MJIoPf;Hs-~{Xxc6W}73D8MEL_Y>|>KqhBtbmz_$k z&F6nt>%EJ512&!i@F#{X(k?Idk|*-wb5cuQ9N<}CwVPDh7h9yrDQkb|ujI=-&`4^? zsnp1So8P>mQn`z^6I)~__U3P+ha!_6UQqQL^e~|ldhkLIA+cvIw9&&|20cKtGZj6I z=|~Ut;2PR~_pXJ|z+H~Twa~zR;=%ld-x_BJ8mJ1+G3?P|-(`N-YFnSFb4DL!DH_;) zI{yIHg1f~wkRszVaJ5@(1FIOP$m%@mmK2duj)5&{t|iZWq`5A@GLx|$sWUyN!T!v0cw9xo{6U-&w28kTCt1y@&bIk2UnwI_x%h;O z9FjSt#ep1Ju%Z;%QdPq__7{e@{M*iP`G1q=@^=;YOK4v+Qe8i=U zp&p#SsOmBHgp0{*Fy(%O(*F#cp9jvX;d2Gsi56_-E<^*a<{G+7d^22NXRM(W>}t(% zB-(>bL?<5)>^iUal`-0Q{UO>ib-`ACyPG`Wx1W$&{C1z}6ESO5npoGiz_Nz>My$IlYF1{q2%V>4|3f}XEa5ug zuK@hCE)s~YBZh<2{r35s19xd-8tREF(zN?aI-#>v=E&n1zwfd z1Sx85HjlMgYDI`Tu{ClwGg+<81Xi*J_!5186R{tpoo%$!cp{cB&-;g-S|8tDswPIiX8Qsixjeb(Rh�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