diff --git a/DirectXTex/DirectXTex.h b/DirectXTex/DirectXTex.h index 978c11f..d9fc97e 100644 --- a/DirectXTex/DirectXTex.h +++ b/DirectXTex/DirectXTex.h @@ -192,6 +192,9 @@ namespace DirectX WIC_FLAGS_ALL_FRAMES = 0x10, // Loads all images in a multi-frame file, converting/resizing to match the first frame as needed, defaults to 0th frame otherwise + WIC_FLAGS_IGNORE_SRGB = 0x20, + // Ignores sRGB metadata if present in the file + WIC_FLAGS_DITHER = 0x10000, // Use ordered 4x4 dithering for any required conversions diff --git a/DirectXTex/DirectXTexWIC.cpp b/DirectXTex/DirectXTexWIC.cpp index 4ac2c99..1027762 100644 --- a/DirectXTex/DirectXTexWIC.cpp +++ b/DirectXTex/DirectXTexWIC.cpp @@ -272,43 +272,46 @@ static HRESULT _DecodeMetadata( _In_ DWORD flags, if ( metadata.format == DXGI_FORMAT_UNKNOWN ) return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); - GUID containerFormat; - hr = decoder->GetContainerFormat( &containerFormat ); - if ( FAILED(hr) ) - return hr; - - ScopedObject metareader; - hr = frame->GetMetadataQueryReader( &metareader ); - if ( SUCCEEDED(hr) ) + if ( !( flags & WIC_FLAGS_IGNORE_SRGB ) ) { - // Check for sRGB colorspace metadata - bool sRGB = false; + GUID containerFormat; + hr = decoder->GetContainerFormat( &containerFormat ); + if ( FAILED(hr) ) + return hr; - PROPVARIANT value; - PropVariantInit( &value ); - - if ( memcmp( &containerFormat, &GUID_ContainerFormatPng, sizeof(GUID) ) == 0 ) + ScopedObject metareader; + hr = frame->GetMetadataQueryReader( &metareader ); + if ( SUCCEEDED(hr) ) { - // Check for sRGB chunk - if ( SUCCEEDED( metareader->GetMetadataByName( L"/sRGB/RenderingIntent", &value ) ) && value.vt == VT_UI1 ) + // Check for sRGB colorspace metadata + bool sRGB = false; + + PROPVARIANT value; + PropVariantInit( &value ); + + if ( memcmp( &containerFormat, &GUID_ContainerFormatPng, sizeof(GUID) ) == 0 ) + { + // Check for sRGB chunk + if ( SUCCEEDED( metareader->GetMetadataByName( L"/sRGB/RenderingIntent", &value ) ) && value.vt == VT_UI1 ) + { + sRGB = true; + } + } + else if ( SUCCEEDED( metareader->GetMetadataByName( L"System.Image.ColorSpace", &value ) ) && value.vt == VT_UI2 && value.uiVal == 1 ) { sRGB = true; } + + PropVariantClear( &value ); + + if ( sRGB ) + metadata.format = MakeSRGB( metadata.format ); } - else if ( SUCCEEDED( metareader->GetMetadataByName( L"System.Image.ColorSpace", &value ) ) && value.vt == VT_UI2 && value.uiVal == 1 ) + else if ( hr == WINCODEC_ERR_UNSUPPORTEDOPERATION ) { - sRGB = true; + // Some formats just don't support metadata (BMP, ICO, etc.), so ignore this failure + hr = S_OK; } - - PropVariantClear( &value ); - - if ( sRGB ) - metadata.format = MakeSRGB( metadata.format ); - } - else if ( hr == WINCODEC_ERR_UNSUPPORTEDOPERATION ) - { - // Some formats just don't support metadata (BMP, ICO, etc.), so ignore this failure - hr = S_OK; } return hr;