Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45709 Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/clsfactory.c | 1 + dlls/windowscodecs/imgfactory.c | 239 ++++++++++++++++++++++++++++++++ dlls/windowscodecs/tests/info.c | 33 +++++ 3 files changed, 273 insertions(+)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c index 77eeedc428..2e8cc8e22d 100644 --- a/dlls/windowscodecs/clsfactory.c +++ b/dlls/windowscodecs/clsfactory.c @@ -44,6 +44,7 @@ typedef struct {
static const classinfo wic_classes[] = { {&CLSID_WICImagingFactory, ComponentFactory_CreateInstance}, + {&CLSID_WICImagingFactory2, ComponentFactory_CreateInstance}, {&CLSID_WICBmpDecoder, BmpDecoder_CreateInstance}, {&CLSID_WICPngDecoder, PngDecoder_CreateInstance}, {&CLSID_WICPngEncoder, PngEncoder_CreateInstance}, diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index 06e3f6aceb..f23c824473 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -37,6 +37,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
typedef struct { IWICComponentFactory IWICComponentFactory_iface; + IWICImagingFactory2 IWICImagingFactory2_iface; LONG ref; } ComponentFactory;
@@ -45,6 +46,11 @@ static inline ComponentFactory *impl_from_IWICComponentFactory(IWICComponentFact return CONTAINING_RECORD(iface, ComponentFactory, IWICComponentFactory_iface); }
+static inline ComponentFactory *impl_from_IWICImagingFactory2(IWICImagingFactory2 *iface) +{ + return CONTAINING_RECORD(iface, ComponentFactory, IWICImagingFactory2_iface); +} + static HRESULT WINAPI ComponentFactory_QueryInterface(IWICComponentFactory *iface, REFIID iid, void **ppv) { @@ -59,6 +65,10 @@ static HRESULT WINAPI ComponentFactory_QueryInterface(IWICComponentFactory *ifac { *ppv = &This->IWICComponentFactory_iface; } + else if (IsEqualIID(&IID_IWICImagingFactory2, iid)) + { + *ppv = &This->IWICImagingFactory2_iface; + } else { *ppv = NULL; @@ -1181,6 +1191,234 @@ static const IWICComponentFactoryVtbl ComponentFactory_Vtbl = { ComponentFactory_CreateEncoderPropertyBag };
+static HRESULT WINAPI ImagingFactory_QueryInterface(IWICImagingFactory2 *iface, REFIID iid, void **ppv) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_QueryInterface(&This->IWICComponentFactory_iface, iid, ppv); +} + +static ULONG WINAPI ImagingFactory_AddRef(IWICImagingFactory2 *iface) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_AddRef(&This->IWICComponentFactory_iface); +} + +static ULONG WINAPI ImagingFactory_Release(IWICImagingFactory2 *iface) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_Release(&This->IWICComponentFactory_iface); +} + +static HRESULT WINAPI ImagingFactory_CreateDecoderFromFilename(IWICImagingFactory2 *iface, LPCWSTR filename, + const GUID *vendor, DWORD desired_access, WICDecodeOptions options, IWICBitmapDecoder **decoder) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateDecoderFromFilename(&This->IWICComponentFactory_iface, filename, vendor, + desired_access, options, decoder); +} + +static HRESULT WINAPI ImagingFactory_CreateDecoderFromStream(IWICImagingFactory2 *iface, IStream *stream, + const GUID *vendor, WICDecodeOptions options, IWICBitmapDecoder **decoder) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateDecoderFromStream(&This->IWICComponentFactory_iface, stream, vendor, + options, decoder); +} + +static HRESULT WINAPI ImagingFactory_CreateDecoderFromFileHandle(IWICImagingFactory2 *iface, ULONG_PTR hFile, + const GUID *vendor, WICDecodeOptions options, IWICBitmapDecoder **decoder) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateDecoderFromFileHandle(&This->IWICComponentFactory_iface, hFile, vendor, + options, decoder); +} + +static HRESULT WINAPI ImagingFactory_CreateComponentInfo(IWICImagingFactory2 *iface, REFCLSID component, + IWICComponentInfo **info) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateComponentInfo(&This->IWICComponentFactory_iface, component, info); +} + +static HRESULT WINAPI ImagingFactory_CreateDecoder(IWICImagingFactory2 *iface, REFGUID format, const GUID *vendor, + IWICBitmapDecoder **decoder) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateDecoder(&This->IWICComponentFactory_iface, format, vendor, decoder); +} + +static HRESULT WINAPI ImagingFactory_CreateEncoder(IWICImagingFactory2 *iface, REFGUID format, const GUID *vendor, + IWICBitmapEncoder **encoder) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateEncoder(&This->IWICComponentFactory_iface, format, vendor, encoder); +} + +static HRESULT WINAPI ImagingFactory_CreatePalette(IWICImagingFactory2 *iface, IWICPalette **palette) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreatePalette(&This->IWICComponentFactory_iface, palette); +} + +static HRESULT WINAPI ImagingFactory_CreateFormatConverter(IWICImagingFactory2 *iface, IWICFormatConverter **converter) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateFormatConverter(&This->IWICComponentFactory_iface, converter); +} + +static HRESULT WINAPI ImagingFactory_CreateBitmapScaler(IWICImagingFactory2 *iface, IWICBitmapScaler **scaler) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateBitmapScaler(&This->IWICComponentFactory_iface, scaler); +} + +static HRESULT WINAPI ImagingFactory_CreateBitmapClipper(IWICImagingFactory2 *iface, IWICBitmapClipper **clipper) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateBitmapClipper(&This->IWICComponentFactory_iface, clipper); +} + +static HRESULT WINAPI ImagingFactory_CreateBitmapFlipRotator(IWICImagingFactory2 *iface, IWICBitmapFlipRotator **fliprotator) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateBitmapFlipRotator(&This->IWICComponentFactory_iface, fliprotator); +} + +static HRESULT WINAPI ImagingFactory_CreateStream(IWICImagingFactory2 *iface, IWICStream **stream) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateStream(&This->IWICComponentFactory_iface, stream); +} + +static HRESULT WINAPI ImagingFactory_CreateColorContext(IWICImagingFactory2 *iface, IWICColorContext **context) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateColorContext(&This->IWICComponentFactory_iface, context); +} + +static HRESULT WINAPI ImagingFactory_CreateColorTransformer(IWICImagingFactory2 *iface, IWICColorTransform **transformer) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateColorTransformer(&This->IWICComponentFactory_iface, transformer); +} + +static HRESULT WINAPI ImagingFactory_CreateBitmap(IWICImagingFactory2 *iface, UINT width, UINT height, REFWICPixelFormatGUID pixel_format, + WICBitmapCreateCacheOption option, IWICBitmap **bitmap) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateBitmap(&This->IWICComponentFactory_iface, width, height, pixel_format, option, bitmap); +} + +static HRESULT WINAPI ImagingFactory_CreateBitmapFromSource(IWICImagingFactory2 *iface, IWICBitmapSource *source, + WICBitmapCreateCacheOption option, IWICBitmap **bitmap) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateBitmapFromSource(&This->IWICComponentFactory_iface, source, option, bitmap); +} + +static HRESULT WINAPI ImagingFactory_CreateBitmapFromSourceRect(IWICImagingFactory2 *iface, IWICBitmapSource *source, + UINT x, UINT y, UINT width, UINT height, IWICBitmap **bitmap) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateBitmapFromSourceRect(&This->IWICComponentFactory_iface, source, x, y, width, height, bitmap); +} + +static HRESULT WINAPI ImagingFactory_CreateBitmapFromMemory(IWICImagingFactory2 *iface, UINT width, UINT height, + REFWICPixelFormatGUID format, UINT stride, UINT size, BYTE *buffer, IWICBitmap **bitmap) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateBitmapFromMemory(&This->IWICComponentFactory_iface, width, height, format, stride, + size, buffer, bitmap); +} + +static HRESULT WINAPI ImagingFactory_CreateBitmapFromHBITMAP(IWICImagingFactory2 *iface, HBITMAP hbm, HPALETTE hpal, + WICBitmapAlphaChannelOption option, IWICBitmap **bitmap) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateBitmapFromHBITMAP(&This->IWICComponentFactory_iface, hbm, hpal, option, bitmap); +} + +static HRESULT WINAPI ImagingFactory_CreateBitmapFromHICON(IWICImagingFactory2 *iface, HICON hicon, IWICBitmap **bitmap) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateBitmapFromHICON(&This->IWICComponentFactory_iface, hicon, bitmap); +} + +static HRESULT WINAPI ImagingFactory_CreateComponentEnumerator(IWICImagingFactory2 *iface, DWORD component_types, + DWORD options, IEnumUnknown **enumerator) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateComponentEnumerator(&This->IWICComponentFactory_iface, component_types, + options, enumerator); +} + +static HRESULT WINAPI ImagingFactory_CreateFastMetadataEncoderFromDecoder(IWICImagingFactory2 *iface, IWICBitmapDecoder *decoder, + IWICFastMetadataEncoder **encoder) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateFastMetadataEncoderFromDecoder(&This->IWICComponentFactory_iface, decoder, encoder); +} + +static HRESULT WINAPI ImagingFactory_CreateFastMetadataEncoderFromFrameDecode(IWICImagingFactory2 *iface, + IWICBitmapFrameDecode *frame_decode, IWICFastMetadataEncoder **encoder) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateFastMetadataEncoderFromFrameDecode(&This->IWICComponentFactory_iface, frame_decode, encoder); +} + +static HRESULT WINAPI ImagingFactory_CreateQueryWriter(IWICImagingFactory2 *iface, REFGUID format, const GUID *vendor, + IWICMetadataQueryWriter **writer) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateQueryWriter(&This->IWICComponentFactory_iface, format, vendor, writer); +} + +static HRESULT WINAPI ImagingFactory_CreateQueryWriterFromReader(IWICImagingFactory2 *iface, IWICMetadataQueryReader *reader, + const GUID *vendor, IWICMetadataQueryWriter **writer) +{ + ComponentFactory *This = impl_from_IWICImagingFactory2(iface); + return IWICComponentFactory_CreateQueryWriterFromReader(&This->IWICComponentFactory_iface, reader, vendor, writer); +} + +static HRESULT WINAPI ImagingFactory_CreateImageEncoder(IWICImagingFactory2 *iface, ID2D1Device *device, IWICImageEncoder **encoder) +{ + FIXME("%p,%p,%p stub.\n", iface, device, encoder); + + return E_NOTIMPL; +} + +static const IWICImagingFactory2Vtbl ImagingFactory_Vtbl = { + ImagingFactory_QueryInterface, + ImagingFactory_AddRef, + ImagingFactory_Release, + ImagingFactory_CreateDecoderFromFilename, + ImagingFactory_CreateDecoderFromStream, + ImagingFactory_CreateDecoderFromFileHandle, + ImagingFactory_CreateComponentInfo, + ImagingFactory_CreateDecoder, + ImagingFactory_CreateEncoder, + ImagingFactory_CreatePalette, + ImagingFactory_CreateFormatConverter, + ImagingFactory_CreateBitmapScaler, + ImagingFactory_CreateBitmapClipper, + ImagingFactory_CreateBitmapFlipRotator, + ImagingFactory_CreateStream, + ImagingFactory_CreateColorContext, + ImagingFactory_CreateColorTransformer, + ImagingFactory_CreateBitmap, + ImagingFactory_CreateBitmapFromSource, + ImagingFactory_CreateBitmapFromSourceRect, + ImagingFactory_CreateBitmapFromMemory, + ImagingFactory_CreateBitmapFromHBITMAP, + ImagingFactory_CreateBitmapFromHICON, + ImagingFactory_CreateComponentEnumerator, + ImagingFactory_CreateFastMetadataEncoderFromDecoder, + ImagingFactory_CreateFastMetadataEncoderFromFrameDecode, + ImagingFactory_CreateQueryWriter, + ImagingFactory_CreateQueryWriterFromReader, + ImagingFactory_CreateImageEncoder, +}; + HRESULT ComponentFactory_CreateInstance(REFIID iid, void** ppv) { ComponentFactory *This; @@ -1194,6 +1432,7 @@ HRESULT ComponentFactory_CreateInstance(REFIID iid, void** ppv) if (!This) return E_OUTOFMEMORY;
This->IWICComponentFactory_iface.lpVtbl = &ComponentFactory_Vtbl; + This->IWICImagingFactory2_iface.lpVtbl = &ImagingFactory_Vtbl; This->ref = 1;
ret = IWICComponentFactory_QueryInterface(&This->IWICComponentFactory_iface, iid, ppv); diff --git a/dlls/windowscodecs/tests/info.c b/dlls/windowscodecs/tests/info.c index b647601495..ee95784166 100644 --- a/dlls/windowscodecs/tests/info.c +++ b/dlls/windowscodecs/tests/info.c @@ -637,6 +637,38 @@ todo_wine IWICImagingFactory_Release(factory); }
+static void test_imagingfactory_interfaces(void) +{ + IWICComponentFactory *component_factory; + IWICImagingFactory2 *factory2; + IWICImagingFactory *factory; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICImagingFactory2, (void **)&factory2); + if (FAILED(hr)) + { + win_skip("IWICImagingFactory2 is not supported.\n"); + return; + } + + hr = IWICImagingFactory2_QueryInterface(factory2, &IID_IWICComponentFactory, (void **)&component_factory); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IWICComponentFactory_QueryInterface(component_factory, &IID_IWICImagingFactory, (void **)&factory); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(factory == (IWICImagingFactory *)component_factory, "Unexpected factory pointer.\n"); + IWICImagingFactory_Release(factory); + + hr = IWICImagingFactory2_QueryInterface(factory2, &IID_IWICImagingFactory, (void **)&factory); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(factory == (IWICImagingFactory *)component_factory, "Unexpected factory pointer.\n"); + + IWICComponentFactory_Release(component_factory); + IWICImagingFactory2_Release(factory2); + IWICImagingFactory_Release(factory); +} + START_TEST(info) { CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); @@ -644,6 +676,7 @@ START_TEST(info) test_decoder_info(); test_reader_info(); test_pixelformat_info(); + test_imagingfactory_interfaces();
CoUninitialize(); }
Nikolay Sivov nsivov@codeweavers.com wrote:
static const classinfo wic_classes[] = { {&CLSID_WICImagingFactory, ComponentFactory_CreateInstance},
- {&CLSID_WICImagingFactory2, ComponentFactory_CreateInstance}, {&CLSID_WICBmpDecoder, BmpDecoder_CreateInstance}, {&CLSID_WICPngDecoder, PngDecoder_CreateInstance}, {&CLSID_WICPngEncoder, PngEncoder_CreateInstance},
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index 06e3f6aceb..f23c824473 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -37,6 +37,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
typedef struct { IWICComponentFactory IWICComponentFactory_iface;
- IWICImagingFactory2 IWICImagingFactory2_iface; LONG ref;
} ComponentFactory;
IWICImagingFactory2 just extends IWICImagingFactory by one element, this approach seems to be a bit strange.
On 09/30/2018 07:14 AM, Dmitry Timoshkov wrote:
Nikolay Sivov nsivov@codeweavers.com wrote:
static const classinfo wic_classes[] = { {&CLSID_WICImagingFactory, ComponentFactory_CreateInstance},
- {&CLSID_WICImagingFactory2, ComponentFactory_CreateInstance}, {&CLSID_WICBmpDecoder, BmpDecoder_CreateInstance}, {&CLSID_WICPngDecoder, PngDecoder_CreateInstance}, {&CLSID_WICPngEncoder, PngEncoder_CreateInstance},
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index 06e3f6aceb..f23c824473 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -37,6 +37,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
typedef struct { IWICComponentFactory IWICComponentFactory_iface;
- IWICImagingFactory2 IWICImagingFactory2_iface; LONG ref; } ComponentFactory;
IWICImagingFactory2 just extends IWICImagingFactory by one element, this approach seems to be a bit strange.
Both IWICComponentFactory andIWICImagingFactory2extend IWICImagingFactory.
Nikolay Sivov nsivov@codeweavers.com wrote:
static const classinfo wic_classes[] = { {&CLSID_WICImagingFactory, ComponentFactory_CreateInstance},
- {&CLSID_WICImagingFactory2, ComponentFactory_CreateInstance}, {&CLSID_WICBmpDecoder, BmpDecoder_CreateInstance}, {&CLSID_WICPngDecoder, PngDecoder_CreateInstance}, {&CLSID_WICPngEncoder, PngEncoder_CreateInstance},
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index 06e3f6aceb..f23c824473 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -37,6 +37,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
typedef struct { IWICComponentFactory IWICComponentFactory_iface;
- IWICImagingFactory2 IWICImagingFactory2_iface; LONG ref; } ComponentFactory;
IWICImagingFactory2 just extends IWICImagingFactory by one element, this approach seems to be a bit strange.
Both IWICComponentFactory andIWICImagingFactory2extend IWICImagingFactory.
If you mean that you have to choose which one should use IWICImagingFactory as a base class then an obvious choice would be IWICImagingFactory2. If you ment something else please try to be less cryptic in your responses.
On 09/30/2018 08:59 AM, Dmitry Timoshkov wrote:
Nikolay Sivov nsivov@codeweavers.com wrote:
static const classinfo wic_classes[] = { {&CLSID_WICImagingFactory, ComponentFactory_CreateInstance},
- {&CLSID_WICImagingFactory2, ComponentFactory_CreateInstance}, {&CLSID_WICBmpDecoder, BmpDecoder_CreateInstance}, {&CLSID_WICPngDecoder, PngDecoder_CreateInstance}, {&CLSID_WICPngEncoder, PngEncoder_CreateInstance},
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index 06e3f6aceb..f23c824473 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -37,6 +37,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
typedef struct { IWICComponentFactory IWICComponentFactory_iface;
- IWICImagingFactory2 IWICImagingFactory2_iface; LONG ref; } ComponentFactory;
IWICImagingFactory2 just extends IWICImagingFactory by one element, this approach seems to be a bit strange.
Both IWICComponentFactory andIWICImagingFactory2extend IWICImagingFactory.
If you mean that you have to choose which one should use IWICImagingFactory as a base class then an obvious choice would be IWICImagingFactory2. If you ment something else please try to be less cryptic in your responses.
If you mean it's better to move existing IWICImagingFactory methods implementation to newly added IWICImagingFactory2, I don't think it's obvious or necessary. It will lead to larger diff without any functional impact. Structure was unfortunately renamed from ImagingFactory, but well what's done is done.
Nikolay Sivov nsivov@codeweavers.com wrote:
typedef struct { IWICComponentFactory IWICComponentFactory_iface;
- IWICImagingFactory2 IWICImagingFactory2_iface; LONG ref; } ComponentFactory;
IWICImagingFactory2 just extends IWICImagingFactory by one element, this approach seems to be a bit strange.
Both IWICComponentFactory andIWICImagingFactory2extend IWICImagingFactory.
If you mean that you have to choose which one should use IWICImagingFactory as a base class then an obvious choice would be IWICImagingFactory2. If you ment something else please try to be less cryptic in your responses.
If you mean it's better to move existing IWICImagingFactory methods implementation to newly added IWICImagingFactory2, I don't think it's obvious or necessary. It will lead to larger diff without any functional impact. Structure was unfortunately renamed from ImagingFactory, but well what's done is done.
Yes, that's a little bit unfortunate, but IMO it's a good opportunity to fix it now while moving to a newer version of the interface instead of keeping this mess forever.