2 * Copyright 2012,2016 Dmitry Timoshkov
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.
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.
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
27 #include "wine/test.h"
33 #define IFD_RATIONAL 5
35 #define IFD_UNDEFINED 7
38 #define IFD_SRATIONAL 10
57 static const struct tiff_1bpp_data
62 USHORT number_of_entries
;
63 struct IFD_entry entry
[13];
65 struct IFD_rational res
;
69 #ifdef WORDS_BIGENDIAN
75 FIELD_OFFSET(struct tiff_1bpp_data
, number_of_entries
),
78 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
79 { 0x100, IFD_LONG
, 1, 1 }, /* IMAGEWIDTH */
80 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
81 { 0x102, IFD_SHORT
, 1, 1 }, /* BITSPERSAMPLE */
82 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
83 { 0x106, IFD_SHORT
, 1, 1 }, /* PHOTOMETRIC */
84 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_1bpp_data
, pixel_data
) }, /* STRIPOFFSETS */
85 { 0x115, IFD_SHORT
, 1, 1 }, /* SAMPLESPERPIXEL */
86 { 0x116, IFD_LONG
, 1, 1 }, /* ROWSPERSTRIP */
87 { 0x117, IFD_LONG
, 1, 1 }, /* STRIPBYTECOUNT */
88 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1bpp_data
, res
) }, /* XRESOLUTION */
89 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1bpp_data
, res
) }, /* YRESOLUTION */
90 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
94 { 0x11, 0x22, 0x33, 0 }
97 static const struct tiff_8bpp_alpha
102 USHORT number_of_entries
;
103 struct IFD_entry entry
[15];
105 struct IFD_rational res
;
109 #ifdef WORDS_BIGENDIAN
115 FIELD_OFFSET(struct tiff_8bpp_alpha
, number_of_entries
),
118 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
119 { 0x100, IFD_LONG
, 1, 2 }, /* IMAGEWIDTH */
120 { 0x101, IFD_LONG
, 1, 2 }, /* IMAGELENGTH */
121 { 0x102, IFD_SHORT
, 2, MAKELONG(8, 8) }, /* BITSPERSAMPLE */
122 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
123 { 0x106, IFD_SHORT
, 1, 1 }, /* PHOTOMETRIC */
124 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_8bpp_alpha
, pixel_data
) }, /* STRIPOFFSETS */
125 { 0x115, IFD_SHORT
, 1, 2 }, /* SAMPLESPERPIXEL */
126 { 0x116, IFD_LONG
, 1, 2 }, /* ROWSPERSTRIP */
127 { 0x117, IFD_LONG
, 1, 8 }, /* STRIPBYTECOUNT */
128 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_8bpp_alpha
, res
) }, /* XRESOLUTION */
129 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_8bpp_alpha
, res
) }, /* YRESOLUTION */
130 { 0x11c, IFD_SHORT
, 1, 1 }, /* PLANARCONFIGURATION */
131 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
132 { 0x152, IFD_SHORT
, 1, 1 } /* EXTRASAMPLES: 1 - Associated alpha with pre-multiplied color */
136 { 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88 }
139 static const struct tiff_8bpp_data
144 USHORT number_of_entries
;
145 struct IFD_entry entry
[14];
147 struct IFD_rational res
;
148 short palette_data
[3][256];
152 #ifdef WORDS_BIGENDIAN
158 FIELD_OFFSET(struct tiff_8bpp_data
, number_of_entries
),
161 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
162 { 0x100, IFD_LONG
, 1, 4 }, /* IMAGEWIDTH */
163 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
164 { 0x102, IFD_SHORT
, 1, 8 }, /* BITSPERSAMPLE: XP doesn't accept IFD_LONG here */
165 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
166 { 0x106, IFD_SHORT
, 1, 3 }, /* PHOTOMETRIC */
167 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_8bpp_data
, pixel_data
) }, /* STRIPOFFSETS */
168 { 0x115, IFD_SHORT
, 1, 1 }, /* SAMPLESPERPIXEL */
169 { 0x116, IFD_LONG
, 1, 1 }, /* ROWSPERSTRIP */
170 { 0x117, IFD_LONG
, 1, 1 }, /* STRIPBYTECOUNT */
171 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_8bpp_data
, res
) },
172 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_8bpp_data
, res
) },
173 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
174 { 0x140, IFD_SHORT
, 256*3, FIELD_OFFSET(struct tiff_8bpp_data
, palette_data
) } /* COLORMAP */
182 static const struct tiff_resolution_test_data
184 struct IFD_rational resx
;
185 struct IFD_rational resy
;
186 LONG resolution_unit
;
187 double expected_dpi_x
;
188 double expected_dpi_y
;
189 /* if != 0: values for different behavior of some Windows versions */
192 } tiff_resolution_test_data
[] =
194 { { 100, 1 }, { 50, 1 }, 0, 100.0, 50.0, 0, 0 }, /* invalid resolution unit */
195 { { 50, 1 }, { 100, 1 }, 0, 50.0, 100.0, 0, 0 },
197 { { 100, 1 }, { 50, 1 }, 1, 100.0, 50.0, 0, 0 }, /* RESUNIT_NONE */
198 { { 50, 1 }, { 100, 1 }, 1, 50.0, 100.0, 0, 0 },
200 { { 49, 1 }, { 49, 1 }, 2, 49.0, 49.0, 0, 0 }, /* same resolution for both X and Y */
201 { { 33, 1 }, { 55, 1 }, 2, 33.0, 55.0, 0, 0 }, /* different resolutions for X and Y */
202 { { 50, 2 }, { 66, 3 }, 2, 25.0, 22.0, 0, 0 }, /* denominator != 1 */
204 { { 100, 1 }, { 200, 1 }, 3, 254.0, 508.0, 0, 0 }, /* unit = centimeters */
206 /* XP and Server 2003 do not discard both resolution values if only one of them is invalid */
207 { { 0, 1 }, { 29, 1 }, 2, 96.0, 96.0, 0, 29.0 }, /* resolution 0 */
208 { { 58, 1 }, { 29, 0 }, 2, 96.0, 96.0, 58.0, 0 }, /* denominator 0 (division by zero) */
210 /* XP and Server 2003 return 96 dots per centimeter (= 243.84 dpi) as fallback value */
211 { { 0, 1 }, { 100, 1 }, 3, 96.0, 96.0, 243.84, 254.0 }, /* resolution 0 and unit = centimeters */
212 { { 50, 1 }, { 72, 0 }, 3, 96.0, 96.0, 127.0, 243.84 } /* denominator 0 and unit = centimeters */
215 static struct tiff_resolution_image_data
220 USHORT number_of_entries
;
221 struct IFD_entry entry
[13];
223 struct IFD_rational resx
;
224 struct IFD_rational resy
;
226 } tiff_resolution_image_data
=
228 #ifdef WORDS_BIGENDIAN
234 FIELD_OFFSET(struct tiff_resolution_image_data
, number_of_entries
),
237 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
238 { 0x100, IFD_LONG
, 1, 1 }, /* IMAGEWIDTH */
239 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
240 { 0x102, IFD_SHORT
, 1, 1 }, /* BITSPERSAMPLE */
241 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
242 { 0x106, IFD_SHORT
, 1, 1 }, /* PHOTOMETRIC */
243 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_resolution_image_data
, pixel_data
) }, /* STRIPOFFSETS */
244 { 0x115, IFD_SHORT
, 1, 1 }, /* SAMPLESPERPIXEL */
245 { 0x116, IFD_LONG
, 1, 1 }, /* ROWSPERSTRIP */
246 { 0x117, IFD_LONG
, 1, 1 }, /* STRIPBYTECOUNT */
247 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_resolution_image_data
, resx
) }, /* XRESOLUTION */
248 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_resolution_image_data
, resy
) }, /* YRESOLUTION */
249 { 0x128, IFD_SHORT
, 1, 1 }, /* RESOLUTIONUNIT -- value will be filled with test data */
252 { 72, 1 }, /* value will be filled with test data */
253 { 72, 1 }, /* value will be filled with test data */
254 { 0x11, 0x22, 0x33, 0 }
258 static IWICImagingFactory
*factory
;
260 static IStream
*create_stream(const void *data
, int data_size
)
267 hdata
= GlobalAlloc(GMEM_MOVEABLE
, data_size
);
268 ok(hdata
!= 0, "GlobalAlloc failed\n");
269 if (!hdata
) return NULL
;
271 locked_data
= GlobalLock(hdata
);
272 memcpy(locked_data
, data
, data_size
);
275 hr
= CreateStreamOnHGlobal(hdata
, TRUE
, &stream
);
276 ok(hr
== S_OK
, "CreateStreamOnHGlobal failed, hr=%x\n", hr
);
281 static HRESULT
create_decoder(const void *image_data
, UINT image_size
, IWICBitmapDecoder
**decoder
)
292 hmem
= GlobalAlloc(0, image_size
);
293 data
= GlobalLock(hmem
);
294 memcpy(data
, image_data
, image_size
);
297 hr
= CreateStreamOnHGlobal(hmem
, TRUE
, &stream
);
298 ok(hr
== S_OK
, "CreateStreamOnHGlobal error %#x\n", hr
);
300 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, decoder
);
303 hr
= IWICBitmapDecoder_GetContainerFormat(*decoder
, &format
);
304 ok(hr
== S_OK
, "GetContainerFormat error %#x\n", hr
);
305 ok(IsEqualGUID(&format
, &GUID_ContainerFormatTiff
),
306 "wrong container format %s\n", wine_dbgstr_guid(&format
));
308 refcount
= IStream_Release(stream
);
309 ok(refcount
> 0, "expected stream refcount > 0\n");
315 static HRESULT
get_pixelformat_info(const GUID
*format
, UINT
*bpp
, UINT
*channels
, BOOL
*trasparency
)
318 IWICComponentInfo
*info
;
319 IWICPixelFormatInfo2
*formatinfo
;
321 hr
= IWICImagingFactory_CreateComponentInfo(factory
, format
, &info
);
322 ok(hr
== S_OK
, "CreateComponentInfo(%s) error %#x\n", wine_dbgstr_guid(format
), hr
);
325 hr
= IWICComponentInfo_QueryInterface(info
, &IID_IWICPixelFormatInfo2
, (void **)&formatinfo
);
328 hr
= IWICPixelFormatInfo2_SupportsTransparency(formatinfo
, trasparency
);
329 ok(hr
== S_OK
, "SupportsTransparency error %#x\n", hr
);
330 IWICPixelFormatInfo2_Release(formatinfo
);
332 hr
= IWICComponentInfo_QueryInterface(info
, &IID_IWICPixelFormatInfo
, (void **)&formatinfo
);
335 hr
= IWICPixelFormatInfo2_GetBitsPerPixel(formatinfo
, bpp
);
336 ok(hr
== S_OK
, "GetBitsPerPixel error %#x\n", hr
);
337 hr
= IWICPixelFormatInfo2_GetChannelCount(formatinfo
, channels
);
338 ok(hr
== S_OK
, "GetChannelCount error %#x\n", hr
);
339 IWICPixelFormatInfo2_Release(formatinfo
);
341 IWICComponentInfo_Release(info
);
346 static void dump_tiff(void *buf
)
349 struct tiff_1bpp_data
*tiff
;
350 struct IFD_entry
*tag
;
353 count
= *(short *)((char *)tiff
+ tiff
->dir_offset
);
354 tag
= (struct IFD_entry
*)((char *)tiff
+ tiff
->dir_offset
+ sizeof(short));
356 for (i
= 0; i
< count
; i
++)
358 printf("tag %u: id %04x, type %04x, count %u, value %d",
359 i
, tag
[i
].id
, tag
[i
].type
, tag
[i
].count
, tag
[i
].value
);
360 if (tag
[i
].id
== 0x102 && tag
[i
].count
> 2)
362 short *bps
= (short *)((char *)tiff
+ tag
[i
].value
);
363 printf(" (%d,%d,%d,%d)\n", bps
[0], bps
[1], bps
[2], bps
[3]);
370 static void test_tiff_1bpp_palette(void)
373 IWICBitmapDecoder
*decoder
;
374 IWICBitmapFrameDecode
*frame
;
375 IWICPalette
*palette
;
378 hr
= create_decoder(&tiff_1bpp_data
, sizeof(tiff_1bpp_data
), &decoder
);
379 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
380 if (hr
!= S_OK
) return;
382 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
383 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
385 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
386 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
387 ok(IsEqualGUID(&format
, &GUID_WICPixelFormatBlackWhite
),
388 "got wrong format %s\n", wine_dbgstr_guid(&format
));
390 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
391 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
392 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
393 ok(hr
== WINCODEC_ERR_PALETTEUNAVAILABLE
,
394 "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %#x\n", hr
);
396 IWICPalette_Release(palette
);
397 IWICBitmapFrameDecode_Release(frame
);
398 IWICBitmapDecoder_Release(decoder
);
401 static void test_QueryCapability(void)
405 IWICBitmapDecoder
*decoder
;
406 IWICBitmapFrameDecode
*frame
;
407 static const DWORD exp_caps
= WICBitmapDecoderCapabilityCanDecodeAllImages
|
408 WICBitmapDecoderCapabilityCanDecodeSomeImages
|
409 WICBitmapDecoderCapabilityCanEnumerateMetadata
;
410 static const DWORD exp_caps_xp
= WICBitmapDecoderCapabilityCanDecodeAllImages
|
411 WICBitmapDecoderCapabilityCanDecodeSomeImages
;
414 ULARGE_INTEGER cur_pos
;
417 stream
= create_stream(&tiff_1bpp_data
, sizeof(tiff_1bpp_data
));
420 hr
= IWICImagingFactory_CreateDecoder(factory
, &GUID_ContainerFormatTiff
, NULL
, &decoder
);
421 ok(hr
== S_OK
, "CreateDecoder error %#x\n", hr
);
422 if (FAILED(hr
)) return;
424 frame_count
= 0xdeadbeef;
425 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
426 ok(hr
== S_OK
|| broken(hr
== E_POINTER
) /* XP */, "GetFrameCount error %#x\n", hr
);
427 ok(frame_count
== 0, "expected 0, got %u\n", frame_count
);
429 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
430 ok(hr
== WINCODEC_ERR_FRAMEMISSING
|| broken(hr
== E_POINTER
) /* XP */, "expected WINCODEC_ERR_FRAMEMISSING, got %#x\n", hr
);
433 hr
= IStream_Seek(stream
, pos
, SEEK_SET
, NULL
);
434 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
436 capability
= 0xdeadbeef;
437 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
438 ok(hr
== S_OK
, "QueryCapability error %#x\n", hr
);
439 ok(capability
== exp_caps
|| capability
== exp_caps_xp
,
440 "expected %#x, got %#x\n", exp_caps
, capability
);
442 frame_count
= 0xdeadbeef;
443 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
444 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
445 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
447 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
448 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
449 IWICBitmapFrameDecode_Release(frame
);
452 hr
= IStream_Seek(stream
, pos
, SEEK_CUR
, &cur_pos
);
453 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
454 ok(cur_pos
.QuadPart
> 4 && cur_pos
.QuadPart
< sizeof(tiff_1bpp_data
),
455 "current stream pos is at %x/%x\n", cur_pos
.u
.LowPart
, cur_pos
.u
.HighPart
);
457 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
458 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
460 hr
= IWICBitmapDecoder_Initialize(decoder
, stream
, WICDecodeMetadataCacheOnDemand
);
461 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
463 IWICBitmapDecoder_Release(decoder
);
465 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, &decoder
);
467 ok(hr
== WINCODEC_ERR_COMPONENTNOTFOUND
, "expected WINCODEC_ERR_COMPONENTNOTFOUND, got %#x\n", hr
);
470 IWICBitmapDecoder_Release(decoder
);
473 hr
= IStream_Seek(stream
, pos
, SEEK_SET
, NULL
);
474 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
476 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, &decoder
);
477 ok(hr
== S_OK
, "CreateDecoderFromStream error %#x\n", hr
);
479 frame_count
= 0xdeadbeef;
480 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
481 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
482 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
484 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
485 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
486 IWICBitmapFrameDecode_Release(frame
);
488 hr
= IWICBitmapDecoder_Initialize(decoder
, stream
, WICDecodeMetadataCacheOnDemand
);
489 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
491 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
492 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
494 IWICBitmapDecoder_Release(decoder
);
495 IStream_Release(stream
);
498 static void test_tiff_8bpp_alpha(void)
501 IWICBitmapDecoder
*decoder
;
502 IWICBitmapFrameDecode
*frame
;
503 UINT frame_count
, width
, height
, i
;
505 IWICPalette
*palette
;
509 static const BYTE expected_data
[16] = { 0x11,0x11,0x11,0x22,0x33,0x33,0x33,0x44,
510 0x55,0x55,0x55,0x66,0x77,0x77,0x77,0x88 };
512 hr
= create_decoder(&tiff_8bpp_alpha
, sizeof(tiff_8bpp_alpha
), &decoder
);
513 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
514 if (hr
!= S_OK
) return;
516 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
517 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
518 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
520 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
521 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
523 hr
= IWICBitmapFrameDecode_GetSize(frame
, &width
, &height
);
524 ok(hr
== S_OK
, "GetSize error %#x\n", hr
);
525 ok(width
== 2, "expected 2, got %u\n", width
);
526 ok(height
== 2, "expected 2, got %u\n", height
);
528 hr
= IWICBitmapFrameDecode_GetResolution(frame
, &dpi_x
, &dpi_y
);
529 ok(hr
== S_OK
, "GetResolution error %#x\n", hr
);
530 ok(dpi_x
== 96.0, "expected 96.0, got %f\n", dpi_x
);
531 ok(dpi_y
== 96.0, "expected 96.0, got %f\n", dpi_y
);
533 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
534 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
535 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat32bppPBGRA
),
536 "got wrong format %s\n", wine_dbgstr_guid(&format
));
538 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
539 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
540 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
541 ok(hr
== WINCODEC_ERR_PALETTEUNAVAILABLE
,
542 "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %#x\n", hr
);
543 IWICPalette_Release(palette
);
549 hr
= IWICBitmapFrameDecode_CopyPixels(frame
, &rc
, 8, sizeof(data
), data
);
550 ok(hr
== S_OK
, "CopyPixels error %#x\n", hr
);
552 for (i
= 0; i
< sizeof(data
); i
++)
553 ok(data
[i
] == expected_data
[i
], "%u: expected %02x, got %02x\n", i
, expected_data
[i
], data
[i
]);
555 IWICBitmapFrameDecode_Release(frame
);
556 IWICBitmapDecoder_Release(decoder
);
559 static void generate_tiff_palette(void *buf
, unsigned count
)
561 unsigned short *r
, *g
, *b
;
581 for (i
= 4; i
< count
; i
++)
584 g
[i
] = (i
| 0x40) * 257;
585 b
[i
] = (i
| 0x80) * 257;
589 static void test_tiff_8bpp_palette(void)
591 char buf
[sizeof(tiff_8bpp_data
)];
593 IWICBitmapDecoder
*decoder
;
594 IWICBitmapFrameDecode
*frame
;
595 IWICPalette
*palette
;
600 memcpy(buf
, &tiff_8bpp_data
, sizeof(tiff_8bpp_data
));
601 generate_tiff_palette(buf
+ FIELD_OFFSET(struct tiff_8bpp_data
, palette_data
), 256);
603 hr
= create_decoder(buf
, sizeof(buf
), &decoder
);
604 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
605 if (hr
!= S_OK
) return;
607 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
608 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
610 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
611 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
612 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat8bppIndexed
),
613 "expected GUID_WICPixelFormat8bppIndexed, got %s\n", wine_dbgstr_guid(&format
));
615 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
616 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
617 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
618 ok(hr
== S_OK
, "CopyPalette error %#x\n", hr
);
620 hr
= IWICPalette_GetColorCount(palette
, &count
);
621 ok(hr
== S_OK
, "GetColorCount error %#x\n", hr
);
622 ok(count
== 256, "expected 256, got %u\n", count
);
624 hr
= IWICPalette_GetColors(palette
, 256, color
, &ret
);
625 ok(hr
== S_OK
, "GetColors error %#x\n", hr
);
626 ok(ret
== count
, "expected %u, got %u\n", count
, ret
);
627 ok(color
[0] == 0xff112233, "got %#x\n", color
[0]);
628 ok(color
[1] == 0xff445566, "got %#x\n", color
[1]);
629 ok(color
[2] == 0xff778899, "got %#x\n", color
[2]);
630 ok(color
[3] == 0xffa1b5ff, "got %#x\n", color
[3]);
632 IWICPalette_Release(palette
);
633 IWICBitmapFrameDecode_Release(frame
);
634 IWICBitmapDecoder_Release(decoder
);
637 static void test_tiff_resolution(void)
640 IWICBitmapDecoder
*decoder
;
641 IWICBitmapFrameDecode
*frame
;
645 for (i
= 0; i
< sizeof(tiff_resolution_test_data
)/sizeof(tiff_resolution_test_data
[0]); i
++)
647 const struct tiff_resolution_test_data
*test_data
= &tiff_resolution_test_data
[i
];
648 tiff_resolution_image_data
.resx
= test_data
->resx
;
649 tiff_resolution_image_data
.resy
= test_data
->resy
;
650 tiff_resolution_image_data
.entry
[12].value
= test_data
->resolution_unit
;
652 hr
= create_decoder(&tiff_resolution_image_data
, sizeof(tiff_resolution_image_data
), &decoder
);
653 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
654 if (hr
!= S_OK
) return;
656 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
657 ok(hr
== S_OK
, "%d: GetFrame error %#x\n", i
, hr
);
659 hr
= IWICBitmapFrameDecode_GetResolution(frame
, &dpi_x
, &dpi_y
);
660 ok(hr
== S_OK
, "%d: GetResolution error %#x\n", i
, hr
);
662 if (test_data
->broken_dpi_x
!= 0)
664 ok(fabs(dpi_x
- test_data
->expected_dpi_x
) < 0.01 || broken(fabs(dpi_x
- test_data
->broken_dpi_x
) < 0.01),
665 "%d: x: expected %f or %f, got %f\n", i
, test_data
->expected_dpi_x
, test_data
->broken_dpi_x
, dpi_x
);
669 ok(fabs(dpi_x
- test_data
->expected_dpi_x
) < 0.01,
670 "%d: x: expected %f, got %f\n", i
, test_data
->expected_dpi_x
, dpi_x
);
673 if (test_data
->broken_dpi_y
!= 0)
675 ok(fabs(dpi_y
- test_data
->expected_dpi_y
) < 0.01 || broken(fabs(dpi_y
- test_data
->broken_dpi_y
) < 0.01),
676 "%d: y: expected %f or %f, got %f\n", i
, test_data
->expected_dpi_y
, test_data
->broken_dpi_y
, dpi_y
);
680 ok(fabs(dpi_y
- test_data
->expected_dpi_y
) < 0.01,
681 "%d: y: expected %f, got %f\n", i
, test_data
->expected_dpi_y
, dpi_y
);
684 IWICBitmapFrameDecode_Release(frame
);
685 IWICBitmapDecoder_Release(decoder
);
689 #include "pshpack2.h"
690 static const struct tiff_1x1_data
695 USHORT number_of_entries
;
696 struct IFD_entry entry
[12];
698 struct IFD_rational res
;
699 short palette_data
[3][256];
704 #ifdef WORDS_BIGENDIAN
710 FIELD_OFFSET(struct tiff_1x1_data
, number_of_entries
),
713 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
714 { 0x100, IFD_LONG
, 1, 1 }, /* IMAGEWIDTH */
715 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
716 { 0x102, IFD_SHORT
, 3, FIELD_OFFSET(struct tiff_1x1_data
, bps_data
) }, /* BITSPERSAMPLE */
717 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
718 { 0x106, IFD_SHORT
, 1, 2 }, /* PHOTOMETRIC */
719 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) }, /* STRIPOFFSETS */
720 { 0x115, IFD_SHORT
, 1, 3 }, /* SAMPLESPERPIXEL */
721 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1x1_data
, res
) },
722 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1x1_data
, res
) },
723 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
724 { 0x140, IFD_SHORT
, 256*3, FIELD_OFFSET(struct tiff_1x1_data
, palette_data
) } /* COLORMAP */
730 { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 }
734 static UINT
width_bytes(UINT width
, UINT bpp
)
736 return (width
* bpp
+ 7) / 8;
739 static void test_color_formats(void)
746 const WICPixelFormatGUID
*format
;
749 static const BYTE bits_1bpsBGR
[] = { 0,255,0,255,0,255,255,255,0,0,0,255,255,0,0,0,255,255,255,255,255,0,0,0,0,255,0,255,0,255 };
750 static const struct bitmap_data data_1bpsBGR
=
752 24, 10, 2, &GUID_WICPixelFormat24bppBGR
, bits_1bpsBGR
754 static const BYTE bits_4bpsBGR
[] = { 204,85,85,136,187,51,0,85,85,85,0,68,0,102,0,136,0,119,0,153,0 };
755 static const struct bitmap_data data_4bpsBGR
=
757 24, 5, 2, &GUID_WICPixelFormat24bppBGR
, bits_4bpsBGR
759 static const BYTE bits_8bpsBGR
[] = { 2,0,1,5,4,3,8,7,6 };
760 static const struct bitmap_data data_8bpsBGR
=
762 24, 3, 1, &GUID_WICPixelFormat24bppBGR
, bits_8bpsBGR
764 static const BYTE bits_48bppRGB
[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
765 static const struct bitmap_data data_48bppRGB
=
767 48, 2, 1, &GUID_WICPixelFormat48bppRGB
, bits_48bppRGB
769 static const BYTE bits_1bpsBGRA
[] = { 0,255,0,255,0,255,0,255,0,255,255,0,255,0,0,255,255,0,255,255,0,0,255,0,0,255,0,255,0,255,0,255,0,0,0,0,0,255,0,0 };
770 static const struct bitmap_data data_1bpsBGRA
=
772 32, 5, 2, &GUID_WICPixelFormat32bppBGRA
, bits_1bpsBGRA
774 static const BYTE bits_4bpsBGRA
[] = { 204,85,85,51,85,136,187,85,0,68,0,85,0,102,0,119,0,136,0,153,0,0,0,17,0,34,0,51 };
775 static const struct bitmap_data data_4bpsBGRA
=
777 32, 5, 2, &GUID_WICPixelFormat32bppBGRA
, bits_4bpsBGRA
779 static const BYTE bits_8bpsBGRA
[] = { 2,0,1,3,6,5,4,7,0,9,8,1,4,3,2,5 };
780 static const struct bitmap_data data_8bpsBGRA
=
782 32, 4, 1, &GUID_WICPixelFormat32bppBGRA
, bits_8bpsBGRA
784 static const BYTE bits_64bppRGBA
[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
785 static const struct bitmap_data data_64bppRGBA
=
787 64, 2, 1, &GUID_WICPixelFormat64bppRGBA
, bits_64bppRGBA
789 static const BYTE bits_BlackWhite
[] = { 85,195,184,85 };
790 static const struct bitmap_data data_BlackWhite
=
792 1, 30, 1, &GUID_WICPixelFormatBlackWhite
, bits_BlackWhite
794 static const BYTE bits_BlackWhite_xp
[] = { 85,195,184,84 };
795 static const struct bitmap_data data_BlackWhite_xp
=
797 1, 30, 1, &GUID_WICPixelFormatBlackWhite
, bits_BlackWhite_xp
799 static const BYTE bits_4bppGray
[] = { 85,195,184,85 };
800 static const struct bitmap_data data_4bppGray
=
802 4, 7, 1, &GUID_WICPixelFormat4bppGray
, bits_4bppGray
804 static const BYTE bits_4bppGray_xp
[] = { 85,195,184,80 };
805 static const struct bitmap_data data_4bppGray_xp
=
807 4, 7, 1, &GUID_WICPixelFormat4bppGray
, bits_4bppGray_xp
809 static const BYTE bits_8bppGray
[] = { 1,0,2,3,4,5,6,7,8,9 };
810 static const struct bitmap_data data_8bppGray
=
812 8, 10, 1, &GUID_WICPixelFormat8bppGray
, bits_8bppGray
814 static const BYTE bits_16bppGray
[] = { 1,0,2,3,4,5 };
815 static const struct bitmap_data data_16bppGray
=
817 16, 3, 1, &GUID_WICPixelFormat16bppGray
, bits_16bppGray
819 static const BYTE bits_32bppGrayFloat
[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
820 static const struct bitmap_data data_32bppGrayFloat
=
822 32, 3, 1, &GUID_WICPixelFormat32bppGrayFloat
, bits_32bppGrayFloat
825 static const BYTE bits_96bpp3Channels
[] = { 0 };
826 static const struct bitmap_data data_96bpp3Channels
=
828 64, 1, 1, &GUID_WICPixelFormat96bpp3Channels
, bits_96bpp3Channels
831 static const BYTE bits_128bppRGBAFloat
[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
832 static const struct bitmap_data data_128bppRGBAFloat
=
834 128, 1, 1, &GUID_WICPixelFormat128bppRGBAFloat
, bits_128bppRGBAFloat
836 static const BYTE bits_1bppIndexed
[] = { 85,195,184,85 };
837 static const struct bitmap_data data_1bppIndexed
=
839 1, 32, 1, &GUID_WICPixelFormat1bppIndexed
, bits_1bppIndexed
841 static const BYTE bits_4bppIndexed
[] = { 85,195,184,85 };
842 static const struct bitmap_data data_4bppIndexed
=
844 4, 7, 1, &GUID_WICPixelFormat4bppIndexed
, bits_4bppIndexed
846 static const BYTE bits_4bppIndexed_xp
[] = { 85,195,184,80 };
847 static const struct bitmap_data data_4bppIndexed_xp
=
849 4, 7, 1, &GUID_WICPixelFormat4bppIndexed
, bits_4bppIndexed_xp
851 static const BYTE bits_8bppIndexed
[] = { 1,0,2,3,4,5,6,7,8,9 };
852 static const struct bitmap_data data_8bppIndexed
=
854 8, 3, 1, &GUID_WICPixelFormat8bppIndexed
, bits_8bppIndexed
856 static const BYTE bits_32bppCMYK
[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
857 static const struct bitmap_data data_32bppCMYK
=
859 32, 3, 1, &GUID_WICPixelFormat32bppCMYK
, bits_32bppCMYK
861 static const BYTE bits_64bppCMYK
[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
862 static const struct bitmap_data data_64bppCMYK
=
864 64, 2, 1, &GUID_WICPixelFormat64bppCMYK
, bits_64bppCMYK
868 int photometric
; /* PhotometricInterpretation */
869 int samples
; /* SamplesPerPixel */
870 int bps
; /* BitsPerSample */
871 const struct bitmap_data
*data
;
872 const struct bitmap_data
*alt_data
;
876 { 2, 3, 1, &data_1bpsBGR
},
877 { 2, 3, 4, &data_4bpsBGR
},
878 { 2, 3, 8, &data_8bpsBGR
},
879 { 2, 3, 16, &data_48bppRGB
},
882 { 2, 3, 32, &data_96bpp3Channels
},
884 { 2, 4, 1, &data_1bpsBGRA
},
885 { 2, 4, 4, &data_4bpsBGRA
},
886 { 2, 4, 8, &data_8bpsBGRA
},
887 { 2, 4, 16, &data_64bppRGBA
},
889 { 2, 4, 32, &data_128bppRGBAFloat
},
890 /* 1 - BlackIsZero (Bilevel) */
891 { 1, 1, 1, &data_BlackWhite
, &data_BlackWhite_xp
},
892 { 1, 1, 4, &data_4bppGray
, &data_4bppGray_xp
},
893 { 1, 1, 8, &data_8bppGray
},
894 { 1, 1, 16, &data_16bppGray
},
896 { 1, 1, 32, &data_32bppGrayFloat
},
897 /* 3 - Palette Color */
898 { 3, 1, 1, &data_1bppIndexed
},
899 { 3, 1, 4, &data_4bppIndexed
, &data_4bppIndexed_xp
},
900 { 3, 1, 8, &data_8bppIndexed
},
901 #if 0 /* FIXME: for some reason libtiff replaces photometric 3 by 1 for bps > 8 */
902 { 3, 1, 16, &data_8bppIndexed
},
903 { 3, 1, 24, &data_8bppIndexed
},
904 { 3, 1, 32, &data_8bppIndexed
},
909 { 5, 4, 8, &data_32bppCMYK
},
910 { 5, 4, 16, &data_64bppCMYK
},
914 BYTE buf
[sizeof(tiff_1x1_data
)];
917 IWICBitmapDecoder
*decoder
;
918 IWICBitmapFrameDecode
*frame
;
920 UINT count
, i
, bpp
, channels
, ret
;
922 struct IFD_entry
*tag
, *tag_photo
= NULL
, *tag_bps
= NULL
, *tag_samples
= NULL
, *tag_colormap
= NULL
;
923 struct IFD_entry
*tag_width
= NULL
, *tag_height
= NULL
;
926 memcpy(buf
, &tiff_1x1_data
, sizeof(tiff_1x1_data
));
927 generate_tiff_palette(buf
+ FIELD_OFFSET(struct tiff_1x1_data
, palette_data
), 256);
929 count
= *(short *)(buf
+ tiff_1x1_data
.dir_offset
);
930 tag
= (struct IFD_entry
*)(buf
+ tiff_1x1_data
.dir_offset
+ sizeof(short));
932 /* verify the TIFF structure */
933 for (i
= 0; i
< count
; i
++)
935 if (tag
[i
].id
== 0x100) /* ImageWidth */
937 else if (tag
[i
].id
== 0x101) /* ImageLength */
938 tag_height
= &tag
[i
];
939 else if (tag
[i
].id
== 0x102) /* BitsPerSample */
941 else if (tag
[i
].id
== 0x106) /* PhotometricInterpretation */
943 else if (tag
[i
].id
== 0x115) /* SamplesPerPixel */
944 tag_samples
= &tag
[i
];
945 else if (tag
[i
].id
== 0x140) /* ColorMap */
946 tag_colormap
= &tag
[i
];
949 ok(tag_bps
&& tag_photo
&& tag_samples
&& tag_colormap
, "tag 0x102,0x106,0x115 or 0x140 is missing\n");
950 if (!tag_bps
|| !tag_photo
|| !tag_samples
|| !tag_colormap
) return;
952 ok(tag_bps
->type
== IFD_SHORT
, "tag 0x102 should have type IFD_SHORT\n");
953 bps
= (short *)(buf
+ tag_bps
->value
);
954 ok(bps
[0] == 8 && bps
[1] == 8 && bps
[2] == 8 && bps
[3] == 0,
955 "expected bps 8,8,8,0 got %d,%d,%d,%d\n", bps
[0], bps
[1], bps
[2], bps
[3]);
957 for (i
= 0; i
< sizeof(td
)/sizeof(td
[0]); i
++)
961 bpp
= td
[i
].samples
* td
[i
].bps
;
962 if (winetest_debug
> 1)
963 trace("samples %u, bps %u, bpp %u, width %u => width_bytes %u\n", td
[i
].samples
, td
[i
].bps
, bpp
,
964 td
[i
].data
->width
, width_bytes(td
[i
].data
->width
, bpp
));
965 tag_width
->value
= td
[i
].data
->width
;
966 tag_height
->value
= td
[i
].data
->height
;
970 tag_width
->value
= 1;
971 tag_height
->value
= 1;
974 tag_colormap
->count
= (1 << td
[i
].bps
) * 3;
978 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
)] = 0x55;
979 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 1] = 0xc3;
980 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 2] = 0xb8;
981 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 3] = 0x55;
985 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
)] = 1;
986 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 1] = 0;
987 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 2] = 2;
988 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 3] = 3;
991 tag_photo
->value
= td
[i
].photometric
;
992 tag_bps
->count
= td
[i
].samples
;
993 tag_samples
->value
= td
[i
].samples
;
995 if (td
[i
].samples
== 1)
996 tag_bps
->value
= td
[i
].bps
;
997 else if (td
[i
].samples
== 2)
998 tag_bps
->value
= MAKELONG(td
[i
].bps
, td
[i
].bps
);
999 else if (td
[i
].samples
== 3)
1001 tag_bps
->value
= (BYTE
*)bps
- buf
;
1002 bps
[0] = bps
[1] = bps
[2] = td
[i
].bps
;
1004 else if (td
[i
].samples
== 4)
1006 tag_bps
->value
= (BYTE
*)bps
- buf
;
1007 bps
[0] = bps
[1] = bps
[2] = bps
[3] = td
[i
].bps
;
1011 ok(0, "%u: unsupported samples count %d\n", i
, td
[i
].samples
);
1015 hr
= create_decoder(buf
, sizeof(buf
), &decoder
);
1018 ok(hr
== WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT
|| hr
== WINCODEC_ERR_COMPONENTNOTFOUND
/* win8+ */ || WINCODEC_ERR_BADIMAGE
/* XP */,
1019 "%u: (%d,%d,%d) wrong error %#x\n", i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
, hr
);
1022 IWICBitmapDecoder_Release(decoder
);
1028 ok(hr
== S_OK
|| broken(hr
== WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT
|| hr
== WINCODEC_ERR_BADIMAGE
) /* XP */,
1029 "%u: failed to load TIFF image data (%d,%d,%d) %#x\n",
1030 i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
, hr
);
1031 if (hr
!= S_OK
) continue;
1033 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
1034 ok(hr
== S_OK
, "%u: GetFrame error %#x\n", i
, hr
);
1036 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
1037 ok(hr
== S_OK
, "%u: GetPixelFormat error %#x\n", i
, hr
);
1038 ok(IsEqualGUID(&format
, td
[i
].data
->format
),
1039 "%u (%d,%d,%d): expected %s, got %s\n",
1040 i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
,
1041 wine_dbgstr_guid(td
[i
].data
->format
), wine_dbgstr_guid(&format
));
1043 trasparency
= (td
[i
].photometric
== 2 && td
[i
].samples
== 4); /* for XP */
1044 hr
= get_pixelformat_info(&format
, &bpp
, &channels
, &trasparency
);
1045 ok(hr
== S_OK
, "%u: get_pixelformat_bpp error %#x\n", i
, hr
);
1046 ok(bpp
== td
[i
].data
->bpp
, "%u: expected %u, got %u\n", i
, td
[i
].data
->bpp
, bpp
);
1047 ok(channels
== td
[i
].samples
, "%u: expected %u, got %u\n", i
, td
[i
].samples
, channels
);
1048 ok(trasparency
== (td
[i
].photometric
== 2 && td
[i
].samples
== 4), "%u: got %u\n", i
, trasparency
);
1050 memset(pixels
, 0, sizeof(pixels
));
1051 hr
= IWICBitmapFrameDecode_CopyPixels(frame
, NULL
, width_bytes(td
[i
].data
->width
, bpp
), sizeof(pixels
), pixels
);
1052 ok(hr
== S_OK
, "%u: CopyPixels error %#x\n", i
, hr
);
1053 ret
= memcmp(pixels
, td
[i
].data
->bits
, width_bytes(td
[i
].data
->width
, bpp
));
1054 if (ret
&& td
[i
].alt_data
)
1055 ret
= memcmp(pixels
, td
[i
].alt_data
->bits
, width_bytes(td
[i
].data
->width
, bpp
));
1056 ok(ret
== 0, "%u: (%d,%d,%d) wrong pixel data\n", i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
);
1059 UINT j
, n
= width_bytes(td
[i
].data
->width
, bpp
);
1060 for (j
= 0; j
< n
; j
++)
1061 printf("%u%s", pixels
[j
], (j
+ 1) < n
? "," : "\n");
1064 IWICBitmapFrameDecode_Release(frame
);
1065 IWICBitmapDecoder_Release(decoder
);
1069 START_TEST(tiffformat
)
1073 CoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
1075 hr
= CoCreateInstance(&CLSID_WICImagingFactory
, NULL
, CLSCTX_INPROC_SERVER
,
1076 &IID_IWICImagingFactory
, (void **)&factory
);
1077 ok(hr
== S_OK
, "CoCreateInstance error %#x\n", hr
);
1078 if (FAILED(hr
)) return;
1080 test_color_formats();
1081 test_tiff_1bpp_palette();
1082 test_tiff_8bpp_palette();
1083 test_QueryCapability();
1084 test_tiff_8bpp_alpha();
1085 test_tiff_resolution();
1087 IWICImagingFactory_Release(factory
);