diff --git a/thirdparty/README.md b/thirdparty/README.md index a219839afca..0bd7c472924 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -652,7 +652,7 @@ Collection of single-file libraries used in Godot components. - `bcdec.h` * Upstream: https://github.com/iOrange/bcdec - * Version: git (026acf98ea271045cb10713daa96ba98528badb7, 2022) + * Version: git (3b29f8f44466c7d59852670f82f53905cf627d48, 2024) * License: MIT - `clipper.{cpp,hpp}` * Upstream: https://sourceforge.net/projects/polyclipping diff --git a/thirdparty/misc/bcdec.h b/thirdparty/misc/bcdec.h index 78074a0c906..275ee05d946 100644 --- a/thirdparty/misc/bcdec.h +++ b/thirdparty/misc/bcdec.h @@ -1,4 +1,4 @@ -/* bcdec.h - v0.96 +/* bcdec.h - v0.97 provides functions to decompress blocks of BC compressed images written by Sergii "iOrange" Kudlai in 2022 @@ -30,6 +30,11 @@ - Split BC6H decompression function into 'half' and 'float' variants + Michael Schmidt (@RunDevelopment) - Found better "magic" coefficients for integer interpolation + of reference colors in BC1 color block, that match with + the floating point interpolation. This also made it faster + than integer division by 3! + bugfixes: @linkmauve @@ -39,6 +44,9 @@ #ifndef BCDEC_HEADER_INCLUDED #define BCDEC_HEADER_INCLUDED +#define BCDEC_VERSION_MAJOR 0 +#define BCDEC_VERSION_MINOR 97 + /* if BCDEC_STATIC causes problems, try defining BCDECDEF to 'inline' or 'static inline' */ #ifndef BCDECDEF #ifdef BCDEC_STATIC @@ -96,6 +104,7 @@ BCDECDEF void bcdec_bc6h_float(const void* compressedBlock, void* decompressedBl BCDECDEF void bcdec_bc6h_half(const void* compressedBlock, void* decompressedBlock, int destinationPitch, int isSigned); BCDECDEF void bcdec_bc7(const void* compressedBlock, void* decompressedBlock, int destinationPitch); +#endif /* BCDEC_HEADER_INCLUDED */ #ifdef BCDEC_IMPLEMENTATION @@ -110,35 +119,44 @@ static void bcdec__color_block(const void* compressedBlock, void* decompressedBl c0 = ((unsigned short*)compressedBlock)[0]; c1 = ((unsigned short*)compressedBlock)[1]; - /* Expand 565 ref colors to 888 */ - r0 = (((c0 >> 11) & 0x1F) * 527 + 23) >> 6; - g0 = (((c0 >> 5) & 0x3F) * 259 + 33) >> 6; - b0 = ((c0 & 0x1F) * 527 + 23) >> 6; - refColors[0] = 0xFF000000 | (b0 << 16) | (g0 << 8) | r0; + /* Unpack 565 ref colors */ + r0 = (c0 >> 11) & 0x1F; + g0 = (c0 >> 5) & 0x3F; + b0 = c0 & 0x1F; - r1 = (((c1 >> 11) & 0x1F) * 527 + 23) >> 6; - g1 = (((c1 >> 5) & 0x3F) * 259 + 33) >> 6; - b1 = ((c1 & 0x1F) * 527 + 23) >> 6; - refColors[1] = 0xFF000000 | (b1 << 16) | (g1 << 8) | r1; + r1 = (c1 >> 11) & 0x1F; + g1 = (c1 >> 5) & 0x3F; + b1 = c1 & 0x1F; + + /* Expand 565 ref colors to 888 */ + r = (r0 * 527 + 23) >> 6; + g = (g0 * 259 + 33) >> 6; + b = (b0 * 527 + 23) >> 6; + refColors[0] = 0xFF000000 | (b << 16) | (g << 8) | r; + + r = (r1 * 527 + 23) >> 6; + g = (g1 * 259 + 33) >> 6; + b = (b1 * 527 + 23) >> 6; + refColors[1] = 0xFF000000 | (b << 16) | (g << 8) | r; if (c0 > c1 || onlyOpaqueMode) { /* Standard BC1 mode (also BC3 color block uses ONLY this mode) */ /* color_2 = 2/3*color_0 + 1/3*color_1 color_3 = 1/3*color_0 + 2/3*color_1 */ - r = (2 * r0 + r1 + 1) / 3; - g = (2 * g0 + g1 + 1) / 3; - b = (2 * b0 + b1 + 1) / 3; + r = ((2 * r0 + r1) * 351 + 61) >> 7; + g = ((2 * g0 + g1) * 2763 + 1039) >> 11; + b = ((2 * b0 + b1) * 351 + 61) >> 7; refColors[2] = 0xFF000000 | (b << 16) | (g << 8) | r; - r = (r0 + 2 * r1 + 1) / 3; - g = (g0 + 2 * g1 + 1) / 3; - b = (b0 + 2 * b1 + 1) / 3; + r = ((r0 + r1 * 2) * 351 + 61) >> 7; + g = ((g0 + g1 * 2) * 2763 + 1039) >> 11; + b = ((b0 + b1 * 2) * 351 + 61) >> 7; refColors[3] = 0xFF000000 | (b << 16) | (g << 8) | r; } else { /* Quite rare BC1A mode */ /* color_2 = 1/2*color_0 + 1/2*color_1; color_3 = 0; */ - r = (r0 + r1 + 1) >> 1; - g = (g0 + g1 + 1) >> 1; - b = (b0 + b1 + 1) >> 1; + r = ((r0 + r1) * 1053 + 125) >> 8; + g = ((g0 + g1) * 4145 + 1019) >> 11; + b = ((b0 + b1) * 1053 + 125) >> 8; refColors[2] = 0xFF000000 | (b << 16) | (g << 8) | r; refColors[3] = 0x00000000; @@ -1269,8 +1287,6 @@ BCDECDEF void bcdec_bc7(const void* compressedBlock, void* decompressedBlock, in #endif /* BCDEC_IMPLEMENTATION */ -#endif /* BCDEC_HEADER_INCLUDED */ - /* LICENSE: This software is available under 2 licenses -- choose whichever you prefer. @@ -1326,4 +1342,4 @@ OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to -*/ \ No newline at end of file +*/