SDL_image: Updated the Xcode project

From 3a2c203a806b3c201299f47ad192b0befc93c4b7 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 21 Oct 2025 08:28:30 -0700
Subject: [PATCH] Updated the Xcode project

---
 Xcode/SDL_image.xcodeproj/project.pbxproj     |  56 +++
 Xcode/iOS/SDL3.framework/Headers/SDL.h        |   3 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_assert.h |   7 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_atomic.h |  18 +
 Xcode/iOS/SDL3.framework/Headers/SDL_audio.h  | 184 ++++++-
 .../SDL3.framework/Headers/SDL_begin_code.h   |  75 ++-
 Xcode/iOS/SDL3.framework/Headers/SDL_camera.h |  28 +-
 .../SDL3.framework/Headers/SDL_clipboard.h    |  36 +-
 .../iOS/SDL3.framework/Headers/SDL_cpuinfo.h  |  21 +
 Xcode/iOS/SDL3.framework/Headers/SDL_dialog.h |  10 +-
 .../SDL3.framework/Headers/SDL_dlopennote.h   | 227 +++++++++
 Xcode/iOS/SDL3.framework/Headers/SDL_endian.h |   6 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_events.h |  88 +++-
 .../SDL3.framework/Headers/SDL_filesystem.h   |  34 +-
 .../iOS/SDL3.framework/Headers/SDL_gamepad.h  | 164 +++++-
 Xcode/iOS/SDL3.framework/Headers/SDL_gpu.h    | 411 +++++++++++++--
 Xcode/iOS/SDL3.framework/Headers/SDL_haptic.h |  72 ++-
 Xcode/iOS/SDL3.framework/Headers/SDL_hidapi.h |  19 +
 Xcode/iOS/SDL3.framework/Headers/SDL_hints.h  | 369 ++++++++++++--
 Xcode/iOS/SDL3.framework/Headers/SDL_init.h   |   4 +-
 .../iOS/SDL3.framework/Headers/SDL_iostream.h | 149 +++---
 .../iOS/SDL3.framework/Headers/SDL_joystick.h | 187 ++++++-
 .../iOS/SDL3.framework/Headers/SDL_keyboard.h |   3 +-
 .../iOS/SDL3.framework/Headers/SDL_keycode.h  |   2 +
 Xcode/iOS/SDL3.framework/Headers/SDL_log.h    |   4 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_main.h   |  27 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_mouse.h  | 141 +++++-
 Xcode/iOS/SDL3.framework/Headers/SDL_mutex.h  |   8 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_pen.h    |  57 ++-
 Xcode/iOS/SDL3.framework/Headers/SDL_pixels.h |  12 +-
 .../Headers/SDL_platform_defines.h            |  23 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_power.h  |   8 +-
 .../iOS/SDL3.framework/Headers/SDL_process.h  |  11 +
 .../SDL3.framework/Headers/SDL_properties.h   |  31 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_rect.h   |   9 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_render.h | 470 ++++++++++++++++--
 .../iOS/SDL3.framework/Headers/SDL_scancode.h |   2 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_sensor.h |   3 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_stdinc.h |  87 +++-
 .../iOS/SDL3.framework/Headers/SDL_storage.h  |   4 +
 .../iOS/SDL3.framework/Headers/SDL_surface.h  | 257 ++++++++--
 Xcode/iOS/SDL3.framework/Headers/SDL_system.h |   4 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_thread.h |   3 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_timer.h  |  12 +-
 .../iOS/SDL3.framework/Headers/SDL_version.h  |  11 +-
 Xcode/iOS/SDL3.framework/Headers/SDL_video.h  | 234 +++++++--
 Xcode/iOS/SDL3.framework/Headers/SDL_vulkan.h |   6 +-
 Xcode/iOS/SDL3.framework/SDL3.tbd             |  35 +-
 .../SDL3.framework/Versions/A/Headers/SDL.h   |   3 +-
 .../Versions/A/Headers/SDL_assert.h           |   7 +-
 .../Versions/A/Headers/SDL_atomic.h           |  18 +
 .../Versions/A/Headers/SDL_audio.h            | 184 ++++++-
 .../Versions/A/Headers/SDL_begin_code.h       |  75 ++-
 .../Versions/A/Headers/SDL_camera.h           |  28 +-
 .../Versions/A/Headers/SDL_clipboard.h        |  36 +-
 .../Versions/A/Headers/SDL_cpuinfo.h          |  21 +
 .../Versions/A/Headers/SDL_dialog.h           |  10 +-
 .../Versions/A/Headers/SDL_dlopennote.h       | 227 +++++++++
 .../Versions/A/Headers/SDL_endian.h           |   6 +-
 .../Versions/A/Headers/SDL_events.h           |  88 +++-
 .../Versions/A/Headers/SDL_filesystem.h       |  34 +-
 .../Versions/A/Headers/SDL_gamepad.h          | 164 +++++-
 .../Versions/A/Headers/SDL_gpu.h              | 411 +++++++++++++--
 .../Versions/A/Headers/SDL_haptic.h           |  72 ++-
 .../Versions/A/Headers/SDL_hidapi.h           |  19 +
 .../Versions/A/Headers/SDL_hints.h            | 369 ++++++++++++--
 .../Versions/A/Headers/SDL_init.h             |   4 +-
 .../Versions/A/Headers/SDL_iostream.h         | 149 +++---
 .../Versions/A/Headers/SDL_joystick.h         | 187 ++++++-
 .../Versions/A/Headers/SDL_keyboard.h         |   3 +-
 .../Versions/A/Headers/SDL_keycode.h          |   2 +
 .../Versions/A/Headers/SDL_log.h              |   4 +-
 .../Versions/A/Headers/SDL_main.h             |  27 +-
 .../Versions/A/Headers/SDL_mouse.h            | 141 +++++-
 .../Versions/A/Headers/SDL_mutex.h            |   8 +-
 .../Versions/A/Headers/SDL_pen.h              |  57 ++-
 .../Versions/A/Headers/SDL_pixels.h           |  12 +-
 .../Versions/A/Headers/SDL_platform_defines.h |  23 +-
 .../Versions/A/Headers/SDL_power.h            |   8 +-
 .../Versions/A/Headers/SDL_process.h          |  11 +
 .../Versions/A/Headers/SDL_properties.h       |  31 +-
 .../Versions/A/Headers/SDL_rect.h             |   9 +-
 .../Versions/A/Headers/SDL_render.h           | 470 ++++++++++++++++--
 .../Versions/A/Headers/SDL_scancode.h         |   2 +-
 .../Versions/A/Headers/SDL_sensor.h           |   3 +-
 .../Versions/A/Headers/SDL_stdinc.h           |  87 +++-
 .../Versions/A/Headers/SDL_storage.h          |   4 +
 .../Versions/A/Headers/SDL_surface.h          | 257 ++++++++--
 .../Versions/A/Headers/SDL_system.h           |   4 +-
 .../Versions/A/Headers/SDL_thread.h           |   3 +-
 .../Versions/A/Headers/SDL_timer.h            |  12 +-
 .../Versions/A/Headers/SDL_version.h          |  11 +-
 .../Versions/A/Headers/SDL_video.h            | 234 +++++++--
 .../Versions/A/Headers/SDL_vulkan.h           |   6 +-
 .../macOS/SDL3.framework/Versions/A/SDL3.tbd  |  35 +-
 95 files changed, 6298 insertions(+), 910 deletions(-)
 create mode 100644 Xcode/iOS/SDL3.framework/Headers/SDL_dlopennote.h
 create mode 100644 Xcode/macOS/SDL3.framework/Versions/A/Headers/SDL_dlopennote.h

