From 178753de4a27f5777e2e51de676baf8493adc129 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Sat, 7 May 2022 15:10:55 -0700 Subject: [PATCH] Added IsBGR utility function --- DirectXTex/DirectXTex.h | 1 + DirectXTex/DirectXTex.inl | 21 +++++++++++++++++++++ Texassemble/texassemble.cpp | 4 +++- Texconv/texconv.cpp | 4 +++- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/DirectXTex/DirectXTex.h b/DirectXTex/DirectXTex.h index 5d8a160..37c01c3 100644 --- a/DirectXTex/DirectXTex.h +++ b/DirectXTex/DirectXTex.h @@ -63,6 +63,7 @@ namespace DirectX bool __cdecl IsPalettized(_In_ DXGI_FORMAT fmt) noexcept; bool __cdecl IsDepthStencil(_In_ DXGI_FORMAT fmt) noexcept; bool __cdecl IsSRGB(_In_ DXGI_FORMAT fmt) noexcept; + bool __cdecl IsBGR(_In_ DXGI_FORMAT fmt) noexcept; bool __cdecl IsTypeless(_In_ DXGI_FORMAT fmt, _In_ bool partialTypeless = true) noexcept; bool __cdecl HasAlpha(_In_ DXGI_FORMAT fmt) noexcept; diff --git a/DirectXTex/DirectXTex.inl b/DirectXTex/DirectXTex.inl index c5aeede..1ca81f9 100644 --- a/DirectXTex/DirectXTex.inl +++ b/DirectXTex/DirectXTex.inl @@ -116,6 +116,27 @@ inline bool __cdecl IsSRGB(DXGI_FORMAT fmt) noexcept } } +_Use_decl_annotations_ +inline bool __cdecl IsBGR(DXGI_FORMAT fmt) noexcept +{ + switch (fmt) + { + case DXGI_FORMAT_B5G6R5_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + case DXGI_FORMAT_B4G4R4A4_UNORM: + return true; + + default: + return false; + } +} + //===================================================================================== // Image I/O diff --git a/Texassemble/texassemble.cpp b/Texassemble/texassemble.cpp index 3aef303..0df5485 100644 --- a/Texassemble/texassemble.cpp +++ b/Texassemble/texassemble.cpp @@ -1443,7 +1443,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } else if (_wcsicmp(ext, L".tga") == 0) { - hr = LoadFromTGAFile(pConv->szSrc, TGA_FLAGS_NONE, &info, *image); + TGA_FLAGS tgaFlags = (IsBGR(format)) ? TGA_FLAGS_BGR : TGA_FLAGS_NONE; + + hr = LoadFromTGAFile(pConv->szSrc, tgaFlags, &info, *image); if (FAILED(hr)) { wprintf(L" FAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); diff --git a/Texconv/texconv.cpp b/Texconv/texconv.cpp index 2e6c1ef..209521f 100644 --- a/Texconv/texconv.cpp +++ b/Texconv/texconv.cpp @@ -2051,7 +2051,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } else if (_wcsicmp(ext, L".tga") == 0) { - hr = LoadFromTGAFile(pConv->szSrc, TGA_FLAGS_NONE, &info, *image); + TGA_FLAGS tgaFlags = (IsBGR(format)) ? TGA_FLAGS_BGR : TGA_FLAGS_NONE; + + hr = LoadFromTGAFile(pConv->szSrc, tgaFlags, &info, *image); if (FAILED(hr)) { wprintf(L" FAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr));