Commits to SDL revision control. Unmonitored, automated account; try @icculus
or https://github.com/libsdl-org/SDL !


https://github.com/libsdl-org/libtiff/commit/3bde37ac83b0c1a507f5ff2f6944b1e2d44e0381

The patch
From dc3369a7947b949a283d267b68524e4f931b3b49 Mon Sep 17 00:00:00 2001
From: Su Laus <[EMAIL REDACTED]>
Date: Mon, 19 Dec 2022 21:30:42 +0000
Subject: [PATCH] manpage: Add multi page TIFF and SubIFDs description and read
 / write example.

---
 doc/functions/TIFFOpen.rst           |  24 +--
 doc/functions/TIFFReadDirectory.rst  |   1 +
 doc/functions/TIFFSetDirectory.rst   |  24 +--
 doc/functions/TIFFWriteDirectory.rst |  10 +-
 doc/index.rst                        |   1 +
 doc/multi_page.rst                   | 211 +++++++++++++++++++++++++++
 doc/terms.rst                        |  25 ++++
 7 files changed, 265 insertions(+), 31 deletions(-)
 create mode 100644 doc/multi_page.rst

diff --git a/doc/functions/TIFFOpen.rst b/doc/functions/TIFFOpen.rst
index 23eb12a2..db79d7bc 100644
--- a/doc/functions/TIFFOpen.rst
+++ b/doc/functions/TIFFOpen.rst
@@ -50,17 +50,19 @@ Description
 and returns a handle to be used in subsequent calls to routines in
 :program:`libtiff`.  If the open operation fails, then
 :c:macro:`NULL` (0) is returned.  The *mode* parameter specifies if
-the file is to be opened for reading (``r``), writing (``w``), or
+the file is to be opened for reading (``r``) or (``r+``), writing (``w``), or
 appending (``a``) and, optionally, whether to override certain
-default aspects of library operation (see below).
+default aspects of library operation (see below Options_).
+
+The *mode* (``r``) opens only an **existing** file for reading and (``r+``)
+for reading and writing.
 When a file is opened for appending, existing data will not
 be touched; instead new data will be written as additional subfiles.
 If an existing file is opened for writing, all previous data is
 overwritten.
 
 If a file is opened for reading, the first TIFF directory in the file
-is automatically read (also see :c:func:`TIFFSetDirectory` for reading
-directories other than the first). 
+is automatically read. 
 If a file is opened for writing or appending, a default directory
 is automatically created for writing subsequent data.
 This directory has all the default values specified in TIFF Revision 6.0:
@@ -78,16 +80,13 @@ This directory has all the default values specified in TIFF Revision 6.0:
 To alter these values, or to define values for additional fields,
 :c:func:`TIFFSetField` must be used.
 
-A file can also be opened for reading and writing with *mode* (``r+``).
-In this case, the first TIFF directory in the file is automatically read,
-but calls to :c:func:`TIFFSetField` are put into a fresh directory, which
-will be appended when the file is closed.
-
 :c:func:`TIFFOpenW` opens a TIFF file with a Unicode filename, for read/writing.
 
 :c:func:`TIFFFdOpen` is like :c:func:`TIFFOpen` except that it opens a
 TIFF file given an open file descriptor *fd*.
 The file's name and mode must reflect that of the open descriptor.
+Even for write-only mode, ``libtiff`` needs read permissions because
+some of its functions need to read back the partially written TIFF file.
 The object associated with the file descriptor **must support random access**.
 In order to close a TIFF file opened with :c:func:`TIFFFdOpen`
 first :c:func:`TIFFCleanup` should be called to free the internal
@@ -154,10 +153,15 @@ Options
 -------
 
 The open mode parameter can include the following flags in
-addition to the ``r``, ``w``, and ``a`` flags.
+addition to the ``r``, ``r+``, ``w``, and ``a`` flags.
 Note however that option flags must follow the read-write-append
 specification.
 
+Note 2: Also for ``w`` the file will be opened with *read access* rights
+because ``libtiff`` needs to read back the partially written TIFF file
+for some of its functions.
+
+
 ``l``:
 
   When creating a new file force information be written with
diff --git a/doc/functions/TIFFReadDirectory.rst b/doc/functions/TIFFReadDirectory.rst
index 3ffaf7b8..7a1fc038 100644
--- a/doc/functions/TIFFReadDirectory.rst
+++ b/doc/functions/TIFFReadDirectory.rst
@@ -142,4 +142,5 @@ See also
 :doc:`TIFFquery` (3tiff),
 :doc:`TIFFWriteDirectory` (3tiff),
 :doc:`TIFFSetDirectory` (3tiff),
+:doc:`/multi_page`,
 :doc:`libtiff` (3tiff)
diff --git a/doc/functions/TIFFSetDirectory.rst b/doc/functions/TIFFSetDirectory.rst
index 61aea5c4..5d1212f7 100644
--- a/doc/functions/TIFFSetDirectory.rst
+++ b/doc/functions/TIFFSetDirectory.rst
@@ -20,28 +20,15 @@ Description
 :c:func:`TIFFSetDirectory` changes the current directory and reads its
 contents with :c:func:`TIFFReadDirectory`.  The parameter *dirnum*
 specifies the subfile/directory as an integer number, with the first
-directory numbered zero.
+directory numbered zero. 
+:c:func:`TIFFSetDirectory()` only works with main-IFD chains because
+allways starts with the first main-IFD and thus is able to reset
+the SubIFD reading chain to the main-IFD chain.
 
 :c:func:`TIFFSetSubDirectory` acts like :c:func:`TIFFSetDirectory`,
 except the directory is specified as a file offset instead of an index;
 this is required for accessing subdirectories linked through a
-``SubIFD`` tag.
-
-In the case of several SubIFDs of a main image, there are two possibilities
-that are not even mutually exclusive.
-
-a. The ``SubIFD`` tag contains an array with all offsets of the SubIFDs.
-b. The ``SubIFDs`` are concatenated with their ``NextIFD`` parameters
-   to a SubIFD chain.
-
-LibTiff does support SubIFD chains partially. When a ``SubIFD`` tag is
-activated with :c:func:`TIFFSetSubDirectory()`, :c:func:`TIFFReadDirectory()`
-is able to parse through the SubIFD chain. The *tif_curdir* is just
-incremented from its current value and thus gets arbitrary values
-when parsing through SubIFD chains.
-:c:func:`TIFFSetDirectory()` only works with main-IFD chains because
-allways starts with the first main-IFD and thus is able to reset
-the SubIFD reading chain to the main-IFD chain.
+``SubIFD`` tag.  (see :ref:`MultiPage SubIFD <SubIFDAccess>`)
 
 Directory query functions :c:func:`TIFFCurrentDirectory`,
 :c:func:`TIFFCurrentDirOffset`, :c:func:`TIFFLastDirectory` and
@@ -80,4 +67,5 @@ See also
 :doc:`TIFFCustomDirectory` (3tiff),
 :doc:`TIFFWriteDirectory` (3tiff),
 :doc:`TIFFReadDirectory` (3tiff),
+:doc:`/multi_page`,
 :doc:`libtiff` (3tiff)
diff --git a/doc/functions/TIFFWriteDirectory.rst b/doc/functions/TIFFWriteDirectory.rst
index 8682d5f0..00bac0b1 100644
--- a/doc/functions/TIFFWriteDirectory.rst
+++ b/doc/functions/TIFFWriteDirectory.rst
@@ -24,9 +24,12 @@ Description
 -----------
 
 :c:func:`TIFFWriteDirectory` will write the contents of the current
-directory to the file and setup to create a new subfile in the same
-file. Applications only need to call :c:func:`TIFFWriteDirectory`
-when writing multiple subfiles to a single TIFF file.
+directory (IFD) to the file and setup to create a new directory (IFD)
+using :c:func:`TIFFCreateDirectory`.
+Applications only need to call :c:func:`TIFFWriteDirectory`
+when writing multiple subfiles (images) to a single TIFF file.
+This is called "multi-page TIFF" or "multi-image TIFF"
+(see :doc:`/multi_page`).
 :c:func:`TIFFWriteDirectory` is automatically called by
 :c:func:`TIFFClose` and :c:func:`TIFFFlush` to write a modified
 directory if the file is open for writing.
@@ -133,4 +136,5 @@ See also
 :doc:`TIFFSetDirectory` (3tiff),
 :doc:`TIFFReadDirectory` (3tiff),
 :doc:`TIFFError` (3tiff),
+:doc:`/multi_page`,
 :doc:`libtiff` (3tiff)
diff --git a/doc/index.rst b/doc/index.rst
index b33cdd1f..abec6622 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -46,6 +46,7 @@ The following sections are included in this documentation:
     build
     terms
     libtiff
+    multi_page
     functions
     internals
     addingtags
