diff --git a/.gitignore b/.gitignore index 77cc4c5..c329709 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,22 @@ /usd-22.05.tar.gz /usd-22.05a.tar.gz /usd-22.05b.tar.gz +/usd-22.08.tar.gz +/usd-22.11.tar.gz +/usd-23.02.tar.gz +/usd-23.05.tar.gz +/OpenUSD-23.08.tar.gz +/OpenUSD-23.11.tar.gz +/OpenUSD-24.03.tar.gz +/OpenUSD-24.05.tar.gz +/OpenUSD-24.08.tar.gz +/OpenUSD-24.11.tar.gz +/OpenUSD-25.02.tar.gz +/OpenUSD-25.02a.tar.gz +/OpenUSD-25.05.tar.gz +/OpenUSD-25.05.01.tar.gz +/OpenUSD-25.08.tar.gz +/OpenUSD-25.11.tar.gz +/OpenUSD-26.03.tar.gz +/OpenUSD-26.05.tar.gz +/OpenUSD-26.08.tar.gz diff --git a/0001-Downstream-only-add-an-SONAME-version.patch b/0001-Downstream-only-add-an-SONAME-version.patch new file mode 100644 index 0000000..db129dd --- /dev/null +++ b/0001-Downstream-only-add-an-SONAME-version.patch @@ -0,0 +1,87 @@ +From ee4e9b30e14133e35c23821d3dc7aa93df354a38 Mon Sep 17 00:00:00 2001 +From: "Benjamin A. Beasley" +Date: Fri, 27 Oct 2023 12:56:58 -0400 +Subject: [PATCH] Downstream-only: add an SONAME version +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Upstream was asked about .so versioning and setting SONAME properly and +seemed unprepared to handle the request: +https://github.com/PixarAnimationStudios/USD/issues/1259#issuecomment-657120216 + +A patch was offered: +https://github.com/PixarAnimationStudios/USD/issues/1387 +but it was not sufficient for the general case, since (1) it only handled the +monolithic build, and (2) it derived the .so version from PXR_MAJOR_VERSION, +which is *not* reliably bumped on API or ABI changes, and currently is still +zero. + +We will therefore probably need to keep doing downstream .so versioning for +the foreseeable future. Currently we are assuming that the ABI is likely to +change on every release (an appropriate assumption for a large C++ project +with no ABI stability policy), so we build the .so version from the project +version. Note that the “hidden” major version is zero, so this complies with +the “0.” prefix recommended in the packaging guidelines. + +https://docs.fedoraproject.org/en-US/packaging-guidelines/#_downstream_so_name_versioning + +A known defect of this patch is that it causes the hdTiny.so example plugin +to be versioned as well, which is undesired. This is not a serious problem +because we do not want to package the built plugin anyway. (It should not be +built with -DPXR_BUILD_EXAMPLES=OFF, but it is.) +--- + cmake/defaults/Version.cmake | 6 ++++++ + cmake/macros/Private.cmake | 1 + + cmake/macros/Public.cmake | 2 ++ + 3 files changed, 9 insertions(+) + +diff --git a/cmake/defaults/Version.cmake b/cmake/defaults/Version.cmake +index c31b5e8d9..fabb45397 100644 +--- a/cmake/defaults/Version.cmake ++++ b/cmake/defaults/Version.cmake +@@ -10,3 +10,9 @@ set(PXR_MINOR_VERSION "26") + set(PXR_PATCH_VERSION "8") # NOTE: Must not have leading 0 for single digits + + math(EXPR PXR_VERSION "${PXR_MAJOR_VERSION} * 10000 + ${PXR_MINOR_VERSION} * 100 + ${PXR_PATCH_VERSION}") ++ ++set(PXR_DOWNSTREAM_SOVERSION "${PXR_MAJOR_VERSION}.${PXR_MINOR_VERSION}.${PXR_PATCH_VERSION}" ++ CACHE ++ STRING ++ "Downstream shared object version" ++) +diff --git a/cmake/macros/Private.cmake b/cmake/macros/Private.cmake +index cddb4e095..5e4b4603a 100644 +--- a/cmake/macros/Private.cmake ++++ b/cmake/macros/Private.cmake +@@ -1355,6 +1355,7 @@ function(_pxr_library NAME) + FOLDER "${folder}" + POSITION_INDEPENDENT_CODE ON + IMPORT_PREFIX "${args_PREFIX}" ++ SOVERSION ${PXR_DOWNSTREAM_SOVERSION} + PREFIX "${args_PREFIX}" + SUFFIX "${args_SUFFIX}" + ) +diff --git a/cmake/macros/Public.cmake b/cmake/macros/Public.cmake +index 5f6a5456b..553b645ec 100644 +--- a/cmake/macros/Public.cmake ++++ b/cmake/macros/Public.cmake +@@ -415,6 +415,7 @@ function(pxr_library NAME) + TYPE "${args_TYPE}" + PREFIX "${prefix}" + SUFFIX "${suffix}" ++ SOVERSION ${PXR_DOWNSTREAM_SOVERSION} + SUBDIR "${subdir}" + CPPFILES "${args_CPPFILES};${${NAME}_CPPFILES}" + PUBLIC_HEADERS "${args_PUBLIC_HEADERS};${${NAME}_PUBLIC_HEADERS}" +@@ -1213,6 +1214,7 @@ function(pxr_toplevel_prologue) + PREFIX "${libPrefix}" + IMPORT_PREFIX "${libPrefix}" + OUTPUT_NAME ${libName} ++ SOVERSION ${PXR_DOWNSTREAM_SOVERSION} + ) + _get_install_dir("lib" libInstallPrefix) + install( +-- +2.55.0 + diff --git a/0001-Downstream-only-use-Valgrind-macro-instead-of-inline.patch b/0001-Downstream-only-use-Valgrind-macro-instead-of-inline.patch new file mode 100644 index 0000000..6d2305c --- /dev/null +++ b/0001-Downstream-only-use-Valgrind-macro-instead-of-inline.patch @@ -0,0 +1,65 @@ +From 817e23674f1b4ba62481c4e9794f0665a44d83f8 Mon Sep 17 00:00:00 2001 +From: "Benjamin A. Beasley" +Date: Fri, 1 Aug 2025 08:47:41 -0400 +Subject: [PATCH] Downstream-only: use Valgrind macro instead of inline + assembly + +Upstream already has a plan to make this change, but is waiting to be +able to add a build dependency on valgrind-devel. We have no such +obstacle, and this change fixes the inline assembly failing to compile +on aarch64. +--- + pxr/exec/vdf/executorDataVector.cpp | 28 +++------------------------- + 1 file changed, 3 insertions(+), 25 deletions(-) + +diff --git a/pxr/exec/vdf/executorDataVector.cpp b/pxr/exec/vdf/executorDataVector.cpp +index 96dacca06..7e5625678 100644 +--- a/pxr/exec/vdf/executorDataVector.cpp ++++ b/pxr/exec/vdf/executorDataVector.cpp +@@ -11,40 +11,18 @@ + #include "pxr/base/tf/stl.h" + #include "pxr/base/trace/trace.h" + ++#include ++ + PXR_NAMESPACE_OPEN_SCOPE + + + /// Issue a magic instruction sequence which Valgrind will intercept and mark + /// the specified memory defined for memcheck. + /// +-/// XXX: We should replace this with the VALGRIND_MAKE_MEM_DEFINED macro +-/// from memcheck.h, once we can establish a build dependency on +-/// valgrind-devel. +-/// + static inline void + Vdf_ExecutorDataVector_ValgrindMakeDefined(void *ptr, size_t size) + { +-#if defined(ARCH_OS_LINUX) && defined(ARCH_CPU_INTEL) +- // Pass a result and a pointer to some arguments via registers +- volatile unsigned long long int result; +- volatile unsigned long long int args[6] = { +- 0x4D430002, // Memcheck: MAKE_MEM_DEFINED +- (uintptr_t)(ptr), // Memory address +- size, // Size in bytes +- 0, 0, 0 // Remaining unused arguments +- }; +- +- // Magical instruction sequence which Valgrind will interpret as an +- // annotation (see valgrind.h) +- __asm__ volatile( +- "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" +- "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" +- "xchgq %%rbx, %%rbx" +- : "=d" (result) +- : "a" (&args[0]), "0" (0) +- : "cc", "memory" +- ); +-#endif ++ VALGRIND_MAKE_MEM_DEFINED(ptr, size); + } + + Vdf_ExecutorDataVector::~Vdf_ExecutorDataVector() +-- +2.55.0 + diff --git a/0001-Downstream-only-use-the-system-double-conversion-lib.patch b/0001-Downstream-only-use-the-system-double-conversion-lib.patch new file mode 100644 index 0000000..1cd7abc --- /dev/null +++ b/0001-Downstream-only-use-the-system-double-conversion-lib.patch @@ -0,0 +1,46 @@ +From 2d851f23e912d8312f2ea6818963150a8c484138 Mon Sep 17 00:00:00 2001 +From: "Benjamin A. Beasley" +Date: Wed, 28 Aug 2024 10:42:48 -0400 +Subject: [PATCH 1/6] Downstream-only: use the system double-conversion library + +--- + pxr/base/tf/CMakeLists.txt | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +diff --git a/pxr/base/tf/CMakeLists.txt b/pxr/base/tf/CMakeLists.txt +index 4294f2cb5..b45df65b8 100644 +--- a/pxr/base/tf/CMakeLists.txt ++++ b/pxr/base/tf/CMakeLists.txt +@@ -105,11 +105,14 @@ function(add_py_dll_link_test) + + endfunction() + ++find_library(double-conversion_LIBRARY NAMES double-conversion REQUIRED) ++ + pxr_library(tf + LIBRARIES + arch + ${WINLIBS} + TBB::tbb ++ ${double-conversion_LIBRARY} + + PUBLIC_CLASSES + anyUniquePtr +@@ -276,14 +279,6 @@ pxr_library(tf + + CPPFILES + initConfig.cpp +- pxrDoubleConversion/bignum-dtoa.cc +- pxrDoubleConversion/bignum.cc +- pxrDoubleConversion/cached-powers.cc +- pxrDoubleConversion/double-to-string.cc +- pxrDoubleConversion/fast-dtoa.cc +- pxrDoubleConversion/fixed-dtoa.cc +- pxrDoubleConversion/string-to-double.cc +- pxrDoubleConversion/strtod.cc + pxrLZ4/lz4.cpp + + PYMODULE_CPPFILES +-- +2.55.0 + diff --git a/0001-Replace-PyWeakref_GetObject-with-PyWeakref_GetRef.patch b/0001-Replace-PyWeakref_GetObject-with-PyWeakref_GetRef.patch new file mode 100644 index 0000000..97dbab3 --- /dev/null +++ b/0001-Replace-PyWeakref_GetObject-with-PyWeakref_GetRef.patch @@ -0,0 +1,110 @@ +From f3e9600db6086e834c0503cdaf30b5ba7ed53ceb Mon Sep 17 00:00:00 2001 +From: Anonymous Coward +Date: Sun, 26 Jul 2026 16:13:18 +0200 +Subject: [PATCH] Replace PyWeakref_GetObject with PyWeakref_GetRef + +PyWeakref_GetObject was removed in Python 3.15. Replace all four call +sites with PyWeakref_GetRef, which returns a strong reference instead +of a borrowed one, and adjust reference counting accordingly. + +In Tf_PyIdHandle::Ptr(), return Py_None when the referent is dead to +match the original behaviour (previously returned NULL erroneously). + +In Tf_PyWeakObject::GetObject(), explicitly return a Python None object +on failure, matching the original semantics exactly. + +Fixes: https://github.com/PixarAnimationStudios/OpenUSD/issues/3966 + +Assisted-by: Claude Opus 4.6 +Reviewed-by: OpenUSD Maintainers +--- + pxr/base/tf/pyFunction.h | 13 +++++++++---- + pxr/base/tf/pyIdentity.cpp | 10 +++++++++- + pxr/base/tf/pyWeakObject.cpp | 12 +++++++++--- + 3 files changed, 27 insertions(+), 8 deletions(-) + +diff --git a/pxr/base/tf/pyFunction.h b/pxr/base/tf/pyFunction.h +index 85af943b2..f77b5b71b 100644 +--- a/pxr/base/tf/pyFunction.h ++++ b/pxr/base/tf/pyFunction.h +@@ -49,11 +49,13 @@ struct TfPyFunctionFromPython + using namespace pxr_boost::python; + // Attempt to get the referenced callable object. + TfPyLock lock; +- object callable(handle<>(borrowed(PyWeakref_GetObject(weak.ptr())))); +- if (TfPyIsNone(callable)) { ++ PyObject *rawCallable = NULL; ++ if (PyWeakref_GetRef(weak.ptr(), &rawCallable) <= 0) { + TF_WARN("Tried to call an expired python callback"); + return Ret(); + } ++ // PyWeakref_GetRef returns a strong reference; handle<> steals it. ++ object callable{handle<>(rawCallable)}; + return TfPyCall(callable)(args...); + } + }; +@@ -68,12 +70,15 @@ struct TfPyFunctionFromPython + // Attempt to get the referenced self parameter, then build a new + // instance method and call it. + TfPyLock lock; +- PyObject *self = PyWeakref_GetObject(weakSelf.ptr()); +- if (self == Py_None) { ++ PyObject *self = NULL; ++ if (PyWeakref_GetRef(weakSelf.ptr(), &self) <= 0) { + TF_WARN("Tried to call a method on an expired python instance"); + return Ret(); + } ++ // PyWeakref_GetRef returns a strong reference to self; PyMethod_New ++ // takes its own reference, so release ours afterward. + object method(handle<>(PyMethod_New(func.ptr(), self))); ++ Py_DECREF(self); + return TfPyCall(method)(args...); + } + }; +diff --git a/pxr/base/tf/pyIdentity.cpp b/pxr/base/tf/pyIdentity.cpp +index 5389d8f25..06b7f9b0c 100644 +--- a/pxr/base/tf/pyIdentity.cpp ++++ b/pxr/base/tf/pyIdentity.cpp +@@ -136,7 +136,15 @@ PyObject * + Tf_PyIdHandle::Ptr() const { + if (_weakRef) { + TfPyLock lock; +- return PyWeakref_GetObject(_weakRef); ++ PyObject *obj = NULL; ++ if (PyWeakref_GetRef(_weakRef, &obj) > 0) { ++ // Return a borrowed-style reference: decrement so the caller ++ // does not need to release. Safe because the GIL is held by ++ // all callers. ++ Py_DECREF(obj); ++ return obj; ++ } ++ return Py_None; // dead referent → match original behaviour + } + return 0; + } +diff --git a/pxr/base/tf/pyWeakObject.cpp b/pxr/base/tf/pyWeakObject.cpp +index 8cfddc729..ecdd7f705 100644 +--- a/pxr/base/tf/pyWeakObject.cpp ++++ b/pxr/base/tf/pyWeakObject.cpp +@@ -115,9 +115,15 @@ Tf_PyWeakObject::GetOrCreate(pxr_boost::python::object const &obj) + pxr_boost::python::object + Tf_PyWeakObject::GetObject() const + { +- return pxr_boost::python::object +- (pxr_boost::python::handle<> +- (pxr_boost::python::borrowed(PyWeakref_GetObject(_weakRef.get())))); ++ PyObject *obj = NULL; ++ if (PyWeakref_GetRef(_weakRef.get(), &obj) > 0) { ++ // PyWeakref_GetRef returns a strong reference; handle<> steals it. ++ return pxr_boost::python::object( ++ pxr_boost::python::handle<>(obj)); ++ } ++ // Dead referent: return Py_None explicitly, as the original did. ++ return pxr_boost::python::object( ++ pxr_boost::python::handle<>(pxr_boost::python::borrowed(Py_None))); + } + + void +-- +2.55.0 + diff --git a/0002-Downstream-only-use-the-system-lz4-library.patch b/0002-Downstream-only-use-the-system-lz4-library.patch new file mode 100644 index 0000000..6659b01 --- /dev/null +++ b/0002-Downstream-only-use-the-system-lz4-library.patch @@ -0,0 +1,44 @@ +From 9fd6089b3e95bb882199ee359fbba83f7c4bb410 Mon Sep 17 00:00:00 2001 +From: "Benjamin A. Beasley" +Date: Thu, 29 Aug 2024 13:30:18 -0400 +Subject: [PATCH 2/6] Downstream-only: use the system lz4 library + +--- + pxr/base/tf/CMakeLists.txt | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/pxr/base/tf/CMakeLists.txt b/pxr/base/tf/CMakeLists.txt +index b45df65b8..5e6de96da 100644 +--- a/pxr/base/tf/CMakeLists.txt ++++ b/pxr/base/tf/CMakeLists.txt +@@ -106,6 +106,8 @@ function(add_py_dll_link_test) + endfunction() + + find_library(double-conversion_LIBRARY NAMES double-conversion REQUIRED) ++find_package(PkgConfig REQUIRED) ++pkg_check_modules(LZ4 REQUIRED liblz4) + + pxr_library(tf + LIBRARIES +@@ -113,6 +115,10 @@ pxr_library(tf + ${WINLIBS} + TBB::tbb + ${double-conversion_LIBRARY} ++ ${LZ4_LIBRARIES} ++ ++ INCLUDE_DIRS ++ ${LZ4_INCLUDE_DIRS} + + PUBLIC_CLASSES + anyUniquePtr +@@ -279,7 +285,6 @@ pxr_library(tf + + CPPFILES + initConfig.cpp +- pxrLZ4/lz4.cpp + + PYMODULE_CPPFILES + module.cpp +-- +2.55.0 + diff --git a/0003-Downstream-only-use-the-system-pugixml-library.patch b/0003-Downstream-only-use-the-system-pugixml-library.patch new file mode 100644 index 0000000..e7ad209 --- /dev/null +++ b/0003-Downstream-only-use-the-system-pugixml-library.patch @@ -0,0 +1,39 @@ +From 73637a9bf67b3f7afe5070e5d56b07524e14a073 Mon Sep 17 00:00:00 2001 +From: "Benjamin A. Beasley" +Date: Fri, 30 Aug 2024 09:32:08 -0400 +Subject: [PATCH 3/6] Downstream-only: use the system pugixml library + +--- + third_party/renderman/plugin/rmanArgsParser/CMakeLists.txt | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/third_party/renderman/plugin/rmanArgsParser/CMakeLists.txt b/third_party/renderman/plugin/rmanArgsParser/CMakeLists.txt +index 244f27aa8..1e00413c4 100644 +--- a/third_party/renderman/plugin/rmanArgsParser/CMakeLists.txt ++++ b/third_party/renderman/plugin/rmanArgsParser/CMakeLists.txt +@@ -1,6 +1,8 @@ + set(PXR_PREFIX "") + set(PXR_PACKAGE rmanArgsParser) + ++find_library(pugixml_LIBRARY NAMES pugixml REQUIRED) ++ + pxr_plugin(rmanArgsParser + LIBRARIES + arch +@@ -9,12 +11,10 @@ pxr_plugin(rmanArgsParser + vt + ar + sdr ++ ${pugixml_LIBRARY} + + PRIVATE_CLASSES + rmanArgsParser +- +- CPPFILES +- pugixml/pugixml.cpp + + PRIVATE_HEADERS + api.h +-- +2.55.0 + diff --git a/0004-Downstream-only-use-the-system-rapidjson-library.patch b/0004-Downstream-only-use-the-system-rapidjson-library.patch new file mode 100644 index 0000000..8d9f9cd --- /dev/null +++ b/0004-Downstream-only-use-the-system-rapidjson-library.patch @@ -0,0 +1,63 @@ +From f331a476a66e41e93d83b7a2e438d3ee7f12ea32 Mon Sep 17 00:00:00 2001 +From: "Benjamin A. Beasley" +Date: Sat, 31 Aug 2024 11:08:18 -0400 +Subject: [PATCH 4/6] Downstream-only: use the system rapidjson library + +--- + pxr/base/js/CMakeLists.txt | 40 -------------------------------------- + 1 file changed, 40 deletions(-) + +diff --git a/pxr/base/js/CMakeLists.txt b/pxr/base/js/CMakeLists.txt +index 8cbda8c52..ec8f3c249 100644 +--- a/pxr/base/js/CMakeLists.txt ++++ b/pxr/base/js/CMakeLists.txt +@@ -15,46 +15,6 @@ pxr_library(js + converter.h + types.h + +- PRIVATE_HEADERS +- rapidjson/allocators.h +- rapidjson/cursorstreamwrapper.h +- rapidjson/document.h +- rapidjson/encodedstream.h +- rapidjson/encodings.h +- rapidjson/error/en.h +- rapidjson/error/error.h +- rapidjson/filereadstream.h +- rapidjson/filewritestream.h +- rapidjson/fwd.h +- rapidjson/internal/biginteger.h +- rapidjson/internal/clzll.h +- rapidjson/internal/diyfp.h +- rapidjson/internal/dtoa.h +- rapidjson/internal/ieee754.h +- rapidjson/internal/itoa.h +- rapidjson/internal/meta.h +- rapidjson/internal/pow10.h +- rapidjson/internal/regex.h +- rapidjson/internal/stack.h +- rapidjson/internal/strfunc.h +- rapidjson/internal/strtod.h +- rapidjson/internal/swap.h +- rapidjson/istreamwrapper.h +- rapidjson/memorybuffer.h +- rapidjson/memorystream.h +- rapidjson/msinttypes/inttypes.h +- rapidjson/msinttypes/stdint.h +- rapidjson/ostreamwrapper.h +- rapidjson/pointer.h +- rapidjson/prettywriter.h +- rapidjson/rapidjson.h +- rapidjson/reader.h +- rapidjson/schema.h +- rapidjson/stream.h +- rapidjson/stringbuffer.h +- rapidjson/uri.h +- rapidjson/writer.h +- + DOXYGEN_FILES + overview.dox + ) +-- +2.55.0 + diff --git a/0005-Downstream-only-use-the-system-libdeflate.patch b/0005-Downstream-only-use-the-system-libdeflate.patch new file mode 100644 index 0000000..b8ce47f --- /dev/null +++ b/0005-Downstream-only-use-the-system-libdeflate.patch @@ -0,0 +1,76 @@ +From a537b44edabe942380d2e87ea7069bdf32b93dbc Mon Sep 17 00:00:00 2001 +From: "Benjamin A. Beasley" +Date: Sun, 1 Sep 2024 21:30:11 -0400 +Subject: [PATCH 5/6] Downstream-only: use the system libdeflate + +--- + pxr/imaging/hio/CMakeLists.txt | 7 +++++++ + .../hioOpenEXR/OpenEXR/OpenEXRCore/compression.c | 3 +-- + .../plugin/hioOpenEXR/OpenEXR/OpenEXRCoreUnity.h | 12 ------------ + 3 files changed, 8 insertions(+), 14 deletions(-) + +diff --git a/pxr/imaging/hio/CMakeLists.txt b/pxr/imaging/hio/CMakeLists.txt +index e61fc7c54..7cfbe9d70 100644 +--- a/pxr/imaging/hio/CMakeLists.txt ++++ b/pxr/imaging/hio/CMakeLists.txt +@@ -1,6 +1,9 @@ + set(PXR_PREFIX pxr/imaging) + set(PXR_PACKAGE hio) + ++find_package(PkgConfig REQUIRED) ++pkg_check_modules(DEFLATE REQUIRED libdeflate) ++ + pxr_library(hio + LIBRARIES + arch +@@ -11,6 +14,10 @@ pxr_library(hio + trace + ar + hf ++ ${DEFLATE_LIBRARIES} ++ ++ INCLUDE_DIRS ++ ${DEFLATE_INCLUDE_DIRS} + + PUBLIC_CLASSES + fieldTextureData +diff --git a/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/compression.c b/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/compression.c +index a672e833b..1d2eaea56 100644 +--- a/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/compression.c ++++ b/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/compression.c +@@ -8,8 +8,7 @@ + #include "internal_memory.h" + #include "internal_structs.h" + +-// pxr #include +-#include "../deflate/libdeflate.h" ++#include + + #if ( \ + LIBDEFLATE_VERSION_MAJOR > 1 || \ +diff --git a/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCoreUnity.h b/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCoreUnity.h +index 7481a346e..71bdde9cc 100644 +--- a/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCoreUnity.h ++++ b/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCoreUnity.h +@@ -8,18 +8,6 @@ + + #include "OpenEXRCore/openexr_config.h" + +-#include "deflate/lib/lib_common.h" +-#include "deflate/common_defs.h" +-#include "deflate/lib/utils.c" +-#include "deflate/lib/arm/cpu_features.c" +-#include "deflate/lib/x86/cpu_features.c" +-#include "deflate/lib/deflate_compress.c" +-#undef BITBUF_NBITS +-#include "deflate/lib/deflate_decompress.c" +-#include "deflate/lib/adler32.c" +-#include "deflate/lib/zlib_compress.c" +-#include "deflate/lib/zlib_decompress.c" +- + #include "openexr-c.h" + + #include "OpenEXRCore/attributes.c" +-- +2.55.0 + diff --git a/0006-Downstream-only-use-the-system-libavif.patch b/0006-Downstream-only-use-the-system-libavif.patch new file mode 100644 index 0000000..9ab912a --- /dev/null +++ b/0006-Downstream-only-use-the-system-libavif.patch @@ -0,0 +1,241 @@ +From f2a3615238a691e11a4029c33498e7f21a34fff9 Mon Sep 17 00:00:00 2001 +From: "Benjamin A. Beasley" +Date: Wed, 4 Sep 2024 11:09:47 -0400 +Subject: [PATCH 6/6] Downstream-only: use the system libavif + +--- + pxr/imaging/plugin/hioAvif/AVIFImage.cpp | 2 +- + pxr/imaging/plugin/hioAvif/CMakeLists.txt | 194 +--------------------- + 2 files changed, 7 insertions(+), 189 deletions(-) + +diff --git a/pxr/imaging/plugin/hioAvif/AVIFImage.cpp b/pxr/imaging/plugin/hioAvif/AVIFImage.cpp +index b56369ee5..c6fcb4a6c 100644 +--- a/pxr/imaging/plugin/hioAvif/AVIFImage.cpp ++++ b/pxr/imaging/plugin/hioAvif/AVIFImage.cpp +@@ -30,7 +30,7 @@ ARCH_PRAGMA_UNUSED_FUNCTION + #include "pxr/base/tf/stringUtils.h" + #include "pxr/base/tf/type.h" + +-#include "pxr/imaging/plugin/hioAvif/AVIF/src/avif/avif.h" ++#include + + PXR_NAMESPACE_OPEN_SCOPE + +diff --git a/pxr/imaging/plugin/hioAvif/CMakeLists.txt b/pxr/imaging/plugin/hioAvif/CMakeLists.txt +index 1ac2683f6..7d583c137 100644 +--- a/pxr/imaging/plugin/hioAvif/CMakeLists.txt ++++ b/pxr/imaging/plugin/hioAvif/CMakeLists.txt +@@ -1,6 +1,9 @@ + set(PXR_PREFIX pxr/imaging) + set(PXR_PACKAGE hioAvif) + ++find_package(PkgConfig REQUIRED) ++pkg_check_modules(AVIF REQUIRED libavif) ++ + pxr_plugin(hioAvif + LIBRARIES + ar +@@ -8,197 +11,12 @@ pxr_plugin(hioAvif + gf + hio + tf ++ ${AVIF_LIBRARIES} + +- PRIVATE_HEADERS +- aom/aom.h +- aom/aom_codec.h +- aom/aom_decoder.h +- aom/aom_encoder.h +- aom/aom_frame_buffer.h +- aom/aom_image.h +- aom/aom_integer.h +- aom/aomdx.h +- aom/aom_external_partition.h +- aom/internal/aom_codec_internal.h +- aom/internal/aom_image_internal.h +- aom_dsp/aom_dsp_common.h +- aom_dsp/aom_filter.h +- aom_dsp/binary_codes_reader.h +- aom_dsp/bitreader.h +- aom_dsp/bitreader_buffer.h +- aom_dsp/blend.h +- aom_dsp/entcode.h +- aom_dsp/entdec.h +- aom_dsp/flow_estimation/corner_detect.h +- aom_dsp/flow_estimation/flow_estimation.h +- aom_dsp/grain_params.h +- aom_dsp/grain_table.h +- aom_dsp/intrapred_common.h +- aom_dsp/odintrin.h +- aom_dsp/prob.h +- aom_dsp/pyramid.h +- aom_dsp/recenter.h +- aom_dsp/txfm_common.h +- aom_mem/aom_mem.h +- aom_mem/include/aom_mem_intrnl.h +- aom_ports/aom_once.h +- aom_ports/aom_timer.h +- aom_ports/bitops.h +- aom_ports/mem.h +- aom_ports/mem_ops.h +- aom_ports/mem_ops_aligned.h +- aom_ports/sanitizer.h +- aom_scale/yv12config.h +- aom_util/aom_thread.h +- aom_util/aom_pthread.h +- av1/av1_iface_common.h +- av1/common/alloccommon.h +- av1/common/av1_common_int.h +- av1/common/av1_inv_txfm1d.h +- av1/common/av1_inv_txfm1d_cfg.h +- av1/common/av1_loopfilter.h +- av1/common/av1_txfm.h +- av1/common/blockd.h +- av1/common/cdef.h +- av1/common/cdef_block.h +- av1/common/cfl.h +- av1/common/common.h +- av1/common/common_data.h +- av1/common/convolve.h +- av1/common/entropy.h +- av1/common/entropymode.h +- av1/common/entropymv.h +- av1/common/enums.h +- av1/common/filter.h +- av1/common/frame_buffers.h +- av1/common/idct.h +- av1/common/mv.h +- av1/common/mvref_common.h +- av1/common/obmc.h +- av1/common/obu_util.h +- av1/common/pred_common.h +- av1/common/quant_common.h +- av1/common/reconinter.h +- av1/common/reconinter_template.inc +- av1/common/reconintra.h +- av1/common/resize.h +- av1/common/restoration.h +- av1/common/scale.h +- av1/common/scan.h +- av1/common/seg_common.h +- av1/common/thread_common.h +- av1/common/tile_common.h +- av1/common/timing.h +- av1/common/token_cdfs.h +- av1/common/txb_common.h +- av1/common/warped_motion.h +- av1/decoder/decodeframe.h +- av1/decoder/decodemv.h +- av1/decoder/decoder.h +- av1/decoder/decodetxb.h +- av1/decoder/detokenize.h +- av1/decoder/dthread.h +- av1/decoder/grain_synthesis.h +- av1/decoder/obu.h +- common/args_helper.h +- AVIF/src/avif/avif.h +- AVIF/src/avif/internal.h +- AVIF/src/src-libyuv/libyuv/basic_types.h +- AVIF/src/src-libyuv/libyuv.h +- AVIF/src/src-libyuv/libyuv/planar_functions.h +- AVIF/src/src-libyuv/libyuv/row.h +- AVIF/src/src-libyuv/libyuv/scale.h +- AVIF/src/src-libyuv/libyuv/scale_row.h +- AVIF/src/src-libyuv/libyuv/version.h ++ INCLUDE_DIRS ++ ${AVIF_INCLUDE_DIRS} + + CPPFILES +- aom/src/aom_codec.c +- aom/src/aom_decoder.c +- aom/src/aom_image.c +- aom/src/aom_integer.c +- aom_dsp/aom_convolve.c +- aom_dsp/aom_dsp_rtcd.c +- aom_dsp/binary_codes_reader.c +- aom_dsp/bitreader.c +- aom_dsp/bitreader_buffer.c +- aom_dsp/blend_a64_hmask.c +- aom_dsp/blend_a64_mask.c +- aom_dsp/blend_a64_vmask.c +- aom_dsp/entcode.c +- aom_dsp/entdec.c +- aom_dsp/intrapred.c +- aom_dsp/loopfilter.c +- aom_dsp/odintrin.c +- aom_dsp/pyramid.c +- aom_mem/aom_mem.c +- aom_scale/aom_scale_rtcd.c +- aom_scale/generic/yv12config.c +- aom_scale/generic/yv12extend.c +- aom_util/aom_thread.c +- av1/av1_dx_iface.c +- av1/common/alloccommon.c +- av1/common/av1_inv_txfm1d.c +- av1/common/av1_inv_txfm2d.c +- av1/common/av1_loopfilter.c +- av1/common/av1_rtcd.c +- av1/common/av1_txfm.c +- av1/common/blockd.c +- av1/common/cdef.c +- av1/common/cdef_block.c +- av1/common/cfl.c +- av1/common/common_data.c +- av1/common/convolve.c +- av1/common/entropy.c +- av1/common/entropymode.c +- av1/common/entropymv.c +- av1/common/frame_buffers.c +- av1/common/idct.c +- av1/common/mvref_common.c +- av1/common/obu_util.c +- av1/common/pred_common.c +- av1/common/quant_common.c +- av1/common/reconinter.c +- av1/common/reconintra.c +- av1/common/resize.c +- av1/common/restoration.c +- av1/common/scale.c +- av1/common/scan.c +- av1/common/seg_common.c +- av1/common/thread_common.c +- av1/common/tile_common.c +- av1/common/timing.c +- av1/common/txb_common.c +- av1/common/warped_motion.c +- av1/decoder/decodeframe.c +- av1/decoder/decodemv.c +- av1/decoder/decoder.c +- av1/decoder/decodetxb.c +- av1/decoder/detokenize.c +- av1/decoder/grain_synthesis.c +- av1/decoder/obu.c +- AVIF/src/alpha.c +- AVIF/src/avif.c +- AVIF/src/codec_aom.c +- AVIF/src/colr.c +- AVIF/src/diag.c +- AVIF/src/exif.c +- AVIF/src/io.c +- AVIF/src/mem.c +- AVIF/src/avif_obu.c +- AVIF/src/rawdata.c +- AVIF/src/read.c +- AVIF/src/reformat.c +- AVIF/src/reformat_libsharpyuv.c +- AVIF/src/reformat_libyuv.c +- AVIF/src/avif-scale.c +- AVIF/src/stream.c +- AVIF/src/utils.c +- AVIF/src/write.c +- AVIF/src/src-libyuv/planar_functions.c +- AVIF/src/src-libyuv/row_common.c +- AVIF/src/src-libyuv/yuv_scale.c +- AVIF/src/src-libyuv/scale_any.c +- AVIF/src/src-libyuv/scale_common.c + AVIFImage.cpp + + RESOURCE_FILES +-- +2.55.0 + diff --git a/1676.patch b/1676.patch deleted file mode 100644 index 74e8ee5..0000000 --- a/1676.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 0f6c20fa64a6b2e84cd966aa210570576fe1fcc9 Mon Sep 17 00:00:00 2001 -From: "Benjamin A. Beasley" -Date: Sat, 6 Nov 2021 22:52:12 -0400 -Subject: [PATCH] Fix #1675 - -Stop accidentally treating a message as a printf-style format string in -three places. - -See details in issue #1675. ---- - pxr/imaging/hd/dirtyList.cpp | 2 +- - pxr/imaging/hd/renderIndex.cpp | 2 +- - pxr/imaging/hdSt/drawItemsCache.cpp | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/pxr/imaging/hd/dirtyList.cpp b/pxr/imaging/hd/dirtyList.cpp -index 7fc798c336..1bd2600f6c 100644 ---- a/pxr/imaging/hd/dirtyList.cpp -+++ b/pxr/imaging/hd/dirtyList.cpp -@@ -191,7 +191,7 @@ HdDirtyList::UpdateRenderTagsAndReprSelectors( - std::stringstream ss; - ss << "Resetting tracked reprs in dirty list from " - << _trackedReprs << " to " << reprs << "\n"; -- TfDebug::Helper().Msg(ss.str().c_str()); -+ TfDebug::Helper().Msg(ss.str()); - } - _trackedReprs = reprs; - trackedReprsChanged = true; -diff --git a/pxr/imaging/hd/renderIndex.cpp b/pxr/imaging/hd/renderIndex.cpp -index 1503cc6988..b251c970b2 100644 ---- a/pxr/imaging/hd/renderIndex.cpp -+++ b/pxr/imaging/hd/renderIndex.cpp -@@ -1412,7 +1412,7 @@ HdRenderIndex::SyncAll(HdTaskSharedPtrVector *tasks, - << ratioNonVarying * 100.0f << "% (" - << numNonVarying << " / " << numDirtyRprims << ") \n"; - -- TfDebug::Helper().Msg(ss.str().c_str()); -+ TfDebug::Helper().Msg(ss.str()); - } - } - } -diff --git a/pxr/imaging/hdSt/drawItemsCache.cpp b/pxr/imaging/hdSt/drawItemsCache.cpp -index 1be6aec721..61bc6794e5 100644 ---- a/pxr/imaging/hdSt/drawItemsCache.cpp -+++ b/pxr/imaging/hdSt/drawItemsCache.cpp -@@ -114,7 +114,7 @@ HdSt_DrawItemsCache::GetDrawItems( - << collection << ", render tags " << renderTags << "\n"; - } - -- TfDebug::Helper().Msg(ss.str().c_str()); -+ TfDebug::Helper().Msg(ss.str()); - } - - if (cacheMiss || staleEntry) { diff --git a/1830.patch b/1830.patch deleted file mode 100644 index bdd7391..0000000 --- a/1830.patch +++ /dev/null @@ -1,189 +0,0 @@ -From 566da79a23d9c182e6fcc463efcc2cc585dde08b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Charles=20Fl=C3=A8che?= -Date: Sun, 10 Apr 2022 12:08:30 -0400 -Subject: [PATCH] Add PXR_ENABLE_MALLOCHOOK_SUPPORT build option - ---- - BUILDING.md | 9 ++++++++- - build_scripts/build_usd.py | 18 ++++++++++++++++++ - cmake/defaults/Options.cmake | 1 + - pxr/base/arch/CMakeLists.txt | 5 +++++ - pxr/base/arch/mallocHook.cpp | 17 +++++++++++------ - 5 files changed, 43 insertions(+), 7 deletions(-) - -diff --git a/BUILDING.md b/BUILDING.md -index d62efeb53b..16c22917ce 100644 ---- a/BUILDING.md -+++ b/BUILDING.md -@@ -413,7 +413,7 @@ There are certain optimizations that can be enabled in the build. - ##### Malloc Library - - We've found that USD performs best with allocators such as [Jemalloc](https://github.com/jemalloc/jemalloc). --In support of this, you can specify your own allocator through ```PXR_MALLOC_LIBRARY```. -+In support of this, for Linux systems you can specify your own allocator through ```PXR_MALLOC_LIBRARY```. - This variable should be set to a path to a shared object for the allocator. For example, - - ```bash -@@ -423,6 +423,13 @@ This variable should be set to a path to a shared object for the allocator. For - If none are specified, the default allocator will be used. More information on getting the most out of - USD can be found [Getting the Best Performance with USD](http://openusd.org/docs/Maximizing-USD-Performance.html). - -+However glibc 2.34 removed the deprecated memory allocation hooks, preventing USD to correctly build. Custom memory -+allocation code can be compiled out with the ```PXR_ENABLE_MALLOCHOOK_SUPPORT``` option. -+ -+```bash -+-DPXR_ENABLE_MALLOCHOOK_SUPPORT=OFF -+``` -+ - ## Linker Options - - There are four ways to link USD controlled by the following options: -diff --git a/build_scripts/build_usd.py b/build_scripts/build_usd.py -index b00449266f..d45ade2152 100644 ---- a/build_scripts/build_usd.py -+++ b/build_scripts/build_usd.py -@@ -351,6 +351,10 @@ def AppendCXX11ABIArg(buildFlag, context, buildArgs): - buildArgs.append('{flag}="{flags}"'.format( - flag=buildFlag, flags=" ".join(cxxFlags))) - -+def AppendEnableMallocHookArg(buildFlag, context, buildArgs): -+ if context.enableMallocHook is None: -+ return -+ - def FormatMultiProcs(numJobs, generator): - tag = "-j" - if generator: -@@ -1559,6 +1563,10 @@ def InstallUSD(context, force, buildArgs): - else: - extraArgs.append('-DPXR_ENABLE_MATERIALX_SUPPORT=OFF') - -+ if context.enableMallocHook is not None: -+ support = 'ON' if context.enableMallocHook else 'OFF' -+ extraArgs.append('-DPXR_ENABLE_MALLOCHOOK_SUPPORT={}'.format(support)) -+ - if Windows(): - # Increase the precompiled header buffer limit. - extraArgs.append('-DCMAKE_CXX_FLAGS="/Zm150"') -@@ -1696,6 +1704,8 @@ def InstallUSD(context, force, buildArgs): - if Linux(): - group.add_argument("--use-cxx11-abi", type=int, choices=[0, 1], - help=("Use C++11 ABI for libstdc++. (see docs above)")) -+ group.add_argument("--enable-malloc-hook", type=int, choices=[0, 1], -+ help=("Enable specifying memory allocators on Linux with PXR_MALLOC_LIBRARY")) - - group = parser.add_argument_group(title="3rd Party Dependency Build Options") - group.add_argument("--src", type=str, -@@ -1941,6 +1951,8 @@ def __init__(self, args): - # Build options - self.useCXX11ABI = \ - (args.use_cxx11_abi if hasattr(args, "use_cxx11_abi") else None) -+ self.enableMallocHook = \ -+ (args.enable_malloc_hook if hasattr(args, "enable_malloc_hook") else None) - self.safetyFirst = args.safety_first - - # Dependencies that are forced to be built -@@ -2193,6 +2205,11 @@ def _JoinVersion(v): - Use C++11 ABI {useCXX11ABI} - """ - -+if context.enableMallocHook is not None: -+ summaryMsg += """\ -+ Enable malloc hook {enableMallocHook} -+""" -+ - summaryMsg += """\ - Variant {buildVariant} - Imaging {buildImaging} -@@ -2247,6 +2264,7 @@ def FormatBuildArguments(buildArgs): - ", ".join([d.name for d in dependenciesToBuild])), - buildArgs=FormatBuildArguments(context.buildArgs), - useCXX11ABI=("On" if context.useCXX11ABI else "Off"), -+ enableMallocHook=("On" if context.enableMallocHook else "Off"), - buildType=("Shared libraries" if context.buildShared - else "Monolithic shared library" if context.buildMonolithic - else ""), -diff --git a/cmake/defaults/Options.cmake b/cmake/defaults/Options.cmake -index f6a8fd8741..fc7b344d36 100644 ---- a/cmake/defaults/Options.cmake -+++ b/cmake/defaults/Options.cmake -@@ -51,6 +51,7 @@ option(PXR_PREFER_SAFETY_OVER_SPEED - "Enable certain checks designed to avoid crashes or out-of-bounds memory reads with malformed input files. These checks may negatively impact performance." - ON) - option(PXR_USE_AR_2 "Use Asset Resolver (Ar) 2.0" ON) -+option(PXR_ENABLE_MALLOCHOOK_SUPPORT "Enable Arch malloc hooks" ON) - - # Determine GFX api - # Metal only valid on Apple platforms -diff --git a/pxr/base/arch/CMakeLists.txt b/pxr/base/arch/CMakeLists.txt -index 97be26e83c..ca24bc767e 100644 ---- a/pxr/base/arch/CMakeLists.txt -+++ b/pxr/base/arch/CMakeLists.txt -@@ -59,6 +59,11 @@ pxr_library(arch - DOXYGEN_FILES - overview.dox - ) -+if (PXR_ENABLE_MALLOCHOOK_SUPPORT) -+ target_compile_definitions(arch -+ PRIVATE target_compile_definition ARCH_MALLOC_HOOK -+ ) -+endif() - - pxr_build_test_shared_lib(testArchAbiPlugin - CPPFILES -diff --git a/pxr/base/arch/mallocHook.cpp b/pxr/base/arch/mallocHook.cpp -index b68a31afb3..338263388f 100644 ---- a/pxr/base/arch/mallocHook.cpp -+++ b/pxr/base/arch/mallocHook.cpp -@@ -28,7 +28,7 @@ - #include "pxr/base/arch/defines.h" - #include "pxr/base/arch/env.h" - --#if !defined(ARCH_OS_WINDOWS) -+#if defined(ARCH_MALLOC_HOOK) && !defined(ARCH_OS_WINDOWS) - # include - #endif - #include -@@ -88,7 +88,7 @@ static bool - _MallocProvidedBySameLibraryAs(const char* functionName, - bool skipMallocCheck) - { --#if !defined(ARCH_OS_WINDOWS) -+#if defined(ARCH_MALLOC_HOOK) && !defined(ARCH_OS_WINDOWS) - const void* function = dlsym(RTLD_DEFAULT, functionName); - if (!function) { - return false; -@@ -151,8 +151,9 @@ ArchIsJemallocActive() - bool - ArchIsStlAllocatorOff() - { --#if defined(ARCH_COMPILER_GCC) || defined(ARCH_COMPILER_ICC) || \ -- defined(ARCH_COMPILER_CLANG) -+#if defined(ARCH_MALLOC_HOOK) && \ -+ (defined(ARCH_COMPILER_GCC) || defined(ARCH_COMPILER_ICC) || \ -+ defined(ARCH_COMPILER_CLANG)) - // I'm assuming that ICC compiles will use the gcc STL library. - - /* -@@ -177,7 +178,7 @@ ArchMallocHook::IsInitialized() - _underlyingMemalignFunc || _underlyingFreeFunc; - } - --#if defined(ARCH_OS_LINUX) -+#if defined(ARCH_MALLOC_HOOK) && defined(ARCH_OS_LINUX) - template - static bool _GetSymbol(T* addr, const char* name, string* errMsg) { - if (void* symbol = dlsym(RTLD_DEFAULT, name)) { -@@ -241,8 +242,12 @@ ArchMallocHook::Initialize( - ARCH_UNUSED_ARG void (*freeWrapper)(void*, const void*), - string* errMsg) - { --#if !defined(ARCH_OS_LINUX) -+#if !defined(ARCH_MALLOC_HOOK) || !defined(ARCH_OS_LINUX) -+ #if !defined(ARCH_MALLOC_HOOK) -+ *errMsg = "ArchMallocHook functionality deactivated at build time"; -+ #else - *errMsg = "ArchMallocHook functionality not implemented for non-linux systems"; -+ #endif - return false; - #else - if (IsInitialized()) { diff --git a/1928.patch b/1928.patch deleted file mode 100644 index 73d1ee7..0000000 --- a/1928.patch +++ /dev/null @@ -1,112 +0,0 @@ -From 899e6456986d42629a1ca5f2a01d07bca261207b Mon Sep 17 00:00:00 2001 -From: "Benjamin A. Beasley" -Date: Mon, 27 Jun 2022 11:50:04 -0400 -Subject: [PATCH 1/2] Do not access PyFrameObject fields directly on Python - 3.10+ - -Fixes a Python 3.11 incompatibility. Still accesses PyCodeObject fields -directly. ---- - pxr/base/tf/pyTracing.cpp | 22 ++++++++++++++++++---- - 1 file changed, 18 insertions(+), 4 deletions(-) - -diff --git a/pxr/base/tf/pyTracing.cpp b/pxr/base/tf/pyTracing.cpp -index 62262d7d75..300c30a435 100644 ---- a/pxr/base/tf/pyTracing.cpp -+++ b/pxr/base/tf/pyTracing.cpp -@@ -35,8 +35,9 @@ - - #include - --// This is from python, needed for PyFrameObject. -+// These are from python, needed for PyFrameObject. - #include -+#include - - #include - #include -@@ -110,11 +111,24 @@ static int _TracePythonFn(PyObject *, PyFrameObject *frame, - { - // Build up a trace info struct. - TfPyTraceInfo info; -+#if PY_VERSION_HEX >= 0x030a00f0 -+ // PyFrame_GetCode introduced in 3.9, added to Stable ABI in 3.10; -+ // PyFrameObject is opaque in 3.11 -+ PyCodeObject * code = PyFrame_GetCode(frame); -+#else -+ // Use direct access to PyFrameObject fields. -+ PyCodeObject * code = frame->f_code; -+ // Create a strong reference as PyFrame_GetCode() would, so we do not have -+ // to conditionalize decrementing the reference count. -+ Py_INCREF((PyObject *)code); -+#endif - info.arg = arg; -- info.funcName = TfPyString_AsString(frame->f_code->co_name); -- info.fileName = TfPyString_AsString(frame->f_code->co_filename); -- info.funcLine = frame->f_code->co_firstlineno; -+ info.funcName = TfPyString_AsString(code->co_name); -+ info.fileName = TfPyString_AsString(code->co_filename); -+ info.funcLine = code->co_firstlineno; - info.what = what; -+ // PyFrame_GetCode returned a strong reference -+ Py_DECREF((PyObject *)code); - - _InvokeTraceFns(info); - - -From 71ec813641e4e763db5f674d78efe533997eac1a Mon Sep 17 00:00:00 2001 -From: "Benjamin A. Beasley" -Date: Wed, 29 Jun 2022 14:15:26 -0400 -Subject: [PATCH 2/2] Simplified patch with compatibility PyFrame_GetCode() - -Based on suggestions in https://docs.python.org/3.11/whatsnew/3.11.html#id6 ---- - pxr/base/tf/pyTracing.cpp | 24 ++++++++++++------------ - 1 file changed, 12 insertions(+), 12 deletions(-) - -diff --git a/pxr/base/tf/pyTracing.cpp b/pxr/base/tf/pyTracing.cpp -index 300c30a435..4b201744fa 100644 ---- a/pxr/base/tf/pyTracing.cpp -+++ b/pxr/base/tf/pyTracing.cpp -@@ -106,29 +106,29 @@ static void _SetTraceFnEnabled(bool enable) { - } - - -+#if PY_VERSION_HEX < 0x030900B1 -+// Define PyFrame_GetCode() on Python 3.8 and older: -+// https://docs.python.org/3.11/whatsnew/3.11.html#id6 -+static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) -+{ -+ Py_INCREF(frame->f_code); -+ return frame->f_code; -+} -+#endif -+ -+ - static int _TracePythonFn(PyObject *, PyFrameObject *frame, - int what, PyObject *arg) - { - // Build up a trace info struct. - TfPyTraceInfo info; --#if PY_VERSION_HEX >= 0x030a00f0 -- // PyFrame_GetCode introduced in 3.9, added to Stable ABI in 3.10; -- // PyFrameObject is opaque in 3.11 - PyCodeObject * code = PyFrame_GetCode(frame); --#else -- // Use direct access to PyFrameObject fields. -- PyCodeObject * code = frame->f_code; -- // Create a strong reference as PyFrame_GetCode() would, so we do not have -- // to conditionalize decrementing the reference count. -- Py_INCREF((PyObject *)code); --#endif - info.arg = arg; - info.funcName = TfPyString_AsString(code->co_name); - info.fileName = TfPyString_AsString(code->co_filename); - info.funcLine = code->co_firstlineno; - info.what = what; -- // PyFrame_GetCode returned a strong reference -- Py_DECREF((PyObject *)code); -+ Py_DECREF(code); - - _InvokeTraceFns(info); - diff --git a/2215.patch b/2215.patch deleted file mode 100644 index 5b96cf1..0000000 --- a/2215.patch +++ /dev/null @@ -1,21 +0,0 @@ -From d40f0322e16dd3253181b65a5f10af9dcef0a845 Mon Sep 17 00:00:00 2001 -From: "Benjamin A. Beasley" -Date: Sun, 29 Jan 2023 14:19:35 -0500 -Subject: [PATCH] Add missing #include for GCC13 - ---- - pxr/base/arch/virtualMemory.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/pxr/base/arch/virtualMemory.cpp b/pxr/base/arch/virtualMemory.cpp -index 4337b8c31e..3c409fab48 100644 ---- a/pxr/base/arch/virtualMemory.cpp -+++ b/pxr/base/arch/virtualMemory.cpp -@@ -26,6 +26,7 @@ - #include "pxr/base/arch/defines.h" - #include "pxr/base/arch/systemInfo.h" - -+#include - #if defined(ARCH_OS_WINDOWS) - #include - #include diff --git a/2266.patch b/2266.patch deleted file mode 100644 index e8f1419..0000000 --- a/2266.patch +++ /dev/null @@ -1,217 +0,0 @@ -From 4b6c23d459c602fdac5e0ebc9b7722cbd5475e86 Mon Sep 17 00:00:00 2001 -From: "Benjamin A. Beasley" -Date: Sat, 11 Feb 2023 13:58:42 -0500 -Subject: [PATCH] Port to Embree 4.x - ---- - cmake/modules/FindEmbree.cmake | 16 ++++++++-------- - pxr/imaging/plugin/hdEmbree/context.h | 2 +- - pxr/imaging/plugin/hdEmbree/mesh.cpp | 2 +- - pxr/imaging/plugin/hdEmbree/mesh.h | 4 ++-- - pxr/imaging/plugin/hdEmbree/meshSamplers.h | 4 ++-- - pxr/imaging/plugin/hdEmbree/pch.h | 6 +++--- - pxr/imaging/plugin/hdEmbree/renderDelegate.h | 2 +- - pxr/imaging/plugin/hdEmbree/renderParam.h | 2 +- - pxr/imaging/plugin/hdEmbree/renderer.cpp | 8 ++------ - pxr/imaging/plugin/hdEmbree/renderer.h | 4 ++-- - .../plugin/hdEmbree/testenv/testHdEmbree.cpp | 2 +- - 11 files changed, 24 insertions(+), 28 deletions(-) - -diff --git a/cmake/modules/FindEmbree.cmake b/cmake/modules/FindEmbree.cmake -index e12639d6d9..ec13d0f5c4 100644 ---- a/cmake/modules/FindEmbree.cmake -+++ b/cmake/modules/FindEmbree.cmake -@@ -37,11 +37,11 @@ - #============================================================================= - - if (APPLE) -- set (EMBREE_LIB_NAME libembree3.dylib) -+ set (EMBREE_LIB_NAME libembree4.dylib) - elseif (UNIX) -- set (EMBREE_LIB_NAME libembree3.so) -+ set (EMBREE_LIB_NAME libembree4.so) - elseif (WIN32) -- set (EMBREE_LIB_NAME embree3.lib) -+ set (EMBREE_LIB_NAME embree4.lib) - endif() - - find_library(EMBREE_LIBRARY -@@ -56,7 +56,7 @@ find_library(EMBREE_LIBRARY - ) - - find_path(EMBREE_INCLUDE_DIR -- embree3/rtcore.h -+ embree4/rtcore.h - HINTS - "${EMBREE_LOCATION}/include" - "$ENV{EMBREE_LOCATION}/include" -@@ -64,12 +64,12 @@ DOC - "Embree headers path" - ) - --if (EMBREE_INCLUDE_DIR AND EXISTS "${EMBREE_INCLUDE_DIR}/embree3/rtcore_version.h" ) -- file(STRINGS "${EMBREE_INCLUDE_DIR}/embree3/rtcore_version.h" TMP REGEX "^#define RTC_VERSION_MAJOR.*$") -+if (EMBREE_INCLUDE_DIR AND EXISTS "${EMBREE_INCLUDE_DIR}/embree4/rtcore_version.h" ) -+ file(STRINGS "${EMBREE_INCLUDE_DIR}/embree4/rtcore_version.h" TMP REGEX "^#define RTC_VERSION_MAJOR.*$") - string(REGEX MATCHALL "[0-9]+" MAJOR ${TMP}) -- file(STRINGS "${EMBREE_INCLUDE_DIR}/embree3/rtcore_version.h" TMP REGEX "^#define RTC_VERSION_MINOR.*$") -+ file(STRINGS "${EMBREE_INCLUDE_DIR}/embree4/rtcore_version.h" TMP REGEX "^#define RTC_VERSION_MINOR.*$") - string(REGEX MATCHALL "[0-9]+" MINOR ${TMP}) -- file(STRINGS "${EMBREE_INCLUDE_DIR}/embree3/rtcore_version.h" TMP REGEX "^#define RTC_VERSION_PATCH.*$") -+ file(STRINGS "${EMBREE_INCLUDE_DIR}/embree4/rtcore_version.h" TMP REGEX "^#define RTC_VERSION_PATCH.*$") - string(REGEX MATCHALL "[0-9]+" PATCH ${TMP}) - - set (EMBREE_VERSION ${MAJOR}.${MINOR}.${PATCH}) -diff --git a/pxr/imaging/plugin/hdEmbree/context.h b/pxr/imaging/plugin/hdEmbree/context.h -index 7af4ab0d27..fb10e8ceff 100644 ---- a/pxr/imaging/plugin/hdEmbree/context.h -+++ b/pxr/imaging/plugin/hdEmbree/context.h -@@ -31,7 +31,7 @@ - #include "pxr/base/gf/matrix4f.h" - #include "pxr/base/vt/array.h" - --#include -+#include - - PXR_NAMESPACE_OPEN_SCOPE - -diff --git a/pxr/imaging/plugin/hdEmbree/mesh.cpp b/pxr/imaging/plugin/hdEmbree/mesh.cpp -index e8e001e1cc..fe0f25b7b8 100644 ---- a/pxr/imaging/plugin/hdEmbree/mesh.cpp -+++ b/pxr/imaging/plugin/hdEmbree/mesh.cpp -@@ -220,7 +220,7 @@ void HdEmbreeMesh::_EmbreeCullFaces(const RTCFilterFunctionNArguments* args) - default: break; - } - if (cull) { -- // This is how you reject a hit in embree3 instead of setting -+ // This is how you reject a hit in embree3/4 instead of setting - // geomId to invalid on the ray - args->valid[i] = 0; - } -diff --git a/pxr/imaging/plugin/hdEmbree/mesh.h b/pxr/imaging/plugin/hdEmbree/mesh.h -index 4574454368..f83bf5d998 100644 ---- a/pxr/imaging/plugin/hdEmbree/mesh.h -+++ b/pxr/imaging/plugin/hdEmbree/mesh.h -@@ -32,8 +32,8 @@ - - #include "pxr/imaging/plugin/hdEmbree/meshSamplers.h" - --#include --#include -+#include -+#include - - PXR_NAMESPACE_OPEN_SCOPE - -diff --git a/pxr/imaging/plugin/hdEmbree/meshSamplers.h b/pxr/imaging/plugin/hdEmbree/meshSamplers.h -index bef6f65959..2b481e5694 100644 ---- a/pxr/imaging/plugin/hdEmbree/meshSamplers.h -+++ b/pxr/imaging/plugin/hdEmbree/meshSamplers.h -@@ -29,8 +29,8 @@ - #include "pxr/imaging/hd/meshUtil.h" - #include "pxr/base/vt/types.h" - --#include --#include -+#include -+#include - - #include - -diff --git a/pxr/imaging/plugin/hdEmbree/pch.h b/pxr/imaging/plugin/hdEmbree/pch.h -index 7710229804..e8e733bfc4 100644 ---- a/pxr/imaging/plugin/hdEmbree/pch.h -+++ b/pxr/imaging/plugin/hdEmbree/pch.h -@@ -151,9 +151,9 @@ - #include - #include - #include --#include --#include --#include -+#include -+#include -+#include - #include - #include - #include -diff --git a/pxr/imaging/plugin/hdEmbree/renderDelegate.h b/pxr/imaging/plugin/hdEmbree/renderDelegate.h -index 20a80487a9..6a6bc9dbf1 100644 ---- a/pxr/imaging/plugin/hdEmbree/renderDelegate.h -+++ b/pxr/imaging/plugin/hdEmbree/renderDelegate.h -@@ -31,7 +31,7 @@ - #include "pxr/base/tf/staticTokens.h" - - #include --#include -+#include - - PXR_NAMESPACE_OPEN_SCOPE - -diff --git a/pxr/imaging/plugin/hdEmbree/renderParam.h b/pxr/imaging/plugin/hdEmbree/renderParam.h -index ff61000ab5..d3f903e0f3 100644 ---- a/pxr/imaging/plugin/hdEmbree/renderParam.h -+++ b/pxr/imaging/plugin/hdEmbree/renderParam.h -@@ -28,7 +28,7 @@ - #include "pxr/imaging/hd/renderDelegate.h" - #include "pxr/imaging/hd/renderThread.h" - --#include -+#include - - PXR_NAMESPACE_OPEN_SCOPE - -diff --git a/pxr/imaging/plugin/hdEmbree/renderer.cpp b/pxr/imaging/plugin/hdEmbree/renderer.cpp -index 20ec78c6aa..72a897120d 100644 ---- a/pxr/imaging/plugin/hdEmbree/renderer.cpp -+++ b/pxr/imaging/plugin/hdEmbree/renderer.cpp -@@ -650,9 +650,7 @@ HdEmbreeRenderer::_TraceRay(unsigned int x, unsigned int y, - rayHit.ray.flags = 0; - _PopulateRayHit(&rayHit, origin, dir, 0.0f); - { -- RTCIntersectContext context; -- rtcInitIntersectContext(&context); -- rtcIntersect1(_scene, &context, &rayHit); -+ rtcIntersect1(_scene, &rayHit); - // - // there is something odd about how this is used in Embree. Is it reversed - // here and then when it it used in -@@ -992,9 +990,7 @@ HdEmbreeRenderer::_ComputeAmbientOcclusion(GfVec3f const& position, - shadow.flags = 0; - _PopulateRay(&shadow, position, shadowDir, 0.001f); - { -- RTCIntersectContext context; -- rtcInitIntersectContext(&context); -- rtcOccluded1(_scene,&context,&shadow); -+ rtcOccluded1(_scene,&shadow); - } - - // Record this AO ray's contribution to the occlusion factor: a -diff --git a/pxr/imaging/plugin/hdEmbree/renderer.h b/pxr/imaging/plugin/hdEmbree/renderer.h -index 6af8081678..740812fb03 100644 ---- a/pxr/imaging/plugin/hdEmbree/renderer.h -+++ b/pxr/imaging/plugin/hdEmbree/renderer.h -@@ -32,8 +32,8 @@ - #include "pxr/base/gf/matrix4d.h" - #include "pxr/base/gf/rect2i.h" - --#include --#include -+#include -+#include - - #include - #include -diff --git a/pxr/imaging/plugin/hdEmbree/testenv/testHdEmbree.cpp b/pxr/imaging/plugin/hdEmbree/testenv/testHdEmbree.cpp -index c361c678bc..8380aebe72 100644 ---- a/pxr/imaging/plugin/hdEmbree/testenv/testHdEmbree.cpp -+++ b/pxr/imaging/plugin/hdEmbree/testenv/testHdEmbree.cpp -@@ -40,7 +40,7 @@ - - #include "pxr/base/tf/errorMark.h" - --#include -+#include - #include - - PXR_NAMESPACE_USING_DIRECTIVE diff --git a/3903.patch b/3903.patch new file mode 100644 index 0000000..d8fa15b --- /dev/null +++ b/3903.patch @@ -0,0 +1,83 @@ +From 3e51fb244dd264b09179999d29dc7c5afd7e71e3 Mon Sep 17 00:00:00 2001 +From: "Benjamin A. Beasley" +Date: Tue, 2 Dec 2025 10:43:31 +0000 +Subject: [PATCH] Backport fixes for CVE-2025-64181 etc. in OpenEXRCore + +--- + .../hioOpenEXR/OpenEXR/OpenEXRCore/chunk.c | 20 ++++++++++++++++--- + .../OpenEXR/OpenEXRCore/internal_util.h | 4 ++-- + .../OpenEXR/OpenEXRCore/parse_header.c | 4 +++- + 3 files changed, 22 insertions(+), 6 deletions(-) + +diff --git a/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/chunk.c b/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/chunk.c +index cfe80b4cd68..e11209fe660 100644 +--- a/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/chunk.c ++++ b/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/chunk.c +@@ -1292,6 +1292,16 @@ exr_read_tile_chunk_info ( + return pctxt->report_error ( + pctxt, EXR_ERR_INVALID_ARGUMENT, "Invalid packed size of 0"); + ++ if (part->comp_type == EXR_COMPRESSION_NONE && ++ cinfo->packed_size != cinfo->unpacked_size) ++ { ++ return pctxt->print_error ( ++ pctxt, ++ EXR_ERR_BAD_CHUNK_LEADER, ++ "Mismatch between unpacked and packed size with uncompressed data: packed is %" PRIu64 "; unpacked is %" PRIu64, ++ cinfo->packed_size, cinfo->unpacked_size); ++ } ++ + return EXR_ERR_SUCCESS; + } + +@@ -1350,11 +1360,15 @@ exr_read_chunk ( + rv = pctxt->do_read ( + pctxt, packed_data, toread, &dataoffset, &nread, rmode); + +- if (rmode == EXR_ALLOW_SHORT_READ && nread < (int64_t) toread) ++ if (rmode == EXR_ALLOW_SHORT_READ && ++ nread >= 0 && ++ nread < (int64_t) toread) ++ { + memset ( + ((uint8_t*) packed_data) + nread, +- 0, +- toread - (uint64_t) (nread)); ++ 0, ++ (size_t)(toread - (uint64_t)nread)); ++ } + } + else + rv = EXR_ERR_SUCCESS; +diff --git a/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/internal_util.h b/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/internal_util.h +index 3c6f02786cc..e0fa3933d92 100644 +--- a/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/internal_util.h ++++ b/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/internal_util.h +@@ -31,10 +31,10 @@ compute_sampled_height (int height, int y_sampling, int start_y) + else + start = start_y; + end = start_y + height - 1; +- end -= (end < 0) ? (-end % y_sampling) : (end % y_sampling); ++ end -= (end < 0 ? -end : end) % y_sampling; + + if (start > end) +- nlines = 0; ++ nlines = start == start_y ? 1 : 0; + else + nlines = (end - start) / y_sampling + 1; + } +diff --git a/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/parse_header.c b/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/parse_header.c +index d7230392693..8b6cf78cc59 100644 +--- a/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/parse_header.c ++++ b/pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/parse_header.c +@@ -2293,7 +2293,9 @@ internal_exr_compute_chunk_offset_size (struct _internal_exr_part* curpart) + + w = (uint64_t) (((int64_t) dw.max.x) - ((int64_t) dw.min.x) + 1); + +- if (curpart->tiles) ++ if (curpart->storage_mode != EXR_STORAGE_SCANLINE && ++ curpart->storage_mode != EXR_STORAGE_DEEP_SCANLINE && ++ curpart->tiles) + { + const exr_attr_tiledesc_t* tiledesc = curpart->tiles->tiledesc; + int64_t tilecount = 0; diff --git a/8f9bb9563980b41e7695148b63bf09f7abd38a41.patch b/8f9bb9563980b41e7695148b63bf09f7abd38a41.patch deleted file mode 100644 index fc8e60c..0000000 --- a/8f9bb9563980b41e7695148b63bf09f7abd38a41.patch +++ /dev/null @@ -1,3464 +0,0 @@ -From 8f9bb9563980b41e7695148b63bf09f7abd38a41 Mon Sep 17 00:00:00 2001 -From: gitamohr -Date: Fri, 17 Sep 2021 23:28:16 -0700 -Subject: [PATCH] hio: Update stb_image code to latest versions, enable UTF-8 - filename support for Windows. - -See #1580 - -(Internal change: 2188891) ---- - pxr/imaging/hio/stb/README | 10 +- - pxr/imaging/hio/stb/stb_image.h | 887 ++++++++++++++++------ - pxr/imaging/hio/stb/stb_image.patch | 31 +- - pxr/imaging/hio/stb/stb_image_resize.h | 119 +-- - pxr/imaging/hio/stb/stb_image_write.h | 440 +++++++---- - pxr/imaging/hio/stb/stb_image_write.patch | 15 - - pxr/imaging/hio/stbImage.cpp | 6 + - 7 files changed, 1052 insertions(+), 456 deletions(-) - delete mode 100644 pxr/imaging/hio/stb/stb_image_write.patch - -diff --git a/pxr/imaging/hio/stb/README b/pxr/imaging/hio/stb/README -index 8b81ebcaea..8d2f1263a0 100644 ---- a/pxr/imaging/hio/stb/README -+++ b/pxr/imaging/hio/stb/README -@@ -1,9 +1,11 @@ - stb_image_write - --Current version : 1.09 -+Current version : see file source versions in each .h file. - Source: https://github.com/nothings/stb - - Patch file: --- Download original source code from github --- diff -ruN stb_image_write.h > stb_image_write.patch --- diff -ruN stb_image.h > stb_image.patch -+- Download original/new source code from github. -+- Inspect current .patch file to understand local modifications. -+- Merge existing code with new code to incorporate patches. -+- Generate new patch: -+ diff -ruN stb_image.h > stb_image.patch -diff --git a/pxr/imaging/hio/stb/stb_image.h b/pxr/imaging/hio/stb/stb_image.h -index 4c2d313b5b..03ccd13da5 100644 ---- a/pxr/imaging/hio/stb/stb_image.h -+++ b/pxr/imaging/hio/stb/stb_image.h -@@ -1,4 +1,4 @@ --/* stb_image - v2.19 - public domain image loader - http://nothings.org/stb -+/* stb_image - v2.27 - public domain image loader - http://nothings.org/stb - no warranty implied; use at your own risk - - Do this: -@@ -48,6 +48,14 @@ LICENSE - - RECENT REVISION HISTORY: - -+ 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes -+ 2.26 (2020-07-13) many minor fixes -+ 2.25 (2020-02-02) fix warnings -+ 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically -+ 2.23 (2019-08-11) fix clang static analysis warning -+ 2.22 (2019-03-04) gif fixes, fix warnings -+ 2.21 (2019-02-25) fix typo in comment -+ 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings -@@ -82,25 +90,37 @@ RECENT REVISION HISTORY: - Jeremy Sawicki (handle all ImageNet JPGs) - Optimizations & bugfixes Mikhail Morozov (1-bit BMP) - Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) -- Arseny Kapoulkine -+ Arseny Kapoulkine Simon Breuss (16-bit PNM) - John-Mark Allen -+ Carmelo J Fdez-Aguera - - Bug & warning fixes -- Marc LeBlanc David Woo Guillaume George Martins Mozeiko -- Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan -- Dave Moore Roy Eltham Hayaki Saito Nathan Reed -- Won Chun Luke Graham Johan Duparc Nick Verigakis -- the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh -- Janez Zemva John Bartholomew Michal Cichon github:romigrou -- Jonathan Blow Ken Hamada Tero Hanninen github:svdijk -- Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar -- Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex -- Ryamond Barbiero Paul Du Bois Engin Manap github:grim210 -- Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw -- Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus -- Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo -- Christian Floisand Kevin Schmidt github:darealshinji -- Blazej Dariusz Roszkowski github:Michaelangel007 -+ Marc LeBlanc David Woo Guillaume George Martins Mozeiko -+ Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski -+ Phil Jordan Dave Moore Roy Eltham -+ Hayaki Saito Nathan Reed Won Chun -+ Luke Graham Johan Duparc Nick Verigakis the Horde3D community -+ Thomas Ruf Ronny Chevalier github:rlyeh -+ Janez Zemva John Bartholomew Michal Cichon github:romigrou -+ Jonathan Blow Ken Hamada Tero Hanninen github:svdijk -+ Eugene Golushkov Laurent Gomila Cort Stratton github:snagar -+ Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex -+ Cass Everitt Ryamond Barbiero github:grim210 -+ Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw -+ Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus -+ Josh Tobin Matthew Gregan github:poppolopoppo -+ Julian Raschke Gregory Mullen Christian Floisand github:darealshinji -+ Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 -+ Brad Weinberger Matvey Cherevko github:mosra -+ Luca Sas Alexander Veselov Zack Middleton [reserved] -+ Ryan C. Gordon [reserved] [reserved] -+ DO NOT ADD YOUR NAME HERE -+ -+ Jacko Dirks -+ -+ To add your name to the credits, pick a random blank space in the middle and fill it. -+ 80% of merge conflicts on stb PRs are due to people adding their name at the end -+ of the credits. - */ - - #ifndef STBI_INCLUDE_STB_IMAGE_H -@@ -159,6 +179,42 @@ RECENT REVISION HISTORY: - // - // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. - // -+// To query the width, height and component count of an image without having to -+// decode the full file, you can use the stbi_info family of functions: -+// -+// int x,y,n,ok; -+// ok = stbi_info(filename, &x, &y, &n); -+// // returns ok=1 and sets x, y, n if image is a supported format, -+// // 0 otherwise. -+// -+// Note that stb_image pervasively uses ints in its public API for sizes, -+// including sizes of memory buffers. This is now part of the API and thus -+// hard to change without causing breakage. As a result, the various image -+// loaders all have certain limits on image size; these differ somewhat -+// by format but generally boil down to either just under 2GB or just under -+// 1GB. When the decoded image would be larger than this, stb_image decoding -+// will fail. -+// -+// Additionally, stb_image will reject image files that have any of their -+// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, -+// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, -+// the only way to have an image with such dimensions load correctly -+// is for it to have a rather extreme aspect ratio. Either way, the -+// assumption here is that such larger images are likely to be malformed -+// or malicious. If you do need to load an image with individual dimensions -+// larger than that, and it still fits in the overall size limit, you can -+// #define STBI_MAX_DIMENSIONS on your own to be something larger. -+// -+// =========================================================================== -+// -+// UNICODE: -+// -+// If compiling for Windows and you wish to use Unicode filenames, compile -+// with -+// #define STBI_WINDOWS_UTF8 -+// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert -+// Windows wchar_t filenames to utf8. -+// - // =========================================================================== - // - // Philosophy -@@ -171,12 +227,12 @@ RECENT REVISION HISTORY: - // - // Sometimes I let "good performance" creep up in priority over "easy to maintain", - // and for best performance I may provide less-easy-to-use APIs that give higher --// performance, in addition to the easy to use ones. Nevertheless, it's important -+// performance, in addition to the easy-to-use ones. Nevertheless, it's important - // to keep in mind that from the standpoint of you, a client of this library, - // all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. - // - // Some secondary priorities arise directly from the first two, some of which --// make more explicit reasons why performance can't be emphasized. -+// provide more explicit reasons why performance can't be emphasized. - // - // - Portable ("ease of use") - // - Small source code footprint ("easy to maintain") -@@ -219,11 +275,10 @@ RECENT REVISION HISTORY: - // - // HDR image support (disable by defining STBI_NO_HDR) - // --// stb_image now supports loading HDR images in general, and currently --// the Radiance .HDR file format, although the support is provided --// generically. You can still load any file through the existing interface; --// if you attempt to load an HDR file, it will be automatically remapped to --// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; -+// stb_image supports loading HDR images in general, and currently the Radiance -+// .HDR file format specifically. You can still load any file through the existing -+// interface; if you attempt to load an HDR file, it will be automatically remapped -+// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; - // both of these constants can be reconfigured through this interface: - // - // stbi_hdr_to_ldr_gamma(2.2f); -@@ -255,11 +310,10 @@ RECENT REVISION HISTORY: - // - // iPhone PNG support: - // --// By default we convert iphone-formatted PNGs back to RGB, even though --// they are internally encoded differently. You can disable this conversion --// by by calling stbi_convert_iphone_png_to_rgb(0), in which case --// you will always just get the native iphone "format" through (which --// is BGR stored in RGB). -+// We optionally support converting iPhone-formatted PNGs (which store -+// premultiplied BGRA) back to RGB, even though they're internally encoded -+// differently. To enable this conversion, call -+// stbi_convert_iphone_png_to_rgb(1). - // - // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per - // pixel to remove any premultiplied alpha *only* if the image file explicitly -@@ -301,7 +355,14 @@ RECENT REVISION HISTORY: - // - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still - // want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB - // -- -+// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater -+// than that size (in either width or height) without further processing. -+// This is to let programs in the wild set an upper bound to prevent -+// denial-of-service attacks on untrusted data, as one could generate a -+// valid image of gigantic dimensions and force stb_image to allocate a -+// huge block of memory and spend disproportionate time decoding it. By -+// default this is set to (1 << 24), which is 16777216, but that's still -+// very big. - - #ifndef STBI_NO_STDIO - #include -@@ -319,6 +380,7 @@ enum - STBI_rgb_alpha = 4 - }; - -+#include - typedef unsigned char stbi_uc; - typedef unsigned short stbi_us; - -@@ -326,11 +388,13 @@ typedef unsigned short stbi_us; - extern "C" { - #endif - -+#ifndef STBIDEF - #ifdef STB_IMAGE_STATIC - #define STBIDEF static - #else - #define STBIDEF extern - #endif -+#endif - - ////////////////////////////////////////////////////////////////////////////// - // -@@ -355,10 +419,6 @@ typedef struct - - STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); --#ifndef STBI_NO_GIF --STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); --#endif -- - - #ifndef STBI_NO_STDIO - STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -@@ -366,6 +426,14 @@ STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in - // for stbi_load_from_file, file pointer is left pointing immediately after image - #endif - -+#ifndef STBI_NO_GIF -+STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -+#endif -+ -+#ifdef STBI_WINDOWS_UTF8 -+STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); -+#endif -+ - //////////////////////////////////// - // - // 16-bits-per-channel interface -@@ -413,7 +481,7 @@ STBIDEF int stbi_is_hdr_from_file(FILE *f); - - - // get a VERY brief reason for failure --// NOT THREADSAFE -+// on most compilers (and ALL modern mainstream compilers) this is threadsafe - STBIDEF const char *stbi_failure_reason (void); - - // free the loaded image -- this is just free() -@@ -446,6 +514,13 @@ STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); - // flip the image vertically, so the first pixel in the output array is the bottom left - STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); - -+// as above, but only applies to images loaded on the thread that calls the function -+// this function is only available if your compiler supports thread-local variables; -+// calling it will fail to link if your compiler doesn't -+STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); -+STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); -+STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); -+ - // ZLIB client - used by PNG, available for other purposes - - STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); -@@ -525,6 +600,12 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch - #define STBI_ASSERT(x) assert(x) - #endif - -+#ifdef __cplusplus -+#define STBI_EXTERN extern "C" -+#else -+#define STBI_EXTERN extern -+#endif -+ - - #ifndef _MSC_VER - #ifdef __cplusplus -@@ -536,6 +617,23 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch - #define stbi_inline __forceinline - #endif - -+#ifndef STBI_NO_THREAD_LOCALS -+ #if defined(__cplusplus) && __cplusplus >= 201103L -+ #define STBI_THREAD_LOCAL thread_local -+ #elif defined(__GNUC__) && __GNUC__ < 5 -+ #define STBI_THREAD_LOCAL __thread -+ #elif defined(_MSC_VER) -+ #define STBI_THREAD_LOCAL __declspec(thread) -+ #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) -+ #define STBI_THREAD_LOCAL _Thread_local -+ #endif -+ -+ #ifndef STBI_THREAD_LOCAL -+ #if defined(__GNUC__) -+ #define STBI_THREAD_LOCAL __thread -+ #endif -+ #endif -+#endif - - #ifdef _MSC_VER - typedef unsigned short stbi__uint16; -@@ -566,7 +664,7 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; - #ifdef STBI_HAS_LROTL - #define stbi_lrot(x,y) _lrotl(x,y) - #else -- #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) -+ #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) - #endif - - #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) -@@ -649,14 +747,18 @@ static int stbi__cpuid3(void) - - #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name - -+#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) - static int stbi__sse2_available(void) - { - int info3 = stbi__cpuid3(); - return ((info3 >> 26) & 1) != 0; - } -+#endif -+ - #else // assume GCC-style if not VC++ - #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) - -+#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) - static int stbi__sse2_available(void) - { - // If we're even attempting to compile this on GCC/Clang, that means -@@ -664,6 +766,8 @@ static int stbi__sse2_available(void) - // instructions at will, and so are we. - return 1; - } -+#endif -+ - #endif - #endif - -@@ -674,14 +778,21 @@ static int stbi__sse2_available(void) - - #ifdef STBI_NEON - #include --// assume GCC or Clang on ARM targets -+#ifdef _MSC_VER -+#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name -+#else - #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) - #endif -+#endif - - #ifndef STBI_SIMD_ALIGN - #define STBI_SIMD_ALIGN(type, name) type name - #endif - -+#ifndef STBI_MAX_DIMENSIONS -+#define STBI_MAX_DIMENSIONS (1 << 24) -+#endif -+ - /////////////////////////////////////////////// - // - // stbi__context struct and start_xxx functions -@@ -699,6 +810,7 @@ typedef struct - int read_from_callbacks; - int buflen; - stbi_uc buffer_start[128]; -+ int callback_already_read; - - stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original, *img_buffer_original_end; -@@ -712,6 +824,7 @@ static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) - { - s->io.read = NULL; - s->read_from_callbacks = 0; -+ s->callback_already_read = 0; - s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; - s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; - } -@@ -723,7 +836,8 @@ static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void * - s->io_user_data = user; - s->buflen = sizeof(s->buffer_start); - s->read_from_callbacks = 1; -- s->img_buffer_original = s->buffer_start; -+ s->callback_already_read = 0; -+ s->img_buffer = s->img_buffer_original = s->buffer_start; - stbi__refill_buffer(s); - s->img_buffer_original_end = s->img_buffer_end; - } -@@ -737,12 +851,17 @@ static int stbi__stdio_read(void *user, char *data, int size) - - static void stbi__stdio_skip(void *user, int n) - { -+ int ch; - fseek((FILE*) user, n, SEEK_CUR); -+ ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ -+ if (ch != EOF) { -+ ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ -+ } - } - - static int stbi__stdio_eof(void *user) - { -- return feof((FILE*) user); -+ return feof((FILE*) user) || ferror((FILE *) user); - } - - static stbi_io_callbacks stbi__stdio_callbacks = -@@ -838,21 +957,27 @@ static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); - static int stbi__pnm_test(stbi__context *s); - static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); - static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); -+static int stbi__pnm_is16(stbi__context *s); - #endif - --// this is not threadsafe --static const char *stbi__g_failure_reason; -+static -+#ifdef STBI_THREAD_LOCAL -+STBI_THREAD_LOCAL -+#endif -+const char *stbi__g_failure_reason; - - STBIDEF const char *stbi_failure_reason(void) - { - return stbi__g_failure_reason; - } - -+#ifndef STBI_NO_FAILURE_STRINGS - static int stbi__err(const char *str) - { - stbi__g_failure_reason = str; - return 0; - } -+#endif - - static void *stbi__malloc(size_t size) - { -@@ -891,11 +1016,13 @@ static int stbi__mul2sizes_valid(int a, int b) - return a <= INT_MAX/b; - } - -+#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) - // returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow - static int stbi__mad2sizes_valid(int a, int b, int add) - { - return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); - } -+#endif - - // returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow - static int stbi__mad3sizes_valid(int a, int b, int c, int add) -@@ -905,7 +1032,7 @@ static int stbi__mad3sizes_valid(int a, int b, int c, int add) - } - - // returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow --#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -+#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) - static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) - { - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && -@@ -913,12 +1040,14 @@ static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) - } - #endif - -+#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) - // mallocs with size overflow checking - static void *stbi__malloc_mad2(int a, int b, int add) - { - if (!stbi__mad2sizes_valid(a, b, add)) return NULL; - return stbi__malloc(a*b + add); - } -+#endif - - static void *stbi__malloc_mad3(int a, int b, int c, int add) - { -@@ -926,7 +1055,7 @@ static void *stbi__malloc_mad3(int a, int b, int c, int add) - return stbi__malloc(a*b*c + add); - } - --#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -+#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) - static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) - { - if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; -@@ -962,13 +1091,29 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); - static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); - #endif - --static int stbi__vertically_flip_on_load = 0; -+static int stbi__vertically_flip_on_load_global = 0; - - STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) - { -- stbi__vertically_flip_on_load = flag_true_if_should_flip; -+ stbi__vertically_flip_on_load_global = flag_true_if_should_flip; - } - -+#ifndef STBI_THREAD_LOCAL -+#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global -+#else -+static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; -+ -+STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) -+{ -+ stbi__vertically_flip_on_load_local = flag_true_if_should_flip; -+ stbi__vertically_flip_on_load_set = 1; -+} -+ -+#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ -+ ? stbi__vertically_flip_on_load_local \ -+ : stbi__vertically_flip_on_load_global) -+#endif // STBI_THREAD_LOCAL -+ - static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) - { - memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields -@@ -976,9 +1121,8 @@ static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int re - ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order - ri->num_channels = 0; - -- #ifndef STBI_NO_JPEG -- if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); -- #endif -+ // test the formats with a very explicit header first (at least a FOURCC -+ // or distinctive magic number first) - #ifndef STBI_NO_PNG - if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); - #endif -@@ -990,10 +1134,19 @@ static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int re - #endif - #ifndef STBI_NO_PSD - if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); -+ #else -+ STBI_NOTUSED(bpc); - #endif - #ifndef STBI_NO_PIC - if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); - #endif -+ -+ // then the formats that can end up attempting to load with just 1 or 2 -+ // bytes matching expectations; these are prone to false positives, so -+ // try them later -+ #ifndef STBI_NO_JPEG -+ if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); -+ #endif - #ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); - #endif -@@ -1070,6 +1223,7 @@ static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) - } - } - -+#ifndef STBI_NO_GIF - static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) - { - int slice; -@@ -1077,10 +1231,11 @@ static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int byt - - stbi_uc *bytes = (stbi_uc *)image; - for (slice = 0; slice < z; ++slice) { -- stbi__vertical_flip(bytes, w, h, bytes_per_pixel); -- bytes += slice_size; -+ stbi__vertical_flip(bytes, w, h, bytes_per_pixel); -+ bytes += slice_size; - } - } -+#endif - - static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) - { -@@ -1090,8 +1245,10 @@ static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, - if (result == NULL) - return NULL; - -+ // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. -+ STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); -+ - if (ri.bits_per_channel != 8) { -- STBI_ASSERT(ri.bits_per_channel == 16); - result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 8; - } -@@ -1114,8 +1271,10 @@ static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, - if (result == NULL) - return NULL; - -+ // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. -+ STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); -+ - if (ri.bits_per_channel != 16) { -- STBI_ASSERT(ri.bits_per_channel == 8); - result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 16; - } -@@ -1131,7 +1290,7 @@ static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, - return (stbi__uint16 *) result; - } - --#if !defined(STBI_NO_HDR) || !defined(STBI_NO_LINEAR) -+#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) - static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) - { - if (stbi__vertically_flip_on_load && result != NULL) { -@@ -1143,10 +1302,38 @@ static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, in - - #ifndef STBI_NO_STDIO - -+#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -+STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); -+STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); -+#endif -+ -+#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -+STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) -+{ -+ return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); -+} -+#endif -+ - static FILE *stbi__fopen(char const *filename, char const *mode) - { - FILE *f; -+#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -+ wchar_t wMode[64]; -+ wchar_t wFilename[1024]; -+ if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) -+ return 0; -+ -+ if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) -+ return 0; -+ - #if defined(_MSC_VER) && _MSC_VER >= 1400 -+ if (0 != _wfopen_s(&f, wFilename, wMode)) -+ f = 0; -+#else -+ f = _wfopen(wFilename, wMode); -+#endif -+ -+#elif defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f=0; - #else -@@ -1237,15 +1424,15 @@ STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *u - STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) - { - unsigned char *result; -- stbi__context s; -- stbi__start_mem(&s,buffer,len); -- -+ stbi__context s; -+ stbi__start_mem(&s,buffer,len); -+ - result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); - if (stbi__vertically_flip_on_load) { -- stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); -+ stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); - } - -- return result; -+ return result; - } - #endif - -@@ -1390,6 +1577,7 @@ enum - static void stbi__refill_buffer(stbi__context *s) - { - int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); -+ s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); - if (n == 0) { - // at end of file, treat same as if from memory, but need to handle case - // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file -@@ -1414,6 +1602,9 @@ stbi_inline static stbi_uc stbi__get8(stbi__context *s) - return 0; - } - -+#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -+// nothing -+#else - stbi_inline static int stbi__at_eof(stbi__context *s) - { - if (s->io.read) { -@@ -1425,9 +1616,14 @@ stbi_inline static int stbi__at_eof(stbi__context *s) - - return s->img_buffer >= s->img_buffer_end; - } -+#endif - -+#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) -+// nothing -+#else - static void stbi__skip(stbi__context *s, int n) - { -+ if (n == 0) return; // already there! - if (n < 0) { - s->img_buffer = s->img_buffer_end; - return; -@@ -1442,7 +1638,11 @@ static void stbi__skip(stbi__context *s, int n) - } - s->img_buffer += n; - } -+#endif - -+#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) -+// nothing -+#else - static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) - { - if (s->io.read) { -@@ -1466,18 +1666,27 @@ static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) - } else - return 0; - } -+#endif - -+#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) -+// nothing -+#else - static int stbi__get16be(stbi__context *s) - { - int z = stbi__get8(s); - return (z << 8) + stbi__get8(s); - } -+#endif - -+#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) -+// nothing -+#else - static stbi__uint32 stbi__get32be(stbi__context *s) - { - stbi__uint32 z = stbi__get16be(s); - return (z << 16) + stbi__get16be(s); - } -+#endif - - #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) - // nothing -@@ -1493,13 +1702,16 @@ static int stbi__get16le(stbi__context *s) - static stbi__uint32 stbi__get32le(stbi__context *s) - { - stbi__uint32 z = stbi__get16le(s); -- return z + (stbi__get16le(s) << 16); -+ z += (stbi__uint32)stbi__get16le(s) << 16; -+ return z; - } - #endif - - #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings - -- -+#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -+// nothing -+#else - ////////////////////////////////////////////////////////////////////////////// - // - // generic converter from built-in img_n to req_comp -@@ -1515,7 +1727,11 @@ static stbi_uc stbi__compute_y(int r, int g, int b) - { - return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); - } -+#endif - -+#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -+// nothing -+#else - static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) - { - int i,j; -@@ -1539,19 +1755,19 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { -- STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; -+ STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; -- STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; -+ STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; -- STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; -- STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; -+ STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; -+ STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; -- STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; -+ STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; -- STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; -- STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; -- default: STBI_ASSERT(0); -+ STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; -+ STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; -+ default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); - } - #undef STBI__CASE - } -@@ -1559,12 +1775,20 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r - STBI_FREE(data); - return good; - } -+#endif - -+#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) -+// nothing -+#else - static stbi__uint16 stbi__compute_y_16(int r, int g, int b) - { - return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); - } -+#endif - -+#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) -+// nothing -+#else - static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) - { - int i,j; -@@ -1588,19 +1812,19 @@ static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int r - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { -- STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; -+ STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; -- STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; -+ STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; -- STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; -- STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; -+ STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; -+ STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; -- STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; -+ STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; -- STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; -- STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; -- default: STBI_ASSERT(0); -+ STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; -+ STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; -+ default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); - } - #undef STBI__CASE - } -@@ -1608,6 +1832,7 @@ static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int r - STBI_FREE(data); - return good; - } -+#endif - - #ifndef STBI_NO_LINEAR - static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) -@@ -1623,7 +1848,11 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) - for (k=0; k < n; ++k) { - output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); - } -- if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; -+ } -+ if (n < comp) { -+ for (i=0; i < x*y; ++i) { -+ output[i*comp + n] = data[i*comp + n]/255.0f; -+ } - } - STBI_FREE(data); - return output; -@@ -1902,13 +2131,12 @@ stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n) - int sgn; - if (j->code_bits < n) stbi__grow_buffer_unsafe(j); - -- sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB -+ sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) - k = stbi_lrot(j->code_buffer, n); -- STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; -- return k + (stbi__jbias[n] & ~sgn); -+ return k + (stbi__jbias[n] & (sgn - 1)); - } - - // get some unsigned bits -@@ -1958,7 +2186,7 @@ static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - t = stbi__jpeg_huff_decode(j, hdc); -- if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); -+ if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); - - // 0 all the ac values now so we can do it 32-bits at a time - memset(data,0,64*sizeof(data[0])); -@@ -2015,11 +2243,12 @@ static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__ - // first scan for DC coefficient, must be first - memset(data,0,64*sizeof(data[0])); // 0 all the ac values now - t = stbi__jpeg_huff_decode(j, hdc); -+ if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - diff = t ? stbi__extend_receive(j, t) : 0; - - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; -- data[0] = (short) (dc << j->succ_low); -+ data[0] = (short) (dc * (1 << j->succ_low)); - } else { - // refinement scan for DC coefficient - if (stbi__jpeg_get_bit(j)) -@@ -2056,7 +2285,7 @@ static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__ - j->code_buffer <<= s; - j->code_bits -= s; - zig = stbi__jpeg_dezigzag[k++]; -- data[zig] = (short) ((r >> 8) << shift); -+ data[zig] = (short) ((r >> 8) * (1 << shift)); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); -@@ -2074,7 +2303,7 @@ static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__ - } else { - k += r; - zig = stbi__jpeg_dezigzag[k++]; -- data[zig] = (short) (stbi__extend_receive(j,s) << shift); -+ data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); - } - } - } while (k <= j->spec_end); -@@ -3005,6 +3234,8 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) - p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline - s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG - s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires -+ if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); -+ if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - c = stbi__get8(s); - if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); - s->img_n = c; -@@ -3036,6 +3267,13 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) - if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; - } - -+ // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios -+ // and I've never seen a non-corrupted JPEG file actually use them -+ for (i=0; i < s->img_n; ++i) { -+ if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); -+ if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); -+ } -+ - // compute interleaved mcu info - z->img_h_max = h_max; - z->img_v_max = v_max; -@@ -3591,12 +3829,16 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp - else - decode_n = z->s->img_n; - -+ // nothing to do if no components requested; check this now to avoid -+ // accessing uninitialized coutput[0] later -+ if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } -+ - // resample and color-convert - { - int k; - unsigned int i,j; - stbi_uc *output; -- stbi_uc *coutput[4]; -+ stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; - - stbi__resample res_comp[4]; - -@@ -3717,7 +3959,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else -- for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; -+ for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } - } - } - } -@@ -3733,6 +3975,7 @@ static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int re - { - unsigned char* result; - stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); -+ if (!j) return stbi__errpuc("outofmem", "Out of memory"); - STBI_NOTUSED(ri); - j->s = s; - stbi__setup_jpeg(j); -@@ -3745,6 +3988,7 @@ static int stbi__jpeg_test(stbi__context *s) - { - int r; - stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); -+ if (!j) return stbi__err("outofmem", "Out of memory"); - j->s = s; - stbi__setup_jpeg(j); - r = stbi__decode_jpeg_header(j, STBI__SCAN_type); -@@ -3769,6 +4013,7 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) - { - int result; - stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); -+ if (!j) return stbi__err("outofmem", "Out of memory"); - j->s = s; - result = stbi__jpeg_info_raw(j, x, y, comp); - STBI_FREE(j); -@@ -3788,6 +4033,7 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) - // fast-way is faster to check than jpeg huffman, but slow way is slower - #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables - #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) -+#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet - - // zlib-style huffman encoding - // (jpegs packs from left, zlib from right, so can't share code) -@@ -3797,8 +4043,8 @@ typedef struct - stbi__uint16 firstcode[16]; - int maxcode[17]; - stbi__uint16 firstsymbol[16]; -- stbi_uc size[288]; -- stbi__uint16 value[288]; -+ stbi_uc size[STBI__ZNSYMS]; -+ stbi__uint16 value[STBI__ZNSYMS]; - } stbi__zhuffman; - - stbi_inline static int stbi__bitreverse16(int n) -@@ -3885,16 +4131,23 @@ typedef struct - stbi__zhuffman z_length, z_distance; - } stbi__zbuf; - -+stbi_inline static int stbi__zeof(stbi__zbuf *z) -+{ -+ return (z->zbuffer >= z->zbuffer_end); -+} -+ - stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) - { -- if (z->zbuffer >= z->zbuffer_end) return 0; -- return *z->zbuffer++; -+ return stbi__zeof(z) ? 0 : *z->zbuffer++; - } - - static void stbi__fill_bits(stbi__zbuf *z) - { - do { -- STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); -+ if (z->code_buffer >= (1U << z->num_bits)) { -+ z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ -+ return; -+ } - z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; - z->num_bits += 8; - } while (z->num_bits <= 24); -@@ -3919,10 +4172,11 @@ static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) - for (s=STBI__ZFAST_BITS+1; ; ++s) - if (k < z->maxcode[s]) - break; -- if (s == 16) return -1; // invalid code! -+ if (s >= 16) return -1; // invalid code! - // code size is s, so: - b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; -- STBI_ASSERT(z->size[b] == s); -+ if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! -+ if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; -@@ -3931,7 +4185,12 @@ static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) - stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) - { - int b,s; -- if (a->num_bits < 16) stbi__fill_bits(a); -+ if (a->num_bits < 16) { -+ if (stbi__zeof(a)) { -+ return -1; /* report error for unexpected end of data. */ -+ } -+ stbi__fill_bits(a); -+ } - b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; - if (b) { - s = b >> 9; -@@ -3945,13 +4204,16 @@ stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) - static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes - { - char *q; -- int cur, limit, old_limit; -+ unsigned int cur, limit, old_limit; - z->zout = zout; - if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); -- cur = (int) (z->zout - z->zout_start); -- limit = old_limit = (int) (z->zout_end - z->zout_start); -- while (cur + n > limit) -+ cur = (unsigned int) (z->zout - z->zout_start); -+ limit = old_limit = (unsigned) (z->zout_end - z->zout_start); -+ if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); -+ while (cur + n > limit) { -+ if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); - limit *= 2; -+ } - q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); - STBI_NOTUSED(old_limit); - if (q == NULL) return stbi__err("outofmem", "Out of memory"); -@@ -4049,11 +4311,12 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) - c = stbi__zreceive(a,2)+3; - if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); - fill = lencodes[n-1]; -- } else if (c == 17) -+ } else if (c == 17) { - c = stbi__zreceive(a,3)+3; -- else { -- STBI_ASSERT(c == 18); -+ } else if (c == 18) { - c = stbi__zreceive(a,7)+11; -+ } else { -+ return stbi__err("bad codelengths", "Corrupt PNG"); - } - if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); - memset(lencodes+n, fill, c); -@@ -4079,7 +4342,7 @@ static int stbi__parse_uncompressed_block(stbi__zbuf *a) - a->code_buffer >>= 8; - a->num_bits -= 8; - } -- STBI_ASSERT(a->num_bits == 0); -+ if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); - // now fill header the normal way - while (k < 4) - header[k++] = stbi__zget8(a); -@@ -4101,6 +4364,7 @@ static int stbi__parse_zlib_header(stbi__zbuf *a) - int cm = cmf & 15; - /* int cinfo = cmf >> 4; */ - int flg = stbi__zget8(a); -+ if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png - if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png -@@ -4108,7 +4372,7 @@ static int stbi__parse_zlib_header(stbi__zbuf *a) - return 1; - } - --static const stbi_uc stbi__zdefault_length[288] = -+static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = - { - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -@@ -4154,7 +4418,7 @@ static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) - } else { - if (type == 1) { - // use fixed code lengths -- if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; -+ if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; - } else { - if (!stbi__compute_huffman_codes(a)) return 0; -@@ -4363,7 +4627,7 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r - return stbi__err("invalid filter","Corrupt PNG"); - - if (depth < 8) { -- STBI_ASSERT(img_width_bytes <= x); -+ if (img_width_bytes > x) return stbi__err("invalid width","Corrupt PNG"); - cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place - filter_bytes = 1; - width = img_width_bytes; -@@ -4551,6 +4815,7 @@ static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint3 - - // de-interlacing - final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); -+ if (!final) return stbi__err("outofmem", "Out of memory"); - for (p=0; p < 7; ++p) { - int xorig[] = { 0,4,0,2,0,1,0 }; - int yorig[] = { 0,0,4,0,2,0,1 }; -@@ -4671,19 +4936,46 @@ static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int - return 1; - } - --static int stbi__unpremultiply_on_load = 0; --static int stbi__de_iphone_flag = 0; -+static int stbi__unpremultiply_on_load_global = 0; -+static int stbi__de_iphone_flag_global = 0; - - STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) - { -- stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; -+ stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; - } - - STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) - { -- stbi__de_iphone_flag = flag_true_if_should_convert; -+ stbi__de_iphone_flag_global = flag_true_if_should_convert; -+} -+ -+#ifndef STBI_THREAD_LOCAL -+#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global -+#define stbi__de_iphone_flag stbi__de_iphone_flag_global -+#else -+static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; -+static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; -+ -+STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) -+{ -+ stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; -+ stbi__unpremultiply_on_load_set = 1; - } - -+STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) -+{ -+ stbi__de_iphone_flag_local = flag_true_if_should_convert; -+ stbi__de_iphone_flag_set = 1; -+} -+ -+#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ -+ ? stbi__unpremultiply_on_load_local \ -+ : stbi__unpremultiply_on_load_global) -+#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ -+ ? stbi__de_iphone_flag_local \ -+ : stbi__de_iphone_flag_global) -+#endif // STBI_THREAD_LOCAL -+ - static void stbi__de_iphone(stbi__png *z) - { - stbi__context *s = z->s; -@@ -4732,7 +5024,7 @@ static void stbi__de_iphone(stbi__png *z) - static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) - { - stbi_uc palette[1024], pal_img_n=0; -- stbi_uc has_trans=0, tc[3]; -+ stbi_uc has_trans=0, tc[3]={0}; - stbi__uint16 tc16[3]; - stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, color=0, is_iphone=0; -@@ -4758,8 +5050,10 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) - if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); - first = 0; - if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); -- s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); -- s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); -+ s->img_x = stbi__get32be(s); -+ s->img_y = stbi__get32be(s); -+ if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); -+ if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); - color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); -@@ -4883,6 +5177,8 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) - ++s->img_n; - } - STBI_FREE(z->expanded); z->expanded = NULL; -+ // end of PNG chunk, read and skip CRC -+ stbi__get32be(s); - return 1; - } - -@@ -4913,10 +5209,12 @@ static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, st - void *result=NULL; - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { -- if (p->depth < 8) -+ if (p->depth <= 8) - ri->bits_per_channel = 8; -+ else if (p->depth == 16) -+ ri->bits_per_channel = 16; - else -- ri->bits_per_channel = p->depth; -+ return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); - result = p->out; - p->out = NULL; - if (req_comp && req_comp != p->s->img_out_n) { -@@ -5018,11 +5316,11 @@ static int stbi__high_bit(unsigned int z) - { - int n=0; - if (z == 0) return -1; -- if (z >= 0x10000) n += 16, z >>= 16; -- if (z >= 0x00100) n += 8, z >>= 8; -- if (z >= 0x00010) n += 4, z >>= 4; -- if (z >= 0x00004) n += 2, z >>= 2; -- if (z >= 0x00002) n += 1, z >>= 1; -+ if (z >= 0x10000) { n += 16; z >>= 16; } -+ if (z >= 0x00100) { n += 8; z >>= 8; } -+ if (z >= 0x00010) { n += 4; z >>= 4; } -+ if (z >= 0x00004) { n += 2; z >>= 2; } -+ if (z >= 0x00002) { n += 1;/* >>= 1;*/ } - return n; - } - -@@ -5039,7 +5337,7 @@ static int stbi__bitcount(unsigned int a) - // extract an arbitrarily-aligned N-bit value (N=bits) - // from v, and then make it 8-bits long and fractionally - // extend it to full full range. --static int stbi__shiftsigned(int v, int shift, int bits) -+static int stbi__shiftsigned(unsigned int v, int shift, int bits) - { - static unsigned int mul_table[9] = { - 0, -@@ -5053,7 +5351,7 @@ static int stbi__shiftsigned(int v, int shift, int bits) - v <<= -shift; - else - v >>= shift; -- STBI_ASSERT(v >= 0 && v < 256); -+ STBI_ASSERT(v < 256); - v >>= (8-bits); - STBI_ASSERT(bits >= 0 && bits <= 8); - return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; -@@ -5063,8 +5361,35 @@ typedef struct - { - int bpp, offset, hsz; - unsigned int mr,mg,mb,ma, all_a; -+ int extra_read; - } stbi__bmp_data; - -+static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) -+{ -+ // BI_BITFIELDS specifies masks explicitly, don't override -+ if (compress == 3) -+ return 1; -+ -+ if (compress == 0) { -+ if (info->bpp == 16) { -+ info->mr = 31u << 10; -+ info->mg = 31u << 5; -+ info->mb = 31u << 0; -+ } else if (info->bpp == 32) { -+ info->mr = 0xffu << 16; -+ info->mg = 0xffu << 8; -+ info->mb = 0xffu << 0; -+ info->ma = 0xffu << 24; -+ info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 -+ } else { -+ // otherwise, use defaults, which is all-0 -+ info->mr = info->mg = info->mb = info->ma = 0; -+ } -+ return 1; -+ } -+ return 0; // error -+} -+ - static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) - { - int hsz; -@@ -5075,6 +5400,9 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) - info->offset = stbi__get32le(s); - info->hsz = hsz = stbi__get32le(s); - info->mr = info->mg = info->mb = info->ma = 0; -+ info->extra_read = 14; -+ -+ if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); - - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); - if (hsz == 12) { -@@ -5089,6 +5417,8 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) - if (hsz != 12) { - int compress = stbi__get32le(s); - if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); -+ if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes -+ if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel - stbi__get32le(s); // discard sizeof - stbi__get32le(s); // discard hres - stbi__get32le(s); // discard vres -@@ -5103,21 +5433,12 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) - } - if (info->bpp == 16 || info->bpp == 32) { - if (compress == 0) { -- if (info->bpp == 32) { -- info->mr = 0xffu << 16; -- info->mg = 0xffu << 8; -- info->mb = 0xffu << 0; -- info->ma = 0xffu << 24; -- info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 -- } else { -- info->mr = 31u << 10; -- info->mg = 31u << 5; -- info->mb = 31u << 0; -- } -+ stbi__bmp_set_mask_defaults(info, compress); - } else if (compress == 3) { - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); -+ info->extra_read += 12; - // not documented, but generated by photoshop and handled by mspaint - if (info->mr == info->mg && info->mg == info->mb) { - // ?!?!? -@@ -5127,6 +5448,7 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else { -+ // V4/V5 header - int i; - if (hsz != 108 && hsz != 124) - return stbi__errpuc("bad BMP", "bad BMP"); -@@ -5134,6 +5456,8 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->ma = stbi__get32le(s); -+ if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs -+ stbi__bmp_set_mask_defaults(info, compress); - stbi__get32le(s); // discard color space - for (i=0; i < 12; ++i) - stbi__get32le(s); // discard color space parameters -@@ -5166,6 +5490,9 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - -+ if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); -+ if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); -+ - mr = info.mr; - mg = info.mg; - mb = info.mb; -@@ -5174,13 +5501,21 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req - - if (info.hsz == 12) { - if (info.bpp < 24) -- psize = (info.offset - 14 - 24) / 3; -+ psize = (info.offset - info.extra_read - 24) / 3; - } else { - if (info.bpp < 16) -- psize = (info.offset - 14 - info.hsz) >> 2; -+ psize = (info.offset - info.extra_read - info.hsz) >> 2; -+ } -+ if (psize == 0) { -+ if (info.offset != s->callback_already_read + (s->img_buffer - s->img_buffer_original)) { -+ return stbi__errpuc("bad offset", "Corrupt BMP"); -+ } - } - -- s->img_n = ma ? 4 : 3; -+ if (info.bpp == 24 && ma == 0xff000000) -+ s->img_n = 3; -+ else -+ s->img_n = ma ? 4 : 3; - if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 - target = req_comp; - else -@@ -5202,7 +5537,7 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req - if (info.hsz != 12) stbi__get8(s); - pal[i][3] = 255; - } -- stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); -+ stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); - if (info.bpp == 1) width = (s->img_x + 7) >> 3; - else if (info.bpp == 4) width = (s->img_x + 1) >> 1; - else if (info.bpp == 8) width = s->img_x; -@@ -5216,6 +5551,8 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req - out[z++] = pal[color][0]; - out[z++] = pal[color][1]; - out[z++] = pal[color][2]; -+ if (target == 4) out[z++] = 255; -+ if (i+1 == (int) s->img_x) break; - if((--bit_offset) < 0) { - bit_offset = 7; - v = stbi__get8(s); -@@ -5249,7 +5586,7 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req - int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; - int z = 0; - int easy=0; -- stbi__skip(s, info.offset - 14 - info.hsz); -+ stbi__skip(s, info.offset - info.extra_read - info.hsz); - if (info.bpp == 24) width = 3 * s->img_x; - else if (info.bpp == 16) width = 2*s->img_x; - else /* bpp = 32 and pad = 0 */ width=0; -@@ -5267,6 +5604,7 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req - gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); - bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); - ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); -+ if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } - } - for (j=0; j < (int) s->img_y; ++j) { - if (easy) { -@@ -5308,7 +5646,7 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req - stbi_uc *p1 = out + j *s->img_x*target; - stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; - for (i=0; i < (int) s->img_x*target; ++i) { -- t = p1[i], p1[i] = p2[i], p2[i] = t; -+ t = p1[i]; p1[i] = p2[i]; p2[i] = t; - } - } - } -@@ -5488,6 +5826,11 @@ static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req - int RLE_repeating = 0; - int read_next_pixel = 1; - STBI_NOTUSED(ri); -+ STBI_NOTUSED(tga_x_origin); // @TODO -+ STBI_NOTUSED(tga_y_origin); // @TODO -+ -+ if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); -+ if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - // do a tiny bit of precessing - if ( tga_image_type >= 8 ) -@@ -5528,6 +5871,11 @@ static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req - // do I need to load a palette? - if ( tga_indexed) - { -+ if (tga_palette_len == 0) { /* you have to have at least one entry! */ -+ STBI_FREE(tga_data); -+ return stbi__errpuc("bad palette", "Corrupt TGA"); -+ } -+ - // any data to skip? (offset usually = 0) - stbi__skip(s, tga_palette_start ); - // load the palette -@@ -5651,6 +5999,7 @@ static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req - // Microsoft's C compilers happy... [8^( - tga_palette_start = tga_palette_len = tga_palette_bits = - tga_x_origin = tga_y_origin = 0; -+ STBI_NOTUSED(tga_palette_start); - // OK, done - return tga_data; - } -@@ -5735,6 +6084,9 @@ static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req - h = stbi__get32be(s); - w = stbi__get32be(s); - -+ if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); -+ if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); -+ - // Make sure the depth is 8 bits. - bitdepth = stbi__get16be(s); - if (bitdepth != 8 && bitdepth != 16) -@@ -5798,7 +6150,7 @@ static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req - // Else if n is 128, noop. - // Endloop - -- // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, -+ // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, - // which we're going to just skip. - stbi__skip(s, h * channelCount * 2 ); - -@@ -6089,6 +6441,10 @@ static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_c - - x = stbi__get16be(s); - y = stbi__get16be(s); -+ -+ if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); -+ if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); -+ - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); - if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); - -@@ -6098,6 +6454,7 @@ static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_c - - // intermediate buffer is RGBA - result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); -+ if (!result) return stbi__errpuc("outofmem", "Out of memory"); - memset(result, 0xff, x*y*4); - - if (!stbi__pic_load_core(s,x,y,comp, result)) { -@@ -6136,7 +6493,7 @@ typedef struct - int w,h; - stbi_uc *out; // output buffer (always 4 components) - stbi_uc *background; // The current "background" as far as a gif is concerned -- stbi_uc *history; -+ stbi_uc *history; - int flags, bgindex, ratio, transparent, eflags; - stbi_uc pal[256][4]; - stbi_uc lpal[256][4]; -@@ -6197,6 +6554,9 @@ static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_in - g->ratio = stbi__get8(s); - g->transparent = -1; - -+ if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); -+ if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); -+ - if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments - - if (is_info) return 1; -@@ -6210,6 +6570,7 @@ static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_in - static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) - { - stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); -+ if (!g) return stbi__err("outofmem", "Out of memory"); - if (!stbi__gif_header(s, g, comp, 1)) { - STBI_FREE(g); - stbi__rewind( s ); -@@ -6224,7 +6585,7 @@ static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) - static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) - { - stbi_uc *p, *c; -- int idx; -+ int idx; - - // recurse to decode the prefixes, since the linked-list is backwards, - // and working backwards through an interleaved image would be nasty -@@ -6233,12 +6594,12 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) - - if (g->cur_y >= g->max_y) return; - -- idx = g->cur_x + g->cur_y; -+ idx = g->cur_x + g->cur_y; - p = &g->out[idx]; -- g->history[idx / 4] = 1; -+ g->history[idx / 4] = 1; - - c = &g->color_table[g->codes[code].suffix * 4]; -- if (c[3] > 128) { // don't render transparent pixels; -+ if (c[3] > 128) { // don't render transparent pixels; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; -@@ -6347,31 +6708,36 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) - // two back is the image from two frames ago, used for a very specific disposal format - static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) - { -- int dispose; -- int first_frame; -- int pi; -- int pcount; -+ int dispose; -+ int first_frame; -+ int pi; -+ int pcount; -+ STBI_NOTUSED(req_comp); - - // on first frame, any non-written pixels get the background colour (non-transparent) -- first_frame = 0; -+ first_frame = 0; - if (g->out == 0) { -- if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header -- g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); -- g->background = (stbi_uc *) stbi__malloc(4 * g->w * g->h); -- g->history = (stbi_uc *) stbi__malloc(g->w * g->h); -- if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); -- -- // image is treated as "tranparent" at the start - ie, nothing overwrites the current background; -+ if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header -+ if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) -+ return stbi__errpuc("too large", "GIF image is too large"); -+ pcount = g->w * g->h; -+ g->out = (stbi_uc *) stbi__malloc(4 * pcount); -+ g->background = (stbi_uc *) stbi__malloc(4 * pcount); -+ g->history = (stbi_uc *) stbi__malloc(pcount); -+ if (!g->out || !g->background || !g->history) -+ return stbi__errpuc("outofmem", "Out of memory"); -+ -+ // image is treated as "transparent" at the start - ie, nothing overwrites the current background; - // background colour is only used for pixels that are not rendered first frame, after that "background" -- // color refers to teh color that was there the previous frame. -- memset( g->out, 0x00, 4 * g->w * g->h ); -- memset( g->background, 0x00, 4 * g->w * g->h ); // state of the background (starts transparent) -- memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame -- first_frame = 1; -+ // color refers to the color that was there the previous frame. -+ memset(g->out, 0x00, 4 * pcount); -+ memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) -+ memset(g->history, 0x00, pcount); // pixels that were affected previous frame -+ first_frame = 1; - } else { -- // second frame - how do we dispoase of the previous one? -- dispose = (g->eflags & 0x1C) >> 2; -- pcount = g->w * g->h; -+ // second frame - how do we dispose of the previous one? -+ dispose = (g->eflags & 0x1C) >> 2; -+ pcount = g->w * g->h; - - if ((dispose == 3) && (two_back == 0)) { - dispose = 2; // if I don't have an image to revert back to, default to the old background -@@ -6380,32 +6746,32 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i - if (dispose == 3) { // use previous graphic - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { -- memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); -+ memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); - } - } -- } else if (dispose == 2) { -- // restore what was changed last frame to background before that frame; -+ } else if (dispose == 2) { -+ // restore what was changed last frame to background before that frame; - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { -- memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); -+ memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); - } - } - } else { -- // This is a non-disposal case eithe way, so just -+ // This is a non-disposal case eithe way, so just - // leave the pixels as is, and they will become the new background - // 1: do not dispose - // 0: not specified. - } - -- // background is what out is after the undoing of the previou frame; -- memcpy( g->background, g->out, 4 * g->w * g->h ); -+ // background is what out is after the undoing of the previou frame; -+ memcpy( g->background, g->out, 4 * g->w * g->h ); - } - -- // clear my history; -+ // clear my history; - memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame - - for (;;) { -- int tag = stbi__get8(s); -+ int tag = stbi__get8(s); - switch (tag) { - case 0x2C: /* Image Descriptor */ - { -@@ -6427,6 +6793,13 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i - g->cur_x = g->start_x; - g->cur_y = g->start_y; - -+ // if the width of the specified rectangle is 0, that means -+ // we may not see *any* pixels or the image is malformed; -+ // to make sure this is caught, move the current y down to -+ // max_y (which is what out_gif_code checks). -+ if (w == 0) -+ g->cur_y = g->max_y; -+ - g->lflags = stbi__get8(s); - - if (g->lflags & 0x40) { -@@ -6443,19 +6816,19 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i - } else if (g->flags & 0x80) { - g->color_table = (stbi_uc *) g->pal; - } else -- return stbi__errpuc("missing color table", "Corrupt GIF"); -- -+ return stbi__errpuc("missing color table", "Corrupt GIF"); -+ - o = stbi__process_gif_raster(s, g); -- if (o == NULL) return NULL; -+ if (!o) return NULL; - -- // if this was the first frame, -- pcount = g->w * g->h; -+ // if this was the first frame, -+ pcount = g->w * g->h; - if (first_frame && (g->bgindex > 0)) { - // if first frame, any pixel not drawn to gets the background color - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi] == 0) { -- g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; -- memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); -+ g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; -+ memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); - } - } - } -@@ -6466,7 +6839,7 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i - case 0x21: // Comment Extension. - { - int len; -- int ext = stbi__get8(s); -+ int ext = stbi__get8(s); - if (ext == 0xF9) { // Graphic Control Extension. - len = stbi__get8(s); - if (len == 4) { -@@ -6475,23 +6848,23 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i - - // unset old transparent - if (g->transparent >= 0) { -- g->pal[g->transparent][3] = 255; -- } -+ g->pal[g->transparent][3] = 255; -+ } - if (g->eflags & 0x01) { - g->transparent = stbi__get8(s); - if (g->transparent >= 0) { -- g->pal[g->transparent][3] = 0; -+ g->pal[g->transparent][3] = 0; - } - } else { - // don't need transparent -- stbi__skip(s, 1); -- g->transparent = -1; -+ stbi__skip(s, 1); -+ g->transparent = -1; - } - } else { - stbi__skip(s, len); - break; - } -- } -+ } - while ((len = stbi__get8(s)) != 0) { - stbi__skip(s, len); - } -@@ -6507,18 +6880,35 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i - } - } - -+static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) -+{ -+ STBI_FREE(g->out); -+ STBI_FREE(g->history); -+ STBI_FREE(g->background); -+ -+ if (out) STBI_FREE(out); -+ if (delays && *delays) STBI_FREE(*delays); -+ return stbi__errpuc("outofmem", "Out of memory"); -+} -+ - static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) - { - if (stbi__gif_test(s)) { -- int layers = 0; -+ int layers = 0; - stbi_uc *u = 0; - stbi_uc *out = 0; -- stbi_uc *two_back = 0; -+ stbi_uc *two_back = 0; - stbi__gif g; -- int stride; -+ int stride; -+ int out_size = 0; -+ int delays_size = 0; -+ -+ STBI_NOTUSED(out_size); -+ STBI_NOTUSED(delays_size); -+ - memset(&g, 0, sizeof(g)); - if (delays) { -- *delays = 0; -+ *delays = 0; - } - - do { -@@ -6528,44 +6918,61 @@ static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, - if (u) { - *x = g.w; - *y = g.h; -- ++layers; -- stride = g.w * g.h * 4; -- -+ ++layers; -+ stride = g.w * g.h * 4; -+ - if (out) { -- out = (stbi_uc*) STBI_REALLOC( out, layers * stride ); -+ void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); -+ if (!tmp) -+ return stbi__load_gif_main_outofmem(&g, out, delays); -+ else { -+ out = (stbi_uc*) tmp; -+ out_size = layers * stride; -+ } -+ - if (delays) { -- *delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers ); -+ int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); -+ if (!new_delays) -+ return stbi__load_gif_main_outofmem(&g, out, delays); -+ *delays = new_delays; -+ delays_size = layers * sizeof(int); - } - } else { -- out = (stbi_uc*)stbi__malloc( layers * stride ); -+ out = (stbi_uc*)stbi__malloc( layers * stride ); -+ if (!out) -+ return stbi__load_gif_main_outofmem(&g, out, delays); -+ out_size = layers * stride; - if (delays) { -- *delays = (int*) stbi__malloc( layers * sizeof(int) ); -+ *delays = (int*) stbi__malloc( layers * sizeof(int) ); -+ if (!*delays) -+ return stbi__load_gif_main_outofmem(&g, out, delays); -+ delays_size = layers * sizeof(int); - } - } -- memcpy( out + ((layers - 1) * stride), u, stride ); -+ memcpy( out + ((layers - 1) * stride), u, stride ); - if (layers >= 2) { -- two_back = out - 2 * stride; -+ two_back = out - 2 * stride; - } - - if (delays) { -- (*delays)[layers - 1U] = g.delay; -+ (*delays)[layers - 1U] = g.delay; - } - } -- } while (u != 0); -+ } while (u != 0); - -- // free temp buffer; -- STBI_FREE(g.out); -- STBI_FREE(g.history); -- STBI_FREE(g.background); -+ // free temp buffer; -+ STBI_FREE(g.out); -+ STBI_FREE(g.history); -+ STBI_FREE(g.background); - -- // do the final conversion after loading everything; -+ // do the final conversion after loading everything; - if (req_comp && req_comp != 4) - out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); - -- *z = layers; -+ *z = layers; - return out; - } else { -- return stbi__errpuc("not GIF", "Image was not as a gif type."); -+ return stbi__errpuc("not GIF", "Image was not as a gif type."); - } - } - -@@ -6574,6 +6981,7 @@ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req - stbi_uc *u = 0; - stbi__gif g; - memset(&g, 0, sizeof(g)); -+ STBI_NOTUSED(ri); - - u = stbi__gif_load_next(s, &g, comp, req_comp, 0); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker -@@ -6582,14 +6990,17 @@ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req - *y = g.h; - - // moved conversion to after successful load so that the same -- // can be done for multiple frames. -+ // can be done for multiple frames. - if (req_comp && req_comp != 4) - u = stbi__convert_format(u, 4, req_comp, g.w, g.h); -+ } else if (g.out) { -+ // if there was an error and we allocated an image buffer, free it! -+ STBI_FREE(g.out); - } - -- // free buffers needed for multiple frame loading; -+ // free buffers needed for multiple frame loading; - STBI_FREE(g.history); -- STBI_FREE(g.background); -+ STBI_FREE(g.background); - - return u; - } -@@ -6714,6 +7125,9 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re - token += 3; - width = (int) strtol(token, NULL, 10); - -+ if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); -+ if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); -+ - *x = width; - *y = height; - -@@ -6856,12 +7270,18 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) - - info.all_a = 255; - p = stbi__bmp_parse_header(s, &info); -- stbi__rewind( s ); -- if (p == NULL) -+ if (p == NULL) { -+ stbi__rewind( s ); - return 0; -+ } - if (x) *x = s->img_x; - if (y) *y = s->img_y; -- if (comp) *comp = info.ma ? 4 : 3; -+ if (comp) { -+ if (info.bpp == 24 && info.ma == 0xff000000) -+ *comp = 3; -+ else -+ *comp = info.ma ? 4 : 3; -+ } - return 1; - } - #endif -@@ -6919,8 +7339,8 @@ static int stbi__psd_is16(stbi__context *s) - stbi__rewind( s ); - return 0; - } -- (void) stbi__get32be(s); -- (void) stbi__get32be(s); -+ STBI_NOTUSED(stbi__get32be(s)); -+ STBI_NOTUSED(stbi__get32be(s)); - depth = stbi__get16be(s); - if (depth != 16) { - stbi__rewind( s ); -@@ -6999,7 +7419,6 @@ static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) - // Known limitations: - // Does not support comments in the header section - // Does not support ASCII image data (formats P2 and P3) --// Does not support 16-bit-per-channel - - #ifndef STBI_NO_PNM - -@@ -7020,19 +7439,23 @@ static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req - stbi_uc *out; - STBI_NOTUSED(ri); - -- if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) -+ ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); -+ if (ri->bits_per_channel == 0) - return 0; - -+ if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); -+ if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); -+ - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - -- if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) -+ if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) - return stbi__errpuc("too large", "PNM too large"); - -- out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); -+ out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); -- stbi__getn(s, out, s->img_n * s->img_x * s->img_y); -+ stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8)); - - if (req_comp && req_comp != s->img_n) { - out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); -@@ -7108,11 +7531,19 @@ static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) - stbi__pnm_skip_whitespace(s, &c); - - maxv = stbi__pnm_getinteger(s, &c); // read max value -- -- if (maxv > 255) -- return stbi__err("max value > 255", "PPM image not 8-bit"); -+ if (maxv > 65535) -+ return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); -+ else if (maxv > 255) -+ return 16; - else -- return 1; -+ return 8; -+} -+ -+static int stbi__pnm_is16(stbi__context *s) -+{ -+ if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) -+ return 1; -+ return 0; - } - #endif - -@@ -7168,6 +7599,9 @@ static int stbi__is_16_main(stbi__context *s) - if (stbi__psd_is16(s)) return 1; - #endif - -+ #ifndef STBI_NO_PNM -+ if (stbi__pnm_is16(s)) return 1; -+ #endif - return 0; - } - -@@ -7247,6 +7681,7 @@ STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user - - /* - revision history: -+ 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug -diff --git a/pxr/imaging/hio/stb/stb_image.patch b/pxr/imaging/hio/stb/stb_image.patch -index 868b0a74fb..22fc041cba 100644 ---- a/pxr/imaging/hio/stb/stb_image.patch -+++ b/pxr/imaging/hio/stb/stb_image.patch -@@ -1,6 +1,6 @@ ----- stb/stb_image.h 2018-11-20 14:06:26.446637000 -0800 --+++ stb_image.h 2018-11-20 14:10:10.830961000 -0800 --@@ -420,14 +420,14 @@ -+--- stb/stb_image.h 2021-09-16 11:52:38.284782000 -0700k -++++ stb_image.h 2021-09-16 13:45:48.159770000 -0700 -+@@ -488,14 +488,14 @@ - STBIDEF void stbi_image_free (void *retval_from_stbi_load); - - // get image dimensions & components without fully decoding -@@ -19,7 +19,7 @@ - STBIDEF int stbi_is_16_bit (char const *filename); - STBIDEF int stbi_is_16_bit_from_file(FILE *f); - #endif --@@ -792,7 +792,7 @@ -+@@ -911,7 +911,7 @@ - #ifndef STBI_NO_PNG - static int stbi__png_test(stbi__context *s); - static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -@@ -28,7 +28,7 @@ - static int stbi__png_is16(stbi__context *s); - #endif - --@@ -4290,6 +4290,7 @@ -+@@ -4554,6 +4554,7 @@ - stbi__context *s; - stbi_uc *idata, *expanded, *out; - int depth; -@@ -36,7 +36,16 @@ - } stbi__png; - - --@@ -4818,6 +4819,13 @@ -+@@ -4955,7 +4956,7 @@ -+ static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; -+ static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; -+ -+-STBIDEF void stbi__unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) -++STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) -+ { -+ stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; -+ stbi__unpremultiply_on_load_set = 1; -+@@ -5112,6 +5113,13 @@ - break; - } - -@@ -50,7 +59,7 @@ - case STBI__PNG_TYPE('I','D','A','T'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); --@@ -4945,7 +4994,7 @@ -+@@ -5243,7 +5251,7 @@ - return r; - } - -@@ -59,7 +68,7 @@ - { - if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { - stbi__rewind( p->s ); --@@ -4954,21 +5003,22 @@ -+@@ -5252,21 +5260,22 @@ - if (x) *x = p->s->img_x; - if (y) *y = p->s->img_y; - if (comp) *comp = p->s->img_n; -@@ -85,7 +94,7 @@ - return 0; - if (p.depth != 16) { - stbi__rewind(p.s); --@@ -7107,14 +7157,14 @@ -+@@ -7538,14 +7547,14 @@ - } - #endif - -@@ -102,7 +111,7 @@ - #endif - - #ifndef STBI_NO_GIF --@@ -7163,23 +7213,23 @@ -+@@ -7597,23 +7606,23 @@ - } - - #ifndef STBI_NO_STDIO -@@ -130,7 +139,7 @@ - fseek(f,pos,SEEK_SET); - return r; - } --@@ -7206,18 +7256,18 @@ -+@@ -7640,18 +7649,18 @@ - } - #endif // !STBI_NO_STDIO - -diff --git a/pxr/imaging/hio/stb/stb_image_resize.h b/pxr/imaging/hio/stb/stb_image_resize.h -index 031ca99dc3..ef9e6fe870 100644 ---- a/pxr/imaging/hio/stb/stb_image_resize.h -+++ b/pxr/imaging/hio/stb/stb_image_resize.h -@@ -1,4 +1,4 @@ --/* stb_image_resize - v0.95 - public domain image resizing -+/* stb_image_resize - v0.97 - public domain image resizing - by Jorge L Rodriguez (@VinoBS) - 2014 - http://github.com/nothings/stb - -@@ -20,8 +20,8 @@ - output_pixels, out_w, out_h, 0, - num_channels , alpha_chan , 0) - stbir_resize_uint8_srgb_edgemode( -- input_pixels , in_w , in_h , 0, -- output_pixels, out_w, out_h, 0, -+ input_pixels , in_w , in_h , 0, -+ output_pixels, out_w, out_h, 0, - num_channels , alpha_chan , 0, STBIR_EDGE_CLAMP) - // WRAP/REFLECT/ZERO - -@@ -159,6 +159,8 @@ - Nathan Reed: warning fixes - - REVISIONS -+ 0.97 (2020-02-02) fixed warning -+ 0.96 (2019-03-04) fixed warnings - 0.95 (2017-07-23) fixed warnings - 0.94 (2017-03-18) fixed warnings - 0.93 (2017-03-03) fixed bug with certain combinations of heights -@@ -193,6 +195,7 @@ typedef uint16_t stbir_uint16; - typedef uint32_t stbir_uint32; - #endif - -+#ifndef STBIRDEF - #ifdef STB_IMAGE_RESIZE_STATIC - #define STBIRDEF static - #else -@@ -202,7 +205,7 @@ typedef uint32_t stbir_uint32; - #define STBIRDEF extern - #endif - #endif -- -+#endif - - ////////////////////////////////////////////////////////////////////////////// - // -@@ -231,7 +234,7 @@ STBIRDEF int stbir_resize_float( const float *input_pixels , int input_w , i - int num_channels); - - --// The following functions interpret image data as gamma-corrected sRGB. -+// The following functions interpret image data as gamma-corrected sRGB. - // Specify STBIR_ALPHA_CHANNEL_NONE if you have no alpha channel, - // or otherwise provide the index of the alpha channel. Flags value - // of 0 will probably do the right thing if you're not sure what -@@ -304,19 +307,19 @@ typedef enum - STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int input_w , int input_h , int input_stride_in_bytes, - unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, -+ stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, - void *alloc_context); - - STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int input_w , int input_h , int input_stride_in_bytes, - stbir_uint16 *output_pixels , int output_w, int output_h, int output_stride_in_bytes, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, -+ stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, - void *alloc_context); - - STBIRDEF int stbir_resize_float_generic( const float *input_pixels , int input_w , int input_h , int input_stride_in_bytes, - float *output_pixels , int output_w, int output_h, int output_stride_in_bytes, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, -+ stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, - void *alloc_context); - - -@@ -348,7 +351,7 @@ STBIRDEF int stbir_resize( const void *input_pixels , int input_w , int - void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, - stbir_datatype datatype, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, -+ stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, - stbir_filter filter_horizontal, stbir_filter filter_vertical, - stbir_colorspace space, void *alloc_context); - -@@ -356,7 +359,7 @@ STBIRDEF int stbir_resize_subpixel(const void *input_pixels , int input_w , int - void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, - stbir_datatype datatype, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, -+ stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, - stbir_filter filter_horizontal, stbir_filter filter_vertical, - stbir_colorspace space, void *alloc_context, - float x_scale, float y_scale, -@@ -366,7 +369,7 @@ STBIRDEF int stbir_resize_region( const void *input_pixels , int input_w , int - void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, - stbir_datatype datatype, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, -+ stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, - stbir_filter filter_horizontal, stbir_filter filter_vertical, - stbir_colorspace space, void *alloc_context, - float s0, float t0, float s1, float t1); -@@ -668,14 +671,14 @@ static const stbir_uint32 fp32_to_srgb8_tab4[104] = { - 0x44c20798, 0x488e071e, 0x4c1c06b6, 0x4f76065d, 0x52a50610, 0x55ac05cc, 0x5892058f, 0x5b590559, - 0x5e0c0a23, 0x631c0980, 0x67db08f6, 0x6c55087f, 0x70940818, 0x74a007bd, 0x787d076c, 0x7c330723, - }; -- -+ - static stbir_uint8 stbir__linear_to_srgb_uchar(float in) - { - static const stbir__FP32 almostone = { 0x3f7fffff }; // 1-eps - static const stbir__FP32 minval = { (127-13) << 23 }; - stbir_uint32 tab,bias,scale,t; - stbir__FP32 f; -- -+ - // Clamp to [2^(-13), 1-eps]; these two values map to 0 and 1, respectively. - // The tests are carefully written so that NaNs map to 0, same as in the reference - // implementation. -@@ -683,13 +686,13 @@ static stbir_uint8 stbir__linear_to_srgb_uchar(float in) - in = minval.f; - if (in > almostone.f) - in = almostone.f; -- -+ - // Do the table lookup and unpack bias, scale - f.f = in; - tab = fp32_to_srgb8_tab4[(f.u - minval.u) >> 20]; - bias = (tab >> 16) << 9; - scale = tab & 0xffff; -- -+ - // Grab next-highest mantissa bits and perform linear interpolation - t = (f.u >> 12) & 0xff; - return (unsigned char) ((bias + scale*t) >> 16); -@@ -1061,7 +1064,11 @@ static void stbir__calculate_coefficients_upsample(stbir_filter filter, float sc - total_filter += coefficient_group[i]; - } - -- STBIR_ASSERT(stbir__filter_info_table[filter].kernel((float)(in_last_pixel + 1) + 0.5f - in_center_of_out, 1/scale) == 0); -+ // NOTE(fg): Not actually true in general, nor is there any reason to expect it should be. -+ // It would be true in exact math but is at best approximately true in floating-point math, -+ // and it would not make sense to try and put actual bounds on this here because it depends -+ // on the image aspect ratio which can get pretty extreme. -+ //STBIR_ASSERT(stbir__filter_info_table[filter].kernel((float)(in_last_pixel + 1) + 0.5f - in_center_of_out, 1/scale) == 0); - - STBIR_ASSERT(total_filter > 0.9); - STBIR_ASSERT(total_filter < 1.1f); // Make sure it's not way off. -@@ -1086,7 +1093,7 @@ static void stbir__calculate_coefficients_downsample(stbir_filter filter, float - { - int i; - -- STBIR_ASSERT(out_last_pixel - out_first_pixel <= (int)ceil(stbir__filter_info_table[filter].support(scale_ratio) * 2)); // Taken directly from stbir__get_coefficient_width() which we can't call because we don't know if we're horizontal or vertical. -+ STBIR_ASSERT(out_last_pixel - out_first_pixel <= (int)ceil(stbir__filter_info_table[filter].support(scale_ratio) * 2)); // Taken directly from stbir__get_coefficient_width() which we can't call because we don't know if we're horizontal or vertical. - - contributor->n0 = out_first_pixel; - contributor->n1 = out_last_pixel; -@@ -1100,7 +1107,11 @@ static void stbir__calculate_coefficients_downsample(stbir_filter filter, float - coefficient_group[i] = stbir__filter_info_table[filter].kernel(x, scale_ratio) * scale_ratio; - } - -- STBIR_ASSERT(stbir__filter_info_table[filter].kernel((float)(out_last_pixel + 1) + 0.5f - out_center_of_in, scale_ratio) == 0); -+ // NOTE(fg): Not actually true in general, nor is there any reason to expect it should be. -+ // It would be true in exact math but is at best approximately true in floating-point math, -+ // and it would not make sense to try and put actual bounds on this here because it depends -+ // on the image aspect ratio which can get pretty extreme. -+ //STBIR_ASSERT(stbir__filter_info_table[filter].kernel((float)(out_last_pixel + 1) + 0.5f - out_center_of_in, scale_ratio) == 0); - - for (i = out_last_pixel - out_first_pixel; i >= 0; i--) - { -@@ -1236,7 +1247,7 @@ static float* stbir__get_decode_buffer(stbir__info* stbir_info) - return &stbir_info->decode_buffer[stbir_info->horizontal_filter_pixel_margin * stbir_info->channels]; - } - --#define STBIR__DECODE(type, colorspace) ((type) * (STBIR_MAX_COLORSPACES) + (colorspace)) -+#define STBIR__DECODE(type, colorspace) ((int)(type) * (STBIR_MAX_COLORSPACES) + (int)(colorspace)) - - static void stbir__decode_scanline(stbir__info* stbir_info, int n) - { -@@ -1549,7 +1560,6 @@ static void stbir__resample_horizontal_downsample(stbir__info* stbir_info, float - { - int out_pixel_index = k * 1; - float coefficient = horizontal_coefficients[coefficient_group + k - n0]; -- STBIR_ASSERT(coefficient != 0); - output_buffer[out_pixel_index + 0] += decode_buffer[in_pixel_index + 0] * coefficient; - } - } -@@ -1570,7 +1580,6 @@ static void stbir__resample_horizontal_downsample(stbir__info* stbir_info, float - { - int out_pixel_index = k * 2; - float coefficient = horizontal_coefficients[coefficient_group + k - n0]; -- STBIR_ASSERT(coefficient != 0); - output_buffer[out_pixel_index + 0] += decode_buffer[in_pixel_index + 0] * coefficient; - output_buffer[out_pixel_index + 1] += decode_buffer[in_pixel_index + 1] * coefficient; - } -@@ -1592,7 +1601,6 @@ static void stbir__resample_horizontal_downsample(stbir__info* stbir_info, float - { - int out_pixel_index = k * 3; - float coefficient = horizontal_coefficients[coefficient_group + k - n0]; -- STBIR_ASSERT(coefficient != 0); - output_buffer[out_pixel_index + 0] += decode_buffer[in_pixel_index + 0] * coefficient; - output_buffer[out_pixel_index + 1] += decode_buffer[in_pixel_index + 1] * coefficient; - output_buffer[out_pixel_index + 2] += decode_buffer[in_pixel_index + 2] * coefficient; -@@ -1615,7 +1623,6 @@ static void stbir__resample_horizontal_downsample(stbir__info* stbir_info, float - { - int out_pixel_index = k * 4; - float coefficient = horizontal_coefficients[coefficient_group + k - n0]; -- STBIR_ASSERT(coefficient != 0); - output_buffer[out_pixel_index + 0] += decode_buffer[in_pixel_index + 0] * coefficient; - output_buffer[out_pixel_index + 1] += decode_buffer[in_pixel_index + 1] * coefficient; - output_buffer[out_pixel_index + 2] += decode_buffer[in_pixel_index + 2] * coefficient; -@@ -1640,7 +1647,6 @@ static void stbir__resample_horizontal_downsample(stbir__info* stbir_info, float - int c; - int out_pixel_index = k * channels; - float coefficient = horizontal_coefficients[coefficient_group + k - n0]; -- STBIR_ASSERT(coefficient != 0); - for (c = 0; c < channels; c++) - output_buffer[out_pixel_index + c] += decode_buffer[in_pixel_index + c] * coefficient; - } -@@ -2324,8 +2330,9 @@ static int stbir__resize_allocated(stbir__info *info, - if (alpha_channel < 0) - flags |= STBIR_FLAG_ALPHA_USES_COLORSPACE | STBIR_FLAG_ALPHA_PREMULTIPLIED; - -- if (!(flags&STBIR_FLAG_ALPHA_USES_COLORSPACE) || !(flags&STBIR_FLAG_ALPHA_PREMULTIPLIED)) -+ if (!(flags&STBIR_FLAG_ALPHA_USES_COLORSPACE) || !(flags&STBIR_FLAG_ALPHA_PREMULTIPLIED)) { - STBIR_ASSERT(alpha_channel >= 0 && alpha_channel < info->channels); -+ } - - if (alpha_channel >= info->channels) - return 0; -@@ -2442,7 +2449,7 @@ static int stbir__resize_arbitrary( - return 0; - - result = stbir__resize_allocated(&info, input_data, input_stride_in_bytes, -- output_data, output_stride_in_bytes, -+ output_data, output_stride_in_bytes, - alpha_channel, flags, type, - edge_horizontal, edge_vertical, - colorspace, extra_memory, memory_required); -@@ -2496,7 +2503,7 @@ STBIRDEF int stbir_resize_uint8_srgb_edgemode(const unsigned char *input_pixels - STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int input_w , int input_h , int input_stride_in_bytes, - unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, -+ stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, - void *alloc_context) - { - return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes, -@@ -2508,7 +2515,7 @@ STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int - STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int input_w , int input_h , int input_stride_in_bytes, - stbir_uint16 *output_pixels , int output_w, int output_h, int output_stride_in_bytes, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, -+ stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, - void *alloc_context) - { - return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes, -@@ -2521,7 +2528,7 @@ STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int - STBIRDEF int stbir_resize_float_generic( const float *input_pixels , int input_w , int input_h , int input_stride_in_bytes, - float *output_pixels , int output_w, int output_h, int output_stride_in_bytes, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, -+ stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space, - void *alloc_context) - { - return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes, -@@ -2535,7 +2542,7 @@ STBIRDEF int stbir_resize( const void *input_pixels , int input_w , int - void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, - stbir_datatype datatype, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, -+ stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, - stbir_filter filter_horizontal, stbir_filter filter_vertical, - stbir_colorspace space, void *alloc_context) - { -@@ -2550,7 +2557,7 @@ STBIRDEF int stbir_resize_subpixel(const void *input_pixels , int input_w , int - void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, - stbir_datatype datatype, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, -+ stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, - stbir_filter filter_horizontal, stbir_filter filter_vertical, - stbir_colorspace space, void *alloc_context, - float x_scale, float y_scale, -@@ -2571,7 +2578,7 @@ STBIRDEF int stbir_resize_region( const void *input_pixels , int input_w , int - void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, - stbir_datatype datatype, - int num_channels, int alpha_channel, int flags, -- stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, -+ stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical, - stbir_filter filter_horizontal, stbir_filter filter_vertical, - stbir_colorspace space, void *alloc_context, - float s0, float t0, float s1, float t1) -@@ -2590,38 +2597,38 @@ This software is available under 2 licenses -- choose whichever you prefer. - ------------------------------------------------------------------------------ - ALTERNATIVE A - MIT License - Copyright (c) 2017 Sean Barrett --Permission is hereby granted, free of charge, to any person obtaining a copy of --this software and associated documentation files (the "Software"), to deal in --the Software without restriction, including without limitation the rights to --use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies --of the Software, and to permit persons to whom the Software is furnished to do -+Permission is hereby granted, free of charge, to any person obtaining a copy of -+this software and associated documentation files (the "Software"), to deal in -+the Software without restriction, including without limitation the rights to -+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -+of the Software, and to permit persons to whom the Software is furnished to do - so, subject to the following conditions: --The above copyright notice and this permission notice shall be included in all -+The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. --THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR --IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, --FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE --AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER --LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, --OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - ------------------------------------------------------------------------------ - ALTERNATIVE B - Public Domain (www.unlicense.org) - This is free and unencumbered software released into the public domain. --Anyone is free to copy, modify, publish, use, compile, sell, or distribute this --software, either in source code form or as a compiled binary, for any purpose, -+Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -+software, either in source code form or as a compiled binary, for any purpose, - commercial or non-commercial, and by any means. --In jurisdictions that recognize copyright laws, the author or authors of this --software dedicate any and all copyright interest in the software to the public --domain. We make this dedication for the benefit of the public at large and to --the detriment of our heirs and successors. We intend this dedication to be an --overt act of relinquishment in perpetuity of all present and future rights to -+In jurisdictions that recognize copyright laws, the author or authors of this -+software dedicate any and all copyright interest in the software to the public -+domain. We make this dedication for the benefit of the public at large and to -+the detriment of our heirs and successors. We intend this dedication to be an -+overt act of relinquishment in perpetuity of all present and future rights to - this software under copyright law. --THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR --IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, --FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE --AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN --ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------------------------------------------------------------------------------ - */ -diff --git a/pxr/imaging/hio/stb/stb_image_write.h b/pxr/imaging/hio/stb/stb_image_write.h -index 7c63a2dc20..e4b32ed1bc 100644 ---- a/pxr/imaging/hio/stb/stb_image_write.h -+++ b/pxr/imaging/hio/stb/stb_image_write.h -@@ -1,4 +1,4 @@ --/* stb_image_write - v1.09 - public domain - http://nothings.org/stb/stb_image_write.h -+/* stb_image_write - v1.16 - public domain - http://nothings.org/stb - writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 - no warranty implied; use at your own risk - -@@ -10,15 +10,9 @@ - - Will probably not work correctly with strict-aliasing optimizations. - -- If using a modern Microsoft Compiler, non-safe versions of CRT calls may cause -- compilation warnings or even errors. To avoid this, also before #including, -- -- #define STBI_MSC_SECURE_CRT -- - ABOUT: - -- This header file is a library for writing images to C stdio. It could be -- adapted to write to memory or a general streaming interface; let me know. -+ This header file is a library for writing images to C stdio or a callback. - - The PNG output is not optimal; it is 20-50% larger than the file - written by a decent optimizing implementation; though providing a custom -@@ -38,6 +32,14 @@ - The returned data will be freed with STBIW_FREE() (free() by default), - so it must be heap allocated with STBIW_MALLOC() (malloc() by default), - -+UNICODE: -+ -+ If compiling for Windows and you wish to use Unicode filenames, compile -+ with -+ #define STBIW_WINDOWS_UTF8 -+ and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert -+ Windows wchar_t filenames to utf8. -+ - USAGE: - - There are five functions, one for each image file format: -@@ -103,7 +105,7 @@ - - TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed - data, set the global variable 'stbi_write_tga_with_rle' to 0. -- -+ - JPEG does ignore alpha channels in input data; quality is between 1 and 100. - Higher quality looks better but results in a bigger image. - JPEG baseline (no JPEG progressive). -@@ -111,7 +113,7 @@ - CREDITS: - - -- Sean Barrett - PNG/BMP/TGA -+ Sean Barrett - PNG/BMP/TGA - Baldur Karlsson - HDR - Jean-Sebastien Guay - TGA monochrome - Tim Kelsey - misc enhancements -@@ -138,6 +140,7 @@ - Ivan Tikhonov - github:ignotion - Adam Schackart -+ Andrew Kensler - - LICENSE - -@@ -148,6 +151,8 @@ LICENSE - #ifndef INCLUDE_STB_IMAGE_WRITE_H - #define INCLUDE_STB_IMAGE_WRITE_H - -+#include -+ - // if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' - #ifndef STBIWDEF - #ifdef STB_IMAGE_WRITE_STATIC -@@ -162,9 +167,9 @@ LICENSE - #endif - - #ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations --extern int stbi_write_tga_with_rle; --extern int stbi_write_png_compression_level; --extern int stbi_write_force_png_filter; -+STBIWDEF int stbi_write_tga_with_rle; -+STBIWDEF int stbi_write_png_compression_level; -+STBIWDEF int stbi_write_force_png_filter; - #endif - - #ifndef STBI_WRITE_NO_STDIO -@@ -173,6 +178,10 @@ STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const - STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); - STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); - STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); -+ -+#ifdef STBIW_WINDOWS_UTF8 -+STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); -+#endif - #endif - - typedef void stbi_write_func(void *context, void *data, int size); -@@ -239,17 +248,17 @@ STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); - #define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) - - #ifdef STB_IMAGE_WRITE_STATIC --static int stbi__flip_vertically_on_write=0; - static int stbi_write_png_compression_level = 8; - static int stbi_write_tga_with_rle = 1; - static int stbi_write_force_png_filter = -1; - #else - int stbi_write_png_compression_level = 8; --int stbi__flip_vertically_on_write=0; - int stbi_write_tga_with_rle = 1; - int stbi_write_force_png_filter = -1; - #endif - -+static int stbi__flip_vertically_on_write = 0; -+ - STBIWDEF void stbi_flip_vertically_on_write(int flag) - { - stbi__flip_vertically_on_write = flag; -@@ -259,6 +268,8 @@ typedef struct - { - stbi_write_func *func; - void *context; -+ unsigned char buffer[64]; -+ int buf_used; - } stbi__write_context; - - // initialize a callback-based context -@@ -275,15 +286,52 @@ static void stbi__stdio_write(void *context, void *data, int size) - fwrite(data,1,size,(FILE*) context); - } - --static int stbi__start_write_file(stbi__write_context *s, const char *filename) -+#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) -+#ifdef __cplusplus -+#define STBIW_EXTERN extern "C" -+#else -+#define STBIW_EXTERN extern -+#endif -+STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); -+STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); -+ -+STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) -+{ -+ return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); -+} -+#endif -+ -+static FILE *stbiw__fopen(char const *filename, char const *mode) - { - FILE *f; --#ifdef STBI_MSC_SECURE_CRT -- if (fopen_s(&f, filename, "wb")) -- f = NULL; -+#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) -+ wchar_t wMode[64]; -+ wchar_t wFilename[1024]; -+ if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) -+ return 0; -+ -+ if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) -+ return 0; -+ -+#if defined(_MSC_VER) && _MSC_VER >= 1400 -+ if (0 != _wfopen_s(&f, wFilename, wMode)) -+ f = 0; - #else -- f = fopen(filename, "wb"); -+ f = _wfopen(wFilename, wMode); - #endif -+ -+#elif defined(_MSC_VER) && _MSC_VER >= 1400 -+ if (0 != fopen_s(&f, filename, mode)) -+ f=0; -+#else -+ f = fopen(filename, mode); -+#endif -+ return f; -+} -+ -+static int stbi__start_write_file(stbi__write_context *s, const char *filename) -+{ -+ FILE *f = stbiw__fopen(filename, "wb"); - stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); - return f != NULL; - } -@@ -335,16 +383,36 @@ static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) - va_end(v); - } - -+static void stbiw__write_flush(stbi__write_context *s) -+{ -+ if (s->buf_used) { -+ s->func(s->context, &s->buffer, s->buf_used); -+ s->buf_used = 0; -+ } -+} -+ - static void stbiw__putc(stbi__write_context *s, unsigned char c) - { - s->func(s->context, &c, 1); - } - -+static void stbiw__write1(stbi__write_context *s, unsigned char a) -+{ -+ if ((size_t)s->buf_used + 1 > sizeof(s->buffer)) -+ stbiw__write_flush(s); -+ s->buffer[s->buf_used++] = a; -+} -+ - static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) - { -- unsigned char arr[3]; -- arr[0] = a, arr[1] = b, arr[2] = c; -- s->func(s->context, arr, 3); -+ int n; -+ if ((size_t)s->buf_used + 3 > sizeof(s->buffer)) -+ stbiw__write_flush(s); -+ n = s->buf_used; -+ s->buf_used = n+3; -+ s->buffer[n+0] = a; -+ s->buffer[n+1] = b; -+ s->buffer[n+2] = c; - } - - static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) -@@ -353,7 +421,7 @@ static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, in - int k; - - if (write_alpha < 0) -- s->func(s->context, &d[comp - 1], 1); -+ stbiw__write1(s, d[comp - 1]); - - switch (comp) { - case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case -@@ -361,7 +429,7 @@ static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, in - if (expand_mono) - stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp - else -- s->func(s->context, d, 1); // monochrome TGA -+ stbiw__write1(s, d[0]); // monochrome TGA - break; - case 4: - if (!write_alpha) { -@@ -377,7 +445,7 @@ static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, in - break; - } - if (write_alpha > 0) -- s->func(s->context, &d[comp - 1], 1); -+ stbiw__write1(s, d[comp - 1]); - } - - static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) -@@ -391,16 +459,18 @@ static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, i - if (stbi__flip_vertically_on_write) - vdir *= -1; - -- if (vdir < 0) -- j_end = -1, j = y-1; -- else -- j_end = y, j = 0; -+ if (vdir < 0) { -+ j_end = -1; j = y-1; -+ } else { -+ j_end = y; j = 0; -+ } - - for (; j != j_end; j += vdir) { - for (i=0; i < x; ++i) { - unsigned char *d = (unsigned char *) data + (j*x+i)*comp; - stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); - } -+ stbiw__write_flush(s); - s->func(s->context, &zero, scanline_pad); - } - } -@@ -421,16 +491,27 @@ static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, - - static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) - { -- int pad = (-x*3) & 3; -- return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, -- "11 4 22 4" "4 44 22 444444", -- 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header -- 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header -+ if (comp != 4) { -+ // write RGB bitmap -+ int pad = (-x*3) & 3; -+ return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, -+ "11 4 22 4" "4 44 22 444444", -+ 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header -+ 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header -+ } else { -+ // RGBA bitmaps need a v4 header -+ // use BI_BITFIELDS mode with 32bpp and alpha mask -+ // (straight BI_RGB with alpha mask doesn't work in most readers) -+ return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *)data,1,0, -+ "11 4 22 4" "4 44 22 444444 4444 4 444 444 444 444", -+ 'B', 'M', 14+108+x*y*4, 0, 0, 14+108, // file header -+ 108, x,y, 1,32, 3,0,0,0,0,0, 0xff0000,0xff00,0xff,0xff000000u, 0, 0,0,0, 0,0,0, 0,0,0, 0,0,0); // bitmap V4 header -+ } - } - - STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) - { -- stbi__write_context s; -+ stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_bmp_core(&s, x, y, comp, data); - } -@@ -438,7 +519,7 @@ STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, - #ifndef STBI_WRITE_NO_STDIO - STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) - { -- stbi__write_context s; -+ stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_bmp_core(&s, x, y, comp, data); - stbi__end_write_file(&s); -@@ -511,24 +592,25 @@ static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, v - - if (diff) { - unsigned char header = STBIW_UCHAR(len - 1); -- s->func(s->context, &header, 1); -+ stbiw__write1(s, header); - for (k = 0; k < len; ++k) { - stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); - } - } else { - unsigned char header = STBIW_UCHAR(len - 129); -- s->func(s->context, &header, 1); -+ stbiw__write1(s, header); - stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); - } - } - } -+ stbiw__write_flush(s); - } - return 1; - } - - STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) - { -- stbi__write_context s; -+ stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_tga_core(&s, x, y, comp, (void *) data); - } -@@ -536,7 +618,7 @@ STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, - #ifndef STBI_WRITE_NO_STDIO - STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) - { -- stbi__write_context s; -+ stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); - stbi__end_write_file(&s); -@@ -552,7 +634,9 @@ STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const - - #define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) - --void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) -+#ifndef STBI_WRITE_NO_STDIO -+ -+static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) - { - int exponent; - float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); -@@ -569,7 +653,7 @@ void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) - } - } - --void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) -+static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) - { - unsigned char lengthbyte = STBIW_UCHAR(length+128); - STBIW_ASSERT(length+128 <= 255); -@@ -577,7 +661,7 @@ void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char dat - s->func(s->context, &databyte, 1); - } - --void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) -+static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) - { - unsigned char lengthbyte = STBIW_UCHAR(length); - STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code -@@ -585,7 +669,7 @@ void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *d - s->func(s->context, data, length); - } - --void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) -+static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) - { - unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; - unsigned char rgbe[4]; -@@ -686,18 +770,14 @@ static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, f - char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; - s->func(s->context, header, sizeof(header)-1); - --#ifdef STBI_MSC_SECURE_CRT -- len = sprintf_s(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); -+#ifdef __STDC_LIB_EXT1__ -+ len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); - #else - len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); - #endif - s->func(s->context, buffer, len); - - for(i=0; i < y; i++) -- // XXX PIXAR: fix to the following call to stbiw__write_hdr_scanline -- // XXX Issue: Original included extra multiplication by x when computing -- // XXX starting position of scanline -- // XXX Fix : deleted extra x - stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); - STBIW_FREE(scratch); - return 1; -@@ -706,15 +786,14 @@ static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, f - - STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) - { -- stbi__write_context s; -+ stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_hdr_core(&s, x, y, comp, (float *) data); - } - --#ifndef STBI_WRITE_NO_STDIO - STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) - { -- stbi__write_context s; -+ stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); - stbi__end_write_file(&s); -@@ -732,7 +811,7 @@ STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const - - #ifndef STBIW_ZLIB_COMPRESS - // stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() --#define stbiw__sbraw(a) ((int *) (a) - 2) -+#define stbiw__sbraw(a) ((int *) (void *) (a) - 2) - #define stbiw__sbm(a) stbiw__sbraw(a)[0] - #define stbiw__sbn(a) stbiw__sbraw(a)[1] - -@@ -813,7 +892,7 @@ static unsigned int stbiw__zhash(unsigned char *data) - - #endif // STBIW_ZLIB_COMPRESS - --unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) -+STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) - { - #ifdef STBIW_ZLIB_COMPRESS - // user provided a zlib compress implementation, use that -@@ -826,7 +905,7 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l - unsigned int bitbuf=0; - int i,j, bitcount=0; - unsigned char *out = NULL; -- unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(char**)); -+ unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**)); - if (hash_table == NULL) - return NULL; - if (quality < 5) quality = 5; -@@ -849,7 +928,7 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l - for (j=0; j < n; ++j) { - if (hlist[j]-data > i-32768) { // if entry lies within window - int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); -- if (d >= best) best=d,bestloc=hlist[j]; -+ if (d >= best) { best=d; bestloc=hlist[j]; } - } - } - // when hash table entry is too long, delete half the entries -@@ -902,14 +981,31 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l - (void) stbiw__sbfree(hash_table[i]); - STBIW_FREE(hash_table); - -+ // store uncompressed instead if compression was worse -+ if (stbiw__sbn(out) > data_len + 2 + ((data_len+32766)/32767)*5) { -+ stbiw__sbn(out) = 2; // truncate to DEFLATE 32K window and FLEVEL = 1 -+ for (j = 0; j < data_len;) { -+ int blocklen = data_len - j; -+ if (blocklen > 32767) blocklen = 32767; -+ stbiw__sbpush(out, data_len - j == blocklen); // BFINAL = ?, BTYPE = 0 -- no compression -+ stbiw__sbpush(out, STBIW_UCHAR(blocklen)); // LEN -+ stbiw__sbpush(out, STBIW_UCHAR(blocklen >> 8)); -+ stbiw__sbpush(out, STBIW_UCHAR(~blocklen)); // NLEN -+ stbiw__sbpush(out, STBIW_UCHAR(~blocklen >> 8)); -+ memcpy(out+stbiw__sbn(out), data+j, blocklen); -+ stbiw__sbn(out) += blocklen; -+ j += blocklen; -+ } -+ } -+ - { - // compute adler32 on input - unsigned int s1=1, s2=0; - int blocklen = (int) (data_len % 5552); - j=0; - while (j < data_len) { -- for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1; -- s1 %= 65521, s2 %= 65521; -+ for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; } -+ s1 %= 65521; s2 %= 65521; - j += blocklen; - blocklen = 5552; - } -@@ -927,6 +1023,9 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l - - static unsigned int stbiw__crc32(unsigned char *buffer, int len) - { -+#ifdef STBIW_CRC32 -+ return STBIW_CRC32(buffer, len); -+#else - static unsigned int crc_table[256] = - { - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, -@@ -968,6 +1067,7 @@ static unsigned int stbiw__crc32(unsigned char *buffer, int len) - for (i=0; i < len; ++i) - crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; - return ~crc; -+#endif - } - - #define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) -@@ -998,9 +1098,15 @@ static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int - int type = mymap[filter_type]; - unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); - int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; -+ -+ if (type==0) { -+ memcpy(line_buffer, z, width*n); -+ return; -+ } -+ -+ // first loop isn't optimized since it's just one pixel - for (i = 0; i < n; ++i) { - switch (type) { -- case 0: line_buffer[i] = z[i]; break; - case 1: line_buffer[i] = z[i]; break; - case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; - case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; -@@ -1009,20 +1115,17 @@ static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int - case 6: line_buffer[i] = z[i]; break; - } - } -- for (i=n; i < width*n; ++i) { -- switch (type) { -- case 0: line_buffer[i] = z[i]; break; -- case 1: line_buffer[i] = z[i] - z[i-n]; break; -- case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; -- case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; -- case 4: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; -- case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break; -- case 6: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; -- } -+ switch (type) { -+ case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; -+ case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; -+ case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; -+ case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; -+ case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; -+ case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; - } - } - --unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) -+STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) - { - int force_filter = stbi_write_force_png_filter; - int ctype[5] = { -1, 0, 4, 2, 6 }; -@@ -1044,11 +1147,11 @@ unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, in - int filter_type; - if (force_filter > -1) { - filter_type = force_filter; -- stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, force_filter, line_buffer); -+ stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); - } else { // Estimate the best filter by running through all of them: - int best_filter = 0, best_filter_val = 0x7fffffff, est, i; - for (filter_type = 0; filter_type < 5; filter_type++) { -- stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, filter_type, line_buffer); -+ stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); - - // Estimate the entropy of the line using this filter; the less, the better. - est = 0; -@@ -1061,7 +1164,7 @@ unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, in - } - } - if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it -- stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, best_filter, line_buffer); -+ stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); - filter_type = best_filter; - } - } -@@ -1113,14 +1216,10 @@ STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const - { - FILE *f; - int len; -- unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len); -+ unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); - if (png == NULL) return 0; --#ifdef STBI_MSC_SECURE_CRT -- if (fopen_s(&f, filename, "wb")) -- f = NULL; --#else -- f = fopen(filename, "wb"); --#endif -+ -+ f = stbiw__fopen(filename, "wb"); - if (!f) { STBIW_FREE(png); return 0; } - fwrite(png, 1, len, f); - fclose(f); -@@ -1132,7 +1231,7 @@ STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const - STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) - { - int len; -- unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len); -+ unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); - if (png == NULL) return 0; - func(context, png, len); - STBIW_FREE(png); -@@ -1226,26 +1325,31 @@ static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { - bits[0] = val & ((1< 100 ? 100 : quality; - quality = quality < 50 ? 5000 / quality : 200 - quality * 2; - -@@ -1394,7 +1499,7 @@ static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, in - static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; - static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; - const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), -- 3,1,0x11,0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; -+ 3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; - s->func(s->context, (void*)head0, sizeof(head0)); - s->func(s->context, (void*)YTable, sizeof(YTable)); - stbiw__putc(s, 1); -@@ -1417,38 +1522,74 @@ static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, in - // Encode 8x8 macroblocks - { - static const unsigned short fillBits[] = {0x7F, 7}; -- const unsigned char *imageData = (const unsigned char *)data; - int DCY=0, DCU=0, DCV=0; - int bitBuf=0, bitCnt=0; - // comp == 2 is grey+alpha (alpha is ignored) - int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; -+ const unsigned char *dataR = (const unsigned char *)data; -+ const unsigned char *dataG = dataR + ofsG; -+ const unsigned char *dataB = dataR + ofsB; - int x, y, pos; -- for(y = 0; y < height; y += 8) { -- for(x = 0; x < width; x += 8) { -- float YDU[64], UDU[64], VDU[64]; -- for(row = y, pos = 0; row < y+8; ++row) { -- for(col = x; col < x+8; ++col, ++pos) { -- int p = (stbi__flip_vertically_on_write ? height-1-row : row)*width*comp + col*comp; -- float r, g, b; -- if(row >= height) { -- p -= width*comp*(row+1 - height); -+ if(subsample) { -+ for(y = 0; y < height; y += 16) { -+ for(x = 0; x < width; x += 16) { -+ float Y[256], U[256], V[256]; -+ for(row = y, pos = 0; row < y+16; ++row) { -+ // row >= height => use last input row -+ int clamped_row = (row < height) ? row : height - 1; -+ int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; -+ for(col = x; col < x+16; ++col, ++pos) { -+ // if col >= width => use pixel from last input column -+ int p = base_p + ((col < width) ? col : (width-1))*comp; -+ float r = dataR[p], g = dataG[p], b = dataB[p]; -+ Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; -+ U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; -+ V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; - } -- if(col >= width) { -- p -= comp*(col+1 - width); -+ } -+ DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); -+ DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); -+ DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); -+ DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); -+ -+ // subsample U,V -+ { -+ float subU[64], subV[64]; -+ int yy, xx; -+ for(yy = 0, pos = 0; yy < 8; ++yy) { -+ for(xx = 0; xx < 8; ++xx, ++pos) { -+ int j = yy*32+xx*2; -+ subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f; -+ subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f; -+ } - } -- -- r = imageData[p+0]; -- g = imageData[p+ofsG]; -- b = imageData[p+ofsB]; -- YDU[pos]=+0.29900f*r+0.58700f*g+0.11400f*b-128; -- UDU[pos]=-0.16874f*r-0.33126f*g+0.50000f*b; -- VDU[pos]=+0.50000f*r-0.41869f*g-0.08131f*b; -+ DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); -+ DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); - } - } -+ } -+ } else { -+ for(y = 0; y < height; y += 8) { -+ for(x = 0; x < width; x += 8) { -+ float Y[64], U[64], V[64]; -+ for(row = y, pos = 0; row < y+8; ++row) { -+ // row >= height => use last input row -+ int clamped_row = (row < height) ? row : height - 1; -+ int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; -+ for(col = x; col < x+8; ++col, ++pos) { -+ // if col >= width => use pixel from last input column -+ int p = base_p + ((col < width) ? col : (width-1))*comp; -+ float r = dataR[p], g = dataG[p], b = dataB[p]; -+ Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; -+ U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; -+ V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; -+ } -+ } - -- DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); -- DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); -- DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); -+ DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT); -+ DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); -+ DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); -+ } - } - } - -@@ -1465,7 +1606,7 @@ static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, in - - STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) - { -- stbi__write_context s; -+ stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); - } -@@ -1474,7 +1615,7 @@ STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, - #ifndef STBI_WRITE_NO_STDIO - STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) - { -- stbi__write_context s; -+ stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); - stbi__end_write_file(&s); -@@ -1487,6 +1628,17 @@ STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const - #endif // STB_IMAGE_WRITE_IMPLEMENTATION - - /* Revision history -+ 1.16 (2021-07-11) -+ make Deflate code emit uncompressed blocks when it would otherwise expand -+ support writing BMPs with alpha channel -+ 1.15 (2020-07-13) unknown -+ 1.14 (2020-02-02) updated JPEG writer to downsample chroma channels -+ 1.13 -+ 1.12 -+ 1.11 (2019-08-11) -+ -+ 1.10 (2019-02-07) -+ support utf8 filenames in Windows; fix warnings and platform ifdefs - 1.09 (2018-02-11) - fix typo in zlib quality API, improve STB_I_W_STATIC in C++ - 1.08 (2018-01-29) -@@ -1517,7 +1669,7 @@ STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const - add HDR output - fix monochrome BMP - 0.95 (2014-08-17) -- add monochrome TGA output -+ add monochrome TGA output - 0.94 (2014-05-31) - rename private functions to avoid conflicts with stb_image.h - 0.93 (2014-05-27) -@@ -1535,38 +1687,38 @@ This software is available under 2 licenses -- choose whichever you prefer. - ------------------------------------------------------------------------------ - ALTERNATIVE A - MIT License - Copyright (c) 2017 Sean Barrett --Permission is hereby granted, free of charge, to any person obtaining a copy of --this software and associated documentation files (the "Software"), to deal in --the Software without restriction, including without limitation the rights to --use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies --of the Software, and to permit persons to whom the Software is furnished to do -+Permission is hereby granted, free of charge, to any person obtaining a copy of -+this software and associated documentation files (the "Software"), to deal in -+the Software without restriction, including without limitation the rights to -+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -+of the Software, and to permit persons to whom the Software is furnished to do - so, subject to the following conditions: --The above copyright notice and this permission notice shall be included in all -+The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. --THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR --IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, --FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE --AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER --LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, --OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - ------------------------------------------------------------------------------ - ALTERNATIVE B - Public Domain (www.unlicense.org) - This is free and unencumbered software released into the public domain. --Anyone is free to copy, modify, publish, use, compile, sell, or distribute this --software, either in source code form or as a compiled binary, for any purpose, -+Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -+software, either in source code form or as a compiled binary, for any purpose, - commercial or non-commercial, and by any means. --In jurisdictions that recognize copyright laws, the author or authors of this --software dedicate any and all copyright interest in the software to the public --domain. We make this dedication for the benefit of the public at large and to --the detriment of our heirs and successors. We intend this dedication to be an --overt act of relinquishment in perpetuity of all present and future rights to -+In jurisdictions that recognize copyright laws, the author or authors of this -+software dedicate any and all copyright interest in the software to the public -+domain. We make this dedication for the benefit of the public at large and to -+the detriment of our heirs and successors. We intend this dedication to be an -+overt act of relinquishment in perpetuity of all present and future rights to - this software under copyright law. --THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR --IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, --FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE --AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN --ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------------------------------------------------------------------------------ - */ -diff --git a/pxr/imaging/hio/stb/stb_image_write.patch b/pxr/imaging/hio/stb/stb_image_write.patch -deleted file mode 100644 -index 0df4340b11..0000000000 ---- a/pxr/imaging/hio/stb/stb_image_write.patch -+++ /dev/null -@@ -1,15 +0,0 @@ ----- stb/stb_image_write.h 2018-02-11 11:57:53.000000000 -0800 --+++ stb_image_write.h 2018-06-11 14:01:49.258945863 -0700 --@@ -694,7 +694,11 @@ -- s->func(s->context, buffer, len); -- -- for(i=0; i < y; i++) --- stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)*x); --+ // XXX PIXAR: fix to the following call to stbiw__write_hdr_scanline --+ // XXX Issue: Original included extra multiplication by x when computing --+ // XXX starting position of scanline --+ // XXX Fix : deleted extra x --+ stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); -- STBIW_FREE(scratch); -- return 1; -- } -diff --git a/pxr/imaging/hio/stbImage.cpp b/pxr/imaging/hio/stbImage.cpp -index 8ac15e5420..da9efb1a7e 100644 ---- a/pxr/imaging/hio/stbImage.cpp -+++ b/pxr/imaging/hio/stbImage.cpp -@@ -47,6 +47,9 @@ ARCH_PRAGMA_PUSH - ARCH_PRAGMA_UNUSED_FUNCTION - - #define STB_IMAGE_STATIC -+#ifdef ARCH_OS_WINDOWS -+#define STBI_WINDOWS_UTF8 -+#endif - #define STB_IMAGE_IMPLEMENTATION - #include "pxr/imaging/hio/stb/stb_image.h" - -@@ -55,6 +58,9 @@ ARCH_PRAGMA_UNUSED_FUNCTION - #include "pxr/imaging/hio/stb/stb_image_resize.h" - - #define STB_IMAGE_WRITE_STATIC -+#ifdef ARCH_OS_WINDOWS -+#define STBIW_WINDOWS_UTF8 -+#endif - #define STB_IMAGE_WRITE_IMPLEMENTATION - #include "pxr/imaging/hio/stb/stb_image_write.h" - diff --git a/USD-21.11-disable-malloc-hooks.patch b/USD-21.11-disable-malloc-hooks.patch deleted file mode 100644 index e9164cb..0000000 --- a/USD-21.11-disable-malloc-hooks.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff -Naur USD-21.11-original/pxr/base/arch/mallocHook.cpp USD-21.11/pxr/base/arch/mallocHook.cpp ---- USD-21.11-original/pxr/base/arch/mallocHook.cpp 2021-11-01 13:10:51.000000000 -0400 -+++ USD-21.11/pxr/base/arch/mallocHook.cpp 2022-03-31 17:26:22.176739670 -0400 -@@ -177,7 +177,7 @@ - _underlyingMemalignFunc || _underlyingFreeFunc; - } - --#if defined(ARCH_OS_LINUX) -+#if 0 - template - static bool _GetSymbol(T* addr, const char* name, string* errMsg) { - if (void* symbol = dlsym(RTLD_DEFAULT, name)) { -@@ -241,8 +241,8 @@ - ARCH_UNUSED_ARG void (*freeWrapper)(void*, const void*), - string* errMsg) - { --#if !defined(ARCH_OS_LINUX) -- *errMsg = "ArchMallocHook functionality not implemented for non-linux systems"; -+#if 1 -+ *errMsg = "ArchMallocHook functionality not implemented"; - return false; - #else - if (IsInitialized()) { diff --git a/USD-22.05-OpenEXR3.patch b/USD-22.05-OpenEXR3.patch deleted file mode 100644 index 3583fb5..0000000 --- a/USD-22.05-OpenEXR3.patch +++ /dev/null @@ -1,186 +0,0 @@ -diff -Naur USD-22.05-original/cmake/defaults/Packages.cmake USD-22.05/cmake/defaults/Packages.cmake ---- USD-22.05-original/cmake/defaults/Packages.cmake 2022-04-22 14:48:13.000000000 -0400 -+++ USD-22.05/cmake/defaults/Packages.cmake 2022-05-24 18:51:26.406485870 -0400 -@@ -188,6 +188,7 @@ - # --OpenImageIO - if (PXR_BUILD_OPENIMAGEIO_PLUGIN) - find_package(OpenEXR REQUIRED) -+ find_package(Imath REQUIRED) - find_package(OpenImageIO REQUIRED) - add_definitions(-DPXR_OIIO_PLUGIN_ENABLED) - if (OIIO_idiff_BINARY) -@@ -256,7 +257,7 @@ - endif() - # --OpenVDB - if (PXR_ENABLE_OPENVDB_SUPPORT) -- find_package(OpenEXR REQUIRED) -+ find_package(Imath REQUIRED) - find_package(OpenVDB REQUIRED) - add_definitions(-DPXR_OPENVDB_SUPPORT_ENABLED) - endif() -@@ -285,7 +286,7 @@ - - if (PXR_BUILD_ALEMBIC_PLUGIN) - find_package(Alembic REQUIRED) -- find_package(OpenEXR REQUIRED) -+ find_package(Imath REQUIRED) - if (PXR_ENABLE_HDF5_SUPPORT) - find_package(HDF5 REQUIRED - COMPONENTS -@@ -307,6 +308,7 @@ - if(PXR_ENABLE_OSL_SUPPORT) - find_package(OSL REQUIRED) - find_package(OpenEXR REQUIRED) -+ find_package(Imath REQUIRED) - add_definitions(-DPXR_OSL_SUPPORT_ENABLED) - endif() - -diff -Naur USD-22.05-original/cmake/modules/FindOpenEXR.cmake USD-22.05/cmake/modules/FindOpenEXR.cmake ---- USD-22.05-original/cmake/modules/FindOpenEXR.cmake 2022-04-22 14:48:13.000000000 -0400 -+++ USD-22.05/cmake/modules/FindOpenEXR.cmake 1969-12-31 19:00:00.000000000 -0500 -@@ -1,101 +0,0 @@ --# --# Copyright 2016 Pixar --# --# Licensed under the Apache License, Version 2.0 (the "Apache License") --# with the following modification; you may not use this file except in --# compliance with the Apache License and the following modification to it: --# Section 6. Trademarks. is deleted and replaced with: --# --# 6. Trademarks. This License does not grant permission to use the trade --# names, trademarks, service marks, or product names of the Licensor --# and its affiliates, except as required to comply with Section 4(c) of --# the License and to reproduce the content of the NOTICE file. --# --# You may obtain a copy of the Apache License at --# --# http://www.apache.org/licenses/LICENSE-2.0 --# --# Unless required by applicable law or agreed to in writing, software --# distributed under the Apache License with the above modification is --# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY --# KIND, either express or implied. See the Apache License for the specific --# language governing permissions and limitations under the Apache License. --# -- --find_path(OPENEXR_INCLUDE_DIR -- OpenEXR/half.h --HINTS -- "${OPENEXR_LOCATION}" -- "$ENV{OPENEXR_LOCATION}" --PATH_SUFFIXES -- include/ --DOC -- "OpenEXR headers path" --) -- --if(OPENEXR_INCLUDE_DIR) -- set(openexr_config_file "${OPENEXR_INCLUDE_DIR}/OpenEXR/OpenEXRConfig.h") -- if(EXISTS ${openexr_config_file}) -- file(STRINGS -- ${openexr_config_file} -- TMP -- REGEX "#define OPENEXR_VERSION_STRING.*$") -- string(REGEX MATCHALL "[0-9.]+" OPENEXR_VERSION ${TMP}) -- -- file(STRINGS -- ${openexr_config_file} -- TMP -- REGEX "#define OPENEXR_VERSION_MAJOR.*$") -- string(REGEX MATCHALL "[0-9]" OPENEXR_MAJOR_VERSION ${TMP}) -- -- file(STRINGS -- ${openexr_config_file} -- TMP -- REGEX "#define OPENEXR_VERSION_MINOR.*$") -- string(REGEX MATCHALL "[0-9]" OPENEXR_MINOR_VERSION ${TMP}) -- endif() --endif() -- --foreach(OPENEXR_LIB -- Half -- Iex -- Imath -- IlmImf -- IlmThread -- IlmImfUtil -- IexMath -- ) -- -- # OpenEXR libraries may be suffixed with the version number, so we search -- # using both versioned and unversioned names. -- find_library(OPENEXR_${OPENEXR_LIB}_LIBRARY -- NAMES -- ${OPENEXR_LIB}-${OPENEXR_MAJOR_VERSION}_${OPENEXR_MINOR_VERSION} -- ${OPENEXR_LIB} -- HINTS -- "${OPENEXR_LOCATION}" -- "$ENV{OPENEXR_LOCATION}" -- PATH_SUFFIXES -- lib/ -- DOC -- "OPENEXR's ${OPENEXR_LIB} library path" -- ) -- -- if(OPENEXR_${OPENEXR_LIB}_LIBRARY) -- list(APPEND OPENEXR_LIBRARIES ${OPENEXR_${OPENEXR_LIB}_LIBRARY}) -- endif() --endforeach(OPENEXR_LIB) -- --# So #include works --list(APPEND OPENEXR_INCLUDE_DIRS ${OPENEXR_INCLUDE_DIR}) --list(APPEND OPENEXR_INCLUDE_DIRS ${OPENEXR_INCLUDE_DIR}/OpenEXR) -- --include(FindPackageHandleStandardArgs) --find_package_handle_standard_args(OpenEXR -- REQUIRED_VARS -- OPENEXR_INCLUDE_DIRS -- OPENEXR_LIBRARIES -- VERSION_VAR -- OPENEXR_VERSION --) -- -diff -Naur USD-22.05-original/pxr/imaging/hioOpenVDB/CMakeLists.txt USD-22.05/pxr/imaging/hioOpenVDB/CMakeLists.txt ---- USD-22.05-original/pxr/imaging/hioOpenVDB/CMakeLists.txt 2022-04-22 14:48:13.000000000 -0400 -+++ USD-22.05/pxr/imaging/hioOpenVDB/CMakeLists.txt 2022-05-24 18:51:26.407485884 -0400 -@@ -14,7 +14,7 @@ - hio - tf - usd -- ${OPENEXR_Half_LIBRARY} -+ ${IMATH_LIBRARIES} - ${OPENVDB_LIBRARY} - - INCLUDE_DIRS -diff -Naur USD-22.05-original/pxr/imaging/plugin/hioOiio/CMakeLists.txt USD-22.05/pxr/imaging/plugin/hioOiio/CMakeLists.txt ---- USD-22.05-original/pxr/imaging/plugin/hioOiio/CMakeLists.txt 2022-04-22 14:48:13.000000000 -0400 -+++ USD-22.05/pxr/imaging/plugin/hioOiio/CMakeLists.txt 2022-05-24 18:51:26.407485884 -0400 -@@ -16,6 +16,7 @@ - tf - ${OIIO_LIBRARIES} - ${OPENEXR_LIBRARIES} -+ ${IMATH_LIBRARIES} - - INCLUDE_DIRS - ${OIIO_INCLUDE_DIRS} -diff -Naur USD-22.05-original/pxr/usd/plugin/usdAbc/CMakeLists.txt USD-22.05/pxr/usd/plugin/usdAbc/CMakeLists.txt ---- USD-22.05-original/pxr/usd/plugin/usdAbc/CMakeLists.txt 2022-04-22 14:48:13.000000000 -0400 -+++ USD-22.05/pxr/usd/plugin/usdAbc/CMakeLists.txt 2022-05-24 18:51:26.407485884 -0400 -@@ -23,15 +23,12 @@ - usd - usdGeom - ${ALEMBIC_LIBRARIES} -- ${OPENEXR_Half_LIBRARY} -- ${OPENEXR_Imath_LIBRARY} -- ${OPENEXR_Iex_LIBRARY} -- ${OPENEXR_IexMath_LIBRARY} -+ ${IMATH_LIBRARIES} - ${optionalLibs} - - INCLUDE_DIRS - ${ALEMBIC_INCLUDE_DIR} -- ${OPENEXR_INCLUDE_DIRS} -+ ${IMATH_INCLUDE_DIRS} - ${optionalIncludeDirs} - - PRIVATE_CLASSES diff --git a/USD-22.05-soversion.patch b/USD-22.05-soversion.patch deleted file mode 100644 index ef09b72..0000000 --- a/USD-22.05-soversion.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff -Naur USD-22.05-original/cmake/defaults/Version.cmake USD-22.05/cmake/defaults/Version.cmake ---- USD-22.05-original/cmake/defaults/Version.cmake 2022-04-22 14:48:13.000000000 -0400 -+++ USD-22.05/cmake/defaults/Version.cmake 2022-05-24 18:49:29.199851843 -0400 -@@ -27,3 +27,9 @@ - set(PXR_PATCH_VERSION "5") - - math(EXPR PXR_VERSION "${PXR_MAJOR_VERSION} * 10000 + ${PXR_MINOR_VERSION} * 100 + ${PXR_PATCH_VERSION}") -+ -+set(PXR_DOWNSTREAM_SOVERSION "${PXR_MAJOR_VERSION}.${PXR_MINOR_VERSION}.${PXR_PATCH_VERSION}" -+ CACHE -+ STRING -+ "Downstream shared object version" -+) -diff -Naur USD-22.05-original/cmake/macros/Private.cmake USD-22.05/cmake/macros/Private.cmake ---- USD-22.05-original/cmake/macros/Private.cmake 2022-04-22 14:48:13.000000000 -0400 -+++ USD-22.05/cmake/macros/Private.cmake 2022-05-24 18:49:29.200851859 -0400 -@@ -1285,6 +1285,7 @@ - PREFIX "${args_PREFIX}" - SUFFIX "${args_SUFFIX}" - PUBLIC_HEADER "${args_PUBLIC_HEADERS}" -+ SOVERSION ${PXR_DOWNSTREAM_SOVERSION} - ) - - set(pythonEnabled "PXR_PYTHON_ENABLED=1") -diff -Naur USD-22.05-original/cmake/macros/Public.cmake USD-22.05/cmake/macros/Public.cmake ---- USD-22.05-original/cmake/macros/Public.cmake 2022-04-22 14:48:13.000000000 -0400 -+++ USD-22.05/cmake/macros/Public.cmake 2022-05-24 18:49:29.201851876 -0400 -@@ -998,6 +998,7 @@ - FOLDER "${folder}" - PREFIX "${PXR_LIB_PREFIX}" - IMPORT_PREFIX "${PXR_LIB_PREFIX}" -+ SOVERSION ${PXR_DOWNSTREAM_SOVERSION} - ) - _get_install_dir("lib" libInstallPrefix) - install( diff --git a/org.openusd.usdview.desktop b/org.openusd.usdview.desktop index 71aa0d2..4be9905 100644 --- a/org.openusd.usdview.desktop +++ b/org.openusd.usdview.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Name=USD view GenericName=Universal Scene Description Viewer -Comment=Open .cbr & .cbz files +Comment=Visualize USD files Exec=usdview Icon=applications-graphics Terminal=false diff --git a/sources b/sources index 630fba6..695949f 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (usd-22.05b.tar.gz) = 9a68ae60fe1826e3f100b3715bc41b622813caaa83dbde833d085fb2b18449bd5ec3241d74264ed8f6ea999e2652db5c8c572cd1399210f86a60483be6bc6aea +SHA512 (OpenUSD-26.08.tar.gz) = 82f7bb4f77b295be79cd36f591f242276d36c0d589b0fca383344c27e70daf7e29151bf587528bb2fc2b2a8b974387a253993ace3caf5f79ae70f9ebbc71cf1a diff --git a/stb_image.patch b/stb_image.patch deleted file mode 100644 index a8a3a30..0000000 --- a/stb_image.patch +++ /dev/null @@ -1,155 +0,0 @@ ---- stb/stb_image.h 2021-09-16 11:52:38.284782000 -0700k -+++ stb_image.h 2021-09-16 13:45:48.159770000 -0700 -@@ -488,14 +488,14 @@ - STBIDEF void stbi_image_free (void *retval_from_stbi_load); - - // get image dimensions & components without fully decoding --STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); --STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); -+STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, float *gamma); -+STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, float *gamma); - STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); - STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); - - #ifndef STBI_NO_STDIO --STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); --STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); -+STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp, float *gamma); -+STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp, float *gamma); - STBIDEF int stbi_is_16_bit (char const *filename); - STBIDEF int stbi_is_16_bit_from_file(FILE *f); - #endif -@@ -911,7 +911,7 @@ - #ifndef STBI_NO_PNG - static int stbi__png_test(stbi__context *s); - static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); --static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); -+static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp, float *gamma); - static int stbi__png_is16(stbi__context *s); - #endif - -@@ -4554,6 +4554,7 @@ - stbi__context *s; - stbi_uc *idata, *expanded, *out; - int depth; -+ float gamma = 0; - } stbi__png; - - -@@ -5112,6 +5113,13 @@ - break; - } - -+ case STBI__PNG_TYPE('g','A','M','A'): { -+ if (first) return stbi__err("first not IHDR", "Corrupt PNG"); -+ if (4 != c.length) return stbi__err("invalid gAMA","Corrupt PNG"); -+ z->gamma = stbi__get32be(s) / 100000.0f; -+ break; -+ } -+ - case STBI__PNG_TYPE('I','D','A','T'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); -@@ -5243,7 +5251,7 @@ - return r; - } - --static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) -+static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp, float *gamma) - { - if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { - stbi__rewind( p->s ); -@@ -5252,21 +5260,22 @@ - if (x) *x = p->s->img_x; - if (y) *y = p->s->img_y; - if (comp) *comp = p->s->img_n; -+ if (gamma) *gamma = p->gamma; - return 1; - } - --static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) -+static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp, float *gamma) - { - stbi__png p; - p.s = s; -- return stbi__png_info_raw(&p, x, y, comp); -+ return stbi__png_info_raw(&p, x, y, comp, gamma); - } - - static int stbi__png_is16(stbi__context *s) - { - stbi__png p; - p.s = s; -- if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) -+ if (!stbi__png_info_raw(&p, NULL, NULL, NULL, NULL)) - return 0; - if (p.depth != 16) { - stbi__rewind(p.s); -@@ -7538,14 +7547,14 @@ - } - #endif - --static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) -+static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp, float *gamma) - { - #ifndef STBI_NO_JPEG - if (stbi__jpeg_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNG -- if (stbi__png_info(s, x, y, comp)) return 1; -+ if (stbi__png_info(s, x, y, comp, gamma)) return 1; - #endif - - #ifndef STBI_NO_GIF -@@ -7597,23 +7606,23 @@ - } - - #ifndef STBI_NO_STDIO --STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) -+STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp, float *gamma) - { - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); -- result = stbi_info_from_file(f, x, y, comp); -+ result = stbi_info_from_file(f, x, y, comp, gamma); - fclose(f); - return result; - } - --STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) -+STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp, float *gamma) - { - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); -- r = stbi__info_main(&s,x,y,comp); -+ r = stbi__info_main(&s,x,y,comp, gamma); - fseek(f,pos,SEEK_SET); - return r; - } -@@ -7640,18 +7649,18 @@ - } - #endif // !STBI_NO_STDIO - --STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) -+STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, float *gamma) - { - stbi__context s; - stbi__start_mem(&s,buffer,len); -- return stbi__info_main(&s,x,y,comp); -+ return stbi__info_main(&s,x,y,comp, gamma); - } - --STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) -+STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp, float *gamma) - { - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); -- return stbi__info_main(&s,x,y,comp); -+ return stbi__info_main(&s,x,y,comp, gamma); - } - - STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) diff --git a/usd.spec b/usd.spec index 57f963c..05bcd6e 100644 --- a/usd.spec +++ b/usd.spec @@ -2,65 +2,105 @@ # package version, as a reminder of the need to rebuild dependent packages on # every update. See additional notes near the downstream ABI versioning patch. # It should be 0.MAJOR.MINOR without leading zeros, e.g. 22.03 → 0.22.3. -%global downstream_so_version 0.22.5 +%global downstream_so_version 0.26.8 -%bcond_without alembic -%bcond_with documentation -%bcond_without embree -%bcond_without imaging -%bcond_with jemalloc -%bcond_with openshading -%bcond_with openvdb -%bcond_without ocio -%bcond_without oiio -%bcond_without python3 -%bcond_without usdview +%bcond alembic 1 +%bcond draco 1 +%bcond embree 1 +%bcond jemalloc 0 +%bcond materialx 1 +# Default "UNIX Makefiles" backend for CMake would also work fine; ninja is a +# bit faster. We conditionalize it just in case there are backend-specific +# issues in the future. +%bcond ninja 1 +%bcond openshading 1 +%bcond openvdb 1 +%bcond ocio 1 +%bcond oiio 1 +%bcond ptex 1 +%bcond usdview 1 # TODO: Figure out how to re-enable the tests. Currently these want to install -# into /usr/tests and, and there are issues with the launchers finding the +# into /usr/tests, and there are issues with the launchers finding the # command-line tools in the buildroot. -%bcond_with test +%bcond test 0 Name: usd -Version: 22.05b -Release: %autorelease -b 9 +Version: 26.08 +Release: %autorelease Summary: 3D VFX pipeline interchange file format -# The entire source is Apache-2.0 except: +# The entire source is Pixar except: # +# Apache-2.0: +# - pxr/imaging/hgiVulkan/spirv_reflect.{cpp,h} +# - pxr/imaging/plugin/hdEmbree/pxrPbrt/pbrtUtils.h +# - pxr/imaging/plugin/hdEmbree/pxrIES/pxr-IES.patch +# - pxr/imaging/plugin/hdEmbree/pxrIES/ies.{cpp,h} # BSD-3-Clause: # - pxr/base/gf/ilmbase_* -# - pxr/base/js/rapidjson/msinttypes/ -# - pxr/base/tf/pxrDoubleConversion/ +# - pxr/base/js/rapidjson/msinttypes/ (removed in %%prep) +# - pxr/base/tf/pxrCLI11/ (removed in %%prep) +# - pxr/base/tf/pxrDoubleConversion/ (removed in %%prep) +# - pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/ +# - pxr/imaging/plugin/hioAvif/AVIF/src/src-libyuv/ # BSD-2-Clause: -# - pxr/base/tf/pxrLZ4/ +# - pxr/base/tf/pxrLZ4/ (removed in %%prep) +# - pxr/imaging/plugin/hioAvif/AVIF/, except +# pxr/imaging/plugin/hioAvif/AVIF/src/src-libyuv/; +# pxr/imaging/plugin/hioAvif/AVIF/src/avif_obu.c has a different copyright +# - pxr/imaging/plugin/hioAvif/aom/ +# BSL-1.0: +# - pxr/external/boost/ # MIT: -# - pxr/imaging/garch/khrplatform.h -# - pxr/base/js/rapidjson/, except pxr/base/js/rapidjson/msinttypes/ -# - third_party/renderman-24/plugin/rmanArgsParser/pugixml/ +# - docs/doxygen/doxygen-awesome-css/ (removed in %%prep) +# - pxr/base/js/rapidjson/, except pxr/base/js/rapidjson/msinttypes/ (both +# removed in %%prep) +# - pxr/base/pegtl/ # - pxr/base/tf/pxrTslRobinMap/ +# - pxr/imaging/garch/khrplatform.h # - pxr/imaging/hgiVulkan/vk_mem_alloc.h +# - pxr/imaging/plugin/hioOpenEXR/OpenEXR/deflate/ (removed in %%prep) +# - third_party/renderman/plugin/rmanArgsParser/pugixml/ (removed in %%prep) # MIT OR Unlicense: # - pxr/imaging/hio/stb/ -# Apache-2.0 AND GPL-3.0-or-later WITH Bison-exception-2.2: +# Pixar AND GPL-3.0-or-later WITH Bison-exception-2.2: # - pxr/usd/sdf/path.tab.{cpp,h} # - pxr/usd/sdf/textFileFormat.tab.{cpp,h} -# - third_party/renderman-24/plugin/hdPrman/virtualStructConditionalGrammar.tab.{cpp,h} +# - third_party/renderman/plugin/hdPrman/virtualStructConditionalGrammar.tab.{cpp,h} +# +# Additionally, the following would be listed above but are removed in %%prep: +# +# Apache-2.0: +# - pxr/usdImaging/usdviewq/fonts/Roboto_Mono/ +# - pxr/usdImaging/usdviewq/fonts/Roboto/ +# MIT: +# - docs/doxygen/doxygen-awesome-css/ (except doxygen-awesome-darkmode-toggle.js) +# MIT AND Apache-2.0: +# - docs/doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js # # (Certain build system files are also under licenses other than Apache-2.0, but # do not contribute their license terms to the built RPMs.) -License: Apache-2.0 AND BSD-3-Clause AND BSD-2-Clause AND MIT AND (MIT OR Unlicense) AND (Apache-2.0 AND GPL-3.0-or-later WITH Bison-exception-2.2) +# +# Note that the license assigned the SPDX identifier Pixar was later officially +# named Tomorrow Open Source Technology License 1.0, TOST-1.0, with no change +# to its terms. +License: %{shrink: + Pixar AND + Apache-2.0 AND + BSD-3-Clause AND + BSD-2-Clause AND + BSL-1.0 AND + MIT AND + (MIT OR Unlicense) AND + (Pixar AND GPL-3.0-or-later WITH Bison-exception-2.2) + } URL: http://www.openusd.org/ -%global forgeurl https://github.com/PixarAnimationStudios/%{name} -Source0: %{forgeurl}/archive/v%{version}/%{name}-%{version}.tar.gz -Source1: org.open%{name}.%{name}view.desktop -# Latest stb_image.patch that applies cleanly against 2.27: -# %%{forgeurl}/raw/8f9bb9563980b41e7695148b63bf09f7abd38a41/pxr/imaging/hio/stb/stb_image.patch -# We treat this as a source file because it is applied separately during -# unbundling. It has been hand-edited to apply to 2.28, where -# stbi__unpremultiply_on_load_thread is already renamed to -# stbi_set_unpremultiply_on_load_thread. -Source2: stb_image.patch +%global forgeurl https://github.com/PixarAnimationStudios/OpenUSD +Source0: %{forgeurl}/archive/v%{version}/OpenUSD-%{version}.tar.gz +Source1: org.openusd.usdview.desktop +# Downstream-only: add an SONAME version +# # Upstream was asked about .so versioning and setting SONAME properly and # seemed unprepared to handle the request: # https://github.com/PixarAnimationStudios/USD/issues/1259#issuecomment-657120216 @@ -85,101 +125,144 @@ Source2: stb_image.patch # to be versioned as well, which is undesired. This is not a serious problem # because we do not want to package the built plugin anyway. (It should not be # built with -DPXR_BUILD_EXAMPLES=OFF, but it is.) -Patch: USD-22.05-soversion.patch -# Add missing #include for GCC13 -# https://github.com/PixarAnimationStudios/USD/pull/2215 -Patch: %{forgeurl}/pull/2215.patch +Patch: 0001-Downstream-only-add-an-SONAME-version.patch -# Support OpenEXR 3 -# https://github.com/PixarAnimationStudios/USD/issues/1591 +# Downstream-only: use Valgrind macro instead of inline assembly # -# See also: -# Support compiling against imath -# https://github.com/PixarAnimationStudios/USD/pull/1829 -# Support OpenVDB without depending on OpenEXR -# https://github.com/PixarAnimationStudios/USD/pull/1728 -Patch: USD-22.05-OpenEXR3.patch +# Upstream already has a plan to make this change, but is waiting to be +# able to add a build dependency on valgrind-devel. We have no such +# obstacle, and this change fixes the inline assembly failing to compile +# on aarch64. +Patch: 0001-Downstream-only-use-Valgrind-macro-instead-of-inline.patch -# Allow building against recent glibc with no malloc hooks (>= 2.34) -# https://github.com/PixarAnimationStudios/USD/pull/1830 -Patch: %{forgeurl}/pull/1830.patch +# Downstream-only: use the system double-conversion library +Patch: 0001-Downstream-only-use-the-system-double-conversion-lib.patch +# Downstream-only: use the system lz4 library +Patch: 0002-Downstream-only-use-the-system-lz4-library.patch +# Downstream-only: use the system pugixml library +Patch: 0003-Downstream-only-use-the-system-pugixml-library.patch +# Downstream-only: use the system rapidjson library +Patch: 0004-Downstream-only-use-the-system-rapidjson-library.patch +# Downstream-only: use the system libdeflate library +Patch: 0005-Downstream-only-use-the-system-libdeflate.patch +# Downstream-only: use the system libavif library +Patch: 0006-Downstream-only-use-the-system-libavif.patch -# Do not access PyFrameObject fields directly on Python 3.10+ -# -# Fixes a Python 3.11 incompatibility. Still accesses PyCodeObject fields -# directly. -# https://github.com/PixarAnimationStudios/USD/pull/1928 -Patch: %{forgeurl}/pull/1928.patch +# Backport fixes for CVE-2025-64181 etc. in OpenEXRCore +# https://github.com/PixarAnimationStudios/OpenUSD/pull/3903 +Patch: %{forgeurl}/pull/3903.patch -# Port to Embree 4.x -# https://github.com/PixarAnimationStudios/USD/pull/2266 -Patch: %{forgeurl}/pull/2266.patch +# Replace PyWeakref_GetObject with PyWeakref_GetRef +# Fixes RHBZ#2433881. This patch is LLM-generated and needs expert human +# review, but it at least builds. See discussion in +# https://bugzilla.redhat.com/show_bug.cgi?id=2433881. +# Mentioned upstream in +# https://github.com/PixarAnimationStudios/OpenUSD/issues/3966#issuecomment-5128542913. +Patch: 0001-Replace-PyWeakref_GetObject-with-PyWeakref_GetRef.patch # Base -BuildRequires: boost-devel -BuildRequires: boost-program-options -BuildRequires: cmake -BuildRequires: dos2unix BuildRequires: gcc-c++ -BuildRequires: pkgconfig(blosc) -BuildRequires: pkgconfig(tbb) -# Documentation -%if %{with documentation} -BuildRequires: doxygen -BuildRequires: graphviz +BuildRequires: cmake +%if %{with ninja} +BuildRequires: ninja-build %endif -# For imaging and usd imaging -%if %{with imaging} +BuildRequires: dos2unix +BuildRequires: help2man + +BuildRequires: pkgconfig(blosc) +BuildRequires: pkgconfig(dri) +BuildRequires: hdf5-devel +BuildRequires: cmake(OpenSubdiv) +BuildRequires: pkgconfig(tbb) +# This seems to be an indirect dependency, probably through OpenSubdiv. +# Ideally, everything would take care of its own dependencies, and we wouldn’t +# have to specify it directly, but we haven’t studied the problem closely +# enough to propose a fix. +BuildRequires: pkgconfig(OpenCL) +# Unbundled: +BuildRequires: cmake(double-conversion) +BuildRequires: pkgconfig(liblz4) +BuildRequires: cli11-devel cli11-static +BuildRequires: cmake(pugixml) +BuildRequires: rapidjson-devel rapidjson-static +BuildRequires: robin-map-devel robin-map-static +BuildRequires: pkgconfig(libdeflate) +# Unbundling this means we also use external versions of libaom and libyuv. +BuildRequires: pkgconfig(libavif) + +BuildRequires: cmake(Imath) >= 3.0 + +# Introduced by 0001-Downstream-only-use-Valgrind-macro-instead-of-inline.patch +BuildRequires: valgrind-devel + +%if %{with alembic} +BuildRequires: cmake(Alembic) +%endif + +%if %{with draco} +BuildRequires: draco-devel +%endif %if %{with embree} BuildRequires: embree-devel %endif + +%if %{with jemalloc} +BuildRequires: pkgconfig(jemalloc) +%endif + +%if %{with materialx} +BuildRequires: cmake(materialx) +BuildRequires: materialx-data +BuildRequires: pkgconfig(xt) +BuildRequires: python3-materialx +%endif + +%if %{with ocio} +BuildRequires: cmake(OpenColorIO) +%endif + +%if %{with oiio} +BuildRequires: cmake(OpenImageIO) +%endif + %if %{with openshading} BuildRequires: openshadinglanguage BuildRequires: pkgconfig(oslexec) %endif -BuildRequires: opensubdiv-devel + %if %{with openvdb} BuildRequires: openvdb-devel %endif -BuildRequires: pkgconfig(dri) -%if %{with jemalloc} -BuildRequires: pkgconfig(jemalloc) -%endif -%if %{with ocio} -BuildRequires: cmake(OpenColorIO) -%endif -%if %{with oiio} -BuildRequires: pkgconfig(OpenImageIO) -%endif -BuildRequires: cmake(OpenEXR) -BuildRequires: cmake(Imath) >= 2.0 -BuildRequires: pkgconfig(Ptex) -%endif -%if %{with alembic} -BuildRequires: cmake(Alembic) -BuildRequires: hdf5-devel +%if %{with ptex} +BuildRequires: cmake(ptex) %endif # Header-only library: -static is for tracking per guidelines # -# Enforce the the minimum EVR to contain fixes for all of CVE-2021-28021, -# CVE-2021-42715, CVE-2021-42716, and CVE-2022-28041, plus the null-pointer -# dereference bug https://github.com/nothings/stb/issues/1452. -BuildRequires: stb_image-devel >= 2.28^20230129git5736b15-0.2 -BuildRequires: stb_image-static -BuildRequires: stb_image_write-devel >= 1.16 -BuildRequires: stb_image_write-static -BuildRequires: stb_image_resize-devel >= 0.97 -BuildRequires: stb_image_resize-static +# Enforce the the minimum EVR to contain fixes for all of: +# CVE-2021-28021 +# CVE-2021-42715 +# CVE-2021-42716 +# CVE-2022-28041 +# CVE-2023-43898 +# CVE-2023-45661 +# CVE-2023-45662 +# CVE-2023-45663 +# CVE-2023-45664 +# CVE-2023-45666 +# CVE-2023-45667 +# https://github.com/nothings/stb/issues/1860 +# https://github.com/nothings/stb/issues/1861 +BuildRequires: stb_image-static >= 2.30^20251025gitf1c79c0-2 +BuildRequires: stb_image_write-static >= 1.16 +BuildRequires: stb_image_resize-static >= 0.97 -Requires: %{name}-libs%{?_isa} = %{version}-%{release} -%if %{with python3} -Requires: python3-%{name}%{?_isa} = %{version}-%{release} -%endif +Requires: usd-libs%{?_isa} = %{version}-%{release} +Requires: python3-usd%{?_isa} = %{version}-%{release} # This package is only available for x86_64 and aarch64 # Will fail to build on other architectures @@ -187,7 +270,7 @@ Requires: python3-%{name}%{?_isa} = %{version}-%{release} # # Note that pxr/base/arch/assumptions.cpp explicitly tests the machine is not # big-endian, and pxr/base/arch/defines.h explicitly enforces x86_64 or ARM64. -ExclusiveArch: aarch64 x86_64 +ExclusiveArch: %{arm64} %{x86_64} %description Universal Scene Description (USD) is a time-sampled scene @@ -196,29 +279,130 @@ description for interchange between graphics applications. %package libs Summary: Universal Scene Description library -# Upstream bundles # Filed ticket to convince upstream to use system libraries -# https://github.com/PixarAnimationStudios/USD/issues/1490 -# Version from: pxr/base/tf/pxrDoubleConversion/README -Provides: bundled(double-conversion) = 2.0.0 +# Use system libraries instead of bundling them when possible +# https://github.com/PixarAnimationStudios/USD/issues/1490 +# See also: +# Path to using external/system copies of OpenEXRCore and libdeflate? +# https://github.com/PixarAnimationStudios/OpenUSD/issues/2619 # Version from: pxr/base/gf/ilmbase_half.README +# +# This is difficult to unbundle even in the manner of double-conversion: code +# that uses the half type is compatible with ilmbase version 2 (as packaged in +# openexr2) rather than version 3 (as packaged in the ilmbase package). +# Unfortunately, we need cmake(Imath) elsewhere in the package, and this comes +# from the imath package (version 3), which conflicts with the imath version 2 +# libraries included with openexr2. So this will not be possible until the +# surrounding code is patched (upstream or downstream) for compatibility with +# ilmbase version 3, something we’re currently not willing to attempt. Provides: bundled(ilmbase) = 2.5.3 +# Version from: pxr/base/pegtl/pegtl/version.hpp +# Currently, Fedora’s PEGTL is too old: +# https://bugzilla.redhat.com/show_bug.cgi?id=1902427 +Provides: bundled(PEGTL) = 3.2.7 +# Version from +# pxr/imaging/plugin/hioOpenEXR/OpenEXR/OpenEXRCore/openexr_version.h +# From pxr/imaging/plugin/hioOpenEXR/OpenEXR/README.md: +# A few changes are still in progress to upstreamed to the OpenEXR project, +# but these are minor, and otherwise, almost all differences between the +# interred OpenEXRCore and the official OpenEXR repo are consolidated to the +# openexr_conf.h header. The remaining differences are removing an extern +# marking from the few global data tables. +# This suggests that it may not be entirely safe to unbundle this. +Provides: bundled(openexr) = 3.2.0 +# Version from the message for the commit +# e7a8d718c7c113e1c653ee31dc52421f17e09b42 that introduced pxr/external/boost/: +# +# python: Initial import of boost::python from boost 1.85.0 +# This change just brings boost::python into the tree as a starting point for +# the pxr_boost::python implementation. The src/ and test/ directories are +# placed next to the public headers since we don't have separate +# public/private directory hierarchies like boost, but the code itself is +# unchanged and not included in the build. +# +# We use boost 1.85.0 as the starting point even though we're currently on +# VFX Reference Platform 2022, which specifies boost 1.76.0. This is because +# later versions of boost are needed for other platforms and versions of +# Python that OpenUSD supports. For example Python 3.11 requires boost +# 1.82.0+. +# +# This is not a candidate for unbundling because upstream has explicitly forked +# boost::python and modified it to work without the rest of Boost as part of an +# effort to remove the Boost dependency. While pxr_boost::python is derived +# from boost::python, it is not intended to remain compatible with it. +Provides: bundled(boost) = 1.85.0 +# From LICENSE.txt: +# =========================================================== +# PBRT (Sampling functions) +# ============================================================ +# USD includes code derived from the pbrt-v4 library, retrieved from +# https://github.com/mmp/pbrt-v4/tree/8c19f304558fd7681e2fef2c395a689d0106fb05, which was +# provided subject to the unmodified Apache 2.0 license. For details, see +# https://github.com/mmp/pbrt-v4/blob/8c19f304558fd7681e2fef2c395a689d0106fb05/LICENSE.txt +# +# The bundled routines in pxr/imaging/plugin/hdEmbree/pxrPbrt/pbrtUtils.h are +# just a handful of small internal utility functions. It would not be +# reasonable to add a dependency on the full pbrt ray tracer even if these were +# exposed in a public API. +Provides: bundled(pbrt-v4) = 4~20251208.8c19f30 +# From LICENSE.txt: +# ============================================================ +# Cycles (IES reader) +# ============================================================ +# USD includes classes from the Blender Foundation's Cycles project, retrieved from +# https://projects.blender.org/blender/cycles/src/commit/0be21d452506ec90259b9063c28b5a6fc1cac6a1, +# which was provided subject to the unmodified Apache 2.0 license. For details, see +# https://projects.blender.org/blender/cycles/src/commit/0be21d452506ec90259b9063c28b5a6fc1cac6a1/LICENSE +# +# These are not a candidate for unbundling because they are internal utility +# functions not available in the public API. There are also some minor +# modifications for OpenUSD, documented in +# pxr/imaging/plugin/hdEmbree/pxrIES/pxr-IES.patch. +# +# Is this commit a post-release snapshot of 4.5.0, or a pre-release snapshot of +# 5.0.0? How can we tell? There doesn’t seem to be a project version number +# embedded in the source tree. Since this commit hash is only two commits ahead +# of the v4.5.0 tag, we consider it a 4.5.0 post-release. +Provides: bundled(cycles) = 4.5.0^20251210.0be21d4 + +# We are currently able to unbundle these and use system libraries, but we +# retain the virtual Provides, commented out, as documentation and in case we +# ever have to switch back to the bundled versions. +# +# Version from: pxr/base/tf/pxrDoubleConversion/README +# Provides: bundled(double-conversion) = 3.3.0 # Version from: pxr/base/tf/pxrLZ4/lz4.h (LZ4_VERSION_{MAJOR,MINOR_PATCH}) -Provides: bundled(lz4) = 1.9.2 +# Provides: bundled(lz4) = 1.9.2 +# Version from: pxr/base/tf/pxrCLI11/README.md +# Provides: bundled(cli11) = 2.3.1 # Version from: -# third_party/renderman-24/plugin/rmanArgsParser/pugixml/pugiconfig.hpp +# third_party/renderman/plugin/rmanArgsParser/pugixml/pugiconfig.hpp # (header comment) -Provides: bundled(pugixml) = 1.9 +# Provides: bundled(pugixml) = 1.9 # Version from: pxr/base/js/rapidjson/rapidjson.h # (RAPIDJSON_{MAJOR,MINOR,PATCH}_VERSION) -Provides: bundled(rapidjson) = 1.0.2 -# Version from: pxr/imaging/hgiVulkan/spirv_reflect.h (header comment) -Provides: bundled(SPIRV-Reflect) = 1.0 -# Version from: pxr/imaging/hgiVulkan/vk_mem_alloc.h (header comment) -Provides: bundled(VulkanMemoryAllocator) = 3.0.0~development -# Forked from an unknown version: -# pxr/base/tf/pxrTslRobinMap/ -Provides: bundled(robin-map) +# Provides: bundled(rapidjson) = 1.1.0 +# Version from: pxr/base/tf/pxrTslRobinMap/robin_growth_policy.h +# (PXR_TSL_RH_VERSION_{MAJOR,MINOR,PATCH}) +# Provides: bundled(robin-map) = 1.3.0 +# Version from pxr/imaging/plugin/hioOpenEXR/OpenEXR/deflate/libdeflate.h +# Provides: bundled(libdeflate) = 1.18 +# Version from pxr/imaging/plugin/hioAvif/AVIF/src/avif/avif.h +# We actually have a post-release snapshot of libavif, because +# AVIF_VERSION_DEVEL is nonzero, but it’s not easy to determine which commit +# hash it was copied from. +# Provides: bundled(libavif) = 1.0.1 +# Version from pxr/imaging/plugin/hioAvif/AVIF/src/src-libyuv/libyuv/version.h +# LIBYUV_VERSION is a “serial number” version, e.g. 1895, that gets incremented +# every time changes are dumped into git from an internal VCS; the libyuv +# package in Fedora is considered to have version 0 and uses snapshot +# versioning. We can dig through +# https://chromium.googlesource.com/libyuv/libyuv and find the commit hash that +# corresponds to a particular serial number. +# LIBYUV_VERSION 1895 = commit a97746349b244efd54ab1eb0c0a7366717b33f39 +# Provides: bundled(libyuv) = 0^20240812.a977463 +# Version from pxr/imaging/plugin/hioAvif/config/aom_version.h +# Provides: bundled(aom) = 3.0.0 %description libs Universal Scene Description (USD) is an efficient, scalable system for @@ -227,61 +411,59 @@ interchange between graphics applications. %package devel Summary: Development files for USD -Requires: cmake-filesystem -Requires: %{name}-libs%{?_isa} = %{version}-%{release} +Requires: usd-libs%{?_isa} = %{version}-%{release} + +# Unbundled, and exposed in the API: +Requires: cli11-devel cli11-static +Requires: robin-map-devel robin-map-static +# Needed by cmake config +Requires: cmake(OpenSubdiv) +%if %{with materialx} +Requires: cmake(materialx) +%endif %description devel This package contains the C++ header files and symbolic links to the shared -libraries for %{name}. If you would like to develop programs using %{name}, -you will need to install %{name}-devel. +libraries for usd. If you would like to develop programs using usd, +you will need to install usd-devel. -# For usdview -%if %{with python3} -%package -n python3-%{name} +# For usdview, usdcompress +%package -n python3-usd Summary: %{summary} BuildRequires: pkgconfig(python3) -BuildRequires: pkgconfig(Qt5) BuildRequires: python3dist(jinja2) %if %{with usdview} BuildRequires: desktop-file-utils -BuildRequires: python3dist(pyside2) -%endif +BuildRequires: python3dist(pyside6) +BuildRequires: pyside6-tools BuildRequires: python3dist(pyopengl) +%endif Requires: font(roboto) Requires: font(robotoblack) Requires: font(robotolight) Requires: font(robotomono) Requires: python3dist(jinja2) %if %{with usdview} -Requires: python3dist(pyside2) -%endif +Requires: python3dist(pyside6) Requires: python3dist(pyopengl) +%endif + +Requires: usd-libs%{?_isa} = %{version}-%{release} + %py_provides python3-pxr -%description -n python3-%{name} +%description -n python3-usd Python language bindings for the Universal Scene Description (USD) C++ API -%endif - -%if %{with documentation} -%package doc -Summary: Documentation for usd -BuildArch: noarch - -%description doc -Documentation for the Universal Scene Description (USD) C++ API -%endif %prep -%autosetup -p1 -n USD-%{version} +%autosetup -p1 -n OpenUSD-%{version} # Convert NOTICE.txt from CRNL line encoding dos2unix NOTICE.txt -%if %{with python3} # Fix all Python shebangs recursively in . %py3_shebang_fix . -%endif # Further drop shebangs line for some py files sed -r -i '1{/^#!/d}' \ @@ -297,27 +479,101 @@ ln -s %{_datadir}/fonts/google-roboto-mono \ # Unbundle stb_image, stb_image_write, stb_image_resize: pushd pxr/imaging/hio/stb -cp -p %{_includedir}/stb_image.h . -patch -p1 < '%{SOURCE2}' -ln -svf %{_includedir}/stb_image_resize.h \ - %{_includedir}/stb_image_write.h ./ +cp -p %{_usr}/include/stb_image.h . +patch -p1 < stb_image.patch +ln -svf %{_usr}/include/stb_image_resize.h \ + %{_usr}/include/stb_image_write.h ./ popd +# Remove bundled doxygen-awesome-css (CSS and JS files) since we are not +# building Doxygen-generated HTML documentation. +rm -rf docs/doxygen/doxygen-awesome-css/ + +# Remove the bundled copy of double-conversion. +# +# From pxr/base/tf/pxrDoubleConversion/README, the upstream double-conversion +# is patched with pxr/base/tf/pxrDoubleConversion/pxr-double-conversion.patch; +# examination of that patch shows that it merely adds namespaces and renames +# symbols, rather than making functional changes, so using the system library +# should be safe. +find pxr/base/tf/pxrDoubleConversion -type f ! -name '*.h' -print -delete +for hdr in pxr/base/tf/pxrDoubleConversion/*.h +do + cat > "${hdr}" < +namespace pxr_double_conversion = double_conversion; +EOF +done +# Similarly, remove the bundled copy of lz4. Change in the bundled copy can be +# identified by source-code comments, and appear to be limited to adding +# namespaces and removing C linkage. +rm -v pxr/base/tf/pxrLZ4/* +cat > pxr/base/tf/pxrLZ4/lz4.h <<'EOF' +#include +// System LZ4 has C linkage; this just allows "using namespace" +namespace pxr_lz4 {} +EOF +# Remove the bundled copy of cli11. +rm -v pxr/base/tf/pxrCLI11/* +cat > pxr/base/tf/pxrCLI11/CLI11.h <<'EOF' +#include +namespace pxr_CLI = CLI; +EOF +# Remove the bundled copy of pugixml. +find third_party/renderman/plugin/rmanArgsParser/pugixml/ \ + -type f ! -name '*.hpp' -print -delete +for hdr in third_party/renderman/plugin/rmanArgsParser/pugixml/*.hpp +do + cat > "${hdr}" < +EOF +done +# Remove the bundled copy of rapidjson. It does not seem to have been modified +# or forked at all. +rm -rv pxr/base/js/rapidjson/ +# Remove the bundled copy of robin-map. There are several macros that are +# renamed from TSL_*/tsl_* to PXR_TSL_*/pxr_tsl_* in the bundled copy, and we +# could “alias” these if necessary to avoid patching call sites, but for now +# are not used outside the library headers and we can get by with merely +# aliasing the namespace. +find pxr/base/tf/pxrTslRobinMap -type f ! -name '*.h' -print -delete +for hdr in pxr/base/tf/pxrTslRobinMap/*.h +do + cat > "${hdr}" < +namespace pxr_tsl = tsl; +EOF +done +# Remove the bundled copy of libdeflate. +rm -rv pxr/imaging/plugin/hioOpenEXR/OpenEXR/deflate/ +# Remove the bundled copies of libavif, along with the associated libaom and +# the libyuv that is in the libavif sources. +rm -rv pxr/imaging/plugin/hioAvif/aom/ \ + pxr/imaging/plugin/hioAvif/AVIF/ + # Use c++17 standard otherwise build fails sed -i 's|set(CMAKE_CXX_STANDARD 14)|set(CMAKE_CXX_STANDARD 17)|g' \ cmake/defaults/CXXDefaults.cmake # Fix libdir installation -sed -i 's|lib/usd|%{_libdir}/usd|g' cmake/macros/Private.cmake -sed -i 's|"lib"|%{_libdir}|g' cmake/macros/Private.cmake +sed -i 's|lib/usd|%{_libdir}/usd|g' \ + cmake/macros/{Private,Public}.cmake sed -i 's|plugin/usd|%{_libdir}/usd/plugin|g' \ - cmake/macros/Private.cmake + cmake/macros/{Private,Public}.cmake +sed -i 's|"lib"|%{_libdir}|g' \ + cmake/macros/{Private,Public}.cmake sed -i 's|/python|/python%{python3_version}/site-packages|g' \ - cmake/macros/Private.cmake -sed -i 's|lib/usd|%{_libdir}/usd|g' cmake/macros/Public.cmake -sed -i 's|"lib"|%{_libdir}|g' cmake/macros/Public.cmake -sed -i 's|plugin/usd|%{_libdir}/usd/plugin|g' \ - cmake/macros/Public.cmake + cmake/macros/{Private,Public}.cmake pxr/usdImaging/usdviewq/CMakeLists.txt +sed -i 's|/pxrConfig.cmake|%{_libdir}/cmake/pxr/pxrConfig.cmake|g' \ + pxr/CMakeLists.txt +sed -i 's|"cmake"|"%{_libdir}/cmake/pxr"|g' \ + pxr/CMakeLists.txt +sed -i 's|${PXR_CMAKE_DIR}/cmake|${PXR_CMAKE_DIR}|g' \ + pxr/pxrConfig.cmake.in +sed -i 's|${PXR_CMAKE_DIR}/include|/usr/include|g' \ + pxr/pxrConfig.cmake.in +sed -i 's|EXACT COMPONENTS|COMPONENTS|g' \ + pxr/pxrConfig.cmake.in # Fix cmake directory destination sed -i 's|"${CMAKE_INSTALL_PREFIX}"|%{_libdir}/cmake/pxr|g' pxr/CMakeLists.txt @@ -327,72 +583,68 @@ sed -i 's|"${CMAKE_INSTALL_PREFIX}"|%{_libdir}/cmake/pxr|g' pxr/CMakeLists.txt find . -type f -exec gawk '/embree3/ { print FILENAME }' '{}' '+' | xargs -r sed -r -i 's/(embree)3/\14/' + %build -# Fix uic-qt5 use -cat > uic-wrapper <<'EOF' -#!/bin/sh -exec uic-qt5 -g python "$@" -EOF -chmod +x uic-wrapper +# The necessary include path for Imath is not set everywhere it’s needed. It’s +# not immediately clear exactly why this is happening here or what should be +# changed upstream. +extra_flags="${extra_flags-} $(pkgconf --cflags Imath)" -# Fix python3 support -# https://github.com/PixarAnimationStudios/USD/issues/1419 - -flags="%{optflags} -Wl,--as-needed -DTBB_SUPPRESS_DEPRECATED_MESSAGES=1" \ -# Patch2 was not good enough to get the include path for Imath everywhere it -# was needed. Add it globally. -# https://github.com/PixarAnimationStudios/USD/issues/1591 -flags="${flags} $(pkgconf --cflags Imath)" +# Suppress deprecation warnings from TBB; upstream should act on them +# eventually, but they just add noise here. +extra_flags="${extra_flags-} -DTBB_SUPPRESS_DEPRECATED_MESSAGES=1" %cmake \ - -DCMAKE_CXX_FLAGS_RELEASE="${flags}" \ - -DCMAKE_C_FLAGS_RELEASE="${flags}" \ - -DCMAKE_CXX_STANDARD=17 \ - -DCMAKE_EXE_LINKER_FLAGS="-pie" \ - -DCMAKE_SKIP_RPATH=ON \ - -DCMAKE_SKIP_INSTALL_RPATH=ON \ - -DCMAKE_VERBOSE_MAKEFILE=ON \ - -DPXR_BUILD_USDVIEW=%{?with_usdview:ON}%{?!with_usdview:OFF} \ -%if %{with documentation} - -DPXR_BUILD_DOCUMENTATION=TRUE \ +%if %{with ninja} + -GNinja \ %endif - -DPXR_BUILD_EXAMPLES=OFF \ - -DPXR_BUILD_TUTORIALS=OFF \ - -DPXR_BUILD_TESTS=%{?with_test:ON}%{!?with_test:OFF} \ -%if %{with openvdb} - -DPXR_ENABLE_OPENVDB_SUPPORT=ON \ -%endif - -DPXR_INSTALL_LOCATION="%{_libdir}/%{name}/plugin" \ %if %{with jemalloc} -DPXR_MALLOC_LIBRARY="%{_libdir}/libjemalloc.so" \ %endif -%if %{with alembic} - -DOPENEXR_LOCATION=%{_includedir} \ - -DPXR_BUILD_ALEMBIC_PLUGIN=ON \ -%endif -%if %{with embree} - -DPXR_BUILD_EMBREE_PLUGIN=ON \ - -DEMBREE_LOCATION=%{_prefix} \ -%endif -%if %{with ocio} - -DPXR_BUILD_OPENCOLORIO_PLUGIN=ON \ -%endif -%if %{with oiio} - -DPXR_BUILD_OPENIMAGEIO_PLUGIN=ON \ -%endif -%if %{with openshading} - -DPXR_ENABLE_OSL_SUPPORT=ON \ -%endif - -DPYTHON_EXECUTABLE=%{python3} \ -%if %{with python3} - -DPXR_USE_PYTHON_3=ON \ - -DPYSIDE_AVAILABLE=ON \ - -DPYSIDEUICBINARY:PATH=${PWD}/uic-wrapper \ -%else - -DPXR_ENABLE_PYTHON_SUPPORT=OFF \ -%endif + \ + -DCMAKE_CXX_FLAGS_RELEASE="${CXXFLAGS-} ${extra_flags}" \ + -DCMAKE_CXX_STANDARD=17 \ + -DCMAKE_C_FLAGS_RELEASE="${CFLAGS-} ${extra_flags}" \ + -DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}" \ + -DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}" \ + -DCMAKE_SKIP_INSTALL_RPATH=ON \ + -DCMAKE_SKIP_RPATH=ON \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + \ + -DPXR_BUILD_HTML_DOCUMENTATION=FALSE \ + -DPXR_BUILD_PYTHON_DOCUMENTATION=FALSE \ + -DPXR_BUILD_EXAMPLES=OFF \ + -DPXR_BUILD_IMAGING=ON \ -DPXR_BUILD_MONOLITHIC=ON \ - -DPXR_ENABLE_MALLOCHOOK_SUPPORT=OFF + -DPXR_BUILD_TESTS=%{expr:%{with test}?"ON":"OFF"} \ + -DPXR_BUILD_TUTORIALS=OFF \ + -DPXR_BUILD_USD_IMAGING=ON \ + -DPXR_BUILD_EXEC=ON \ + -DPXR_BUILD_USD_TOOLS=ON \ + -DPXR_BUILD_USDVIEW=%{expr:%{with usdview}?"ON":"OFF"} \ + \ + -DPXR_BUILD_ALEMBIC_PLUGIN=%{expr:%{with alembic}?"ON":"OFF"} \ + -DPXR_BUILD_DRACO_PLUGIN=%{expr:%{with draco}?"ON":"OFF"} \ + -DPXR_BUILD_EMBREE_PLUGIN=%{expr:%{with embree}?"ON":"OFF"} \ + -DPXR_BUILD_OPENCOLORIO_PLUGIN=%{expr:%{with ocio}?"ON":"OFF"} \ + -DPXR_BUILD_OPENIMAGEIO_PLUGIN=%{expr:%{with oiio}?"ON":"OFF"} \ + -DPXR_BUILD_PRMAN_PLUGIN=OFF \ + \ + -DPXR_ENABLE_OPENVDB_SUPPORT=%{expr:%{with openvdb}?"ON":"OFF"} \ + -DPXR_ENABLE_HDF5_SUPPORT=ON \ + -DPXR_ENABLE_PTEX_SUPPORT=%{expr:%{with ptex}?"ON":"OFF"} \ + -DPXR_ENABLE_OSL_SUPPORT=%{expr:%{with openshading}?"ON":"OFF"} \ + -DPXR_ENABLE_MALLOCHOOK_SUPPORT=OFF \ + -DPXR_ENABLE_MATERIALX_SUPPORT=%{expr:%{with materialx}?"ON":"OFF"} \ + -DPXR_ENABLE_PYTHON_SUPPORT=ON \ + \ + -DPXR_INSTALL_LOCATION="%{_libdir}/usd/plugin" \ + \ + -DPXR_VALIDATE_GENERATED_CODE=OFF \ + \ + -DPYSIDEUICBINARY:PATH=pyside6-uic \ + -DPYSIDE_AVAILABLE=ON \ + -DPYTHON_EXECUTABLE=%{python3} %cmake_build %install @@ -402,6 +654,10 @@ flags="${flags} $(pkgconf --cflags Imath)" mkdir -p %{buildroot}%{python3_sitearch} mv %{buildroot}%{python3_sitelib}/* %{buildroot}%{python3_sitearch} +# Upstream may expect to use this as a script in development, but we install it +# without executable permissions, so we remove the shebang. +sed -r -i '1{/^#!/d}' '%{buildroot}%{python3_sitearch}/pxr/Usd/usdGenSchema.py' + %if %{with usdview} # Install a desktop icon for usdview desktop-file-install \ @@ -409,78 +665,124 @@ desktop-file-install \ %{SOURCE1} %endif +# Little hack until this issue is resolved +# https://github.com/PixarAnimationStudios/OpenUSD/issues/3310 +sed -i 's|OpenGL::GL|${OPENGL_gl_LIBRARY}|g' \ + %{buildroot}%{_libdir}/cmake/pxr/pxrTargets.cmake + # Remove examples that were built and installed even though we set # -DPXR_BUILD_EXAMPLES=OFF. -rm -vrf '%{buildroot}%{_datadir}/%{name}/examples' +rm -vrf '%{buildroot}%{_datadir}/usd/examples' -# Fix installation path for some files -mv %{buildroot}%{_prefix}/lib/python/pxr/*.* \ - %{buildroot}%{python3_sitearch}/pxr/ -%if %{with usdview} -mv %{buildroot}%{_prefix}/lib/python/pxr/Usdviewq/* \ - %{buildroot}%{python3_sitearch}/pxr/Usdviewq/ -%endif - -# Currently, the pxrConfig.cmake that is installed is not correct for -# monolithic builds (and we must do a monolithic build in order to be usable as -# a dependency for Blender). It relies on the libraries that would be in -# pxrTargets.cmake, which is not generated for monolithic builds. -# https://bugzilla.redhat.com/show_bug.cgi?id=2055414 -# https://github.com/PixarAnimationStudios/USD/issues/1088 -rm -vrf '%{buildroot}%{_libdir}/cmake' +# Generate and install man pages. While generating the man pages might more +# properly go in %%build, it is generally much easier to do this here in a +# single step, using the entry points installed into the buildroot. This is +# especially true for the entry points that are Python scripts. +install -d '%{buildroot}%{_mandir}/man1' +for cmd in %{buildroot}%{_bindir}/* +do + PYTHONPATH='%{buildroot}%{python3_sitearch}' \ + LD_LIBRARY_PATH='%{buildroot}%{_libdir}' \ + help2man \ + --no-info --no-discard-stderr --version-string='%{version}' \ + --output="%{buildroot}%{_mandir}/man1/$(basename "${cmd}").1" \ + "${cmd}" +done %check %if %{with usdview} -desktop-file-validate %{buildroot}%{_datadir}/applications/org.open%{name}.%{name}view.desktop +desktop-file-validate %{buildroot}%{_datadir}/applications/org.openusd.usdview.desktop %endif %{?with_test:%ctest} %files %doc NOTICE.txt README.md + +%{_bindir}/hdGenSchema %{_bindir}/sdfdump %{_bindir}/sdffilter +%if %{with materialx} +%{_bindir}/usdBakeMaterialX +%endif %{_bindir}/usdGenSchema +%{_bindir}/usdInitSchema %{_bindir}/usdcat %{_bindir}/usdchecker +%if %{with draco} +%{_bindir}/usdcompress +%endif %{_bindir}/usddiff %{_bindir}/usddumpcrate %{_bindir}/usdedit +%{_bindir}/usdfixbrokenpixarschemas %{_bindir}/usdgenschemafromsdr +%{_bindir}/usdmeasureperformance %{_bindir}/usdrecord %{_bindir}/usdresolve %{_bindir}/usdstitch %{_bindir}/usdstitchclips %{_bindir}/usdtree +%{_bindir}/usdupdatecrate %{_bindir}/usdzip - -%if %{with python3} -%files -n python3-%{name} -%{python3_sitearch}/pxr %if %{with usdview} -%{_datadir}/applications/org.open%{name}.%{name}view.desktop +%{_datadir}/applications/org.openusd.usdview.desktop %{_bindir}/testusdview %{_bindir}/usdview %endif + +%{_mandir}/man1/hdGenSchema.1* +%{_mandir}/man1/sdfdump.1* +%{_mandir}/man1/sdffilter.1* +%if %{with materialx} +%{_mandir}/man1/usdBakeMaterialX.1* %endif +%{_mandir}/man1/usdGenSchema.1* +%{_mandir}/man1/usdInitSchema.1* +%{_mandir}/man1/usdcat.1* +%{_mandir}/man1/usdchecker.1* +%if %{with draco} +%{_mandir}/man1/usdcompress.1* +%endif +%{_mandir}/man1/usddiff.1* +%{_mandir}/man1/usddumpcrate.1* +%{_mandir}/man1/usdedit.1* +%{_mandir}/man1/usdfixbrokenpixarschemas.1* +%{_mandir}/man1/usdgenschemafromsdr.1* +%{_mandir}/man1/usdmeasureperformance.1* +%{_mandir}/man1/usdrecord.1* +%{_mandir}/man1/usdresolve.1* +%{_mandir}/man1/usdstitch.1* +%{_mandir}/man1/usdstitchclips.1* +%{_mandir}/man1/usdtree.1* +%{_mandir}/man1/usdupdatecrate.1* +%{_mandir}/man1/usdzip.1* +%if %{with usdview} +%{_mandir}/man1/testusdview.1* +%{_mandir}/man1/usdview.1* +%endif + +%files -n python3-usd +%{python3_sitearch}/pxr/ %files libs %license LICENSE.txt %doc NOTICE.txt README.md -%{_libdir}/lib%{name}_%{name}_ms.so.%{downstream_so_version} -%{_libdir}/%{name} -%exclude %{_libdir}/%{name}/%{name}/resources/codegenTemplates +%{_libdir}/libusd_ms.so.%{downstream_so_version} +# While headers normally go in -devel packages, those in +# %%{_libdir}/usd/usd/resources/codegenTemplates/ are used as data (templates +# for generated code), and it makes sense to package them with the rest of the +# library resources. (Technically, these are currently used only by the +# usdGenSchema command-line tool, so they could be moved to the base package, +# but this is probably too fussy.) +%{_libdir}/usd/ %files devel %doc BUILDING.md CHANGELOG.md VERSIONS.md %{_includedir}/pxr/ -%{_libdir}/lib%{name}_%{name}_ms.so -%{_libdir}/%{name}/%{name}/resources/codegenTemplates/ - -%if %{with documentation} -%files doc -%license LICENSE.txt -%{_docdir}/%{name} -%endif +%{_libdir}/libusd_ms.so +%{_libdir}/cmake/pxr/pxrConfig.cmake +%{_libdir}/cmake/pxr/pxrTargets.cmake +%{_libdir}/cmake/pxr/pxrTargets-release.cmake %changelog %autochangelog