2 * Copyright 2012 Vincent Povirk for CodeWeavers
3 * Copyright 2012 Dmitry Timoshkov
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
30 #include "wine/test.h"
32 static IWICImagingFactory
*factory
;
34 static const char *debugstr_guid(const GUID
*guid
)
38 if (!guid
) return "(null)";
39 sprintf(buf
, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
40 guid
->Data1
, guid
->Data2
, guid
->Data3
, guid
->Data4
[0],
41 guid
->Data4
[1], guid
->Data4
[2], guid
->Data4
[3], guid
->Data4
[4],
42 guid
->Data4
[5], guid
->Data4
[6], guid
->Data4
[7]);
46 static HBITMAP
create_dib(int width
, int height
, int bpp
, LOGPALETTE
*pal
, const void *data
)
48 char bmibuf
[sizeof(BITMAPINFO
) + sizeof(RGBQUAD
) * 255];
49 BITMAPINFO
*bmi
= (BITMAPINFO
*)bmibuf
;
54 memset(bmibuf
, 0, sizeof(bmibuf
));
55 bmi
->bmiHeader
.biSize
= sizeof(bmi
->bmiHeader
);
56 bmi
->bmiHeader
.biWidth
= width
;
57 bmi
->bmiHeader
.biHeight
= -height
;
58 bmi
->bmiHeader
.biBitCount
= bpp
;
59 bmi
->bmiHeader
.biPlanes
= 1;
60 bmi
->bmiHeader
.biCompression
= BI_RGB
;
65 assert(pal
->palNumEntries
<= 256);
66 for (i
= 0; i
< pal
->palNumEntries
; i
++)
68 bmi
->bmiColors
[i
].rgbRed
= pal
->palPalEntry
[i
].peRed
;
69 bmi
->bmiColors
[i
].rgbGreen
= pal
->palPalEntry
[i
].peGreen
;
70 bmi
->bmiColors
[i
].rgbBlue
= pal
->palPalEntry
[i
].peBlue
;
71 bmi
->bmiColors
[i
].rgbReserved
= 0;
74 bmi
->bmiHeader
.biClrUsed
= pal
->palNumEntries
;
75 bmi
->bmiHeader
.biClrImportant
= pal
->palNumEntries
;
77 hdib
= CreateDIBSection(0, bmi
, DIB_RGB_COLORS
, &bits
, NULL
, 0);
78 ok(hdib
!= 0, "CreateDIBSection(%dx%d,%d bpp) failed\n", width
, height
, bpp
);
80 GetObject(hdib
, sizeof(bm
), &bm
);
81 ok(bm
.bmWidth
== width
, "expected %d, got %d\n", width
, bm
.bmWidth
);
82 ok(bm
.bmHeight
== height
, "expected %d, got %d\n", height
, bm
.bmHeight
);
83 ok(bm
.bmPlanes
== 1, "expected 1, got %d\n", bm
.bmPlanes
);
84 ok(bm
.bmBitsPixel
== bpp
, "expected %d, got %d\n", bpp
, bm
.bmBitsPixel
);
86 if (data
) memcpy(bits
, data
, bm
.bmWidthBytes
* bm
.bmHeight
);
91 static void test_createbitmap(void)
96 IWICBitmapLock
*lock
, *lock2
;
97 WICBitmapPaletteType palettetype
;
100 const BYTE bitmap_data
[27] = {
101 128,128,255, 128,128,128, 128,255,128,
102 128,128,128, 128,128,128, 255,255,255,
103 255,128,128, 255,255,255, 255,255,255};
104 BYTE returned_data
[27] = {0};
105 BYTE
*lock_buffer
=NULL
, *base_lock_buffer
=NULL
;
106 UINT lock_buffer_size
=0;
107 UINT lock_buffer_stride
=0;
108 WICPixelFormatGUID pixelformat
= {0};
109 UINT width
=0, height
=0;
110 double dpix
=10.0, dpiy
=10.0;
111 int can_lock_null
= 1;
113 hr
= IWICImagingFactory_CreateBitmap(factory
, 3, 3, &GUID_WICPixelFormat24bppBGR
,
114 WICBitmapCacheOnLoad
, &bitmap
);
115 ok(hr
== S_OK
, "IWICImagingFactory_CreateBitmap failed hr=%x\n", hr
);
120 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
121 ok(hr
== S_OK
, "IWICImagingFactory_CreatePalette failed hr=%x\n", hr
);
123 /* Palette is unavailable until explicitly set */
124 hr
= IWICBitmap_CopyPalette(bitmap
, palette
);
125 ok(hr
== WINCODEC_ERR_PALETTEUNAVAILABLE
, "IWICBitmap_CopyPalette failed hr=%x\n", hr
);
127 hr
= IWICPalette_InitializePredefined(palette
, WICBitmapPaletteTypeFixedGray256
, FALSE
);
128 ok(hr
== S_OK
, "IWICPalette_InitializePredefined failed hr=%x\n", hr
);
130 hr
= IWICBitmap_SetPalette(bitmap
, palette
);
131 ok(hr
== S_OK
, "IWICBitmap_SetPalette failed hr=%x\n", hr
);
133 hr
= IWICPalette_InitializePredefined(palette
, WICBitmapPaletteTypeFixedGray4
, FALSE
);
134 ok(hr
== S_OK
, "IWICPalette_InitializePredefined failed hr=%x\n", hr
);
136 hr
= IWICBitmap_CopyPalette(bitmap
, palette
);
137 ok(hr
== S_OK
, "IWICBitmap_CopyPalette failed hr=%x\n", hr
);
139 hr
= IWICPalette_GetType(palette
, &palettetype
);
140 ok(hr
== S_OK
, "IWICPalette_GetType failed hr=%x\n", hr
);
141 ok(palettetype
== WICBitmapPaletteTypeFixedGray256
,
142 "expected WICBitmapPaletteTypeFixedGray256, got %x\n", palettetype
);
144 IWICPalette_Release(palette
);
146 /* pixel data is initially zeroed */
147 hr
= IWICBitmap_CopyPixels(bitmap
, NULL
, 9, 27, returned_data
);
148 ok(hr
== S_OK
, "IWICBitmap_CopyPixels failed hr=%x\n", hr
);
151 ok(returned_data
[i
] == 0, "returned_data[%i] == %i\n", i
, returned_data
[i
]);
153 /* Invalid lock rects */
157 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockRead
, &lock
);
158 ok(hr
== E_INVALIDARG
, "IWICBitmap_Lock failed hr=%x\n", hr
);
159 if (SUCCEEDED(hr
)) IWICBitmapLock_Release(lock
);
163 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockRead
, &lock
);
164 ok(hr
== E_INVALIDARG
, "IWICBitmap_Lock failed hr=%x\n", hr
);
165 if (SUCCEEDED(hr
)) IWICBitmapLock_Release(lock
);
169 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockRead
, &lock
);
170 ok(hr
== E_INVALIDARG
, "IWICBitmap_Lock failed hr=%x\n", hr
);
171 if (SUCCEEDED(hr
)) IWICBitmapLock_Release(lock
);
175 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockRead
, &lock
);
176 ok(hr
== E_INVALIDARG
, "IWICBitmap_Lock failed hr=%x\n", hr
);
177 if (SUCCEEDED(hr
)) IWICBitmapLock_Release(lock
);
180 hr
= IWICBitmap_Lock(bitmap
, NULL
, WICBitmapLockRead
, &lock
);
181 ok(hr
== S_OK
|| broken(hr
== E_INVALIDARG
) /* winxp */, "IWICBitmap_Lock failed hr=%x\n", hr
);
185 /* entire bitmap is locked */
186 hr
= IWICBitmapLock_GetSize(lock
, &width
, &height
);
187 ok(hr
== S_OK
, "IWICBitmapLock_GetSize failed hr=%x\n", hr
);
188 ok(width
== 3, "got %d, expected 3\n", width
);
189 ok(height
== 3, "got %d, expected 3\n", height
);
191 IWICBitmapLock_Release(lock
);
196 /* lock with a valid rect */
198 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockRead
, &lock
);
199 ok(hr
== S_OK
, "IWICBitmap_Lock failed hr=%x\n", hr
);
202 hr
= IWICBitmapLock_GetStride(lock
, &lock_buffer_stride
);
203 ok(hr
== S_OK
, "IWICBitmapLock_GetStride failed hr=%x\n", hr
);
204 /* stride is divisible by 4 */
205 ok(lock_buffer_stride
== 12, "got %i, expected 12\n", lock_buffer_stride
);
207 hr
= IWICBitmapLock_GetDataPointer(lock
, &lock_buffer_size
, &lock_buffer
);
208 ok(hr
== S_OK
, "IWICBitmapLock_GetDataPointer failed hr=%x\n", hr
);
209 /* buffer size does not include padding from the last row */
210 ok(lock_buffer_size
== 33, "got %i, expected 33\n", lock_buffer_size
);
211 ok(lock_buffer
!= NULL
, "got NULL data pointer\n");
212 base_lock_buffer
= lock_buffer
;
214 hr
= IWICBitmapLock_GetPixelFormat(lock
, &pixelformat
);
215 ok(hr
== S_OK
, "IWICBitmapLock_GetPixelFormat failed hr=%x\n", hr
);
216 ok(IsEqualGUID(&pixelformat
, &GUID_WICPixelFormat24bppBGR
), "unexpected pixel format\n");
218 hr
= IWICBitmapLock_GetSize(lock
, &width
, &height
);
219 ok(hr
== S_OK
, "IWICBitmapLock_GetSize failed hr=%x\n", hr
);
220 ok(width
== 3, "got %d, expected 3\n", width
);
221 ok(height
== 3, "got %d, expected 3\n", height
);
223 /* We can have multiple simultaneous read locks */
224 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockRead
, &lock2
);
225 ok(hr
== S_OK
, "IWICBitmap_Lock failed hr=%x\n", hr
);
229 hr
= IWICBitmapLock_GetDataPointer(lock2
, &lock_buffer_size
, &lock_buffer
);
230 ok(hr
== S_OK
, "IWICBitmapLock_GetDataPointer failed hr=%x\n", hr
);
231 ok(lock_buffer_size
== 33, "got %i, expected 33\n", lock_buffer_size
);
232 ok(lock_buffer
== base_lock_buffer
, "got %p, expected %p\n", lock_buffer
, base_lock_buffer
);
234 IWICBitmapLock_Release(lock2
);
237 if (can_lock_null
) /* this hangs on xp/vista */
239 /* But not a read and a write lock */
240 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockWrite
, &lock2
);
241 ok(hr
== WINCODEC_ERR_ALREADYLOCKED
, "IWICBitmap_Lock failed hr=%x\n", hr
);
244 /* But we don't need a write lock to write */
245 if (base_lock_buffer
)
248 memcpy(base_lock_buffer
+ lock_buffer_stride
*i
, bitmap_data
+ i
*9, 9);
251 IWICBitmapLock_Release(lock
);
254 /* test that the data we wrote is returned by CopyPixels */
255 hr
= IWICBitmap_CopyPixels(bitmap
, NULL
, 9, 27, returned_data
);
256 ok(hr
== S_OK
, "IWICBitmap_CopyPixels failed hr=%x\n", hr
);
259 ok(returned_data
[i
] == bitmap_data
[i
], "returned_data[%i] == %i\n", i
, returned_data
[i
]);
261 /* try a valid partial rect, and write mode */
266 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockWrite
, &lock
);
267 ok(hr
== S_OK
, "IWICBitmap_Lock failed hr=%x\n", hr
);
271 if (can_lock_null
) /* this hangs on xp/vista */
273 /* Can't lock again while locked for writing */
274 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockWrite
, &lock2
);
275 ok(hr
== WINCODEC_ERR_ALREADYLOCKED
, "IWICBitmap_Lock failed hr=%x\n", hr
);
277 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockRead
, &lock2
);
278 ok(hr
== WINCODEC_ERR_ALREADYLOCKED
, "IWICBitmap_Lock failed hr=%x\n", hr
);
281 hr
= IWICBitmapLock_GetStride(lock
, &lock_buffer_stride
);
282 ok(hr
== S_OK
, "IWICBitmapLock_GetStride failed hr=%x\n", hr
);
283 ok(lock_buffer_stride
== 12, "got %i, expected 12\n", lock_buffer_stride
);
285 hr
= IWICBitmapLock_GetDataPointer(lock
, &lock_buffer_size
, &lock_buffer
);
286 ok(hr
== S_OK
, "IWICBitmapLock_GetDataPointer failed hr=%x\n", hr
);
287 ok(lock_buffer_size
== 15, "got %i, expected 15\n", lock_buffer_size
);
288 ok(lock_buffer
== base_lock_buffer
+6, "got %p, expected %p+6\n", lock_buffer
, base_lock_buffer
);
290 hr
= IWICBitmapLock_GetPixelFormat(lock
, &pixelformat
);
291 ok(hr
== S_OK
, "IWICBitmapLock_GetPixelFormat failed hr=%x\n", hr
);
292 ok(IsEqualGUID(&pixelformat
, &GUID_WICPixelFormat24bppBGR
), "unexpected pixel format\n");
294 hr
= IWICBitmapLock_GetSize(lock
, &width
, &height
);
295 ok(hr
== S_OK
, "IWICBitmapLock_GetSize failed hr=%x\n", hr
);
296 ok(width
== 1, "got %d, expected 1\n", width
);
297 ok(height
== 2, "got %d, expected 2\n", height
);
299 IWICBitmapLock_Release(lock
);
302 hr
= IWICBitmap_GetPixelFormat(bitmap
, &pixelformat
);
303 ok(hr
== S_OK
, "IWICBitmap_GetPixelFormat failed hr=%x\n", hr
);
304 ok(IsEqualGUID(&pixelformat
, &GUID_WICPixelFormat24bppBGR
), "unexpected pixel format\n");
306 hr
= IWICBitmap_GetResolution(bitmap
, &dpix
, &dpiy
);
307 ok(hr
== S_OK
, "IWICBitmap_GetResolution failed hr=%x\n", hr
);
308 ok(dpix
== 0.0, "got %f, expected 0.0\n", dpix
);
309 ok(dpiy
== 0.0, "got %f, expected 0.0\n", dpiy
);
311 hr
= IWICBitmap_SetResolution(bitmap
, 12.0, 34.0);
312 ok(hr
== S_OK
, "IWICBitmap_SetResolution failed hr=%x\n", hr
);
314 hr
= IWICBitmap_GetResolution(bitmap
, &dpix
, &dpiy
);
315 ok(hr
== S_OK
, "IWICBitmap_GetResolution failed hr=%x\n", hr
);
316 ok(dpix
== 12.0, "got %f, expected 12.0\n", dpix
);
317 ok(dpiy
== 34.0, "got %f, expected 34.0\n", dpiy
);
319 hr
= IWICBitmap_GetSize(bitmap
, &width
, &height
);
320 ok(hr
== S_OK
, "IWICBitmap_GetSize failed hr=%x\n", hr
);
321 ok(width
== 3, "got %d, expected 3\n", width
);
322 ok(height
== 3, "got %d, expected 3\n", height
);
324 IWICBitmap_Release(bitmap
);
327 static void test_createbitmapfromsource(void)
330 IWICBitmap
*bitmap
, *bitmap2
;
331 IWICPalette
*palette
;
332 IWICBitmapLock
*lock
;
335 const BYTE bitmap_data
[27] = {
336 128,128,255, 128,128,128, 128,255,128,
337 128,128,128, 128,128,128, 255,255,255,
338 255,128,128, 255,255,255, 255,255,255};
339 BYTE returned_data
[27] = {0};
340 BYTE
*lock_buffer
=NULL
;
341 UINT lock_buffer_stride
=0;
342 UINT lock_buffer_size
=0;
343 WICPixelFormatGUID pixelformat
= {0};
344 UINT width
=0, height
=0;
345 double dpix
=10.0, dpiy
=10.0;
347 WICBitmapPaletteType palette_type
;
349 hr
= IWICImagingFactory_CreateBitmap(factory
, 3, 3, &GUID_WICPixelFormat24bppBGR
,
350 WICBitmapCacheOnLoad
, &bitmap
);
351 ok(hr
== S_OK
, "IWICImagingFactory_CreateBitmap failed hr=%x\n", hr
);
356 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
357 ok(hr
== S_OK
, "IWICImagingFactory_CreatePalette failed hr=%x\n", hr
);
359 hr
= IWICPalette_InitializePredefined(palette
, WICBitmapPaletteTypeFixedGray256
, FALSE
);
360 ok(hr
== S_OK
, "IWICPalette_InitializePredefined failed hr=%x\n", hr
);
362 hr
= IWICBitmap_SetPalette(bitmap
, palette
);
363 ok(hr
== S_OK
, "IWICBitmap_SetPalette failed hr=%x\n", hr
);
365 IWICPalette_Release(palette
);
370 hr
= IWICBitmap_Lock(bitmap
, &rc
, WICBitmapLockWrite
, &lock
);
371 ok(hr
== S_OK
, "IWICBitmap_Lock failed hr=%x\n", hr
);
374 hr
= IWICBitmapLock_GetStride(lock
, &lock_buffer_stride
);
375 ok(hr
== S_OK
, "IWICBitmapLock_GetStride failed hr=%x\n", hr
);
376 ok(lock_buffer_stride
== 12, "got %i, expected 12\n", lock_buffer_stride
);
378 hr
= IWICBitmapLock_GetDataPointer(lock
, &lock_buffer_size
, &lock_buffer
);
379 ok(hr
== S_OK
, "IWICBitmapLock_GetDataPointer failed hr=%x\n", hr
);
380 ok(lock_buffer_size
== 33, "got %i, expected 33\n", lock_buffer_size
);
381 ok(lock_buffer
!= NULL
, "got NULL data pointer\n");
384 memcpy(lock_buffer
+ lock_buffer_stride
*i
, bitmap_data
+ i
*9, 9);
386 IWICBitmapLock_Release(lock
);
389 hr
= IWICBitmap_SetResolution(bitmap
, 12.0, 34.0);
390 ok(hr
== S_OK
, "IWICBitmap_SetResolution failed hr=%x\n", hr
);
392 hr
= IWICImagingFactory_CreateBitmapFromSource(factory
, (IWICBitmapSource
*)bitmap
,
393 WICBitmapCacheOnLoad
, &bitmap2
);
394 ok(hr
== S_OK
, "IWICImagingFactory_CreateBitmapFromSource failed hr=%x\n", hr
);
396 IWICBitmap_Release(bitmap
);
398 if (FAILED(hr
)) return;
400 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
401 ok(hr
== S_OK
, "IWICImagingFactory_CreatePalette failed hr=%x\n", hr
);
403 /* palette isn't copied for non-indexed formats? */
404 hr
= IWICBitmap_CopyPalette(bitmap2
, palette
);
405 ok(hr
== WINCODEC_ERR_PALETTEUNAVAILABLE
, "IWICBitmap_CopyPalette failed hr=%x\n", hr
);
407 IWICPalette_Release(palette
);
409 hr
= IWICBitmap_CopyPixels(bitmap2
, NULL
, 9, 27, returned_data
);
410 ok(hr
== S_OK
, "IWICBitmap_CopyPixels failed hr=%x\n", hr
);
413 ok(returned_data
[i
] == bitmap_data
[i
], "returned_data[%i] == %i\n", i
, returned_data
[i
]);
415 hr
= IWICBitmap_GetPixelFormat(bitmap2
, &pixelformat
);
416 ok(hr
== S_OK
, "IWICBitmap_GetPixelFormat failed hr=%x\n", hr
);
417 ok(IsEqualGUID(&pixelformat
, &GUID_WICPixelFormat24bppBGR
), "unexpected pixel format\n");
419 hr
= IWICBitmap_GetResolution(bitmap2
, &dpix
, &dpiy
);
420 ok(hr
== S_OK
, "IWICBitmap_GetResolution failed hr=%x\n", hr
);
421 ok(dpix
== 12.0, "got %f, expected 12.0\n", dpix
);
422 ok(dpiy
== 34.0, "got %f, expected 34.0\n", dpiy
);
424 hr
= IWICBitmap_GetSize(bitmap2
, &width
, &height
);
425 ok(hr
== S_OK
, "IWICBitmap_GetSize failed hr=%x\n", hr
);
426 ok(width
== 3, "got %d, expected 3\n", width
);
427 ok(height
== 3, "got %d, expected 3\n", height
);
429 IWICBitmap_Release(bitmap2
);
431 /* Ensure palette is copied for indexed formats */
432 hr
= IWICImagingFactory_CreateBitmap(factory
, 3, 3, &GUID_WICPixelFormat4bppIndexed
,
433 WICBitmapCacheOnLoad
, &bitmap
);
434 ok(hr
== S_OK
, "IWICImagingFactory_CreateBitmap failed hr=%x\n", hr
);
436 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
437 ok(hr
== S_OK
, "IWICImagingFactory_CreatePalette failed hr=%x\n", hr
);
439 hr
= IWICPalette_InitializePredefined(palette
, WICBitmapPaletteTypeFixedGray256
, FALSE
);
440 ok(hr
== S_OK
, "IWICPalette_InitializePredefined failed hr=%x\n", hr
);
442 hr
= IWICBitmap_SetPalette(bitmap
, palette
);
443 ok(hr
== S_OK
, "IWICBitmap_SetPalette failed hr=%x\n", hr
);
445 IWICPalette_Release(palette
);
447 hr
= IWICImagingFactory_CreateBitmapFromSource(factory
, (IWICBitmapSource
*)bitmap
,
448 WICBitmapCacheOnLoad
, &bitmap2
);
449 ok(hr
== S_OK
, "IWICImagingFactory_CreateBitmapFromSource failed hr=%x\n", hr
);
451 IWICBitmap_Release(bitmap
);
453 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
454 ok(hr
== S_OK
, "IWICImagingFactory_CreatePalette failed hr=%x\n", hr
);
456 hr
= IWICBitmap_CopyPalette(bitmap2
, palette
);
457 ok(hr
== S_OK
, "IWICBitmap_CopyPalette failed hr=%x\n", hr
);
459 hr
= IWICPalette_GetColorCount(palette
, &count
);
460 ok(hr
== S_OK
, "IWICPalette_GetColorCount failed hr=%x\n", hr
);
461 ok(count
== 256, "unexpected count %d\n", count
);
463 hr
= IWICPalette_GetType(palette
, &palette_type
);
464 ok(hr
== S_OK
, "IWICPalette_GetType failed hr=%x\n", hr
);
465 ok(palette_type
== WICBitmapPaletteTypeFixedGray256
, "unexpected palette type %d\n", palette_type
);
467 IWICPalette_Release(palette
);
469 hr
= IWICBitmap_GetPixelFormat(bitmap2
, &pixelformat
);
470 ok(hr
== S_OK
, "IWICBitmap_GetPixelFormat failed hr=%x\n", hr
);
471 ok(IsEqualGUID(&pixelformat
, &GUID_WICPixelFormat4bppIndexed
), "unexpected pixel format\n");
473 hr
= IWICBitmap_GetSize(bitmap2
, &width
, &height
);
474 ok(hr
== S_OK
, "IWICBitmap_GetSize failed hr=%x\n", hr
);
475 ok(width
== 3, "got %d, expected 3\n", width
);
476 ok(height
== 3, "got %d, expected 3\n", height
);
478 IWICBitmap_Release(bitmap2
);
481 static void test_CreateBitmapFromMemory(void)
483 BYTE orig_data3x3
[27] = {
484 128,128,255, 128,128,128, 128,255,128,
485 128,128,128, 128,128,128, 255,255,255,
486 255,128,128, 255,255,255, 255,255,255 };
489 128,128,255, 128,128,128, 128,255,128,
490 0,0,0, 0,128,128, 255,255,255,
491 255,128,128, 255,0,0, 0,0,0 };
495 UINT width
, height
, i
;
497 memcpy(data3x3
, orig_data3x3
, sizeof(data3x3
));
499 hr
= IWICImagingFactory_CreateBitmapFromMemory(factory
, 3, 3, &GUID_WICPixelFormat24bppBGR
,
500 0, 0, NULL
, &bitmap
);
501 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
503 hr
= IWICImagingFactory_CreateBitmapFromMemory(factory
, 3, 3, &GUID_WICPixelFormat24bppBGR
,
504 0, sizeof(data3x3
), data3x3
, &bitmap
);
505 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
507 hr
= IWICImagingFactory_CreateBitmapFromMemory(factory
, 3, 3, &GUID_WICPixelFormat24bppBGR
,
508 6, sizeof(data3x3
), data3x3
, &bitmap
);
509 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
511 hr
= IWICImagingFactory_CreateBitmapFromMemory(factory
, 3, 3, &GUID_WICPixelFormat24bppBGR
,
512 12, sizeof(data3x3
), data3x3
, &bitmap
);
513 ok(hr
== WINCODEC_ERR_INSUFFICIENTBUFFER
, "expected WINCODEC_ERR_INSUFFICIENTBUFFER, got %#x\n", hr
);
515 hr
= IWICImagingFactory_CreateBitmapFromMemory(factory
, 3, 3, &GUID_WICPixelFormat24bppBGR
,
516 9, sizeof(data3x3
) - 1, data3x3
, &bitmap
);
517 ok(hr
== WINCODEC_ERR_INSUFFICIENTBUFFER
, "expected WINCODEC_ERR_INSUFFICIENTBUFFER, got %#x\n", hr
);
519 hr
= IWICImagingFactory_CreateBitmapFromMemory(factory
, 3, 3, &GUID_WICPixelFormat24bppBGR
,
520 9, sizeof(data3x3
), data3x3
, &bitmap
);
521 ok(hr
== S_OK
, "IWICImagingFactory_CreateBitmapFromMemory error %#x\n", hr
);
523 hr
= IWICBitmap_GetSize(bitmap
, &width
, &height
);
524 ok(hr
== S_OK
, "IWICBitmap_GetSize error %#x\n", hr
);
525 ok(width
== 3, "expected 3, got %u\n", width
);
526 ok(height
== 3, "expected 3, got %u\n", height
);
530 memset(data
, 0, sizeof(data
));
531 hr
= IWICBitmap_CopyPixels(bitmap
, NULL
, 9, sizeof(data
), data
);
532 ok(hr
== S_OK
, "IWICBitmap_CopyPixels error %#x\n", hr
);
533 for (i
= 0; i
< sizeof(data
); i
++)
534 ok(data
[i
] == orig_data3x3
[i
], "%u: expected %u, got %u\n", i
, data
[i
], data3x3
[i
]);
536 IWICBitmap_Release(bitmap
);
538 hr
= IWICImagingFactory_CreateBitmapFromMemory(factory
, 3, 2, &GUID_WICPixelFormat24bppBGR
,
539 13, sizeof(orig_data3x3
), orig_data3x3
, &bitmap
);
540 ok(hr
== S_OK
, "IWICImagingFactory_CreateBitmapFromMemory error %#x\n", hr
);
542 hr
= IWICBitmap_GetSize(bitmap
, &width
, &height
);
543 ok(hr
== S_OK
, "IWICBitmap_GetSize error %#x\n", hr
);
544 ok(width
== 3, "expected 3, got %u\n", width
);
545 ok(height
== 2, "expected 2, got %u\n", height
);
547 memset(data
, 0, sizeof(data
));
548 hr
= IWICBitmap_CopyPixels(bitmap
, NULL
, 13, sizeof(data
), data
);
549 ok(hr
== S_OK
, "IWICBitmap_CopyPixels error %#x\n", hr
);
550 for (i
= 0; i
< sizeof(data
); i
++)
551 ok(data
[i
] == data3x2
[i
], "%u: expected %u, got %u\n", i
, data3x2
[i
], data
[i
]);
553 IWICBitmap_Release(bitmap
);
556 static void test_CreateBitmapFromHICON(void)
558 static const char bits
[4096];
564 WICPixelFormatGUID format
;
571 info
.hbmMask
= CreateBitmap(16, 32, 1, 1, bits
);
572 ok(info
.hbmMask
!= 0, "CreateBitmap failed\n");
573 icon
= CreateIconIndirect(&info
);
574 ok(icon
!= 0, "CreateIconIndirect failed\n");
575 DeleteObject(info
.hbmMask
);
577 hr
= IWICImagingFactory_CreateBitmapFromHICON(factory
, 0, NULL
);
578 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
580 hr
= IWICImagingFactory_CreateBitmapFromHICON(factory
, 0, &bitmap
);
581 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_CURSOR_HANDLE
), "expected ERROR_INVALID_CURSOR_HANDLE, got %#x\n", hr
);
583 hr
= IWICImagingFactory_CreateBitmapFromHICON(factory
, icon
, NULL
);
584 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
586 hr
= IWICImagingFactory_CreateBitmapFromHICON(factory
, icon
, &bitmap
);
587 ok(hr
== S_OK
, "CreateBitmapFromHICON error %#x\n", hr
);
589 if (hr
!= S_OK
) return;
591 IWICBitmap_GetPixelFormat(bitmap
, &format
);
592 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat32bppBGRA
),
593 "unexpected pixel format %s\n", debugstr_guid(&format
));
595 IWICBitmap_GetSize(bitmap
, &width
, &height
);
596 ok(hr
== S_OK
, "IWICBitmap_GetSize error %#x\n", hr
);
597 ok(width
== 16, "expected 16, got %u\n", width
);
598 ok(height
== 16, "expected 16, got %u\n", height
);
600 IWICBitmap_Release(bitmap
);
602 /* 24 bpp color, 1 bpp mask */
606 info
.hbmColor
= CreateBitmap(16, 16, 1, 24, bits
);
607 ok(info
.hbmColor
!= 0, "CreateBitmap failed\n");
608 info
.hbmMask
= CreateBitmap(16, 16, 1, 1, bits
);
609 ok(info
.hbmMask
!= 0, "CreateBitmap failed\n");
610 icon
= CreateIconIndirect(&info
);
611 ok(icon
!= 0, "CreateIconIndirect failed\n");
612 DeleteObject(info
.hbmColor
);
613 DeleteObject(info
.hbmMask
);
615 hr
= IWICImagingFactory_CreateBitmapFromHICON(factory
, icon
, &bitmap
);
616 ok(hr
== S_OK
, "CreateBitmapFromHICON error %#x\n", hr
);
619 IWICBitmap_GetPixelFormat(bitmap
, &format
);
620 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat32bppBGRA
),
621 "unexpected pixel format %s\n", debugstr_guid(&format
));
623 IWICBitmap_GetSize(bitmap
, &width
, &height
);
624 ok(hr
== S_OK
, "IWICBitmap_GetSize error %#x\n", hr
);
625 ok(width
== 16, "expected 16, got %u\n", width
);
626 ok(height
== 16, "expected 16, got %u\n", height
);
628 IWICBitmap_Release(bitmap
);
631 static void test_CreateBitmapFromHBITMAP(void)
633 /* 8 bpp data must be aligned to a DWORD boundary for a DIB */
634 static const BYTE data_8bpp_pal_dib
[12] = { 0,1,2,0, 1,2,0,0, 2,1,0,0 };
635 static const BYTE data_8bpp_rgb_dib
[12] = { 0xf0,0x0f,0xff,0, 0x0f,0xff,0xf0,0, 0xf0,0x0f,0xff,0 };
636 static const BYTE data_8bpp_pal_wic
[12] = { 0xd,0xe,0x10,0, 0xe,0x10,0xd,0, 0x10,0xe,0xd,0 };
637 static const PALETTEENTRY pal_data
[3] = { {0xff,0,0,0}, {0,0xff,0,0}, {0,0,0xff,0} };
638 char pal_buf
[sizeof(LOGPALETTE
) + sizeof(PALETTEENTRY
) * 255];
639 LOGPALETTE
*pal
= (LOGPALETTE
*)pal_buf
;
645 UINT width
, height
, i
, count
;
646 WICPixelFormatGUID format
;
647 IWICPalette
*palette
;
648 WICBitmapPaletteType type
;
650 /* 8 bpp without palette */
651 hbmp
= create_dib(3, 3, 8, NULL
, data_8bpp_rgb_dib
);
652 ok(hbmp
!= 0, "failed to create bitmap\n");
654 hr
= IWICImagingFactory_CreateBitmapFromHBITMAP(factory
, 0, 0, WICBitmapCacheOnLoad
, &bitmap
);
656 ok(hr
== WINCODEC_ERR_WIN32ERROR
|| hr
== 0x88980003 /*XP*/, "expected WINCODEC_ERR_WIN32ERROR, got %#x\n", hr
);
658 hr
= IWICImagingFactory_CreateBitmapFromHBITMAP(factory
, hbmp
, 0, WICBitmapCacheOnLoad
, NULL
);
660 ok(hr
== E_INVALIDARG
, "expected E_INVALIDARG, got %#x\n", hr
);
662 hr
= IWICImagingFactory_CreateBitmapFromHBITMAP(factory
, hbmp
, 0, WICBitmapCacheOnLoad
, &bitmap
);
664 ok(hr
== S_OK
, "CreateBitmapFromHBITMAP error %#x\n", hr
);
665 if (hr
!= S_OK
) return;
667 IWICBitmap_GetPixelFormat(bitmap
, &format
);
668 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat8bppIndexed
),
669 "unexpected pixel format %s\n", debugstr_guid(&format
));
671 hr
= IWICBitmap_GetSize(bitmap
, &width
, &height
);
672 ok(hr
== S_OK
, "IWICBitmap_GetSize error %#x\n", hr
);
673 ok(width
== 3, "expected 3, got %u\n", width
);
674 ok(height
== 3, "expected 3, got %u\n", height
);
676 memset(data
, 0, sizeof(data
));
677 hr
= IWICBitmap_CopyPixels(bitmap
, NULL
, 4, sizeof(data
), data
);
678 ok(hr
== S_OK
, "IWICBitmap_CopyPixels error %#x\n", hr
);
679 for (i
= 0; i
< sizeof(data
); i
++)
680 ok(data
[i
] == data_8bpp_rgb_dib
[i
], "%u: expected %#x, got %#x\n", i
, data_8bpp_rgb_dib
[i
], data
[i
]);
682 IWICBitmap_Release(bitmap
);
685 /* 8 bpp with a 3 entries palette */
686 memset(pal_buf
, 0, sizeof(pal_buf
));
687 pal
->palVersion
= 0x300;
688 pal
->palNumEntries
= 3;
689 memcpy(pal
->palPalEntry
, pal_data
, sizeof(pal_data
));
690 hpal
= CreatePalette(pal
);
691 ok(hpal
!= 0, "CreatePalette failed\n");
693 hbmp
= create_dib(3, 3, 8, pal
, data_8bpp_pal_dib
);
694 hr
= IWICImagingFactory_CreateBitmapFromHBITMAP(factory
, hbmp
, hpal
, WICBitmapCacheOnLoad
, &bitmap
);
695 ok(hr
== S_OK
, "CreateBitmapFromHBITMAP error %#x\n", hr
);
697 IWICBitmap_GetPixelFormat(bitmap
, &format
);
698 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat4bppIndexed
),
699 "unexpected pixel format %s\n", debugstr_guid(&format
));
701 hr
= IWICBitmap_GetSize(bitmap
, &width
, &height
);
702 ok(hr
== S_OK
, "IWICBitmap_GetSize error %#x\n", hr
);
703 ok(width
== 3, "expected 3, got %u\n", width
);
704 ok(height
== 3, "expected 3, got %u\n", height
);
706 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
707 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
708 hr
= IWICBitmap_CopyPalette(bitmap
, palette
);
709 ok(hr
== S_OK
, "CopyPalette error %#x\n", hr
);
711 hr
= IWICPalette_GetType(palette
, &type
);
712 ok(hr
== S_OK
, "%u: GetType error %#x\n", i
, hr
);
713 ok(type
== WICBitmapPaletteTypeCustom
, "expected WICBitmapPaletteTypeCustom, got %#x\n", type
);
715 hr
= IWICPalette_GetColorCount(palette
, &count
);
716 ok(hr
== S_OK
, "GetColorCount error %#x\n", hr
);
717 ok(count
== 16, "expected 16, got %u\n", count
);
719 IWICPalette_Release(palette
);
721 IWICBitmap_Release(bitmap
);
725 /* 8 bpp with a 256 entries palette */
726 memset(pal_buf
, 0, sizeof(pal_buf
));
727 pal
->palVersion
= 0x300;
728 pal
->palNumEntries
= 256;
729 memcpy(pal
->palPalEntry
, pal_data
, sizeof(pal_data
));
730 hpal
= CreatePalette(pal
);
731 ok(hpal
!= 0, "CreatePalette failed\n");
733 hbmp
= create_dib(3, 3, 8, pal
, data_8bpp_pal_dib
);
734 hr
= IWICImagingFactory_CreateBitmapFromHBITMAP(factory
, hbmp
, hpal
, WICBitmapCacheOnLoad
, &bitmap
);
735 ok(hr
== S_OK
, "CreateBitmapFromHBITMAP error %#x\n", hr
);
737 IWICBitmap_GetPixelFormat(bitmap
, &format
);
738 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat8bppIndexed
),
739 "unexpected pixel format %s\n", debugstr_guid(&format
));
741 hr
= IWICBitmap_GetSize(bitmap
, &width
, &height
);
742 ok(hr
== S_OK
, "IWICBitmap_GetSize error %#x\n", hr
);
743 ok(width
== 3, "expected 3, got %u\n", width
);
744 ok(height
== 3, "expected 3, got %u\n", height
);
746 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
747 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
748 hr
= IWICBitmap_CopyPalette(bitmap
, palette
);
749 ok(hr
== S_OK
, "CopyPalette error %#x\n", hr
);
751 hr
= IWICPalette_GetType(palette
, &type
);
752 ok(hr
== S_OK
, "%u: GetType error %#x\n", i
, hr
);
753 ok(type
== WICBitmapPaletteTypeCustom
, "expected WICBitmapPaletteTypeCustom, got %#x\n", type
);
755 hr
= IWICPalette_GetColorCount(palette
, &count
);
756 ok(hr
== S_OK
, "GetColorCount error %#x\n", hr
);
757 ok(count
== 256, "expected 256, got %u\n", count
);
759 IWICPalette_Release(palette
);
761 memset(data
, 0, sizeof(data
));
762 hr
= IWICBitmap_CopyPixels(bitmap
, NULL
, 4, sizeof(data
), data
);
763 ok(hr
== S_OK
, "IWICBitmap_CopyPixels error %#x\n", hr
);
764 for (i
= 0; i
< sizeof(data
); i
++)
765 ok(data
[i
] == data_8bpp_pal_wic
[i
], "%u: expected %#x, got %#x\n", i
, data_8bpp_pal_wic
[i
], data
[i
]);
767 IWICBitmap_Release(bitmap
);
776 CoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
778 hr
= CoCreateInstance(&CLSID_WICImagingFactory
, NULL
, CLSCTX_INPROC_SERVER
,
779 &IID_IWICImagingFactory
, (void**)&factory
);
780 ok(SUCCEEDED(hr
), "CoCreateInstance failed, hr=%x\n", hr
);
783 test_createbitmapfromsource();
784 test_CreateBitmapFromMemory();
785 test_CreateBitmapFromHICON();
786 test_CreateBitmapFromHBITMAP();
788 IWICImagingFactory_Release(factory
);