ReactOS 0.4.16-dev-319-g6cf4263
icoformat.c
Go to the documentation of this file.
1/*
2 * Copyright 2009 Vincent Povirk for CodeWeavers
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 "config.h"
20
21#include <stdarg.h>
22
23#define COBJMACROS
24
25#include "windef.h"
26#include "winbase.h"
27#include "wingdi.h"
28#include "objbase.h"
29
30#include "wincodecs_private.h"
31
32#include "wine/debug.h"
33
35
36#include "pshpack1.h"
37
38typedef struct {
48
49typedef struct
50{
55
56#include "poppack.h"
57
58typedef struct {
64 CRITICAL_SECTION lock; /* must be held when accessing stream */
66
67typedef struct {
71 double dpiX, dpiY;
74
76{
77 return CONTAINING_RECORD(iface, IcoDecoder, IWICBitmapDecoder_iface);
78}
79
81{
82 return CONTAINING_RECORD(iface, IcoFrameDecode, IWICBitmapFrameDecode_iface);
83}
84
86 void **ppv)
87{
89 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
90
91 if (!ppv) return E_INVALIDARG;
92
93 if (IsEqualIID(&IID_IUnknown, iid) ||
94 IsEqualIID(&IID_IWICBitmapSource, iid) ||
95 IsEqualIID(&IID_IWICBitmapFrameDecode, iid))
96 {
97 *ppv = &This->IWICBitmapFrameDecode_iface;
98 }
99 else
100 {
101 *ppv = NULL;
102 return E_NOINTERFACE;
103 }
104
105 IUnknown_AddRef((IUnknown*)*ppv);
106 return S_OK;
107}
108
110{
113
114 TRACE("(%p) refcount=%u\n", iface, ref);
115
116 return ref;
117}
118
120{
123
124 TRACE("(%p) refcount=%u\n", iface, ref);
125
126 if (ref == 0)
127 {
128 HeapFree(GetProcessHeap(), 0, This->bits);
130 }
131
132 return ref;
133}
134
136 UINT *puiWidth, UINT *puiHeight)
137{
139
140 *puiWidth = This->width;
141 *puiHeight = This->height;
142
143 TRACE("(%p) -> (%i,%i)\n", iface, *puiWidth, *puiHeight);
144
145 return S_OK;
146}
147
149 WICPixelFormatGUID *pPixelFormat)
150{
151 memcpy(pPixelFormat, &GUID_WICPixelFormat32bppBGRA, sizeof(GUID));
152 return S_OK;
153}
154
156 double *pDpiX, double *pDpiY)
157{
159
160 *pDpiX = This->dpiX;
161 *pDpiY = This->dpiY;
162
163 TRACE("(%p) -> (%f,%f)\n", iface, *pDpiX, *pDpiY);
164
165 return S_OK;
166}
167
169 IWICPalette *pIPalette)
170{
171 TRACE("(%p,%p)\n", iface, pIPalette);
173}
174
176 const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
177{
179 TRACE("(%p,%s,%u,%u,%p)\n", iface, debug_wic_rect(prc), cbStride, cbBufferSize, pbBuffer);
180
181 return copy_pixels(32, This->bits, This->width, This->height, This->width * 4,
182 prc, cbStride, cbBufferSize, pbBuffer);
183}
184
186 IWICMetadataQueryReader **ppIMetadataQueryReader)
187{
188 TRACE("(%p,%p)\n", iface, ppIMetadataQueryReader);
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 return IWICBitmapFrameDecode_QueryInterface(iface, &IID_IWICBitmapSource, (void **)ppIThumbnail);
204}
205
206static const IWICBitmapFrameDecodeVtbl IcoFrameDecode_Vtbl = {
218};
219
220static inline void pixel_set_trans(DWORD* pixel, BOOL transparent)
221{
222 if (transparent) *pixel = 0;
223 else *pixel |= 0xff000000;
224}
225
227{
228 HRESULT hr;
229 BmpDecoder *bmp_decoder;
230 IWICBitmapDecoder *decoder;
231 IWICBitmapFrameDecode *framedecode;
234 BOOL has_alpha=FALSE; /* if TRUE, alpha data might be in the image data */
235 WICRect rc;
236
237 hr = IcoDibDecoder_CreateInstance(&bmp_decoder);
238 if (SUCCEEDED(hr))
239 {
240 BmpDecoder_GetWICDecoder(bmp_decoder, &decoder);
241 hr = IWICBitmapDecoder_Initialize(decoder, stream, WICDecodeMetadataCacheOnLoad);
242
243 if (SUCCEEDED(hr))
244 hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
245
246 if (SUCCEEDED(hr))
247 {
248 hr = IWICBitmapFrameDecode_GetSize(framedecode, &result->width, &result->height);
249
250 if (SUCCEEDED(hr))
251 {
252 result->bits = HeapAlloc(GetProcessHeap(), 0, result->width * result->height * 4);
253 if (!result->bits) hr = E_OUTOFMEMORY;
254 }
255
256 if (SUCCEEDED(hr))
257 hr = IWICBitmapFrameDecode_GetPixelFormat(framedecode, &pixelformat);
258
259 if (IsEqualGUID(&pixelformat, &GUID_WICPixelFormat32bppBGR) ||
260 IsEqualGUID(&pixelformat, &GUID_WICPixelFormat32bppBGRA))
261 {
262 source = (IWICBitmapSource*)framedecode;
263 IWICBitmapSource_AddRef(source);
264 has_alpha = TRUE;
265 }
266 else
267 {
268 hr = WICConvertBitmapSource(&GUID_WICPixelFormat32bppBGRA,
269 (IWICBitmapSource*)framedecode, &source);
270 has_alpha = FALSE;
271 }
272
273 if (SUCCEEDED(hr))
274 {
275 rc.X = 0;
276 rc.Y = 0;
277 rc.Width = result->width;
278 rc.Height = result->height;
279 hr = IWICBitmapSource_CopyPixels(source, &rc, result->width * 4,
280 result->width * result->height * 4, result->bits);
281
282 IWICBitmapSource_Release(source);
283 }
284
285 if (SUCCEEDED(hr))
286 hr = IWICBitmapFrameDecode_GetResolution(framedecode, &result->dpiX, &result->dpiY);
287
288 IWICBitmapFrameDecode_Release(framedecode);
289 }
290
291 if (SUCCEEDED(hr) && has_alpha)
292 {
293 /* If the alpha channel is fully transparent, we should ignore it. */
294 int nonzero_alpha = 0;
295 UINT i;
296
297 for (i=0; i<(result->height*result->width); i++)
298 {
299 if (result->bits[i*4+3] != 0)
300 {
301 nonzero_alpha = 1;
302 break;
303 }
304 }
305
306 if (!nonzero_alpha)
307 {
308 for (i=0; i<(result->height*result->width); i++)
309 result->bits[i*4+3] = 0xff;
310
311 has_alpha = FALSE;
312 }
313 }
314
315 if (SUCCEEDED(hr) && !has_alpha)
316 {
317 /* set alpha data based on the AND mask */
318 UINT andBytesPerRow = (result->width+31)/32*4;
319 UINT andBytes = andBytesPerRow * result->height;
320 INT andStride;
321 BYTE *tempdata=NULL;
322 BYTE *andRow;
323 BYTE *bitsRow;
324 UINT bitsStride = result->width * 4;
325 UINT x, y;
327 ULONG bytesread;
329 int topdown;
330
331 BmpDecoder_FindIconMask(bmp_decoder, &offset, &topdown);
332
333 if (offset)
334 {
335 seek.QuadPart = offset;
336
337 hr = IStream_Seek(stream, seek, STREAM_SEEK_SET, 0);
338
339 if (SUCCEEDED(hr))
340 {
341 tempdata = HeapAlloc(GetProcessHeap(), 0, andBytes);
342 if (!tempdata) hr = E_OUTOFMEMORY;
343 }
344
345 if (SUCCEEDED(hr))
346 hr = IStream_Read(stream, tempdata, andBytes, &bytesread);
347
348 if (SUCCEEDED(hr) && bytesread == andBytes)
349 {
350 if (topdown)
351 {
352 andStride = andBytesPerRow;
353 andRow = tempdata;
354 }
355 else
356 {
357 andStride = -andBytesPerRow;
358 andRow = tempdata + (result->height-1)*andBytesPerRow;
359 }
360
361 bitsRow = result->bits;
362 for (y=0; y<result->height; y++) {
363 BYTE *andByte=andRow;
364 DWORD *bitsPixel=(DWORD*)bitsRow;
365 for (x=0; x<result->width; x+=8) {
366 BYTE andVal=*andByte++;
367 pixel_set_trans(bitsPixel++, andVal>>7&1);
368 if (x+1 < result->width) pixel_set_trans(bitsPixel++, andVal>>6&1);
369 if (x+2 < result->width) pixel_set_trans(bitsPixel++, andVal>>5&1);
370 if (x+3 < result->width) pixel_set_trans(bitsPixel++, andVal>>4&1);
371 if (x+4 < result->width) pixel_set_trans(bitsPixel++, andVal>>3&1);
372 if (x+5 < result->width) pixel_set_trans(bitsPixel++, andVal>>2&1);
373 if (x+6 < result->width) pixel_set_trans(bitsPixel++, andVal>>1&1);
374 if (x+7 < result->width) pixel_set_trans(bitsPixel++, andVal&1);
375 }
376 andRow += andStride;
377 bitsRow += bitsStride;
378 }
379 }
380
381 HeapFree(GetProcessHeap(), 0, tempdata);
382 }
383 }
384
385 IWICBitmapDecoder_Release(decoder);
386 }
387
388 return hr;
389}
390
392{
393 IWICBitmapDecoder *decoder = NULL;
394 IWICBitmapFrameDecode *sourceFrame = NULL;
395 IWICBitmapSource *sourceBitmap = NULL;
397 HRESULT hr;
398
399 hr = PngDecoder_CreateInstance(&IID_IWICBitmapDecoder, (void**)&decoder);
400 if (FAILED(hr))
401 goto end;
402 hr = IWICBitmapDecoder_Initialize(decoder, stream, WICDecodeMetadataCacheOnLoad);
403 if (FAILED(hr))
404 goto end;
405 hr = IWICBitmapDecoder_GetFrame(decoder, 0, &sourceFrame);
406 if (FAILED(hr))
407 goto end;
408 hr = WICConvertBitmapSource(&GUID_WICPixelFormat32bppBGRA, (IWICBitmapSource*)sourceFrame, &sourceBitmap);
409 if (FAILED(hr))
410 goto end;
411 hr = IWICBitmapFrameDecode_GetSize(sourceFrame, &result->width, &result->height);
412 if (FAILED(hr))
413 goto end;
414 hr = IWICBitmapFrameDecode_GetResolution(sourceFrame, &result->dpiX, &result->dpiY);
415 if (FAILED(hr))
416 goto end;
417 result->bits = HeapAlloc(GetProcessHeap(), 0, 4 * result->width * result->height);
418 if (result->bits == NULL)
419 {
421 goto end;
422 }
423 rect.X = 0;
424 rect.Y = 0;
425 rect.Width = result->width;
426 rect.Height = result->height;
427 hr = IWICBitmapSource_CopyPixels(sourceBitmap, &rect, 4*result->width,
428 4*result->width*result->height, result->bits);
429
430end:
431 if (decoder != NULL)
432 IWICBitmapDecoder_Release(decoder);
433 if (sourceFrame != NULL)
434 IWICBitmapFrameDecode_Release(sourceFrame);
435 if (sourceBitmap != NULL)
436 IWICBitmapSource_Release(sourceBitmap);
437 return hr;
438}
439
441 void **ppv)
442{
444 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
445
446 if (!ppv) return E_INVALIDARG;
447
448 if (IsEqualIID(&IID_IUnknown, iid) ||
449 IsEqualIID(&IID_IWICBitmapDecoder, iid))
450 {
451 *ppv = &This->IWICBitmapDecoder_iface;
452 }
453 else
454 {
455 *ppv = NULL;
456 return E_NOINTERFACE;
457 }
458
459 IUnknown_AddRef((IUnknown*)*ppv);
460 return S_OK;
461}
462
464{
467
468 TRACE("(%p) refcount=%u\n", iface, ref);
469
470 return ref;
471}
472
474{
477
478 TRACE("(%p) refcount=%u\n", iface, ref);
479
480 if (ref == 0)
481 {
482 This->lock.DebugInfo->Spare[0] = 0;
484 if (This->stream) IStream_Release(This->stream);
486 }
487
488 return ref;
489}
490
492 DWORD *capability)
493{
494 HRESULT hr;
495
496 TRACE("(%p,%p,%p)\n", iface, stream, capability);
497
498 if (!stream || !capability) return E_INVALIDARG;
499
500 hr = IWICBitmapDecoder_Initialize(iface, stream, WICDecodeMetadataCacheOnDemand);
501 if (hr != S_OK) return hr;
502
504 return S_OK;
505}
506
508 WICDecodeOptions cacheOptions)
509{
512 HRESULT hr;
513 ULONG bytesread;
514 STATSTG statstg;
515 unsigned int i;
516
517 TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions);
518
520
521 if (This->initialized)
522 {
524 goto end;
525 }
526
527 seek.QuadPart = 0;
528 hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL);
529 if (FAILED(hr)) goto end;
530
531 hr = IStream_Read(pIStream, &This->header, sizeof(ICONHEADER), &bytesread);
532 if (FAILED(hr)) goto end;
533
534 if (bytesread != sizeof(ICONHEADER))
535 {
537 goto end;
538 }
539
540 if (This->header.idReserved != 0 ||
541 This->header.idType != 1)
542 {
543 hr = E_FAIL;
544 goto end;
545 }
546
547 hr = IStream_Stat(pIStream, &statstg, STATFLAG_NONAME);
548 if (FAILED(hr))
549 {
550 WARN("Stat() failed, hr %#x.\n", hr);
551 goto end;
552 }
553
554 for (i = 0; i < This->header.idCount; i++)
555 {
556 ICONDIRENTRY direntry;
557
558 hr = IStream_Read(pIStream, &direntry, sizeof(direntry), &bytesread);
559 if (FAILED(hr)) goto end;
560
561 if (bytesread != sizeof(direntry) || (direntry.dwDIBSize + direntry.dwDIBOffset > statstg.cbSize.QuadPart))
562 {
564 goto end;
565 }
566 }
567
568 This->initialized = TRUE;
569 This->stream = pIStream;
570 IStream_AddRef(pIStream);
571
572end:
573
575
576 return hr;
577}
578
580 GUID *pguidContainerFormat)
581{
582 memcpy(pguidContainerFormat, &GUID_ContainerFormatIco, sizeof(GUID));
583 return S_OK;
584}
585
587 IWICBitmapDecoderInfo **ppIDecoderInfo)
588{
589 TRACE("(%p,%p)\n", iface, ppIDecoderInfo);
590
591 return get_decoder_info(&CLSID_WICIcoDecoder, ppIDecoderInfo);
592}
593
595 IWICPalette *pIPalette)
596{
597 TRACE("(%p,%p)\n", iface, pIPalette);
599}
600
602 IWICMetadataQueryReader **ppIMetadataQueryReader)
603{
604 TRACE("(%p,%p)\n", iface, ppIMetadataQueryReader);
606}
607
609 IWICBitmapSource **ppIBitmapSource)
610{
611 TRACE("(%p,%p)\n", iface, ppIBitmapSource);
613}
614
616 UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
617{
618 TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
620}
621
623 IWICBitmapSource **ppIThumbnail)
624{
625 TRACE("(%p,%p)\n", iface, ppIThumbnail);
627}
628
630 UINT *pCount)
631{
633
634 if (!pCount) return E_INVALIDARG;
635
637 *pCount = This->initialized ? This->header.idCount : 0;
639
640 TRACE("(%p) <-- %d\n", iface, *pCount);
641
642 return S_OK;
643}
644
646 UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
647{
652 HRESULT hr;
653 ULONG bytesread;
655 IWICStream *substream=NULL;
656 DWORD magic;
657 TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame);
658
660
661 if (!This->initialized)
662 {
664 goto fail;
665 }
666
667 if (This->header.idCount < index)
668 {
670 goto fail;
671 }
672
674 if (!result)
675 {
677 goto fail;
678 }
679
680 result->IWICBitmapFrameDecode_iface.lpVtbl = &IcoFrameDecode_Vtbl;
681 result->ref = 1;
682 result->bits = NULL;
683
684 /* read the icon entry */
685 seek.QuadPart = sizeof(ICONHEADER) + sizeof(ICONDIRENTRY) * index;
686 hr = IStream_Seek(This->stream, seek, STREAM_SEEK_SET, 0);
687 if (FAILED(hr)) goto fail;
688
689 hr = IStream_Read(This->stream, &entry, sizeof(ICONDIRENTRY), &bytesread);
690 if (FAILED(hr) || bytesread != sizeof(ICONDIRENTRY)) goto fail;
691
692 /* create a stream object for this icon */
693 hr = StreamImpl_Create(&substream);
694 if (FAILED(hr)) goto fail;
695
696 offset.QuadPart = entry.dwDIBOffset;
697 length.QuadPart = entry.dwDIBSize;
698 hr = IWICStream_InitializeFromIStreamRegion(substream, This->stream, offset, length);
699 if (FAILED(hr)) goto fail;
700
701 /* read the bitmapinfo size or magic number */
702 hr = IWICStream_Read(substream, &magic, sizeof(magic), &bytesread);
703 if (FAILED(hr) || bytesread != sizeof(magic)) goto fail;
704
705 /* forward to the appropriate decoding function based on the magic number */
706 switch (magic)
707 {
708 case sizeof(BITMAPCOREHEADER):
709 case 64: /* sizeof(BITMAPCOREHEADER2) */
710 case sizeof(BITMAPINFOHEADER):
711 case sizeof(BITMAPV4HEADER):
712 case sizeof(BITMAPV5HEADER):
713 hr = ReadIcoDib((IStream*)substream, result);
714 break;
715 case 0x474e5089:
716 hr = ReadIcoPng((IStream*)substream, result);
717 break;
718 default:
719 FIXME("Unrecognized ICO frame magic: %x\n", magic);
720 hr = E_FAIL;
721 break;
722 }
723 if (FAILED(hr)) goto fail;
724
725 *ppIBitmapFrame = &result->IWICBitmapFrameDecode_iface;
726
728
729 IWICStream_Release(substream);
730
731 return S_OK;
732
733fail:
736 if (substream) IWICStream_Release(substream);
737 if (SUCCEEDED(hr)) hr = E_FAIL;
738 TRACE("<-- %x\n", hr);
739 return hr;
740}
741
742static const IWICBitmapDecoderVtbl IcoDecoder_Vtbl = {
757};
758
760{
762 HRESULT ret;
763
764 TRACE("(%s,%p)\n", debugstr_guid(iid), ppv);
765
766 *ppv = NULL;
767
768 This = HeapAlloc(GetProcessHeap(), 0, sizeof(IcoDecoder));
769 if (!This) return E_OUTOFMEMORY;
770
771 This->IWICBitmapDecoder_iface.lpVtbl = &IcoDecoder_Vtbl;
772 This->ref = 1;
773 This->stream = NULL;
774 This->initialized = FALSE;
776 This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IcoDecoder.lock");
777
778 ret = IWICBitmapDecoder_QueryInterface(&This->IWICBitmapDecoder_iface, iid, ppv);
779 IWICBitmapDecoder_Release(&This->IWICBitmapDecoder_iface);
780
781 return ret;
782}
#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
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
void BmpDecoder_GetWICDecoder(BmpDecoder *This, IWICBitmapDecoder **ppDecoder)
Definition: bmpdecode.c:1210
void BmpDecoder_FindIconMask(BmpDecoder *This, ULONG *mask_offset, int *topdown)
Definition: bmpdecode.c:1216
HRESULT IcoDibDecoder_CreateInstance(BmpDecoder **ppDecoder)
Definition: bmpdecode.c:1205
void copy_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch, BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *size, const struct pixel_format_desc *format) DECLSPEC_HIDDEN
Definition: surface.c:1700
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
static GpStatus get_decoder_info(IStream *stream, const struct image_codec **result)
Definition: image.c:4285
pixelformat
Definition: converter.c:40
static HRESULT WINAPI IcoFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface, WICPixelFormatGUID *pPixelFormat)
Definition: icoformat.c:148
static HRESULT WINAPI IcoDecoder_CopyPalette(IWICBitmapDecoder *iface, IWICPalette *pIPalette)
Definition: icoformat.c:594
static HRESULT WINAPI IcoDecoder_GetContainerFormat(IWICBitmapDecoder *iface, GUID *pguidContainerFormat)
Definition: icoformat.c:579
static HRESULT WINAPI IcoDecoder_GetThumbnail(IWICBitmapDecoder *iface, IWICBitmapSource **ppIThumbnail)
Definition: icoformat.c:622
static HRESULT WINAPI IcoDecoder_GetPreview(IWICBitmapDecoder *iface, IWICBitmapSource **ppIBitmapSource)
Definition: icoformat.c:608
static HRESULT WINAPI IcoFrameDecode_GetResolution(IWICBitmapFrameDecode *iface, double *pDpiX, double *pDpiY)
Definition: icoformat.c:155
static ULONG WINAPI IcoDecoder_AddRef(IWICBitmapDecoder *iface)
Definition: icoformat.c:463
static HRESULT WINAPI IcoDecoder_GetColorContexts(IWICBitmapDecoder *iface, UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
Definition: icoformat.c:615
static ULONG WINAPI IcoDecoder_Release(IWICBitmapDecoder *iface)
Definition: icoformat.c:473
static HRESULT WINAPI IcoDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid, void **ppv)
Definition: icoformat.c:440
static HRESULT ReadIcoDib(IStream *stream, IcoFrameDecode *result)
Definition: icoformat.c:226
static const IWICBitmapFrameDecodeVtbl IcoFrameDecode_Vtbl
Definition: icoformat.c:206
static const IWICBitmapDecoderVtbl IcoDecoder_Vtbl
Definition: icoformat.c:742
static HRESULT WINAPI IcoDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface, IWICMetadataQueryReader **ppIMetadataQueryReader)
Definition: icoformat.c:601
static HRESULT WINAPI IcoFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, IWICPalette *pIPalette)
Definition: icoformat.c:168
static HRESULT WINAPI IcoFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDecode *iface, IWICMetadataQueryReader **ppIMetadataQueryReader)
Definition: icoformat.c:185
static HRESULT WINAPI IcoDecoder_GetDecoderInfo(IWICBitmapDecoder *iface, IWICBitmapDecoderInfo **ppIDecoderInfo)
Definition: icoformat.c:586
static HRESULT WINAPI IcoFrameDecode_GetColorContexts(IWICBitmapFrameDecode *iface, UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
Definition: icoformat.c:192
static HRESULT WINAPI IcoDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *stream, DWORD *capability)
Definition: icoformat.c:491
static HRESULT WINAPI IcoDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream, WICDecodeOptions cacheOptions)
Definition: icoformat.c:507
static HRESULT WINAPI IcoFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid, void **ppv)
Definition: icoformat.c:85
static void pixel_set_trans(DWORD *pixel, BOOL transparent)
Definition: icoformat.c:220
static HRESULT WINAPI IcoFrameDecode_GetSize(IWICBitmapFrameDecode *iface, UINT *puiWidth, UINT *puiHeight)
Definition: icoformat.c:135
static IcoDecoder * impl_from_IWICBitmapDecoder(IWICBitmapDecoder *iface)
Definition: icoformat.c:75
static HRESULT ReadIcoPng(IStream *stream, IcoFrameDecode *result)
Definition: icoformat.c:391
static ULONG WINAPI IcoFrameDecode_Release(IWICBitmapFrameDecode *iface)
Definition: icoformat.c:119
static ULONG WINAPI IcoFrameDecode_AddRef(IWICBitmapFrameDecode *iface)
Definition: icoformat.c:109
static HRESULT WINAPI IcoFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface, IWICBitmapSource **ppIThumbnail)
Definition: icoformat.c:199
static IcoFrameDecode * impl_from_IWICBitmapFrameDecode(IWICBitmapFrameDecode *iface)
Definition: icoformat.c:80
static HRESULT WINAPI IcoFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
Definition: icoformat.c:175
static HRESULT WINAPI IcoDecoder_GetFrame(IWICBitmapDecoder *iface, UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
Definition: icoformat.c:645
static HRESULT WINAPI IcoDecoder_GetFrameCount(IWICBitmapDecoder *iface, UINT *pCount)
Definition: icoformat.c:629
HRESULT IcoDecoder_CreateInstance(REFIID iid, void **ppv)
Definition: icoformat.c:759
HRESULT WINAPI WICConvertBitmapSource(REFWICPixelFormatGUID dstFormat, IWICBitmapSource *pISrc, IWICBitmapSource **ppIDst)
Definition: info.c:2474
HRESULT PngDecoder_CreateInstance(REFIID iid, void **ppv)
Definition: pngformat.c:2188
HRESULT StreamImpl_Create(IWICStream **stream)
Definition: stream.c:1150
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint GLuint end
Definition: gl.h:1545
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint index
Definition: glext.h:6031
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLuint64EXT * result
Definition: glext.h:11304
GLintptr offset
Definition: glext.h:5920
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
uint32_t entry
Definition: isohybrid.c:63
#define debugstr_guid
Definition: kernel32.h:35
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned int UINT
Definition: ndis.h:50
_Out_ LPRECT prc
Definition: ntgdi.h:1658
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
int seek(void *fd, ulong off, int mode)
Definition: pe.c:51
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
& rect
Definition: startmenu.cpp:1413
BYTE bReserved
Definition: icoformat.c:42
WORD wPlanes
Definition: icoformat.c:43
DWORD dwDIBSize
Definition: icoformat.c:45
WORD wBitCount
Definition: icoformat.c:44
BYTE bColorCount
Definition: icoformat.c:41
BYTE bHeight
Definition: icoformat.c:40
DWORD dwDIBOffset
Definition: icoformat.c:46
BYTE bWidth
Definition: icoformat.c:39
WORD idReserved
Definition: icoformat.c:51
WORD idType
Definition: icoformat.c:52
WORD idCount
Definition: icoformat.c:53
ICONHEADER header
Definition: icoformat.c:63
LONG ref
Definition: icoformat.c:60
BOOL initialized
Definition: icoformat.c:61
IWICBitmapDecoder IWICBitmapDecoder_iface
Definition: icoformat.c:59
IStream * stream
Definition: icoformat.c:62
CRITICAL_SECTION lock
Definition: icoformat.c:64
BYTE * bits
Definition: icoformat.c:72
IWICBitmapFrameDecode IWICBitmapFrameDecode_iface
Definition: icoformat.c:68
double dpiX
Definition: icoformat.c:71
INT Height
Definition: wincodec.idl:301
INT Width
Definition: wincodec.idl:300
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
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
int ret
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
WICDecodeOptions
Definition: wincodec.idl:27
@ WICDecodeMetadataCacheOnDemand
Definition: wincodec.idl:28
@ WICDecodeMetadataCacheOnLoad
Definition: wincodec.idl:29
@ WICBitmapDecoderCapabilityCanDecodeAllImages
Definition: wincodec.idl:49
static const char * debug_wic_rect(const WICRect *rect)
#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_BADIMAGE
Definition: winerror.h:3299
#define WINCODEC_ERR_PALETTEUNAVAILABLE
Definition: winerror.h:3292
#define WINCODEC_ERR_CODECNOTHUMBNAIL
Definition: winerror.h:3291
#define WINCODEC_ERR_FRAMEMISSING
Definition: winerror.h:3301
#define WINCODEC_ERR_STREAMREAD
Definition: winerror.h:3305
struct tagBITMAPCOREHEADER BITMAPCOREHEADER
unsigned char BYTE
Definition: xxhash.c:193