diff --git a/Xcode/SDL_image.xcodeproj/project.pbxproj b/Xcode/SDL_image.xcodeproj/project.pbxproj
index f9073a8c0..0a9544e3a 100644
--- a/Xcode/SDL_image.xcodeproj/project.pbxproj
+++ b/Xcode/SDL_image.xcodeproj/project.pbxproj
@@ -64,6 +64,20 @@
 		F354743E2828CA66007E9EDA /* IMG_jxl.c in Sources */ = {isa = PBXBuildFile; fileRef = F354743B2828CA66007E9EDA /* IMG_jxl.c */; };
 		F35475FD2829BAF9007E9EDA /* IMG_avif.c in Sources */ = {isa = PBXBuildFile; fileRef = F35475FC2829BAF9007E9EDA /* IMG_avif.c */; };
 		F382070E284EF58C004DD584 /* CMake in Resources */ = {isa = PBXBuildFile; fileRef = F3820707284EF58C004DD584 /* CMake */; };
+		F3DB661D2EA7DDC000568044 /* IMG_ani.c in Sources */ = {isa = PBXBuildFile; fileRef = F3DB66102EA7DDC000568044 /* IMG_ani.c */; };
+		F3DB661E2EA7DDC000568044 /* nanosvg.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66172EA7DDC000568044 /* nanosvg.h */; };
+		F3DB661F2EA7DDC000568044 /* IMG_ani.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB660F2EA7DDC000568044 /* IMG_ani.h */; };
+		F3DB66202EA7DDC000568044 /* IMG_anim_decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66112EA7DDC000568044 /* IMG_anim_decoder.h */; };
+		F3DB66212EA7DDC000568044 /* IMG_gif.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66142EA7DDC000568044 /* IMG_gif.h */; };
+		F3DB66222EA7DDC000568044 /* nanosvgrast.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66182EA7DDC000568044 /* nanosvgrast.h */; };
+		F3DB66232EA7DDC000568044 /* IMG_webp.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66162EA7DDC000568044 /* IMG_webp.h */; };
+		F3DB66242EA7DDC000568044 /* tiny_jpeg.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB661B2EA7DDC000568044 /* tiny_jpeg.h */; };
+		F3DB66252EA7DDC000568044 /* IMG_anim_encoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66122EA7DDC000568044 /* IMG_anim_encoder.h */; };
+		F3DB66262EA7DDC000568044 /* qoi.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66192EA7DDC000568044 /* qoi.h */; };
+		F3DB66272EA7DDC000568044 /* xmlman.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB661C2EA7DDC000568044 /* xmlman.h */; };
+		F3DB66282EA7DDC000568044 /* IMG_avif.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66132EA7DDC000568044 /* IMG_avif.h */; };
+		F3DB66292EA7DDC000568044 /* stb_image.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB661A2EA7DDC000568044 /* stb_image.h */; };
+		F3DB662A2EA7DDC000568044 /* IMG_libpng.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DB66152EA7DDC000568044 /* IMG_libpng.h */; };
 		F3DC38C32E4CFF2500CD73DE /* xmlman.c in Sources */ = {isa = PBXBuildFile; fileRef = F3DC38C22E4CFF2500CD73DE /* xmlman.c */; };
 		F3DC38C42E4CFF2500CD73DE /* IMG_anim_encoder.c in Sources */ = {isa = PBXBuildFile; fileRef = F3DC38C02E4CFF2500CD73DE /* IMG_anim_encoder.c */; };
 		F3DC38C52E4CFF2500CD73DE /* IMG_libpng.c in Sources */ = {isa = PBXBuildFile; fileRef = F3DC38C12E4CFF2500CD73DE /* IMG_libpng.c */; };
