33
33
#pragma comment(lib,"dxguid.lib")
34
34
#endif
35
35
36
+ using namespace DirectX ;
37
+
36
38
// --------------------------------------------------------------------------------------
37
39
// Macros
38
40
// --------------------------------------------------------------------------------------
@@ -99,6 +101,11 @@ struct DDS_PIXELFORMAT
99
101
100
102
#define DDS_FLAGS_VOLUME 0x00200000 // DDSCAPS2_VOLUME
101
103
104
+ enum DDS_MISC_FLAGS2
105
+ {
106
+ DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x3L ,
107
+ };
108
+
102
109
typedef struct
103
110
{
104
111
uint32_t size;
@@ -123,7 +130,7 @@ typedef struct
123
130
uint32_t resourceDimension;
124
131
uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG
125
132
uint32_t arraySize;
126
- uint32_t reserved ;
133
+ uint32_t miscFlags2 ;
127
134
} DDS_HEADER_DXT10;
128
135
129
136
#pragma pack(pop)
@@ -237,7 +244,7 @@ static HRESULT LoadTextureDataFromFile( _In_z_ const wchar_t* fileName,
237
244
return E_FAIL;
238
245
}
239
246
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 ) );
241
248
242
249
// Verify header to validate DDS file
243
250
if (hdr->size != sizeof (DDS_HEADER) ||
@@ -1109,7 +1116,7 @@ static HRESULT CreateTextureFromDDS( _In_ ID3D11Device* d3dDevice,
1109
1116
if ((header->ddspf .flags & DDS_FOURCC) &&
1110
1117
(MAKEFOURCC ( ' D' , ' X' , ' 1' , ' 0' ) == header->ddspf .fourCC ))
1111
1118
{
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) );
1113
1120
1114
1121
arraySize = d3d10ext->arraySize ;
1115
1122
if (arraySize == 0 )
@@ -1310,18 +1317,41 @@ static HRESULT CreateTextureFromDDS( _In_ ID3D11Device* d3dDevice,
1310
1317
return hr;
1311
1318
}
1312
1319
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
+
1313
1342
// --------------------------------------------------------------------------------------
1314
1343
_Use_decl_annotations_
1315
1344
HRESULT DirectX::CreateDDSTextureFromMemory ( ID3D11Device* d3dDevice,
1316
1345
const uint8_t * ddsData,
1317
1346
size_t ddsDataSize,
1318
1347
ID3D11Resource** texture,
1319
1348
ID3D11ShaderResourceView** textureView,
1320
- size_t maxsize )
1349
+ size_t maxsize,
1350
+ DDS_ALPHA_MODE* alphaMode )
1321
1351
{
1322
1352
return CreateDDSTextureFromMemoryEx ( d3dDevice, ddsData, ddsDataSize, maxsize,
1323
1353
D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0 , 0 , false ,
1324
- texture, textureView );
1354
+ texture, textureView, alphaMode );
1325
1355
}
1326
1356
1327
1357
_Use_decl_annotations_
@@ -1335,7 +1365,8 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( ID3D11Device* d3dDevice,
1335
1365
unsigned int miscFlags,
1336
1366
bool forceSRGB,
1337
1367
ID3D11Resource** texture,
1338
- ID3D11ShaderResourceView** textureView )
1368
+ ID3D11ShaderResourceView** textureView,
1369
+ DDS_ALPHA_MODE* alphaMode )
1339
1370
{
1340
1371
if ( texture )
1341
1372
{
@@ -1363,7 +1394,7 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( ID3D11Device* d3dDevice,
1363
1394
return E_FAIL;
1364
1395
}
1365
1396
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 ) );
1367
1398
1368
1399
// Verify header to validate DDS file
1369
1400
if (header->size != sizeof (DDS_HEADER) ||
@@ -1405,6 +1436,9 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( ID3D11Device* d3dDevice,
1405
1436
{
1406
1437
SetDebugObjectName (*textureView, " DDSTextureLoader" );
1407
1438
}
1439
+
1440
+ if ( alphaMode )
1441
+ *alphaMode = GetAlphaMode ( header );
1408
1442
}
1409
1443
1410
1444
return hr;
@@ -1416,11 +1450,12 @@ HRESULT DirectX::CreateDDSTextureFromFile( ID3D11Device* d3dDevice,
1416
1450
const wchar_t * fileName,
1417
1451
ID3D11Resource** texture,
1418
1452
ID3D11ShaderResourceView** textureView,
1419
- size_t maxsize )
1453
+ size_t maxsize,
1454
+ DDS_ALPHA_MODE* alphaMode )
1420
1455
{
1421
1456
return CreateDDSTextureFromFileEx ( d3dDevice, fileName, maxsize,
1422
1457
D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0 , 0 , false ,
1423
- texture, textureView );
1458
+ texture, textureView, alphaMode );
1424
1459
}
1425
1460
1426
1461
_Use_decl_annotations_
@@ -1433,7 +1468,8 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice,
1433
1468
unsigned int miscFlags,
1434
1469
bool forceSRGB,
1435
1470
ID3D11Resource** texture,
1436
- ID3D11ShaderResourceView** textureView )
1471
+ ID3D11ShaderResourceView** textureView,
1472
+ DDS_ALPHA_MODE* alphaMode )
1437
1473
{
1438
1474
if ( texture )
1439
1475
{
@@ -1470,9 +1506,9 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice,
1470
1506
usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB,
1471
1507
texture, textureView );
1472
1508
1473
- #if defined(_DEBUG) || defined(PROFILE)
1474
1509
if ( SUCCEEDED (hr) )
1475
1510
{
1511
+ #if defined(_DEBUG) || defined(PROFILE)
1476
1512
if (texture != 0 || textureView != 0 )
1477
1513
{
1478
1514
CHAR strFileA[MAX_PATH];
@@ -1514,8 +1550,11 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice,
1514
1550
}
1515
1551
}
1516
1552
}
1517
- }
1518
1553
#endif
1519
1554
1555
+ if ( alphaMode )
1556
+ *alphaMode = GetAlphaMode ( header );
1557
+ }
1558
+
1520
1559
return hr;
1521
1560
}
0 commit comments