ReactOS 0.4.16-dev-852-gcfcc8d8
decoder.c
Go to the documentation of this file.
1/*
2 * Copyright 2020 Esme Povirk
3 *
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.
8 *
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.
13 *
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
17 */
18
19#include <stdarg.h>
20
21#define COBJMACROS
22
23#include "windef.h"
24#include "winbase.h"
25#include "objbase.h"
26
27#include "wincodecs_private.h"
28
29#include "wine/debug.h"
30
32
33typedef struct {
36 CRITICAL_SECTION lock; /* must be held when stream or decoder is accessed */
43
45{
46 return CONTAINING_RECORD(iface, CommonDecoder, IWICBitmapDecoder_iface);
47}
48
50 void **ppv)
51{
53 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
54
55 if (!ppv) return E_INVALIDARG;
56
57 if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapDecoder, iid))
58 {
59 *ppv = &This->IWICBitmapDecoder_iface;
60 }
61 else
62 {
63 *ppv = NULL;
64 return E_NOINTERFACE;
65 }
66
67 IUnknown_AddRef((IUnknown*)*ppv);
68 return S_OK;
69}
70
72{
75
76 TRACE("(%p) refcount=%lu\n", iface, ref);
77
78 return ref;
79}
80
82{
85
86 TRACE("(%p) refcount=%lu\n", iface, ref);
87
88 if (ref == 0)
89 {
90 if (This->stream)
91 IStream_Release(This->stream);
92 This->lock.DebugInfo->Spare[0] = 0;
94 decoder_destroy(This->decoder);
95 free(This);
96 }
97
98 return ref;
99}
100
102 DWORD *capability)
103{
105 HRESULT hr;
106
107 TRACE("(%p,%p,%p)\n", iface, stream, capability);
108
109 if (!stream || !capability) return E_INVALIDARG;
110
111 hr = IWICBitmapDecoder_Initialize(iface, stream, WICDecodeMetadataCacheOnDemand);
112 if (hr != S_OK) return hr;
113
114 *capability = (This->file_info.flags & DECODER_FLAGS_CAPABILITY_MASK);
115 return S_OK;
116}
117
119 WICDecodeOptions cacheOptions)
120{
123
124 TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions);
125
127
128 if (This->stream)
130
131 if (SUCCEEDED(hr))
132 hr = decoder_initialize(This->decoder, pIStream, &This->file_info);
133
134 if (SUCCEEDED(hr))
135 {
136 This->cache_options = cacheOptions;
137 This->stream = pIStream;
138 IStream_AddRef(This->stream);
139 }
140
142
143 return hr;
144}
145
147 GUID *pguidContainerFormat)
148{
150 memcpy(pguidContainerFormat, &This->decoder_info.container_format, sizeof(GUID));
151 return S_OK;
152}
153
155 IWICBitmapDecoderInfo **ppIDecoderInfo)
156{
158 TRACE("(%p,%p)\n", iface, ppIDecoderInfo);
159
160 return get_decoder_info(&This->decoder_info.clsid, ppIDecoderInfo);
161}
162
165{
166 TRACE("(%p,%p)\n", iface, palette);
168}
169
172{
173 TRACE("(%p,%p)\n", iface, reader);
174
175 if (!reader) return E_INVALIDARG;
176
177 *reader = NULL;
179}
180
182 IWICBitmapSource **ppIBitmapSource)
183{
184 TRACE("(%p,%p)\n", iface, ppIBitmapSource);
185
186 if (!ppIBitmapSource) return E_INVALIDARG;
187
188 *ppIBitmapSource = NULL;
190}
191
193 UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
194{
195 TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
197}
198
200 IWICBitmapSource **ppIThumbnail)
201{
202 TRACE("(%p,%p)\n", iface, ppIThumbnail);
203
204 if (!ppIThumbnail) return E_INVALIDARG;
205
206 *ppIThumbnail = NULL;
208}
209
211 UINT *pCount)
212{
214 if (!pCount) return E_INVALIDARG;
215
216 if (This->stream)
217 *pCount = This->file_info.frame_count;
218 else
219 *pCount = 0;
220
221 return S_OK;
222}
223
225 UINT index, IWICBitmapFrameDecode **ppIBitmapFrame);
226
227static const IWICBitmapDecoderVtbl CommonDecoder_Vtbl = {
242};
243
244typedef struct {
255
257{
258 return CONTAINING_RECORD(iface, CommonDecoderFrame, IWICBitmapFrameDecode_iface);
259}
260
262{
263 return CONTAINING_RECORD(iface, CommonDecoderFrame, IWICMetadataBlockReader_iface);
264}
265
267 void **ppv)
268{
270 if (!ppv) return E_INVALIDARG;
271
272 if (IsEqualIID(&IID_IUnknown, iid) ||
273 IsEqualIID(&IID_IWICBitmapSource, iid) ||
274 IsEqualIID(&IID_IWICBitmapFrameDecode, iid))
275 {
276 *ppv = &This->IWICBitmapFrameDecode_iface;
277 }
278 else if (IsEqualIID(&IID_IWICMetadataBlockReader, iid) &&
279 (This->parent->file_info.flags & WICBitmapDecoderCapabilityCanEnumerateMetadata))
280 {
281 *ppv = &This->IWICMetadataBlockReader_iface;
282 }
283 else
284 {
285 *ppv = NULL;
286 return E_NOINTERFACE;
287 }
288
289 IUnknown_AddRef((IUnknown*)*ppv);
290 return S_OK;
291}
292
294{
297
298 TRACE("(%p) refcount=%lu\n", iface, ref);
299
300 return ref;
301}
302
304{
307
308 TRACE("(%p) refcount=%lu\n", iface, ref);
309
310 if (ref == 0)
311 {
312 IWICBitmapDecoder_Release(&This->parent->IWICBitmapDecoder_iface);
313 free(This->metadata_blocks);
314 free(This);
315 }
316
317 return ref;
318}
319
321 UINT *puiWidth, UINT *puiHeight)
322{
324
325 TRACE("(%p,%p,%p)\n", This, puiWidth, puiHeight);
326
327 if (!puiWidth || !puiHeight)
328 return E_POINTER;
329
330 *puiWidth = This->decoder_frame.width;
331 *puiHeight = This->decoder_frame.height;
332 return S_OK;
333}
334
336 WICPixelFormatGUID *pPixelFormat)
337{
339
340 TRACE("(%p,%p)\n", This, pPixelFormat);
341
342 if (!pPixelFormat)
343 return E_POINTER;
344
345 *pPixelFormat = This->decoder_frame.pixel_format;
346 return S_OK;
347}
348
350 double *pDpiX, double *pDpiY)
351{
353
354 TRACE("(%p,%p,%p)\n", This, pDpiX, pDpiY);
355
356 if (!pDpiX || !pDpiY)
357 return E_POINTER;
358
359 *pDpiX = This->decoder_frame.dpix;
360 *pDpiY = This->decoder_frame.dpiy;
361 return S_OK;
362}
363
365 IWICPalette *pIPalette)
366{
369
370 TRACE("(%p,%p)\n", iface, pIPalette);
371
372 if (This->decoder_frame.num_colors)
373 {
374 hr = IWICPalette_InitializeCustom(pIPalette, This->decoder_frame.palette, This->decoder_frame.num_colors);
375 }
376 else
377 {
379 }
380
381 return hr;
382}
383
385 const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
386{
388 HRESULT hr;
389 UINT bytesperrow;
391
392 TRACE("(%p,%s,%u,%u,%p)\n", iface, debug_wic_rect(prc), cbStride, cbBufferSize, pbBuffer);
393
394 if (!pbBuffer)
395 return E_POINTER;
396
397 if (!prc)
398 {
399 rect.X = 0;
400 rect.Y = 0;
401 rect.Width = This->decoder_frame.width;
402 rect.Height = This->decoder_frame.height;
403 prc = &rect;
404 }
405 else
406 {
407 if (prc->X < 0 || prc->Y < 0 ||
408 prc->X+prc->Width > This->decoder_frame.width ||
409 prc->Y+prc->Height > This->decoder_frame.height)
410 return E_INVALIDARG;
411 }
412
413 bytesperrow = ((This->decoder_frame.bpp * prc->Width)+7)/8;
414
415 if (cbStride < bytesperrow)
416 return E_INVALIDARG;
417
418 if ((cbStride * (prc->Height-1)) + bytesperrow > cbBufferSize)
419 return E_INVALIDARG;
420
421 EnterCriticalSection(&This->parent->lock);
422
423 hr = decoder_copy_pixels(This->parent->decoder, This->frame,
424 prc, cbStride, cbBufferSize, pbBuffer);
425
426 LeaveCriticalSection(&This->parent->lock);
427
428 return hr;
429}
430
432 IWICMetadataQueryReader **ppIMetadataQueryReader)
433{
436 HRESULT hr;
437
438 TRACE("(%p,%p)\n", iface, ppIMetadataQueryReader);
439
440 if (!ppIMetadataQueryReader)
441 return E_INVALIDARG;
442
443 if (!(This->parent->file_info.flags & WICBitmapDecoderCapabilityCanEnumerateMetadata))
445
446 hr = create_instance(&CLSID_WICImagingFactory, &IID_IWICComponentFactory, (void**)&factory);
447
448 if (SUCCEEDED(hr))
449 {
450 hr = IWICComponentFactory_CreateQueryReaderFromBlockReader(factory, &This->IWICMetadataBlockReader_iface, ppIMetadataQueryReader);
451 IWICComponentFactory_Release(factory);
452 }
453
454 if (FAILED(hr))
455 *ppIMetadataQueryReader = NULL;
456
457 return hr;
458}
459
461 UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
462{
465 UINT i;
466 BYTE *profile;
467 DWORD profile_len;
468
469 TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
470
471 if (!pcActualCount) return E_INVALIDARG;
472
473 if (This->parent->file_info.flags & DECODER_FLAGS_UNSUPPORTED_COLOR_CONTEXT)
474 {
475 FIXME("not supported for %s\n", wine_dbgstr_guid(&This->parent->decoder_info.clsid));
476 *pcActualCount = 0;
478 }
479
480 *pcActualCount = This->decoder_frame.num_color_contexts;
481
482 if (This->decoder_frame.num_color_contexts && cCount && ppIColorContexts)
483 {
484 if (cCount >= This->decoder_frame.num_color_contexts)
485 {
486 EnterCriticalSection(&This->parent->lock);
487
488 for (i=0; i<This->decoder_frame.num_color_contexts; i++)
489 {
490 hr = decoder_get_color_context(This->parent->decoder, This->frame, i,
491 &profile, &profile_len);
492 if (SUCCEEDED(hr))
493 {
494 hr = IWICColorContext_InitializeFromMemory(ppIColorContexts[i], profile, profile_len);
495
496 free(profile);
497 }
498
499 if (FAILED(hr))
500 break;
501 }
502
503 LeaveCriticalSection(&This->parent->lock);
504 }
505 else
506 {
508 }
509 }
510
511 return hr;
512}
513
515 IWICBitmapSource **ppIThumbnail)
516{
517 TRACE("(%p,%p)\n", iface, ppIThumbnail);
518
519 if (!ppIThumbnail) return E_INVALIDARG;
520
521 *ppIThumbnail = NULL;
523}
524
525static const IWICBitmapFrameDecodeVtbl CommonDecoderFrameVtbl = {
537};
538
540 void **ppv)
541{
543 return IWICBitmapFrameDecode_QueryInterface(&This->IWICBitmapFrameDecode_iface, iid, ppv);
544}
545
547{
549 return IWICBitmapFrameDecode_AddRef(&This->IWICBitmapFrameDecode_iface);
550}
551
553{
555 return IWICBitmapFrameDecode_Release(&This->IWICBitmapFrameDecode_iface);
556}
557
559 GUID *pguidContainerFormat)
560{
562 if (!pguidContainerFormat) return E_INVALIDARG;
563 *pguidContainerFormat = This->parent->decoder_info.block_format;
564 return S_OK;
565}
566
568{
570
571 if (This->metadata_initialized)
572 return S_OK;
573
574 EnterCriticalSection(&This->parent->lock);
575
576 if (!This->metadata_initialized)
577 {
578 hr = decoder_get_metadata_blocks(This->parent->decoder, This->frame, &This->metadata_count, &This->metadata_blocks);
579 if (SUCCEEDED(hr))
580 This->metadata_initialized = TRUE;
581 }
582
583 LeaveCriticalSection(&This->parent->lock);
584
585 return hr;
586}
587
589 UINT *pcCount)
590{
592 HRESULT hr;
593
594 TRACE("%p,%p\n", iface, pcCount);
595
596 if (!pcCount) return E_INVALIDARG;
597
599 if (SUCCEEDED(hr))
600 *pcCount = This->metadata_count;
601
602 return hr;
603}
604
606 UINT nIndex, IWICMetadataReader **ppIMetadataReader)
607{
609 HRESULT hr;
612
613 TRACE("%p,%d,%p\n", iface, nIndex, ppIMetadataReader);
614
615 if (!ppIMetadataReader)
616 return E_INVALIDARG;
617
619
620 if (SUCCEEDED(hr) && nIndex >= This->metadata_count)
622
623 if (SUCCEEDED(hr))
624 hr = create_instance(&CLSID_WICImagingFactory, &IID_IWICComponentFactory, (void**)&factory);
625
626 if (SUCCEEDED(hr))
627 hr = IWICComponentFactory_CreateStream(factory, &stream);
628
629 if (SUCCEEDED(hr))
630 {
631 if (This->metadata_blocks[nIndex].options & DECODER_BLOCK_FULL_STREAM)
632 {
634 offset.QuadPart = This->metadata_blocks[nIndex].offset;
635
636 hr = IWICStream_InitializeFromIStream(stream, This->parent->stream);
637
638 if (SUCCEEDED(hr))
639 hr = IWICStream_Seek(stream, offset, STREAM_SEEK_SET, NULL);
640 }
641 else
642 {
644
645 offset.QuadPart = This->metadata_blocks[nIndex].offset;
646 length.QuadPart = This->metadata_blocks[nIndex].length;
647
648 hr = IWICStream_InitializeFromIStreamRegion(stream, This->parent->stream,
649 offset, length);
650 }
651
652 if (This->metadata_blocks[nIndex].options & DECODER_BLOCK_READER_CLSID)
653 {
655 IWICPersistStream *persist;
656 if (SUCCEEDED(hr))
657 {
658 hr = create_instance(&This->metadata_blocks[nIndex].reader_clsid,
659 &IID_IWICMetadataReader, (void**)&reader);
660 }
661
662 if (SUCCEEDED(hr))
663 {
664 hr = IWICMetadataReader_QueryInterface(reader, &IID_IWICPersistStream, (void**)&persist);
665
666 if (SUCCEEDED(hr))
667 {
668 hr = IWICPersistStream_LoadEx(persist, (IStream*)stream, NULL,
669 This->metadata_blocks[nIndex].options & DECODER_BLOCK_OPTION_MASK);
670
671 IWICPersistStream_Release(persist);
672 }
673
674 if (SUCCEEDED(hr))
675 *ppIMetadataReader = reader;
676 else
677 IWICMetadataReader_Release(reader);
678 }
679 }
680 else
681 {
682 hr = IWICComponentFactory_CreateMetadataReaderFromContainer(factory,
683 &This->parent->decoder_info.block_format, NULL,
684 This->metadata_blocks[nIndex].options & DECODER_BLOCK_OPTION_MASK,
685 (IStream*)stream, ppIMetadataReader);
686 }
687
688 IWICStream_Release(stream);
689 }
690
691 if (factory) IWICComponentFactory_Release(factory);
692
693 if (FAILED(hr))
694 *ppIMetadataReader = NULL;
695
696 return S_OK;
697}
698
700 IEnumUnknown **ppIEnumMetadata)
701{
702 FIXME("%p,%p\n", iface, ppIEnumMetadata);
703 return E_NOTIMPL;
704}
705
706static const IWICMetadataBlockReaderVtbl CommonDecoderFrame_BlockVtbl = {
714};
715
717 UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
718{
722
723 TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame);
724
725 if (!ppIBitmapFrame)
726 return E_INVALIDARG;
727
729
730 if (!This->stream || index >= This->file_info.frame_count)
732
733 if (SUCCEEDED(hr))
734 {
735 result = malloc(sizeof(*result));
736 if (!result)
738 }
739
740 if (SUCCEEDED(hr))
741 {
742 result->IWICBitmapFrameDecode_iface.lpVtbl = &CommonDecoderFrameVtbl;
743 result->IWICMetadataBlockReader_iface.lpVtbl = &CommonDecoderFrame_BlockVtbl;
744 result->ref = 1;
745 result->parent = This;
746 result->frame = index;
747 result->metadata_initialized = FALSE;
748 result->metadata_count = 0;
749 result->metadata_blocks = NULL;
750
751 hr = decoder_get_frame_info(This->decoder, index, &result->decoder_frame);
752
753 if (SUCCEEDED(hr) && This->cache_options == WICDecodeMetadataCacheOnLoad)
755
756 if (FAILED(hr))
757 free(result);
758 }
759
761
762 if (SUCCEEDED(hr))
763 {
764 TRACE("-> %ux%u, %u-bit pixelformat=%s res=%f,%f colors=%lu contexts=%lu\n",
765 result->decoder_frame.width, result->decoder_frame.height,
766 result->decoder_frame.bpp, wine_dbgstr_guid(&result->decoder_frame.pixel_format),
767 result->decoder_frame.dpix, result->decoder_frame.dpiy,
768 result->decoder_frame.num_colors, result->decoder_frame.num_color_contexts);
769 IWICBitmapDecoder_AddRef(&This->IWICBitmapDecoder_iface);
770 *ppIBitmapFrame = &result->IWICBitmapFrameDecode_iface;
771 }
772 else
773 {
774 *ppIBitmapFrame = NULL;
775 }
776
777 return hr;
778}
779
781 const struct decoder_info *decoder_info, REFIID iid, void** ppv)
782{
784 HRESULT hr;
785
786 TRACE("(%s,%s,%p)\n", debugstr_guid(&decoder_info->clsid), debugstr_guid(iid), ppv);
787
788 This = malloc(sizeof(*This));
789 if (!This)
790 {
792 return E_OUTOFMEMORY;
793 }
794
795 This->IWICBitmapDecoder_iface.lpVtbl = &CommonDecoder_Vtbl;
796 This->ref = 1;
797 This->stream = NULL;
798 This->decoder = decoder;
799 This->decoder_info = *decoder_info;
800#ifdef __REACTOS__
802#else
804#endif
805 This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": CommonDecoder.lock");
806
807 hr = IWICBitmapDecoder_QueryInterface(&This->IWICBitmapDecoder_iface, iid, ppv);
808 IWICBitmapDecoder_Release(&This->IWICBitmapDecoder_iface);
809
810 return hr;
811}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define index(s, c)
Definition: various.h:29
#define FIXME(fmt,...)
Definition: precomp.h:53
const GUID IID_IUnknown
HRESULT create_instance(const CLSID *clsid, const IID *iid, void **ppv)
Definition: clsfactory.c:212
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
static HRESULT CommonDecoderFrame_InitializeMetadata(CommonDecoderFrame *This)
Definition: decoder.c:567
static ULONG WINAPI CommonDecoder_AddRef(IWICBitmapDecoder *iface)
Definition: decoder.c:71
static ULONG WINAPI CommonDecoderFrame_Block_AddRef(IWICMetadataBlockReader *iface)
Definition: decoder.c:546
static HRESULT WINAPI CommonDecoderFrame_Block_GetCount(IWICMetadataBlockReader *iface, UINT *pcCount)
Definition: decoder.c:588
static HRESULT WINAPI CommonDecoderFrame_Block_GetEnumerator(IWICMetadataBlockReader *iface, IEnumUnknown **ppIEnumMetadata)
Definition: decoder.c:699
static HRESULT WINAPI CommonDecoderFrame_Block_GetReaderByIndex(IWICMetadataBlockReader *iface, UINT nIndex, IWICMetadataReader **ppIMetadataReader)
Definition: decoder.c:605
static CommonDecoderFrame * impl_from_IWICMetadataBlockReader(IWICMetadataBlockReader *iface)
Definition: decoder.c:261
static HRESULT WINAPI CommonDecoderFrame_GetThumbnail(IWICBitmapFrameDecode *iface, IWICBitmapSource **ppIThumbnail)
Definition: decoder.c:514
static CommonDecoder * impl_from_IWICBitmapDecoder(IWICBitmapDecoder *iface)
Definition: decoder.c:44
static HRESULT WINAPI CommonDecoder_GetColorContexts(IWICBitmapDecoder *iface, UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
Definition: decoder.c:192
static HRESULT WINAPI CommonDecoderFrame_GetMetadataQueryReader(IWICBitmapFrameDecode *iface, IWICMetadataQueryReader **ppIMetadataQueryReader)
Definition: decoder.c:431
static HRESULT WINAPI CommonDecoder_GetFrameCount(IWICBitmapDecoder *iface, UINT *pCount)
Definition: decoder.c:210
static HRESULT WINAPI CommonDecoderFrame_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid, void **ppv)
Definition: decoder.c:266
HRESULT CommonDecoder_CreateInstance(struct decoder *decoder, const struct decoder_info *decoder_info, REFIID iid, void **ppv)
Definition: decoder.c:780
static CommonDecoderFrame * impl_from_IWICBitmapFrameDecode(IWICBitmapFrameDecode *iface)
Definition: decoder.c:256
static ULONG WINAPI CommonDecoderFrame_Block_Release(IWICMetadataBlockReader *iface)
Definition: decoder.c:552
static HRESULT WINAPI CommonDecoderFrame_GetPixelFormat(IWICBitmapFrameDecode *iface, WICPixelFormatGUID *pPixelFormat)
Definition: decoder.c:335
static HRESULT WINAPI CommonDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *stream, DWORD *capability)
Definition: decoder.c:101
static HRESULT WINAPI CommonDecoderFrame_CopyPalette(IWICBitmapFrameDecode *iface, IWICPalette *pIPalette)
Definition: decoder.c:364
static HRESULT WINAPI CommonDecoder_GetDecoderInfo(IWICBitmapDecoder *iface, IWICBitmapDecoderInfo **ppIDecoderInfo)
Definition: decoder.c:154
static HRESULT WINAPI CommonDecoderFrame_GetResolution(IWICBitmapFrameDecode *iface, double *pDpiX, double *pDpiY)
Definition: decoder.c:349
static ULONG WINAPI CommonDecoder_Release(IWICBitmapDecoder *iface)
Definition: decoder.c:81
static HRESULT WINAPI CommonDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid, void **ppv)
Definition: decoder.c:49
static HRESULT WINAPI CommonDecoder_GetThumbnail(IWICBitmapDecoder *iface, IWICBitmapSource **ppIThumbnail)
Definition: decoder.c:199
static HRESULT WINAPI CommonDecoderFrame_GetSize(IWICBitmapFrameDecode *iface, UINT *puiWidth, UINT *puiHeight)
Definition: decoder.c:320
static HRESULT WINAPI CommonDecoderFrame_GetColorContexts(IWICBitmapFrameDecode *iface, UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
Definition: decoder.c:460
static HRESULT WINAPI CommonDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface, IWICMetadataQueryReader **reader)
Definition: decoder.c:170
static ULONG WINAPI CommonDecoderFrame_AddRef(IWICBitmapFrameDecode *iface)
Definition: decoder.c:293
static const IWICBitmapFrameDecodeVtbl CommonDecoderFrameVtbl
Definition: decoder.c:525
static ULONG WINAPI CommonDecoderFrame_Release(IWICBitmapFrameDecode *iface)
Definition: decoder.c:303
static HRESULT WINAPI CommonDecoder_GetContainerFormat(IWICBitmapDecoder *iface, GUID *pguidContainerFormat)
Definition: decoder.c:146
static HRESULT WINAPI CommonDecoder_GetFrame(IWICBitmapDecoder *iface, UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
Definition: decoder.c:716
static HRESULT WINAPI CommonDecoderFrame_Block_QueryInterface(IWICMetadataBlockReader *iface, REFIID iid, void **ppv)
Definition: decoder.c:539
static HRESULT WINAPI CommonDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream, WICDecodeOptions cacheOptions)
Definition: decoder.c:118
static HRESULT WINAPI CommonDecoderFrame_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
Definition: decoder.c:384
static HRESULT WINAPI CommonDecoderFrame_Block_GetContainerFormat(IWICMetadataBlockReader *iface, GUID *pguidContainerFormat)
Definition: decoder.c:558
static HRESULT WINAPI CommonDecoder_CopyPalette(IWICBitmapDecoder *iface, IWICPalette *palette)
Definition: decoder.c:163
static HRESULT WINAPI CommonDecoder_GetPreview(IWICBitmapDecoder *iface, IWICBitmapSource **ppIBitmapSource)
Definition: decoder.c:181
static const IWICMetadataBlockReaderVtbl CommonDecoderFrame_BlockVtbl
Definition: decoder.c:706
static const IWICBitmapDecoderVtbl CommonDecoder_Vtbl
Definition: decoder.c:227
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static GpStatus get_decoder_info(IStream *stream, const struct image_codec **result)
Definition: image.c:4285
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLintptr offset
Definition: glext.h:5920
GLuint index
Definition: glext.h:6031
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLuint64EXT * result
Definition: glext.h:11304
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define profile
Definition: kernel32.h:12
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static HPALETTE palette
Definition: clipboard.c:1345
unsigned int UINT
Definition: ndis.h:50
_Out_ LPRECT prc
Definition: ntgdi.h:1658
long LONG
Definition: pedump.c:60
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
& rect
Definition: startmenu.cpp:1413
IWICBitmapFrameDecode IWICBitmapFrameDecode_iface
Definition: decoder.c:245
CommonDecoder * parent
Definition: decoder.c:248
IWICMetadataBlockReader IWICMetadataBlockReader_iface
Definition: decoder.c:246
BOOL metadata_initialized
Definition: decoder.c:251
struct decoder_block * metadata_blocks
Definition: decoder.c:253
struct decoder * decoder
Definition: decoder.c:38
CRITICAL_SECTION lock
Definition: decoder.c:36
LONG ref
Definition: decoder.c:35
WICDecodeOptions cache_options
Definition: decoder.c:41
IStream * stream
Definition: decoder.c:37
IWICBitmapDecoder IWICBitmapDecoder_iface
Definition: decoder.c:34
Definition: main.c:439
Definition: reader.h:84
Definition: send.c:48
Definition: parse.h:23
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
#define DWORD_PTR
Definition: treelist.c:76
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
WICDecodeOptions
Definition: wincodec.idl:28
@ WICDecodeMetadataCacheOnDemand
Definition: wincodec.idl:29
@ WICDecodeMetadataCacheOnLoad
Definition: wincodec.idl:30
@ WICBitmapDecoderCapabilityCanEnumerateMetadata
Definition: wincodec.idl:52
HRESULT CDECL decoder_get_color_context(struct decoder *decoder, UINT frame, UINT num, BYTE **data, DWORD *datasize)
HRESULT CDECL decoder_get_frame_info(struct decoder *decoder, UINT frame, struct decoder_frame *info)
HRESULT CDECL decoder_initialize(struct decoder *decoder, IStream *stream, struct decoder_stat *st)
HRESULT CDECL decoder_copy_pixels(struct decoder *decoder, UINT frame, const WICRect *prc, UINT stride, UINT buffersize, BYTE *buffer)
HRESULT CDECL decoder_get_metadata_blocks(struct decoder *decoder, UINT frame, UINT *count, struct decoder_block **blocks)
void CDECL decoder_destroy(struct decoder *decoder)
static const char * debug_wic_rect(const WICRect *rect)
#define DECODER_FLAGS_UNSUPPORTED_COLOR_CONTEXT
#define DECODER_BLOCK_READER_CLSID
#define DECODER_BLOCK_OPTION_MASK
#define DECODER_BLOCK_FULL_STREAM
#define DECODER_FLAGS_CAPABILITY_MASK
#define WINAPI
Definition: msvc.h:6
#define WINCODEC_ERR_WRONGSTATE
Definition: winerror.h:3281
#define WINCODEC_ERR_UNSUPPORTEDOPERATION
Definition: winerror.h:3308
#define E_NOINTERFACE
Definition: winerror.h:2364
#define WINCODEC_ERR_PALETTEUNAVAILABLE
Definition: winerror.h:3292
#define WINCODEC_ERR_CODECNOTHUMBNAIL
Definition: winerror.h:3291
#define E_POINTER
Definition: winerror.h:2365
#define WINCODEC_ERR_FRAMEMISSING
Definition: winerror.h:3301
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1116
unsigned char BYTE
Definition: xxhash.c:193