Browse Source

Merge pull request #113945 from akien-mga/libjpeg-turbo-3.1.3

libjpeg-turbo: Update to 3.1.3
Thaddeus Crews 2 days ago
parent
commit
9bdae4260b

+ 1 - 1
COPYRIGHT.txt

@@ -372,7 +372,7 @@ License: BSD-3-clause
 
 Files: thirdparty/libjpeg-turbo/*
 Comment: libjpeg-turbo
-Copyright: 2009-2024, D. R. Commander
+Copyright: 2009-2025, D. R. Commander
  2015, Viktor Szathmáry.
  1991-2020, Thomas G. Lane, Guido Vollbeding
 License: BSD-3-clause and IJG

+ 1 - 1
thirdparty/README.md

@@ -538,7 +538,7 @@ Patches:
 ## libjpeg-turbo
 
 - Upstream: https://github.com/libjpeg-turbo/libjpeg-turbo
-- Version: 3.1.0 (20ade4dea9589515a69793e447a6c6220b464535, 2024)
+- Version: 3.1.3 (af9c1c268520a29adf98cad5138dafe612b3d318, 2025)
 - License: BSD-3-Clause and IJG
 
 Files extracted from upstream source:

+ 1 - 1
thirdparty/libjpeg-turbo/LICENSE.md

@@ -94,7 +94,7 @@ intended solely for clarification.
 The Modified (3-clause) BSD License
 ===================================
 
-Copyright (C)2009-2024 D. R. Commander.  All Rights Reserved.<br>
+Copyright (C)2009-2025 D. R. Commander.  All Rights Reserved.<br>
 Copyright (C)2015 Viktor Szathmáry.  All Rights Reserved.
 
 Redistribution and use in source and binary forms, with or without

+ 0 - 277
thirdparty/libjpeg-turbo/patches/0001-cmake-generated-headers.patch

@@ -1,280 +1,3 @@
-diff --git a/thirdparty/libjpeg-turbo/patches/0001-cmake-generated-headers.patch b/thirdparty/libjpeg-turbo/patches/0001-cmake-generated-headers.patch
-index 72354390a6..e69de29bb2 100644
---- a/thirdparty/libjpeg-turbo/patches/0001-cmake-generated-headers.patch
-+++ b/thirdparty/libjpeg-turbo/patches/0001-cmake-generated-headers.patch
-@@ -1,272 +0,0 @@
--diff --git a/thirdparty/libjpeg-turbo/src/jconfig.h b/thirdparty/libjpeg-turbo/src/jconfig.h
--new file mode 100644
--index 0000000000..42d9654c0f
----- /dev/null
--+++ b/thirdparty/libjpeg-turbo/src/jconfig.h
--@@ -0,0 +1,62 @@
--+// Originally generated by libjpeg-turbo's cmake build, then modified to support multiple platforms.
--+
--+/* Version ID for the JPEG library.
--+ * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60".
--+ */
--+#define JPEG_LIB_VERSION  62
--+
--+/* libjpeg-turbo version */
--+#define LIBJPEG_TURBO_VERSION  3.1.0
--+
--+/* libjpeg-turbo version in integer form */
--+#define LIBJPEG_TURBO_VERSION_NUMBER  3001000
--+
--+/* Support arithmetic encoding when using 8-bit samples */
--+#define C_ARITH_CODING_SUPPORTED 1
--+
--+/* Support arithmetic decoding when using 8-bit samples */
--+#define D_ARITH_CODING_SUPPORTED 1
--+
--+/* Support in-memory source/destination managers */
--+#define MEM_SRCDST_SUPPORTED  1
--+
--+/* Use accelerated SIMD routines when using 8-bit samples */
--+//#define WITH_SIMD 1
--+
--+/* This version of libjpeg-turbo supports run-time selection of data precision,
--+ * so BITS_IN_JSAMPLE is no longer used to specify the data precision at build
--+ * time.  However, some downstream software expects the macro to be defined.
--+ * Since 12-bit data precision is an opt-in feature that requires explicitly
--+ * calling 12-bit-specific libjpeg API functions and using 12-bit-specific data
--+ * types, the unmodified portion of the libjpeg API still behaves as if it were
--+ * built for 8-bit precision, and JSAMPLE is still literally an 8-bit data
--+ * type.  Thus, it is correct to define BITS_IN_JSAMPLE to 8 here.
--+ */
--+#ifndef BITS_IN_JSAMPLE
--+#define BITS_IN_JSAMPLE  8
--+#endif
--+
--+#ifdef _WIN32
--+
--+#undef RIGHT_SHIFT_IS_UNSIGNED
--+
--+/* Define "boolean" as unsigned char, not int, per Windows custom */
--+#ifndef __RPCNDR_H__            /* don't conflict if rpcndr.h already read */
--+typedef unsigned char boolean;
--+#endif
--+#define HAVE_BOOLEAN            /* prevent jmorecfg.h from redefining it */
--+
--+/* Define "INT32" as int, not long, per Windows custom */
--+#if !(defined(_BASETSD_H_) || defined(_BASETSD_H))   /* don't conflict if basetsd.h already read */
--+typedef short INT16;
--+typedef signed int INT32;
--+#endif
--+#define XMD_H                   /* prevent jmorecfg.h from redefining it */
--+
--+#else
--+
--+/* Define if your (broken) compiler shifts signed values as if they were
--+   unsigned. */
--+/* #undef RIGHT_SHIFT_IS_UNSIGNED */
--+
--+#endif
--diff --git a/thirdparty/libjpeg-turbo/src/jconfigint.h b/thirdparty/libjpeg-turbo/src/jconfigint.h
--new file mode 100644
----- /dev/null
--+++ b/thirdparty/libjpeg-turbo/src/jconfigint.h
--@@ -0,0 +1,102 @@
--+// Originally generated by libjpeg-turbo's cmake build, then modified to support multiple platforms.
--+
--+/* libjpeg-turbo build number */
--+#define BUILD  "20250317"
--+
--+/* How to hide global symbols. */
--+#ifndef HIDDEN
--+	#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__)
--+		#define HIDDEN  __attribute__((visibility("hidden")))
--+	#else
--+		#define HIDDEN
--+	#endif
--+#endif
--+
--+/* Compiler's inline keyword */
--+#undef inline
--+
--+/* How to obtain function inlining. */
--+#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__)
--+	#define INLINE  __inline__ __attribute__((always_inline))
--+#else
--+	#define INLINE inline
--+#endif
--+
--+/* How to obtain thread-local storage */
--+#if defined(_MSC_VER)
--+#define THREAD_LOCAL  __declspec(thread)
--+#else
--+#define THREAD_LOCAL  __thread
--+#endif
--+
--+/* Define to the full name of this package. */
--+#define PACKAGE_NAME  "libjpeg-turbo"
--+
--+/* Version number of package */
--+#define VERSION  "3.1.0"
--+
--+/* The size of `size_t', as computed by sizeof. */
--+#if defined(__SIZEOF_SIZE_T__)
--+	#define SIZEOF_SIZE_T __SIZEOF_SIZE_T__
--+#elif defined(_WIN64)
--+	#define SIZEOF_SIZE_T 8
--+#elif defined(_WIN32)
--+	#define SIZEOF_SIZE_T 4
--+#else
--+	#error "Cannot determine size of size_t"
--+#endif
--+
--+/* Define if your compiler has __builtin_ctzl() and sizeof(unsigned long) == sizeof(size_t). */
--+#if defined(__GNUC__)
--+	#define HAVE_BUILTIN_CTZL
--+#endif
--+
--+/* Define to 1 if you have the <intrin.h> header file. */
--+/* #undef HAVE_INTRIN_H */
--+
--+#if defined(_MSC_VER) && defined(HAVE_INTRIN_H)
--+#if (SIZEOF_SIZE_T == 8)
--+#define HAVE_BITSCANFORWARD64
--+#elif (SIZEOF_SIZE_T == 4)
--+#define HAVE_BITSCANFORWARD
--+#endif
--+#endif
--+
--+#if defined(__has_attribute)
--+#if __has_attribute(fallthrough)
--+#define FALLTHROUGH  __attribute__((fallthrough));
--+#else
--+#define FALLTHROUGH
--+#endif
--+#else
--+#define FALLTHROUGH
--+#endif
--+
--+/*
--+ * Define BITS_IN_JSAMPLE as either
--+ *   8   for 8-bit sample values (the usual setting)
--+ *   12  for 12-bit sample values
--+ * Only 8 and 12 are legal data precisions for lossy JPEG according to the
--+ * JPEG standard, and the IJG code does not support anything else!
--+ */
--+
--+#ifndef BITS_IN_JSAMPLE
--+#define BITS_IN_JSAMPLE  8      /* use 8 or 12 */
--+#endif
--+
--+#undef C_ARITH_CODING_SUPPORTED
--+#undef D_ARITH_CODING_SUPPORTED
--+#undef WITH_SIMD
--+
--+#if BITS_IN_JSAMPLE == 8
--+
--+/* Support arithmetic encoding */
--+#define C_ARITH_CODING_SUPPORTED 1
--+
--+/* Support arithmetic decoding */
--+#define D_ARITH_CODING_SUPPORTED 1
--+
--+/* Use accelerated SIMD routines. */
--+//#define WITH_SIMD 1
--+
--+#endif
--diff --git a/thirdparty/libjpeg-turbo/src/jmorecfg.h b/thirdparty/libjpeg-turbo/src/jmorecfg.h
----- a/thirdparty/libjpeg-turbo/src/jmorecfg.h
--+++ b/thirdparty/libjpeg-turbo/src/jmorecfg.h
--@@ -1,3 +1,5 @@
--+// Modified to remove lossless jpeg support.
--+
-- /*
--  * jmorecfg.h
--  *
--@@ -8,6 +10,6 @@
--  * Copyright (C) 1999, Ken Murchison.
--  * libjpeg-turbo Modifications:
--  * Copyright (C) 2009, 2011, 2014-2015, 2018, 2020, 2022, D. R. Commander.
--  * For conditions of distribution and use, see the accompanying README.ijg
--  * file.
--  *
--@@ -242,7 +244,7 @@ typedef int boolean;
--
-- #define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
-- #define C_PROGRESSIVE_SUPPORTED     /* Progressive JPEG? (Requires MULTISCAN)*/
---#define C_LOSSLESS_SUPPORTED        /* Lossless JPEG? */
--+//#define C_LOSSLESS_SUPPORTED        /* Lossless JPEG? */
-- #define ENTROPY_OPT_SUPPORTED       /* Optimization of entropy coding parms? */
-- /* Note: if you selected 12-bit data precision, it is dangerous to turn off
--  * ENTROPY_OPT_SUPPORTED.  The standard Huffman tables are only good for 8-bit
--@@ -259,7 +263,7 @@ typedef int boolean;
--
-- #define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
-- #define D_PROGRESSIVE_SUPPORTED     /* Progressive JPEG? (Requires MULTISCAN)*/
---#define D_LOSSLESS_SUPPORTED        /* Lossless JPEG? */
--+//#define D_LOSSLESS_SUPPORTED        /* Lossless JPEG? */
-- #define SAVE_MARKERS_SUPPORTED      /* jpeg_save_markers() needed? */
-- #define BLOCK_SMOOTHING_SUPPORTED   /* Block smoothing? (Progressive only) */
-- #define IDCT_SCALING_SUPPORTED      /* Output rescaling via IDCT? */
--diff --git a/thirdparty/libjpeg-turbo/src/jversion.h b/thirdparty/libjpeg-turbo/src/jversion.h
--new file mode 100644
----- /dev/null
--+++ b/thirdparty/libjpeg-turbo/src/jversion.h
--@@ -0,0 +18446744073709551615,58 @@
--+// Originally generated by libjpeg-turbo's cmake build, then modified to support multiple platforms.
--+
--+/*
--+ * jversion.h
--+ *
--+ * This file was part of the Independent JPEG Group's software:
--+ * Copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding.
--+ * libjpeg-turbo Modifications:
--+ * Copyright (C) 2010, 2012-2024, D. R. Commander.
--+ * For conditions of distribution and use, see the accompanying README.ijg
--+ * file.
--+ *
--+ * This file contains software version identification.
--+ */
--+
--+
--+#if JPEG_LIB_VERSION >= 80
--+
--+#define JVERSION        "8d  15-Jan-2012"
--+
--+#elif JPEG_LIB_VERSION >= 70
--+
--+#define JVERSION        "7  27-Jun-2009"
--+
--+#else
--+
--+#define JVERSION        "6b  27-Mar-1998"
--+
--+#endif
--+
--+/*
--+ * NOTE: It is our convention to place the authors in the following order:
--+ * - libjpeg-turbo authors (2009-) in descending order of the date of their
--+ *   most recent contribution to the project, then in ascending order of the
--+ *   date of their first contribution to the project, then in alphabetical
--+ *   order
--+ * - Upstream authors in descending order of the date of the first inclusion of
--+ *   their code
--+ */
--+
--+#define JCOPYRIGHT1 \
--+  "Copyright (C) 2009-2024 D. R. Commander\n" \
--+  "Copyright (C) 2015, 2020 Google, Inc.\n" \
--+  "Copyright (C) 2019-2020 Arm Limited\n" \
--+  "Copyright (C) 2015-2016, 2018 Matthieu Darbois\n" \
--+  "Copyright (C) 2011-2016 Siarhei Siamashka\n" \
--+  "Copyright (C) 2015 Intel Corporation\n"
--+#define JCOPYRIGHT2 \
--+  "Copyright (C) 2013-2014 Linaro Limited\n" \
--+  "Copyright (C) 2013-2014 MIPS Technologies, Inc.\n" \
--+  "Copyright (C) 2009, 2012 Pierre Ossman for Cendio AB\n" \
--+  "Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies)\n" \
--+  "Copyright (C) 1999-2006 MIYASAKA Masaru\n" \
--+  "Copyright (C) 1999 Ken Murchison\n" \
--+  "Copyright (C) 1991-2020 Thomas G. Lane, Guido Vollbeding\n"
--+
--+#define JCOPYRIGHT_SHORT \
--+  "Copyright (C) 1991-2024 The libjpeg-turbo Project and many others"
 diff --git a/thirdparty/libjpeg-turbo/src/jconfig.h b/thirdparty/libjpeg-turbo/src/jconfig.h
 new file mode 100644
 index 0000000000..42d9654c0f

