18 using Microsoft::WRL::ComPtr;
24 #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) && (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP)
27 #pragma comment(lib,"shcore.lib")
29 #ifdef __cplusplus_winrt
33 auto randomAccessStream = ref new ::Windows::Storage::Streams::InMemoryRandomAccessStream();
34 return CreateStreamOverRandomAccessStream( randomAccessStream, IID_PPV_ARGS( stream ) );
39 #include <wrl\client.h>
40 #include <wrl\wrappers\corewrappers.h>
41 #include <windows.storage.streams.h>
45 Microsoft::WRL::ComPtr<ABI::Windows::Storage::Streams::IRandomAccessStream> abiStream;
46 HRESULT hr = Windows::Foundation::ActivateInstance(
47 Microsoft::WRL::Wrappers::HStringReference( RuntimeClass_Windows_Storage_Streams_InMemoryRandomAccessStream ).Get(),
48 abiStream.GetAddressOf() );
52 hr = CreateStreamOverRandomAccessStream( abiStream.Get(), IID_PPV_ARGS( stream ) );
57 #endif // __cplusplus_winrt
63 return CreateStreamOnHGlobal( 0, TRUE, stream );
84 { GUID_WICPixelFormat1bppIndexed, GUID_WICPixelFormat32bppRGBA },
85 { GUID_WICPixelFormat2bppIndexed, GUID_WICPixelFormat32bppRGBA },
86 { GUID_WICPixelFormat4bppIndexed, GUID_WICPixelFormat32bppRGBA },
87 { GUID_WICPixelFormat8bppIndexed, GUID_WICPixelFormat32bppRGBA },
89 { GUID_WICPixelFormat2bppGray, GUID_WICPixelFormat8bppGray },
90 { GUID_WICPixelFormat4bppGray, GUID_WICPixelFormat8bppGray },
92 { GUID_WICPixelFormat16bppGrayFixedPoint, GUID_WICPixelFormat16bppGrayHalf },
93 { GUID_WICPixelFormat32bppGrayFixedPoint, GUID_WICPixelFormat32bppGrayFloat },
95 { GUID_WICPixelFormat16bppBGR555, GUID_WICPixelFormat16bppBGRA5551 },
96 { GUID_WICPixelFormat32bppBGR101010, GUID_WICPixelFormat32bppRGBA1010102 },
98 { GUID_WICPixelFormat24bppBGR, GUID_WICPixelFormat32bppRGBA },
99 { GUID_WICPixelFormat24bppRGB, GUID_WICPixelFormat32bppRGBA },
100 { GUID_WICPixelFormat32bppPBGRA, GUID_WICPixelFormat32bppRGBA },
101 { GUID_WICPixelFormat32bppPRGBA, GUID_WICPixelFormat32bppRGBA },
103 { GUID_WICPixelFormat48bppRGB, GUID_WICPixelFormat64bppRGBA },
104 { GUID_WICPixelFormat48bppBGR, GUID_WICPixelFormat64bppRGBA },
105 { GUID_WICPixelFormat64bppBGRA, GUID_WICPixelFormat64bppRGBA },
106 { GUID_WICPixelFormat64bppPRGBA, GUID_WICPixelFormat64bppRGBA },
107 { GUID_WICPixelFormat64bppPBGRA, GUID_WICPixelFormat64bppRGBA },
109 { GUID_WICPixelFormat48bppRGBFixedPoint, GUID_WICPixelFormat64bppRGBAHalf },
110 { GUID_WICPixelFormat48bppBGRFixedPoint, GUID_WICPixelFormat64bppRGBAHalf },
111 { GUID_WICPixelFormat64bppRGBAFixedPoint, GUID_WICPixelFormat64bppRGBAHalf },
112 { GUID_WICPixelFormat64bppBGRAFixedPoint, GUID_WICPixelFormat64bppRGBAHalf },
113 { GUID_WICPixelFormat64bppRGBFixedPoint, GUID_WICPixelFormat64bppRGBAHalf },
114 { GUID_WICPixelFormat64bppRGBHalf, GUID_WICPixelFormat64bppRGBAHalf },
115 { GUID_WICPixelFormat48bppRGBHalf, GUID_WICPixelFormat64bppRGBAHalf },
117 { GUID_WICPixelFormat128bppPRGBAFloat, GUID_WICPixelFormat128bppRGBAFloat },
118 { GUID_WICPixelFormat128bppRGBFloat, GUID_WICPixelFormat128bppRGBAFloat },
119 { GUID_WICPixelFormat128bppRGBAFixedPoint, GUID_WICPixelFormat128bppRGBAFloat },
120 { GUID_WICPixelFormat128bppRGBFixedPoint, GUID_WICPixelFormat128bppRGBAFloat },
121 { GUID_WICPixelFormat32bppRGBE, GUID_WICPixelFormat128bppRGBAFloat },
123 { GUID_WICPixelFormat32bppCMYK, GUID_WICPixelFormat32bppRGBA },
124 { GUID_WICPixelFormat64bppCMYK, GUID_WICPixelFormat64bppRGBA },
125 { GUID_WICPixelFormat40bppCMYKAlpha, GUID_WICPixelFormat64bppRGBA },
126 { GUID_WICPixelFormat80bppCMYKAlpha, GUID_WICPixelFormat64bppRGBA },
128 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)
129 { GUID_WICPixelFormat32bppRGB, GUID_WICPixelFormat32bppRGBA },
130 { GUID_WICPixelFormat64bppRGB, GUID_WICPixelFormat64bppRGBA },
131 { GUID_WICPixelFormat64bppPRGBAHalf, GUID_WICPixelFormat64bppRGBAHalf },
144 _Out_opt_ WICPixelFormatGUID* pConvert )
147 memset( pConvert, 0,
sizeof(WICPixelFormatGUID) );
151 if ( format == DXGI_FORMAT_UNKNOWN )
153 if ( memcmp( &GUID_WICPixelFormat96bppRGBFixedPoint, &pixelFormat,
sizeof(WICPixelFormatGUID) ) == 0 )
155 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)
159 memcpy( pConvert, &GUID_WICPixelFormat96bppRGBFloat,
sizeof(WICPixelFormatGUID) );
160 format = DXGI_FORMAT_R32G32B32_FLOAT;
166 memcpy( pConvert, &GUID_WICPixelFormat128bppRGBAFloat,
sizeof(WICPixelFormatGUID) );
167 format = DXGI_FORMAT_R32G32B32A32_FLOAT;
172 for(
size_t i=0; i < _countof(g_WICConvert); ++i )
174 if ( memcmp( &g_WICConvert[i].source, &pixelFormat,
sizeof(WICPixelFormatGUID) ) == 0 )
177 memcpy( pConvert, &g_WICConvert[i].target,
sizeof(WICPixelFormatGUID) );
179 format =
_WICToDXGI( g_WICConvert[i].target );
180 assert( format != DXGI_FORMAT_UNKNOWN );
190 case DXGI_FORMAT_B8G8R8A8_UNORM:
191 case DXGI_FORMAT_B8G8R8X8_UNORM:
194 format = DXGI_FORMAT_R8G8B8A8_UNORM;
196 memcpy( pConvert, &GUID_WICPixelFormat32bppRGBA,
sizeof(WICPixelFormatGUID) );
200 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
203 format = DXGI_FORMAT_R10G10B10A2_UNORM;
205 memcpy( pConvert, &GUID_WICPixelFormat32bppRGBA1010102,
sizeof(WICPixelFormatGUID) );
209 case DXGI_FORMAT_B5G5R5A1_UNORM:
210 case DXGI_FORMAT_B5G6R5_UNORM:
213 format = DXGI_FORMAT_R8G8B8A8_UNORM;
215 memcpy( pConvert, &GUID_WICPixelFormat32bppRGBA,
sizeof(WICPixelFormatGUID) );
219 case DXGI_FORMAT_R1_UNORM:
223 format = DXGI_FORMAT_R8_UNORM;
225 memcpy( pConvert, &GUID_WICPixelFormat8bppGray,
sizeof(WICPixelFormatGUID) );
237 _In_ IWICBitmapDecoder *decoder, _In_ IWICBitmapFrameDecode *frame,
240 if ( !decoder || !frame )
245 metadata.mipLevels = 1;
249 HRESULT hr = frame->GetSize( &w, &h );
259 hr = decoder->GetFrameCount( &fcount );
263 metadata.arraySize = fcount;
266 metadata.arraySize = 1;
268 WICPixelFormatGUID pixelFormat;
269 hr = frame->GetPixelFormat( &pixelFormat );
274 if ( metadata.format == DXGI_FORMAT_UNKNOWN )
275 return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
279 GUID containerFormat;
280 hr = decoder->GetContainerFormat( &containerFormat );
284 ComPtr<IWICMetadataQueryReader> metareader;
285 hr = frame->GetMetadataQueryReader( metareader.GetAddressOf() );
292 PropVariantInit( &value );
294 if ( memcmp( &containerFormat, &GUID_ContainerFormatPng,
sizeof(GUID) ) == 0 )
297 if ( SUCCEEDED( metareader->GetMetadataByName( L
"/sRGB/RenderingIntent", &value ) ) && value.vt == VT_UI1 )
302 else if ( SUCCEEDED( metareader->GetMetadataByName( L
"System.Image.ColorSpace", &value ) ) && value.vt == VT_UI2 && value.uiVal == 1 )
307 PropVariantClear( &value );
310 metadata.format =
MakeSRGB( metadata.format );
312 else if ( hr == WINCODEC_ERR_UNSUPPORTEDOPERATION )
327 _In_ IWICBitmapFrameDecode *frame, _Inout_
ScratchImage& image )
332 HRESULT hr = image.Initialize2D( metadata.format, metadata.width, metadata.height, 1, 1 );
336 const Image *img = image.GetImage( 0, 0, 0 );
340 IWICImagingFactory* pWIC =
_GetWIC();
342 return E_NOINTERFACE;
344 if ( memcmp( &convertGUID, &GUID_NULL,
sizeof(GUID) ) == 0 )
352 ComPtr<IWICFormatConverter> FC;
353 hr = pWIC->CreateFormatConverter( FC.GetAddressOf() );
357 hr = FC->Initialize( frame, convertGUID,
_GetWICDither( flags ), 0, 0, WICBitmapPaletteTypeCustom );
374 _In_ IWICBitmapDecoder *decoder, _Inout_
ScratchImage& image )
379 HRESULT hr = image.Initialize2D( metadata.format, metadata.width, metadata.height, metadata.arraySize, 1 );
383 IWICImagingFactory* pWIC =
_GetWIC();
385 return E_NOINTERFACE;
387 WICPixelFormatGUID sourceGUID;
388 if ( !
_DXGIToWIC( metadata.format, sourceGUID ) )
391 for(
size_t index = 0; index < metadata.arraySize; ++index )
393 const Image* img = image.GetImage( 0, index, 0 );
397 ComPtr<IWICBitmapFrameDecode> frame;
398 hr = decoder->GetFrame( static_cast<UINT>( index ), frame.GetAddressOf() );
402 WICPixelFormatGUID pfGuid;
403 hr = frame->GetPixelFormat( &pfGuid );
408 hr = frame->GetSize( &w, &h );
412 if ( memcmp( &pfGuid, &sourceGUID,
sizeof(WICPixelFormatGUID) ) == 0 )
414 if ( w == metadata.width && h == metadata.height )
424 ComPtr<IWICBitmapScaler> scaler;
425 hr = pWIC->CreateBitmapScaler( scaler.GetAddressOf() );
429 hr = scaler->Initialize( frame.Get(),
static_cast<UINT
>( metadata.width ), static_cast<UINT>( metadata.height ),
_GetWICInterp( flags ) );
433 hr = scaler->CopyPixels( 0, static_cast<UINT>( img->
rowPitch ), static_cast<UINT>( img->
slicePitch ), img->
pixels );
441 ComPtr<IWICFormatConverter> FC;
442 hr = pWIC->CreateFormatConverter( FC.GetAddressOf() );
446 hr = FC->Initialize( frame.Get(), pfGuid,
_GetWICDither( flags ), 0, 0, WICBitmapPaletteTypeCustom );
450 if ( w == metadata.width && h == metadata.height )
460 ComPtr<IWICBitmapScaler> scaler;
461 hr = pWIC->CreateBitmapScaler( scaler.GetAddressOf() );
465 hr = scaler->Initialize( FC.Get(),
static_cast<UINT
>( metadata.width ), static_cast<UINT>( metadata.height ),
_GetWICInterp( flags ) );
469 hr = scaler->CopyPixels( 0, static_cast<UINT>( img->
rowPitch ), static_cast<UINT>( img->
slicePitch ), img->
pixels );
483 static HRESULT
_EncodeMetadata( _In_ IWICBitmapFrameEncode* frame, _In_
const GUID& containerFormat, _In_ DXGI_FORMAT
format )
488 ComPtr<IWICMetadataQueryWriter> metawriter;
489 HRESULT hr = frame->GetMetadataQueryWriter( metawriter.GetAddressOf() );
490 if ( SUCCEEDED( hr ) )
493 PropVariantInit( &value );
495 bool sRGB =
IsSRGB( format );
498 value.pszVal =
"DirectXTex";
500 if ( memcmp( &containerFormat, &GUID_ContainerFormatPng,
sizeof(GUID) ) == 0 )
503 (void)metawriter->SetMetadataByName( L
"/tEXt/{str=Software}", &value );
510 (void)metawriter->SetMetadataByName( L
"/sRGB/RenderingIntent", &value );
516 (void)metawriter->SetMetadataByName( L
"System.ApplicationName", &value );
523 (void)metawriter->SetMetadataByName( L
"System.Image.ColorSpace", &value );
527 else if ( hr == WINCODEC_ERR_UNSUPPORTEDOPERATION )
541 _In_ IWICBitmapFrameEncode* frame, _In_opt_ IPropertyBag2* props, _In_opt_
const GUID* targetFormat )
549 WICPixelFormatGUID pfGuid;
551 return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
553 HRESULT hr = frame->Initialize( props );
558 if ( (image.width > 0xFFFFFFFF) || (image.height > 0xFFFFFFFF) )
562 hr = frame->SetSize( static_cast<UINT>( image.width ), static_cast<UINT>( image.height ) );
566 hr = frame->SetResolution( 72, 72 );
570 WICPixelFormatGUID targetGuid = (targetFormat) ? (*targetFormat) : pfGuid;
571 hr = frame->SetPixelFormat( &targetGuid );
575 if ( targetFormat && memcmp( targetFormat, &targetGuid,
sizeof(WICPixelFormatGUID) ) != 0 )
585 if ( memcmp( &targetGuid, &pfGuid,
sizeof(WICPixelFormatGUID) ) != 0 )
588 IWICImagingFactory* pWIC =
_GetWIC();
590 return E_NOINTERFACE;
592 ComPtr<IWICBitmap> source;
593 hr = pWIC->CreateBitmapFromMemory( static_cast<UINT>( image.width ), static_cast<UINT>( image.height ), pfGuid,
594 static_cast<UINT>( image.rowPitch ), static_cast<UINT>( image.slicePitch ),
595 image.pixels, source.GetAddressOf() );
599 ComPtr<IWICFormatConverter> FC;
600 hr = pWIC->CreateFormatConverter( FC.GetAddressOf() );
604 hr = FC->Initialize( source.Get(), targetGuid,
_GetWICDither( flags ), 0, 0, WICBitmapPaletteTypeCustom );
608 WICRect rect = { 0, 0,
static_cast<UINT
>( image.width ), static_cast<UINT>( image.height ) };
609 hr = frame->WriteSource( FC.Get(), &rect );
616 hr = frame->WritePixels( static_cast<UINT>( image.height ), static_cast<UINT>( image.rowPitch ), static_cast<UINT>( image.slicePitch ),
617 reinterpret_cast<uint8_t*>( image.pixels ) );
622 hr = frame->Commit();
630 _In_ REFGUID containerFormat, _Inout_ IStream* stream,
631 _In_opt_
const GUID* targetFormat, _In_opt_ std::function<
void(IPropertyBag2*)> setCustomProps )
637 IWICImagingFactory* pWIC =
_GetWIC();
639 return E_NOINTERFACE;
641 ComPtr<IWICBitmapEncoder> encoder;
642 HRESULT hr = pWIC->CreateEncoder( containerFormat, 0, encoder.GetAddressOf() );
646 hr = encoder->Initialize( stream, WICBitmapEncoderNoCache );
650 ComPtr<IWICBitmapFrameEncode> frame;
651 ComPtr<IPropertyBag2> props;
652 hr = encoder->CreateNewFrame( frame.GetAddressOf(), props.GetAddressOf() );
656 if ( memcmp( &containerFormat, &GUID_ContainerFormatBmp,
sizeof(WICPixelFormatGUID) ) == 0 &&
_IsWIC2() )
659 PROPBAG2 option = { 0 };
660 option.pstrName = L
"EnableV5Header32bppBGRA";
663 varValue.vt = VT_BOOL;
664 varValue.boolVal = VARIANT_TRUE;
665 (void)props->Write( 1, &option, &varValue );
668 if ( setCustomProps )
670 setCustomProps( props.Get() );
673 hr =
_EncodeImage( image, flags, containerFormat, frame.Get(), props.Get(), targetFormat );
677 hr = encoder->Commit();
689 _In_ REFGUID containerFormat, _Inout_ IStream* stream,
690 _In_opt_
const GUID* targetFormat, _In_opt_ std::function<
void(IPropertyBag2*)> setCustomProps )
692 if ( !stream || nimages < 2 )
699 IWICImagingFactory* pWIC =
_GetWIC();
701 return E_NOINTERFACE;
703 ComPtr<IWICBitmapEncoder> encoder;
704 HRESULT hr = pWIC->CreateEncoder( containerFormat, 0, encoder.GetAddressOf() );
708 ComPtr<IWICBitmapEncoderInfo> einfo;
709 hr = encoder->GetEncoderInfo( einfo.GetAddressOf() );
714 hr = einfo->DoesSupportMultiframe( &mframe );
719 return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
721 hr = encoder->Initialize( stream, WICBitmapEncoderNoCache );
725 for(
size_t index=0; index < nimages; ++index )
727 ComPtr<IWICBitmapFrameEncode> frame;
728 ComPtr<IPropertyBag2> props;
729 hr = encoder->CreateNewFrame( frame.GetAddressOf(), props.GetAddressOf() );
733 if ( setCustomProps )
735 setCustomProps( props.Get() );
738 hr =
_EncodeImage( images[index], flags, containerFormat, frame.Get(), props.Get(), targetFormat );
743 hr = encoder->Commit();
758 _Use_decl_annotations_
761 if ( !pSource || size == 0 )
765 if ( size > 0xFFFFFFFF )
766 return HRESULT_FROM_WIN32( ERROR_FILE_TOO_LARGE );
769 IWICImagingFactory* pWIC =
_GetWIC();
771 return E_NOINTERFACE;
774 ComPtr<IWICStream> stream;
775 HRESULT hr = pWIC->CreateStream( stream.GetAddressOf() );
779 hr = stream->InitializeFromMemory( reinterpret_cast<BYTE*>( const_cast<void*>( pSource ) ),
780 static_cast<UINT>( size ) );
785 ComPtr<IWICBitmapDecoder> decoder;
786 hr = pWIC->CreateDecoderFromStream( stream.Get(), 0, WICDecodeMetadataCacheOnDemand, decoder.GetAddressOf() );
790 ComPtr<IWICBitmapFrameDecode> frame;
791 hr = decoder->GetFrame( 0, frame.GetAddressOf() );
807 _Use_decl_annotations_
813 IWICImagingFactory* pWIC =
_GetWIC();
815 return E_NOINTERFACE;
818 ComPtr<IWICBitmapDecoder> decoder;
819 HRESULT hr = pWIC->CreateDecoderFromFilename( szFile, 0, GENERIC_READ, WICDecodeMetadataCacheOnDemand, decoder.GetAddressOf() );
823 ComPtr<IWICBitmapFrameDecode> frame;
824 hr = decoder->GetFrame( 0, frame.GetAddressOf() );
840 _Use_decl_annotations_
843 if ( !pSource || size == 0 )
847 if ( size > 0xFFFFFFFF )
848 return HRESULT_FROM_WIN32( ERROR_FILE_TOO_LARGE );
851 IWICImagingFactory* pWIC =
_GetWIC();
853 return E_NOINTERFACE;
858 ComPtr<IWICStream> stream;
859 HRESULT hr = pWIC->CreateStream( stream.GetAddressOf() );
863 hr = stream->InitializeFromMemory( reinterpret_cast<uint8_t*>( const_cast<void*>( pSource ) ), static_cast<DWORD>( size ) );
868 ComPtr<IWICBitmapDecoder> decoder;
869 hr = pWIC->CreateDecoderFromStream( stream.Get(), 0, WICDecodeMetadataCacheOnDemand, decoder.GetAddressOf() );
873 ComPtr<IWICBitmapFrameDecode> frame;
874 hr = decoder->GetFrame( 0, frame.GetAddressOf() );
880 WICPixelFormatGUID convertGUID = {0};
881 hr =
_DecodeMetadata( flags, decoder.Get(), frame.Get(), mdata, &convertGUID );
910 _Use_decl_annotations_
916 IWICImagingFactory* pWIC =
_GetWIC();
918 return E_NOINTERFACE;
923 ComPtr<IWICBitmapDecoder> decoder;
924 HRESULT hr = pWIC->CreateDecoderFromFilename( szFile, 0, GENERIC_READ, WICDecodeMetadataCacheOnDemand, decoder.GetAddressOf() );
928 ComPtr<IWICBitmapFrameDecode> frame;
929 hr = decoder->GetFrame( 0, frame.GetAddressOf() );
935 WICPixelFormatGUID convertGUID = {0};
936 hr =
_DecodeMetadata( flags, decoder.Get(), frame.Get(), mdata, &convertGUID );
965 _Use_decl_annotations_
967 const GUID* targetFormat, std::function<
void(IPropertyBag2*)> setCustomProps )
974 ComPtr<IStream> stream;
979 hr =
_EncodeSingleFrame( image, flags, containerFormat, stream.Get(), targetFormat, setCustomProps );
985 hr = stream->Stat( &stat, STATFLAG_NONAME );
989 if ( stat.cbSize.HighPart > 0 )
990 return HRESULT_FROM_WIN32( ERROR_FILE_TOO_LARGE );
996 LARGE_INTEGER li = { 0 };
997 hr = stream->Seek( li, STREAM_SEEK_SET, 0 );
1012 _Use_decl_annotations_
1014 const GUID* targetFormat, std::function<
void(IPropertyBag2*)> setCustomProps )
1016 if ( !images || nimages == 0 )
1017 return E_INVALIDARG;
1021 ComPtr<IStream> stream;
1027 hr =
_EncodeMultiframe( images, nimages, flags, containerFormat, stream.Get(), targetFormat, setCustomProps );
1029 hr =
_EncodeSingleFrame( images[0], flags, containerFormat, stream.Get(), targetFormat, setCustomProps );
1036 hr = stream->Stat( &stat, STATFLAG_NONAME );
1040 if ( stat.cbSize.HighPart > 0 )
1041 return HRESULT_FROM_WIN32( ERROR_FILE_TOO_LARGE );
1047 LARGE_INTEGER li = { 0 };
1048 hr = stream->Seek( li, STREAM_SEEK_SET, 0 );
1067 _Use_decl_annotations_
1069 const GUID* targetFormat, std::function<
void(IPropertyBag2*)> setCustomProps )
1072 return E_INVALIDARG;
1077 IWICImagingFactory* pWIC =
_GetWIC();
1079 return E_NOINTERFACE;
1081 ComPtr<IWICStream> stream;
1082 HRESULT hr = pWIC->CreateStream( stream.GetAddressOf() );
1086 hr = stream->InitializeFromFilename( szFile, GENERIC_WRITE );
1090 hr =
_EncodeSingleFrame( image, flags, containerFormat, stream.Get(), targetFormat, setCustomProps );
1097 _Use_decl_annotations_
1098 HRESULT
SaveToWICFile(
const Image* images,
size_t nimages, DWORD flags, REFGUID containerFormat, LPCWSTR szFile,
const GUID* targetFormat,
1099 std::function<
void(IPropertyBag2*)> setCustomProps )
1101 if ( !szFile || !images || nimages == 0 )
1102 return E_INVALIDARG;
1104 IWICImagingFactory* pWIC =
_GetWIC();
1106 return E_NOINTERFACE;
1108 ComPtr<IWICStream> stream;
1109 HRESULT hr = pWIC->CreateStream( stream.GetAddressOf() );
1113 hr = stream->InitializeFromFilename( szFile, GENERIC_WRITE );
1118 hr =
_EncodeMultiframe( images, nimages, flags, containerFormat, stream.Get(), targetFormat, setCustomProps );
1120 hr =
_EncodeSingleFrame( images[0], flags, containerFormat, stream.Get(), targetFormat, setCustomProps );
static HRESULT _DecodeMetadata(_In_ DWORD flags, _In_ IWICBitmapDecoder *decoder, _In_ IWICBitmapFrameDecode *frame, _Out_ TexMetadata &metadata, _Out_opt_ WICPixelFormatGUID *pConvert)
static HRESULT _DecodeMultiframe(_In_ DWORD flags, _In_ const TexMetadata &metadata, _In_ IWICBitmapDecoder *decoder, _Inout_ ScratchImage &image)
HRESULT SaveToWICFile(_In_ const Image &image, _In_ DWORD flags, _In_ REFGUID guidContainerFormat, _In_z_ LPCWSTR szFile, _In_opt_ const GUID *targetFormat=nullptr, _In_opt_ std::function< void(IPropertyBag2 *)> setCustomProps=nullptr)
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ DXGI_FORMAT _In_ DWORD flags
size_t _In_ DXGI_FORMAT size_t _In_ TEXP_LEGACY_FORMAT _In_ DWORD flags assert(pDestination &&outSize > 0)
HRESULT Initialize(_In_ size_t size)
static DXGI_FORMAT _DetermineFormat(_In_ const WICPixelFormatGUID &pixelFormat, _In_ DWORD flags, _Out_opt_ WICPixelFormatGUID *pConvert)
static HRESULT _EncodeMetadata(_In_ IWICBitmapFrameEncode *frame, _In_ const GUID &containerFormat, _In_ DXGI_FORMAT format)
IWICImagingFactory * _GetWIC()
void * GetBufferPointer() const
static HRESULT _EncodeSingleFrame(_In_ const Image &image, _In_ DWORD flags, _In_ REFGUID containerFormat, _Inout_ IStream *stream, _In_opt_ const GUID *targetFormat, _In_opt_ std::function< void(IPropertyBag2 *)> setCustomProps)
_In_ size_t _In_ const TexMetadata & metadata
static HRESULT _DecodeSingleFrame(_In_ DWORD flags, _In_ const TexMetadata &metadata, _In_ const WICPixelFormatGUID &convertGUID, _In_ IWICBitmapFrameDecode *frame, _Inout_ ScratchImage &image)
static WICConvert g_WICConvert[]
HRESULT LoadFromWICFile(_In_z_ LPCWSTR szFile, _In_ DWORD flags, _Out_opt_ TexMetadata *metadata, _Out_ ScratchImage &image)
HRESULT LoadFromWICMemory(_In_reads_bytes_(size) LPCVOID pSource, _In_ size_t size, _In_ DWORD flags, _Out_opt_ TexMetadata *metadata, _Out_ ScratchImage &image)
WICBitmapDitherType _GetWICDither(_In_ DWORD flags)
_In_ size_t _In_ DXGI_FORMAT _In_reads_(count) const XMVECTOR *pSource
static HRESULT CreateMemoryStream(_Outptr_ IStream **stream)
DXGI_FORMAT MakeSRGB(_In_ DXGI_FORMAT fmt)
bool IsSRGB(_In_ DXGI_FORMAT fmt)
DXGI_FORMAT _WICToDXGI(_In_ const GUID &guid)
static HRESULT _EncodeMultiframe(_In_reads_(nimages) const Image *images, _In_ size_t nimages, _In_ DWORD flags, _In_ REFGUID containerFormat, _Inout_ IStream *stream, _In_opt_ const GUID *targetFormat, _In_opt_ std::function< void(IPropertyBag2 *)> setCustomProps)
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format
HRESULT GetMetadataFromWICMemory(_In_reads_bytes_(size) LPCVOID pSource, _In_ size_t size, _In_ DWORD flags, _Out_ TexMetadata &metadata)
static HRESULT _EncodeImage(_In_ const Image &image, _In_ DWORD flags, _In_ REFGUID containerFormat, _In_ IWICBitmapFrameEncode *frame, _In_opt_ IPropertyBag2 *props, _In_opt_ const GUID *targetFormat)
bool _DXGIToWIC(_In_ DXGI_FORMAT format, _Out_ GUID &guid, _In_ bool ignoreRGBvsBGR=false)
HRESULT SaveToWICMemory(_In_ const Image &image, _In_ DWORD flags, _In_ REFGUID guidContainerFormat, _Out_ Blob &blob, _In_opt_ const GUID *targetFormat=nullptr, _In_opt_ std::function< void(IPropertyBag2 *)> setCustomProps=nullptr)
_In_ size_t _In_ size_t size
HRESULT GetMetadataFromWICFile(_In_z_ LPCWSTR szFile, _In_ DWORD flags, _Out_ TexMetadata &metadata)
WICBitmapInterpolationMode _GetWICInterp(_In_ DWORD flags)
size_t GetBufferSize() const