//------------------------------------------------------------------------------------- // DirectXTex.inl // // DirectX Texture Library // // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. // // http://go.microsoft.com/fwlink/?LinkId=248926 //------------------------------------------------------------------------------------- #pragma once //===================================================================================== // Bitmask flags enumerator operators //===================================================================================== DEFINE_ENUM_FLAG_OPERATORS(CP_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(DDS_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(TGA_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(WIC_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(TEX_FR_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(TEX_FILTER_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(TEX_PMALPHA_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(TEX_COMPRESS_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(CNMAP_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(CMSE_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(CREATETEX_FLAGS); // WIC_FILTER modes match TEX_FILTER modes constexpr WIC_FLAGS operator|(WIC_FLAGS a, TEX_FILTER_FLAGS b) { return static_cast(static_cast(a) | static_cast(b & TEX_FILTER_MODE_MASK)); } constexpr WIC_FLAGS operator|(TEX_FILTER_FLAGS a, WIC_FLAGS b) { return static_cast(static_cast(a & TEX_FILTER_MODE_MASK) | static_cast(b)); } // TEX_PMALPHA_SRGB match TEX_FILTER_SRGB constexpr TEX_PMALPHA_FLAGS operator|(TEX_PMALPHA_FLAGS a, TEX_FILTER_FLAGS b) { return static_cast(static_cast(a) | static_cast(b & TEX_FILTER_SRGB_MASK)); } constexpr TEX_PMALPHA_FLAGS operator|(TEX_FILTER_FLAGS a, TEX_PMALPHA_FLAGS b) { return static_cast(static_cast(a & TEX_FILTER_SRGB_MASK) | static_cast(b)); } // TEX_COMPRESS_SRGB match TEX_FILTER_SRGB constexpr TEX_COMPRESS_FLAGS operator|(TEX_COMPRESS_FLAGS a, TEX_FILTER_FLAGS b) { return static_cast(static_cast(a) | static_cast(b & TEX_FILTER_SRGB_MASK)); } constexpr TEX_COMPRESS_FLAGS operator|(TEX_FILTER_FLAGS a, TEX_COMPRESS_FLAGS b) { return static_cast(static_cast(a & TEX_FILTER_SRGB_MASK) | static_cast(b)); } //===================================================================================== // DXGI Format Utilities //===================================================================================== _Use_decl_annotations_ constexpr bool __cdecl IsValid(DXGI_FORMAT fmt) noexcept { return (static_cast(fmt) >= 1 && static_cast(fmt) <= 190); } _Use_decl_annotations_ inline bool __cdecl IsCompressed(DXGI_FORMAT fmt) noexcept { switch (fmt) { case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC2_TYPELESS: case DXGI_FORMAT_BC2_UNORM: case DXGI_FORMAT_BC2_UNORM_SRGB: case DXGI_FORMAT_BC3_TYPELESS: case DXGI_FORMAT_BC3_UNORM: case DXGI_FORMAT_BC3_UNORM_SRGB: case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: case DXGI_FORMAT_BC4_SNORM: case DXGI_FORMAT_BC5_TYPELESS: case DXGI_FORMAT_BC5_UNORM: case DXGI_FORMAT_BC5_SNORM: case DXGI_FORMAT_BC6H_TYPELESS: case DXGI_FORMAT_BC6H_UF16: case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: case DXGI_FORMAT_BC7_UNORM_SRGB: return true; default: return false; } } _Use_decl_annotations_ inline bool __cdecl IsPalettized(DXGI_FORMAT fmt) noexcept { switch (fmt) { case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: case DXGI_FORMAT_P8: case DXGI_FORMAT_A8P8: return true; default: return false; } } _Use_decl_annotations_ inline bool __cdecl IsSRGB(DXGI_FORMAT fmt) noexcept { switch (fmt) { case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC2_UNORM_SRGB: case DXGI_FORMAT_BC3_UNORM_SRGB: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: case DXGI_FORMAT_BC7_UNORM_SRGB: return true; default: return false; } } _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 //===================================================================================== _Use_decl_annotations_ inline HRESULT __cdecl SaveToDDSMemory(const Image& image, DDS_FLAGS flags, Blob& blob) noexcept { TexMetadata mdata = {}; mdata.width = image.width; mdata.height = image.height; mdata.depth = 1; mdata.arraySize = 1; mdata.mipLevels = 1; mdata.format = image.format; mdata.dimension = TEX_DIMENSION_TEXTURE2D; return SaveToDDSMemory(&image, 1, mdata, flags, blob); } _Use_decl_annotations_ inline HRESULT __cdecl SaveToDDSFile(const Image& image, DDS_FLAGS flags, const wchar_t* szFile) noexcept { TexMetadata mdata = {}; mdata.width = image.width; mdata.height = image.height; mdata.depth = 1; mdata.arraySize = 1; mdata.mipLevels = 1; mdata.format = image.format; mdata.dimension = TEX_DIMENSION_TEXTURE2D; return SaveToDDSFile(&image, 1, mdata, flags, szFile); } //===================================================================================== // Compatability helpers //===================================================================================== _Use_decl_annotations_ inline HRESULT __cdecl GetMetadataFromTGAMemory(const void* pSource, size_t size, TexMetadata& metadata) noexcept { return GetMetadataFromTGAMemory(pSource, size, TGA_FLAGS_NONE, metadata); } _Use_decl_annotations_ inline HRESULT __cdecl GetMetadataFromTGAFile(const wchar_t* szFile, TexMetadata& metadata) noexcept { return GetMetadataFromTGAFile(szFile, TGA_FLAGS_NONE, metadata); } _Use_decl_annotations_ inline HRESULT __cdecl LoadFromTGAMemory(const void* pSource, size_t size, TexMetadata* metadata, ScratchImage& image) noexcept { return LoadFromTGAMemory(pSource, size, TGA_FLAGS_NONE, metadata, image); } _Use_decl_annotations_ inline HRESULT __cdecl LoadFromTGAFile(const wchar_t* szFile, TexMetadata* metadata, ScratchImage& image) noexcept { return LoadFromTGAFile(szFile, TGA_FLAGS_NONE, metadata, image); } _Use_decl_annotations_ inline HRESULT __cdecl SaveToTGAMemory(const Image& image, Blob& blob, const TexMetadata* metadata) noexcept { return SaveToTGAMemory(image, TGA_FLAGS_NONE, blob, metadata); } _Use_decl_annotations_ inline HRESULT __cdecl SaveToTGAFile(const Image& image, const wchar_t* szFile, const TexMetadata* metadata) noexcept { return SaveToTGAFile(image, TGA_FLAGS_NONE, szFile, metadata); }