+ 15 - 8
thirdparty/libjpeg-turbo/patches/0002-disable-16bitlossless.patch

@@ -1,14 +1,21 @@
-commit 462c1cd875ae8f6b5f6406dda01881fb173ac30c
-Author: Daniel Kinsman <[email protected]>
-Date:   Thu Mar 20 12:21:28 2025 +1100
-
-    remove unneeded source files and lossless jpeg support
-
+diff --git a/thirdparty/README.md b/thirdparty/README.md
+index c22ef77af7..52b635df05 100644
+--- a/thirdparty/README.md
++++ b/thirdparty/README.md
+@@ -539,7 +539,7 @@ Patches:
+ ## libjpeg-turbo
+ 
+ - Upstream: https://github.com/libjpeg-turbo/libjpeg-turbo
+-- Version: 3.1.0 (20ade4dea9589515a69793e447a6c6220b464535, 2024)
++- Version: 3.1.3 (af9c1c268520a29adf98cad5138dafe612b3d318, 2025)
+ - License: BSD-3-Clause and IJG
+ 
+ Files extracted from upstream source:
 diff --git a/thirdparty/libjpeg-turbo/src/turbojpeg.c b/thirdparty/libjpeg-turbo/src/turbojpeg.c
-index 389aea55d3..eec8e2a616 100644
+index 45fc0f954c..d514da43d2 100644
 --- a/thirdparty/libjpeg-turbo/src/turbojpeg.c
 +++ b/thirdparty/libjpeg-turbo/src/turbojpeg.c