diff --git a/doc/multi_page.rst b/doc/multi_page.rst
new file mode 100644
index 00000000..d4e5dcd5
--- /dev/null
+++ b/doc/multi_page.rst
@@ -0,0 +1,211 @@
+Multi Page / Multi Image TIFF
+=============================
+
+There may be more than one :ref:`Image File Directory (IFD) <ImageFileDirectory>`
+in a TIFF file. Each IFD defines a :ref:`subfile <SubFile>`.
+
+One potential use of *subfiles* is to describe related images,
+such as the pages of a facsimile transmission or reduced-resolution images
+of the first full-resolution image.
+Such files are also named "*multi-page* TIFF" or "*multi-image* TIFF".
+
+There are two mechanisms for storing multiple images in a TIFF file:
+
+1.  A **main-IFD chain**, where the images are stored in linked IFDs (directories).
+    This mechanism is widely used.
+2.  A **SubIFD chain**, where additional images are stored within the SubIFD tag
+    of a main-IFD. Such child images provide extra information for the parent image
+    - such as a subsampled version of the parent image. 
+    SubIFD chains are rarely supported.
+    For SubIFD refer also to
+    `Adobe PageMaker® 6.0 TIFF Technical Notes <https://www.awaresystems.be/imaging/tiff/specification/TIFFPM6.pdf>`_
+
+.. _SubIFDAccess:
+
+Sub IFD chains
+--------------
+
+In the case of several SubIFDs of a main image, there are two possibilities
+that are not even mutually exclusive.
+
+a. The ``SubIFD`` tag contains an array with all offsets of the SubIFDs.
+b. The SubIFDs are concatenated with their ``NextIFD`` parameters
+   to a SubIFD chain.
+
+LibTiff does support SubIFD chains partially. When the first
+``SubIFD`` tag is activated and read with :c:func:`TIFFSetSubDirectory()`,
+the following can be parsed with :c:func:`TIFFReadDirectory()`.
+The *tif_curdir* is just incremented from its current value
+and thus gets arbitrary values when parsing through SubIFD chains.
+When the SubIFDs are not chained, each offset
+within the SubIFD array has to be activated and read individually.
+:c:func:`TIFFSetDirectory()` only works with main-IFD chains because
+allways starts with the first main-IFD and thus is able to reset
+the SubIFD reading chain to the main-IFD chain.
+
+Writing Multi Page TIFF
+-----------------------
+
+The following example code shows how to write multi-page TIFF
+as main-IFD chain and as SubIFD chain.
+``libtiff`` writes SubIFDs as an array of IFDs that are not chained
+additionally, as Adobe PageMaker® 6.0 TIFF Technical Notes suggests.
+
+.. highlight:: c
+
+::
+
+  #include <tiffio.h>
+
+  int main(int argc, const char **argv)
+  {
+      TIFF *tiff;
+
+      /* Define the number of pages/images (main-IFDs) you are going to write */
+      int number_of_images = 3;
+
+  /* Define the number of sub - IFDs you are going to write */
+  #define NUMBER_OF_SUBIFDs 2
+      int number_of_sub_IFDs = NUMBER_OF_SUBIFDs;
+      toff_t sub_IFDs_offsets[NUMBER_OF_SUBIFDs] = {
+          0UL}; /* array for SubIFD tag */
+      int blnWriteSubIFD = 0;
+
+      if (!(tiff = TIFFOpen("multiPageTiff2.tif", "w")))
+          return 1;
+
+      for (int i = 0; i < number_of_images; i++)
+      {
+          char pixel[1] = {128};
+
+          TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, 1);
+          TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, 1);
+          TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1);
+          TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8);
+          TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+
+          /* For the last but one multi-page image, add a SubIFD e.g. for a
+          * thumbnail */
+          if (number_of_images - 2 == i)
+              blnWriteSubIFD = 1;
+
+          if (blnWriteSubIFD)
+          {
+             /* Now here is the trick: the next n directories written
+              * will be sub-IFDs of the main-IFD (where n is number_of_sub_IFDs
+              * specified when you set the TIFFTAG_SUBIFD field.
+              * The SubIFD offset array sub_IFDs_offsets is filled automatically
+              * with the proper offset values by the following number_of_sub_IFDs
+              * TIFFWriteDirectory() calls and updated in the related main-IFD
+              * with the last call.
+              */
+              if (!TIFFSetField(tiff, TIFFTAG_SUBIFD, number_of_sub_IFDs,
+                                sub_IFDs_offsets))
+                  return 1;
+          }
+
+          /* Write dummy pixel to image */
+          if (TIFFWriteScanline(tiff, pixel, 0, 0) < 0)
+              return 1;
+          /* Write image / directory to file */
+          if (!TIFFWriteDirectory(tiff))
+              return 1;
+
+          if (blnWriteSubIFD)
+          {
+             /* A SubIFD tag has been written for that main-IFD and this
+              * triggers that pervious TIFFWriteDirectory() to switch to the
+              * SubIFD-chain for the next number_of_sub_IFDs writings.
+              * Thus, only the thumbnail images need to be
+              * set up and written to file using TIFFWriteDirectory().
+              * The last of this TIFFWriteDirectory() calls will setup
+              * the next fresh main-IFD.
+              */
+              for (int i = 0; i < number_of_sub_IFDs; i++)
+              {
+                  TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, 1);
+                  TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, 1);
+                  TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1);
+                  TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8);
+                  TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+                  /* SUBFILETYPE tag is not mandatory for SubIFD writing, but a
+                  * good idea to indicate thumbnails */
+                  if (!TIFFSetField(tiff, TIFFTAG_SUBFILETYPE,
+                                    FILETYPE_REDUCEDIMAGE))
+                      return 1;
+
+                  /* Write dummy pixel to thumbnail image */
+                  pixel[0] = 64;
+                  if (TIFFWriteScanline(tiff, pixel, 0, 0) < 0)
+                      return 1;
+                  /* Writes now in the SubIFD chain */
+                  if (!TIFFWriteDirectory(tiff))
+                      return 1;
+
+                  blnWriteSubIFD = 0;
+              }
+          }
+      }
+      TIFFClose(tiff);
+      return 0;
+    }
+
+Reading Multi Page TIFF
+-----------------------
+
+For a reading example see code of `tools/tiffinfo.c` or below:
+
+.. highlight:: c
+
+::
+
+    /* Reading of multi-page and SubIFD images (subfiles) */
+    if (!(tiff = TIFFOpen(filename, "r")))
+        return 1;
+
+    tdir_t currentDirNumber = TIFFCurrentDirectory(tiff);
+
+    /* The first directory is already read through TIFFOpen() */
+    int blnRead = 0;
+    do
+    {
+        /*Check if there are SubIFD subfiles */
+        void *ptr;
+        if (TIFFGetField(tiff, TIFFTAG_SUBIFD, &number_of_sub_IFDs, &ptr))
+        {
+            /* Copy SubIFD array from pointer */
+            memcpy(sub_IFDs_offsets, ptr,
+                   number_of_sub_IFDs * sizeof(sub_IFDs_offsets[0]));
+
+            for (int i = 0; i < number_of_sub_IFDs; i++)
+            {
+                /* Read first SubIFD directory */
+                if (!TIFFSetSubDirectory(tiff, sub_IFDs_offsets[i]))
+                    return 1;
+                /* Check if there is a SubIFD chain behind the first one from
+                 * the array, as specified by Adobe */
+                while (TIFFReadDirectory(tiff))
+                    /* analyse subfile */
+                    ;
+            }
+            /* Go back to main-IFD chain and re-read that main-IFD directory */
+            if (!TIFFSetDirectory(tiff, currentDirNumber))
+                return 1;
+        }
+        /* Read next main-IFD directory (subfile) */
+        blnRead = TIFFReadDirectory(tiff);
+        currentDirNumber = TIFFCurrentDirectory(tiff);
+    } while (blnRead);
+    TIFFClose(tiff);
+
+
+
+
+See also
+--------
+
+:doc:`terms`,
+:doc:`/functions/TIFFSetDirectory` (3tiff),
+:doc:`/functions/TIFFWriteDirectory` (3tiff),
+`Adobe PageMaker® 6.0 TIFF Technical Notes <https://www.awaresystems.be/imaging/tiff/specification/TIFFPM6.pdf>`_,
+`Example from StackOverflow <https://stackoverflow.com/questions/11959617/in-a-tiff-create-a-sub-ifd-with-thumbnail-libtiff>`_
\ No newline at end of file
diff --git a/doc/terms.rst b/doc/terms.rst
index d20d80ed..3d4012a6 100644
--- a/doc/terms.rst
+++ b/doc/terms.rst
@@ -35,6 +35,31 @@ Codec:
     Software that implements the decoding and encoding algorithms
     of a compression scheme.
 
+.. _ImageFileDirectory:
+
+Image File Directory (IFD):
+    An Image File Directory - in short also *directory* -
+    contains information about the image,
+    as well as pointers (offsets) to the actual image data
+    within the on-disk file.
+    An IFD points either to the next IFD or shows with a ''0''
+    that it is the last IFD in the IFD-chain.
+
+Multi Images per TIFF file:
+    There may be more than one IFD in a TIFF file.
+    Each IFD defines a *subfile*.
+    One potential use of *subfiles* is to describe related images,
+    such as the pages of a facsimile transmission.
+    Such files are also named "*multi-page* TIFF" or "*multi-image* TIFF".
+    Refer also to :doc:`/multi_page`.
+
+.. _SubFile:
+
+Subfile:
+    *Subfile* is a term in the TIFF 6.0 specification for
+    an image and its associated *Image File Directory (IFD)*
+    in a TIFF file containing one or more images.
+
 In order to better understand how TIFF works (and consequently this
 software) it is important to recognize the distinction between the
 physical organization of image data as it is stored in a TIFF and how



https://github.com/libsdl-org/libtiff/commit/dc3369a7947b949a283d267b68524e4f931b3b49

The patch
From dc3369a7947b949a283d267b68524e4f931b3b49 Mon Sep 17 00:00:00 2001
From: Su Laus <[EMAIL REDACTED]>
Date: Mon, 19 Dec 2022 21:30:42 +0000
Subject: [PATCH] manpage: Add multi page TIFF and SubIFDs description and read
 / write example.

---
 doc/functions/TIFFOpen.rst           |  24 +--
 doc/functions/TIFFReadDirectory.rst  |   1 +
 doc/functions/TIFFSetDirectory.rst   |  24 +--
 doc/functions/TIFFWriteDirectory.rst |  10 +-
 doc/index.rst                        |   1 +
 doc/multi_page.rst                   | 211 +++++++++++++++++++++++++++
 doc/terms.rst                        |  25 ++++
 7 files changed, 265 insertions(+), 31 deletions(-)
 create mode 100644 doc/multi_page.rst

diff --git a/doc/functions/TIFFOpen.rst b/doc/functions/TIFFOpen.rst
index 23eb12a2..db79d7bc 100644
--- a/doc/functions/TIFFOpen.rst
+++ b/doc/functions/TIFFOpen.rst
@@ -50,17 +50,19 @@ Description
 and returns a handle to be used in subsequent calls to routines in
 :program:`libtiff`.  If the open operation fails, then
 :c:macro:`NULL` (0) is returned.  The *mode* parameter specifies if
-the file is to be opened for reading (``r``), writing (``w``), or
+the file is to be opened for reading (``r``) or (``r+``), writing (``w``), or
 appending (``a``) and, optionally, whether to override certain
-default aspects of library operation (see below).
+default aspects of library operation (see below Options_).
+
+The *mode* (``r``) opens only an **existing** file for reading and (``r+``)
+for reading and writing.
 When a file is opened for appending, existing data will not
 be touched; instead new data will be written as additional subfiles.
 If an existing file is opened for writing, all previous data is
 overwritten.
 
 If a file is opened for reading, the first TIFF directory in the file
-is automatically read (also see :c:func:`TIFFSetDirectory` for reading
-directories other than the first). 
+is automatically read. 
 If a file is opened for writing or appending, a default directory
 is automatically created for writing subsequent data.
 This directory has all the default values specified in TIFF Revision 6.0:
@@ -78,16 +80,13 @@ This directory has all the default values specified in TIFF Revision 6.0:
 To alter these values, or to define values for additional fields,
 :c:func:`TIFFSetField` must be used.
 
