From 56e3c43f548ca0457027ffc24de1063f9457aee9 Mon Sep 17 00:00:00 2001 From: craftablescience Date: Sun, 6 Oct 2024 01:33:52 -0400 Subject: [PATCH 1/4] feat(sourcepp): define DEBUG when compiling in debug, add basic debug breakpoint macro --- cmake/TargetOptimize.cmake | 3 +++ include/sourcepp/Macros.h | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/cmake/TargetOptimize.cmake b/cmake/TargetOptimize.cmake index e27f23843..dac1eda7e 100644 --- a/cmake/TargetOptimize.cmake +++ b/cmake/TargetOptimize.cmake @@ -9,6 +9,9 @@ macro(target_optimize TARGET) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_compile_options(${TARGET} PRIVATE -fno-limit-debug-info) endif() + + # Add debug define + target_compile_definitions(${TARGET} PRIVATE DEBUG) else() # Build with optimizations and don't omit stack pointer for debugging if(UNIX OR MINGW) diff --git a/include/sourcepp/Macros.h b/include/sourcepp/Macros.h index b6fbcee12..713250532 100644 --- a/include/sourcepp/Macros.h +++ b/include/sourcepp/Macros.h @@ -6,6 +6,19 @@ #define SOURCEPP_CONCAT_DETAIL(a, b) a##b #define SOURCEPP_CONCAT(a, b) SOURCEPP_CONCAT_DETAIL(a, b) +/// Create a breakpoint in debug +#ifdef DEBUG + #if defined(_MSC_VER) + #define SOURCEPP_DEBUG_BREAK __debugbreak() + #elif defined(__linux__) + #include + #define SOURCEPP_DEBUG_BREAK std::raise(SIGINT) + #endif +#endif +#ifndef SOURCEPP_DEBUG_BREAK + #define SOURCEPP_DEBUG_BREAK +#endif + /// Adds the current line number to the given base #define SOURCEPP_UNIQUE_NAME(base) SOURCEPP_CONCAT(base, __LINE__) From 020a276e889839e2b3cd5ae4ac0b2c90bca4ec98 Mon Sep 17 00:00:00 2001 From: craftablescience Date: Sun, 6 Oct 2024 01:34:42 -0400 Subject: [PATCH 2/4] fix(vtfpp): disable fs functions in stb_image_write.h --- ext/stb/include/stb_image_write.h | 3 +-- src/vtfpp/ImageConversion.cpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/stb/include/stb_image_write.h b/ext/stb/include/stb_image_write.h index e4b32ed1b..542b937d7 100644 --- a/ext/stb/include/stb_image_write.h +++ b/ext/stb/include/stb_image_write.h @@ -634,8 +634,6 @@ STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const #define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) -#ifndef STBI_WRITE_NO_STDIO - static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) { int exponent; @@ -791,6 +789,7 @@ STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, 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 = { 0 }; diff --git a/src/vtfpp/ImageConversion.cpp b/src/vtfpp/ImageConversion.cpp index cac8d6dc0..b1b9007c0 100644 --- a/src/vtfpp/ImageConversion.cpp +++ b/src/vtfpp/ImageConversion.cpp @@ -25,8 +25,7 @@ #define STB_IMAGE_WRITE_IMPLEMENTATION #define STB_IMAGE_WRITE_STATIC -// HDR write in memory is erroneously guarded by this define -//#define STBI_WRITE_NO_STDIO +#define STBI_WRITE_NO_STDIO #include using namespace sourcepp; From 2bcf4d413548726598732dbd5cd57113470ab451 Mon Sep 17 00:00:00 2001 From: craftablescience Date: Sun, 6 Oct 2024 01:38:58 -0400 Subject: [PATCH 3/4] feat(vtfpp): add 7 more image formats --- include/vtfpp/ImageConversion.h | 84 +++++++++++++++++ include/vtfpp/ImageFormats.h | 155 +++++++++++++++++++++----------- src/vtfpp/ImageConversion.cpp | 97 ++++++++++---------- 3 files changed, 239 insertions(+), 97 deletions(-) diff --git a/include/vtfpp/ImageConversion.h b/include/vtfpp/ImageConversion.h index aee4d3148..226005361 100644 --- a/include/vtfpp/ImageConversion.h +++ b/include/vtfpp/ImageConversion.h @@ -12,6 +12,9 @@ namespace vtfpp { namespace ImagePixel { +#define VTFPP_CHECK_SIZE(format) \ + static_assert(sizeof(format) == ImageFormatDetails::bpp(ImageFormat::format) / 8) + struct RGBA8888 { static constexpr auto FORMAT = ImageFormat::RGBA8888; uint8_t r; @@ -19,6 +22,7 @@ struct RGBA8888 { uint8_t b; uint8_t a; }; +VTFPP_CHECK_SIZE(RGBA8888); struct ABGR8888 { static constexpr auto FORMAT = ImageFormat::ABGR8888; @@ -27,6 +31,7 @@ struct ABGR8888 { uint8_t g; uint8_t r; }; +VTFPP_CHECK_SIZE(ABGR8888); struct RGB888 { static constexpr auto FORMAT = ImageFormat::RGB888; @@ -34,10 +39,12 @@ struct RGB888 { uint8_t g; uint8_t b; }; +VTFPP_CHECK_SIZE(RGB888); struct RGB888_BLUESCREEN : public RGB888 { static constexpr auto FORMAT = ImageFormat::RGB888_BLUESCREEN; }; +VTFPP_CHECK_SIZE(RGB888_BLUESCREEN); struct BGR888 { static constexpr auto FORMAT = ImageFormat::BGR888; @@ -45,10 +52,12 @@ struct BGR888 { uint8_t g; uint8_t r; }; +VTFPP_CHECK_SIZE(BGR888); struct BGR888_BLUESCREEN : public BGR888 { static constexpr auto FORMAT = ImageFormat::BGR888_BLUESCREEN; }; +VTFPP_CHECK_SIZE(BGR888_BLUESCREEN); struct RGB565 { static constexpr auto FORMAT = ImageFormat::RGB565; @@ -56,27 +65,32 @@ struct RGB565 { uint16_t g : 6; uint16_t b : 5; }; +VTFPP_CHECK_SIZE(RGB565); struct I8 { static constexpr auto FORMAT = ImageFormat::I8; uint8_t i; }; +VTFPP_CHECK_SIZE(I8); struct IA88 { static constexpr auto FORMAT = ImageFormat::IA88; uint8_t i; uint8_t a; }; +VTFPP_CHECK_SIZE(IA88); struct P8 { static constexpr auto FORMAT = ImageFormat::P8; uint8_t p; }; +VTFPP_CHECK_SIZE(P8); struct A8 { static constexpr auto FORMAT = ImageFormat::A8; uint8_t a; }; +VTFPP_CHECK_SIZE(A8); struct ARGB8888 { static constexpr auto FORMAT = ImageFormat::ARGB8888; @@ -85,6 +99,7 @@ struct ARGB8888 { uint8_t g; uint8_t b; }; +VTFPP_CHECK_SIZE(ARGB8888); struct BGRA8888 { static constexpr auto FORMAT = ImageFormat::BGRA8888; @@ -93,6 +108,7 @@ struct BGRA8888 { uint8_t r; uint8_t a; }; +VTFPP_CHECK_SIZE(BGRA8888); struct BGRX8888 { static constexpr auto FORMAT = ImageFormat::BGRX8888; @@ -101,6 +117,7 @@ struct BGRX8888 { uint8_t r; uint8_t x; }; +VTFPP_CHECK_SIZE(BGRX8888); struct BGR565 { static constexpr auto FORMAT = ImageFormat::BGR565; @@ -108,6 +125,7 @@ struct BGR565 { uint16_t g : 6; uint16_t r : 5; }; +VTFPP_CHECK_SIZE(BGR565); struct BGRX5551 { static constexpr auto FORMAT = ImageFormat::BGRX5551; @@ -116,6 +134,7 @@ struct BGRX5551 { uint16_t r : 5; uint16_t x : 1; }; +VTFPP_CHECK_SIZE(BGRX5551); struct BGRA4444 { static constexpr auto FORMAT = ImageFormat::BGRA4444; @@ -124,6 +143,7 @@ struct BGRA4444 { uint16_t r : 4; uint16_t a : 4; }; +VTFPP_CHECK_SIZE(BGRA4444); struct BGRA5551 { static constexpr auto FORMAT = ImageFormat::BGRA5551; @@ -132,12 +152,14 @@ struct BGRA5551 { uint16_t r : 5; uint16_t a : 1; }; +VTFPP_CHECK_SIZE(BGRA5551); struct UV88 { static constexpr auto FORMAT = ImageFormat::UV88; uint8_t u; uint8_t v; }; +VTFPP_CHECK_SIZE(UV88); struct UVWQ8888 { static constexpr auto FORMAT = ImageFormat::UVWQ8888; @@ -146,6 +168,7 @@ struct UVWQ8888 { uint8_t w; uint8_t q; }; +VTFPP_CHECK_SIZE(UVWQ8888); struct RGBA16161616F { static constexpr auto FORMAT = ImageFormat::RGBA16161616F; @@ -154,6 +177,7 @@ struct RGBA16161616F { sourcepp::math::FloatCompressed16 b; sourcepp::math::FloatCompressed16 a; }; +VTFPP_CHECK_SIZE(RGBA16161616F); struct RGBA16161616 { static constexpr auto FORMAT = ImageFormat::RGBA16161616; @@ -162,6 +186,7 @@ struct RGBA16161616 { uint16_t b; uint16_t a; }; +VTFPP_CHECK_SIZE(RGBA16161616); struct UVLX8888 { static constexpr auto FORMAT = ImageFormat::UVLX8888; @@ -170,11 +195,13 @@ struct UVLX8888 { uint8_t l; uint8_t x; }; +VTFPP_CHECK_SIZE(UVLX8888); struct R32F { static constexpr auto FORMAT = ImageFormat::R32F; float r; }; +VTFPP_CHECK_SIZE(R32F); struct RGB323232F { static constexpr auto FORMAT = ImageFormat::R32F; @@ -182,6 +209,7 @@ struct RGB323232F { float g; float b; }; +VTFPP_CHECK_SIZE(RGB323232F); struct RGBA32323232F { static constexpr auto FORMAT = ImageFormat::RGBA32323232F; @@ -190,6 +218,62 @@ struct RGBA32323232F { float b; float a; }; +VTFPP_CHECK_SIZE(RGBA32323232F); + +struct RG1616F { + static constexpr auto FORMAT = ImageFormat::RG1616F; + sourcepp::math::FloatCompressed16 r; + sourcepp::math::FloatCompressed16 g; +}; +VTFPP_CHECK_SIZE(RG1616F); + +struct RG3232F { + static constexpr auto FORMAT = ImageFormat::RG3232F; + float r; + float g; +}; +VTFPP_CHECK_SIZE(RG3232F); + +struct RGBX8888 { + static constexpr auto FORMAT = ImageFormat::RGBX8888; + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t x; +}; +VTFPP_CHECK_SIZE(RGBX8888); + +struct RGBA1010102 { + static constexpr auto FORMAT = ImageFormat::RGBA1010102; + uint32_t r : 10; + uint32_t g : 10; + uint32_t b : 10; + uint32_t a : 2; +}; +VTFPP_CHECK_SIZE(RGBA1010102); + +struct BGRA1010102 { + static constexpr auto FORMAT = ImageFormat::BGRA1010102; + uint32_t b : 10; + uint32_t g : 10; + uint32_t r : 10; + uint32_t a : 2; +}; +VTFPP_CHECK_SIZE(BGRA1010102); + +struct R16F { + static constexpr auto FORMAT = ImageFormat::R16F; + sourcepp::math::FloatCompressed16 r; +}; +VTFPP_CHECK_SIZE(R16F); + +struct R8 { + static constexpr auto FORMAT = ImageFormat::R8; + uint8_t r; +}; +VTFPP_CHECK_SIZE(R8); + +#undef VTFPP_CHECK_SIZE } // namespace ImagePixel diff --git a/include/vtfpp/ImageFormats.h b/include/vtfpp/ImageFormats.h index a37b2b2ca..42e2aa40e 100644 --- a/include/vtfpp/ImageFormats.h +++ b/include/vtfpp/ImageFormats.h @@ -37,12 +37,18 @@ enum class ImageFormat : int32_t { R32F, RGB323232F, RGBA32323232F, - - EMPTY = 33, + RG1616F, + RG3232F, + RGBX8888, + EMPTY, ATI2N, ATI1N, + RGBA1010102, + BGRA1010102, + R16F, - BC7 = 70, + R8 = 69, + BC7, BC6H, }; @@ -52,12 +58,18 @@ namespace ImageFormatDetails { switch (format) { using enum ImageFormat; case R32F: + case RG3232F: case RGB323232F: case RGBA32323232F: return 32; + case R16F: + case RG1616F: case RGBA16161616F: case RGBA16161616: return 16; + case RGBA1010102: + case BGRA1010102: + return 10; case RGBA8888: case ABGR8888: case RGB888: @@ -73,6 +85,8 @@ namespace ImageFormatDetails { case UV88: case UVWQ8888: case UVLX8888: + case RGBX8888: + case R8: return 8; case RGB565: case BGR565: @@ -120,12 +134,17 @@ namespace ImageFormatDetails { [[nodiscard]] constexpr int8_t green(ImageFormat format) { switch (format) { using enum ImageFormat; + case RG3232F: case RGB323232F: case RGBA32323232F: return 32; + case RG1616F: case RGBA16161616F: case RGBA16161616: return 16; + case RGBA1010102: + case BGRA1010102: + return 10; case RGBA8888: case ABGR8888: case RGB888: @@ -138,6 +157,7 @@ namespace ImageFormatDetails { case UV88: case UVWQ8888: case UVLX8888: + case RGBX8888: return 8; case RGB565: case BGR565: @@ -153,6 +173,8 @@ namespace ImageFormatDetails { case R32F: case A8: case EMPTY: + case R16F: + case R8: return 0; case DXT1: case DXT3: @@ -196,6 +218,9 @@ namespace ImageFormatDetails { case RGBA16161616F: case RGBA16161616: return 16; + case RGBA1010102: + case BGRA1010102: + return 10; case RGBA8888: case ABGR8888: case RGB888: @@ -207,6 +232,7 @@ namespace ImageFormatDetails { case BGRX8888: case UVWQ8888: case UVLX8888: + case RGBX8888: return 8; case RGB565: case BGR565: @@ -222,6 +248,10 @@ namespace ImageFormatDetails { case R32F: case A8: case EMPTY: + case RG3232F: + case RG1616F: + case R16F: + case R8: return 0; case DXT1: case DXT3: @@ -272,9 +302,13 @@ namespace ImageFormatDetails { case BGRX8888: case UVWQ8888: case UVLX8888: + case RGBX8888: return 8; case BGRA4444: return 4; + case RGBA1010102: + case BGRA1010102: + return 2; case BGRX5551: case BGRA5551: return 1; @@ -291,6 +325,10 @@ namespace ImageFormatDetails { case RGB323232F: case A8: case EMPTY: + case RG3232F: + case RG1616F: + case R16F: + case R8: return 0; case DXT1: case DXT3: @@ -336,6 +374,7 @@ namespace ImageFormatDetails { return 96; case RGBA16161616F: case RGBA16161616: + case RG3232F: return 64; case RGBA8888: case ABGR8888: @@ -345,6 +384,10 @@ namespace ImageFormatDetails { case UVLX8888: case R32F: case UVWQ8888: + case RGBX8888: + case RGBA1010102: + case BGRA1010102: + case RG1616F: return 32; case RGB888: case BGR888: @@ -358,6 +401,7 @@ namespace ImageFormatDetails { case BGRA4444: case BGRA5551: case UV88: + case R16F: return 16; case I8: case P8: @@ -367,6 +411,7 @@ namespace ImageFormatDetails { case BC7: case BC6H: case ATI2N: + case R8: return 8; case ATI1N: case DXT1: @@ -378,64 +423,21 @@ namespace ImageFormatDetails { return 0; } -[[nodiscard]] constexpr bool compressed(ImageFormat format) { - return red(format) == -1; -} - -[[nodiscard]] constexpr bool large(ImageFormat format) { - return red(format) > 8 || bpp(format) > 32; -} - -[[nodiscard]] constexpr bool decimal(ImageFormat format) { - return large(format) && format != ImageFormat::RGBA16161616; -} - -[[nodiscard]] constexpr bool transparent(ImageFormat format) { - const auto a = alpha(format); - if (a < 0) { - switch (format) { - using enum ImageFormat; - case DXT3: - case DXT5: - case DXT1_ONE_BIT_ALPHA: - case ATI2N: - case ATI1N: - case BC7: - case BC6H: - return true; - default: - break; - } - return false; - } - switch (format) { - using enum ImageFormat; - case RGB888_BLUESCREEN: - case BGR888_BLUESCREEN: - return true; - case BGRX8888: - case BGRX5551: - return false; - default: - break; - } - return a != 0; -} - -[[nodiscard]] constexpr bool opaque(ImageFormat format) { - return !transparent(format); -} - [[nodiscard]] constexpr ImageFormat containerFormat(ImageFormat format) { switch (format) { using enum ImageFormat; case R32F: + case RG3232F: case RGB323232F: + case R16F: + case RG1616F: case RGBA16161616F: case RGBA32323232F: case BC6H: return RGBA32323232F; case RGBA16161616: + case RGBA1010102: + case BGRA1010102: return RGBA16161616; case RGBA8888: case ABGR8888: @@ -464,6 +466,8 @@ namespace ImageFormatDetails { case DXT1_ONE_BIT_ALPHA: case ATI2N: case ATI1N: + case RGBX8888: + case R8: case BC7: return RGBA8888; case EMPTY: @@ -472,6 +476,55 @@ namespace ImageFormatDetails { return ImageFormat::EMPTY; } +[[nodiscard]] constexpr bool large(ImageFormat format) { + return containerFormat(format) != ImageFormat::RGBA8888 && containerFormat(format) != ImageFormat::EMPTY; +} + +[[nodiscard]] constexpr bool decimal(ImageFormat format) { + return containerFormat(format) == ImageFormat::RGBA32323232F; +} + +[[nodiscard]] constexpr bool compressed(ImageFormat format) { + return red(format) == -1; +} + +[[nodiscard]] constexpr bool transparent(ImageFormat format) { + const auto a = alpha(format); + if (a < 0) { + switch (format) { + using enum ImageFormat; + case DXT3: + case DXT5: + case DXT1_ONE_BIT_ALPHA: + case ATI2N: + case ATI1N: + case BC7: + case BC6H: + return true; + default: + break; + } + return false; + } + switch (format) { + using enum ImageFormat; + case RGB888_BLUESCREEN: + case BGR888_BLUESCREEN: + return true; + case BGRX8888: + case BGRX5551: + case RGBX8888: + return false; + default: + break; + } + return a != 0; +} + +[[nodiscard]] constexpr bool opaque(ImageFormat format) { + return !transparent(format); +} + } // namespace ImageFormatDetails namespace ImageDimensions { diff --git a/src/vtfpp/ImageConversion.cpp b/src/vtfpp/ImageConversion.cpp index b1b9007c0..a78a79e8e 100644 --- a/src/vtfpp/ImageConversion.cpp +++ b/src/vtfpp/ImageConversion.cpp @@ -12,6 +12,7 @@ #include #include +#include #define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_STATIC @@ -37,6 +38,7 @@ namespace { switch (format) { using enum ImageFormat; case RGBA8888: + case RGBX8888: case UVWQ8888: case UVLX8888: return CMP_FORMAT_RGBA_8888; @@ -62,12 +64,18 @@ namespace { return CMP_FORMAT_DXT5; case UV88: return CMP_FORMAT_RG_8; + case R16F: + return CMP_FORMAT_R_16F; + case RG1616F: + return CMP_FORMAT_RG_16F; case RGBA16161616F: return CMP_FORMAT_RGBA_16F; case RGBA16161616: return CMP_FORMAT_RGBA_16; case R32F: return CMP_FORMAT_R_32F; + case RG3232F: + return CMP_FORMAT_RG_32F; case RGB323232F: return CMP_FORMAT_RGB_32F; case RGBA32323232F: @@ -76,6 +84,10 @@ namespace { return CMP_FORMAT_ATI2N; case ATI1N: return CMP_FORMAT_ATI1N; + case RGBA1010102: + return CMP_FORMAT_RGBA_1010102; + case R8: + return CMP_FORMAT_R_8; case BC7: return CMP_FORMAT_BC7; case BC6H: @@ -91,6 +103,7 @@ namespace { case BGRA4444: case BGRA5551: case EMPTY: + case BGRA1010102: return CMP_FORMAT_Unknown; } return CMP_FORMAT_Unknown; @@ -116,16 +129,20 @@ namespace { case I8: case P8: case R32F: + case R16F: + case R8: return STBIR_1CHANNEL; case ARGB8888: return STBIR_ARGB; case BGRA8888: return STBIR_BGRA; case UV88: + case RG1616F: + case RG3232F: return STBIR_2CHANNEL; case IA88: return STBIR_RA; - // We want these to get converted to RGBA8888 before resize + // We want these to get converted to their respective container format before resize case DXT1: case DXT1_ONE_BIT_ALPHA: case DXT3: @@ -138,12 +155,15 @@ namespace { case A8: case RGB888_BLUESCREEN: case BGR888_BLUESCREEN: + case RGBX8888: case BGRX8888: case BGR565: case BGRX5551: case BGRA4444: case BGRA5551: case EMPTY: + case RGBA1010102: + case BGRA1010102: break; } return -1; @@ -168,12 +188,17 @@ namespace { case UV88: case UVWQ8888: case UVLX8888: + case RGBX8888: + case R8: return srgb ? STBIR_TYPE_UINT8_SRGB : STBIR_TYPE_UINT8; + case R16F: + case RG1616F: case RGBA16161616F: return STBIR_TYPE_HALF_FLOAT; case RGBA16161616: return STBIR_TYPE_UINT16; case R32F: + case RG3232F: case RGB323232F: case RGBA32323232F: return STBIR_TYPE_FLOAT; @@ -189,6 +214,8 @@ namespace { case EMPTY: case ATI2N: case ATI1N: + case RGBA1010102: + case BGRA1010102: case BC7: case BC6H: break; @@ -284,7 +311,9 @@ namespace { VTFPP_CASE_CONVERT_AND_BREAK(BGRX5551, VTFPP_REMAP_TO_8(pixel.r, 5), VTFPP_REMAP_TO_8(pixel.g, 5), VTFPP_REMAP_TO_8(pixel.b, 5), 0xff); VTFPP_CASE_CONVERT_AND_BREAK(BGRA4444, VTFPP_REMAP_TO_8(pixel.r, 4), VTFPP_REMAP_TO_8(pixel.g, 4), VTFPP_REMAP_TO_8(pixel.b, 4), VTFPP_REMAP_TO_8(pixel.a, 4)); VTFPP_CASE_CONVERT_AND_BREAK(UV88, pixel.u, pixel.v, 0, 0xff); - default: break; + VTFPP_CASE_CONVERT_AND_BREAK(RGBX8888, pixel.r, pixel.g, pixel.b, 0xff); + VTFPP_CASE_CONVERT_AND_BREAK(R8, pixel.r, 0, 0, 0xff); + default: SOURCEPP_DEBUG_BREAK; break; } #undef VTFPP_CASE_CONVERT_AND_BREAK @@ -348,7 +377,9 @@ namespace { VTFPP_CASE_CONVERT_AND_BREAK(BGRX5551, {VTFPP_REMAP_FROM_8(pixel.b, 5), VTFPP_REMAP_FROM_8(pixel.g, 5), VTFPP_REMAP_FROM_8(pixel.r, 5), 0x1}); VTFPP_CASE_CONVERT_AND_BREAK(BGRA4444, {VTFPP_REMAP_FROM_8(pixel.b, 4), VTFPP_REMAP_FROM_8(pixel.g, 4), VTFPP_REMAP_FROM_8(pixel.r, 4), VTFPP_REMAP_FROM_8(pixel.a, 4)}); VTFPP_CASE_CONVERT_AND_BREAK(UV88, {pixel.r, pixel.g}); - default: break; + VTFPP_CASE_CONVERT_AND_BREAK(RGBX8888, {pixel.r, pixel.g, pixel.b, 0xff}); + VTFPP_CASE_CONVERT_AND_BREAK(R8, {pixel.r}); + default: SOURCEPP_DEBUG_BREAK; break; } #undef VTFPP_CASE_CONVERT_AND_BREAK @@ -416,25 +447,9 @@ namespace { switch (format) { using enum ImageFormat; - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(ABGR8888, pixel.r, pixel.g, pixel.b, pixel.a); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(RGB888, pixel.r, pixel.g, pixel.b, 0xff); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(RGB888_BLUESCREEN, pixel.r, pixel.g, pixel.b, (pixel.r == 0 && pixel.g == 0 && pixel.b == 0xff) ? 0 : 0xff); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(BGR888, pixel.r, pixel.g, pixel.b, 0xff); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(BGR888_BLUESCREEN, pixel.r, pixel.g, pixel.b, (pixel.r == 0 && pixel.g == 0 && pixel.b == 0xff) ? 0 : 0xff); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(RGB565, pixel.r, pixel.g, pixel.b, 0xff); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(P8, pixel.p, pixel.p, pixel.p, 0xff); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(I8, pixel.i, pixel.i, pixel.i, 0xff); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(IA88, pixel.i, pixel.i, pixel.i, pixel.a); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(A8, 0, 0, 0, pixel.a); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(ARGB8888, pixel.r, pixel.g, pixel.b, pixel.a); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(BGRA8888, pixel.r, pixel.g, pixel.b, pixel.a); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(BGRX8888, pixel.r, pixel.g, pixel.b, 0xff); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(BGR565, pixel.r, pixel.g, pixel.b, 0xff); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(BGRA5551, pixel.r, pixel.g, pixel.b, pixel.a); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(BGRX5551, pixel.r, pixel.g, pixel.b, 1); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(BGRA4444, pixel.r, pixel.g, pixel.b, pixel.a); - VTFPP_CASE_CONVERT_REMAP_AND_BREAK(UV88, pixel.u, pixel.v, 0, 0xff); - default: break; + VTFPP_CASE_CONVERT_REMAP_AND_BREAK(RGBA1010102, pixel.r, pixel.g, pixel.b, pixel.a); + VTFPP_CASE_CONVERT_REMAP_AND_BREAK(BGRA1010102, pixel.r, pixel.g, pixel.b, pixel.a); + default: SOURCEPP_DEBUG_BREAK; break; } #undef VTFPP_CASE_CONVERT_REMAP_AND_BREAK @@ -482,25 +497,9 @@ namespace { switch (format) { using enum ImageFormat; - VTFPP_CASE_CONVERT_AND_BREAK(ABGR8888, {VTFPP_REMAP_FROM_16(pixel.a, 8), VTFPP_REMAP_FROM_16(pixel.b, 8), VTFPP_REMAP_FROM_16(pixel.g, 8), VTFPP_REMAP_FROM_16(pixel.r, 8)}); - VTFPP_CASE_CONVERT_AND_BREAK(RGB888, {VTFPP_REMAP_FROM_16(pixel.r, 8), VTFPP_REMAP_FROM_16(pixel.g, 8), VTFPP_REMAP_FROM_16(pixel.b, 8)}); - VTFPP_CASE_CONVERT_AND_BREAK(RGB888_BLUESCREEN, pixel.a < 0xffff ? ImagePixel::RGB888_BLUESCREEN{VTFPP_REMAP_FROM_16(pixel.r, 8), VTFPP_REMAP_FROM_16(pixel.g, 8), VTFPP_REMAP_FROM_16(pixel.b, 8)} : ImagePixel::RGB888_BLUESCREEN{0, 0, 0xff}); - VTFPP_CASE_CONVERT_AND_BREAK(BGR888, {VTFPP_REMAP_FROM_16(pixel.b, 8), VTFPP_REMAP_FROM_16(pixel.g, 8), VTFPP_REMAP_FROM_16(pixel.r, 8)}); - VTFPP_CASE_CONVERT_AND_BREAK(BGR888_BLUESCREEN, pixel.a < 0xffff ? ImagePixel::BGR888_BLUESCREEN{VTFPP_REMAP_FROM_16(pixel.b, 8), VTFPP_REMAP_FROM_16(pixel.g, 8), VTFPP_REMAP_FROM_16(pixel.r, 8)} : ImagePixel::BGR888_BLUESCREEN{0xff, 0, 0}); - VTFPP_CASE_CONVERT_AND_BREAK(RGB565, {VTFPP_REMAP_FROM_16(pixel.r, 5), VTFPP_REMAP_FROM_16(pixel.g, 6), VTFPP_REMAP_FROM_16(pixel.b, 5)}); - VTFPP_CASE_CONVERT_AND_BREAK(P8, {VTFPP_REMAP_FROM_16(pixel.r, 8)}); - VTFPP_CASE_CONVERT_AND_BREAK(I8, {VTFPP_REMAP_FROM_16(pixel.r, 8)}); - VTFPP_CASE_CONVERT_AND_BREAK(IA88, {VTFPP_REMAP_FROM_16(pixel.r, 8), VTFPP_REMAP_FROM_16(pixel.a, 8)}); - VTFPP_CASE_CONVERT_AND_BREAK(A8, {VTFPP_REMAP_FROM_16(pixel.a, 8)}); - VTFPP_CASE_CONVERT_AND_BREAK(ARGB8888, {VTFPP_REMAP_FROM_16(pixel.a, 8), VTFPP_REMAP_FROM_16(pixel.r, 8), VTFPP_REMAP_FROM_16(pixel.g, 8), VTFPP_REMAP_FROM_16(pixel.b, 8)}); - VTFPP_CASE_CONVERT_AND_BREAK(BGRA8888, {VTFPP_REMAP_FROM_16(pixel.b, 8), VTFPP_REMAP_FROM_16(pixel.g, 8), VTFPP_REMAP_FROM_16(pixel.r, 8), VTFPP_REMAP_FROM_16(pixel.a, 8)}); - VTFPP_CASE_CONVERT_AND_BREAK(BGRX8888, {VTFPP_REMAP_FROM_16(pixel.b, 8), VTFPP_REMAP_FROM_16(pixel.g, 8), VTFPP_REMAP_FROM_16(pixel.r, 8), 0xff}); - VTFPP_CASE_CONVERT_AND_BREAK(BGR565, {VTFPP_REMAP_FROM_16(pixel.b, 5), VTFPP_REMAP_FROM_16(pixel.g, 6), VTFPP_REMAP_FROM_16(pixel.r, 5)}); - VTFPP_CASE_CONVERT_AND_BREAK(BGRA5551, {VTFPP_REMAP_FROM_16(pixel.b, 5), VTFPP_REMAP_FROM_16(pixel.g, 5), VTFPP_REMAP_FROM_16(pixel.r, 5), static_cast(pixel.a < 0xffff ? 1 : 0)}); - VTFPP_CASE_CONVERT_AND_BREAK(BGRX5551, {VTFPP_REMAP_FROM_16(pixel.b, 5), VTFPP_REMAP_FROM_16(pixel.g, 5), VTFPP_REMAP_FROM_16(pixel.r, 5), 0x1}); - VTFPP_CASE_CONVERT_AND_BREAK(BGRA4444, {VTFPP_REMAP_FROM_16(pixel.b, 4), VTFPP_REMAP_FROM_16(pixel.g, 4), VTFPP_REMAP_FROM_16(pixel.r, 4), VTFPP_REMAP_FROM_16(pixel.a, 4)}); - VTFPP_CASE_CONVERT_AND_BREAK(UV88, {VTFPP_REMAP_FROM_16(pixel.r, 8), VTFPP_REMAP_FROM_16(pixel.g, 8)}); - default: break; + VTFPP_CASE_CONVERT_AND_BREAK(RGBA1010102, {VTFPP_REMAP_FROM_16(pixel.r, 10), VTFPP_REMAP_FROM_16(pixel.g, 10), VTFPP_REMAP_FROM_16(pixel.b, 10), VTFPP_REMAP_FROM_16(pixel.a, 2)}); + VTFPP_CASE_CONVERT_AND_BREAK(BGRA1010102, {VTFPP_REMAP_FROM_16(pixel.b, 10), VTFPP_REMAP_FROM_16(pixel.g, 10), VTFPP_REMAP_FROM_16(pixel.r, 10), VTFPP_REMAP_FROM_16(pixel.a, 2)}); + default: SOURCEPP_DEBUG_BREAK; break; } #undef VTFPP_CASE_CONVERT_AND_BREAK @@ -536,10 +535,13 @@ namespace { switch (format) { using enum ImageFormat; + VTFPP_CASE_CONVERT_AND_BREAK(R32F, pixel.r, 0.f, 0.f, 1.f); + VTFPP_CASE_CONVERT_AND_BREAK(RG3232F, pixel.r, pixel.g, 0.f, 1.f); VTFPP_CASE_CONVERT_AND_BREAK(RGB323232F, pixel.r, pixel.g, pixel.b, 1.f); - VTFPP_CASE_CONVERT_AND_BREAK(R32F, pixel.r, pixel.r, pixel.r, 1.f); + VTFPP_CASE_CONVERT_AND_BREAK(R16F, pixel.r.toFloat32(), 0.f, 0.f, 1.f); + VTFPP_CASE_CONVERT_AND_BREAK(RG1616F, pixel.r.toFloat32(), pixel.g.toFloat32(), 0.f, 1.f); VTFPP_CASE_CONVERT_AND_BREAK(RGBA16161616F, pixel.r.toFloat32(), pixel.g.toFloat32(), pixel.b.toFloat32(), pixel.a.toFloat32()); - default: break; + default: SOURCEPP_DEBUG_BREAK; break; } #undef VTFPP_CASE_CONVERT_AND_BREAK @@ -582,10 +584,13 @@ namespace { switch (format) { using enum ImageFormat; - VTFPP_CASE_CONVERT_AND_BREAK(RGB323232F, {pixel.r, pixel.g, pixel.b}); VTFPP_CASE_CONVERT_AND_BREAK(R32F, {pixel.r}); - VTFPP_CASE_CONVERT_AND_BREAK(RGBA16161616F, {math::FloatCompressed16{pixel.r}, math::FloatCompressed16{pixel.g}, math::FloatCompressed16{pixel.b}, math::FloatCompressed16{pixel.a}}); - default: break; + VTFPP_CASE_CONVERT_AND_BREAK(RG3232F, {pixel.r, pixel.g}); + VTFPP_CASE_CONVERT_AND_BREAK(RGB323232F, {pixel.r, pixel.g, pixel.b}); + VTFPP_CASE_CONVERT_AND_BREAK(R16F, {pixel.r}); + VTFPP_CASE_CONVERT_AND_BREAK(RG1616F, {pixel.r, pixel.g}); + VTFPP_CASE_CONVERT_AND_BREAK(RGBA16161616F, {pixel.r, pixel.g, pixel.b, pixel.a}); + default: SOURCEPP_DEBUG_BREAK; break; } #undef VTFPP_CASE_CONVERT_AND_BREAK From 0e95af2b0a9d7d8a5ff076dfef41602f962d72eb Mon Sep 17 00:00:00 2001 From: craftablescience Date: Sun, 6 Oct 2024 01:45:45 -0400 Subject: [PATCH 4/4] fix(vtfpp): UVLX now ignores the alpha channel --- include/vtfpp/ImageFormats.h | 1 + src/vtfpp/ImageConversion.cpp | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/vtfpp/ImageFormats.h b/include/vtfpp/ImageFormats.h index 42e2aa40e..1bb428fb8 100644 --- a/include/vtfpp/ImageFormats.h +++ b/include/vtfpp/ImageFormats.h @@ -513,6 +513,7 @@ namespace ImageFormatDetails { return true; case BGRX8888: case BGRX5551: + case UVLX8888: case RGBX8888: return false; default: diff --git a/src/vtfpp/ImageConversion.cpp b/src/vtfpp/ImageConversion.cpp index a78a79e8e..ee826f12e 100644 --- a/src/vtfpp/ImageConversion.cpp +++ b/src/vtfpp/ImageConversion.cpp @@ -38,9 +38,7 @@ namespace { switch (format) { using enum ImageFormat; case RGBA8888: - case RGBX8888: case UVWQ8888: - case UVLX8888: return CMP_FORMAT_RGBA_8888; case ABGR8888: return CMP_FORMAT_ABGR_8888; @@ -102,8 +100,10 @@ namespace { case BGRX5551: case BGRA4444: case BGRA5551: + case UVLX8888: case EMPTY: case BGRA1010102: + case RGBX8888: return CMP_FORMAT_Unknown; } return CMP_FORMAT_Unknown; @@ -114,7 +114,6 @@ namespace { using enum ImageFormat; case RGBA8888: case UVWQ8888: - case UVLX8888: case RGBA16161616: case RGBA16161616F: case RGBA32323232F: @@ -161,6 +160,7 @@ namespace { case BGRX5551: case BGRA4444: case BGRA5551: + case UVLX8888: case EMPTY: case RGBA1010102: case BGRA1010102: @@ -268,7 +268,7 @@ namespace { return {}; } - if (format == ImageFormat::RGBA8888 || format == ImageFormat::UVWQ8888 || format == ImageFormat::UVLX8888) { + if (format == ImageFormat::RGBA8888 || format == ImageFormat::UVWQ8888) { return {imageData.begin(), imageData.end()}; } @@ -311,6 +311,7 @@ namespace { VTFPP_CASE_CONVERT_AND_BREAK(BGRX5551, VTFPP_REMAP_TO_8(pixel.r, 5), VTFPP_REMAP_TO_8(pixel.g, 5), VTFPP_REMAP_TO_8(pixel.b, 5), 0xff); VTFPP_CASE_CONVERT_AND_BREAK(BGRA4444, VTFPP_REMAP_TO_8(pixel.r, 4), VTFPP_REMAP_TO_8(pixel.g, 4), VTFPP_REMAP_TO_8(pixel.b, 4), VTFPP_REMAP_TO_8(pixel.a, 4)); VTFPP_CASE_CONVERT_AND_BREAK(UV88, pixel.u, pixel.v, 0, 0xff); + VTFPP_CASE_CONVERT_AND_BREAK(UVLX8888, pixel.u, pixel.v, pixel.l, 0xff); VTFPP_CASE_CONVERT_AND_BREAK(RGBX8888, pixel.r, pixel.g, pixel.b, 0xff); VTFPP_CASE_CONVERT_AND_BREAK(R8, pixel.r, 0, 0, 0xff); default: SOURCEPP_DEBUG_BREAK; break; @@ -377,6 +378,7 @@ namespace { VTFPP_CASE_CONVERT_AND_BREAK(BGRX5551, {VTFPP_REMAP_FROM_8(pixel.b, 5), VTFPP_REMAP_FROM_8(pixel.g, 5), VTFPP_REMAP_FROM_8(pixel.r, 5), 0x1}); VTFPP_CASE_CONVERT_AND_BREAK(BGRA4444, {VTFPP_REMAP_FROM_8(pixel.b, 4), VTFPP_REMAP_FROM_8(pixel.g, 4), VTFPP_REMAP_FROM_8(pixel.r, 4), VTFPP_REMAP_FROM_8(pixel.a, 4)}); VTFPP_CASE_CONVERT_AND_BREAK(UV88, {pixel.r, pixel.g}); + VTFPP_CASE_CONVERT_AND_BREAK(UVLX8888, {pixel.r, pixel.g, pixel.b}); VTFPP_CASE_CONVERT_AND_BREAK(RGBX8888, {pixel.r, pixel.g, pixel.b, 0xff}); VTFPP_CASE_CONVERT_AND_BREAK(R8, {pixel.r}); default: SOURCEPP_DEBUG_BREAK; break;