-@@ -1200,9 +1200,6 @@ bailout:
+@@ -1196,9 +1196,6 @@ bailout:
  #define BITS_IN_JSAMPLE  12
  #include "turbojpeg-mp.c"
  #undef BITS_IN_JSAMPLE

+ 26 - 3
thirdparty/libjpeg-turbo/patches/0003-remove-bmp-ppm-support.patch

@@ -1,5 +1,18 @@
+diff --git a/thirdparty/README.md b/thirdparty/README.md
+index c22ef77af7..52b635df05 100644
+--- a/thirdparty/README.md
++++ b/thirdparty/README.md
+@@ -539,7 +539,7 @@ Patches:
+ ## libjpeg-turbo
+ 
+ - Upstream: https://github.com/libjpeg-turbo/libjpeg-turbo
+-- Version: 3.1.0 (20ade4dea9589515a69793e447a6c6220b464535, 2024)
++- Version: 3.1.3 (af9c1c268520a29adf98cad5138dafe612b3d318, 2025)
+ - License: BSD-3-Clause and IJG
+ 
+ Files extracted from upstream source:
 diff --git a/thirdparty/libjpeg-turbo/src/turbojpeg-mp.c b/thirdparty/libjpeg-turbo/src/turbojpeg-mp.c
-index 1fa63b8185..72f99e236a 100644
+index 6fecc5cb80..21d26536c1 100644
 --- a/thirdparty/libjpeg-turbo/src/turbojpeg-mp.c
 +++ b/thirdparty/libjpeg-turbo/src/turbojpeg-mp.c
 @@ -286,271 +286,6 @@ bailout:
@@ -275,10 +288,20 @@ index 1fa63b8185..72f99e236a 100644
  #undef _JSAMPROW
  #undef _buffer
 diff --git a/thirdparty/libjpeg-turbo/src/turbojpeg.c b/thirdparty/libjpeg-turbo/src/turbojpeg.c
-index eec8e2a616..8ce446148a 100644
+index 45fc0f954c..969174f72e 100644
 --- a/thirdparty/libjpeg-turbo/src/turbojpeg.c
 +++ b/thirdparty/libjpeg-turbo/src/turbojpeg.c
-@@ -3095,48 +3095,3 @@ bailout:
+@@ -1196,9 +1196,6 @@ bailout:
+ #define BITS_IN_JSAMPLE  12
+ #include "turbojpeg-mp.c"
+ #undef BITS_IN_JSAMPLE
+-#define BITS_IN_JSAMPLE  16
+-#include "turbojpeg-mp.c"
+-#undef BITS_IN_JSAMPLE
+ 
+ /* TurboJPEG 1.2+ */
+ DLLEXPORT int tjCompress2(tjhandle handle, const unsigned char *srcBuf,
+@@ -3094,48 +3091,3 @@ bailout:
    free(sizes);
    return retval;
  }

+ 3 - 3
thirdparty/libjpeg-turbo/src/cmyk.h

