Skip to content

Commit 6a90510

Browse files
walbourn_cpwalbourn_cp
walbourn_cp
authored and
walbourn_cp
committed
DirectXTex: Added WIC2 support for downlevel builds to support Windows 8 and Windows 7 with KB 2670838 isntalled
1 parent a8fb216 commit 6a90510

File tree

5 files changed

+121
-39
lines changed

5 files changed

+121
-39
lines changed

DirectXTex/DirectXTexMipmaps.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,14 +193,20 @@ HRESULT _ResizeSeparateColorAndAlpha( _In_ IWICImagingFactory* pWIC, _In_ IWICBi
193193
}
194194
else
195195
{
196-
#if(_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
197-
colorBytesInPixel = colorBytesPerPixel = 12;
198-
colorPixelFormat = GUID_WICPixelFormat96bppRGBFloat;
199-
#else
200-
colorBytesInPixel = 12;
201-
colorBytesPerPixel = 16;
202-
colorPixelFormat = GUID_WICPixelFormat128bppRGBFloat;
203-
#endif
196+
#if(_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) || defined(_WIN7_PLATFORM_UPDATE)
197+
if ( _IsWIC2() )
198+
{
199+
colorBytesInPixel = colorBytesPerPixel = 12;
200+
colorPixelFormat = GUID_WICPixelFormat96bppRGBFloat;
201+
}
202+
else
203+
#endif
204+
{
205+
colorBytesInPixel = 12;
206+
colorBytesPerPixel = 16;
207+
colorPixelFormat = GUID_WICPixelFormat128bppRGBFloat;
208+
}
209+
204210
colorWithAlphaBytesPerPixel = 16;
205211
colorWithAlphaPixelFormat = GUID_WICPixelFormat128bppRGBAFloat;
206212
}

DirectXTex/DirectXTexP.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939

4040
#include <ole2.h>
4141

42+
#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) || defined(_WIN7_PLATFORM_UPDATE)
43+
#include <d2d1.h>
44+
#endif
45+
4246
#pragma warning(push)
4347
#pragma warning(disable : 4005)
4448
#include <wincodec.h>
@@ -65,6 +69,8 @@ namespace DirectX
6569

6670
IWICImagingFactory* _GetWIC();
6771

72+
bool _IsWIC2();
73+
6874
inline WICBitmapDitherType _GetWICDither( _In_ DWORD flags )
6975
{
7076
static_assert( TEX_FILTER_DITHER == 0x10000, "TEX_FILTER_DITHER* flag values don't match mask" );

DirectXTex/DirectXTexUtil.cpp

Lines changed: 67 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,10 @@ static WICTranslate g_WICFormats[] =
5050
{ GUID_WICPixelFormat8bppAlpha, DXGI_FORMAT_A8_UNORM },
5151

5252
{ GUID_WICPixelFormatBlackWhite, DXGI_FORMAT_R1_UNORM },
53-
54-
#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
55-
{ GUID_WICPixelFormat96bppRGBFloat, DXGI_FORMAT_R32G32B32_FLOAT },
56-
#endif
5753
};
5854

55+
static bool g_WIC2 = false;
56+
5957
namespace DirectX
6058
{
6159

@@ -71,21 +69,19 @@ DXGI_FORMAT _WICToDXGI( const GUID& guid )
7169
return g_WICFormats[i].format;
7270
}
7371

72+
#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) || defined(_WIN7_PLATFORM_UPDATE)
73+
if ( g_WIC2 )
74+
{
75+
if ( memcmp( &GUID_WICPixelFormat96bppRGBFloat, &guid, sizeof(GUID) ) == 0 )
76+
return DXGI_FORMAT_R32G32B32_FLOAT;
77+
}
78+
#endif
79+
7480
return DXGI_FORMAT_UNKNOWN;
7581
}
7682

