Update DDS alpha mode metadata

- Make alpha mode 3 bits instead of 2
- Rename 4TH_CHANNEL to CUSTOM
- Reorder enum
This commit is contained in:
walbourn_cp 2013-04-11 15:23:54 -07:00
parent dc401291a1
commit 33db361592
6 changed files with 42 additions and 17 deletions

View File

@ -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 DDS_HEADER_DXT10*>( (const char*)header + sizeof(DDS_HEADER) );
return static_cast<DDS_ALPHA_MODE>(d3d10ext->miscFlags2 & DDS_MISC_FLAGS2_ALPHA_MODE_MASK);
auto mode = static_cast<DDS_ALPHA_MODE>( 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))
{

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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 )
{

View File

@ -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