Skip to content

Commit ee978ad

Browse files
walbourn_cpwalbourn_cp
walbourn_cp
authored and
walbourn_cp
committed
Updated DDSTextureLoader to optionall return Alpha Mode metadata if available
1 parent 3cc014e commit ee978ad

File tree

2 files changed

+67
-16
lines changed

2 files changed

+67
-16
lines changed

DDSTextureLoader/DDSTextureLoader.cpp

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
#pragma comment(lib,"dxguid.lib")
3434
#endif
3535

36+
using namespace DirectX;
37+
3638
//--------------------------------------------------------------------------------------
3739
// Macros
3840
//--------------------------------------------------------------------------------------
@@ -99,6 +101,11 @@ struct DDS_PIXELFORMAT
99101

100102
#define DDS_FLAGS_VOLUME 0x00200000 // DDSCAPS2_VOLUME
101103

104+
enum DDS_MISC_FLAGS2
105+
{
106+
DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x3L,
107+
};
108+
102109
typedef struct
103110
{
104111
uint32_t size;
@@ -123,7 +130,7 @@ typedef struct
123130
uint32_t resourceDimension;
124131
uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG
125132
uint32_t arraySize;
126-
uint32_t reserved;
133+
uint32_t miscFlags2;
127134
} DDS_HEADER_DXT10;
128135

129136
#pragma pack(pop)
@@ -237,7 +244,7 @@ static HRESULT LoadTextureDataFromFile( _In_z_ const wchar_t* fileName,
237244
return E_FAIL;
238245
}
239246

240-
DDS_HEADER* hdr = reinterpret_cast<DDS_HEADER*>( ddsData.get() + sizeof( uint32_t ) );
247+
auto hdr = reinterpret_cast<DDS_HEADER*>( ddsData.get() + sizeof( uint32_t ) );
241248

242249
// Verify header to validate DDS file
243250
if (hdr->size != sizeof(DDS_HEADER) ||
@@ -1109,7 +1116,7 @@ static HRESULT CreateTextureFromDDS( _In_ ID3D11Device* d3dDevice,
11091116
if ((header->ddspf.flags & DDS_FOURCC) &&
11101117
(MAKEFOURCC( 'D', 'X', '1', '0' ) == header->ddspf.fourCC ))
11111118
{
1112-
const DDS_HEADER_DXT10* d3d10ext = reinterpret_cast<const DDS_HEADER_DXT10*>( (const char*)header + sizeof(DDS_HEADER) );
1119+
auto d3d10ext = reinterpret_cast<const DDS_HEADER_DXT10*>( (const char*)header + sizeof(DDS_HEADER) );
11131120

11141121
arraySize = d3d10ext->arraySize;
11151122
if (arraySize == 0)
@@ -1310,18 +1317,41 @@ static HRESULT CreateTextureFromDDS( _In_ ID3D11Device* d3dDevice,
13101317
return hr;
13111318
}
13121319

1320+
1321+
//--------------------------------------------------------------------------------------
1322+
static DDS_ALPHA_MODE GetAlphaMode( _In_ const DDS_HEADER* header )
1323+
{
1324+
if ( header->ddspf.flags & DDS_FOURCC )
1325+
{
1326+
if ( MAKEFOURCC( 'D', 'X', '1', '0' ) == header->ddspf.fourCC )
1327+
{
1328+
auto d3d10ext = reinterpret_cast<const DDS_HEADER_DXT10*>( (const char*)header + sizeof(DDS_HEADER) );
1329+
return static_cast<DDS_ALPHA_MODE>(d3d10ext->miscFlags2 & DDS_MISC_FLAGS2_ALPHA_MODE_MASK);
1330+
}
1331+
else if ( ( MAKEFOURCC( 'D', 'X', 'T', '2' ) == header->ddspf.fourCC )
1332+
|| ( MAKEFOURCC( 'D', 'X', 'T', '4' ) == header->ddspf.fourCC ) )
1333+
{
1334+
return DDS_ALPHA_MODE_PREMULTIPLIED;
1335+
}
1336+
}
1337+
1338+
return DDS_ALPHA_MODE_STRAIGHT;
1339+
}
1340+
1341+
13131342
//--------------------------------------------------------------------------------------
13141343
_Use_decl_annotations_
13151344
HRESULT DirectX::CreateDDSTextureFromMemory( ID3D11Device* d3dDevice,
13161345
const uint8_t* ddsData,
13171346
size_t ddsDataSize,
13181347
ID3D11Resource** texture,
13191348
ID3D11ShaderResourceView** textureView,
1320-
size_t maxsize )
1349+
size_t maxsize,
1350+
DDS_ALPHA_MODE* alphaMode )
13211351
{
13221352
return CreateDDSTextureFromMemoryEx( d3dDevice, ddsData, ddsDataSize, maxsize,
13231353
D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false,
1324-
texture, textureView );
1354+
texture, textureView, alphaMode );
13251355
}
13261356

13271357
_Use_decl_annotations_
@@ -1335,7 +1365,8 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( ID3D11Device* d3dDevice,
13351365
unsigned int miscFlags,
13361366
bool forceSRGB,
13371367
ID3D11Resource** texture,
1338-
ID3D11ShaderResourceView** textureView )
1368+
ID3D11ShaderResourceView** textureView,
1369+
DDS_ALPHA_MODE* alphaMode )
13391370
{
13401371
if ( texture )
13411372
{
@@ -1363,7 +1394,7 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( ID3D11Device* d3dDevice,
13631394
return E_FAIL;
13641395
}
13651396

1366-
const DDS_HEADER* header = reinterpret_cast<const DDS_HEADER*>( ddsData + sizeof( uint32_t ) );
1397+
auto header = reinterpret_cast<const DDS_HEADER*>( ddsData + sizeof( uint32_t ) );
13671398

13681399
// Verify header to validate DDS file
13691400
if (header->size != sizeof(DDS_HEADER) ||
@@ -1405,6 +1436,9 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( ID3D11Device* d3dDevice,
14051436
{
14061437
SetDebugObjectName(*textureView, "DDSTextureLoader");
14071438
}
1439+
1440+
if ( alphaMode )
1441+
*alphaMode = GetAlphaMode( header );
14081442
}
14091443

14101444
return hr;
@@ -1416,11 +1450,12 @@ HRESULT DirectX::CreateDDSTextureFromFile( ID3D11Device* d3dDevice,
14161450
const wchar_t* fileName,
14171451
ID3D11Resource** texture,
14181452
ID3D11ShaderResourceView** textureView,
1419-
size_t maxsize )
1453+
size_t maxsize,
1454+
DDS_ALPHA_MODE* alphaMode )
14201455
{
14211456
return CreateDDSTextureFromFileEx( d3dDevice, fileName, maxsize,
14221457
D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false,
1423-
texture, textureView );
1458+
texture, textureView, alphaMode );
14241459
}
14251460

14261461
_Use_decl_annotations_
@@ -1433,7 +1468,8 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice,
14331468
unsigned int miscFlags,
14341469
bool forceSRGB,
14351470
ID3D11Resource** texture,
1436-
ID3D11ShaderResourceView** textureView )
1471+
ID3D11ShaderResourceView** textureView,
1472+
DDS_ALPHA_MODE* alphaMode )
14371473
{
14381474
if ( texture )
14391475
{
@@ -1470,9 +1506,9 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice,
14701506
usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB,
14711507
texture, textureView );
14721508

1473-
#if defined(_DEBUG) || defined(PROFILE)
14741509
if ( SUCCEEDED(hr) )
14751510
{
1511+
#if defined(_DEBUG) || defined(PROFILE)
14761512
if (texture != 0 || textureView != 0)
14771513
{
14781514
CHAR strFileA[MAX_PATH];
@@ -1514,8 +1550,11 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice,
15141550
}
15151551
}
15161552
}
1517-
}
15181553
#endif
15191554

