2 * Copyright 2009 Vincent Povirk for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "wincodecsdk.h"
33 #include "wincodecs_private.h"
35 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(wincodecs
);
40 IWICComponentFactory IWICComponentFactory_iface
;
44 static inline ComponentFactory
*impl_from_IWICComponentFactory(IWICComponentFactory
*iface
)
46 return CONTAINING_RECORD(iface
, ComponentFactory
, IWICComponentFactory_iface
);
49 static HRESULT WINAPI
ComponentFactory_QueryInterface(IWICComponentFactory
*iface
, REFIID iid
,
52 ComponentFactory
*This
= impl_from_IWICComponentFactory(iface
);
53 TRACE("(%p,%s,%p)\n", iface
, debugstr_guid(iid
), ppv
);
55 if (!ppv
) return E_INVALIDARG
;
57 if (IsEqualIID(&IID_IUnknown
, iid
) ||
58 IsEqualIID(&IID_IWICImagingFactory
, iid
) ||
59 IsEqualIID(&IID_IWICComponentFactory
, iid
))
69 IUnknown_AddRef((IUnknown
*)*ppv
);
73 static ULONG WINAPI
ComponentFactory_AddRef(IWICComponentFactory
*iface
)
75 ComponentFactory
*This
= impl_from_IWICComponentFactory(iface
);
76 ULONG ref
= InterlockedIncrement(&This
->ref
);
78 TRACE("(%p) refcount=%u\n", iface
, ref
);
83 static ULONG WINAPI
ComponentFactory_Release(IWICComponentFactory
*iface
)
85 ComponentFactory
*This
= impl_from_IWICComponentFactory(iface
);
86 ULONG ref
= InterlockedDecrement(&This
->ref
);
88 TRACE("(%p) refcount=%u\n", iface
, ref
);
91 HeapFree(GetProcessHeap(), 0, This
);
96 static HRESULT WINAPI
ComponentFactory_CreateDecoderFromFilename(
97 IWICComponentFactory
*iface
, LPCWSTR wzFilename
, const GUID
*pguidVendor
,
98 DWORD dwDesiredAccess
, WICDecodeOptions metadataOptions
,
99 IWICBitmapDecoder
**ppIDecoder
)
104 TRACE("(%p,%s,%s,%u,%u,%p)\n", iface
, debugstr_w(wzFilename
),
105 debugstr_guid(pguidVendor
), dwDesiredAccess
, metadataOptions
, ppIDecoder
);
107 hr
= StreamImpl_Create(&stream
);
110 hr
= IWICStream_InitializeFromFilename(stream
, wzFilename
, dwDesiredAccess
);
114 hr
= IWICComponentFactory_CreateDecoderFromStream(iface
, (IStream
*)stream
,
115 pguidVendor
, metadataOptions
, ppIDecoder
);
118 IWICStream_Release(stream
);
124 static HRESULT WINAPI
ComponentFactory_CreateDecoderFromStream(
125 IWICComponentFactory
*iface
, IStream
*pIStream
, const GUID
*pguidVendor
,
126 WICDecodeOptions metadataOptions
, IWICBitmapDecoder
**ppIDecoder
)
128 IEnumUnknown
*enumdecoders
;
129 IUnknown
*unkdecoderinfo
;
130 IWICBitmapDecoderInfo
*decoderinfo
;
131 IWICBitmapDecoder
*decoder
= NULL
, *preferred_decoder
= NULL
;
137 TRACE("(%p,%p,%s,%u,%p)\n", iface
, pIStream
, debugstr_guid(pguidVendor
),
138 metadataOptions
, ppIDecoder
);
140 res
= CreateComponentEnumerator(WICDecoder
, WICComponentEnumerateDefault
, &enumdecoders
);
141 if (FAILED(res
)) return res
;
143 while (!preferred_decoder
)
145 res
= IEnumUnknown_Next(enumdecoders
, 1, &unkdecoderinfo
, &num_fetched
);
149 res
= IUnknown_QueryInterface(unkdecoderinfo
, &IID_IWICBitmapDecoderInfo
, (void**)&decoderinfo
);
153 res
= IWICBitmapDecoderInfo_MatchesPattern(decoderinfo
, pIStream
, &matches
);
155 if (SUCCEEDED(res
) && matches
)
157 IWICBitmapDecoder
*new_decoder
;
159 res
= IWICBitmapDecoderInfo_CreateInstance(decoderinfo
, &new_decoder
);
161 /* FIXME: should use QueryCapability to choose a decoder */
165 res
= IWICBitmapDecoder_Initialize(new_decoder
, pIStream
, metadataOptions
);
171 res
= IWICBitmapDecoderInfo_GetVendorGUID(decoderinfo
, &vendor
);
172 if (SUCCEEDED(res
) && IsEqualIID(&vendor
, pguidVendor
))
174 preferred_decoder
= new_decoder
;
179 if (new_decoder
&& !decoder
)
181 decoder
= new_decoder
;
186 if (new_decoder
) IWICBitmapDecoder_Release(new_decoder
);
190 IWICBitmapDecoderInfo_Release(decoderinfo
);
193 IUnknown_Release(unkdecoderinfo
);
199 IEnumUnknown_Release(enumdecoders
);
201 if (preferred_decoder
)
203 *ppIDecoder
= preferred_decoder
;
204 if (decoder
) IWICBitmapDecoder_Release(decoder
);
210 *ppIDecoder
= decoder
;
215 if (WARN_ON(wincodecs
))
221 WARN("failed to load from a stream\n");
224 res
= IStream_Seek(pIStream
, seek
, STREAM_SEEK_SET
, NULL
);
226 res
= IStream_Read(pIStream
, data
, 4, &bytesread
);
228 WARN("first %i bytes of stream=%x %x %x %x\n", bytesread
, data
[0], data
[1], data
[2], data
[3]);
231 return WINCODEC_ERR_COMPONENTNOTFOUND
;
235 static HRESULT WINAPI
ComponentFactory_CreateDecoderFromFileHandle(
236 IWICComponentFactory
*iface
, ULONG_PTR hFile
, const GUID
*pguidVendor
,
237 WICDecodeOptions metadataOptions
, IWICBitmapDecoder
**ppIDecoder
)
239 FIXME("(%p,%lx,%s,%u,%p): stub\n", iface
, hFile
, debugstr_guid(pguidVendor
),
240 metadataOptions
, ppIDecoder
);
244 static HRESULT WINAPI
ComponentFactory_CreateComponentInfo(IWICComponentFactory
*iface
,
245 REFCLSID clsidComponent
, IWICComponentInfo
**ppIInfo
)
247 TRACE("(%p,%s,%p)\n", iface
, debugstr_guid(clsidComponent
), ppIInfo
);
248 return CreateComponentInfo(clsidComponent
, ppIInfo
);
251 static HRESULT WINAPI
ComponentFactory_CreateDecoder(IWICComponentFactory
*iface
,
252 REFGUID guidContainerFormat
, const GUID
*pguidVendor
,
253 IWICBitmapDecoder
**ppIDecoder
)
255 FIXME("(%p,%s,%s,%p): stub\n", iface
, debugstr_guid(guidContainerFormat
),
256 debugstr_guid(pguidVendor
), ppIDecoder
);
260 static HRESULT WINAPI
ComponentFactory_CreateEncoder(IWICComponentFactory
*iface
,
261 REFGUID guidContainerFormat
, const GUID
*pguidVendor
,
262 IWICBitmapEncoder
**ppIEncoder
)
264 FIXME("(%p,%s,%s,%p): stub\n", iface
, debugstr_guid(guidContainerFormat
),
265 debugstr_guid(pguidVendor
), ppIEncoder
);
269 static HRESULT WINAPI
ComponentFactory_CreatePalette(IWICComponentFactory
*iface
,
270 IWICPalette
**ppIPalette
)
272 TRACE("(%p,%p)\n", iface
, ppIPalette
);
273 return PaletteImpl_Create(ppIPalette
);
276 static HRESULT WINAPI
ComponentFactory_CreateFormatConverter(IWICComponentFactory
*iface
,
277 IWICFormatConverter
**ppIFormatConverter
)
279 return FormatConverter_CreateInstance(NULL
, &IID_IWICFormatConverter
, (void**)ppIFormatConverter
);
282 static HRESULT WINAPI
ComponentFactory_CreateBitmapScaler(IWICComponentFactory
*iface
,
283 IWICBitmapScaler
**ppIBitmapScaler
)
285 FIXME("(%p,%p): stub\n", iface
, ppIBitmapScaler
);
289 static HRESULT WINAPI
ComponentFactory_CreateBitmapClipper(IWICComponentFactory
*iface
,
290 IWICBitmapClipper
**ppIBitmapClipper
)
292 FIXME("(%p,%p): stub\n", iface
, ppIBitmapClipper
);
296 static HRESULT WINAPI
ComponentFactory_CreateBitmapFlipRotator(IWICComponentFactory
*iface
,
297 IWICBitmapFlipRotator
**ppIBitmapFlipRotator
)
299 TRACE("(%p,%p)\n", iface
, ppIBitmapFlipRotator
);
300 return FlipRotator_Create(ppIBitmapFlipRotator
);
303 static HRESULT WINAPI
ComponentFactory_CreateStream(IWICComponentFactory
*iface
,
304 IWICStream
**ppIWICStream
)
306 TRACE("(%p,%p)\n", iface
, ppIWICStream
);
307 return StreamImpl_Create(ppIWICStream
);
310 static HRESULT WINAPI
ComponentFactory_CreateColorContext(IWICComponentFactory
*iface
,
311 IWICColorContext
**ppIColorContext
)
313 FIXME("(%p,%p): stub\n", iface
, ppIColorContext
);
317 static HRESULT WINAPI
ComponentFactory_CreateColorTransformer(IWICComponentFactory
*iface
,
318 IWICColorTransform
**ppIColorTransform
)
320 FIXME("(%p,%p): stub\n", iface
, ppIColorTransform
);
324 static HRESULT WINAPI
ComponentFactory_CreateBitmap(IWICComponentFactory
*iface
,
325 UINT uiWidth
, UINT uiHeight
, REFWICPixelFormatGUID pixelFormat
,
326 WICBitmapCreateCacheOption option
, IWICBitmap
**ppIBitmap
)
328 FIXME("(%p,%u,%u,%s,%u,%p): stub\n", iface
, uiWidth
, uiHeight
,
329 debugstr_guid(pixelFormat
), option
, ppIBitmap
);
333 static HRESULT WINAPI
ComponentFactory_CreateBitmapFromSource(IWICComponentFactory
*iface
,
334 IWICBitmapSource
*piBitmapSource
, WICBitmapCreateCacheOption option
,
335 IWICBitmap
**ppIBitmap
)
337 FIXME("(%p,%p,%u,%p): stub\n", iface
, piBitmapSource
, option
, ppIBitmap
);
341 static HRESULT WINAPI
ComponentFactory_CreateBitmapFromSourceRect(IWICComponentFactory
*iface
,
342 IWICBitmapSource
*piBitmapSource
, UINT x
, UINT y
, UINT width
, UINT height
,
343 IWICBitmap
**ppIBitmap
)
345 FIXME("(%p,%p,%u,%u,%u,%u,%p): stub\n", iface
, piBitmapSource
, x
, y
, width
,
350 static HRESULT WINAPI
ComponentFactory_CreateBitmapFromMemory(IWICComponentFactory
*iface
,
351 UINT uiWidth
, UINT uiHeight
, REFWICPixelFormatGUID pixelFormat
, UINT cbStride
,
352 UINT cbBufferSize
, BYTE
*pbBuffer
, IWICBitmap
**ppIBitmap
)
354 FIXME("(%p,%u,%u,%s,%u,%u,%p,%p): stub\n", iface
, uiWidth
, uiHeight
,
355 debugstr_guid(pixelFormat
), cbStride
, cbBufferSize
, pbBuffer
, ppIBitmap
);
359 static HRESULT WINAPI
ComponentFactory_CreateBitmapFromHBITMAP(IWICComponentFactory
*iface
,
360 HBITMAP hBitmap
, HPALETTE hPalette
, WICBitmapAlphaChannelOption options
,
361 IWICBitmap
**ppIBitmap
)
363 FIXME("(%p,%p,%p,%u,%p): stub\n", iface
, hBitmap
, hPalette
, options
, ppIBitmap
);
367 static HRESULT WINAPI
ComponentFactory_CreateBitmapFromHICON(IWICComponentFactory
*iface
,
368 HICON hIcon
, IWICBitmap
**ppIBitmap
)
370 FIXME("(%p,%p,%p): stub\n", iface
, hIcon
, ppIBitmap
);
374 static HRESULT WINAPI
ComponentFactory_CreateComponentEnumerator(IWICComponentFactory
*iface
,
375 DWORD componentTypes
, DWORD options
, IEnumUnknown
**ppIEnumUnknown
)
377 TRACE("(%p,%u,%u,%p)\n", iface
, componentTypes
, options
, ppIEnumUnknown
);
378 return CreateComponentEnumerator(componentTypes
, options
, ppIEnumUnknown
);
381 static HRESULT WINAPI
ComponentFactory_CreateFastMetadataEncoderFromDecoder(
382 IWICComponentFactory
*iface
, IWICBitmapDecoder
*pIDecoder
,
383 IWICFastMetadataEncoder
**ppIFastEncoder
)
385 FIXME("(%p,%p,%p): stub\n", iface
, pIDecoder
, ppIFastEncoder
);
389 static HRESULT WINAPI
ComponentFactory_CreateFastMetadataEncoderFromFrameDecode(
390 IWICComponentFactory
*iface
, IWICBitmapFrameDecode
*pIFrameDecoder
,
391 IWICFastMetadataEncoder
**ppIFastEncoder
)
393 FIXME("(%p,%p,%p): stub\n", iface
, pIFrameDecoder
, ppIFastEncoder
);
397 static HRESULT WINAPI
ComponentFactory_CreateQueryWriter(IWICComponentFactory
*iface
,
398 REFGUID guidMetadataFormat
, const GUID
*pguidVendor
,
399 IWICMetadataQueryWriter
**ppIQueryWriter
)
401 FIXME("(%p,%s,%s,%p): stub\n", iface
, debugstr_guid(guidMetadataFormat
),
402 debugstr_guid(pguidVendor
), ppIQueryWriter
);
406 static HRESULT WINAPI
ComponentFactory_CreateQueryWriterFromReader(IWICComponentFactory
*iface
,
407 IWICMetadataQueryReader
*pIQueryReader
, const GUID
*pguidVendor
,
408 IWICMetadataQueryWriter
**ppIQueryWriter
)
410 FIXME("(%p,%p,%s,%p): stub\n", iface
, pIQueryReader
, debugstr_guid(pguidVendor
),
415 static HRESULT WINAPI
ComponentFactory_CreateMetadataReader(IWICComponentFactory
*iface
,
416 REFGUID format
, const GUID
*vendor
, DWORD options
, IStream
*stream
, IWICMetadataReader
**reader
)
418 FIXME("%p,%s,%s,%x,%p,%p: stub\n", iface
, debugstr_guid(format
), debugstr_guid(vendor
),
419 options
, stream
, reader
);
423 static HRESULT WINAPI
ComponentFactory_CreateMetadataReaderFromContainer(IWICComponentFactory
*iface
,
424 REFGUID format
, const GUID
*vendor
, DWORD options
, IStream
*stream
, IWICMetadataReader
**reader
)
426 FIXME("%p,%s,%s,%x,%p,%p: stub\n", iface
, debugstr_guid(format
), debugstr_guid(vendor
),
427 options
, stream
, reader
);
431 static HRESULT WINAPI
ComponentFactory_CreateMetadataWriter(IWICComponentFactory
*iface
,
432 REFGUID format
, const GUID
*vendor
, DWORD options
, IWICMetadataWriter
**writer
)
434 FIXME("%p,%s,%s,%x,%p: stub\n", iface
, debugstr_guid(format
), debugstr_guid(vendor
), options
, writer
);
438 static HRESULT WINAPI
ComponentFactory_CreateMetadataWriterFromReader(IWICComponentFactory
*iface
,
439 IWICMetadataReader
*reader
, const GUID
*vendor
, IWICMetadataWriter
**writer
)
441 FIXME("%p,%p,%s,%p: stub\n", iface
, reader
, debugstr_guid(vendor
), writer
);
445 static HRESULT WINAPI
ComponentFactory_CreateQueryReaderFromBlockReader(IWICComponentFactory
*iface
,
446 IWICMetadataBlockReader
*block_reader
, IWICMetadataQueryReader
**query_reader
)
448 FIXME("%p,%p,%p: stub\n", iface
, block_reader
, query_reader
);
452 static HRESULT WINAPI
ComponentFactory_CreateQueryWriterFromBlockWriter(IWICComponentFactory
*iface
,
453 IWICMetadataBlockWriter
*block_writer
, IWICMetadataQueryWriter
**query_writer
)
455 FIXME("%p,%p,%p: stub\n", iface
, block_writer
, query_writer
);
459 static HRESULT WINAPI
ComponentFactory_CreateEncoderPropertyBag(IWICComponentFactory
*iface
,
460 PROPBAG2
*options
, UINT count
, IPropertyBag2
**property
)
462 FIXME("%p,%p,%u,%p: stub\n", iface
, options
, count
, property
);
466 static const IWICComponentFactoryVtbl ComponentFactory_Vtbl
= {
467 ComponentFactory_QueryInterface
,
468 ComponentFactory_AddRef
,
469 ComponentFactory_Release
,
470 ComponentFactory_CreateDecoderFromFilename
,
471 ComponentFactory_CreateDecoderFromStream
,
472 ComponentFactory_CreateDecoderFromFileHandle
,
473 ComponentFactory_CreateComponentInfo
,
474 ComponentFactory_CreateDecoder
,
475 ComponentFactory_CreateEncoder
,
476 ComponentFactory_CreatePalette
,
477 ComponentFactory_CreateFormatConverter
,
478 ComponentFactory_CreateBitmapScaler
,
479 ComponentFactory_CreateBitmapClipper
,
480 ComponentFactory_CreateBitmapFlipRotator
,
481 ComponentFactory_CreateStream
,
482 ComponentFactory_CreateColorContext
,
483 ComponentFactory_CreateColorTransformer
,
484 ComponentFactory_CreateBitmap
,
485 ComponentFactory_CreateBitmapFromSource
,
486 ComponentFactory_CreateBitmapFromSourceRect
,
487 ComponentFactory_CreateBitmapFromMemory
,
488 ComponentFactory_CreateBitmapFromHBITMAP
,
489 ComponentFactory_CreateBitmapFromHICON
,
490 ComponentFactory_CreateComponentEnumerator
,
491 ComponentFactory_CreateFastMetadataEncoderFromDecoder
,
492 ComponentFactory_CreateFastMetadataEncoderFromFrameDecode
,
493 ComponentFactory_CreateQueryWriter
,
494 ComponentFactory_CreateQueryWriterFromReader
,
495 ComponentFactory_CreateMetadataReader
,
496 ComponentFactory_CreateMetadataReaderFromContainer
,
497 ComponentFactory_CreateMetadataWriter
,
498 ComponentFactory_CreateMetadataWriterFromReader
,
499 ComponentFactory_CreateQueryReaderFromBlockReader
,
500 ComponentFactory_CreateQueryWriterFromBlockWriter
,
501 ComponentFactory_CreateEncoderPropertyBag
504 HRESULT
ComponentFactory_CreateInstance(IUnknown
*pUnkOuter
, REFIID iid
, void** ppv
)
506 ComponentFactory
*This
;
509 TRACE("(%p,%s,%p)\n", pUnkOuter
, debugstr_guid(iid
), ppv
);
513 if (pUnkOuter
) return CLASS_E_NOAGGREGATION
;
515 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(ComponentFactory
));
516 if (!This
) return E_OUTOFMEMORY
;
518 This
->IWICComponentFactory_iface
.lpVtbl
= &ComponentFactory_Vtbl
;
521 ret
= IUnknown_QueryInterface((IUnknown
*)This
, iid
, ppv
);
522 IUnknown_Release((IUnknown
*)This
);