Ziqing Hui : windowscodecs: Use IWICWineDecoder_Initialize() to initialize decoders in find_decoder().
Alexandre Julliard
julliard at winehq.org
Fri Jul 17 16:30:45 CDT 2020
Module: wine
Branch: master
Commit: 81405aa86d736c52afbc12919428ffa2d8634e93
URL: https://source.winehq.org/git/wine.git/?a=commit;h=81405aa86d736c52afbc12919428ffa2d8634e93
Author: Ziqing Hui <zhui at codeweavers.com>
Date: Wed Jul 15 22:00:55 2020 +0800
windowscodecs: Use IWICWineDecoder_Initialize() to initialize decoders in find_decoder().
Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/windowscodecs/imgfactory.c | 94 ++++++++++++++++++++---------------------
1 file changed, 46 insertions(+), 48 deletions(-)
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c
index e7c61cff70..0ad8bc6ee1 100644
--- a/dlls/windowscodecs/imgfactory.c
+++ b/dlls/windowscodecs/imgfactory.c
@@ -134,76 +134,74 @@ static HRESULT WINAPI ImagingFactory_CreateDecoderFromFilename(
static HRESULT find_decoder(IStream *pIStream, const GUID *pguidVendor,
WICDecodeOptions metadataOptions, IWICBitmapDecoder **decoder)
{
- IEnumUnknown *enumdecoders;
- IUnknown *unkdecoderinfo;
- IWICBitmapDecoderInfo *decoderinfo;
+ IEnumUnknown *enumdecoders = NULL;
+ IUnknown *unkdecoderinfo = NULL;
GUID vendor;
- HRESULT res;
+ HRESULT res, res_wine;
ULONG num_fetched;
- BOOL matches;
+ BOOL matches, found;
*decoder = NULL;
res = CreateComponentEnumerator(WICDecoder, WICComponentEnumerateDefault, &enumdecoders);
if (FAILED(res)) return res;
- while (!*decoder)
+ found = FALSE;
+ while (IEnumUnknown_Next(enumdecoders, 1, &unkdecoderinfo, &num_fetched) == S_OK)
{
- res = IEnumUnknown_Next(enumdecoders, 1, &unkdecoderinfo, &num_fetched);
+ IWICBitmapDecoderInfo *decoderinfo = NULL;
+ IWICWineDecoder *wine_decoder = NULL;
- if (res == S_OK)
- {
- res = IUnknown_QueryInterface(unkdecoderinfo, &IID_IWICBitmapDecoderInfo, (void**)&decoderinfo);
+ res = IUnknown_QueryInterface(unkdecoderinfo, &IID_IWICBitmapDecoderInfo, (void**)&decoderinfo);
+ if (FAILED(res)) goto next;
- if (SUCCEEDED(res))
- {
- if (pguidVendor)
- {
- res = IWICBitmapDecoderInfo_GetVendorGUID(decoderinfo, &vendor);
- if (FAILED(res) || !IsEqualIID(&vendor, pguidVendor))
- {
- IWICBitmapDecoderInfo_Release(decoderinfo);
- IUnknown_Release(unkdecoderinfo);
- continue;
- }
- }
-
- res = IWICBitmapDecoderInfo_MatchesPattern(decoderinfo, pIStream, &matches);
+ if (pguidVendor)
+ {
+ res = IWICBitmapDecoderInfo_GetVendorGUID(decoderinfo, &vendor);
+ if (FAILED(res) || !IsEqualIID(&vendor, pguidVendor)) goto next;
+ }
- if (SUCCEEDED(res) && matches)
- {
- res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, decoder);
+ res = IWICBitmapDecoderInfo_MatchesPattern(decoderinfo, pIStream, &matches);
+ if (FAILED(res) || !matches) goto next;
- /* FIXME: should use QueryCapability to choose a decoder */
+ res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, decoder);
+ if (FAILED(res)) goto next;
- if (SUCCEEDED(res))
- {
- res = IWICBitmapDecoder_Initialize(*decoder, pIStream, metadataOptions);
+ /* FIXME: should use QueryCapability to choose a decoder */
- if (FAILED(res))
- {
- IWICBitmapDecoder_Release(*decoder);
- IWICBitmapDecoderInfo_Release(decoderinfo);
- IUnknown_Release(unkdecoderinfo);
- IEnumUnknown_Release(enumdecoders);
- *decoder = NULL;
- return res;
- }
- }
- }
+ found = TRUE;
+ res = IWICBitmapDecoder_Initialize(*decoder, pIStream, metadataOptions);
+ if (FAILED(res))
+ {
+ res_wine = IWICBitmapDecoder_QueryInterface(*decoder, &IID_IWICWineDecoder, (void **)&wine_decoder);
+ if (FAILED(res_wine))
+ {
+ IWICBitmapDecoder_Release(*decoder);
+ *decoder = NULL;
+ goto next;
+ }
- IWICBitmapDecoderInfo_Release(decoderinfo);
+ res_wine = IWICWineDecoder_Initialize(wine_decoder, pIStream, metadataOptions);
+ if (FAILED(res_wine))
+ {
+ IWICBitmapDecoder_Release(*decoder);
+ *decoder = NULL;
+ goto next;
}
- IUnknown_Release(unkdecoderinfo);
+ res = res_wine;
}
- else
- break;
+
+ next:
+ if (wine_decoder) IWICWineDecoder_Release(wine_decoder);
+ if (decoderinfo) IWICBitmapDecoderInfo_Release(decoderinfo);
+ IUnknown_Release(unkdecoderinfo);
+ if (found) break;
}
IEnumUnknown_Release(enumdecoders);
-
- return WINCODEC_ERR_COMPONENTNOTFOUND;
+ if (!found) res = WINCODEC_ERR_COMPONENTNOTFOUND;
+ return res;
}
static HRESULT WINAPI ImagingFactory_CreateDecoderFromStream(
More information about the wine-cvs
mailing list