ReactOS  0.4.14-dev-114-gc8cbd56
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 
38 typedef struct {
47 } ICONDIRENTRY;
48 
49 typedef struct
50 {
54 } ICONHEADER;
55 
56 #include "poppack.h"
57 
58 typedef struct {
64  CRITICAL_SECTION lock; /* must be held when accessing stream */
65 } IcoDecoder;
66 
67 typedef 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 
206 static const IWICBitmapFrameDecodeVtbl IcoFrameDecode_Vtbl = {
218 };
219 
220 static 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;
326  ULONG offset;
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;
396  WICRect rect;
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  {
420  hr = E_OUTOFMEMORY;
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 
430 end:
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;
483  DeleteCriticalSection(&This->lock);
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 
519  EnterCriticalSection(&This->lock);
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 
572 end:
573 
574  LeaveCriticalSection(&This->lock);
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 
636  EnterCriticalSection(&This->lock);
637  *pCount = This->initialized ? This->header.idCount : 0;
638  LeaveCriticalSection(&This->lock);
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 
659  EnterCriticalSection(&This->lock);
660 
661  if (!This->initialized)
662  {
664  goto fail;
665  }
666 
667  if (This->header.idCount < index)
668  {
669  hr = E_INVALIDARG;
670  goto fail;
671  }
672 
674  if (!result)
675  {
676  hr = E_OUTOFMEMORY;
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 
727  LeaveCriticalSection(&This->lock);
728 
729  IWICStream_Release(substream);
730 
731  return S_OK;
732 
733 fail:
734  LeaveCriticalSection(&This->lock);
736  if (substream) IWICStream_Release(substream);
737  if (SUCCEEDED(hr)) hr = E_FAIL;
738  TRACE("<-- %x\n", hr);
739  return hr;
740 }
741 
742 static const IWICBitmapDecoderVtbl IcoDecoder_Vtbl = {
757 };
758 
760 {
761  IcoDecoder *This;
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 }
DWORD dwDIBOffset
Definition: icoformat.c:46
BYTE bReserved
Definition: icoformat.c:42
BYTE bColorCount
Definition: icoformat.c:41
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
#define E_NOINTERFACE
Definition: winerror.h:2364
static HRESULT WINAPI IcoFrameDecode_GetResolution(IWICBitmapFrameDecode *iface, double *pDpiX, double *pDpiY)
Definition: icoformat.c:155
#define DWORD_PTR
Definition: treelist.c:76
HRESULT IcoDibDecoder_CreateInstance(BmpDecoder **ppDecoder)
Definition: bmpdecode.c:1204
HRESULT hr
Definition: shlfolder.c:183
static HRESULT WINAPI IcoFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid, void **ppv)
Definition: icoformat.c:85
void BmpDecoder_FindIconMask(BmpDecoder *This, ULONG *mask_offset, int *topdown)
Definition: bmpdecode.c:1215
HRESULT IcoDecoder_CreateInstance(REFIID iid, void **ppv)
Definition: icoformat.c:759
static ULONG WINAPI IcoDecoder_AddRef(IWICBitmapDecoder *iface)
Definition: icoformat.c:463
WORD idType
Definition: icoformat.c:52
#define WARN(fmt,...)
Definition: debug.h:111
GLintptr offset
Definition: glext.h:5920
REFIID LPVOID * ppv
Definition: atlbase.h:39
static void pixel_set_trans(DWORD *pixel, BOOL transparent)
Definition: icoformat.c:220
static HRESULT WINAPI IcoDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface, IWICMetadataQueryReader **ppIMetadataQueryReader)
Definition: icoformat.c:601
u32_t magic(void)
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
IWICBitmapDecoder IWICBitmapDecoder_iface
Definition: icoformat.c:59
GLuint GLuint end
Definition: gl.h:1545
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define WINCODEC_ERR_STREAMREAD
Definition: winerror.h:3297
#define E_FAIL
Definition: ddrawi.h:102
int32_t INT
Definition: typedefs.h:56
Definition: send.c:47
& rect
Definition: startmenu.cpp:1413
static HRESULT WINAPI IcoFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDecode *iface, IWICMetadataQueryReader **ppIMetadataQueryReader)
Definition: icoformat.c:185
static HRESULT WINAPI IcoDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid, void **ppv)
Definition: icoformat.c:440
ICONHEADER header
Definition: icoformat.c:63
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
static HRESULT WINAPI IcoDecoder_GetFrameCount(IWICBitmapDecoder *iface, UINT *pCount)
Definition: icoformat.c:629
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
unsigned int BOOL
Definition: ntddk_ex.h:94
static HRESULT WINAPI IcoDecoder_GetThumbnail(IWICBitmapDecoder *iface, IWICBitmapSource **ppIThumbnail)
Definition: icoformat.c:622
long LONG
Definition: pedump.c:60
void BmpDecoder_GetWICDecoder(BmpDecoder *This, IWICBitmapDecoder **ppDecoder)
Definition: bmpdecode.c:1209
static HRESULT ReadIcoDib(IStream *stream, IcoFrameDecode *result)
Definition: icoformat.c:226
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
WORD idCount
Definition: icoformat.c:53
static HRESULT WINAPI IcoDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream, WICDecodeOptions cacheOptions)
Definition: icoformat.c:507
static HRESULT WINAPI IcoFrameDecode_GetSize(IWICBitmapFrameDecode *iface, UINT *puiWidth, UINT *puiHeight)
Definition: icoformat.c:135
#define E_INVALIDARG
Definition: ddrawi.h:101
#define WINCODEC_ERR_PALETTEUNAVAILABLE
Definition: winerror.h:3284
double dpiY
Definition: icoformat.c:71
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
static HRESULT WINAPI IcoFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface, IWICBitmapSource **ppIThumbnail)
Definition: icoformat.c:199
smooth NULL
Definition: ftsmooth.c:416
pixelformat
Definition: converter.c:40
GLuint index
Definition: glext.h:6031
BOOL initialized
Definition: icoformat.c:61
INT Height
Definition: wincodec.idl:239
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static const IWICBitmapFrameDecodeVtbl IcoFrameDecode_Vtbl
Definition: icoformat.c:206
static HRESULT WINAPI IcoDecoder_GetColorContexts(IWICBitmapDecoder *iface, UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
Definition: icoformat.c:615
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
static IcoFrameDecode * impl_from_IWICBitmapFrameDecode(IWICBitmapFrameDecode *iface)
Definition: icoformat.c:80
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
LONG HRESULT
Definition: typedefs.h:77
GLenum GLuint GLenum GLsizei length
Definition: glext.h:5579
BYTE * bits
Definition: icoformat.c:72
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:8
struct tagBITMAPCOREHEADER BITMAPCOREHEADER
unsigned short WORD
Definition: ntddk_ex.h:93
DWORD dwDIBSize
Definition: icoformat.c:45
unsigned long DWORD
Definition: ntddk_ex.h:95
IWICBitmapFrameDecode IWICBitmapFrameDecode_iface
Definition: icoformat.c:68
#define WINCODEC_ERR_CODECNOTHUMBNAIL
Definition: winerror.h:3283
CRITICAL_SECTION lock
Definition: icoformat.c:64
int seek(void *fd, ulong off, int mode)
Definition: pe.c:51
int ret
#define WINCODEC_ERR_FRAMEMISSING
Definition: winerror.h:3293
#define index(s, c)
Definition: various.h:29
static HRESULT ReadIcoPng(IStream *stream, IcoFrameDecode *result)
Definition: icoformat.c:391
#define InterlockedDecrement
Definition: armddk.h:52
Definition: parse.h:22
static const char * debug_wic_rect(const WICRect *rect)
uint32_t entry
Definition: isohybrid.c:63
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned char BYTE
Definition: mem.h:68
static ULONG WINAPI IcoDecoder_Release(IWICBitmapDecoder *iface)
Definition: icoformat.c:473
#define WINCODEC_ERR_UNSUPPORTEDOPERATION
Definition: winerror.h:3300
IStream * stream
Definition: icoformat.c:62
static HRESULT WINAPI IcoDecoder_GetFrame(IWICBitmapDecoder *iface, UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
Definition: icoformat.c:645
WINE_DEFAULT_DEBUG_CHANNEL(wincodecs)
static HRESULT WINAPI IcoFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface, WICPixelFormatGUID *pPixelFormat)
Definition: icoformat.c:148
static IcoDecoder * impl_from_IWICBitmapDecoder(IWICBitmapDecoder *iface)
Definition: icoformat.c:75
BYTE bWidth
Definition: icoformat.c:39
HRESULT PngDecoder_CreateInstance(REFIID iid, void **ppv)
Definition: pngformat.c:2177
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
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:1601
static HRESULT WINAPI IcoFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
Definition: icoformat.c:175
static HRESULT WINAPI IcoFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, IWICPalette *pIPalette)
Definition: icoformat.c:168
WICDecodeOptions
Definition: wincodec.idl:27
#define WINCODEC_ERR_WRONGSTATE
Definition: winerror.h:3273
#define S_OK
Definition: intsafe.h:59
static GpStatus get_decoder_info(IStream *stream, const struct image_codec **result)
Definition: image.c:4237
#define InterlockedIncrement
Definition: armddk.h:53
WORD idReserved
Definition: icoformat.c:51
GLsizei GLsizei GLchar * source
Definition: glext.h:6048
static HRESULT WINAPI IcoFrameDecode_GetColorContexts(IWICBitmapFrameDecode *iface, UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
Definition: icoformat.c:192
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
static HRESULT WINAPI IcoDecoder_GetDecoderInfo(IWICBitmapDecoder *iface, IWICBitmapDecoderInfo **ppIDecoderInfo)
Definition: icoformat.c:586
INT Width
Definition: wincodec.idl:238
static HRESULT WINAPI IcoDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *stream, DWORD *capability)
Definition: icoformat.c:491
#define WINCODEC_ERR_BADIMAGE
Definition: winerror.h:3291
unsigned int ULONG
Definition: retypes.h:1
static ULONG WINAPI IcoFrameDecode_Release(IWICBitmapFrameDecode *iface)
Definition: icoformat.c:119
static HRESULT WINAPI IcoDecoder_CopyPalette(IWICBitmapDecoder *iface, IWICPalette *pIPalette)
Definition: icoformat.c:594
HRESULT WINAPI WICConvertBitmapSource(REFWICPixelFormatGUID dstFormat, IWICBitmapSource *pISrc, IWICBitmapSource **ppIDst)
Definition: info.c:2474
static const IWICBitmapDecoderVtbl IcoDecoder_Vtbl
Definition: icoformat.c:742
HRESULT StreamImpl_Create(IWICStream **stream)
Definition: stream.c:1150
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
LONG ref
Definition: icoformat.c:60
static HRESULT WINAPI IcoDecoder_GetPreview(IWICBitmapDecoder *iface, IWICBitmapSource **ppIBitmapSource)
Definition: icoformat.c:608
static HRESULT WINAPI IcoDecoder_GetContainerFormat(IWICBitmapDecoder *iface, GUID *pguidContainerFormat)
Definition: icoformat.c:579
_Out_ LPRECT prc
Definition: ntgdi.h:1658
GLuint64EXT * result
Definition: glext.h:11304
static ULONG WINAPI IcoFrameDecode_AddRef(IWICBitmapFrameDecode *iface)
Definition: icoformat.c:109
#define HeapFree(x, y, z)
Definition: compat.h:394
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
WORD wBitCount
Definition: icoformat.c:44
#define SUCCEEDED(hr)
Definition: intsafe.h:57
WORD wPlanes
Definition: icoformat.c:43
BYTE bHeight
Definition: icoformat.c:40