@@ -190,6 +204,20 @@
 		F3547625282AE1C6007E9EDA /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = "<group>"; };
 		F3820707284EF58C004DD584 /* CMake */ = {isa = PBXFileReference; lastKnownFileType = folder; path = CMake; sourceTree = "<group>"; };
 		F3D87D15281EA88F005DA540 /* webp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = webp.xcodeproj; path = webp/webp.xcodeproj; sourceTree = "<group>"; };
+		F3DB660F2EA7DDC000568044 /* IMG_ani.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_ani.h; path = ../src/IMG_ani.h; sourceTree = SOURCE_ROOT; };
+		F3DB66102EA7DDC000568044 /* IMG_ani.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = IMG_ani.c; path = ../src/IMG_ani.c; sourceTree = SOURCE_ROOT; };
+		F3DB66112EA7DDC000568044 /* IMG_anim_decoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_anim_decoder.h; path = ../src/IMG_anim_decoder.h; sourceTree = SOURCE_ROOT; };
+		F3DB66122EA7DDC000568044 /* IMG_anim_encoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_anim_encoder.h; path = ../src/IMG_anim_encoder.h; sourceTree = SOURCE_ROOT; };
+		F3DB66132EA7DDC000568044 /* IMG_avif.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_avif.h; path = ../src/IMG_avif.h; sourceTree = SOURCE_ROOT; };
+		F3DB66142EA7DDC000568044 /* IMG_gif.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_gif.h; path = ../src/IMG_gif.h; sourceTree = SOURCE_ROOT; };
+		F3DB66152EA7DDC000568044 /* IMG_libpng.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_libpng.h; path = ../src/IMG_libpng.h; sourceTree = SOURCE_ROOT; };
+		F3DB66162EA7DDC000568044 /* IMG_webp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IMG_webp.h; path = ../src/IMG_webp.h; sourceTree = SOURCE_ROOT; };
+		F3DB66172EA7DDC000568044 /* nanosvg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = nanosvg.h; path = ../src/nanosvg.h; sourceTree = SOURCE_ROOT; };
+		F3DB66182EA7DDC000568044 /* nanosvgrast.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = nanosvgrast.h; path = ../src/nanosvgrast.h; sourceTree = SOURCE_ROOT; };
+		F3DB66192EA7DDC000568044 /* qoi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = qoi.h; path = ../src/qoi.h; sourceTree = SOURCE_ROOT; };
+		F3DB661A2EA7DDC000568044 /* stb_image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = stb_image.h; path = ../src/stb_image.h; sourceTree = SOURCE_ROOT; };
+		F3DB661B2EA7DDC000568044 /* tiny_jpeg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = tiny_jpeg.h; path = ../src/tiny_jpeg.h; sourceTree = SOURCE_ROOT; };
+		F3DB661C2EA7DDC000568044 /* xmlman.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = xmlman.h; path = ../src/xmlman.h; sourceTree = SOURCE_ROOT; };
 		F3DC38BF2E4CFF2500CD73DE /* IMG_anim_decoder.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = IMG_anim_decoder.c; path = ../src/IMG_anim_decoder.c; sourceTree = SOURCE_ROOT; };
 		F3DC38C02E4CFF2500CD73DE /* IMG_anim_encoder.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = IMG_anim_encoder.c; path = ../src/IMG_anim_encoder.c; sourceTree = SOURCE_ROOT; };
 		F3DC38C12E4CFF2500CD73DE /* IMG_libpng.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = IMG_libpng.c; path = ../src/IMG_libpng.c; sourceTree = SOURCE_ROOT; };
@@ -256,15 +284,22 @@
 			isa = PBXGroup;
 			children = (
 				AA579DF1161C07E6005F809B /* IMG.c */,