@@ -1,7 +1,7 @@
 /*
  * cmyk.h
  *
- * Copyright (C) 2017-2018, 2022, 2024, D. R. Commander.
+ * Copyright (C) 2017-2018, 2022, 2024-2025, D. R. Commander.
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
  *
@@ -14,9 +14,9 @@
 #ifndef CMYK_H
 #define CMYK_H
 
-#include <jinclude.h>
+#include "jinclude.h"
 #define JPEG_INTERNALS
-#include <jpeglib.h>
+#include "jpeglib.h"
 #include "jsamplecomp.h"
 
 

+ 6 - 0
thirdparty/libjpeg-turbo/src/jcapimin.c

@@ -195,13 +195,19 @@ jpeg_finish_compress(j_compress_ptr cinfo)
        * all work is being done from the coefficient buffer.
        */
       if (cinfo->data_precision <= 8) {
+        if (cinfo->coef->compress_data == NULL)
+          ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
         if (!(*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE)NULL))
           ERREXIT(cinfo, JERR_CANT_SUSPEND);
       } else if (cinfo->data_precision <= 12) {
+        if (cinfo->coef->compress_data_12 == NULL)
+          ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
         if (!(*cinfo->coef->compress_data_12) (cinfo, (J12SAMPIMAGE)NULL))
           ERREXIT(cinfo, JERR_CANT_SUSPEND);
       } else {
 #ifdef C_LOSSLESS_SUPPORTED
+        if (cinfo->coef->compress_data_16 == NULL)
+          ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
         if (!(*cinfo->coef->compress_data_16) (cinfo, (J16SAMPIMAGE)NULL))
           ERREXIT(cinfo, JERR_CANT_SUSPEND);
 #else

+ 4 - 0
thirdparty/libjpeg-turbo/src/jcapistd.c

@@ -130,6 +130,8 @@ _jpeg_write_scanlines(j_compress_ptr cinfo, _JSAMPARRAY scanlines,
     num_lines = rows_left;
 
   row_ctr = 0;
+  if (cinfo->main->_process_data == NULL)
+    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
   (*cinfo->main->_process_data) (cinfo, scanlines, &row_ctr, num_lines);
   cinfo->next_scanline += row_ctr;
   return row_ctr;
@@ -187,6 +189,8 @@ _jpeg_write_raw_data(j_compress_ptr cinfo, _JSAMPIMAGE data,
     ERREXIT(cinfo, JERR_BUFFER_SIZE);
 
   /* Directly compress the row. */
+  if (cinfo->coef->_compress_data == NULL)
+    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
   if (!(*cinfo->coef->_compress_data) (cinfo, data)) {
     /* If compressor did not consume the whole row, suspend processing. */
     return 0;

+ 2 - 1
thirdparty/libjpeg-turbo/src/jccoefct.c

@@ -4,7 +4,7 @@
  * This file was part of the Independent JPEG Group's software:
  * Copyright (C) 1994-1997, Thomas G. Lane.
  * libjpeg-turbo Modifications:
- * Copyright (C) 2022, D. R. Commander.
+ * Copyright (C) 2022, 2024, D. R. Commander.
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
  *
@@ -414,6 +414,7 @@ _jinit_c_coef_controller(j_compress_ptr cinfo, boolean need_full_buffer)
   coef = (my_coef_ptr)
     (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
                                 sizeof(my_coef_controller));
+  memset(coef, 0, sizeof(my_coef_controller));
   cinfo->coef = (struct jpeg_c_coef_controller *)coef;
   coef->pub.start_pass = start_pass_coef;
 

+ 3 - 2
thirdparty/libjpeg-turbo/src/jchuff.c

@@ -6,7 +6,7 @@
  * Lossless JPEG Modifications:
  * Copyright (C) 1999, Ken Murchison.
  * libjpeg-turbo Modifications:
- * Copyright (C) 2009-2011, 2014-2016, 2018-2024, D. R. Commander.
+ * Copyright (C) 2009-2011, 2014-2016, 2018-2025, D. R. Commander.
  * Copyright (C) 2015, Matthieu Darbois.
  * Copyright (C) 2018, Matthias Räncker.
  * Copyright (C) 2020, Arm Limited.
@@ -55,7 +55,8 @@ typedef size_t bit_buf_type;
  * retain the old Huffman encoder behavior when using the GAS implementation.
  */
 #if defined(WITH_SIMD) && !(defined(__arm__) || defined(__aarch64__) || \
-                            defined(_M_ARM) || defined(_M_ARM64))
+                            defined(_M_ARM) || defined(_M_ARM64) || \
+                            defined(_M_ARM64EC))
 typedef unsigned long long simd_bit_buf_type;
 #else
 typedef bit_buf_type simd_bit_buf_type;

+ 1 - 0
thirdparty/libjpeg-turbo/src/jcmainct.c

@@ -159,6 +159,7 @@ _jinit_c_main_controller(j_compress_ptr cinfo, boolean need_full_buffer)
   main_ptr = (my_main_ptr)
     (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
                                 sizeof(my_main_controller));
+  memset(main_ptr, 0, sizeof(my_main_controller));
   cinfo->main = (struct jpeg_c_main_controller *)main_ptr;
   main_ptr->pub.start_pass = start_pass_main;
 

+ 21 - 6
thirdparty/libjpeg-turbo/src/jdapistd.c

@@ -4,7 +4,7 @@
  * This file was part of the Independent JPEG Group's software:
  * Copyright (C) 1994-1996, Thomas G. Lane.
  * libjpeg-turbo Modifications:
- * Copyright (C) 2010, 2015-2020, 2022-2024, D. R. Commander.
+ * Copyright (C) 2010, 2015-2020, 2022-2025, D. R. Commander.
  * Copyright (C) 2015, Google, Inc.
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
@@ -128,19 +128,28 @@ output_pass_setup(j_decompress_ptr cinfo)
       }
       /* Process some data */
       last_scanline = cinfo->output_scanline;
-      if (cinfo->data_precision <= 8)
+      if (cinfo->data_precision <= 8) {
+        if (cinfo->main->process_data == NULL)
+          ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
         (*cinfo->main->process_data) (cinfo, (JSAMPARRAY)NULL,
                                       &cinfo->output_scanline, (JDIMENSION)0);
-      else if (cinfo->data_precision <= 12)
+      } else if (cinfo->data_precision <= 12) {
+        if (cinfo->main->process_data_12 == NULL)
+          ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
         (*cinfo->main->process_data_12) (cinfo, (J12SAMPARRAY)NULL,
                                          &cinfo->output_scanline,
                                          (JDIMENSION)0);
+      } else {
 #ifdef D_LOSSLESS_SUPPORTED
-      else
+        if (cinfo->main->process_data_16 == NULL)
+          ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
         (*cinfo->main->process_data_16) (cinfo, (J16SAMPARRAY)NULL,
                                          &cinfo->output_scanline,
                                          (JDIMENSION)0);
+#else
+        ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
 #endif
+      }
       if (cinfo->output_scanline == last_scanline)
         return FALSE;           /* No progress made, must suspend */
     }
