tinyexr: upgrading to latest library version. We no longer modify tinyexr, i.e. the tinyexr.h header we're using is now completely standard. We direct tinyexr's zlib calls to our fork of miniz internally.

This commit is contained in:
Richard Geldreich
2026-04-07 16:30:57 -04:00
parent 0a35b574d2
commit 542ed6555d
7 changed files with 2224 additions and 191 deletions

View File

@@ -247,7 +247,7 @@ set(ENCODER_LIB_SRC_LIST
encoder/basisu_astc_hdr_common.cpp encoder/basisu_astc_hdr_common.cpp
encoder/basisu_astc_ldr_common.cpp encoder/basisu_astc_ldr_common.cpp
encoder/basisu_astc_ldr_encode.cpp encoder/basisu_astc_ldr_encode.cpp
encoder/3rdparty/tinyexr.cpp encoder/basisu_tinyexr.cpp
transcoder/basisu_transcoder.cpp transcoder/basisu_transcoder.cpp
encoder/basisu_astc_hdr_6x6_enc.h encoder/basisu_astc_hdr_6x6_enc.h
encoder/basisu_astc_hdr_common.h encoder/basisu_astc_hdr_common.h

File diff suppressed because it is too large Load Diff

View File

@@ -28,9 +28,7 @@
#include <vector> #include <vector>
#ifndef TINYEXR_USE_ZFP #define TINYEXR_USE_MINIZ (0)
#define TINYEXR_USE_ZFP (1)
#endif
#include "3rdparty/tinyexr.h" #include "3rdparty/tinyexr.h"
#ifndef MINIZ_HEADER_FILE_ONLY #ifndef MINIZ_HEADER_FILE_ONLY
@@ -3448,7 +3446,7 @@ namespace basisu
float* out_rgba = nullptr; float* out_rgba = nullptr;
const char* err = nullptr; const char* err = nullptr;
int status = LoadEXRWithLayer(&out_rgba, &width, &height, pFilename, nullptr, &err, &n_chans); int status = LoadEXRWithLayer(&out_rgba, &width, &height, pFilename, nullptr, &err);
if (status != 0) if (status != 0)
{ {
error_printf("Failed loading .EXR image \"%s\"! (TinyEXR error: %s)\n", pFilename, err ? err : "?"); error_printf("Failed loading .EXR image \"%s\"! (TinyEXR error: %s)\n", pFilename, err ? err : "?");
@@ -3457,7 +3455,7 @@ namespace basisu
return false; return false;
} }
const uint32_t MAX_SUPPORTED_DIM = 65536; const uint32_t MAX_SUPPORTED_DIM = 32768;
if ((width < 1) || (height < 1) || (width > (int)MAX_SUPPORTED_DIM) || (height > (int)MAX_SUPPORTED_DIM)) if ((width < 1) || (height < 1) || (width > (int)MAX_SUPPORTED_DIM) || (height > (int)MAX_SUPPORTED_DIM))
{ {
error_printf("Invalid dimensions of .EXR image \"%s\"!\n", pFilename); error_printf("Invalid dimensions of .EXR image \"%s\"!\n", pFilename);
@@ -3467,31 +3465,59 @@ namespace basisu
img.resize(width, height); img.resize(width, height);
if (n_chans == 1) memcpy((void*)img.get_ptr(), out_rgba, static_cast<size_t>(sizeof(float) * 4 * img.get_total_pixels()));
{
const float* pSrc = out_rgba; free(out_rgba);
vec4F* pDst = img.get_ptr(); out_rgba = nullptr;
uint32_t total_all_same_rgba = 0, total_all_same_rgb = 0, total_has_alpha = 0;
for (int y = 0; y < height; y++) for (int y = 0; y < height; y++)
{ {
for (int x = 0; x < width; x++) for (int x = 0; x < width; x++)
{ {
(*pDst)[0] = pSrc[0]; const vec4F& p = img(x, y);
(*pDst)[1] = pSrc[1];
(*pDst)[2] = pSrc[2];
(*pDst)[3] = 1.0f;
pSrc += 4; if ((p[0] == p[1]) && (p[0] == p[2]))
++pDst; total_all_same_rgb++;
const float a = p[3];
if ((a == p[0]) && (a == p[1]) && (a == p[2]))
total_all_same_rgba++;
if (a != 1.0f)
total_has_alpha++;
} // x
} // y
const uint32_t total_pixels = width * height;
if (total_all_same_rgba == total_pixels)
{
// TinyEXR loads single channel EXR images into all output channels (including alpha) - assume they are luminance and fix our alpha.
// Odds are this is an opaque luminance-only image, not a true alpha channel image. (As of early 2026 we don't support any HDR format with alpha, anyway.)
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
img(x, y)[3] = 1.0f;
n_chans = 1;
} }
else if (total_has_alpha)
{
n_chans = 4;
} }
else if (total_all_same_rgb == total_pixels)
{
n_chans = 1;
} }
else else
{ {
memcpy((void *)img.get_ptr(), out_rgba, static_cast<size_t>(sizeof(float) * 4 * img.get_total_pixels())); n_chans = 3;
} }
free(out_rgba); //fmt_printf("Number of detected EXR channels: {}\n", n_chans);
return true; return true;
} }
@@ -3513,6 +3539,8 @@ namespace basisu
memcpy((void *)img.get_ptr(), out_rgba, width * height * sizeof(float) * 4); memcpy((void *)img.get_ptr(), out_rgba, width * height * sizeof(float) * 4);
free(out_rgba); free(out_rgba);
// TODO: detect luminance-only etc.
return true; return true;
} }