7783
bool _DXGIToWIC( DXGI_FORMAT format, GUID& guid )
7884
{
79-
for( size_t i=0; i < _countof(g_WICFormats); ++i )
80-
{
81-
if ( g_WICFormats[i].format == format )
82-
{
83-
memcpy( &guid, &g_WICFormats[i].wic, sizeof(GUID) );
84-
return true;
85-
}
86-
}
87-
88-
// Special cases
8985
switch( format )
9086
{
9187
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
@@ -107,19 +103,75 @@ bool _DXGIToWIC( DXGI_FORMAT format, GUID& guid )
107103
case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
108104
memcpy( &guid, &GUID_WICPixelFormat32bppBGR, sizeof(GUID) );
109105
return true;
106+
107+
#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) || defined(_WIN7_PLATFORM_UPDATE)
108+
case DXGI_FORMAT_R32G32B32_FLOAT:
109+
if ( g_WIC2 )
110+
{
111+
memcpy( &guid, &GUID_WICPixelFormat96bppRGBFloat, sizeof(GUID) );
112+
return true;
113+
}
114+
break;
115+
#endif
116+
117+
default:
118+
for( size_t i=0; i < _countof(g_WICFormats); ++i )
119+
{
120+
if ( g_WICFormats[i].format == format )
121+
{
122+
memcpy( &guid, &g_WICFormats[i].wic, sizeof(GUID) );
123+
return true;
124+
}
125+
}
126+
break;
110127
}
111128

112129
memcpy( &guid, &GUID_NULL, sizeof(GUID) );
113130
return false;
114131
}
115132

133+
bool _IsWIC2()
134+
{
135+
return g_WIC2;
136+
}
137+
116138
IWICImagingFactory* _GetWIC()
117139
{
118140
static IWICImagingFactory* s_Factory = nullptr;
119141

120142
if ( s_Factory )
121143
return s_Factory;
122144

145+
#if(_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) || defined(_WIN7_PLATFORM_UPDATE)
146+
HRESULT hr = CoCreateInstance(
147+
CLSID_WICImagingFactory2,
148+
nullptr,
149+
CLSCTX_INPROC_SERVER,
150+
__uuidof(IWICImagingFactory2),
151+
(LPVOID*)&s_Factory
152+
);
153+
154+
if ( SUCCEEDED(hr) )
155+
{
156+
g_WIC2 = true;
157+
}
158+
else
159+
{
160+
hr = CoCreateInstance(
161+
CLSID_WICImagingFactory1,
162+
nullptr,
163+
CLSCTX_INPROC_SERVER,
164+
__uuidof(IWICImagingFactory),
165+
(LPVOID*)&s_Factory
166+
);
167+
168+
if ( FAILED(hr) )
169+
{
170+
s_Factory = nullptr;
171+
return nullptr;
172+
}
173+
}
174+
#else
123175
HRESULT hr = CoCreateInstance(
124176
CLSID_WICImagingFactory,
125177
nullptr,
@@ -133,6 +185,7 @@ IWICImagingFactory* _GetWIC()
133185
s_Factory = nullptr;
134186
return nullptr;
135187
}
188+
#endif
136189

137190
return s_Factory;
138191
}

