diff --git a/DDSTextureLoader/DDSTextureLoader.cpp b/DDSTextureLoader/DDSTextureLoader.cpp index 37f66a0..6721de4 100644 --- a/DDSTextureLoader/DDSTextureLoader.cpp +++ b/DDSTextureLoader/DDSTextureLoader.cpp @@ -103,7 +103,7 @@ struct DDS_PIXELFORMAT enum DDS_MISC_FLAGS2 { - DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x3L, + DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x7L, }; typedef struct @@ -1329,7 +1329,15 @@ static DDS_ALPHA_MODE GetAlphaMode( _In_ const DDS_HEADER* header ) if ( MAKEFOURCC( 'D', 'X', '1', '0' ) == header->ddspf.fourCC ) { auto d3d10ext = reinterpret_cast( (const char*)header + sizeof(DDS_HEADER) ); - return static_cast(d3d10ext->miscFlags2 & DDS_MISC_FLAGS2_ALPHA_MODE_MASK); + auto mode = static_cast( d3d10ext->miscFlags2 & DDS_MISC_FLAGS2_ALPHA_MODE_MASK ); + switch( mode ) + { + case DDS_ALPHA_MODE_STRAIGHT: + case DDS_ALPHA_MODE_PREMULTIPLIED: + case DDS_ALPHA_MODE_OPAQUE: + case DDS_ALPHA_MODE_CUSTOM: + return mode; + } } else if ( ( MAKEFOURCC( 'D', 'X', 'T', '2' ) == header->ddspf.fourCC ) || ( MAKEFOURCC( 'D', 'X', 'T', '4' ) == header->ddspf.fourCC ) ) @@ -1338,7 +1346,7 @@ static DDS_ALPHA_MODE GetAlphaMode( _In_ const DDS_HEADER* header ) } } - return DDS_ALPHA_MODE_STRAIGHT; + return DDS_ALPHA_MODE_UNKNOWN; } @@ -1379,6 +1387,10 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( ID3D11Device* d3dDevice, { *textureView = nullptr; } + if ( alphaMode ) + { + *alphaMode = DDS_ALPHA_MODE_UNKNOWN; + } if (!d3dDevice || !ddsData || (!texture && !textureView)) { @@ -1482,6 +1494,10 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice, { *textureView = nullptr; } + if ( alphaMode ) + { + *alphaMode = DDS_ALPHA_MODE_UNKNOWN; + } if (!d3dDevice || !fileName || (!texture && !textureView)) { diff --git a/DDSTextureLoader/DDSTextureLoader.h b/DDSTextureLoader/DDSTextureLoader.h index e88013b..5547059 100644 --- a/DDSTextureLoader/DDSTextureLoader.h +++ b/DDSTextureLoader/DDSTextureLoader.h @@ -44,10 +44,11 @@ namespace DirectX { enum DDS_ALPHA_MODE { - DDS_ALPHA_MODE_STRAIGHT = 0, - DDS_ALPHA_MODE_PREMULTIPLIED = 1, - DDS_ALPHA_MODE_4TH_CHANNEL = 2, + DDS_ALPHA_MODE_UNKNOWN = 0, + DDS_ALPHA_MODE_STRAIGHT = 1, + DDS_ALPHA_MODE_PREMULTIPLIED = 2, DDS_ALPHA_MODE_OPAQUE = 3, + DDS_ALPHA_MODE_CUSTOM = 4, }; HRESULT CreateDDSTextureFromMemory( _In_ ID3D11Device* d3dDevice, diff --git a/DirectXTex/DDS.h b/DirectXTex/DDS.h index ccf802c..e9fb4aa 100644 --- a/DirectXTex/DDS.h +++ b/DirectXTex/DDS.h @@ -184,15 +184,16 @@ enum DDS_RESOURCE_MISC_FLAG enum DDS_MISC_FLAGS2 { - DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x3L, + DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x7L, }; enum DDS_ALPHA_MODE { - DDS_ALPHA_MODE_STRAIGHT = 0, - DDS_ALPHA_MODE_PREMULTIPLIED = 1, - DDS_ALPHA_MODE_4TH_CHANNEL = 2, + DDS_ALPHA_MODE_UNKNOWN = 0, + DDS_ALPHA_MODE_STRAIGHT = 1, + DDS_ALPHA_MODE_PREMULTIPLIED = 2, DDS_ALPHA_MODE_OPAQUE = 3, + DDS_ALPHA_MODE_CUSTOM = 4, }; struct DDS_HEADER diff --git a/DirectXTex/DirectXTex.h b/DirectXTex/DirectXTex.h index 0b6587d..166d07b 100644 --- a/DirectXTex/DirectXTex.h +++ b/DirectXTex/DirectXTex.h @@ -101,16 +101,17 @@ namespace DirectX enum TEX_MISC_FLAG2 { - TEX_MISC2_ALPHA_MODE_MASK = 0x3L, + TEX_MISC2_ALPHA_MODE_MASK = 0x7L, }; enum TEX_ALPHA_MODE // Matches DDS_ALPHA_MODE, encoded in MISC_FLAGS2 { - TEX_ALPHA_MODE_STRAIGHT = 0, - TEX_ALPHA_MODE_PREMULTIPLIED = 1, - TEX_ALPHA_MODE_4TH_CHANNEL = 2, + TEX_ALPHA_MODE_UNKNOWN = 0, + TEX_ALPHA_MODE_STRAIGHT = 1, + TEX_ALPHA_MODE_PREMULTIPLIED = 2, TEX_ALPHA_MODE_OPAQUE = 3, + TEX_ALPHA_MODE_CUSTOM = 4, }; struct TexMetadata diff --git a/DirectXTex/DirectXTexDDS.cpp b/DirectXTex/DirectXTexDDS.cpp index aa0adc9..9cbb513 100644 --- a/DirectXTex/DirectXTexDDS.cpp +++ b/DirectXTex/DirectXTexDDS.cpp @@ -315,10 +315,11 @@ static HRESULT _DecodeDDSHeader( _In_reads_bytes_(size) LPCVOID pSource, size_t static_assert( TEX_MISC2_ALPHA_MODE_MASK == DDS_MISC_FLAGS2_ALPHA_MODE_MASK, "DDS header mismatch"); + static_assert( TEX_ALPHA_MODE_UNKNOWN == DDS_ALPHA_MODE_UNKNOWN, "DDS header mismatch"); static_assert( TEX_ALPHA_MODE_STRAIGHT == DDS_ALPHA_MODE_STRAIGHT, "DDS header mismatch"); static_assert( TEX_ALPHA_MODE_PREMULTIPLIED == DDS_ALPHA_MODE_PREMULTIPLIED, "DDS header mismatch"); - static_assert( TEX_ALPHA_MODE_4TH_CHANNEL == DDS_ALPHA_MODE_4TH_CHANNEL, "DDS header mismatch"); static_assert( TEX_ALPHA_MODE_OPAQUE == DDS_ALPHA_MODE_OPAQUE, "DDS header mismatch"); + static_assert( TEX_ALPHA_MODE_CUSTOM == DDS_ALPHA_MODE_CUSTOM, "DDS header mismatch"); metadata.miscFlags2 = d3d10ext->miscFlags2; } @@ -637,10 +638,11 @@ HRESULT _EncodeDDSHeader( const TexMetadata& metadata, DWORD flags, static_assert( TEX_MISC2_ALPHA_MODE_MASK == DDS_MISC_FLAGS2_ALPHA_MODE_MASK, "DDS header mismatch"); + static_assert( TEX_ALPHA_MODE_UNKNOWN == DDS_ALPHA_MODE_UNKNOWN, "DDS header mismatch"); static_assert( TEX_ALPHA_MODE_STRAIGHT == DDS_ALPHA_MODE_STRAIGHT, "DDS header mismatch"); static_assert( TEX_ALPHA_MODE_PREMULTIPLIED == DDS_ALPHA_MODE_PREMULTIPLIED, "DDS header mismatch"); - static_assert( TEX_ALPHA_MODE_4TH_CHANNEL == DDS_ALPHA_MODE_4TH_CHANNEL, "DDS header mismatch"); static_assert( TEX_ALPHA_MODE_OPAQUE == DDS_ALPHA_MODE_OPAQUE, "DDS header mismatch"); + static_assert( TEX_ALPHA_MODE_CUSTOM == DDS_ALPHA_MODE_CUSTOM, "DDS header mismatch"); if ( flags & DDS_FLAGS_FORCE_DX10_EXT_MISC2 ) { diff --git a/Texconv/texconv.cpp b/Texconv/texconv.cpp index c45ec63..4f8a923 100644 --- a/Texconv/texconv.cpp +++ b/Texconv/texconv.cpp @@ -1080,7 +1080,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } else if ( dwOptions & (1 << OPT_SEPALPHA) ) { - info.SetAlphaMode(TEX_ALPHA_MODE_4TH_CHANNEL); + info.SetAlphaMode(TEX_ALPHA_MODE_CUSTOM); + } + else + { + info.SetAlphaMode(TEX_ALPHA_MODE_STRAIGHT); } } else