View File

@@ -5,34 +5,27 @@
#endif #endif
#endif #endif
// Pull in our local fork of the miniz library. (Binomial wrote the original miniz library. Basisu was tested with this specific version.)
#define MINIZ_HEADER_FILE_ONLY #define MINIZ_HEADER_FILE_ONLY
#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES #define MINIZ_NO_ZLIB_COMPATIBLE_NAMES
#include "basisu_miniz.h" #include "basisu_miniz.h"
// Force tinyexr to use zlib-style compression API's, then we'll direct them to our own customized copy of miniz. (Binomial wrote the original miniz library.) // A bit of a hack to force tinyexr to use plain zlib-style compression API's, then we'll direct them to our own customized copy of miniz with #define's.
// This allows us to use tinyexr.h without modify it at all, or relying on zlib. // This allows us to use tinyexr.h without modifying it at all, or relying on zlib, or pulling in a system-wide miniz dependency.
// This assumes tinyexr.h doesn't include zlib.h (it doesn't: "Please include your own zlib-compatible API header before...")
// (Time will tell how fragile this is in reality.)
#define TINYEXR_USE_MINIZ (0) #define TINYEXR_USE_MINIZ (0)
enum { Z_OK = 0, Z_STREAM_END = 1, Z_NEED_DICT = 2, Z_ERRNO = -1, Z_STREAM_ERROR = -2, Z_DATA_ERROR = -3, Z_MEM_ERROR = -4, Z_BUF_ERROR = -5, Z_VERSION_ERROR = -6, Z_PARAM_ERROR = -10000 }; #define Z_OK buminiz::MZ_OK
typedef unsigned long uLongf; #define uLong buminiz::mz_ulong
typedef unsigned long uLong; #define uLongf buminiz::mz_ulong
typedef unsigned char Byte; typedef unsigned char Byte;
typedef Byte Bytef; typedef Byte Bytef;
uLong compressBound(uLong src_size) #define compressBound buminiz::mz_compressBound
{ #define compress buminiz::mz_compress
return buminiz::mz_compressBound(src_size); #define uncompress buminiz::mz_uncompress
}
int compress(Bytef* dest, uLongf* destLen, const Bytef* source, uLong sourceLen)
{
return buminiz::mz_compress(dest, destLen, source, sourceLen);
}
int uncompress(Bytef* dest, uLongf* destLen, const Bytef* source, uLong sourceLen)
{
return buminiz::mz_uncompress(dest, destLen, source, sourceLen);
}
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning (disable: 4060) #pragma warning (disable: 4060)
@@ -40,6 +33,7 @@ int uncompress(Bytef* dest, uLongf* destLen, const Bytef* source, uLong sourceLe
#pragma warning (disable: 4245) #pragma warning (disable: 4245)
#pragma warning (disable: 4505) #pragma warning (disable: 4505)
#pragma warning (disable: 4702) #pragma warning (disable: 4702)
#pragma warning (disable: 4530) // warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
#endif #endif
#define TINYEXR_IMPLEMENTATION #define TINYEXR_IMPLEMENTATION

View File

@@ -28,11 +28,11 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\encoder\3rdparty\android_astc_decomp.cpp" /> <ClCompile Include="..\encoder\3rdparty\android_astc_decomp.cpp" />
<ClCompile Include="..\encoder\3rdparty\tinyexr.cpp" />
<ClCompile Include="..\encoder\basisu_astc_hdr_6x6_enc.cpp" /> <ClCompile Include="..\encoder\basisu_astc_hdr_6x6_enc.cpp" />
<ClCompile Include="..\encoder\basisu_astc_hdr_common.cpp" /> <ClCompile Include="..\encoder\basisu_astc_hdr_common.cpp" />
<ClCompile Include="..\encoder\basisu_astc_ldr_common.cpp" /> <ClCompile Include="..\encoder\basisu_astc_ldr_common.cpp" />
<ClCompile Include="..\encoder\basisu_astc_ldr_encode.cpp" /> <ClCompile Include="..\encoder\basisu_astc_ldr_encode.cpp" />
<ClCompile Include="..\encoder\basisu_tinyexr.cpp" />
<ClCompile Include="..\encoder\basisu_uastc_hdr_4x4_enc.cpp" /> <ClCompile Include="..\encoder\basisu_uastc_hdr_4x4_enc.cpp" />
<ClCompile Include="..\encoder\basisu_backend.cpp" /> <ClCompile Include="..\encoder\basisu_backend.cpp" />
<ClCompile Include="..\encoder\basisu_basis_file.cpp" /> <ClCompile Include="..\encoder\basisu_basis_file.cpp" />

View File

@@ -84,9 +84,6 @@
<ClCompile Include="..\encoder\pvpngreader.cpp"> <ClCompile Include="..\encoder\pvpngreader.cpp">
<Filter>Source Files\encoder</Filter> <Filter>Source Files\encoder</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\encoder\3rdparty\tinyexr.cpp">
<Filter>Source Files\encoder\3rdparty</Filter>
</ClCompile>
<ClCompile Include="..\zstd\zstd.c"> <ClCompile Include="..\zstd\zstd.c">
<Filter>Source Files\encoder\3rdparty</Filter> <Filter>Source Files\encoder\3rdparty</Filter>
</ClCompile> </ClCompile>
@@ -105,6 +102,9 @@
<ClCompile Include="..\encoder\basisu_astc_ldr_encode.cpp"> <ClCompile Include="..\encoder\basisu_astc_ldr_encode.cpp">
<Filter>Source Files\encoder</Filter> <Filter>Source Files\encoder</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\encoder\basisu_tinyexr.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\transcoder\basisu_astc_helpers.h"> <ClInclude Include="..\transcoder\basisu_astc_helpers.h">

View File

@@ -67,7 +67,7 @@ if(EMSCRIPTEN)
../../encoder/basisu_astc_hdr_common.cpp ../../encoder/basisu_astc_hdr_common.cpp
../../encoder/basisu_astc_ldr_common.cpp ../../encoder/basisu_astc_ldr_common.cpp
../../encoder/basisu_astc_ldr_encode.cpp ../../encoder/basisu_astc_ldr_encode.cpp
../../encoder/3rdparty/tinyexr.cpp ../../encoder/basisu_tinyexr.cpp
) )
if(KTX2_ZSTANDARD) if(KTX2_ZSTANDARD)
list(APPEND SRC_LIST ../../zstd/zstd.c) list(APPEND SRC_LIST ../../zstd/zstd.c)