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 enum DDS_MISC_FLAGS2
{ {
DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x3L, DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x7L,
}; };
typedef struct 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 ) if ( MAKEFOURCC( 'D', 'X', '1', '0' ) == header->ddspf.fourCC )
{ {
auto d3d10ext = reinterpret_cast<const DDS_HEADER_DXT10*>( (const char*)header + sizeof(DDS_HEADER) ); 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 ) else if ( ( MAKEFOURCC( 'D', 'X', 'T', '2' ) == header->ddspf.fourCC )
|| ( MAKEFOURCC( 'D', 'X', 'T', '4' ) == 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; *textureView = nullptr;
} }
if ( alphaMode )
{
*alphaMode = DDS_ALPHA_MODE_UNKNOWN;
}
if (!d3dDevice || !ddsData || (!texture && !textureView)) if (!d3dDevice || !ddsData || (!texture && !textureView))
{ {
@ -1482,6 +1494,10 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice,
{ {
*textureView = nullptr; *textureView = nullptr;
} }
if ( alphaMode )
{
*alphaMode = DDS_ALPHA_MODE_UNKNOWN;
}
if (!d3dDevice || !fileName || (!texture && !textureView)) if (!d3dDevice || !fileName || (!texture && !textureView))
{ {

View File

@ -44,10 +44,11 @@ namespace DirectX
{ {
enum DDS_ALPHA_MODE enum DDS_ALPHA_MODE
{ {
DDS_ALPHA_MODE_STRAIGHT = 0, DDS_ALPHA_MODE_UNKNOWN = 0,
DDS_ALPHA_MODE_PREMULTIPLIED = 1, DDS_ALPHA_MODE_STRAIGHT = 1,
DDS_ALPHA_MODE_4TH_CHANNEL = 2, DDS_ALPHA_MODE_PREMULTIPLIED = 2,
DDS_ALPHA_MODE_OPAQUE = 3, DDS_ALPHA_MODE_OPAQUE = 3,
DDS_ALPHA_MODE_CUSTOM = 4,
}; };
HRESULT CreateDDSTextureFromMemory( _In_ ID3D11Device* d3dDevice, HRESULT CreateDDSTextureFromMemory( _In_ ID3D11Device* d3dDevice,

View File

@ -184,15 +184,16 @@ enum DDS_RESOURCE_MISC_FLAG
enum DDS_MISC_FLAGS2 enum DDS_MISC_FLAGS2
{ {
DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x3L, DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x7L,
}; };
enum DDS_ALPHA_MODE enum DDS_ALPHA_MODE
{ {
DDS_ALPHA_MODE_STRAIGHT = 0, DDS_ALPHA_MODE_UNKNOWN = 0,
DDS_ALPHA_MODE_PREMULTIPLIED = 1, DDS_ALPHA_MODE_STRAIGHT = 1,
DDS_ALPHA_MODE_4TH_CHANNEL = 2, DDS_ALPHA_MODE_PREMULTIPLIED = 2,
DDS_ALPHA_MODE_OPAQUE = 3, DDS_ALPHA_MODE_OPAQUE = 3,
DDS_ALPHA_MODE_CUSTOM = 4,
}; };
struct DDS_HEADER struct DDS_HEADER

View File

@ -101,16 +101,17 @@ namespace DirectX
enum TEX_MISC_FLAG2 enum TEX_MISC_FLAG2
{ {
TEX_MISC2_ALPHA_MODE_MASK = 0x3L, TEX_MISC2_ALPHA_MODE_MASK = 0x7L,
}; };
enum TEX_ALPHA_MODE enum TEX_ALPHA_MODE
// Matches DDS_ALPHA_MODE, encoded in MISC_FLAGS2 // Matches DDS_ALPHA_MODE, encoded in MISC_FLAGS2
{ {
TEX_ALPHA_MODE_STRAIGHT = 0, TEX_ALPHA_MODE_UNKNOWN = 0,
TEX_ALPHA_MODE_PREMULTIPLIED = 1, TEX_ALPHA_MODE_STRAIGHT = 1,
TEX_ALPHA_MODE_4TH_CHANNEL = 2, TEX_ALPHA_MODE_PREMULTIPLIED = 2,
TEX_ALPHA_MODE_OPAQUE = 3, TEX_ALPHA_MODE_OPAQUE = 3,
TEX_ALPHA_MODE_CUSTOM = 4,
}; };
struct TexMetadata 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_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_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_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_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; 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_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_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_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_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 ) 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) ) 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 else