+				F3DB660F2EA7DDC000568044 /* IMG_ani.h */,
+				F3DB66102EA7DDC000568044 /* IMG_ani.c */,
+				F3DB66112EA7DDC000568044 /* IMG_anim_decoder.h */,
 				F3DC38BF2E4CFF2500CD73DE /* IMG_anim_decoder.c */,
+				F3DB66122EA7DDC000568044 /* IMG_anim_encoder.h */,
 				F3DC38C02E4CFF2500CD73DE /* IMG_anim_encoder.c */,
+				F3DB66132EA7DDC000568044 /* IMG_avif.h */,
 				F35475FC2829BAF9007E9EDA /* IMG_avif.c */,
 				AA579DE2161C07E6005F809B /* IMG_bmp.c */,
+				F3DB66142EA7DDC000568044 /* IMG_gif.h */,
 				AA579DE3161C07E6005F809B /* IMG_gif.c */,
 				AA579DE4161C07E6005F809B /* IMG_ImageIO.m */,
 				AA579DE5161C07E6005F809B /* IMG_jpg.c */,
 				F354743B2828CA66007E9EDA /* IMG_jxl.c */,
 				AA579DE6161C07E6005F809B /* IMG_lbm.c */,
+				F3DB66152EA7DDC000568044 /* IMG_libpng.h */,
 				F3DC38C12E4CFF2500CD73DE /* IMG_libpng.c */,
 				AA579DE7161C07E6005F809B /* IMG_pcx.c */,
 				AA579DE8161C07E6005F809B /* IMG_png.c */,
@@ -274,10 +309,17 @@
 				AA50AA461F9C7C50003B9C0C /* IMG_svg.c */,
 				AA579DEA161C07E6005F809B /* IMG_tga.c */,
 				AA579DEB161C07E6005F809B /* IMG_tif.c */,