1555+
if ( alphaMode )
1556+
*alphaMode = GetAlphaMode( header );
1557+
}
1558+
15201559
return hr;
15211560
}

DDSTextureLoader/DDSTextureLoader.h

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,29 @@
4141

4242
namespace DirectX
4343
{
44+
enum DDS_ALPHA_MODE
45+
{
46+
DDS_ALPHA_MODE_STRAIGHT = 0,
47+
DDS_ALPHA_MODE_PREMULTIPLIED = 1,
48+
DDS_ALPHA_MODE_4TH_CHANNEL = 2,
49+
DDS_ALPHA_MODE_OPAQUE = 3,
50+
};
51+
4452
HRESULT CreateDDSTextureFromMemory( _In_ ID3D11Device* d3dDevice,
4553
_In_reads_bytes_(ddsDataSize) const uint8_t* ddsData,
4654
_In_ size_t ddsDataSize,
4755
_Out_opt_ ID3D11Resource** texture,
4856
_Out_opt_ ID3D11ShaderResourceView** textureView,
49-
_In_ size_t maxsize = 0
57+
_In_ size_t maxsize = 0,
58+
_Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr
5059
);
5160

5261
HRESULT CreateDDSTextureFromFile( _In_ ID3D11Device* d3dDevice,
5362
_In_z_ const wchar_t* szFileName,
5463
_Out_opt_ ID3D11Resource** texture,
5564
_Out_opt_ ID3D11ShaderResourceView** textureView,
56-
_In_ size_t maxsize = 0
65+
_In_ size_t maxsize = 0,
66+
_Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr
5767
);
5868

5969
HRESULT CreateDDSTextureFromMemoryEx( _In_ ID3D11Device* d3dDevice,
@@ -66,7 +76,8 @@ namespace DirectX
6676
_In_ unsigned int miscFlags,
6777
_In_ bool forceSRGB,
6878
_Out_opt_ ID3D11Resource** texture,
69-
_Out_opt_ ID3D11ShaderResourceView** textureView
79+
_Out_opt_ ID3D11ShaderResourceView** textureView,
80+
_Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr
7081
);
7182

7283
HRESULT CreateDDSTextureFromFileEx( _In_ ID3D11Device* d3dDevice,
@@ -78,6 +89,7 @@ namespace DirectX
7889
_In_ unsigned int miscFlags,
7990
_In_ bool forceSRGB,
8091
_Out_opt_ ID3D11Resource** texture,
81-
_Out_opt_ ID3D11ShaderResourceView** textureView
92+
_Out_opt_ ID3D11ShaderResourceView** textureView,
93+
_Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr
8294
);
8395
}

0 commit comments

Comments
 (0)