-A file can also be opened for reading and writing with *mode* (``r+``).
-In this case, the first TIFF directory in the file is automatically read,
-but calls to :c:func:`TIFFSetField` are put into a fresh directory, which
-will be appended when the file is closed.
-
 :c:func:`TIFFOpenW` opens a TIFF file with a Unicode filename, for read/writing.
 
 :c:func:`TIFFFdOpen` is like :c:func:`TIFFOpen` except that it opens a
 TIFF file given an open file descriptor *fd*.
 The file's name and mode must reflect that of the open descriptor.
+Even for write-only mode, ``libtiff`` needs read permissions because
+some of its functions need to read back the partially written TIFF file.
 The object associated with the file descriptor **must support random access**.
 In order to close a TIFF file opened with :c:func:`TIFFFdOpen`
 first :c:func:`TIFFCleanup` should be called to free the internal
@@ -154,10 +153,15 @@ Options
 -------
 
 The open mode parameter can include the following flags in
-addition to the ``r``, ``w``, and ``a`` flags.
+addition to the ``r``, ``r+``, ``w``, and ``a`` flags.
 Note however that option flags must follow the read-write-append
 specification.
 
+Note 2: Also for ``w`` the file will be opened with *read access* rights
+because ``libtiff`` needs to read back the partially written TIFF file
+for some of its functions.
+
+
 ``l``:
 
   When creating a new file force information be written with
diff --git a/doc/functions/TIFFReadDirectory.rst b/doc/functions/TIFFReadDirectory.rst
index 3ffaf7b8..7a1fc038 100644
--- a/doc/functions/TIFFReadDirectory.rst
+++ b/doc/functions/TIFFReadDirectory.rst
@@ -142,4 +142,5 @@ See also
 :doc:`TIFFquery` (3tiff),
 :doc:`TIFFWriteDirectory` (3tiff),
 :doc:`TIFFSetDirectory` (3tiff),
+:doc:`/multi_page`,
 :doc:`libtiff` (3tiff)
diff --git a/doc/functions/TIFFSetDirectory.rst b/doc/functions/TIFFSetDirectory.rst
index 61aea5c4..5d1212f7 100644
--- a/doc/functions/TIFFSetDirectory.rst
+++ b/doc/functions/TIFFSetDirectory.rst
@@ -20,28 +20,15 @@ Description
 :c:func:`TIFFSetDirectory` changes the current directory and reads its
 contents with :c:func:`TIFFReadDirectory`.  The parameter *dirnum*
 specifies the subfile/directory as an integer number, with the first
-directory numbered zero.
+directory numbered zero. 
+:c:func:`TIFFSetDirectory()` only works with main-IFD chains because
+allways starts with the first main-IFD and thus is able to reset
+the SubIFD reading chain to the main-IFD chain.
 
 :c:func:`TIFFSetSubDirectory` acts like :c:func:`TIFFSetDirectory`,
 except the directory is specified as a file offset instead of an index;
 this is required for accessing subdirectories linked through a
-``SubIFD`` tag.
-
-In the case of several SubIFDs of a main image, there are two possibilities
-that are not even mutually exclusive.
-
-a. The ``SubIFD`` tag contains an array with all offsets of the SubIFDs.
-b. The ``SubIFDs`` are concatenated with their ``NextIFD`` parameters
-   to a SubIFD chain.
-
-LibTiff does support SubIFD chains partially. When a ``SubIFD`` tag is
-activated with :c:func:`TIFFSetSubDirectory()`, :c:func:`TIFFReadDirectory()`
-is able to parse through the SubIFD chain. The *tif_curdir* is just
-incremented from its current value and thus gets arbitrary values
-when parsing through SubIFD chains.
-:c:func:`TIFFSetDirectory()` only works with main-IFD chains because
-allways starts with the first main-IFD and thus is able to reset
-the SubIFD reading chain to the main-IFD chain.
+``SubIFD`` tag.  (see :ref:`MultiPage SubIFD <SubIFDAccess>`)
 
 Directory query functions :c:func:`TIFFCurrentDirectory`,
 :c:func:`TIFFCurrentDirOffset`, :c:func:`TIFFLastDirectory` and
@@ -80,4 +67,5 @@ See also
 :doc:`TIFFCustomDirectory` (3tiff),
 :doc:`TIFFWriteDirectory` (3tiff),
 :doc:`TIFFReadDirectory` (3tiff),
+:doc:`/multi_page`,
 :doc:`libtiff` (3tiff)
diff --git a/doc/functions/TIFFWriteDirectory.rst b/doc/functions/TIFFWriteDirectory.rst
index 8682d5f0..00bac0b1 100644
--- a/doc/functions/TIFFWriteDirectory.rst
+++ b/doc/functions/TIFFWriteDirectory.rst
@@ -24,9 +24,12 @@ Description
 -----------
 
 :c:func:`TIFFWriteDirectory` will write the contents of the current
-directory to the file and setup to create a new subfile in the same
-file. Applications only need to call :c:func:`TIFFWriteDirectory`
-when writing multiple subfiles to a single TIFF file.
+directory (IFD) to the file and setup to create a new directory (IFD)
+using :c:func:`TIFFCreateDirectory`.
+Applications only need to call :c:func:`TIFFWriteDirectory`
+when writing multiple subfiles (images) to a single TIFF file.
+This is called "multi-page TIFF" or "multi-image TIFF"
+(see :doc:`/multi_page`).
 :c:func:`TIFFWriteDirectory` is automatically called by
 :c:func:`TIFFClose` and :c:func:`TIFFFlush` to write a modified
 directory if the file is open for writing.
@@ -133,4 +136,5 @@ See also
 :doc:`TIFFSetDirectory` (3tiff),
 :doc:`TIFFReadDirectory` (3tiff),
 :doc:`TIFFError` (3tiff),
+:doc:`/multi_page`,
 :doc:`libtiff` (3tiff)
diff --git a/doc/index.rst b/doc/index.rst
index b33cdd1f..abec6622 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -46,6 +46,7 @@ The following sections are included in this documentation:
     build
     terms
     libtiff
+    multi_page
     functions
     internals
     addingtags
diff --git a/doc/multi_page.rst b/doc/multi_page.rst
new file mode 100644
index 00000000..d4e5dcd5
--- /dev/null
+++ b/doc/multi_page.rst
@@ -0,0 +1,211 @@
+Multi Page / Multi Image TIFF
+=============================
+
+There may be more than one :ref:`Image File Directory (IFD) <ImageFileDirectory>`
+in a TIFF file. Each IFD defines a :ref:`subfile <SubFile>`.
+
+One potential use of *subfiles* is to describe related images,
+such as the pages of a facsimile transmission or reduced-resolution images
+of the first full-resolution image.
+Such files are also named "*multi-page* TIFF" or "*multi-image* TIFF".
+
+There are two mechanisms for storing multiple images in a TIFF file:
+
+1.  A **main-IFD chain**, where the images are stored in linked IFDs (directories).
+    This mechanism is widely used.
+2.  A **SubIFD chain**, where additional images are stored within the SubIFD tag
+    of a main-IFD. Such child images provide extra information for the parent image
+    - such as a subsampled version of the parent image. 
+    SubIFD chains are rarely supported.
+    For SubIFD refer also to
+    `Adobe PageMaker® 6.0 TIFF Technical Notes <https://www.awaresystems.be/imaging/tiff/specification/TIFFPM6.pdf>`_
+
+.. _SubIFDAccess:
+
+Sub IFD chains
+--------------
+
+In the case of several SubIFDs of a main image, there are two possibilities
+that are not even mutually exclusive.
+
+a. The ``SubIFD`` tag contains an array with all offsets of the SubIFDs.
+b. The SubIFDs are concatenated with their ``NextIFD`` parameters
+   to a SubIFD chain.
+
+LibTiff does support SubIFD chains partially. When the first
+``SubIFD`` tag is activated and read with :c:func:`TIFFSetSubDirectory()`,
+the following can be parsed with :c:func:`TIFFReadDirectory()`.
+The *tif_curdir* is just incremented from its current value
+and thus gets arbitrary values when parsing through SubIFD chains.
+When the SubIFDs are not chained, each offset
+within the SubIFD array has to be activated and read individually.
+:c:func:`TIFFSetDirectory()` only works with main-IFD chains because
+allways starts with the first main-IFD and thus is able to reset
+the SubIFD reading chain to the main-IFD chain.
+
+Writing Multi Page TIFF
+-----------------------
+
+The following example code shows how to write multi-page TIFF
+as main-IFD chain and as SubIFD chain.
+``libtiff`` writes SubIFDs as an array of IFDs that are not chained
+additionally, as Adobe PageMaker® 6.0 TIFF Technical Notes suggests.
+
+.. highlight:: c
+
+::
+
+  #include <tiffio.h>
+
+  int main(int argc, const char **argv)
+  {
+      TIFF *tiff;
+
+      /* Define the number of pages/images (main-IFDs) you are going to write */
+      int number_of_images = 3;
+
+  /* Define the number of sub - IFDs you are going to write */
+  #define NUMBER_OF_SUBIFDs 2
+      int number_of_sub_IFDs = NUMBER_OF_SUBIFDs;
+      toff_t sub_IFDs_offsets[NUMBER_OF_SUBIFDs] = {
+          0UL}; /* array for SubIFD tag */
+      int blnWriteSubIFD = 0;
+
+      if (!(tiff = TIFFOpen("multiPageTiff2.tif", "w")))
+          return 1;
+
+      for (int i = 0; i < number_of_images; i++)
+      {
+          char pixel[1] = {128};
+
+          TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, 1);
+          TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, 1);
+          TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1);
+          TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8);
+          TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+
+          /* For the last but one multi-page image, add a SubIFD e.g. for a
+          * thumbnail */
+          if (number_of_images - 2 == i)
+              blnWriteSubIFD = 1;
+
+          if (blnWriteSubIFD)
+          {
+             /* Now here is the trick: the next n directories written
+              * will be sub-IFDs of the main-IFD (where n is number_of_sub_IFDs
+              * specified when you set the TIFFTAG_SUBIFD field.
+              * The SubIFD offset array sub_IFDs_offsets is filled automatically
+              * with the proper offset values by the following number_of_sub_IFDs
+              * TIFFWriteDirectory() calls and updated in the related main-IFD
+              * with the last call.
+              */
+              if (!TIFFSetField(tiff, TIFFTAG_SUBIFD, number_of_sub_IFDs,
+                                sub_IFDs_offsets))
+                  return 1;
+          }
+
+          /* Write dummy pixel to image */
+          if (TIFFWriteScanline(tiff, pixel, 0, 0) < 0)
+              return 1;
+          /* Write image / directory to file */
+          if (!TIFFWriteDirectory(tiff))
+              return 1;
+
+          if (blnWriteSubIFD)
+          {
+             /* A SubIFD tag has been written for that main-IFD and this
+              * triggers that pervious TIFFWriteDirectory() to switch to the
+              * SubIFD-chain for the next number_of_sub_IFDs writings.
+              * Thus, only the thumbnail images need to be
+              * set up and written to file using TIFFWriteDirectory().
+              * The last of this TIFFWriteDirectory() calls will setup
+              * the next fresh main-IFD.
+              */
+              for (int i = 0; i < number_of_sub_IFDs; i++)
+              {
+                  TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, 1);
+                  TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, 1);
+                  TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1);
+                  TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8);
+                  TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+                  /* SUBFILETYPE tag is not mandatory for SubIFD writing, but a
+                  * good idea to indicate thumbnails */
+                  if (!TIFFSetField(tiff, TIFFTAG_SUBFILETYPE,
+                                    FILETYPE_REDUCEDIMAGE))
+                      return 1;
+
+                  /* Write dummy pixel to thumbnail image */
+                  pixel[0] = 64;
+                  if (TIFFWriteScanline(tiff, pixel, 0, 0) < 0)
+                      return 1;
+                  /* Writes now in the SubIFD chain */
+                  if (!TIFFWriteDirectory(tiff))
+                      return 1;
+
+                  blnWriteSubIFD = 0;
+              }
+          }
+      }
+      TIFFClose(tiff);
+      return 0;
+    }
+
+Reading Multi Page TIFF
+-----------------------
+
+For a reading example see code of `tools/tiffinfo.c` or below:
+
+.. highlight:: c
+
+::
+
+    /* Reading of multi-page and SubIFD images (subfiles) */
+    if (!(tiff = TIFFOpen(filename, "r")))
+        return 1;
+
+    tdir_t currentDirNumber = TIFFCurrentDirectory(tiff);
+
+    /* The first directory is already read through TIFFOpen() */
+    int blnRead = 0;
+    do
+    {
+        /*Check if there are SubIFD subfiles */
+        void *ptr;
+        if (TIFFGetField(tiff, TIFFTAG_SUBIFD, &number_of_sub_IFDs, &ptr))
+        {
+            /* Copy SubIFD array from pointer */
+            memcpy(sub_IFDs_offsets, ptr,
+                   number_of_sub_IFDs * sizeof(sub_IFDs_offsets[0]));
+
+            for (int i = 0; i < number_of_sub_IFDs; i++)
+            {
+                /* Read first SubIFD directory */
+                if (!TIFFSetSubDirectory(tiff, sub_IFDs_offsets[i]))
+                    return 1;
+                /* Check if there is a SubIFD chain behind the first one from
+                 * the array, as specified by Adobe */
+                while (TIFFReadDirectory(tiff))
+                    /* analyse subfile */
+                    ;
+            }
+            /* Go back to main-IFD chain and re-read that main-IFD directory */
+            if (!TIFFSetDirectory(tiff, currentDirNumber))
+                return 1;
+        }
+        /* Read next main-IFD directory (subfile) */
+        blnRead = TIFFReadDirectory(tiff);
+        currentDirNumber = TIFFCurrentDirectory(tiff);
+    } while (blnRead);
+    TIFFClose(tiff);
+
+
+
+
+See also
+--------
+
+:doc:`terms`,
+:doc:`/functions/TIFFSetDirectory` (3tiff),
+:doc:`/functions/TIFFWriteDirectory` (3tiff),
+`Adobe PageMaker® 6.0 TIFF Technical Notes <https://www.awaresystems.be/imaging/tiff/specification/TIFFPM6.pdf>`_,
+`Example from StackOverflow <https://stackoverflow.com/questions/11959617/in-a-tiff-create-a-sub-ifd-with-thumbnail-libtiff>`_
\ No newline at end of file
diff --git a/doc/terms.rst b/doc/terms.rst
index d20d80ed..3d4012a6 100644
--- a/doc/terms.rst
+++ b/doc/terms.rst
@@ -35,6 +35,31 @@ Codec:
     Software that implements the decoding and encoding algorithms
     of a compression scheme.
 