@@ -345,6 +354,8 @@ _jpeg_read_scanlines(j_decompress_ptr cinfo, _JSAMPARRAY scanlines,
 
   /* Process some data */
   row_ctr = 0;
+  if (cinfo->main->_process_data == NULL)
+    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
   (*cinfo->main->_process_data) (cinfo, scanlines, &row_ctr, max_lines);
   cinfo->output_scanline += row_ctr;
   return row_ctr;
@@ -397,7 +408,8 @@ read_and_discard_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
   void (*color_quantize) (j_decompress_ptr cinfo, _JSAMPARRAY input_buf,
                           _JSAMPARRAY output_buf, int num_rows) = NULL;
 
-  if (cinfo->cconvert && cinfo->cconvert->_color_convert) {
+  if (!master->using_merged_upsample && cinfo->cconvert &&
+      cinfo->cconvert->_color_convert) {
     color_convert = cinfo->cconvert->_color_convert;
     cinfo->cconvert->_color_convert = noop_convert;
     /* This just prevents UBSan from complaining about adding 0 to a NULL
@@ -406,7 +418,8 @@ read_and_discard_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
     scanlines = &dummy_row;
   }
 
-  if (cinfo->cquantize && cinfo->cquantize->_color_quantize) {
+  if (cinfo->quantize_colors && cinfo->cquantize &&
+      cinfo->cquantize->_color_quantize) {
     color_quantize = cinfo->cquantize->_color_quantize;
     cinfo->cquantize->_color_quantize = noop_quantize;
   }
@@ -691,6 +704,8 @@ _jpeg_read_raw_data(j_decompress_ptr cinfo, _JSAMPIMAGE data,
     ERREXIT(cinfo, JERR_BUFFER_SIZE);
 
   /* Decompress directly into user's buffer. */
+  if (cinfo->coef->_decompress_data == NULL)
+    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
   if (!(*cinfo->coef->_decompress_data) (cinfo, data))
     return 0;                   /* suspension forced, can do nothing more */
 

+ 2 - 2
thirdparty/libjpeg-turbo/src/jdatadst-tj.c

@@ -5,7 +5,7 @@
  * Copyright (C) 1994-1996, Thomas G. Lane.
  * Modified 2009-2012 by Guido Vollbeding.
  * libjpeg-turbo Modifications:
- * Copyright (C) 2011, 2014, 2016, 2019, 2022-2023, D. R. Commander.
+ * Copyright (C) 2011, 2014, 2016, 2019, 2022-2023, 2025, D. R. Commander.
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
  *
@@ -181,7 +181,7 @@ jpeg_mem_dest_tj(j_compress_ptr cinfo, unsigned char **outbuffer,
   dest->outsize = outsize;
   dest->alloc = alloc;
 
-  if (*outbuffer == NULL || *outsize == 0) {
+  if (*outbuffer == NULL || (*outsize == 0 && !reused)) {
     if (alloc) {
       /* Allocate initial buffer */
       dest->newbuffer = *outbuffer = (unsigned char *)MALLOC(OUTPUT_BUF_SIZE);

+ 2 - 1
thirdparty/libjpeg-turbo/src/jdcoefct.c

@@ -5,7 +5,7 @@
  * Copyright (C) 1994-1997, Thomas G. Lane.
  * libjpeg-turbo Modifications:
  * Copyright 2009 Pierre Ossman <[email protected]> for Cendio AB
- * Copyright (C) 2010, 2015-2016, 2019-2020, 2022-2023, D. R. Commander.
+ * Copyright (C) 2010, 2015-2016, 2019-2020, 2022-2024, D. R. Commander.
  * Copyright (C) 2015, 2020, Google, Inc.
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
@@ -824,6 +824,7 @@ _jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
   coef = (my_coef_ptr)
     (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
                                 sizeof(my_coef_controller));
+  memset(coef, 0, sizeof(my_coef_controller));
   cinfo->coef = (struct jpeg_d_coef_controller *)coef;
   coef->pub.start_input_pass = start_input_pass;
   coef->pub.start_output_pass = start_output_pass;

+ 1 - 0
thirdparty/libjpeg-turbo/src/jdmainct.c

@@ -450,6 +450,7 @@ _jinit_d_main_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
   main_ptr = (my_main_ptr)
     (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
                                 sizeof(my_main_controller));
+  memset(main_ptr, 0, sizeof(my_main_controller));
   cinfo->main = (struct jpeg_d_main_controller *)main_ptr;
   main_ptr->pub.start_pass = start_pass_main;
 

+ 3 - 2
thirdparty/libjpeg-turbo/src/jdsample.c

@@ -5,7 +5,7 @@
  * Copyright (C) 1991-1996, Thomas G. Lane.
  * libjpeg-turbo Modifications:
  * Copyright 2009 Pierre Ossman <[email protected]> for Cendio AB
- * Copyright (C) 2010, 2015-2016, 2022, 2024, D. R. Commander.
+ * Copyright (C) 2010, 2015-2016, 2022, 2024-2025, D. R. Commander.
  * Copyright (C) 2014, MIPS Technologies, Inc., California.
  * Copyright (C) 2015, Google, Inc.
  * Copyright (C) 2019-2020, Arm Limited.
@@ -501,7 +501,8 @@ _jinit_upsampler(j_decompress_ptr cinfo)
                v_in_group * 2 == v_out_group && do_fancy) {
       /* Non-fancy upsampling is handled by the generic method */
 #if defined(WITH_SIMD) && (defined(__arm__) || defined(__aarch64__) || \
-                           defined(_M_ARM) || defined(_M_ARM64))
+                           defined(_M_ARM) || defined(_M_ARM64) || \
+                           defined(_M_ARM64EC))
       if (jsimd_can_h1v2_fancy_upsample())
         upsample->methods[ci] = jsimd_h1v2_fancy_upsample;
       else

+ 2 - 2
thirdparty/libjpeg-turbo/src/jpeg_nbits.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2024, D. R. Commander.
+ * Copyright (C) 2024-2025, D. R. Commander.
  *
  * For conditions of distribution and use, see the accompanying README.ijg
  * file.
@@ -17,7 +17,7 @@
  * encoders can reuse jpeg_nbits_table from the SSE2 baseline Huffman encoder.
  */
 #if (defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || \
-     defined(_M_X64)) && defined(WITH_SIMD)
+     (defined(_M_X64) && !defined(_M_ARM64EC))) && defined(WITH_SIMD)
 #undef INCLUDE_JPEG_NBITS_TABLE
 #endif
 

+ 2 - 2
thirdparty/libjpeg-turbo/src/jpeg_nbits.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014, 2021, 2024, D. R. Commander.
+ * Copyright (C) 2014, 2021, 2024-2025, D. R. Commander.
  * Copyright (C) 2014, Olle Liljenzin.
  * Copyright (C) 2020, Arm Limited.
  *
@@ -23,7 +23,7 @@
 
 /* NOTE: Both GCC and Clang define __GNUC__ */
 #if (defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))) || \
-    defined(_M_ARM) || defined(_M_ARM64)
+    defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC)
 #if !defined(__thumb__) || defined(__thumb2__)
 #define USE_CLZ_INTRINSIC
 #endif

+ 2 - 2
thirdparty/libjpeg-turbo/src/turbojpeg-mp.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (C)2009-2024 D. R. Commander.  All Rights Reserved.
+ * Copyright (C)2009-2025 D. R. Commander.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -113,7 +113,7 @@ DLLEXPORT int GET_NAME(tj3Compress, BITS_IN_JSAMPLE)
 #endif
     cinfo->data_precision = this->precision;
 
-  setCompDefaults(this, pixelFormat);
+  setCompDefaults(this, pixelFormat, FALSE);
   if (this->noRealloc) alloc = FALSE;
   jpeg_mem_dest_tj(cinfo, jpegBuf, jpegSize, alloc);
 

+ 19 - 23
thirdparty/libjpeg-turbo/src/turbojpeg.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (C)2009-2024 D. R. Commander.  All Rights Reserved.
+ * Copyright (C)2009-2025 D. R. Commander.  All Rights Reserved.
  * Copyright (C)2021 Alex Richardson.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -35,17 +35,17 @@
 #if !defined(_MSC_VER) || _MSC_VER > 1600
 #include <stdint.h>
 #endif
-#include <jinclude.h>
+#include "jinclude.h"
 #define JPEG_INTERNALS
-#include <jpeglib.h>
-#include <jerror.h>
+#include "jpeglib.h"
+#include "jerror.h"
 #include <setjmp.h>
 #include <errno.h>
-#include "./turbojpeg.h"
-#include "./tjutil.h"
+#include "turbojpeg.h"
+#include "tjutil.h"
 #include "transupp.h"
-#include "./jpegapicomp.h"
-#include "./cdjpeg.h"
+#include "jpegapicomp.h"
+#include "cdjpeg.h"
 
 extern void jpeg_mem_dest_tj(j_compress_ptr, unsigned char **, size_t *,
                              boolean);
@@ -330,9 +330,9 @@ static int getPixelFormat(int pixelSize, int flags)
   return -1;
 }
 
-static void setCompDefaults(tjinstance *this, int pixelFormat)
+static void setCompDefaults(tjinstance *this, int pixelFormat, boolean yuv)
 {
-  int subsamp = this->subsamp;
+  int colorspace = yuv ? -1 : this->colorspace;
 
   this->cinfo.in_color_space = pf2cs[pixelFormat];
   this->cinfo.input_components = tjPixelSize[pixelFormat];
@@ -345,21 +345,17 @@ static void setCompDefaults(tjinstance *this, int pixelFormat)
   this->cinfo.density_unit = (UINT8)this->densityUnits;
   this->cinfo.mem->max_memory_to_use = (long)this->maxMemory * 1048576L;
 
-  if (this->lossless) {
+  if (this->lossless && !yuv) {
 #ifdef C_LOSSLESS_SUPPORTED
     jpeg_enable_lossless(&this->cinfo, this->losslessPSV, this->losslessPt);
 #endif
-    if (pixelFormat == TJPF_GRAY)
-      subsamp = TJSAMP_GRAY;
-    else if (subsamp != TJSAMP_GRAY)
-      subsamp = TJSAMP_444;
     return;
   }
 
   jpeg_set_quality(&this->cinfo, this->quality, TRUE);
   this->cinfo.dct_method = this->fastDCT ? JDCT_FASTEST : JDCT_ISLOW;
 
-  switch (this->colorspace) {
+  switch (colorspace) {
   case TJCS_RGB:
     jpeg_set_colorspace(&this->cinfo, JCS_RGB);  break;
   case TJCS_YCbCr:
@@ -371,7 +367,7 @@ static void setCompDefaults(tjinstance *this, int pixelFormat)
   case TJCS_YCCK:
     jpeg_set_colorspace(&this->cinfo, JCS_YCCK);  break;
   default:
-    if (subsamp == TJSAMP_GRAY)
+    if (this->subsamp == TJSAMP_GRAY)
       jpeg_set_colorspace(&this->cinfo, JCS_GRAYSCALE);
     else if (pixelFormat == TJPF_CMYK)
       jpeg_set_colorspace(&this->cinfo, JCS_YCCK);
@@ -386,16 +382,16 @@ static void setCompDefaults(tjinstance *this, int pixelFormat)
 #endif
   this->cinfo.arith_code = this->arithmetic;
 
-  this->cinfo.comp_info[0].h_samp_factor = tjMCUWidth[subsamp] / 8;
+  this->cinfo.comp_info[0].h_samp_factor = tjMCUWidth[this->subsamp] / 8;
   this->cinfo.comp_info[1].h_samp_factor = 1;
   this->cinfo.comp_info[2].h_samp_factor = 1;
   if (this->cinfo.num_components > 3)
-    this->cinfo.comp_info[3].h_samp_factor = tjMCUWidth[subsamp] / 8;
-  this->cinfo.comp_info[0].v_samp_factor = tjMCUHeight[subsamp] / 8;
+    this->cinfo.comp_info[3].h_samp_factor = tjMCUWidth[this->subsamp] / 8;
+  this->cinfo.comp_info[0].v_samp_factor = tjMCUHeight[this->subsamp] / 8;
   this->cinfo.comp_info[1].v_samp_factor = 1;
   this->cinfo.comp_info[2].v_samp_factor = 1;
   if (this->cinfo.num_components > 3)
-    this->cinfo.comp_info[3].v_samp_factor = tjMCUHeight[subsamp] / 8;
+    this->cinfo.comp_info[3].v_samp_factor = tjMCUHeight[this->subsamp] / 8;
 }
 
 
@@ -1302,7 +1298,7 @@ DLLEXPORT int tj3CompressFromYUVPlanes8(tjhandle handle,
 
   if (this->noRealloc) alloc = FALSE;
   jpeg_mem_dest_tj(cinfo, jpegBuf, jpegSize, alloc);
-  setCompDefaults(this, TJPF_RGB);
+  setCompDefaults(this, TJPF_RGB, TRUE);
   cinfo->raw_data_in = TRUE;
 
   jpeg_start_compress(cinfo, TRUE);
@@ -1553,7 +1549,7 @@ DLLEXPORT int tj3EncodeYUVPlanes8(tjhandle handle, const unsigned char *srcBuf,
   cinfo->image_height = height;
   cinfo->data_precision = 8;
 
-  setCompDefaults(this, pixelFormat);
+  setCompDefaults(this, pixelFormat, TRUE);
 
   /* Execute only the parts of jpeg_start_compress() that we need.  If we
      were to call the whole jpeg_start_compress() function, then it would try

+ 69 - 69
thirdparty/libjpeg-turbo/src/turbojpeg.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (C)2009-2015, 2017, 2020-2024 D. R. Commander.
+ * Copyright (C)2009-2015, 2017, 2020-2025 D. R. Commander.
  *                                         All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -737,7 +737,8 @@ enum TJPARAM {
    * - DCT/IDCT algorithm selection
    * - Progressive JPEG
    * - Arithmetic entropy coding
-   * - Compression from/decompression to planar YUV images
+   * - Compression from/decompression to planar YUV images (this parameter is
+   * ignored by #tj3CompressFromYUV8() and #tj3CompressFromYUVPlanes8())
    * - Decompression scaling
    * - Lossless transformation
    *
@@ -1496,17 +1497,16 @@ DLLEXPORT int tj3SetICCProfile(tjhandle handle, unsigned char *iccBuf,
  * #tj3SetICCProfile().)  This should ensure that the buffer never has to be
  * re-allocated.  (Setting #TJPARAM_NOREALLOC guarantees that it won't be.)
  * .
- * If you choose option 1 or 3, then `*jpegSize` should be set to the size of
- * your pre-allocated buffer.  In any case, unless you have set
- * #TJPARAM_NOREALLOC, you should always check `*jpegBuf` upon return from this
- * function, as it may have changed.
+ * Unless you have set #TJPARAM_NOREALLOC, you should always check `*jpegBuf`
+ * upon return from this function, as it may have changed.
  *
  * @param jpegSize pointer to a size_t variable that holds the size of the JPEG
  * buffer.  If `*jpegBuf` points to a pre-allocated buffer, then `*jpegSize`
- * should be set to the size of the buffer.  Upon return, `*jpegSize` will
- * contain the size of the JPEG image (in bytes.)  If `*jpegBuf` points to a
- * JPEG buffer that is being reused from a previous call to one of the JPEG
- * compression functions, then `*jpegSize` is ignored.
+ * should be set to the size of the buffer.  Otherwise, `*jpegSize` is
+ * ignored.  If `*jpegBuf` points to a JPEG buffer that is being reused from a
+ * previous call to one of the JPEG compression functions, then `*jpegSize` is
+ * also ignored.  Upon return, `*jpegSize` will contain the size of the JPEG
+ * image (in bytes.)
  *
  * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
  * and #tj3GetErrorCode().)
@@ -1557,17 +1557,16 @@ DLLEXPORT int tj3Compress8(tjhandle handle, const unsigned char *srcBuf,
  * #tj3SetICCProfile().)  This should ensure that the buffer never has to be
  * re-allocated.  (Setting #TJPARAM_NOREALLOC guarantees that it won't be.)
  * .
- * If you choose option 1 or 3, then `*jpegSize` should be set to the size of
- * your pre-allocated buffer.  In any case, unless you have set
- * #TJPARAM_NOREALLOC, you should always check `*jpegBuf` upon return from this
- * function, as it may have changed.
+ * Unless you have set #TJPARAM_NOREALLOC, you should always check `*jpegBuf`
+ * upon return from this function, as it may have changed.
  *
  * @param jpegSize pointer to a size_t variable that holds the size of the JPEG
  * buffer.  If `*jpegBuf` points to a pre-allocated buffer, then `*jpegSize`
- * should be set to the size of the buffer.  Upon return, `*jpegSize` will
- * contain the size of the JPEG image (in bytes.)  If `*jpegBuf` points to a
- * JPEG buffer that is being reused from a previous call to one of the JPEG
- * compression functions, then `*jpegSize` is ignored.
+ * should be set to the size of the buffer.  Otherwise, `*jpegSize` is
+ * ignored.  If `*jpegBuf` points to a JPEG buffer that is being reused from a
+ * previous call to one of the JPEG compression functions, then `*jpegSize` is
+ * also ignored.  Upon return, `*jpegSize` will contain the size of the JPEG
+ * image (in bytes.)
  *
  * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
  * and #tj3GetErrorCode().)
@@ -1619,17 +1618,16 @@ DLLEXPORT int tj3Compress12(tjhandle handle, const short *srcBuf, int width,
  * #tj3SetICCProfile().)  This should ensure that the buffer never has to be
  * re-allocated.  (Setting #TJPARAM_NOREALLOC guarantees that it won't be.)
  * .
- * If you choose option 1 or 3, then `*jpegSize` should be set to the size of
- * your pre-allocated buffer.  In any case, unless you have set
- * #TJPARAM_NOREALLOC, you should always check `*jpegBuf` upon return from this
- * function, as it may have changed.
+ * Unless you have set #TJPARAM_NOREALLOC, you should always check `*jpegBuf`
+ * upon return from this function, as it may have changed.
  *
  * @param jpegSize pointer to a size_t variable that holds the size of the JPEG
  * buffer.  If `*jpegBuf` points to a pre-allocated buffer, then `*jpegSize`
- * should be set to the size of the buffer.  Upon return, `*jpegSize` will
- * contain the size of the JPEG image (in bytes.)  If `*jpegBuf` points to a
- * JPEG buffer that is being reused from a previous call to one of the JPEG
- * compression functions, then `*jpegSize` is ignored.
+ * should be set to the size of the buffer.  Otherwise, `*jpegSize` is
+ * ignored.  If `*jpegBuf` points to a JPEG buffer that is being reused from a
+ * previous call to one of the JPEG compression functions, then `*jpegSize` is
+ * also ignored.  Upon return, `*jpegSize` will contain the size of the JPEG
+ * image (in bytes.)
  *
  * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
  * and #tj3GetErrorCode().)
@@ -1641,7 +1639,8 @@ DLLEXPORT int tj3Compress16(tjhandle handle, const unsigned short *srcBuf,
 
 /**
  * Compress a set of 8-bit-per-sample Y, U (Cb), and V (Cr) image planes into
- * an 8-bit-per-sample JPEG image.
+ * an 8-bit-per-sample lossy @ref TJCS_YCbCr "YCbCr" or
+ * @ref TJCS_GRAY "grayscale" JPEG image.
  *
  * @param handle handle to a TurboJPEG instance that has been initialized for
  * compression
@@ -1684,17 +1683,16 @@ DLLEXPORT int tj3Compress16(tjhandle handle, const unsigned short *srcBuf,
  * #tj3SetICCProfile().)  This should ensure that the buffer never has to be
  * re-allocated.  (Setting #TJPARAM_NOREALLOC guarantees that it won't be.)
  * .
- * If you choose option 1 or 3, then `*jpegSize` should be set to the size of
- * your pre-allocated buffer.  In any case, unless you have set
- * #TJPARAM_NOREALLOC, you should always check `*jpegBuf` upon return from this
- * function, as it may have changed.
+ * Unless you have set #TJPARAM_NOREALLOC, you should always check `*jpegBuf`
+ * upon return from this function, as it may have changed.
  *
  * @param jpegSize pointer to a size_t variable that holds the size of the JPEG
  * buffer.  If `*jpegBuf` points to a pre-allocated buffer, then `*jpegSize`
- * should be set to the size of the buffer.  Upon return, `*jpegSize` will
- * contain the size of the JPEG image (in bytes.)  If `*jpegBuf` points to a
- * JPEG buffer that is being reused from a previous call to one of the JPEG
- * compression functions, then `*jpegSize` is ignored.
+ * should be set to the size of the buffer.  Otherwise, `*jpegSize` is
+ * ignored.  If `*jpegBuf` points to a JPEG buffer that is being reused from a
+ * previous call to one of the JPEG compression functions, then `*jpegSize` is
+ * also ignored.  Upon return, `*jpegSize` will contain the size of the JPEG
+ * image (in bytes.)
  *
  * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
  * and #tj3GetErrorCode().)
@@ -1708,7 +1706,8 @@ DLLEXPORT int tj3CompressFromYUVPlanes8(tjhandle handle,
 
 /**
  * Compress an 8-bit-per-sample unified planar YUV image into an
- * 8-bit-per-sample JPEG image.
+ * 8-bit-per-sample lossy @ref TJCS_YCbCr "YCbCr" or @ref TJCS_GRAY "grayscale"
+ * JPEG image.
  *
  * @param handle handle to a TurboJPEG instance that has been initialized for
  * compression
@@ -1746,17 +1745,16 @@ DLLEXPORT int tj3CompressFromYUVPlanes8(tjhandle handle,
  * #tj3SetICCProfile().)  This should ensure that the buffer never has to be
  * re-allocated.  (Setting #TJPARAM_NOREALLOC guarantees that it won't be.)
  * .
- * If you choose option 1 or 3, then `*jpegSize` should be set to the size of
- * your pre-allocated buffer.  In any case, unless you have set
- * #TJPARAM_NOREALLOC, you should always check `*jpegBuf` upon return from this
- * function, as it may have changed.
+ * Unless you have set #TJPARAM_NOREALLOC, you should always check `*jpegBuf`
+ * upon return from this function, as it may have changed.
  *
  * @param jpegSize pointer to a size_t variable that holds the size of the JPEG
  * buffer.  If `*jpegBuf` points to a pre-allocated buffer, then `*jpegSize`
- * should be set to the size of the buffer.  Upon return, `*jpegSize` will
- * contain the size of the JPEG image (in bytes.)  If `*jpegBuf` points to a
- * JPEG buffer that is being reused from a previous call to one of the JPEG
- * compression functions, then `*jpegSize` is ignored.
+ * should be set to the size of the buffer.  Otherwise, `*jpegSize` is
+ * ignored.  If `*jpegBuf` points to a JPEG buffer that is being reused from a
+ * previous call to one of the JPEG compression functions, then `*jpegSize` is
+ * also ignored.  Upon return, `*jpegSize` will contain the size of the JPEG
+ * image (in bytes.)
  *
  * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
  * and #tj3GetErrorCode().)
@@ -1770,8 +1768,9 @@ DLLEXPORT int tj3CompressFromYUV8(tjhandle handle,
 /**
  * Encode an 8-bit-per-sample packed-pixel RGB or grayscale image into separate
  * 8-bit-per-sample Y, U (Cb), and V (Cr) image planes.  This function performs
- * color conversion (which is accelerated in the libjpeg-turbo implementation)
- * but does not execute any of the other steps in the JPEG compression process.
+ * color conversion and downsampling (which are accelerated in the
+ * libjpeg-turbo implementation) but does not execute any of the other steps in
+ * the JPEG compression process.
  *
  * @param handle handle to a TurboJPEG instance that has been initialized for
  * compression
@@ -1825,8 +1824,9 @@ DLLEXPORT int tj3EncodeYUVPlanes8(tjhandle handle, const unsigned char *srcBuf,
 /**
  * Encode an 8-bit-per-sample packed-pixel RGB or grayscale image into an
  * 8-bit-per-sample unified planar YUV image.  This function performs color
- * conversion (which is accelerated in the libjpeg-turbo implementation) but
- * does not execute any of the other steps in the JPEG compression process.
+ * conversion and downsampling (which are accelerated in the libjpeg-turbo
+ * implementation) but does not execute any of the other steps in the JPEG
+ * compression process.
  *
  * @param handle handle to a TurboJPEG instance that has been initialized for
  * compression
@@ -2065,11 +2065,12 @@ DLLEXPORT int tj3Decompress16(tjhandle handle, const unsigned char *jpegBuf,
 
 
 /**
- * Decompress an 8-bit-per-sample JPEG image into separate 8-bit-per-sample Y,
- * U (Cb), and V (Cr) image planes.  This function performs JPEG decompression
- * but leaves out the color conversion step, so a planar YUV image is generated
- * instead of a packed-pixel image.  The @ref TJPARAM "parameters" that
- * describe the JPEG image will be set when this function returns.
+ * Decompress an 8-bit-per-sample lossy JPEG image into separate
+ * 8-bit-per-sample Y, U (Cb), and V (Cr) image planes.  This function performs
+ * JPEG decompression but leaves out the color conversion step, so a planar YUV
+ * image is generated instead of a packed-pixel image.  The
+ * @ref TJPARAM "parameters" that describe the JPEG image will be set when this
+ * function returns.
  *
  * @param handle handle to a TurboJPEG instance that has been initialized for
  * decompression
@@ -2108,11 +2109,11 @@ DLLEXPORT int tj3DecompressToYUVPlanes8(tjhandle handle,
 
 
 /**
- * Decompress an 8-bit-per-sample JPEG image into an 8-bit-per-sample unified
- * planar YUV image.  This function performs JPEG decompression but leaves out
- * the color conversion step, so a planar YUV image is generated instead of a
- * packed-pixel image.  The @ref TJPARAM "parameters" that describe the JPEG
- * image will be set when this function returns.
+ * Decompress an 8-bit-per-sample lossy JPEG image into an 8-bit-per-sample
+ * unified planar YUV image.  This function performs JPEG decompression but
+ * leaves out the color conversion step, so a planar YUV image is generated
+ * instead of a packed-pixel image.  The @ref TJPARAM "parameters" that
+ * describe the JPEG image will be set when this function returns.
  *
  * @param handle handle to a TurboJPEG instance that has been initialized for
  * decompression
@@ -2310,22 +2311,21 @@ DLLEXPORT size_t tj3TransformBufSize(tjhandle handle,
  * -# pre-allocate the buffer to a "worst case" size determined by calling
  * #tj3TransformBufSize().  Under normal circumstances, this should ensure that
  * the buffer never has to be re-allocated.  (Setting #TJPARAM_NOREALLOC
- * guarantees that it won't be.)  Note, however, that there are some rare cases
- * (such as transforming images with a large amount of embedded Exif data) in
- * which the transformed JPEG image will be larger than the worst-case size,
- * and #TJPARAM_NOREALLOC cannot be used in those cases unless the embedded
- * data is discarded using #TJXOPT_COPYNONE or #TJPARAM_SAVEMARKERS.
+ * guarantees that it won't be.  However, if the source image has a large
+ * amount of embedded Exif data, then the transformed JPEG image may be larger
+ * than the worst-case size.  #TJPARAM_NOREALLOC cannot be used in that case
+ * unless the embedded data is discarded using #TJXOPT_COPYNONE or
+ * #TJPARAM_SAVEMARKERS.)
  * .
- * If you choose option 1 or 3, then `dstSizes[i]` should be set to the size of
- * your pre-allocated buffer.  In any case, unless you have set
- * #TJPARAM_NOREALLOC, you should always check `dstBufs[i]` upon return from
- * this function, as it may have changed.
+ * Unless you have set #TJPARAM_NOREALLOC, you should always check `dstBufs[i]`
+ * upon return from this function, as it may have changed.
  *
  * @param dstSizes pointer to an array of n size_t variables that will receive
  * the actual sizes (in bytes) of each transformed JPEG image.  If `dstBufs[i]`
  * points to a pre-allocated buffer, then `dstSizes[i]` should be set to the
- * size of the buffer.  Upon return, `dstSizes[i]` will contain the size of the
- * transformed JPEG image (in bytes.)
+ * size of the buffer.  Otherwise, `dstSizes[i]` is ignored.  Upon return,
+ * `dstSizes[i]` will contain the size of the transformed JPEG image (in
+ * bytes.)
  *
  * @param transforms pointer to an array of n #tjtransform structures, each of
  * which specifies the transform parameters and/or cropping region for the