+				F3DB66162EA7DDC000568044 /* IMG_webp.h */,
 				AA579DEC161C07E6005F809B /* IMG_webp.c */,
 				AA579DED161C07E6005F809B /* IMG_xcf.c */,
 				AA579DEE161C07E6005F809B /* IMG_xpm.c */,
 				AA579DEF161C07E6005F809B /* IMG_xv.c */,
+				F3DB66172EA7DDC000568044 /* nanosvg.h */,
+				F3DB66182EA7DDC000568044 /* nanosvgrast.h */,
+				F3DB66192EA7DDC000568044 /* qoi.h */,
+				F3DB661A2EA7DDC000568044 /* stb_image.h */,
+				F3DB661B2EA7DDC000568044 /* tiny_jpeg.h */,
+				F3DB661C2EA7DDC000568044 /* xmlman.h */,
 				F3DC38C22E4CFF2500CD73DE /* xmlman.c */,
 			);
 			name = "Library Source";
@@ -362,6 +404,19 @@
 			buildActionMask = 2147483647;
 			files = (
 				BE1FA71A07AF4C44004B6283 /* SDL_image.h in Headers */,
+				F3DB661E2EA7DDC000568044 /* nanosvg.h in Headers */,
+				F3DB661F2EA7DDC000568044 /* IMG_ani.h in Headers */,
+				F3DB66202EA7DDC000568044 /* IMG_anim_decoder.h in Headers */,
+				F3DB66212EA7DDC000568044 /* IMG_gif.h in Headers */,
+				F3DB66222EA7DDC000568044 /* nanosvgrast.h in Headers */,
+				F3DB66232EA7DDC000568044 /* IMG_webp.h in Headers */,
+				F3DB66242EA7DDC000568044 /* tiny_jpeg.h in Headers */,
+				F3DB66252EA7DDC000568044 /* IMG_anim_encoder.h in Headers */,
+				F3DB66262EA7DDC000568044 /* qoi.h in Headers */,
+				F3DB66272EA7DDC000568044 /* xmlman.h in Headers */,
+				F3DB66282EA7DDC000568044 /* IMG_avif.h in Headers */,
+				F3DB66292EA7DDC000568044 /* stb_image.h in Headers */,
+				F3DB662A2EA7DDC000568044 /* IMG_libpng.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -577,6 +632,7 @@
 				F35475FD2829BAF9007E9EDA /* IMG_avif.c in Sources */,
 				AA579E04161C07E7005F809B /* IMG_tif.c in Sources */,
 				AA579E06161C07E7005F809B /* IMG_webp.c in Sources */,
+				F3DB661D2EA7DDC000568044 /* IMG_ani.c in Sources */,
 				AA579E08161C07E7005F809B /* IMG_xcf.c in Sources */,
 				AA579E0A161C07E7005F809B /* IMG_xpm.c in Sources */,
 				F354743E2828CA66007E9EDA /* IMG_jxl.c in Sources */,
diff --git a/Xcode/iOS/SDL3.framework/Headers/SDL.h b/Xcode/iOS/SDL3.framework/Headers/SDL.h
index f8586ad46..7cfba76e6 100644
--- a/Xcode/iOS/SDL3.framework/Headers/SDL.h
+++ b/Xcode/iOS/SDL3.framework/Headers/SDL.h
@@ -20,7 +20,7 @@
 */
 
 /**
- * Main include header for the SDL library, version 3.2.6
+ * Main include header for the SDL library, version 3.3.0
  *
  * It is almost always best to include just this one header instead of
  * picking out individual headers included here. There are exceptions to
@@ -42,6 +42,7 @@
 #include <SDL3/SDL_clipboard.h>
 #include <SDL3/SDL_cpuinfo.h>
 #include <SDL3/SDL_dialog.h>
+#include <SDL3/SDL_dlopennote.h>
 #include <SDL3/SDL_endian.h>
 #include <SDL3/SDL_error.h>
 #include <SDL3/SDL_events.h>
diff --git a/Xcode/iOS/SDL3.framework/Headers/SDL_assert.h b/Xcode/iOS/SDL3.framework/Headers/SDL_assert.h
index 6c90acc02..2ab796a1a 100644
--- a/Xcode/iOS/SDL3.framework/Headers/SDL_assert.h
+++ b/Xcode/iOS/SDL3.framework/Headers/SDL_assert.h
@@ -126,15 +126,12 @@ extern "C" {
  */
 #define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner
 
-#elif defined(_MSC_VER) && _MSC_VER >= 1310
+#elif defined(__MINGW32__) || (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 <assert.h>
-    #define SDL_TriggerBreakpoint() assert(0)
 #elif SDL_HAS_BUILTIN(__builtin_debugtrap)
     #define SDL_TriggerBreakpoint() __builtin_debugtrap()
 #elif SDL_HAS_BUILTIN(__builtin_trap)
@@ -362,7 +359,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *
 #define SDL_enabled_assert(condition) \
     do { \
         while ( !(condition) ) { \
-            static struct SDL_AssertData sdl_assert_data = { 0, 0, #condition, 0, 0, 0, 0 }; \
+            static struct SDL_AssertData sdl_assert_data = { false, 0, #condition, NULL, 0, NULL, NULL }; \
             const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \
             if (sdl_assert_state == SDL_ASSERTION_RETRY) { \
                 continue; /* go again. */ \
diff --git a/Xcode/iOS/SDL3.framework/Headers/SDL_atomic.h b/Xcode/iOS/SDL3.framework/Headers/SDL_atomic.h
index 78b5e0fa5..bfcf81ee0 100644
--- a/Xcode/iOS/SDL3.framework/Headers/SDL_atomic.h
+++ b/Xcode/iOS/SDL3.framework/Headers/SDL_atomic.h
@@ -596,6 +596,24 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_SetAtomicU32(SDL_AtomicU32 *a, Uint32 v);
  */
 extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAtomicU32(SDL_AtomicU32 *a);
 
+/**
+ * Add to an atomic variable.
+ *
+ * This function also acts as a full memory barrier.
+ *
+ * ***Note: If you don't know what this function is for, you shouldn't use
+ * it!***
+ *
+ * \param a a pointer to an SDL_AtomicU32 variable to be modified.
+ * \param v the desired value to add or subtract.
+ * \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.4.0.
+ */
+extern SDL_DECLSPEC Uint32 SDLCALL SDL_AddAtomicU32(SDL_AtomicU32 *a, int v);
+
 /**
  * Set a pointer to a new value if it is currently an old value.
  *
diff --git a/Xcode/iOS/SDL3.framework/Headers/SDL_audio.h b/Xcode/iOS/SDL3.framework/Headers/SDL_audio.h
index 541c5dfba..be5eb32e9 100644
--- a/Xcode/iOS/SDL3.framework/Headers/SDL_audio.h
+++ b/Xcode/iOS/SDL3.framework/Headers/SDL_audio.h
@@ -942,7 +942,10 @@ 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 with SDL_SetAudioStreamFormat().
+ * stream's format at any time with SDL_SetAudioStreamFormat(). If the other
+ * end of the stream's format has never been set (the audio stream was created
+ * with a NULL audio spec), this function will set it to match the device
+ * end's format.
  *
  * \param devid an audio device to bind a stream to.
  * \param streams an array of audio streams to bind.
@@ -1021,7 +1024,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStream(SDL_AudioStream *stream);
 /**
  * Query an audio stream for its currently-bound device.
  *
- * This reports the audio device that an audio stream is currently bound to.
+ * This reports the logical audio device that an audio stream is currently
+ * bound to.
  *
  * If not bound, or invalid, this returns zero, which is not a valid device
  * ID.
@@ -1063,6 +1067,17 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_Au
 /**
  * Get the properties associated with an audio stream.
  *
+ * The application can hang any data it wants here, but the following
+ * properties are understood by SDL:
+ *
+ * - `SDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN`: if true (the default), the
+ *   stream be automatically cleaned up when the audio subsystem quits. If set
+ *   to false, the streams will persist beyond that. This property is ignored
+ *   for streams created through SDL_OpenAudioDeviceStream(), and will always
+ *   be cleaned up. Streams that are not cleaned up will still be unbound from
+ *   devices when the audio subsystem quits. This property was added in SDL
+ *   3.4.0.
+ *
  * \param stream the SDL_AudioStream to query.
  * \returns a valid property ID on success or 0 on failure; call
  *          SDL_GetError() for more information.
@@ -1073,6 +1088,9 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_Au
  */
 extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_AudioStream *stream);
 
+#define SDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN "SDL.audiostream.auto_cleanup"
+
+
 /**
  * Query the current format of an audio stream.
  *
@@ -1149,14 +1167,14 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamFrequencyRatio(SDL_AudioStre
  *
  * The frequency ratio is used to adjust the rate at which input data is
  * consumed. Changing this effectively modifies the speed and pitch of the
- * audio. A value greater than 1.0 will play the audio faster, and at a higher
- * pitch. A value less than 1.0 will play the audio slower, and at a lower
- * pitch.
+ * audio. A value greater than 1.0f will play the audio faster, and at a
+ * higher pitch. A value less than 1.0f will play the audio slower, and at a
+ * lower pitch. 1.0f means play at normal speed.
  *
  * This is applied during SDL_GetAudioStreamData, and can be continuously
  * changed to create various effects.
  *
- * \param stream the stream the frequency ratio is being changed.
+ * \param stream the stream on which the frequency ratio is being changed.
  * \param ratio the frequency ratio. 1.0 is normal speed. Must be between 0.01
  *              and 100.
  * \returns true on success or false on failure; call SDL_GetError() for more
@@ -1332,7 +1350,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStre
  * Channel maps are optional; most things do not need them, instead passing
  * data in the [order that SDL expects](CategoryAudio#channel-layouts).
  *
- * The output channel map reorders data that leaving a stream via
+ * The output channel map reorders data that is leaving a stream via
  * SDL_GetAudioStreamData.
  *
  * Each item in the array represents an input channel, and its value is the
@@ -1414,6 +1432,136 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_AudioStr
  */
 extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *stream, const void *buf, int len);
 
+/**
+ * A callback that fires for completed SDL_PutAudioStreamDataNoCopy() data.
+ *
+ * When using SDL_PutAudioStreamDataNoCopy() to provide data to an
+ * SDL_AudioStream, it's not safe to dispose of the data until the stream has
+ * completely consumed it. Often times it's difficult to know exactly when
+ * this has happened.
+ *
+ * This callback fires once when the stream no longer needs the buffer,
+ * allowing the app to easily free or reuse it.
+ *
+ * \param userdata an opaque pointer provided by the app for their personal
+ *                 use.
+ * \param buf the pointer provided to SDL_PutAudioStreamDataNoCopy().
+ * \param buflen the size of buffer, in bytes, provided to
+ *               SDL_PutAudioStreamDataNoCopy().
+ *
+ * \threadsafety This callbacks may run from any thread, so if you need to
+ *               protect shared data, you should use SDL_LockAudioStream to
+ *               serialize access; this lock will be held before your callback
+ *               is called, so your callback does not need to manage the lock
+ *               explicitly.
+ *
+ * \since This datatype is available since SDL 3.4.0.
+ *
+ * \sa SDL_SetAudioStreamGetCallback
+ * \sa SDL_SetAudioStreamPutCallback
+ */
+typedef void (SDLCALL *SDL_AudioStreamDataCompleteCallback)(void *userdata, const void *buf, int buflen);
+
+/**
+ * Add external data to an audio stream without copying it.
+ *
+ * Unlike SDL_PutAudioStreamData(), this function does not make a copy of the
+ * provided data, instead storing the provided pointer. This means that the
+ * put operation does not need to allocate and copy the data, but the original
+ * data must remain available until the stream is done with it, either by
+ * being read from the stream in its entirety, or a call to
+ * SDL_ClearAudioStream() or SDL_DestroyAudioStream().
+ *
+ * The data must match the format/channels/samplerate specified in the latest
+ * call to SDL_SetAudioStreamFormat, or the format specified when creating the
+ * stream if it hasn't been changed.
+ *
+ * An optional callback may be provided, which is called when the stream no
+ * longer needs the data. Once this callback fires, the stream will not access
+ * the data again. This callback will fire for any reason the data is no
+ * longer needed, including clearing or destroying the stream.
+ *
+ * Note that there is still an allocation to store tracking information, so
+ * this function is more efficient for larger blocks of data. If you're
+ * planning to put a few samples at a time, it will be more efficient to use
+ * SDL_PutAudioStreamData(), which allocates and buffers in blocks.
+ *
+ * \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 add to the stream.
+ * \param callback the callback function to call when the data is no longer
+ *                 needed by the stream. May be NULL.
+ * \param userdata an opaque pointer provided to the callback for its own
+ *                 personal use.
+ * \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.4.0.
+ *
+ * \sa SDL_ClearAudioStream
+ * \sa SDL_FlushAudioStream
+ * \sa SDL_GetAudioStreamData
+ * \sa SDL_GetAudioStreamQueued
+ */
+extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamDataNoCopy(SDL_AudioStream *stream, const void *buf, int len, SDL_AudioStreamDataCompleteCallback callback, void *userdata);
+
+/**
+ * Add data to the stream with each channel in a separate array.
+ *
+ * This data must match the format/channels/samplerate specified in the latest
+ * call to SDL_SetAudioStreamFormat, or the format specified when creating the
+ * stream if it hasn't been changed.
+ *
+ * The data will be interleaved and queued. Note that SDL_AudioStream only
+ * operates on interleaved data, so this is simply a convenience function for
+ * easily queueing data from sources that provide separate arrays. There is no
+ * equivalent function to retrieve planar data.
+ *
+ * The arrays in `channel_buffers` are ordered as they are to be interleaved;
+ * the first array will be the first sample in the interleaved data. Any
+ * individual array may be NULL; in this case, silence will be interleaved for
+ * that channel.
+ *
+ * `num_channels` specifies how many arrays are in `channel_buffers`. This can
+ * be used as a safety to prevent overflow, in case the stream format has
+ * changed elsewhere. If more channels are specified than the current input
+ * spec, they are ignored. If less channels are specified, the missing arrays
+ * are treated as if they are NULL (silence is written to those channels). If
+ * the count is -1, SDL will assume the array count matches the current input
+ * spec.
+ *
+ * Note that `num_samples` is the number of _samples per array_. This can also
+ * be thought of as the number of _sample frames_ to be queued. A value of 1
+ * with stereo arrays will queue two samples to the stream. This is different
+ * than SDL_PutAudioStreamData, which wants the size of a single array in
+ * bytes.
+ *
+ * \param stream the stream the audio data is being added to.
+ * \param channel_buffers a pointer to an array of arrays, one array per
+ *                        channel.
+ * \param num_channels the number of arrays in `channel_buffers` or -1.
+ * \param num_samples the number of _samples_ per array to write to the
+ *                    stream.
+ * \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.4.0.
+ *
+ * \sa SDL_ClearAudioStream
+ * \sa SDL_FlushAudioStream
+ * \sa SDL_GetAudioStreamData
+ * \sa SDL_GetAudioStreamQueued
+ */
+extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamPlanarData(SDL_AudioStream *stream, const void * const *channel_buffers, int num_channels, int num_samples);
+
 /**
  * Get converted/resampled data from the stream.
  *
@@ -1583,8 +1731,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream *str
  * previously been paused. Once unpaused, any bound audio streams will begin
  * to progress again, and audio can be generated.
  *
- * Remember, SDL_OpenAudioDeviceStream opens device in a paused state, so this
- * function call is required for audio playback to begin on such device.
+ * SDL_OpenAudioDeviceStream opens audio devices in a paused state, so this
+ * function call is required for audio playback to begin on such devices.
  *
  * \param stream the audio stream associated with the audio device to resume.
  * \returns true on success or false on failure; call SDL_GetError() for more
@@ -1717,7 +1865,7 @@ typedef void (SDLCALL *SDL_AudioStreamCallback)(void *userdata, SDL_AudioStream
  * audio to the stream during this call; if needed, the request that triggered
  * this callback will obtain the new data immediately.
  *
- * The callback's `approx_request` argument is roughly how many bytes of
+ * The callback's `additional_amount` argument is roughly how many bytes of
  * _unconverted_ data (in the stream's input format) is needed by the caller,
  * although this may overestimate a little for safety. This takes into account
  * how much is already in the stream and only asks for any extra necessary to
@@ -1762,13 +1910,13 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStream *
  * The callback can (optionally) call SDL_GetAudioStreamData() to obtain audio
  * from the stream during this call.
  *
- * The callback's `a

(Patch may be truncated, please check the link at the top of this post.)