+.. _ImageFileDirectory:
+
+Image File Directory (IFD):
+    An Image File Directory - in short also *directory* -
+    contains information about the image,
+    as well as pointers (offsets) to the actual image data
+    within the on-disk file.
+    An IFD points either to the next IFD or shows with a ''0''
+    that it is the last IFD in the IFD-chain.
+
+Multi Images per TIFF file:
+    There may be more than one IFD in a TIFF file.
+    Each IFD defines a *subfile*.
+    One potential use of *subfiles* is to describe related images,
+    such as the pages of a facsimile transmission.
+    Such files are also named "*multi-page* TIFF" or "*multi-image* TIFF".
+    Refer also to :doc:`/multi_page`.
+
+.. _SubFile:
+
+Subfile:
+    *Subfile* is a term in the TIFF 6.0 specification for
+    an image and its associated *Image File Directory (IFD)*
+    in a TIFF file containing one or more images.
+
 In order to better understand how TIFF works (and consequently this
 software) it is important to recognize the distinction between the
 physical organization of image data as it is stored in a TIFF and how



The patch
From 690e2f21f25801e7f56aab1e29bb4d2a151b7995 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Mon, 19 Dec 2022 09:14:04 -0800
Subject: [PATCH] Don't send Razer devices the Sony third-party query feature
 report

Some of them lock up or reset, and the vast majority of devices are not actually game controllers.

Fixes https://github.com/libsdl-org/SDL/issues/6733

(cherry picked from commit 83b29f9ce1fe6caa06769544c3b5f6c10ea97a0f)
---
 src/joystick/SDL_joystick.c | 1 -
 src/joystick/usb_ids.h      | 6 +++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c
index 60026bcc8ab8..39f971bd35ed 100644
--- a/src/joystick/SDL_joystick.c
+++ b/src/joystick/SDL_joystick.c
@@ -2689,7 +2689,6 @@ SDL_bool SDL_ShouldIgnoreJoystick(const char *name, SDL_JoystickGUID guid)
         MAKE_VIDPID(0x04d9, 0x8009), /* OBINLB USB-HID Keyboard (Anne Pro II) */
         MAKE_VIDPID(0x04d9, 0xa292), /* OBINLB USB-HID Keyboard (Anne Pro II) */
         MAKE_VIDPID(0x04d9, 0xa293), /* OBINLB USB-HID Keyboard (Anne Pro II) */
-        MAKE_VIDPID(0x1532, 0x0226), /* Razer Huntsman Elite */
         MAKE_VIDPID(0x1532, 0x0266), /* Razer Huntsman V2 Analog, non-functional DInput device */
         MAKE_VIDPID(0x1532, 0x0282), /* Razer Huntsman Mini Analog, non-functional DInput device */
         MAKE_VIDPID(0x26ce, 0x01a2), /* ASRock LED Controller */
diff --git a/src/joystick/usb_ids.h b/src/joystick/usb_ids.h
index dd390f1d26e4..a47f970aa767 100644
--- a/src/joystick/usb_ids.h
+++ b/src/joystick/usb_ids.h
@@ -48,6 +48,11 @@
 #define USB_VENDOR_VALVE        0x28de
 #define USB_VENDOR_ZEROPLUS     0x0c12
 
