diff --git a/DirectXTex/BCDirectCompute.cpp b/DirectXTex/BCDirectCompute.cpp index 2590644..c37dbeb 100644 --- a/DirectXTex/BCDirectCompute.cpp +++ b/DirectXTex/BCDirectCompute.cpp @@ -183,10 +183,8 @@ HRESULT GPUCompressBC::Prepare( size_t width, size_t height, DXGI_FORMAT format, if ( !width || !height || alphaWeight < 0.f ) return E_INVALIDARG; -#ifdef _M_X64 - if ( (width > 0xFFFFFFFF) || (height > 0xFFFFFFFF) ) + if ( (width > UINT32_MAX) || (height > UINT32_MAX) ) return E_INVALIDARG; -#endif m_width = width; m_height = height; diff --git a/DirectXTex/DirectXTexConvert.cpp b/DirectXTex/DirectXTexConvert.cpp index fd8cc79..f6999d9 100644 --- a/DirectXTex/DirectXTexConvert.cpp +++ b/DirectXTex/DirectXTexConvert.cpp @@ -4531,10 +4531,8 @@ HRESULT Convert( const Image& srcImage, DXGI_FORMAT format, DWORD filter, float || IsTypeless(srcImage.format) || IsTypeless(format) ) return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); -#ifdef _M_X64 - if ( (srcImage.width > 0xFFFFFFFF) || (srcImage.height > 0xFFFFFFFF) ) + if ( (srcImage.width > UINT32_MAX) || (srcImage.height > UINT32_MAX) ) return E_INVALIDARG; -#endif HRESULT hr = image.Initialize2D( format, srcImage.width, srcImage.height, 1, 1 ); if ( FAILED(hr) ) @@ -4583,10 +4581,8 @@ HRESULT Convert( const Image* srcImages, size_t nimages, const TexMetadata& meta || IsTypeless(metadata.format) || IsTypeless(format) ) return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); -#ifdef _M_X64 - if ( (metadata.width > 0xFFFFFFFF) || (metadata.height > 0xFFFFFFFF) ) + if ( (metadata.width > UINT32_MAX) || (metadata.height > UINT32_MAX) ) return E_INVALIDARG; -#endif TexMetadata mdata2 = metadata; mdata2.format = format; @@ -4623,10 +4619,8 @@ HRESULT Convert( const Image* srcImages, size_t nimages, const TexMetadata& meta return E_FAIL; } -#ifdef _M_X64 - if ( (src.width > 0xFFFFFFFF) || (src.height > 0xFFFFFFFF) ) + if ( (src.width > UINT32_MAX) || (src.height > UINT32_MAX) ) return E_FAIL; -#endif const Image& dst = dest[ index ]; assert( dst.format == format ); @@ -4672,10 +4666,8 @@ HRESULT Convert( const Image* srcImages, size_t nimages, const TexMetadata& meta return E_FAIL; } -#ifdef _M_X64 - if ( (src.width > 0xFFFFFFFF) || (src.height > 0xFFFFFFFF) ) + if ( (src.width > UINT32_MAX) || (src.height > UINT32_MAX) ) return E_FAIL; -#endif const Image& dst = dest[ index ]; assert( dst.format == format ); @@ -4732,10 +4724,8 @@ HRESULT ConvertToSinglePlane( const Image& srcImage, ScratchImage& image ) if ( format == DXGI_FORMAT_UNKNOWN ) return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); -#ifdef _M_X64 - if ( (srcImage.width > 0xFFFFFFFF) || (srcImage.height > 0xFFFFFFFF) ) + if ( (srcImage.width > UINT32_MAX) || (srcImage.height > UINT32_MAX) ) return E_INVALIDARG; -#endif HRESULT hr = image.Initialize2D( format, srcImage.width, srcImage.height, 1, 1 ); if ( FAILED(hr) ) @@ -4779,10 +4769,8 @@ HRESULT ConvertToSinglePlane( const Image* srcImages, size_t nimages, const TexM if ( format == DXGI_FORMAT_UNKNOWN ) return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); -#ifdef _M_X64 - if ( (metadata.width > 0xFFFFFFFF) || (metadata.height > 0xFFFFFFFF) ) + if ( (metadata.width > UINT32_MAX) || (metadata.height > UINT32_MAX) ) return E_INVALIDARG; -#endif TexMetadata mdata2 = metadata; mdata2.format = format; @@ -4812,10 +4800,8 @@ HRESULT ConvertToSinglePlane( const Image* srcImages, size_t nimages, const TexM return E_FAIL; } -#ifdef _M_X64 - if ( (src.width > 0xFFFFFFFF) || (src.height > 0xFFFFFFFF) ) + if ( (src.width > UINT32_MAX) || (src.height > UINT32_MAX) ) return E_FAIL; -#endif const Image& dst = dest[ index ]; assert( dst.format == format ); diff --git a/DirectXTex/DirectXTexD3D11.cpp b/DirectXTex/DirectXTexD3D11.cpp index 67d149c..4cf3f69 100644 --- a/DirectXTex/DirectXTexD3D11.cpp +++ b/DirectXTex/DirectXTexD3D11.cpp @@ -405,11 +405,9 @@ HRESULT CreateTextureEx( ID3D11Device* pDevice, const Image* srcImages, size_t n if ( !metadata.mipLevels || !metadata.arraySize ) return E_INVALIDARG; -#ifdef _M_X64 - if ( (metadata.width > 0xFFFFFFFF) || (metadata.height > 0xFFFFFFFF) - || (metadata.mipLevels > 0xFFFFFFFF) || (metadata.arraySize > 0xFFFFFFFF) ) + if ( (metadata.width > UINT32_MAX) || (metadata.height > UINT32_MAX) + || (metadata.mipLevels > UINT32_MAX) || (metadata.arraySize > UINT32_MAX) ) return E_INVALIDARG; -#endif std::unique_ptr initData( new (std::nothrow) D3D11_SUBRESOURCE_DATA[ metadata.mipLevels * metadata.arraySize ] ); if ( !initData ) @@ -422,10 +420,8 @@ HRESULT CreateTextureEx( ID3D11Device* pDevice, const Image* srcImages, size_t n if ( !metadata.depth ) return E_INVALIDARG; -#ifdef _M_X64 - if ( metadata.depth > 0xFFFFFFFF ) + if ( metadata.depth > UINT32_MAX ) return E_INVALIDARG; -#endif if ( metadata.arraySize > 1 ) // Direct3D 11 doesn't support arrays of 3D textures diff --git a/DirectXTex/DirectXTexDDS.cpp b/DirectXTex/DirectXTexDDS.cpp index 1798e85..79a410c 100644 --- a/DirectXTex/DirectXTexDDS.cpp +++ b/DirectXTex/DirectXTexDDS.cpp @@ -575,10 +575,8 @@ HRESULT _EncodeDDSHeader( const TexMetadata& metadata, DWORD flags, { header->dwFlags |= DDS_HEADER_FLAGS_MIPMAP; -#ifdef _M_X64 - if ( metadata.mipLevels > 0xFFFFFFFF ) + if ( metadata.mipLevels > UINT32_MAX ) return E_INVALIDARG; -#endif header->dwMipMapCount = static_cast( metadata.mipLevels ); @@ -589,21 +587,17 @@ HRESULT _EncodeDDSHeader( const TexMetadata& metadata, DWORD flags, switch( metadata.dimension ) { case TEX_DIMENSION_TEXTURE1D: -#ifdef _M_X64 - if ( metadata.width > 0xFFFFFFFF ) + if ( metadata.width > UINT32_MAX ) return E_INVALIDARG; -#endif header->dwWidth = static_cast( metadata.width ); header->dwHeight = header->dwDepth = 1; break; case TEX_DIMENSION_TEXTURE2D: -#ifdef _M_X64 - if ( metadata.height > 0xFFFFFFFF - || metadata.width > 0xFFFFFFFF) + if ( metadata.height > UINT32_MAX + || metadata.width > UINT32_MAX ) return E_INVALIDARG; -#endif header->dwHeight = static_cast( metadata.height ); header->dwWidth = static_cast( metadata.width ); @@ -617,12 +611,10 @@ HRESULT _EncodeDDSHeader( const TexMetadata& metadata, DWORD flags, break; case TEX_DIMENSION_TEXTURE3D: -#ifdef _M_X64 - if ( metadata.height > 0xFFFFFFFF - || metadata.width > 0xFFFFFFFF - || metadata.depth > 0xFFFFFFFF ) + if ( metadata.height > UINT32_MAX + || metadata.width > UINT32_MAX + || metadata.depth > UINT32_MAX ) return E_INVALIDARG; -#endif header->dwFlags |= DDS_HEADER_FLAGS_VOLUME; header->dwCaps2 |= DDS_FLAGS_VOLUME; @@ -638,11 +630,9 @@ HRESULT _EncodeDDSHeader( const TexMetadata& metadata, DWORD flags, size_t rowPitch, slicePitch; ComputePitch( metadata.format, metadata.width, metadata.height, rowPitch, slicePitch, CP_FLAGS_NONE ); -#ifdef _M_X64 - if ( slicePitch > 0xFFFFFFFF - || rowPitch > 0xFFFFFFFF ) + if ( slicePitch > UINT32_MAX + || rowPitch > UINT32_MAX ) return E_FAIL; -#endif if ( IsCompressed( metadata.format ) ) { @@ -666,10 +656,8 @@ HRESULT _EncodeDDSHeader( const TexMetadata& metadata, DWORD flags, ext->dxgiFormat = metadata.format; ext->resourceDimension = metadata.dimension; -#ifdef _M_X64 - if ( metadata.arraySize > 0xFFFFFFFF ) + if ( metadata.arraySize > UINT32_MAX ) return E_INVALIDARG; -#endif static_assert( TEX_MISC_TEXTURECUBE == DDS_RESOURCE_MISC_TEXTURECUBE, "DDS header mismatch"); diff --git a/DirectXTex/DirectXTexFlipRotate.cpp b/DirectXTex/DirectXTexFlipRotate.cpp index ed57982..671137a 100644 --- a/DirectXTex/DirectXTexFlipRotate.cpp +++ b/DirectXTex/DirectXTexFlipRotate.cpp @@ -138,10 +138,8 @@ HRESULT FlipRotate( const Image& srcImage, DWORD flags, ScratchImage& image ) if ( !flags ) return E_INVALIDARG; -#ifdef _M_X64 - if ( (srcImage.width > 0xFFFFFFFF) || (srcImage.height > 0xFFFFFFFF) ) + if ( (srcImage.width > UINT32_MAX) || (srcImage.height > UINT32_MAX) ) return E_INVALIDARG; -#endif if ( IsCompressed( srcImage.format ) ) { @@ -283,10 +281,8 @@ HRESULT FlipRotate( const Image* srcImages, size_t nimages, const TexMetadata& m return E_FAIL; } -#ifdef _M_X64 - if ( (src.width > 0xFFFFFFFF) || (src.height > 0xFFFFFFFF) ) + if ( (src.width > UINT32_MAX) || (src.height > UINT32_MAX) ) return E_FAIL; -#endif const Image& dst = dest[ index ]; assert( dst.format == metadata.format ); diff --git a/DirectXTex/DirectXTexPMAlpha.cpp b/DirectXTex/DirectXTexPMAlpha.cpp index d5da206..4d34022 100644 --- a/DirectXTex/DirectXTexPMAlpha.cpp +++ b/DirectXTex/DirectXTexPMAlpha.cpp @@ -120,10 +120,8 @@ HRESULT PremultiplyAlpha( const Image& srcImage, DWORD flags, ScratchImage& imag || !HasAlpha(srcImage.format) ) return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); -#ifdef _M_X64 - if ( (srcImage.width > 0xFFFFFFFF) || (srcImage.height > 0xFFFFFFFF) ) + if ( (srcImage.width > UINT32_MAX) || (srcImage.height > UINT32_MAX) ) return E_INVALIDARG; -#endif HRESULT hr = image.Initialize2D( srcImage.format, srcImage.width, srcImage.height, 1, 1 ); if ( FAILED(hr) ) @@ -163,10 +161,8 @@ HRESULT PremultiplyAlpha( const Image* srcImages, size_t nimages, const TexMetad || !HasAlpha(metadata.format) ) return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); -#ifdef _M_X64 - if ( (metadata.width > 0xFFFFFFFF) || (metadata.height > 0xFFFFFFFF) ) + if ( (metadata.width > UINT32_MAX) || (metadata.height > UINT32_MAX) ) return E_INVALIDARG; -#endif if ( metadata.IsPMAlpha() ) { @@ -202,10 +198,9 @@ HRESULT PremultiplyAlpha( const Image* srcImages, size_t nimages, const TexMetad return E_FAIL; } -#ifdef _M_X64 - if ( (src.width > 0xFFFFFFFF) || (src.height > 0xFFFFFFFF) ) + if ( (src.width > UINT32_MAX) || (src.height > UINT32_MAX) ) return E_FAIL; -#endif + const Image& dst = dest[ index ]; assert( dst.format == metadata.format ); diff --git a/DirectXTex/DirectXTexResize.cpp b/DirectXTex/DirectXTexResize.cpp index 165fc1c..9709eeb 100644 --- a/DirectXTex/DirectXTexResize.cpp +++ b/DirectXTex/DirectXTexResize.cpp @@ -833,13 +833,11 @@ HRESULT Resize( const Image& srcImage, size_t width, size_t height, DWORD filter if ( width == 0 || height == 0 ) return E_INVALIDARG; -#ifdef _M_X64 - if ( (srcImage.width > 0xFFFFFFFF) || (srcImage.height > 0xFFFFFFFF) ) + if ( (srcImage.width > UINT32_MAX) || (srcImage.height > UINT32_MAX) ) return E_INVALIDARG; - if ( (width > 0xFFFFFFFF) || (height > 0xFFFFFFFF) ) + if ( (width > UINT32_MAX) || (height > UINT32_MAX) ) return E_INVALIDARG; -#endif if ( !srcImage.pixels ) return E_POINTER; @@ -897,10 +895,8 @@ HRESULT Resize( const Image* srcImages, size_t nimages, const TexMetadata& metad if ( !srcImages || !nimages || width == 0 || height == 0 ) return E_INVALIDARG; -#ifdef _M_X64 - if ( (width > 0xFFFFFFFF) || (height > 0xFFFFFFFF) ) + if ( (width > UINT32_MAX) || (height > UINT32_MAX) ) return E_INVALIDARG; -#endif TexMetadata mdata2 = metadata; mdata2.width = width; @@ -944,13 +940,11 @@ HRESULT Resize( const Image* srcImages, size_t nimages, const TexMetadata& metad return E_FAIL; } -#ifdef _M_X64 - if ( (srcimg->width > 0xFFFFFFFF) || (srcimg->height > 0xFFFFFFFF) ) + if ( (srcimg->width > UINT32_MAX) || (srcimg->height > UINT32_MAX) ) { result.Release(); return E_FAIL; } -#endif if ( usewic ) { @@ -1005,13 +999,11 @@ HRESULT Resize( const Image* srcImages, size_t nimages, const TexMetadata& metad return E_FAIL; } -#ifdef _M_X64 - if ( (srcimg->width > 0xFFFFFFFF) || (srcimg->height > 0xFFFFFFFF) ) + if ( (srcimg->width > UINT32_MAX) || (srcimg->height > UINT32_MAX) ) { result.Release(); return E_FAIL; } -#endif if ( usewic ) { diff --git a/DirectXTex/DirectXTexUtil.cpp b/DirectXTex/DirectXTexUtil.cpp index 5f988ce..9f103bd 100644 --- a/DirectXTex/DirectXTexUtil.cpp +++ b/DirectXTex/DirectXTexUtil.cpp @@ -237,53 +237,59 @@ IWICImagingFactory* GetWICFactory(bool& iswic2) return g_Factory; } + static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; + InitOnceExecuteOnce(&s_initOnce, + [](PINIT_ONCE, PVOID, PVOID *) -> BOOL + { #if(_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory2), - (LPVOID*)&g_Factory - ); - - if (SUCCEEDED(hr)) - { - // WIC2 is available on Windows 8 and Windows 7 SP1 with KB 2670838 installed - g_WIC2 = true; - } - else - { - g_WIC2 = false; - - hr = CoCreateInstance( - CLSID_WICImagingFactory1, - nullptr, - CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&g_Factory) + HRESULT hr = CoCreateInstance( + CLSID_WICImagingFactory2, + nullptr, + CLSCTX_INPROC_SERVER, + __uuidof(IWICImagingFactory2), + (LPVOID*)&g_Factory ); - if (FAILED(hr)) - { - g_Factory = nullptr; - return nullptr; - } - } + if (SUCCEEDED(hr)) + { + // WIC2 is available on Windows 8 and Windows 7 SP1 with KB 2670838 installed + g_WIC2 = true; + } + else + { + g_WIC2 = false; + + hr = CoCreateInstance( + CLSID_WICImagingFactory1, + nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&g_Factory) + ); + + if (FAILED(hr)) + { + g_Factory = nullptr; + return FALSE; + } + } #else - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory, - nullptr, - CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&g_Factory) - ); + HRESULT hr = CoCreateInstance( + CLSID_WICImagingFactory, + nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&g_Factory) + ); - g_WIC2 = false; + g_WIC2 = false; - if (FAILED(hr)) - { - g_Factory = nullptr; - return nullptr; - } + if (FAILED(hr)) + { + g_Factory = nullptr; + return FALSE; + } #endif + return TRUE; + }, nullptr, nullptr); iswic2 = g_WIC2; return g_Factory; diff --git a/DirectXTex/DirectXTexWIC.cpp b/DirectXTex/DirectXTexWIC.cpp index 0074637..dee8c64 100644 --- a/DirectXTex/DirectXTexWIC.cpp +++ b/DirectXTex/DirectXTexWIC.cpp @@ -645,10 +645,8 @@ static HRESULT _EncodeImage( _In_ const Image& image, _In_ DWORD flags, _In_ REF if ( FAILED(hr) ) return hr; -#ifdef _M_X64 - if ( (image.width > 0xFFFFFFFF) || (image.height > 0xFFFFFFFF) ) + if ( (image.width > UINT32_MAX) || (image.height > UINT32_MAX) ) return E_INVALIDARG; -#endif hr = frame->SetSize( static_cast( image.width ), static_cast( image.height ) ); if ( FAILED(hr) ) @@ -862,10 +860,8 @@ HRESULT GetMetadataFromWICMemory( LPCVOID pSource, size_t size, DWORD flags, Tex if ( !pSource || size == 0 ) return E_INVALIDARG; -#ifdef _M_X64 - if ( size > 0xFFFFFFFF ) + if ( size > UINT32_MAX ) return HRESULT_FROM_WIN32( ERROR_FILE_TOO_LARGE ); -#endif bool iswic2 = false; IWICImagingFactory* pWIC = GetWICFactory(iswic2); @@ -946,10 +942,8 @@ HRESULT LoadFromWICMemory( LPCVOID pSource, size_t size, DWORD flags, TexMetadat if ( !pSource || size == 0 ) return E_INVALIDARG; -#ifdef _M_X64 - if ( size > 0xFFFFFFFF ) + if ( size > UINT32_MAX ) return HRESULT_FROM_WIN32( ERROR_FILE_TOO_LARGE ); -#endif bool iswic2 = false; IWICImagingFactory* pWIC = GetWICFactory(iswic2); diff --git a/ScreenGrab/ScreenGrab.cpp b/ScreenGrab/ScreenGrab.cpp index 11577f4..b8c062b 100644 --- a/ScreenGrab/ScreenGrab.cpp +++ b/ScreenGrab/ScreenGrab.cpp @@ -706,49 +706,56 @@ namespace if ( s_Factory ) return s_Factory; - #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory2), - (LPVOID*)&s_Factory - ); + static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; - if ( SUCCEEDED(hr) ) - { - // WIC2 is available on Windows 8 and Windows 7 SP1 with KB 2670838 installed - g_WIC2 = true; - } - else - { - hr = CoCreateInstance( - CLSID_WICImagingFactory1, - nullptr, - CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&s_Factory) - ); - - if ( FAILED(hr) ) + InitOnceExecuteOnce(&s_initOnce, + [](PINIT_ONCE, PVOID, PVOID *) -> BOOL { - s_Factory = nullptr; - return nullptr; - } - } - #else - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory, - nullptr, - CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&s_Factory) - ); + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + HRESULT hr = CoCreateInstance( + CLSID_WICImagingFactory2, + nullptr, + CLSCTX_INPROC_SERVER, + __uuidof(IWICImagingFactory2), + (LPVOID*)&s_Factory + ); - if ( FAILED(hr) ) - { - s_Factory = nullptr; - return nullptr; - } - #endif + if ( SUCCEEDED(hr) ) + { + // WIC2 is available on Windows 10, Windows 8.x, and Windows 7 SP1 with KB 2670838 installed + g_WIC2 = true; + } + else + { + hr = CoCreateInstance( + CLSID_WICImagingFactory1, + nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&s_Factory) + ); + + if ( FAILED(hr) ) + { + s_Factory = nullptr; + return FALSE; + } + } + #else + HRESULT hr = CoCreateInstance( + CLSID_WICImagingFactory, + nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&s_Factory) + ); + + if ( FAILED(hr) ) + { + s_Factory = nullptr; + return FALSE; + } + #endif + return TRUE; + }, nullptr, nullptr); return s_Factory; } diff --git a/ScreenGrab/ScreenGrab12.cpp b/ScreenGrab/ScreenGrab12.cpp index 093273f..a56f137 100644 --- a/ScreenGrab/ScreenGrab12.cpp +++ b/ScreenGrab/ScreenGrab12.cpp @@ -786,16 +786,24 @@ namespace if (s_Factory) return s_Factory; - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&s_Factory)); - if (FAILED(hr)) - { - s_Factory = nullptr; - return nullptr; - } + static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; + + InitOnceExecuteOnce(&s_initOnce, + [](PINIT_ONCE, PVOID, PVOID *) -> BOOL + { + HRESULT hr = CoCreateInstance( + CLSID_WICImagingFactory2, + nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&s_Factory)); + if (FAILED(hr)) + { + s_Factory = nullptr; + return FALSE; + } + return TRUE; + }, nullptr, nullptr); + return s_Factory; } } // anonymous namespace diff --git a/WICTextureLoader/WICTextureLoader.cpp b/WICTextureLoader/WICTextureLoader.cpp index 238d0f9..70e4269 100644 --- a/WICTextureLoader/WICTextureLoader.cpp +++ b/WICTextureLoader/WICTextureLoader.cpp @@ -68,7 +68,7 @@ namespace DXGI_FORMAT format; }; - const WICTranslate g_WICFormats[] = + const WICTranslate g_WICFormats[] = { { GUID_WICPixelFormat128bppRGBAFloat, DXGI_FORMAT_R32G32B32A32_FLOAT }, @@ -103,7 +103,7 @@ namespace GUID target; }; - const WICConvert g_WICConvert[] = + const WICConvert g_WICConvert[] = { // Note target GUID in this conversion table must be one of those directly supported formats (above). @@ -154,11 +154,11 @@ namespace { GUID_WICPixelFormat40bppCMYKAlpha, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM { GUID_WICPixelFormat80bppCMYKAlpha, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) { GUID_WICPixelFormat32bppRGB, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM { GUID_WICPixelFormat64bppRGB, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM { GUID_WICPixelFormat64bppPRGBAHalf, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT -#endif + #endif // We don't support n-channel formats }; @@ -173,49 +173,56 @@ namespace if ( s_Factory ) return s_Factory; -#if(_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory2), - (LPVOID*)&s_Factory - ); + static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; - if ( SUCCEEDED(hr) ) - { - // WIC2 is available on Windows 8 and Windows 7 SP1 with KB 2670838 installed - g_WIC2 = true; - } - else - { - hr = CoCreateInstance( - CLSID_WICImagingFactory1, - nullptr, - CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&s_Factory) - ); - - if ( FAILED(hr) ) + InitOnceExecuteOnce(&s_initOnce, + [](PINIT_ONCE, PVOID, PVOID *) -> BOOL { - s_Factory = nullptr; - return nullptr; - } - } -#else - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory, - nullptr, - CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&s_Factory) - ); + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + HRESULT hr = CoCreateInstance( + CLSID_WICImagingFactory2, + nullptr, + CLSCTX_INPROC_SERVER, + __uuidof(IWICImagingFactory2), + (LPVOID*)&s_Factory + ); - if ( FAILED(hr) ) - { - s_Factory = nullptr; - return nullptr; - } -#endif + if ( SUCCEEDED(hr) ) + { + // WIC2 is available on Windows 10, Windows 8.x, and Windows 7 SP1 with KB 2670838 installed + g_WIC2 = true; + } + else + { + hr = CoCreateInstance( + CLSID_WICImagingFactory1, + nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&s_Factory) + ); + + if ( FAILED(hr) ) + { + s_Factory = nullptr; + return FALSE; + } + } + #else + HRESULT hr = CoCreateInstance( + CLSID_WICImagingFactory, + nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&s_Factory) + ); + + if ( FAILED(hr) ) + { + s_Factory = nullptr; + return FALSE; + } + #endif + return TRUE; + }, nullptr, nullptr); return s_Factory; } @@ -229,13 +236,13 @@ namespace return g_WICFormats[i].format; } -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) if ( g_WIC2 ) { if ( memcmp( &GUID_WICPixelFormat96bppRGBFloat, &guid, sizeof(GUID) ) == 0 ) return DXGI_FORMAT_R32G32B32_FLOAT; } -#endif + #endif return DXGI_FORMAT_UNKNOWN; } @@ -391,14 +398,14 @@ namespace { if ( memcmp( &GUID_WICPixelFormat96bppRGBFixedPoint, &pixelFormat, sizeof(WICPixelFormatGUID) ) == 0 ) { -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) if ( g_WIC2 ) { memcpy( &convertGUID, &GUID_WICPixelFormat96bppRGBFloat, sizeof(WICPixelFormatGUID) ); format = DXGI_FORMAT_R32G32B32_FLOAT; } else -#endif + #endif { memcpy( &convertGUID, &GUID_WICPixelFormat128bppRGBAFloat, sizeof(WICPixelFormatGUID) ); format = DXGI_FORMAT_R32G32B32A32_FLOAT; @@ -428,7 +435,7 @@ namespace bpp = _WICBitsPerPixel( pixelFormat ); } -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) if ( (format == DXGI_FORMAT_R32G32B32_FLOAT) && d3dContext != 0 && textureView != 0 ) { // Special case test for optional device support for autogen mipchains for R32G32B32_FLOAT @@ -442,7 +449,7 @@ namespace bpp = 128; } } -#endif + #endif if ( !bpp ) return E_FAIL; @@ -753,10 +760,8 @@ HRESULT DirectX::CreateWICTextureFromMemoryEx( ID3D11Device* d3dDevice, if ( !wicDataSize ) return E_FAIL; -#ifdef _M_AMD64 - if ( wicDataSize > 0xFFFFFFFF ) + if ( wicDataSize > UINT32_MAX ) return HRESULT_FROM_WIN32( ERROR_FILE_TOO_LARGE ); -#endif IWICImagingFactory* pWIC = _GetWIC(); if ( !pWIC ) diff --git a/WICTextureLoader/WICTextureLoader12.cpp b/WICTextureLoader/WICTextureLoader12.cpp index 90fdc9a..2ef7312 100644 --- a/WICTextureLoader/WICTextureLoader12.cpp +++ b/WICTextureLoader/WICTextureLoader12.cpp @@ -154,16 +154,24 @@ namespace if (s_Factory) return s_Factory; - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&s_Factory)); - if (FAILED(hr)) - { - s_Factory = nullptr; - return nullptr; - } + static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; + + InitOnceExecuteOnce(&s_initOnce, + [](PINIT_ONCE, PVOID, PVOID *) -> BOOL + { + HRESULT hr = CoCreateInstance( + CLSID_WICImagingFactory2, + nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&s_Factory)); + if (FAILED(hr)) + { + s_Factory = nullptr; + return FALSE; + } + return TRUE; + }, nullptr, nullptr); + return s_Factory; } @@ -581,10 +589,8 @@ HRESULT DirectX::LoadWICTextureFromMemoryEx( if ( !wicDataSize ) return E_FAIL; -#ifdef _M_AMD64 - if ( wicDataSize > 0xFFFFFFFF ) + if ( wicDataSize > UINT32_MAX ) return HRESULT_FROM_WIN32( ERROR_FILE_TOO_LARGE ); -#endif auto pWIC = _GetWIC(); if ( !pWIC )