[WINDOWSCODECS_WINETEST] Add a PCH.
[reactos.git] / modules / rostests / winetests / windowscodecs / bmpformat.c
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 "precomp.h"
20
21 static const char testbmp_24bpp[] = {
22 /* BITMAPFILEHEADER */
23 66,77, /* "BM" */
24 78,0,0,0, /* file size */
25 0,0,0,0, /* reserved */
26 54,0,0,0, /* offset to bits */
27 /* BITMAPINFOHEADER */
28 40,0,0,0, /* header size */
29 2,0,0,0, /* width */
30 3,0,0,0, /* height */
31 1,0, /* planes */
32 24,0, /* bit count */
33 0,0,0,0, /* compression */
34 0,0,0,0, /* image size */
35 0x74,0x12,0,0, /* X pels per meter => 120 dpi */
36 0,0,0,0, /* Y pels per meter */
37 0,0,0,0, /* colors used */
38 0,0,0,0, /* colors important */
39 /* bits */
40 0,0,0, 0,255,0, 0,0,
41 255,0,0, 255,255,0, 0,0,
42 255,0,255, 255,255,255, 0,0
43 };
44
45 static void test_decode_24bpp(void)
46 {
47 IWICBitmapDecoder *decoder, *decoder2;
48 IWICBitmapFrameDecode *framedecode;
49 IWICMetadataQueryReader *queryreader;
50 IWICColorContext *colorcontext;
51 IWICBitmapSource *thumbnail;
52 HRESULT hr;
53 HGLOBAL hbmpdata;
54 char *bmpdata;
55 IStream *bmpstream;
56 DWORD capability=0;
57 GUID guidresult;
58 UINT count=0, width=0, height=0;
59 double dpiX, dpiY;
60 BYTE imagedata[36] = {1};
61 const BYTE expected_imagedata[36] = {
62 255,0,255, 255,255,255,
63 255,0,0, 255,255,0,
64 0,0,0, 0,255,0};
65 WICRect rc;
66
67 hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER,
68 &IID_IWICBitmapDecoder, (void**)&decoder);
69 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
70 if (FAILED(hr)) return;
71
72 hbmpdata = GlobalAlloc(GMEM_MOVEABLE, sizeof(testbmp_24bpp));
73 ok(hbmpdata != 0, "GlobalAlloc failed\n");
74 if (hbmpdata)
75 {
76 bmpdata = GlobalLock(hbmpdata);
77 memcpy(bmpdata, testbmp_24bpp, sizeof(testbmp_24bpp));
78 GlobalUnlock(hbmpdata);
79
80 hr = CreateStreamOnHGlobal(hbmpdata, FALSE, &bmpstream);
81 ok(SUCCEEDED(hr), "CreateStreamOnHGlobal failed, hr=%x\n", hr);
82 if (SUCCEEDED(hr))
83 {
84 hr = IWICBitmapDecoder_Initialize(decoder, bmpstream, WICDecodeMetadataCacheOnLoad);
85 ok(hr == S_OK || broken(hr == WINCODEC_ERR_BADIMAGE) /* XP */, "Initialize failed, hr=%x\n", hr);
86 if (FAILED(hr))
87 {
88 win_skip("BMP decoder failed to initialize\n");
89 GlobalFree(hbmpdata);
90 IWICBitmapDecoder_Release(decoder);
91 return;
92 }
93
94 hr = IWICBitmapDecoder_GetContainerFormat(decoder, &guidresult);
95 ok(SUCCEEDED(hr), "GetContainerFormat failed, hr=%x\n", hr);
96 ok(IsEqualGUID(&guidresult, &GUID_ContainerFormatBmp), "unexpected container format\n");
97
98 hr = IWICBitmapDecoder_GetMetadataQueryReader(decoder, &queryreader);
99 ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "expected WINCODEC_ERR_UNSUPPORTEDOPERATION, got %x\n", hr);
100
101 hr = IWICBitmapDecoder_GetColorContexts(decoder, 1, &colorcontext, &count);
102 ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "expected WINCODEC_ERR_UNSUPPORTEDOPERATION, got %x\n", hr);
103
104 hr = IWICBitmapDecoder_GetThumbnail(decoder, &thumbnail);
105 ok(hr == WINCODEC_ERR_CODECNOTHUMBNAIL, "expected WINCODEC_ERR_CODECNOTHUMBNAIL, got %x\n", hr);
106
107 hr = IWICBitmapDecoder_GetPreview(decoder, &thumbnail);
108 ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "expected WINCODEC_ERR_UNSUPPORTEDOPERATION, got %x\n", hr);
109
110 hr = IWICBitmapDecoder_GetFrameCount(decoder, &count);
111 ok(SUCCEEDED(hr), "GetFrameCount failed, hr=%x\n", hr);
112 ok(count == 1, "unexpected count %u\n", count);
113
114 hr = IWICBitmapDecoder_GetFrame(decoder, 1, &framedecode);
115 ok(hr == E_INVALIDARG || hr == WINCODEC_ERR_FRAMEMISSING, "GetFrame returned %x\n", hr);
116
117 hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
118 ok(SUCCEEDED(hr), "GetFrame failed, hr=%x\n", hr);
119 if (SUCCEEDED(hr))
120 {
121 IWICImagingFactory *factory;
122 IWICPalette *palette;
123
124 hr = IWICBitmapFrameDecode_GetSize(framedecode, &width, &height);
125 ok(SUCCEEDED(hr), "GetSize failed, hr=%x\n", hr);
126 ok(width == 2, "expected width=2, got %u\n", width);
127 ok(height == 3, "expected height=2, got %u\n", height);
128
129 hr = IWICBitmapFrameDecode_GetResolution(framedecode, &dpiX, &dpiY);
130 ok(SUCCEEDED(hr), "GetResolution failed, hr=%x\n", hr);
131 ok(dpiX == 96.0, "expected dpiX=96.0, got %f\n", dpiX);
132 ok(dpiY == 96.0, "expected dpiY=96.0, got %f\n", dpiY);
133
134 hr = IWICBitmapFrameDecode_GetPixelFormat(framedecode, &guidresult);
135 ok(SUCCEEDED(hr), "GetPixelFormat failed, hr=%x\n", hr);
136 ok(IsEqualGUID(&guidresult, &GUID_WICPixelFormat24bppBGR), "unexpected pixel format\n");
137
138 hr = IWICBitmapFrameDecode_GetMetadataQueryReader(framedecode, &queryreader);
139 ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "expected WINCODEC_ERR_UNSUPPORTEDOPERATION, got %x\n", hr);
140
141 hr = IWICBitmapFrameDecode_GetColorContexts(framedecode, 1, &colorcontext, &count);
142 ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "expected WINCODEC_ERR_UNSUPPORTEDOPERATION, got %x\n", hr);
143
144 hr = IWICBitmapFrameDecode_GetThumbnail(framedecode, &thumbnail);
145 ok(hr == WINCODEC_ERR_CODECNOTHUMBNAIL, "expected WINCODEC_ERR_CODECNOTHUMBNAIL, got %x\n", hr);
146
147 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
148 &IID_IWICImagingFactory, (void**)&factory);
149 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
150 if (SUCCEEDED(hr))
151 {
152 hr = IWICImagingFactory_CreatePalette(factory, &palette);
153 ok(SUCCEEDED(hr), "CreatePalette failed, hr=%x\n", hr);
154 if (SUCCEEDED(hr))
155 {
156 hr = IWICBitmapDecoder_CopyPalette(decoder, palette);
157 ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %x\n", hr);
158
159 hr = IWICBitmapFrameDecode_CopyPalette(framedecode, palette);
160 ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %x\n", hr);
161
162 IWICPalette_Release(palette);
163 }
164
165 IWICImagingFactory_Release(factory);
166 }
167
168 rc.X = 0;
169 rc.Y = 0;
170 rc.Width = 3;
171 rc.Height = 3;
172 hr = IWICBitmapFrameDecode_CopyPixels(framedecode, &rc, 6, sizeof(imagedata), imagedata);
173 ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %x\n", hr);
174
175 rc.X = -1;
176 rc.Y = 0;
177 rc.Width = 2;
178 rc.Height = 3;
179 hr = IWICBitmapFrameDecode_CopyPixels(framedecode, &rc, 6, sizeof(imagedata), imagedata);
180 ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %x\n", hr);
181
182 rc.X = 0;
183 rc.Y = 0;
184 rc.Width = 2;
185 rc.Height = 3;
186 hr = IWICBitmapFrameDecode_CopyPixels(framedecode, &rc, 4, sizeof(imagedata), imagedata);
187 ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %x\n", hr);
188
189 rc.X = 0;
190 rc.Y = 0;
191 rc.Width = 2;
192 rc.Height = 3;
193 hr = IWICBitmapFrameDecode_CopyPixels(framedecode, &rc, 4, 5, imagedata);
194 ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %x\n", hr);
195
196 rc.X = 0;
197 rc.Y = 0;
198 rc.Width = 2;
199 rc.Height = 3;
200 hr = IWICBitmapFrameDecode_CopyPixels(framedecode, &rc, 6, sizeof(imagedata), imagedata);
201 ok(SUCCEEDED(hr), "CopyPixels failed, hr=%x\n", hr);
202 ok(!memcmp(imagedata, expected_imagedata, sizeof(imagedata)), "unexpected image data\n");
203
204 hr = IWICBitmapFrameDecode_CopyPixels(framedecode, NULL, 6, sizeof(imagedata), imagedata);
205 ok(SUCCEEDED(hr), "CopyPixels(rect=NULL) failed, hr=%x\n", hr);
206 ok(!memcmp(imagedata, expected_imagedata, sizeof(imagedata)), "unexpected image data\n");
207
208 IWICBitmapFrameDecode_Release(framedecode);
209 }
210
211 /* cannot initialize twice */
212 hr = IWICBitmapDecoder_Initialize(decoder, bmpstream, WICDecodeMetadataCacheOnLoad);
213 ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, hr=%x\n", hr);
214
215 /* cannot querycapability after initialize */
216 hr = IWICBitmapDecoder_QueryCapability(decoder, bmpstream, &capability);
217 ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, hr=%x\n", hr);
218
219 hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER,
220 &IID_IWICBitmapDecoder, (void**)&decoder2);
221 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
222 if (SUCCEEDED(hr))
223 {
224 hr = IWICBitmapDecoder_QueryCapability(decoder2, bmpstream, &capability);
225 ok(hr == S_OK, "QueryCapability failed, hr=%x\n", hr);
226 ok(capability == (WICBitmapDecoderCapabilityCanDecodeAllImages),
227 "unexpected capabilities: %x\n", capability);
228
229 /* cannot initialize after querycapability */
230 hr = IWICBitmapDecoder_Initialize(decoder2, bmpstream, WICDecodeMetadataCacheOnLoad);
231 ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, hr=%x\n", hr);
232
233 /* cannot querycapability twice */
234 hr = IWICBitmapDecoder_QueryCapability(decoder2, bmpstream, &capability);
235 ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, hr=%x\n", hr);
236
237 IWICBitmapDecoder_Release(decoder2);
238 }
239
240 IStream_Release(bmpstream);
241 }
242
243 GlobalFree(hbmpdata);
244 }
245
246 IWICBitmapDecoder_Release(decoder);
247 }
248
249 static const char testbmp_1bpp[] = {
250 /* BITMAPFILEHEADER */
251 66,77, /* "BM" */
252 40,0,0,0, /* file size */
253 0,0,0,0, /* reserved */
254 32,0,0,0, /* offset to bits */
255 /* BITMAPCOREHEADER */
256 12,0,0,0, /* header size */
257 2,0, /* width */
258 2,0, /* height */
259 1,0, /* planes */
260 1,0, /* bit count */
261 /* color table */
262 255,0,0,
263 0,255,0,
264 /* bits */
265 0xc0,0,0,0,
266 0x80,0,0,0
267 };
268
269 static void test_decode_1bpp(void)
270 {
271 IWICBitmapDecoder *decoder, *decoder2;
272 IWICBitmapFrameDecode *framedecode;
273 HRESULT hr;
274 HGLOBAL hbmpdata;
275 char *bmpdata;
276 IStream *bmpstream;
277 DWORD capability=0;
278 GUID guidresult;
279 UINT count=0, width=0, height=0;
280 double dpiX, dpiY;
281 BYTE imagedata[2] = {1};
282 const BYTE expected_imagedata[2] = {0x80,0xc0};
283 WICColor palettedata[2] = {1};
284 const WICColor expected_palettedata[2] = {0xff0000ff,0xff00ff00};
285 WICRect rc;
286
287 hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER,
288 &IID_IWICBitmapDecoder, (void**)&decoder);
289 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
290 if (FAILED(hr)) return;
291
292 hbmpdata = GlobalAlloc(GMEM_MOVEABLE, sizeof(testbmp_1bpp));
293 ok(hbmpdata != 0, "GlobalAlloc failed\n");
294 if (hbmpdata)
295 {
296 bmpdata = GlobalLock(hbmpdata);
297 memcpy(bmpdata, testbmp_1bpp, sizeof(testbmp_1bpp));
298 GlobalUnlock(hbmpdata);
299
300 hr = CreateStreamOnHGlobal(hbmpdata, FALSE, &bmpstream);
301 ok(SUCCEEDED(hr), "CreateStreamOnHGlobal failed, hr=%x\n", hr);
302 if (SUCCEEDED(hr))
303 {
304 hr = IWICBitmapDecoder_Initialize(decoder, bmpstream, WICDecodeMetadataCacheOnLoad);
305 ok(hr == S_OK, "Initialize failed, hr=%x\n", hr);
306
307 hr = IWICBitmapDecoder_GetContainerFormat(decoder, &guidresult);
308 ok(SUCCEEDED(hr), "GetContainerFormat failed, hr=%x\n", hr);
309 ok(IsEqualGUID(&guidresult, &GUID_ContainerFormatBmp), "unexpected container format\n");
310
311 hr = IWICBitmapDecoder_GetFrameCount(decoder, &count);
312 ok(SUCCEEDED(hr), "GetFrameCount failed, hr=%x\n", hr);
313 ok(count == 1, "unexpected count %u\n", count);
314
315 hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
316 ok(SUCCEEDED(hr), "GetFrame failed, hr=%x\n", hr);
317 if (SUCCEEDED(hr))
318 {
319 IWICImagingFactory *factory;
320 IWICPalette *palette;
321
322 hr = IWICBitmapFrameDecode_GetSize(framedecode, &width, &height);
323 ok(SUCCEEDED(hr), "GetSize failed, hr=%x\n", hr);
324 ok(width == 2, "expected width=2, got %u\n", width);
325 ok(height == 2, "expected height=2, got %u\n", height);
326
327 hr = IWICBitmapFrameDecode_GetResolution(framedecode, &dpiX, &dpiY);
328 ok(SUCCEEDED(hr), "GetResolution failed, hr=%x\n", hr);
329 ok(dpiX == 96.0, "expected dpiX=96.0, got %f\n", dpiX);
330 ok(dpiY == 96.0, "expected dpiY=96.0, got %f\n", dpiY);
331
332 hr = IWICBitmapFrameDecode_GetPixelFormat(framedecode, &guidresult);
333 ok(SUCCEEDED(hr), "GetPixelFormat failed, hr=%x\n", hr);
334 ok(IsEqualGUID(&guidresult, &GUID_WICPixelFormat1bppIndexed), "unexpected pixel format\n");
335
336 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
337 &IID_IWICImagingFactory, (void**)&factory);
338 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
339 if (SUCCEEDED(hr))
340 {
341 hr = IWICImagingFactory_CreatePalette(factory, &palette);
342 ok(SUCCEEDED(hr), "CreatePalette failed, hr=%x\n", hr);
343 if (SUCCEEDED(hr))
344 {
345 hr = IWICBitmapDecoder_CopyPalette(decoder, palette);
346 ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %x\n", hr);
347
348 hr = IWICBitmapFrameDecode_CopyPalette(framedecode, palette);
349 ok(SUCCEEDED(hr), "CopyPalette failed, hr=%x\n", hr);
350
351 hr = IWICPalette_GetColorCount(palette, &count);
352 ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
353 ok(count == 2, "expected count=2, got %u\n", count);
354
355 hr = IWICPalette_GetColors(palette, 2, palettedata, &count);
356 ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
357 ok(count == 2, "expected count=2, got %u\n", count);
358 ok(!memcmp(palettedata, expected_palettedata, sizeof(palettedata)), "unexpected palette data\n");
359
360 IWICPalette_Release(palette);
361 }
362
363 IWICImagingFactory_Release(factory);
364 }
365
366 rc.X = 0;
367 rc.Y = 0;
368 rc.Width = 2;
369 rc.Height = 2;
370 hr = IWICBitmapFrameDecode_CopyPixels(framedecode, &rc, 1, sizeof(imagedata), imagedata);
371 ok(SUCCEEDED(hr), "CopyPixels failed, hr=%x\n", hr);
372 ok(!memcmp(imagedata, expected_imagedata, sizeof(imagedata)), "unexpected image data\n");
373
374 IWICBitmapFrameDecode_Release(framedecode);
375 }
376
377 hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER,
378 &IID_IWICBitmapDecoder, (void**)&decoder2);
379 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
380 if (SUCCEEDED(hr))
381 {
382 hr = IWICBitmapDecoder_QueryCapability(decoder2, bmpstream, &capability);
383 ok(hr == S_OK, "QueryCapability failed, hr=%x\n", hr);
384 ok(capability == (WICBitmapDecoderCapabilityCanDecodeAllImages),
385 "unexpected capabilities: %x\n", capability);
386 IWICBitmapDecoder_Release(decoder2);
387 }
388
389 IStream_Release(bmpstream);
390 }
391
392 GlobalFree(hbmpdata);
393 }
394
395 IWICBitmapDecoder_Release(decoder);
396 }
397
398 static const char testbmp_4bpp[] = {
399 /* BITMAPFILEHEADER */
400 66,77, /* "BM" */
401 82,0,0,0, /* file size */
402 0,0,0,0, /* reserved */
403 74,0,0,0, /* offset to bits */
404 /* BITMAPINFOHEADER */
405 40,0,0,0, /* header size */
406 2,0,0,0, /* width */
407 254,255,255,255, /* height = -2 */
408 1,0, /* planes */
409 4,0, /* bit count */
410 0,0,0,0, /* compression = BI_RGB */
411 0,0,0,0, /* image size = 0 */
412 16,39,0,0, /* X pixels per meter = 10000 */
413 32,78,0,0, /* Y pixels per meter = 20000 */
414 5,0,0,0, /* colors used */
415 5,0,0,0, /* colors important */
416 /* color table */
417 255,0,0,0,
418 0,255,0,255,
419 0,0,255,23,
420 128,0,128,1,
421 255,255,255,0,
422 /* bits */
423 0x01,0,0,0,
424 0x23,0,0,0,
425 };
426
427 static void test_decode_4bpp(void)
428 {
429 IWICBitmapDecoder *decoder, *decoder2;
430 IWICBitmapFrameDecode *framedecode;
431 HRESULT hr;
432 HGLOBAL hbmpdata;
433 char *bmpdata;
434 IStream *bmpstream;
435 DWORD capability=0;
436 GUID guidresult;
437 UINT count=0, width=0, height=0;
438 double dpiX, dpiY;
439 BYTE imagedata[2] = {1};
440 const BYTE expected_imagedata[2] = {0x01,0x23};
441 WICColor palettedata[5] = {1};
442 const WICColor expected_palettedata[5] =
443 {0xff0000ff,0xff00ff00,0xffff0000,0xff800080,0xffffffff};
444 WICRect rc;
445
446 hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER,
447 &IID_IWICBitmapDecoder, (void**)&decoder);
448 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
449 if (FAILED(hr)) return;
450
451 hbmpdata = GlobalAlloc(GMEM_MOVEABLE, sizeof(testbmp_4bpp));
452 ok(hbmpdata != 0, "GlobalAlloc failed\n");
453 if (hbmpdata)
454 {
455 bmpdata = GlobalLock(hbmpdata);
456 memcpy(bmpdata, testbmp_4bpp, sizeof(testbmp_4bpp));
457 GlobalUnlock(hbmpdata);
458
459 hr = CreateStreamOnHGlobal(hbmpdata, FALSE, &bmpstream);
460 ok(SUCCEEDED(hr), "CreateStreamOnHGlobal failed, hr=%x\n", hr);
461 if (SUCCEEDED(hr))
462 {
463 hr = IWICBitmapDecoder_Initialize(decoder, bmpstream, WICDecodeMetadataCacheOnLoad);
464 ok(hr == S_OK, "Initialize failed, hr=%x\n", hr);
465
466 hr = IWICBitmapDecoder_GetContainerFormat(decoder, &guidresult);
467 ok(SUCCEEDED(hr), "GetContainerFormat failed, hr=%x\n", hr);
468 ok(IsEqualGUID(&guidresult, &GUID_ContainerFormatBmp), "unexpected container format\n");
469
470 hr = IWICBitmapDecoder_GetFrameCount(decoder, &count);
471 ok(SUCCEEDED(hr), "GetFrameCount failed, hr=%x\n", hr);
472 ok(count == 1, "unexpected count %u\n", count);
473
474 hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
475 ok(SUCCEEDED(hr), "GetFrame failed, hr=%x\n", hr);
476 if (SUCCEEDED(hr))
477 {
478 IWICImagingFactory *factory;
479 IWICPalette *palette;
480
481 hr = IWICBitmapFrameDecode_GetSize(framedecode, &width, &height);
482 ok(SUCCEEDED(hr), "GetSize failed, hr=%x\n", hr);
483 ok(width == 2, "expected width=2, got %u\n", width);
484 ok(height == 2, "expected height=2, got %u\n", height);
485
486 hr = IWICBitmapFrameDecode_GetResolution(framedecode, &dpiX, &dpiY);
487 ok(SUCCEEDED(hr), "GetResolution failed, hr=%x\n", hr);
488 ok(fabs(dpiX - 254.0) < 0.01, "expected dpiX=96.0, got %f\n", dpiX);
489 ok(fabs(dpiY - 508.0) < 0.01, "expected dpiY=96.0, got %f\n", dpiY);
490
491 hr = IWICBitmapFrameDecode_GetPixelFormat(framedecode, &guidresult);
492 ok(SUCCEEDED(hr), "GetPixelFormat failed, hr=%x\n", hr);
493 ok(IsEqualGUID(&guidresult, &GUID_WICPixelFormat4bppIndexed), "unexpected pixel format\n");
494
495 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
496 &IID_IWICImagingFactory, (void**)&factory);
497 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
498 if (SUCCEEDED(hr))
499 {
500 hr = IWICImagingFactory_CreatePalette(factory, &palette);
501 ok(SUCCEEDED(hr), "CreatePalette failed, hr=%x\n", hr);
502 if (SUCCEEDED(hr))
503 {
504 hr = IWICBitmapDecoder_CopyPalette(decoder, palette);
505 ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %x\n", hr);
506
507 hr = IWICBitmapFrameDecode_CopyPalette(framedecode, palette);
508 ok(SUCCEEDED(hr), "CopyPalette failed, hr=%x\n", hr);
509
510 hr = IWICPalette_GetColorCount(palette, &count);
511 ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
512 ok(count == 5, "expected count=5, got %u\n", count);
513
514 hr = IWICPalette_GetColors(palette, 5, palettedata, &count);
515 ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
516 ok(count == 5, "expected count=5, got %u\n", count);
517 ok(!memcmp(palettedata, expected_palettedata, sizeof(palettedata)), "unexpected palette data\n");
518
519 IWICPalette_Release(palette);
520 }
521
522 IWICImagingFactory_Release(factory);
523 }
524
525 rc.X = 0;
526 rc.Y = 0;
527 rc.Width = 2;
528 rc.Height = 2;
529 hr = IWICBitmapFrameDecode_CopyPixels(framedecode, &rc, 1, sizeof(imagedata), imagedata);
530 ok(SUCCEEDED(hr), "CopyPixels failed, hr=%x\n", hr);
531 ok(!memcmp(imagedata, expected_imagedata, sizeof(imagedata)), "unexpected image data\n");
532
533 IWICBitmapFrameDecode_Release(framedecode);
534 }
535
536 hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER,
537 &IID_IWICBitmapDecoder, (void**)&decoder2);
538 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
539 if (SUCCEEDED(hr))
540 {
541 hr = IWICBitmapDecoder_QueryCapability(decoder2, bmpstream, &capability);
542 ok(hr == S_OK, "QueryCapability failed, hr=%x\n", hr);
543 ok(capability == (WICBitmapDecoderCapabilityCanDecodeAllImages),
544 "unexpected capabilities: %x\n", capability);
545 IWICBitmapDecoder_Release(decoder2);
546 }
547
548 IStream_Release(bmpstream);
549 }
550
551 GlobalFree(hbmpdata);
552 }
553
554 IWICBitmapDecoder_Release(decoder);
555 }
556
557 static const char testbmp_rle8[] = {
558 /* BITMAPFILEHEADER */
559 66,77, /* "BM" */
560 202,0,0,0, /* file size */
561 0,0,0,0, /* reserved */
562 122,0,0,0, /* offset to bits */
563 /* BITMAPINFOHEADER */
564 40,0,0,0, /* header size */
565 8,0,0,0, /* width */
566 8,0,0,0, /* height */
567 1,0, /* planes */
568 8,0, /* bit count */
569 1,0,0,0, /* compression = BI_RLE8 */
570 80,0,0,0, /* image size */
571 19,11,0,0, /* X pixels per meter */
572 19,11,0,0, /* Y pixels per meter */
573 17,0,0,0, /* colors used */
574 17,0,0,0, /* colors important */
575 /* color table */
576 0,0,0,0,
577 17,17,17,0,
578 255,0,0,0,
579 34,34,34,0,
580 0,0,204,0,
581 0,0,221,0,
582 0,0,238,0,
583 51,51,51,0,
584 0,0,255,0,
585 68,68,68,0,
586 255,0,255,0,
587 85,85,85,0,
588 0,204,0,0,
589 0,221,0,0,
590 0,238,0,0,
591 0,255,0,0,
592 255,255,255,0,
593 /* bits */
594 4,15,0,4,11,9,9,0,0,0,4,14,0,4,3,10,10,7,0,0,4,13,0,4,3,10,10,7,0,0,4,12,0,4,0,1,1,11,0,0,0,4,16,2,16,2,4,4,0,0,0,4,2,16,2,16,4,5,0,0,0,4,16,2,16,2,4,6,0,0,0,4,2,16,2,16,4,8,0,1
595 };
596
597 static void test_decode_rle8(void)
598 {
599 IWICBitmapDecoder *decoder, *decoder2;
600 IWICBitmapFrameDecode *framedecode;
601 HRESULT hr;
602 HGLOBAL hbmpdata;
603 char *bmpdata;
604 IStream *bmpstream;
605 DWORD capability=0;
606 GUID guidresult;
607 UINT count=0, width=0, height=0;
608 double dpiX, dpiY;
609 DWORD imagedata[64] = {1};
610 const DWORD expected_imagedata[64] = {
611 0x0000ff,0xffffff,0x0000ff,0xffffff,0xff0000,0xff0000,0xff0000,0xff0000,
612 0xffffff,0x0000ff,0xffffff,0x0000ff,0xee0000,0xee0000,0xee0000,0xee0000,
613 0x0000ff,0xffffff,0x0000ff,0xffffff,0xdd0000,0xdd0000,0xdd0000,0xdd0000,
614 0xffffff,0x0000ff,0xffffff,0x0000ff,0xcc0000,0xcc0000,0xcc0000,0xcc0000,
615 0x00cc00,0x00cc00,0x00cc00,0x00cc00,0x000000,0x111111,0x111111,0x555555,
616 0x00dd00,0x00dd00,0x00dd00,0x00dd00,0x222222,0xff00ff,0xff00ff,0x333333,
617 0x00ee00,0x00ee00,0x00ee00,0x00ee00,0x222222,0xff00ff,0xff00ff,0x333333,
618 0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x555555,0x444444,0x444444,0x000000};
619 WICColor palettedata[17] = {1};
620 const WICColor expected_palettedata[17] = {
621 0xff000000,0xff111111,0xff0000ff,0xff222222,0xffcc0000,0xffdd0000,
622 0xffee0000,0xff333333,0xffff0000,0xff444444,0xffff00ff,0xff555555,
623 0xff00cc00,0xff00dd00,0xff00ee00,0xff00ff00,0xffffffff};
624 WICRect rc;
625
626 hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER,
627 &IID_IWICBitmapDecoder, (void**)&decoder);
628 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
629 if (FAILED(hr)) return;
630
631 hbmpdata = GlobalAlloc(GMEM_MOVEABLE, sizeof(testbmp_rle8));
632 ok(hbmpdata != 0, "GlobalAlloc failed\n");
633 if (hbmpdata)
634 {
635 bmpdata = GlobalLock(hbmpdata);
636 memcpy(bmpdata, testbmp_rle8, sizeof(testbmp_rle8));
637 GlobalUnlock(hbmpdata);
638
639 hr = CreateStreamOnHGlobal(hbmpdata, FALSE, &bmpstream);
640 ok(SUCCEEDED(hr), "CreateStreamOnHGlobal failed, hr=%x\n", hr);
641 if (SUCCEEDED(hr))
642 {
643 hr = IWICBitmapDecoder_Initialize(decoder, bmpstream, WICDecodeMetadataCacheOnLoad);
644 ok(hr == S_OK, "Initialize failed, hr=%x\n", hr);
645
646 hr = IWICBitmapDecoder_GetContainerFormat(decoder, &guidresult);
647 ok(SUCCEEDED(hr), "GetContainerFormat failed, hr=%x\n", hr);
648 ok(IsEqualGUID(&guidresult, &GUID_ContainerFormatBmp), "unexpected container format\n");
649
650 hr = IWICBitmapDecoder_GetFrameCount(decoder, &count);
651 ok(SUCCEEDED(hr), "GetFrameCount failed, hr=%x\n", hr);
652 ok(count == 1, "unexpected count %u\n", count);
653
654 hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
655 ok(SUCCEEDED(hr), "GetFrame failed, hr=%x\n", hr);
656 if (SUCCEEDED(hr))
657 {
658 IWICImagingFactory *factory;
659 IWICPalette *palette;
660
661 hr = IWICBitmapFrameDecode_GetSize(framedecode, &width, &height);
662 ok(SUCCEEDED(hr), "GetSize failed, hr=%x\n", hr);
663 ok(width == 8, "expected width=8, got %u\n", width);
664 ok(height == 8, "expected height=8, got %u\n", height);
665
666 hr = IWICBitmapFrameDecode_GetResolution(framedecode, &dpiX, &dpiY);
667 ok(SUCCEEDED(hr), "GetResolution failed, hr=%x\n", hr);
668 ok(fabs(dpiX - 72.0) < 0.01, "expected dpiX=96.0, got %f\n", dpiX);
669 ok(fabs(dpiY - 72.0) < 0.01, "expected dpiY=96.0, got %f\n", dpiY);
670
671 hr = IWICBitmapFrameDecode_GetPixelFormat(framedecode, &guidresult);
672 ok(SUCCEEDED(hr), "GetPixelFormat failed, hr=%x\n", hr);
673 ok(IsEqualGUID(&guidresult, &GUID_WICPixelFormat32bppBGR), "unexpected pixel format\n");
674
675 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
676 &IID_IWICImagingFactory, (void**)&factory);
677 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
678 if (SUCCEEDED(hr))
679 {
680 hr = IWICImagingFactory_CreatePalette(factory, &palette);
681 ok(SUCCEEDED(hr), "CreatePalette failed, hr=%x\n", hr);
682 if (SUCCEEDED(hr))
683 {
684 hr = IWICBitmapDecoder_CopyPalette(decoder, palette);
685 ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %x\n", hr);
686
687 hr = IWICBitmapFrameDecode_CopyPalette(framedecode, palette);
688 ok(SUCCEEDED(hr), "CopyPalette failed, hr=%x\n", hr);
689
690 hr = IWICPalette_GetColorCount(palette, &count);
691 ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
692 ok(count == 17, "expected count=17, got %u\n", count);
693
694 hr = IWICPalette_GetColors(palette, 17, palettedata, &count);
695 ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
696 ok(count == 17, "expected count=17, got %u\n", count);
697 ok(!memcmp(palettedata, expected_palettedata, sizeof(palettedata)), "unexpected palette data\n");
698
699 IWICPalette_Release(palette);
700 }
701
702 IWICImagingFactory_Release(factory);
703 }
704
705 rc.X = 0;
706 rc.Y = 0;
707 rc.Width = 8;
708 rc.Height = 8;
709 hr = IWICBitmapFrameDecode_CopyPixels(framedecode, &rc, 32, sizeof(imagedata), (BYTE*)imagedata);
710 ok(SUCCEEDED(hr), "CopyPixels failed, hr=%x\n", hr);
711 ok(!memcmp(imagedata, expected_imagedata, sizeof(imagedata)), "unexpected image data\n");
712
713 IWICBitmapFrameDecode_Release(framedecode);
714 }
715
716 hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER,
717 &IID_IWICBitmapDecoder, (void**)&decoder2);
718 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
719 if (SUCCEEDED(hr))
720 {
721 hr = IWICBitmapDecoder_QueryCapability(decoder2, bmpstream, &capability);
722 ok(hr == S_OK, "QueryCapability failed, hr=%x\n", hr);
723 ok(capability == (WICBitmapDecoderCapabilityCanDecodeAllImages),
724 "unexpected capabilities: %x\n", capability);
725 IWICBitmapDecoder_Release(decoder2);
726 }
727
728 IStream_Release(bmpstream);
729 }
730
731 GlobalFree(hbmpdata);
732 }
733
734 IWICBitmapDecoder_Release(decoder);
735 }
736
737 static const char testbmp_rle4[] = {
738 /* BITMAPFILEHEADER */
739 66,77, /* "BM" */
740 142,0,0,0, /* file size */
741 0,0,0,0, /* reserved */
742 78,0,0,0, /* offset to bits */
743 /* BITMAPINFOHEADER */
744 40,0,0,0, /* header size */
745 8,0,0,0, /* width */
746 8,0,0,0, /* height */
747 1,0, /* planes */
748 4,0, /* bit count */
749 2,0,0,0, /* compression = BI_RLE4 */
750 64,0,0,0, /* image size */
751 19,11,0,0, /* X pixels per meter */
752 19,11,0,0, /* Y pixels per meter */
753 6,0,0,0, /* colors used */
754 6,0,0,0, /* colors important */
755 /* color table */
756 0,0,0,0,
757 255,0,0,0,
758 0,0,255,0,
759 255,0,255,0,
760 0,255,0,0,
761 255,255,255,0,
762 /* bits */
763 0,8,68,68,0,0,0,0,0,8,68,68,3,48,0,0,0,8,68,68,3,48,0,0,0,8,68,68,0,0,0,0,0,8,81,81,34,34,0,0,0,8,21,21,34,34,0,0,0,8,81,81,34,34,0,0,0,8,21,21,34,34,0,1
764 };
765
766 static void test_decode_rle4(void)
767 {
768 IWICBitmapDecoder *decoder, *decoder2;
769 IWICBitmapFrameDecode *framedecode;
770 HRESULT hr;
771 HGLOBAL hbmpdata;
772 char *bmpdata;
773 IStream *bmpstream;
774 DWORD capability=0;
775 GUID guidresult;
776 UINT count=0, width=0, height=0;
777 double dpiX, dpiY;
778 DWORD imagedata[64] = {1};
779 const DWORD expected_imagedata[64] = {
780 0x0000ff,0xffffff,0x0000ff,0xffffff,0xff0000,0xff0000,0xff0000,0xff0000,
781 0xffffff,0x0000ff,0xffffff,0x0000ff,0xff0000,0xff0000,0xff0000,0xff0000,
782 0x0000ff,0xffffff,0x0000ff,0xffffff,0xff0000,0xff0000,0xff0000,0xff0000,
783 0xffffff,0x0000ff,0xffffff,0x0000ff,0xff0000,0xff0000,0xff0000,0xff0000,
784 0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x000000,0x000000,0x000000,
785 0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0xff00ff,0xff00ff,0x000000,
786 0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0xff00ff,0xff00ff,0x000000,
787 0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x000000,0x000000,0x000000};
788 WICColor palettedata[6] = {1};
789 const WICColor expected_palettedata[6] = {
790 0xff000000,0xff0000ff,0xffff0000,0xffff00ff,0xff00ff00,0xffffffff};
791 WICRect rc;
792
793 hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER,
794 &IID_IWICBitmapDecoder, (void**)&decoder);
795 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
796 if (FAILED(hr)) return;
797
798 hbmpdata = GlobalAlloc(GMEM_MOVEABLE, sizeof(testbmp_rle4));
799 ok(hbmpdata != 0, "GlobalAlloc failed\n");
800 if (hbmpdata)
801 {
802 bmpdata = GlobalLock(hbmpdata);
803 memcpy(bmpdata, testbmp_rle4, sizeof(testbmp_rle4));
804 GlobalUnlock(hbmpdata);
805
806 hr = CreateStreamOnHGlobal(hbmpdata, FALSE, &bmpstream);
807 ok(SUCCEEDED(hr), "CreateStreamOnHGlobal failed, hr=%x\n", hr);
808 if (SUCCEEDED(hr))
809 {
810 hr = IWICBitmapDecoder_Initialize(decoder, bmpstream, WICDecodeMetadataCacheOnLoad);
811 ok(hr == S_OK, "Initialize failed, hr=%x\n", hr);
812
813 hr = IWICBitmapDecoder_GetContainerFormat(decoder, &guidresult);
814 ok(SUCCEEDED(hr), "GetContainerFormat failed, hr=%x\n", hr);
815 ok(IsEqualGUID(&guidresult, &GUID_ContainerFormatBmp), "unexpected container format\n");
816
817 hr = IWICBitmapDecoder_GetFrameCount(decoder, &count);
818 ok(SUCCEEDED(hr), "GetFrameCount failed, hr=%x\n", hr);
819 ok(count == 1, "unexpected count %u\n", count);
820
821 hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
822 ok(SUCCEEDED(hr), "GetFrame failed, hr=%x\n", hr);
823 if (SUCCEEDED(hr))
824 {
825 IWICImagingFactory *factory;
826 IWICPalette *palette;
827
828 hr = IWICBitmapFrameDecode_GetSize(framedecode, &width, &height);
829 ok(SUCCEEDED(hr), "GetSize failed, hr=%x\n", hr);
830 ok(width == 8, "expected width=8, got %u\n", width);
831 ok(height == 8, "expected height=8, got %u\n", height);
832
833 hr = IWICBitmapFrameDecode_GetResolution(framedecode, &dpiX, &dpiY);
834 ok(SUCCEEDED(hr), "GetResolution failed, hr=%x\n", hr);
835 ok(fabs(dpiX - 72.0) < 0.01, "expected dpiX=96.0, got %f\n", dpiX);
836 ok(fabs(dpiY - 72.0) < 0.01, "expected dpiY=96.0, got %f\n", dpiY);
837
838 hr = IWICBitmapFrameDecode_GetPixelFormat(framedecode, &guidresult);
839 ok(SUCCEEDED(hr), "GetPixelFormat failed, hr=%x\n", hr);
840 ok(IsEqualGUID(&guidresult, &GUID_WICPixelFormat32bppBGR), "unexpected pixel format\n");
841
842 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
843 &IID_IWICImagingFactory, (void**)&factory);
844 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
845 if (SUCCEEDED(hr))
846 {
847 hr = IWICImagingFactory_CreatePalette(factory, &palette);
848 ok(SUCCEEDED(hr), "CreatePalette failed, hr=%x\n", hr);
849 if (SUCCEEDED(hr))
850 {
851 hr = IWICBitmapDecoder_CopyPalette(decoder, palette);
852 ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %x\n", hr);
853
854 hr = IWICBitmapFrameDecode_CopyPalette(framedecode, palette);
855 ok(SUCCEEDED(hr), "CopyPalette failed, hr=%x\n", hr);
856
857 hr = IWICPalette_GetColorCount(palette, &count);
858 ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
859 ok(count == 6, "expected count=6, got %u\n", count);
860
861 hr = IWICPalette_GetColors(palette, 6, palettedata, &count);
862 ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
863 ok(count == 6, "expected count=6, got %u\n", count);
864 ok(!memcmp(palettedata, expected_palettedata, sizeof(palettedata)), "unexpected palette data\n");
865
866 IWICPalette_Release(palette);
867 }
868
869 IWICImagingFactory_Release(factory);
870 }
871
872 rc.X = 0;
873 rc.Y = 0;
874 rc.Width = 8;
875 rc.Height = 8;
876 hr = IWICBitmapFrameDecode_CopyPixels(framedecode, &rc, 32, sizeof(imagedata), (BYTE*)imagedata);
877 ok(SUCCEEDED(hr), "CopyPixels failed, hr=%x\n", hr);
878 ok(!memcmp(imagedata, expected_imagedata, sizeof(imagedata)), "unexpected image data\n");
879
880 IWICBitmapFrameDecode_Release(framedecode);
881 }
882
883 hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER,
884 &IID_IWICBitmapDecoder, (void**)&decoder2);
885 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
886 if (SUCCEEDED(hr))
887 {
888 hr = IWICBitmapDecoder_QueryCapability(decoder2, bmpstream, &capability);
889 ok(hr == S_OK, "QueryCapability failed, hr=%x\n", hr);
890 ok(capability == (WICBitmapDecoderCapabilityCanDecodeAllImages),
891 "unexpected capabilities: %x\n", capability);
892 IWICBitmapDecoder_Release(decoder2);
893 }
894
895 IStream_Release(bmpstream);
896 }
897
898 GlobalFree(hbmpdata);
899 }
900
901 IWICBitmapDecoder_Release(decoder);
902 }
903
904 static void test_componentinfo(void)
905 {
906 IWICImagingFactory *factory;
907 IWICComponentInfo *info;
908 IWICBitmapDecoderInfo *decoderinfo;
909 IWICBitmapDecoder *decoder;
910 HRESULT hr;
911 WICBitmapPattern *patterns;
912 UINT pattern_count, pattern_size;
913 WICComponentType type;
914 GUID guidresult;
915 HGLOBAL hbmpdata;
916 char *bmpdata;
917 IStream *bmpstream;
918 BOOL boolresult;
919
920 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
921 &IID_IWICImagingFactory, (void**)&factory);
922 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
923 if (SUCCEEDED(hr))
924 {
925 hr = IWICImagingFactory_CreateComponentInfo(factory, &CLSID_WICBmpDecoder, &info);
926 ok(SUCCEEDED(hr), "CreateComponentInfo failed, hr=%x\n", hr);
927 if (SUCCEEDED(hr))
928 {
929 hr = IWICComponentInfo_GetComponentType(info, &type);
930 ok(SUCCEEDED(hr), "GetComponentType failed, hr=%x\n", hr);
931 ok(type == WICDecoder, "got %i, expected WICDecoder\n", type);
932
933 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICBitmapDecoderInfo, (void**)&decoderinfo);
934 ok(SUCCEEDED(hr), "QueryInterface failed, hr=%x\n", hr);
935 if (SUCCEEDED(hr))
936 {
937 pattern_count = 0;
938 pattern_size = 0;
939 hr = IWICBitmapDecoderInfo_GetPatterns(decoderinfo, 0, NULL, &pattern_count, &pattern_size);
940 ok(SUCCEEDED(hr), "GetPatterns failed, hr=%x\n", hr);
941 ok(pattern_count != 0, "pattern count is 0\n");
942 ok(pattern_size > pattern_count * sizeof(WICBitmapPattern), "size=%i, count=%i\n", pattern_size, pattern_count);
943
944 patterns = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pattern_size);
945 hr = IWICBitmapDecoderInfo_GetPatterns(decoderinfo, pattern_size, patterns, &pattern_count, &pattern_size);
946 ok(SUCCEEDED(hr), "GetPatterns failed, hr=%x\n", hr);
947 ok(pattern_count != 0, "pattern count is 0\n");
948 ok(pattern_size > pattern_count * sizeof(WICBitmapPattern), "size=%i, count=%i\n", pattern_size, pattern_count);
949 ok(patterns[0].Length != 0, "pattern length is 0\n");
950 ok(patterns[0].Pattern != NULL, "pattern is NULL\n");
951 ok(patterns[0].Mask != NULL, "mask is NULL\n");
952
953 pattern_size -= 1;
954 hr = IWICBitmapDecoderInfo_GetPatterns(decoderinfo, pattern_size, patterns, &pattern_count, &pattern_size);
955 ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetPatterns returned %x, expected WINCODEC_ERR_INSUFFICIENTBUFFER\n", hr);
956
957 HeapFree(GetProcessHeap(), 0, patterns);
958
959 hr = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, &decoder);
960 ok(SUCCEEDED(hr), "CreateInstance failed, hr=%x\n", hr);
961 if (SUCCEEDED(hr))
962 {
963 hr = IWICBitmapDecoder_GetContainerFormat(decoder, &guidresult);
964 ok(SUCCEEDED(hr), "GetContainerFormat failed, hr=%x\n", hr);
965 ok(IsEqualGUID(&guidresult, &GUID_ContainerFormatBmp), "unexpected container format\n");
966
967 IWICBitmapDecoder_Release(decoder);
968 }
969
970 hbmpdata = GlobalAlloc(GMEM_MOVEABLE, sizeof(testbmp_rle4));
971 ok(hbmpdata != 0, "GlobalAlloc failed\n");
972 if (hbmpdata)
973 {
974 bmpdata = GlobalLock(hbmpdata);
975 memcpy(bmpdata, testbmp_rle4, sizeof(testbmp_rle4));
976 GlobalUnlock(hbmpdata);
977
978 hr = CreateStreamOnHGlobal(hbmpdata, FALSE, &bmpstream);
979 ok(SUCCEEDED(hr), "CreateStreamOnHGlobal failed, hr=%x\n", hr);
980 if (SUCCEEDED(hr))
981 {
982 boolresult = 0;
983 hr = IWICBitmapDecoderInfo_MatchesPattern(decoderinfo, bmpstream, &boolresult);
984 ok(SUCCEEDED(hr), "MatchesPattern failed, hr=%x\n", hr);
985 ok(boolresult, "pattern not matched\n");
986
987 IStream_Release(bmpstream);
988 }
989
990 GlobalFree(hbmpdata);
991 }
992
993 IWICBitmapDecoderInfo_Release(decoderinfo);
994 }
995
996 IWICComponentInfo_Release(info);
997 }
998
999 IWICImagingFactory_Release(factory);
1000 }
1001 }
1002
1003 static void test_createfromstream(void)
1004 {
1005 IWICBitmapDecoder *decoder;
1006 IWICImagingFactory *factory;
1007 HRESULT hr;
1008 HGLOBAL hbmpdata;
1009 char *bmpdata;
1010 IStream *bmpstream;
1011 GUID guidresult;
1012
1013 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
1014 &IID_IWICImagingFactory, (void**)&factory);
1015 ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr);
1016 if (FAILED(hr)) return;
1017
1018 hbmpdata = GlobalAlloc(GMEM_MOVEABLE, sizeof(testbmp_1bpp));
1019 ok(hbmpdata != 0, "GlobalAlloc failed\n");
1020 if (hbmpdata)
1021 {
1022 bmpdata = GlobalLock(hbmpdata);
1023 memcpy(bmpdata, testbmp_1bpp, sizeof(testbmp_1bpp));
1024 GlobalUnlock(hbmpdata);
1025
1026 hr = CreateStreamOnHGlobal(hbmpdata, FALSE, &bmpstream);
1027 ok(SUCCEEDED(hr), "CreateStreamOnHGlobal failed, hr=%x\n", hr);
1028 if (SUCCEEDED(hr))
1029 {
1030 hr = IWICImagingFactory_CreateDecoderFromStream(factory, bmpstream,
1031 NULL, WICDecodeMetadataCacheOnDemand, &decoder);
1032 ok(SUCCEEDED(hr), "CreateDecoderFromStream failed, hr=%x\n", hr);
1033 if (SUCCEEDED(hr))
1034 {
1035 hr = IWICBitmapDecoder_GetContainerFormat(decoder, &guidresult);
1036 ok(SUCCEEDED(hr), "GetContainerFormat failed, hr=%x\n", hr);
1037 ok(IsEqualGUID(&guidresult, &GUID_ContainerFormatBmp), "unexpected container format\n");
1038
1039 IWICBitmapDecoder_Release(decoder);
1040 }
1041
1042 IStream_Release(bmpstream);
1043 }
1044
1045 GlobalFree(hbmpdata);
1046 }
1047
1048 IWICImagingFactory_Release(factory);
1049 }
1050
1051 /* 1x1 pixel gif, missing trailer */
1052 static unsigned char gifimage_notrailer[] = {
1053 0x47,0x49,0x46,0x38,0x37,0x61,0x01,0x00,0x01,0x00,0x80,0x00,0x71,0xff,0xff,0xff,
1054 0xff,0xff,0xff,0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x02,0x02,0x44,
1055 0x01,0x00
1056 };
1057
1058 static void test_gif_notrailer(void)
1059 {
1060 IWICBitmapDecoder *decoder;
1061 IWICImagingFactory *factory;
1062 HRESULT hr;
1063 IWICStream *gifstream;
1064 IWICBitmapFrameDecode *framedecode;
1065 double dpiX = 0.0, dpiY = 0.0;
1066 UINT framecount;
1067
1068 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
1069 &IID_IWICImagingFactory, (void**)&factory);
1070 ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
1071 if (FAILED(hr)) return;
1072
1073 hr = IWICImagingFactory_CreateStream(factory, &gifstream);
1074 ok(hr == S_OK, "CreateStream failed, hr=%x\n", hr);
1075 if (SUCCEEDED(hr))
1076 {
1077 hr = IWICStream_InitializeFromMemory(gifstream, gifimage_notrailer,
1078 sizeof(gifimage_notrailer));
1079 ok(hr == S_OK, "InitializeFromMemory failed, hr=%x\n", hr);
1080
1081 if (SUCCEEDED(hr))
1082 {
1083 hr = CoCreateInstance(&CLSID_WICGifDecoder, NULL, CLSCTX_INPROC_SERVER,
1084 &IID_IWICBitmapDecoder, (void**)&decoder);
1085 ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
1086 }
1087
1088 if (SUCCEEDED(hr))
1089 {
1090 hr = IWICBitmapDecoder_Initialize(decoder, (IStream*)gifstream,
1091 WICDecodeMetadataCacheOnDemand);
1092 ok(hr == S_OK, "Initialize failed, hr=%x\n", hr);
1093
1094 if (SUCCEEDED(hr))
1095 {
1096 hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
1097 ok(hr == S_OK, "GetFrame failed, hr=%x\n", hr);
1098 if (SUCCEEDED(hr))
1099 {
1100 hr = IWICBitmapFrameDecode_GetResolution(framedecode, &dpiX, &dpiY);
1101 ok(SUCCEEDED(hr), "GetResolution failed, hr=%x\n", hr);
1102 ok(dpiX == 48.0, "expected dpiX=48.0, got %f\n", dpiX);
1103 ok(dpiY == 96.0, "expected dpiY=96.0, got %f\n", dpiY);
1104
1105 IWICBitmapFrameDecode_Release(framedecode);
1106 }
1107 }
1108
1109 if (SUCCEEDED(hr))
1110 {
1111 hr = IWICBitmapDecoder_GetFrameCount(decoder, &framecount);
1112 ok(hr == S_OK, "GetFrameCount failed, hr=%x\n", hr);
1113 ok(framecount == 1, "framecount=%u\n", framecount);
1114 }
1115
1116 IWICBitmapDecoder_Release(decoder);
1117 }
1118
1119 IWICStream_Release(gifstream);
1120 }
1121
1122 IWICImagingFactory_Release(factory);
1123 }
1124
1125 static void test_create_decoder(void)
1126 {
1127 IWICBitmapDecoder *decoder;
1128 IWICImagingFactory *factory;
1129 HRESULT hr;
1130
1131 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
1132 &IID_IWICImagingFactory, (void **)&factory);
1133 ok(hr == S_OK, "CoCreateInstance error %#x\n", hr);
1134
1135 hr = IWICImagingFactory_CreateDecoder(factory, NULL, NULL, NULL);
1136 ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
1137
1138 hr = IWICImagingFactory_CreateDecoder(factory, NULL, NULL, &decoder);
1139 ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
1140
1141 hr = IWICImagingFactory_CreateDecoder(factory, &GUID_ContainerFormatBmp, NULL, &decoder);
1142 ok(hr == S_OK, "CreateDecoder error %#x\n", hr);
1143 IWICBitmapDecoder_Release(decoder);
1144
1145 hr = IWICImagingFactory_CreateDecoder(factory, &GUID_ContainerFormatBmp, &GUID_VendorMicrosoft, &decoder);
1146 ok(hr == S_OK, "CreateDecoder error %#x\n", hr);
1147 IWICBitmapDecoder_Release(decoder);
1148
1149 IWICImagingFactory_Release(factory);
1150 }
1151
1152 START_TEST(bmpformat)
1153 {
1154 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
1155
1156 test_decode_24bpp();
1157 test_decode_1bpp();
1158 test_decode_4bpp();
1159 test_decode_rle8();
1160 test_decode_rle4();
1161 test_componentinfo();
1162 test_createfromstream();
1163 test_gif_notrailer();
1164 test_create_decoder();
1165
1166 CoUninitialize();
1167 }