+// Most Razer devices are not game controllers, and some of them lock up or reset
+// when we send them the Sony third-party query feature report, so don't include that
+// vendor here. Instead add devices as appropriate to controller_type.c
+// Reference: https://github.com/libsdl-org/SDL/issues/6733
+//            https://github.com/libsdl-org/SDL/issues/6799
 #define SONY_THIRDPARTY_VENDOR(X)       \
     (X == USB_VENDOR_DRAGONRISE     ||  \
      X == USB_VENDOR_HORI           ||  \
@@ -57,7 +62,6 @@
      X == USB_VENDOR_POWERA         ||  \
      X == USB_VENDOR_POWERA_ALT     ||  \
      X == USB_VENDOR_QANBA          ||  \
-     X == USB_VENDOR_RAZER          ||  \
      X == USB_VENDOR_SHANWAN        ||  \
      X == USB_VENDOR_SHANWAN_ALT    ||  \
      X == USB_VENDOR_THRUSTMASTER   ||  \



https://github.com/libsdl-org/SDL/commit/de871dc5f72214a3822963c896a5f024a9c053fa

The patch
From de871dc5f72214a3822963c896a5f024a9c053fa Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Mon, 19 Dec 2022 09:55:53 -0800
Subject: [PATCH] Sorted headers in Xcode project

This lets us more easily see when one is missing
---
 Xcode/SDL/SDL.xcodeproj/project.pbxproj | 2156 +++++++++++------------
 1 file changed, 1078 insertions(+), 1078 deletions(-)

diff --git a/Xcode/SDL/SDL.xcodeproj/project.pbxproj b/Xcode/SDL/SDL.xcodeproj/project.pbxproj
index a991a3d5a500..dc75ce7cbee5 100644
--- a/Xcode/SDL/SDL.xcodeproj/project.pbxproj
+++ b/Xcode/SDL/SDL.xcodeproj/project.pbxproj
@@ -5184,164 +5184,164 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A75FCCFD23E25AB700529352 /* SDL_shaders_metal_tvos.h in Headers */,
-				A75FCD0123E25AB700529352 /* SDL_uikitopengles.h in Headers */,
-				A75FCD0423E25AB700529352 /* SDL_uikitmetalview.h in Headers */,
-				A75FCD0623E25AB700529352 /* SDL_shape_internals.h in Headers */,
-				A75FCD0723E25AB700529352 /* SDL_glfuncs.h in Headers */,
-				F386F6F72884663E001840AA /* SDL_utils_c.h in Headers */,
-				A75FCD0923E25AB700529352 /* SDL_rect_c.h in Headers */,
-				A75FCD0B23E25AB700529352 /* SDL_shaders_metal_macos.h in Headers */,
-				A75FCD0C23E25AB700529352 /* SDL_shaders_metal_ios.h in Headers */,
-				A75FCD0D23E25AB700529352 /* SDL_offscreenwindow.h in Headers */,
+				A75FCDAC23E25AB700529352 /* SDL_RLEaccel_c.h in Headers */,
+				A75FCD6223E25AB700529352 /* SDL_assert_c.h in Headers */,
+				A75FCD5623E25AB700529352 /* SDL_audio_c.h in Headers */,
+				A75FCD5523E25AB700529352 /* SDL_audiodev_c.h in Headers */,
+				A75FCD2C23E25AB700529352 /* SDL_blendfillrect.h in Headers */,
+				A75FCDCE23E25AB700529352 /* SDL_blendline.h in Headers */,
+				A75FCD8323E25AB700529352 /* SDL_blendpoint.h in Headers */,
+				A75FCD9423E25AB700529352 /* SDL_blit.h in Headers */,
+				A75FCDCD23E25AB700529352 /* SDL_blit_auto.h in Headers */,
+				A75FCDAB23E25AB700529352 /* SDL_blit_copy.h in Headers */,
+				A75FCD3D23E25AB700529352 /* SDL_blit_slow.h in Headers */,
+				A75FCD5123E25AB700529352 /* SDL_clipboardevents_c.h in Headers */,
+				A75FCDB323E25AB700529352 /* SDL_cocoaclipboard.h in Headers */,
+				A75FCDD223E25AB700529352 /* SDL_cocoaevents.h in Headers */,
+				A75FCD4A23E25AB700529352 /* SDL_cocoakeyboard.h in Headers */,
+				A75FCD2623E25AB700529352 /* SDL_cocoamessagebox.h in Headers */,
+				A75FCD9223E25AB700529352 /* SDL_cocoametalview.h in Headers */,
+				A75FCDB423E25AB700529352 /* SDL_cocoamodes.h in Headers */,
+				A75FCD3B23E25AB700529352 /* SDL_cocoamouse.h in Headers */,
+				A75FCD6823E25AB700529352 /* SDL_cocoaopengl.h in Headers */,
+				A75FCD9323E25AB700529352 /* SDL_cocoaopengles.h in Headers */,
+				A75FCD7E23E25AB700529352 /* SDL_cocoashape.h in Headers */,
+				A75FCD4223E25AB700529352 /* SDL_cocoavideo.h in Headers */,
+				A75FCD8C23E25AB700529352 /* SDL_cocoavulkan.h in Headers */,
+				A75FCDE623E25AB700529352 /* SDL_cocoawindow.h in Headers */,
+				A75FCD6D23E25AB700529352 /* SDL_coreaudio.h in Headers */,
 				A75FCD0F23E25AB700529352 /* SDL_coremotionsensor.h in Headers */,
-				A75FCD1023E25AB700529352 /* SDL_uikitview.h in Headers */,
-				A75FCD1223E25AB700529352 /* SDL_uikitappdelegate.h in Headers */,
-				A75FCD1323E25AB700529352 /* keyinfotable.h in Headers */,
-				A75FCD1523E25AB700529352 /* SDL_dropevents_c.h in Headers */,
-				A75FCD1623E25AB700529352 /* SDL_haptic_c.h in Headers */,
-				A75FCD1823E25AB700529352 /* SDL_dataqueue.h in Headers */,
-				A75FCD1923E25AB700529352 /* SDL_error_c.h in Headers */,
 				A75FCD1C23E25AB700529352 /* SDL_d3dmath.h in Headers */,
-				A75FCD1F23E25AB700529352 /* SDL_egl_c.h in Headers */,
-				A75FCD2123E25AB700529352 /* yuv_rgb.h in Headers */,
+				A75FCD1823E25AB700529352 /* SDL_dataqueue.h in Headers */,
+				A75FCD6323E25AB700529352 /* SDL_diskaudio.h in Headers */,
+				A75FCDB823E25AB700529352 /* SDL_displayevents_c.h in Headers */,
+				A75FCD6E23E25AB700529352 /* SDL_draw.h in Headers */,
+				A75FCD6F23E25AB700529352 /* SDL_drawline.h in Headers */,
+				A75FCD6523E25AB700529352 /* SDL_drawpoint.h in Headers */,
+				A75FCD1523E25AB700529352 /* SDL_dropevents_c.h in Headers */,
 				A75FCD2223E25AB700529352 /* SDL_dummyaudio.h in Headers */,
-				A75FCD2323E25AB700529352 /* SDL_uikitmessagebox.h in Headers */,
-				A75FCD2523E25AB700529352 /* SDL_thread_c.h in Headers */,
-				A75FCD2623E25AB700529352 /* SDL_cocoamessagebox.h in Headers */,
-				F31A92D028D4CB39003BFD6A /* SDL_offscreenopengles.h in Headers */,
-				A75FCD2C23E25AB700529352 /* SDL_blendfillrect.h in Headers */,
+				A75FCD5C23E25AB700529352 /* SDL_dummysensor.h in Headers */,
+				A75FCD6123E25AB700529352 /* SDL_dynapi.h in Headers */,
+				A75FCDE523E25AB700529352 /* SDL_dynapi_overrides.h in Headers */,
+				A75FCDD623E25AB700529352 /* SDL_dynapi_procs.h in Headers */,
+				A75FCD1F23E25AB700529352 /* SDL_egl_c.h in Headers */,
+				A75FCD1923E25AB700529352 /* SDL_error_c.h in Headers */,
+				A75FCD7923E25AB700529352 /* SDL_events_c.h in Headers */,
+				A75FCD8B23E25AB700529352 /* SDL_gamecontrollerdb.h in Headers */,
+				A75FCDDB23E25AB700529352 /* SDL_gles2funcs.h in Headers */,
+				A75FCD0723E25AB700529352 /* SDL_glfuncs.h in Headers */,
+				A75FCD1623E25AB700529352 /* SDL_haptic_c.h in Headers */,
+				A75FDBCC23EA380300529352 /* SDL_hidapi_rumble.h in Headers */,
 				A75FCD2E23E25AB700529352 /* SDL_hidapijoystick_c.h in Headers */,
-				A75FCD3023E25AB700529352 /* SDL_pixels_c.h in Headers */,
-				A75FCD3223E25AB700529352 /* SDL_joystick_c.h in Headers */,
+				A75FCD5423E25AB700529352 /* SDL_hints_c.h in Headers */,
+				A75FCDC323E25AB700529352 /* SDL_internal.h in Headers */,
 				F395C19A2569C68F00942BFF /* SDL_iokitjoystick_c.h in Headers */,
-				A75FCD3323E25AB700529352 /* vk_sdk_platform.h in Headers */,
-				A75FCD3423E25AB700529352 /* blank_cursor.h in Headers */,
-				A75FDB5F23E39E6100529352 /* hidapi.h in Headers */,
-				A75FDBCC23EA380300529352 /* SDL_hidapi_rumble.h in Headers */,
+				A75FCD3223E25AB700529352 /* SDL_joystick_c.h in Headers */,
+				A75FCDC823E25AB700529352 /* SDL_keyboard_c.h in Headers */,
+				A1BB8B7327F6CF330057CFA8 /* SDL_list.h in Headers */,
+				F386F6EE2884663E001840AA /* SDL_log_c.h in Headers */,
+				F395C1C12569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */,
+				A75FCDCC23E25AB700529352 /* SDL_mouse_c.h in Headers */,
+				A75FCD8523E25AB700529352 /* SDL_nullevents_c.h in Headers */,
+				A75FCDD423E25AB700529352 /* SDL_nullframebuffer_c.h in Headers */,
+				A75FCDAA23E25AB700529352 /* SDL_nullvideo.h in Headers */,
+				A75FCD6B23E25AB700529352 /* SDL_offscreenevents_c.h in Headers */,
+				A75FCDB723E25AB700529352 /* SDL_offscreenframebuffer_c.h in Headers */,
+				F31A92D028D4CB39003BFD6A /* SDL_offscreenopengles.h in Headers */,
+				A75FCD8423E25AB700529352 /* SDL_offscreenvideo.h in Headers */,
+				A75FCD0D23E25AB700529352 /* SDL_offscreenwindow.h in Headers */,
+				A75FCD3023E25AB700529352 /* SDL_pixels_c.h in Headers */,
+				A75FCD0923E25AB700529352 /* SDL_rect_c.h in Headers */,
+				A75FCDA723E25AB700529352 /* SDL_render_sw_c.h in Headers */,
+				A75FCD9823E25AB700529352 /* SDL_rotate.h in Headers */,
+				A75FCDBE23E25AB700529352 /* SDL_rwopsbundlesupport.h in Headers */,
+				A75FCD9623E25AB700529352 /* SDL_sensor_c.h in Headers */,
+				A75FCD4623E25AB700529352 /* SDL_shaders_gl.h in Headers */,
+				A75FCD8023E25AB700529352 /* SDL_shaders_gles2.h in Headers */,
+				A75FCD0C23E25AB700529352 /* SDL_shaders_metal_ios.h in Headers */,
+				A75FCD0B23E25AB700529352 /* SDL_shaders_metal_macos.h in Headers */,
+				A75FCCFD23E25AB700529352 /* SDL_shaders_metal_tvos.h in Headers */,
+				A75FCD0623E25AB700529352 /* SDL_shape_internals.h in Headers */,
+				A75FCD8723E25AB700529352 /* SDL_steamcontroller.h in Headers */,
 				A75FCD3623E25AB700529352 /* SDL_sysaudio.h in Headers */,
-				A75FCD3923E25AB700529352 /* math_libm.h in Headers */,
-				A75FCD3A23E25AB700529352 /* SDL_uikitvideo.h in Headers */,
-				A75FCD3B23E25AB700529352 /* SDL_cocoamouse.h in Headers */,
-				A75FCD3D23E25AB700529352 /* SDL_blit_slow.h in Headers */,
-				A75FCD3E23E25AB700529352 /* SDL_yuv_sw_c.h in Headers */,
-				A75FCD4023E25AB700529352 /* SDL_windowevents_c.h in Headers */,
-				A75FCD4223E25AB700529352 /* SDL_cocoavideo.h in Headers */,
+				A75FCDCF23E25AB700529352 /* SDL_syshaptic.h in Headers */,
+				A75FCD5323E25AB700529352 /* SDL_syshaptic_c.h in Headers */,
+				A75FCD8623E25AB700529352 /* SDL_sysjoystick.h in Headers */,
 				5605721D2473688E00B46B66 /* SDL_syslocale.h in Headers */,
-				A75FCD4423E25AB700529352 /* SDL_uikitevents.h in Headers */,
-				A75FCD4623E25AB700529352 /* SDL_shaders_gl.h in Headers */,
+				A75FCDBC23E25AB700529352 /* SDL_sysmutex_c.h in Headers */,
+				A75FCD7523E25AB700529352 /* SDL_syspower.h in Headers */,
+				A75FCDBF23E25AB700529352 /* SDL_syspower.h in Headers */,
+				A75FCD9723E25AB700529352 /* SDL_sysrender.h in Headers */,
+				A75FCD6023E25AB700529352 /* SDL_syssensor.h in Headers */,
+				A75FCDB023E25AB700529352 /* SDL_systhread.h in Headers */,
 				A75FCD4723E25AB700529352 /* SDL_systhread_c.h in Headers */,
-				A1BB8B7327F6CF330057CFA8 /* SDL_list.h in Headers */,
 				5616CA63252BB35F005D5928 /* SDL_sysurl.h in Headers */,
-				A75FCD4A23E25AB700529352 /* SDL_cocoakeyboard.h in Headers */,
-				A75FCD4B23E25AB700529352 /* SDL_uikitvulkan.h in Headers */,
-				A75FCD4E23E25AB700529352 /* vulkan.hpp in Headers */,
-				A75FCD5023E25AB700529352 /* gl2ext.h in Headers */,
-				A75FCD5123E25AB700529352 /* SDL_clipboardevents_c.h in Headers */,
-				A75FCD5323E25AB700529352 /* SDL_syshaptic_c.h in Headers */,
-				A75FCD5423E25AB700529352 /* SDL_hints_c.h in Headers */,
-				A75FCD5523E25AB700529352 /* SDL_audiodev_c.h in Headers */,
-				A75FCD5623E25AB700529352 /* SDL_audio_c.h in Headers */,
+				A75FCDE123E25AB700529352 /* SDL_sysvideo.h in Headers */,
+				A75FCD2523E25AB700529352 /* SDL_thread_c.h in Headers */,
+				A75FCDBA23E25AB700529352 /* SDL_timer_c.h in Headers */,
+				A75FCD8A23E25AB700529352 /* SDL_touch_c.h in Headers */,
+				A1626A592617008D003F1973 /* SDL_triangle.h in Headers */,
+				A75FCD1223E25AB700529352 /* SDL_uikitappdelegate.h in Headers */,
+				A75FCDA023E25AB700529352 /* SDL_uikitclipboard.h in Headers */,
+				A75FCD4423E25AB700529352 /* SDL_uikitevents.h in Headers */,
+				A75FCD2323E25AB700529352 /* SDL_uikitmessagebox.h in Headers */,
+				A75FCD0423E25AB700529352 /* SDL_uikitmetalview.h in Headers */,
 				A75FCD5723E25AB700529352 /* SDL_uikitmodes.h in Headers */,
-				A75FCD5823E25AB700529352 /* egl.h in Headers */,
-				A75FCD5923E25AB700529352 /* khrplatform.h in Headers */,
+				A75FCD0123E25AB700529352 /* SDL_uikitopengles.h in Headers */,
+				A75FCDB523E25AB700529352 /* SDL_uikitopenglview.h in Headers */,
+				A75FCD3A23E25AB700529352 /* SDL_uikitvideo.h in Headers */,
+				A75FCD1023E25AB700529352 /* SDL_uikitview.h in Headers */,
 				A75FCD5B23E25AB700529352 /* SDL_uikitviewcontroller.h in Headers */,
-				A75FCD5C23E25AB700529352 /* SDL_dummysensor.h in Headers */,
-				A75FCD5D23E25AB700529352 /* vulkan_android.h in Headers */,
-				A75FCD5E23E25AB700529352 /* yuv_rgb_std_func.h in Headers */,
-				A75FCD5F23E25AB700529352 /* vulkan_core.h in Headers */,
-				A75FCD6023E25AB700529352 /* SDL_syssensor.h in Headers */,
-				A75FCD6123E25AB700529352 /* SDL_dynapi.h in Headers */,
-				A75FCD6223E25AB700529352 /* SDL_assert_c.h in Headers */,
-				A75FCD6323E25AB700529352 /* SDL_diskaudio.h in Headers */,
-				A75FCD6523E25AB700529352 /* SDL_drawpoint.h in Headers */,
-				A75FCD6723E25AB700529352 /* SDL_wave.h in Headers */,
-				A75FCD6823E25AB700529352 /* SDL_cocoaopengl.h in Headers */,
-				A75FCD6923E25AB700529352 /* yuv_rgb_sse_func.h in Headers */,
-				A75FCD6B23E25AB700529352 /* SDL_offscreenevents_c.h in Headers */,
+				A75FCD4B23E25AB700529352 /* SDL_uikitvulkan.h in Headers */,
+				A75FCDA223E25AB700529352 /* SDL_uikitwindow.h in Headers */,
+				F386F6F72884663E001840AA /* SDL_utils_c.h in Headers */,
 				F3973FA928A59BDD00B84553 /* SDL_vacopy.h in Headers */,
-				A1626A592617008D003F1973 /* SDL_triangle.h in Headers */,
-				A75FCD6D23E25AB700529352 /* SDL_coreaudio.h in Headers */,
-				A75FCD6E23E25AB700529352 /* SDL_draw.h in Headers */,
-				A75FCD6F23E25AB700529352 /* SDL_drawline.h in Headers */,
+				75E0916A241EA924004729E1 /* SDL_virtualjoystick_c.h in Headers */,
+				A75FCDD023E25AB700529352 /* SDL_vulkan_internal.h in Headers */,
+				A75FCD6723E25AB700529352 /* SDL_wave.h in Headers */,
+				A75FCD4023E25AB700529352 /* SDL_windowevents_c.h in Headers */,
 				A75FCD7323E25AB700529352 /* SDL_yuv_c.h in Headers */,
-				A75FCD7423E25AB700529352 /* scancodes_xfree86.h in Headers */,
-				A75FCD7523E25AB700529352 /* SDL_syspower.h in Headers */,
+				A75FCD3E23E25AB700529352 /* SDL_yuv_sw_c.h in Headers */,
+				A75FCD3423E25AB700529352 /* blank_cursor.h in Headers */,
+				A75FCD9E23E25AB700529352 /* controller_type.h in Headers */,
+				A75FCDA623E25AB700529352 /* default_cursor.h in Headers */,
+				A75FCD5823E25AB700529352 /* egl.h in Headers */,
 				A75FCD7823E25AB700529352 /* eglext.h in Headers */,
-				A75FCD7923E25AB700529352 /* SDL_events_c.h in Headers */,
+				A75FCDAD23E25AB700529352 /* eglplatform.h in Headers */,
+				A75FCDBB23E25AB700529352 /* gl2.h in Headers */,
+				A75FCD5023E25AB700529352 /* gl2ext.h in Headers */,
+				A75FCD8D23E25AB700529352 /* gl2platform.h in Headers */,
+				A75FDB5F23E39E6100529352 /* hidapi.h in Headers */,
+				A75FCD1323E25AB700529352 /* keyinfotable.h in Headers */,
+				A75FCD5923E25AB700529352 /* khrplatform.h in Headers */,
+				A75FCD3923E25AB700529352 /* math_libm.h in Headers */,
 				A75FCD7A23E25AB700529352 /* math_private.h in Headers */,
-				A75FCD7C23E25AB700529352 /* vulkan_wayland.h in Headers */,
-				A75FCD7E23E25AB700529352 /* SDL_cocoashape.h in Headers */,
-				A75FCD8023E25AB700529352 /* SDL_shaders_gles2.h in Headers */,
-				A75FCD8323E25AB700529352 /* SDL_blendpoint.h in Headers */,
-				A75FCD8423E25AB700529352 /* SDL_offscreenvideo.h in Headers */,
-				A75FCD8523E25AB700529352 /* SDL_nullevents_c.h in Headers */,
-				A75FCD8623E25AB700529352 /* SDL_sysjoystick.h in Headers */,
-				A75FCD8723E25AB700529352 /* SDL_steamcontroller.h in Headers */,
+				A75FCD9D23E25AB700529352 /* scancodes_darwin.h in Headers */,
 				A75FCD8823E25AB700529352 /* scancodes_linux.h in Headers */,
-				A75FCD8A23E25AB700529352 /* SDL_touch_c.h in Headers */,
-				A75FCD8B23E25AB700529352 /* SDL_gamecontrollerdb.h in Headers */,
-				A75FCD8C23E25AB700529352 /* SDL_cocoavulkan.h in Headers */,
-				A75FCD8D23E25AB700529352 /* gl2platform.h in Headers */,
+				A75FCDBD23E25AB700529352 /* scancodes_windows.h in Headers */,
+				A75FCD7423E25AB700529352 /* scancodes_xfree86.h in Headers */,
+				A75FCDDA23E25AB700529352 /* usb_ids.h in Headers */,
+				A75FCDD323E25AB700529352 /* vk_icd.h in Headers */,
 				A75FCD8F23E25AB700529352 /* vk_layer.h in Headers */,
 				A75FCD9123E25AB700529352 /* vk_platform.h in Headers */,
-				A75FCD9223E25AB700529352 /* SDL_cocoametalview.h in Headers */,
-				A75FCD9323E25AB700529352 /* SDL_cocoaopengles.h in Headers */,
-				A75FCD9423E25AB700529352 /* SDL_blit.h in Headers */,
-				A75FCD9523E25AB700529352 /* vulkan_xlib_xrandr.h in Headers */,
-				A75FCD9623E25AB700529352 /* SDL_sensor_c.h in Headers */,
-				A75FCD9723E25AB700529352 /* SDL_sysrender.h in Headers */,
-				A75FCD9823E25AB700529352 /* SDL_rotate.h in Headers */,
-				A75FCD9D23E25AB700529352 /* scancodes_darwin.h in Headers */,
-				A75FCD9E23E25AB700529352 /* controller_type.h in Headers */,
-				A75FCDA023E25AB700529352 /* SDL_uikitclipboard.h in Headers */,
-				A75FCDA123E25AB700529352 /* vulkan_xlib.h in Headers */,
-				A75FCDA223E25AB700529352 /* SDL_uikitwindow.h in Headers */,
-				A75FCDA323E25AB700529352 /* vulkan_vi.h in Headers */,
+				A75FCD3323E25AB700529352 /* vk_sdk_platform.h in Headers */,
+				A75FCDC723E25AB700529352 /* vulkan.h in Headers */,
+				A75FCD4E23E25AB700529352 /* vulkan.hpp in Headers */,
+				A75FCD5D23E25AB700529352 /* vulkan_android.h in Headers */,
+				A75FCD5F23E25AB700529352 /* vulkan_core.h in Headers */,
+				A75FCDD723E25AB700529352 /* vulkan_fuchsia.h in Headers */,
+				A75FCDC223E25AB700529352 /* vulkan_ios.h in Headers */,
+				A75FCDC023E25AB700529352 /* vulkan_macos.h in Headers */,
 				A75FCDA423E25AB700529352 /* vulkan_mir.h in Headers */,
-				A75FCDA623E25AB700529352 /* default_cursor.h in Headers */,
-				A75FCDA723E25AB700529352 /* SDL_render_sw_c.h in Headers */,
-				A75FCDAA23E25AB700529352 /* SDL_nullvideo.h in Headers */,
-				A75FCDAB23E25AB700529352 /* SDL_blit_copy.h in Headers */,
-				75E0916A241EA924004729E1 /* SDL_virtualjoystick_c.h in Headers */,
-				A75FCDAC23E25AB700529352 /* SDL_RLEaccel_c.h in Headers */,
-				A75FCDAD23E25AB700529352 /* eglplatform.h in Headers */,
-				A75FCDB023E25AB700529352 /* SDL_systhread.h in Headers */,
-				A75FCDB323E25AB700529352 /* SDL_cocoaclipboard.h in Headers */,
-				A75FCDB423E25AB700529352 /* SDL_cocoamodes.h in Headers */,
-				A75FCDB523E25AB700529352 /* SDL_uikitopenglview.h in Headers */,
+				A75FCDA323E25AB700529352 /* vulkan_vi.h in Headers */,
+				A75FCD7C23E25AB700529352 /* vulkan_wayland.h in Headers */,
 				A75FCDB623E25AB700529352 /* vulkan_win32.h in Headers */,
-				A75FCDB723E25AB700529352 /* SDL_offscreenframebuffer_c.h in Headers */,
-				A75FCDB823E25AB700529352 /* SDL_displayevents_c.h in Headers */,
-				A75FCDBA23E25AB700529352 /* SDL_timer_c.h in Headers */,
-				A75FCDBB23E25AB700529352 /* gl2.h in Headers */,
-				A75FCDBC23E25AB700529352 /* SDL_sysmutex_c.h in Headers */,
-				A75FCDBD23E25AB700529352 /* scancodes_windows.h in Headers */,
-				A75FCDBE23E25AB700529352 /* SDL_rwopsbundlesupport.h in Headers */,
-				A75FCDBF23E25AB700529352 /* SDL_syspower.h in Headers */,
-				A75FCDC023E25AB700529352 /* vulkan_macos.h in Headers */,
 				A75FCDC123E25AB700529352 /* vulkan_xcb.h in Headers */,
-				A75FCDC223E25AB700529352 /* vulkan_ios.h in Headers */,
-				A75FCDC323E25AB700529352 /* SDL_internal.h in Headers */,
-				A75FCDC723E25AB700529352 /* vulkan.h in Headers */,
-				A75FCDC823E25AB700529352 /* SDL_keyboard_c.h in Headers */,
-				A75FCDCC23E25AB700529352 /* SDL_mouse_c.h in Headers */,
-				F395C1C12569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */,
-				A75FCDCD23E25AB700529352 /* SDL_blit_auto.h in Headers */,
-				A75FCDCE23E25AB700529352 /* SDL_blendline.h in Headers */,
-				A75FCDCF23E25AB700529352 /* SDL_syshaptic.h in Headers */,
-				A75FCDD023E25AB700529352 /* SDL_vulkan_internal.h in Headers */,
-				A75FCDD223E25AB700529352 /* SDL_cocoaevents.h in Headers */,
-				A75FCDD323E25AB700529352 /* vk_icd.h in Headers */,
-				A75FCDD423E25AB700529352 /* SDL_nullframebuffer_c.h in Headers */,
-				A75FCDD623E25AB700529352 /* SDL_dynapi_procs.h in Headers */,
-				A75FCDD723E25AB700529352 /* vulkan_fuchsia.h in Headers */,
-				A75FCDDA23E25AB700529352 /* usb_ids.h in Headers */,
-				A75FCDDB23E25AB700529352 /* SDL_gles2funcs.h in Headers */,
-				A75FCDE123E25AB700529352 /* SDL_sysvideo.h in Headers */,
-				F386F6EE2884663E001840AA /* SDL_log_c.h in Headers */,
-				A75FCDE523E25AB700529352 /* SDL_dynapi_overrides.h in Headers */,
-				A75FCDE623E25AB700529352 /* SDL_cocoawindow.h in Headers */,
+				A75FCDA123E25AB700529352 /* vulkan_xlib.h in Headers */,
+				A75FCD9523E25AB700529352 /* vulkan_xlib_xrandr.h in Headers */,
+				A75FCD2123E25AB700529352 /* yuv_rgb.h in Headers */,
+				A75FCD6923E25AB700529352 /* yuv_rgb_sse_func.h in Headers */,
+				A75FCD5E23E25AB700529352 /* yuv_rgb_std_func.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -5349,164 +5349,164 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A75FCEB623E25AC700529352 /* SDL_shaders_metal_tvos.h in Headers */,
-				A75FCEBA23E25AC700529352 /* SDL_uikitopengles.h in Headers */,
-				A75FCEBD23E25AC700529352 /* SDL_uikitmetalview.h in Headers */,
-				A75FCEBF23E25AC700529352 /* SDL_shape_internals.h in Headers */,
-				A75FCEC023E25AC700529352 /* SDL_glfuncs.h in Headers */,
-				F386F6F82884663E001840AA /* SDL_utils_c.h in Headers */,
-				A75FCEC223E25AC700529352 /* SDL_rect_c.h in Headers */,
-				A75FCEC423E25AC700529352 /* SDL_shaders_metal_macos.h in Headers */,
-				A75FCEC523E25AC700529352 /* SDL_shaders_metal_ios.h in Headers */,
-				A75FCEC623E25AC700529352 /* SDL_offscreenwindow.h in Headers */,
+				A75FCF6523E25AC700529352 /* SDL_RLEaccel_c.h in Headers */,
+				A75FCF1B23E25AC700529352 /* SDL_assert_c.h in Headers */,
+				A75FCF0F23E25AC700529352 /* SDL_audio_c.h in Headers */,
+				A75FCF0E23E25AC700529352 /* SDL_audiodev_c.h in Headers */,
+				A75FCEE523E25AC700529352 /* SDL_blendfillrect.h in Headers */,
+				A75FCF8723E25AC700529352 /* SDL_blendline.h in Headers */,
+				A75FCF3C23E25AC700529352 /* SDL_blendpoint.h in Headers */,
+				A75FCF4D23E25AC700529352 /* SDL_blit.h in Headers */,
+				A75FCF8623E25AC700529352 /* SDL_blit_auto.h in Headers */,
+				A75FCF6423E25AC700529352 /* SDL_blit_copy.h in Headers */,
+				A75FCEF623E25AC700529352 /* SDL_blit_slow.h in Headers */,
+				A75FCF0A23E25AC700529352 /* SDL_clipboardevents_c.h in Headers */,
+				A75FCF6C23E25AC700529352 /* SDL_cocoaclipboard.h in Headers */,
+				A75FCF8B23E25AC700529352 /* SDL_cocoaevents.h in Headers */,
+				A75FCF0323E25AC700529352 /* SDL_cocoakeyboard.h in Headers */,
+				A75FCEDF23E25AC700529352 /* SDL_cocoamessagebox.h in Headers */,
+				A75FCF4B23E25AC700529352 /* SDL_cocoametalview.h in Headers */,
+				A75FCF6D23E25AC700529352 /* SDL_cocoamodes.h in Headers */,
+				A75FCEF423E25AC700529352 /* SDL_cocoamouse.h in Headers */,
+				A75FCF2123E25AC700529352 /* SDL_cocoaopengl.h in Headers */,
+				A75FCF4C23E25AC700529352 /* SDL_cocoaopengles.h in Headers */,
+				A75FCF3723E25AC700529352 /* SDL_cocoashape.h in Headers */,
+				A75FCEFB23E25AC700529352 /* SDL_cocoavideo.h in Headers */,
+				A75FCF4523E25AC700529352 /* SDL_cocoavulkan.h in Headers */,
+				A75FCF9F23E25AC700529352 /* SDL_cocoawindow.h in Headers */,
+				A75FCF2623E25AC700529352 /* SDL_coreaudio.h in Headers */,
 				A75FCEC823E25AC700529352 /* SDL_coremotionsensor.h in Headers */,
-				A75FCEC923E25AC700529352 /* SDL_uikitview.h in Headers */,
-				A75FCECB23E25AC700529352 /* SDL_uikitappdelegate.h in Headers */,
-				A75FCECC23E25AC700529352 /* keyinfotable.h in Headers */,
-				A75FCECE23E25AC700529352 /* SDL_dropevents_c.h in Headers */,
-				A75FCECF23E25AC700529352 /* SDL_haptic_c.h in Headers */,
-				A75FCED123E25AC700529352 /* SDL_dataqueue.h in Headers */,
-				A75FCED223E25AC700529352 /* SDL_error_c.h in Headers */,
 				A75FCED523E25AC700529352 /* SDL_d3dmath.h in Headers */,
-				A75FCED823E25AC700529352 /* SDL_egl_c.h in Headers */,
-				A75FCEDA23E25AC700529352 /* yuv_rgb.h in Headers */,
+				A75FCED123E25AC700529352 /* SDL_dataqueue.h in Headers */,
+				A75FCF1C23E25AC700529352 /* SDL_diskaudio.h in Headers */,
+				A75FCF7123E25AC700529352 /* SDL_displayevents_c.h in Headers */,
+				A75FCF2723E25AC700529352 /* SDL_draw.h in Headers */,
+				A75FCF2823E25AC700529352 /* SDL_drawline.h in Headers */,
+				A75FCF1E23E25AC700529352 /* SDL_drawpoint.h in Headers */,
+				A75FCECE23E25AC700529352 /* SDL_dropevents_c.h in Headers */,
 				A75FCEDB23E25AC700529352 /* SDL_dummyaudio.h in Headers */,
-				A75FCEDC23E25AC700529352 /* SDL_uikitmessagebox.h in Headers */,
-				A75FCEDE23E25AC700529352 /* SDL_thread_c.h in Headers */,
-				A75FCEDF23E25AC700529352 /* SDL_cocoamessagebox.h in Headers */,
-				F31A92D128D4CB39003BFD6A /* SDL_offscreenopengles.h in Headers */,
-				A75FCEE523E25AC700529352 /* SDL_blendfillrect.h in Headers */,
+				A75FCF1523E25AC700529352 /* SDL_dummysensor.h in Headers */,
+				A75FCF1A23E25AC700529352 /* SDL_dynapi.h in Headers */,
+				A75FCF9E23E25AC700529352 /* SDL_dynapi_overrides.h in Headers */,
+				A75FCF8F23E25AC700529352 /* SDL_dynapi_procs.h in Headers */,
+				A75FCED823E25AC700529352 /* SDL_egl_c.h in Headers */,
+				A75FCED223E25AC700529352 /* SDL_error_c.h in Headers */,
+				A75FCF3223E25AC700529352 /* SDL_events_c.h in Headers */,
+				A75FCF4423E25AC700529352 /* SDL_gamecontrollerdb.h in Headers */,
+				A75FCF9423E25AC700529352 /* SDL_gles2funcs.h in Headers */,
+				A75FCEC023E25AC700529352 /* SDL_glfuncs.h in Headers */,
+				A75FCECF23E25AC700529352 /* SDL_haptic_c.h in Headers */,
+				A75FDBCD23EA380300529352 /* SDL_hidapi_rumble.h in Headers */,
 				A75FCEE723E25AC700529352 /* SDL_hidapijoystick_c.h in Headers */,
-				A75FCEE923E25AC700529352 /* SDL_pixels_c.h in Headers */,
-				A75FCEEB23E25AC700529352 /* SDL_joystick_c.h in Headers */,
+				A75FCF0D23E25AC700529352 /* SDL_hints_c.h in Headers */,
+				A75FCF7C23E25AC700529352 /* SDL_internal.h in Headers */,
 				F395C19B2569C68F00942BFF /* SDL_iokitjoystick_c.h in Headers */,
-				A75FCEEC23E25AC700529352 /* vk_sdk_platform.h in Headers */,
-				A75FCEED23E25AC700529352 /* blank_cursor.h in Headers */,
-				A75FDB6023E39E6100529352 /* hidapi.h in Headers */,
-				A75FDBCD23EA380300529352 /* SDL_hidapi_rumble.h in Headers */,
+				A75FCEEB23E25AC700529352 /* SDL_joystick_c.h in Headers */,
+				A75FCF8123E25AC700529352 /* SDL_keyboard_c.h in Headers */,
+				A1BB8B7427F6CF330057CFA8 /* SDL_list.h in Headers */,
+				F386F6EF2884663E001840AA /* SDL_log_c.h in Headers */,
+				F395C1C22569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */,
+				A75FCF8523E25AC700529352 /* SDL_mouse_c.h in Headers */,
+				A75FCF3E23E25AC700529352 /* SDL_nullevents_c.h in Headers */,
+				A75FCF8D23E25AC700529352 /* SDL_nullframebuffer_c.h in Headers */,
+				A75FCF6323E25AC700529352 /* SDL_nullvideo.h in Headers */,
+				A75FCF2423E25AC700529352 /* SDL_offscreenevents_c.h in Headers */,
+				A75FCF7023E25AC700529352 /* SDL_offscreenframebuffer_c.h in Headers */,
+				F31A92D128D4CB39003BFD6A /* SDL_offscreenopengles.h in Headers */,
+				A75FCF3D23E25AC700529352 /* SDL_offscreenvideo.h in Headers */,
+				A75FCEC623E25AC700529352 /* SDL_offscreenwindow.h in Headers */,
+				A75FCEE923E25AC700529352 /* SDL_pixels_c.h in Headers */,
+				A75FCEC223E25AC700529352 /* SDL_rect_c.h in Headers */,
+				A75FCF6023E25AC700529352 /* SDL_render_sw_c.h in Headers */,
+				A75FCF5123E25AC700529352 /* SDL_rotate.h in Headers */,
+				A75FCF7723E25AC700529352 /* SDL_rwopsbundlesupport.h in Headers */,
+				A75FCF4F23E25AC700529352 /* SDL_sensor_c.h in Headers */,
+				A75FCEFF23E25AC700529352 /* SDL_shaders_gl.h in Headers */,
+				A75FCF3923E25AC700529352 /* SDL_shaders_gles2.h in Headers */,
+				A75FCEC523E25AC700529352 /* SDL_shaders_metal_ios.h in Headers */,
+				A75FCEC423E25AC700529352 /* SDL_shaders_metal_macos.h in Headers */,
+				A75FCEB623E25AC700529352 /* SDL_shaders_metal_tvos.h in Headers */,
+				A75FCEBF23E25AC700529352 /* SDL_shape_internals.h in Headers */,
+				A75FCF4023E25AC700529352 /* SDL_steamcontroller.h in Headers */,
 				A75FCEEF23E25AC700529352 /* SDL_sysaudio.h in Headers */,
-				A75FCEF223E25AC700529352 /* math_libm.h in Headers */,
-				A75FCEF323E25AC700529352 /* SDL_uikitvideo.h in Headers */,
-				A75FCEF423E25AC700529352 /* SDL_cocoamouse.h in Headers */,
-				A75FCEF623E25AC700529352 /* SDL_blit_slow.h in Headers */,
-				A75FCEF723E25AC700529352 /* SDL_yuv_sw_c.h in Headers */,
-				A75FCEF923E25AC700529352 /* SDL_windowevents_c.h in Headers */,
-				A75FCEFB23E25AC700529352 /* SDL_cocoavideo.h in Headers */,
+				A75FCF8823E25AC700529352 /* SDL_syshaptic.h in Headers */,
+				A75FCF0C23E25AC700529352 /* SDL_syshaptic_c.h in Headers */,
+				A75FCF3F23E25AC700529352 /* SDL_sysjoystick.h in Headers */,
 				5605721E2473688F00B46B66 /* SDL_syslocale.h in Headers */,
-				A75FCEFD23E25AC700529352 /* SDL_uikitevents.h in Headers */,
-				A75FCEFF23E25AC700529352 /* SDL_shaders_gl.h in Headers */,
+				A75FCF7523E25AC700529352 /* SDL_sysmutex_c.h in Headers */,
+				A75FCF2E23E25AC700529352 /* SDL_syspower.h in Headers */,
+				A75FCF7823E25AC700529352 /* SDL_syspower.h in Headers */,
+				A75FCF5023E25AC700529352 /* SDL_sysrender.h in Headers */,
+				A75FCF1923E25AC700529352 /* SDL_syssensor.h in Headers */,
+				A75FCF6923E25AC700529352 /* SDL_systhread.h in Headers */,
 				A75FCF0023E25AC700529352 /* SDL_systhread_c.h in Headers */,
-				A1BB8B7427F6CF330057CFA8 /* SDL_list.h in Headers */,
 				5616CA66252BB361005D5928 /* SDL_sysurl.h in Headers */,
-				A75FCF0323E25AC700529352 /* SDL_cocoakeyboard.h in Headers */,
-				A75FCF0423E25AC700529352 /* SDL_uikitvulkan.h in Headers */,
-				A75FCF0723E25AC700529352 /* vulkan.hpp in Headers */,
-				A75FCF0923E25AC700529352 /* gl2ext.h in Headers */,
-				A75FCF0A23E25AC700529352 /* SDL_clipboardevents_c.h in Headers */,
-				A75FCF0C23E25AC700529352 /* SDL_syshaptic_c.h in Headers */,
-				A75FCF0D23E25AC700529352 /* SDL_hints_c.h in Headers */,
-				A75FCF0E23E25AC700529352 /* SDL_audiodev_c.h in Headers */,
-				A75FCF0F23E25AC700529352 /* SDL_audio_c.h in Headers */,
+				A75FCF9A23E25AC700529352 /* SDL_sysvideo.h in Headers */,
+				A75FCEDE23E25AC700529352 /* SDL_thread_c.h in Headers */,
+				A75FCF7323E25AC700529352 /* SDL_timer_c.h in Headers */,
+				A75FCF4323E25AC700529352 /* SDL_touch_c.h in Headers */,
+				A1626A5A2617008D003F1973 /* SDL_triangle.h in Headers */,
+				A75FCECB23E25AC700529352 /* SDL_uikitappdelegate.h in Headers */,
+				A75FCF5923E25AC700529352 /* SDL_uikitclipboard.h in Headers */,
+				A75FCEFD23E25AC700529352 /* SDL_uikitevents.h in Headers */,
+				A75FCEDC23E25AC700529352 /* SDL_uikitmessagebox.h in Headers */,
+				A75FCEBD23E25AC700529352 /* SDL_uikitmetalview.h in Headers */,
 				A75FCF1023E25AC700529352 /* SDL_uikitmodes.h in Headers */,
-				A75FCF1123E25AC700529352 /* egl.h in Headers */,
-				A75FCF1223E25AC700529352 /* khrplatform.h in Headers */,
+				A75FCEBA23E25AC700529352 /* SDL_uikitopengles.h in Headers */,
+				A75FCF6E23E25AC700529352 /* SDL_uikitopenglview.h in Headers */,
+				A75FCEF323E25AC700529352 /* SDL_uikitvideo.h in Headers */,
+				A75FCEC923E25AC700529352 /* SDL_uikitview.h in Headers */,
 				A75FCF1423E25AC700529352 /* SDL_uikitviewcontroller.h in Headers */,
-				A75FCF1523E25AC700529352 /* SDL_dummysensor.h in Headers */,
-				A75FCF1623E25AC700529352 /* vulkan_android.h in Headers */,
-				A75FCF1723E25AC700529352 /* yuv_rgb_std_func.h in Headers */,
-				A75FCF1823E25AC700529352 /* vulkan_core.h in Headers */,
-				A75FCF1923E25AC700529352 /* SDL_syssensor.h in Headers */,
-				A75FCF1A23E25AC700529352 /* SDL_dynapi.h in Headers */,
-				A75FCF1B23E25AC700529352 /* SDL_assert_c.h in Headers */,
-				A75FCF1C23E25AC700529352 /* SDL_diskaudio.h in Headers */,
-				A75FCF1E23E25AC700529352 /* SDL_drawpoint.h in Headers */,
-				A75FCF2023E25AC700529352 /* SDL_wave.h in Headers */,
-				A75FCF2123E25AC700529352 /* SDL_cocoaopengl.h in Headers */,
-				A75FCF2223E25AC700529352 /* yuv_rgb_sse_func.h in Headers */,
-				A75FCF2423E25AC700529352 /* SDL_offscreenevents_c.h in Headers */,
+				A75FCF0423E25AC700529352 /* SDL_uikitvulkan.h in Headers */,
+				A75FCF5B23E25AC700529352 /* SDL_uikitwindow.h in Headers */,
+				F386F6F82884663E001840AA /* SDL_utils_c.h in Headers */,
 				F3973FAA28A59BDD00B84553 /* SDL_vacopy.h in Headers */,
-				A1626A5A2617008D003F1973 /* SDL_triangle.h in Headers */,
-				A75FCF2623E25AC700529352 /* SDL_coreaudio.h in Headers */,
-				A75FCF2723E25AC700529352 /* SDL_draw.h in Headers */,
-				

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


Â