DirectXTex/DirectXTexWIC.cpp

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,10 @@ static WICConvert g_WICConvert[] =
7373
{ GUID_WICPixelFormat40bppCMYKAlpha, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM
7474
{ GUID_WICPixelFormat80bppCMYKAlpha, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM
7575

76-
#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
76+
#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) || defined(_WIN7_PLATFORM_UPDATE)
7777
{ GUID_WICPixelFormat32bppRGB, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM
7878
{ GUID_WICPixelFormat64bppRGB, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM
7979
{ GUID_WICPixelFormat64bppPRGBAHalf, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT
80-
{ GUID_WICPixelFormat96bppRGBFixedPoint, GUID_WICPixelFormat96bppRGBFloat }, // DXGI_FORMAT_R32G32B32_FLOAT
81-
#else
82-
{ GUID_WICPixelFormat96bppRGBFixedPoint, GUID_WICPixelFormat128bppRGBAFloat }, // DXGI_FORMAT_R32G32B32A32_FLOAT
8380
#endif
8481

8582
// We don't support n-channel formats
@@ -101,16 +98,36 @@ static DXGI_FORMAT _DetermineFormat( _In_ const WICPixelFormatGUID& pixelFormat,
10198

10299
if ( format == DXGI_FORMAT_UNKNOWN )
103100
{
104-
for( size_t i=0; i < _countof(g_WICConvert); ++i )
101+
if ( memcmp( &GUID_WICPixelFormat96bppRGBFixedPoint, &pixelFormat, sizeof(WICPixelFormatGUID) ) == 0 )
105102
{
106-
if ( memcmp( &g_WICConvert[i].source, &pixelFormat, sizeof(WICPixelFormatGUID) ) == 0 )
103+
#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) || defined(_WIN7_PLATFORM_UPDATE)
104+
if ( _IsWIC2() )
107105
{
108106
if ( pConvert )
109-
memcpy( pConvert, &g_WICConvert[i].target, sizeof(WICPixelFormatGUID) );
110-
111-
format = _WICToDXGI( g_WICConvert[i].target );
112-
assert( format != DXGI_FORMAT_UNKNOWN );
113-
break;
107+
memcpy( pConvert, &GUID_WICPixelFormat96bppRGBFloat, sizeof(WICPixelFormatGUID) );
108+
format = DXGI_FORMAT_R32G32B32_FLOAT;
109+
}
110+
else
111+
#endif
112+
{
113+
if ( pConvert )
114+
memcpy( pConvert, &GUID_WICPixelFormat128bppRGBAFloat, sizeof(WICPixelFormatGUID) );
115+
format = DXGI_FORMAT_R32G32B32A32_FLOAT;
116+
}
117+
}
118+
else
119+
{
120+
for( size_t i=0; i < _countof(g_WICConvert); ++i )
121+
{
122+
if ( memcmp( &g_WICConvert[i].source, &pixelFormat, sizeof(WICPixelFormatGUID) ) == 0 )
123+
{
124+
if ( pConvert )
125+
memcpy( pConvert, &g_WICConvert[i].target, sizeof(WICPixelFormatGUID) );
126+
127+
format = _WICToDXGI( g_WICConvert[i].target );
128+
assert( format != DXGI_FORMAT_UNKNOWN );
129+
break;
130+
}
114131
}
115132
}
116133
}

DirectXTex/DirectXTex_Desktop_2012.vcxproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
<ExceptionHandling>Sync</ExceptionHandling>
144144
<AdditionalIncludeDirectories>..\XNAMath;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
145145
<AdditionalOptions> %(AdditionalOptions)</AdditionalOptions>
146-
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;DXGI_1_2_FORMATS;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
146+
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;DXGI_1_2_FORMATS;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
147147
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
148148
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
149149
<PrecompiledHeader>Use</PrecompiledHeader>
@@ -184,7 +184,7 @@
184184
<ExceptionHandling>Sync</ExceptionHandling>
185185
<AdditionalIncludeDirectories>..\XNAMath;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
186186
<AdditionalOptions> %(AdditionalOptions)</AdditionalOptions>
187-
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;DXGI_1_2_FORMATS;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
187+
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;DXGI_1_2_FORMATS;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
188188
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
189189
<PrecompiledHeader>Use</PrecompiledHeader>
190190
<PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
@@ -226,7 +226,7 @@
226226
<ExceptionHandling>Sync</ExceptionHandling>
227227
<AdditionalIncludeDirectories>..\XNAMath;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
228228
<AdditionalOptions> %(AdditionalOptions)</AdditionalOptions>
229-
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;DXGI_1_2_FORMATS;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
229+
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;DXGI_1_2_FORMATS;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
230230
<PrecompiledHeader>Use</PrecompiledHeader>
231231
<PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
232232
</ClCompile>
@@ -268,7 +268,7 @@
268268
<ExceptionHandling>Sync</ExceptionHandling>
269269
<AdditionalIncludeDirectories>..\XNAMath;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
270270
<AdditionalOptions> %(AdditionalOptions)</AdditionalOptions>
271-
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;DXGI_1_2_FORMATS;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
271+
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;DXGI_1_2_FORMATS;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
272272
<PrecompiledHeader>Use</PrecompiledHeader>
273273
<PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
274274
</ClCompile>
@@ -311,7 +311,7 @@
311311
<ExceptionHandling>Sync</ExceptionHandling>
312312
<AdditionalIncludeDirectories>..\XNAMath;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
313313
<AdditionalOptions> %(AdditionalOptions)</AdditionalOptions>
314-
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;DXGI_1_2_FORMATS;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
314+
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;DXGI_1_2_FORMATS;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
315315
<PrecompiledHeader>Use</PrecompiledHeader>
316316
<PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
317317
</ClCompile>
@@ -353,7 +353,7 @@
353353
<ExceptionHandling>Sync</ExceptionHandling>
354354
<AdditionalIncludeDirectories>..\XNAMath;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
355355
<AdditionalOptions> %(AdditionalOptions)</AdditionalOptions>
356-
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;DXGI_1_2_FORMATS;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
356+
<PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;DXGI_1_2_FORMATS;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
357357
<PrecompiledHeader>Use</PrecompiledHeader>
358358
<PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
359359
</ClCompile>

0 commit comments

Comments
 (0)