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"
29 #define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
30 static void _expect_ref(IUnknown
* obj
, ULONG ref
, int line
)
34 rc
= IUnknown_Release(obj
);
35 ok_(__FILE__
,line
)(rc
== ref
, "expected refcount %d, got %d\n", ref
, rc
);
42 #define IFD_RATIONAL 5
44 #define IFD_UNDEFINED 7
47 #define IFD_SRATIONAL 10
66 static const struct tiff_1bpp_data
71 USHORT number_of_entries
;
72 struct IFD_entry entry
[13];
74 struct IFD_rational res
;
78 #ifdef WORDS_BIGENDIAN
84 FIELD_OFFSET(struct tiff_1bpp_data
, number_of_entries
),
87 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
88 { 0x100, IFD_LONG
, 1, 1 }, /* IMAGEWIDTH */
89 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
90 { 0x102, IFD_SHORT
, 1, 1 }, /* BITSPERSAMPLE */
91 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
92 { 0x106, IFD_SHORT
, 1, 1 }, /* PHOTOMETRIC */
93 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_1bpp_data
, pixel_data
) }, /* STRIPOFFSETS */
94 { 0x115, IFD_SHORT
, 1, 1 }, /* SAMPLESPERPIXEL */
95 { 0x116, IFD_LONG
, 1, 1 }, /* ROWSPERSTRIP */
96 { 0x117, IFD_LONG
, 1, 1 }, /* STRIPBYTECOUNT */
97 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1bpp_data
, res
) }, /* XRESOLUTION */
98 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1bpp_data
, res
) }, /* YRESOLUTION */
99 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
103 { 0x11, 0x22, 0x33, 0 }
106 static const struct tiff_8bpp_alpha
111 USHORT number_of_entries
;
112 struct IFD_entry entry
[15];
114 struct IFD_rational res
;
118 #ifdef WORDS_BIGENDIAN
124 FIELD_OFFSET(struct tiff_8bpp_alpha
, number_of_entries
),
127 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
128 { 0x100, IFD_LONG
, 1, 2 }, /* IMAGEWIDTH */
129 { 0x101, IFD_LONG
, 1, 2 }, /* IMAGELENGTH */
130 { 0x102, IFD_SHORT
, 2, MAKELONG(8, 8) }, /* BITSPERSAMPLE */
131 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
132 { 0x106, IFD_SHORT
, 1, 1 }, /* PHOTOMETRIC */
133 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_8bpp_alpha
, pixel_data
) }, /* STRIPOFFSETS */
134 { 0x115, IFD_SHORT
, 1, 2 }, /* SAMPLESPERPIXEL */
135 { 0x116, IFD_LONG
, 1, 2 }, /* ROWSPERSTRIP */
136 { 0x117, IFD_LONG
, 1, 8 }, /* STRIPBYTECOUNT */
137 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_8bpp_alpha
, res
) }, /* XRESOLUTION */
138 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_8bpp_alpha
, res
) }, /* YRESOLUTION */
139 { 0x11c, IFD_SHORT
, 1, 1 }, /* PLANARCONFIGURATION */
140 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
141 { 0x152, IFD_SHORT
, 1, 1 } /* EXTRASAMPLES: 1 - Associated alpha with pre-multiplied color */
145 { 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88 }
148 static const struct tiff_8bpp_data
153 USHORT number_of_entries
;
154 struct IFD_entry entry
[14];
156 struct IFD_rational res
;
157 short palette_data
[3][256];
161 #ifdef WORDS_BIGENDIAN
167 FIELD_OFFSET(struct tiff_8bpp_data
, number_of_entries
),
170 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
171 { 0x100, IFD_LONG
, 1, 4 }, /* IMAGEWIDTH */
172 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
173 { 0x102, IFD_SHORT
, 1, 8 }, /* BITSPERSAMPLE: XP doesn't accept IFD_LONG here */
174 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
175 { 0x106, IFD_SHORT
, 1, 3 }, /* PHOTOMETRIC */
176 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_8bpp_data
, pixel_data
) }, /* STRIPOFFSETS */
177 { 0x115, IFD_SHORT
, 1, 1 }, /* SAMPLESPERPIXEL */
178 { 0x116, IFD_LONG
, 1, 1 }, /* ROWSPERSTRIP */
179 { 0x117, IFD_LONG
, 1, 1 }, /* STRIPBYTECOUNT */
180 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_8bpp_data
, res
) },
181 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_8bpp_data
, res
) },
182 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
183 { 0x140, IFD_SHORT
, 256*3, FIELD_OFFSET(struct tiff_8bpp_data
, palette_data
) } /* COLORMAP */
191 static const struct tiff_resolution_test_data
193 struct IFD_rational resx
;
194 struct IFD_rational resy
;
195 LONG resolution_unit
;
196 double expected_dpi_x
;
197 double expected_dpi_y
;
198 /* if != 0: values for different behavior of some Windows versions */
201 } tiff_resolution_test_data
[] =
203 { { 100, 1 }, { 50, 1 }, 0, 100.0, 50.0, 0, 0 }, /* invalid resolution unit */
204 { { 50, 1 }, { 100, 1 }, 0, 50.0, 100.0, 0, 0 },
206 { { 100, 1 }, { 50, 1 }, 1, 100.0, 50.0, 0, 0 }, /* RESUNIT_NONE */
207 { { 50, 1 }, { 100, 1 }, 1, 50.0, 100.0, 0, 0 },
209 { { 49, 1 }, { 49, 1 }, 2, 49.0, 49.0, 0, 0 }, /* same resolution for both X and Y */
210 { { 33, 1 }, { 55, 1 }, 2, 33.0, 55.0, 0, 0 }, /* different resolutions for X and Y */
211 { { 50, 2 }, { 66, 3 }, 2, 25.0, 22.0, 0, 0 }, /* denominator != 1 */
213 { { 100, 1 }, { 200, 1 }, 3, 254.0, 508.0, 0, 0 }, /* unit = centimeters */
215 /* XP and Server 2003 do not discard both resolution values if only one of them is invalid */
216 { { 0, 1 }, { 29, 1 }, 2, 96.0, 96.0, 0, 29.0 }, /* resolution 0 */
217 { { 58, 1 }, { 29, 0 }, 2, 96.0, 96.0, 58.0, 0 }, /* denominator 0 (division by zero) */
219 /* XP and Server 2003 return 96 dots per centimeter (= 243.84 dpi) as fallback value */
220 { { 0, 1 }, { 100, 1 }, 3, 96.0, 96.0, 243.84, 254.0 }, /* resolution 0 and unit = centimeters */
221 { { 50, 1 }, { 72, 0 }, 3, 96.0, 96.0, 127.0, 243.84 } /* denominator 0 and unit = centimeters */
224 static struct tiff_resolution_image_data
229 USHORT number_of_entries
;
230 struct IFD_entry entry
[13];
232 struct IFD_rational resx
;
233 struct IFD_rational resy
;
235 } tiff_resolution_image_data
=
237 #ifdef WORDS_BIGENDIAN
243 FIELD_OFFSET(struct tiff_resolution_image_data
, number_of_entries
),
246 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
247 { 0x100, IFD_LONG
, 1, 1 }, /* IMAGEWIDTH */
248 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
249 { 0x102, IFD_SHORT
, 1, 1 }, /* BITSPERSAMPLE */
250 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
251 { 0x106, IFD_SHORT
, 1, 1 }, /* PHOTOMETRIC */
252 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_resolution_image_data
, pixel_data
) }, /* STRIPOFFSETS */
253 { 0x115, IFD_SHORT
, 1, 1 }, /* SAMPLESPERPIXEL */
254 { 0x116, IFD_LONG
, 1, 1 }, /* ROWSPERSTRIP */
255 { 0x117, IFD_LONG
, 1, 1 }, /* STRIPBYTECOUNT */
256 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_resolution_image_data
, resx
) }, /* XRESOLUTION */
257 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_resolution_image_data
, resy
) }, /* YRESOLUTION */
258 { 0x128, IFD_SHORT
, 1, 1 }, /* RESOLUTIONUNIT -- value will be filled with test data */
261 { 72, 1 }, /* value will be filled with test data */
262 { 72, 1 }, /* value will be filled with test data */
263 { 0x11, 0x22, 0x33, 0 }
266 static const struct tiff_24bpp_data
271 USHORT number_of_entries
;
272 struct IFD_entry entry
[13];
274 struct IFD_rational res
;
278 #ifdef WORDS_BIGENDIAN
284 FIELD_OFFSET(struct tiff_1bpp_data
, number_of_entries
),
287 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
288 { 0x100, IFD_LONG
, 1, 1 }, /* IMAGEWIDTH */
289 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
290 { 0x102, IFD_SHORT
, 1, 8 }, /* BITSPERSAMPLE */
291 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
292 { 0x106, IFD_SHORT
, 1, 2 }, /* PHOTOMETRIC */
293 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_24bpp_data
, pixel_data
) }, /* STRIPOFFSETS */
294 { 0x115, IFD_SHORT
, 1, 3 }, /* SAMPLESPERPIXEL */
295 { 0x116, IFD_LONG
, 1, 1 }, /* ROWSPERSTRIP */
296 { 0x117, IFD_LONG
, 1, 3 }, /* STRIPBYTECOUNT */
297 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_24bpp_data
, res
) }, /* XRESOLUTION */
298 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_24bpp_data
, res
) }, /* YRESOLUTION */
299 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
306 static const struct tiff_4bps_bgra
311 USHORT number_of_entries
;
312 struct IFD_entry entry
[14];
314 struct IFD_rational res
;
318 #ifdef WORDS_BIGENDIAN
324 FIELD_OFFSET(struct tiff_4bps_bgra
, number_of_entries
),
327 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
328 { 0x100, IFD_LONG
, 1, 3 }, /* IMAGEWIDTH */
329 { 0x101, IFD_LONG
, 1, 2 }, /* IMAGELENGTH */
330 { 0x102, IFD_SHORT
, 1, 1 }, /* BITSPERSAMPLE */
331 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION */
332 { 0x106, IFD_SHORT
, 1, 2 }, /* PHOTOMETRIC */
333 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_4bps_bgra
, pixel_data
) }, /* STRIPOFFSETS */
334 { 0x115, IFD_SHORT
, 1, 4 }, /* SAMPLESPERPIXEL */
335 { 0x116, IFD_LONG
, 1, 2 }, /* ROWSPERSTRIP */
336 { 0x117, IFD_LONG
, 1, 4 }, /* STRIPBYTECOUNT */
337 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_4bps_bgra
, res
) }, /* XRESOLUTION */
338 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_4bps_bgra
, res
) }, /* YRESOLUTION */
339 { 0x11c, IFD_SHORT
, 1, 1 }, /* PLANARCONFIGURATION */
340 { 0x128, IFD_SHORT
, 1, 2 } /* RESOLUTIONUNIT */
344 { 0x12,0x30, 0x47,0xe0 }
348 static IWICImagingFactory
*factory
;
350 static IStream
*create_stream(const void *data
, int data_size
)
357 hdata
= GlobalAlloc(GMEM_MOVEABLE
, data_size
);
358 ok(hdata
!= 0, "GlobalAlloc failed\n");
359 if (!hdata
) return NULL
;
361 locked_data
= GlobalLock(hdata
);
362 memcpy(locked_data
, data
, data_size
);
365 hr
= CreateStreamOnHGlobal(hdata
, TRUE
, &stream
);
366 ok(hr
== S_OK
, "CreateStreamOnHGlobal failed, hr=%x\n", hr
);
371 static HRESULT
create_decoder(const void *image_data
, UINT image_size
, IWICBitmapDecoder
**decoder
)
382 hmem
= GlobalAlloc(0, image_size
);
383 data
= GlobalLock(hmem
);
384 memcpy(data
, image_data
, image_size
);
387 hr
= CreateStreamOnHGlobal(hmem
, TRUE
, &stream
);
388 ok(hr
== S_OK
, "CreateStreamOnHGlobal error %#x\n", hr
);
390 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, decoder
);
393 hr
= IWICBitmapDecoder_GetContainerFormat(*decoder
, &format
);
394 ok(hr
== S_OK
, "GetContainerFormat error %#x\n", hr
);
395 ok(IsEqualGUID(&format
, &GUID_ContainerFormatTiff
),
396 "wrong container format %s\n", wine_dbgstr_guid(&format
));
398 refcount
= IStream_Release(stream
);
399 ok(refcount
> 0, "expected stream refcount > 0\n");
405 static HRESULT
get_pixelformat_info(const GUID
*format
, UINT
*bpp
, UINT
*channels
, BOOL
*trasparency
)
408 IWICComponentInfo
*info
;
409 IWICPixelFormatInfo2
*formatinfo
;
411 hr
= IWICImagingFactory_CreateComponentInfo(factory
, format
, &info
);
412 ok(hr
== S_OK
, "CreateComponentInfo(%s) error %#x\n", wine_dbgstr_guid(format
), hr
);
415 hr
= IWICComponentInfo_QueryInterface(info
, &IID_IWICPixelFormatInfo2
, (void **)&formatinfo
);
418 hr
= IWICPixelFormatInfo2_SupportsTransparency(formatinfo
, trasparency
);
419 ok(hr
== S_OK
, "SupportsTransparency error %#x\n", hr
);
420 IWICPixelFormatInfo2_Release(formatinfo
);
422 hr
= IWICComponentInfo_QueryInterface(info
, &IID_IWICPixelFormatInfo
, (void **)&formatinfo
);
425 hr
= IWICPixelFormatInfo2_GetBitsPerPixel(formatinfo
, bpp
);
426 ok(hr
== S_OK
, "GetBitsPerPixel error %#x\n", hr
);
427 hr
= IWICPixelFormatInfo2_GetChannelCount(formatinfo
, channels
);
428 ok(hr
== S_OK
, "GetChannelCount error %#x\n", hr
);
429 IWICPixelFormatInfo2_Release(formatinfo
);
431 IWICComponentInfo_Release(info
);
436 static void dump_tiff(void *buf
)
439 struct tiff_1bpp_data
*tiff
;
440 struct IFD_entry
*tag
;
443 count
= *(short *)((char *)tiff
+ tiff
->dir_offset
);
444 tag
= (struct IFD_entry
*)((char *)tiff
+ tiff
->dir_offset
+ sizeof(short));
446 for (i
= 0; i
< count
; i
++)
448 printf("tag %u: id %04x, type %04x, count %u, value %d",
449 i
, tag
[i
].id
, tag
[i
].type
, tag
[i
].count
, tag
[i
].value
);
450 if (tag
[i
].id
== 0x102 && tag
[i
].count
> 2)
452 short *bps
= (short *)((char *)tiff
+ tag
[i
].value
);
453 printf(" (%d,%d,%d,%d)\n", bps
[0], bps
[1], bps
[2], bps
[3]);
460 static void test_tiff_1bpp_palette(void)
463 IWICBitmapDecoder
*decoder
;
464 IWICBitmapFrameDecode
*frame
;
465 IWICPalette
*palette
;
468 hr
= create_decoder(&tiff_1bpp_data
, sizeof(tiff_1bpp_data
), &decoder
);
469 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
470 if (hr
!= S_OK
) return;
472 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
473 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
475 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
476 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
477 ok(IsEqualGUID(&format
, &GUID_WICPixelFormatBlackWhite
),
478 "got wrong format %s\n", wine_dbgstr_guid(&format
));
480 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
481 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
482 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
483 ok(hr
== WINCODEC_ERR_PALETTEUNAVAILABLE
,
484 "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %#x\n", hr
);
486 IWICPalette_Release(palette
);
487 IWICBitmapFrameDecode_Release(frame
);
488 IWICBitmapDecoder_Release(decoder
);
491 static void test_QueryCapability(void)
495 IWICBitmapDecoder
*decoder
;
496 IWICBitmapFrameDecode
*frame
;
497 static const DWORD exp_caps
= WICBitmapDecoderCapabilityCanDecodeAllImages
|
498 WICBitmapDecoderCapabilityCanDecodeSomeImages
|
499 WICBitmapDecoderCapabilityCanEnumerateMetadata
;
500 static const DWORD exp_caps_xp
= WICBitmapDecoderCapabilityCanDecodeAllImages
|
501 WICBitmapDecoderCapabilityCanDecodeSomeImages
;
504 ULARGE_INTEGER cur_pos
;
507 stream
= create_stream(&tiff_1bpp_data
, sizeof(tiff_1bpp_data
));
510 hr
= IWICImagingFactory_CreateDecoder(factory
, &GUID_ContainerFormatTiff
, NULL
, &decoder
);
511 ok(hr
== S_OK
, "CreateDecoder error %#x\n", hr
);
512 if (FAILED(hr
)) return;
514 frame_count
= 0xdeadbeef;
515 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
516 ok(hr
== S_OK
|| broken(hr
== E_POINTER
) /* XP */, "GetFrameCount error %#x\n", hr
);
517 ok(frame_count
== 0, "expected 0, got %u\n", frame_count
);
519 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
520 ok(hr
== WINCODEC_ERR_FRAMEMISSING
|| broken(hr
== E_POINTER
) /* XP */, "expected WINCODEC_ERR_FRAMEMISSING, got %#x\n", hr
);
523 hr
= IStream_Seek(stream
, pos
, SEEK_SET
, NULL
);
524 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
526 capability
= 0xdeadbeef;
527 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
528 ok(hr
== S_OK
, "QueryCapability error %#x\n", hr
);
529 ok(capability
== exp_caps
|| capability
== exp_caps_xp
,
530 "expected %#x, got %#x\n", exp_caps
, capability
);
532 frame_count
= 0xdeadbeef;
533 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
534 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
535 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
537 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
538 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
539 IWICBitmapFrameDecode_Release(frame
);
542 hr
= IStream_Seek(stream
, pos
, SEEK_CUR
, &cur_pos
);
543 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
544 ok(cur_pos
.QuadPart
> 4 && cur_pos
.QuadPart
< sizeof(tiff_1bpp_data
),
545 "current stream pos is at %x/%x\n", cur_pos
.u
.LowPart
, cur_pos
.u
.HighPart
);
547 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
548 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
550 hr
= IWICBitmapDecoder_Initialize(decoder
, stream
, WICDecodeMetadataCacheOnDemand
);
551 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
553 IWICBitmapDecoder_Release(decoder
);
555 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, &decoder
);
557 ok(hr
== WINCODEC_ERR_COMPONENTNOTFOUND
, "expected WINCODEC_ERR_COMPONENTNOTFOUND, got %#x\n", hr
);
560 IWICBitmapDecoder_Release(decoder
);
563 hr
= IStream_Seek(stream
, pos
, SEEK_SET
, NULL
);
564 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
566 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, &decoder
);
567 ok(hr
== S_OK
, "CreateDecoderFromStream error %#x\n", hr
);
569 frame_count
= 0xdeadbeef;
570 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
571 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
572 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
574 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
575 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
576 IWICBitmapFrameDecode_Release(frame
);
578 hr
= IWICBitmapDecoder_Initialize(decoder
, stream
, WICDecodeMetadataCacheOnDemand
);
579 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
581 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
582 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
584 IWICBitmapDecoder_Release(decoder
);
585 IStream_Release(stream
);
588 static void test_tiff_8bpp_alpha(void)
591 IWICBitmapDecoder
*decoder
;
592 IWICBitmapFrameDecode
*frame
;
593 UINT frame_count
, width
, height
, i
;
595 IWICPalette
*palette
;
599 static const BYTE expected_data
[16] = { 0x11,0x11,0x11,0x22,0x33,0x33,0x33,0x44,
600 0x55,0x55,0x55,0x66,0x77,0x77,0x77,0x88 };
602 hr
= create_decoder(&tiff_8bpp_alpha
, sizeof(tiff_8bpp_alpha
), &decoder
);
603 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
604 if (hr
!= S_OK
) return;
606 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
607 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
608 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
610 EXPECT_REF(decoder
, 1);
611 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
612 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
613 EXPECT_REF(decoder
, 2);
614 IWICBitmapDecoder_Release(decoder
);
616 hr
= IWICBitmapFrameDecode_GetSize(frame
, &width
, &height
);
617 ok(hr
== S_OK
, "GetSize error %#x\n", hr
);
618 ok(width
== 2, "expected 2, got %u\n", width
);
619 ok(height
== 2, "expected 2, got %u\n", height
);
621 hr
= IWICBitmapFrameDecode_GetResolution(frame
, &dpi_x
, &dpi_y
);
622 ok(hr
== S_OK
, "GetResolution error %#x\n", hr
);
623 ok(dpi_x
== 96.0, "expected 96.0, got %f\n", dpi_x
);
624 ok(dpi_y
== 96.0, "expected 96.0, got %f\n", dpi_y
);
626 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
627 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
628 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat32bppPBGRA
),
629 "got wrong format %s\n", wine_dbgstr_guid(&format
));
631 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
632 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
633 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
634 ok(hr
== WINCODEC_ERR_PALETTEUNAVAILABLE
,
635 "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %#x\n", hr
);
636 IWICPalette_Release(palette
);
642 hr
= IWICBitmapFrameDecode_CopyPixels(frame
, &rc
, 8, sizeof(data
), data
);
643 ok(hr
== S_OK
, "CopyPixels error %#x\n", hr
);
645 for (i
= 0; i
< sizeof(data
); i
++)
646 ok(data
[i
] == expected_data
[i
], "%u: expected %02x, got %02x\n", i
, expected_data
[i
], data
[i
]);
648 IWICBitmapFrameDecode_Release(frame
);
651 static void generate_tiff_palette(void *buf
, unsigned count
)
653 unsigned short *r
, *g
, *b
;
673 for (i
= 4; i
< count
; i
++)
676 g
[i
] = (i
| 0x40) * 257;
677 b
[i
] = (i
| 0x80) * 257;
681 static void test_tiff_8bpp_palette(void)
683 char buf
[sizeof(tiff_8bpp_data
)];
685 IWICBitmapDecoder
*decoder
;
686 IWICBitmapFrameDecode
*frame
;
687 IWICPalette
*palette
;
692 memcpy(buf
, &tiff_8bpp_data
, sizeof(tiff_8bpp_data
));
693 generate_tiff_palette(buf
+ FIELD_OFFSET(struct tiff_8bpp_data
, palette_data
), 256);
695 hr
= create_decoder(buf
, sizeof(buf
), &decoder
);
696 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
697 if (hr
!= S_OK
) return;
699 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
700 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
702 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
703 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
704 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat8bppIndexed
),
705 "expected GUID_WICPixelFormat8bppIndexed, got %s\n", wine_dbgstr_guid(&format
));
707 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
708 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
709 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
710 ok(hr
== S_OK
, "CopyPalette error %#x\n", hr
);
712 hr
= IWICPalette_GetColorCount(palette
, &count
);
713 ok(hr
== S_OK
, "GetColorCount error %#x\n", hr
);
714 ok(count
== 256, "expected 256, got %u\n", count
);
716 hr
= IWICPalette_GetColors(palette
, 256, color
, &ret
);
717 ok(hr
== S_OK
, "GetColors error %#x\n", hr
);
718 ok(ret
== count
, "expected %u, got %u\n", count
, ret
);
719 ok(color
[0] == 0xff112233, "got %#x\n", color
[0]);
720 ok(color
[1] == 0xff445566, "got %#x\n", color
[1]);
721 ok(color
[2] == 0xff778899, "got %#x\n", color
[2]);
722 ok(color
[3] == 0xffa1b5ff, "got %#x\n", color
[3]);
724 IWICPalette_Release(palette
);
725 IWICBitmapFrameDecode_Release(frame
);
726 IWICBitmapDecoder_Release(decoder
);
729 static void test_tiff_resolution(void)
732 IWICBitmapDecoder
*decoder
;
733 IWICBitmapFrameDecode
*frame
;
737 for (i
= 0; i
< ARRAY_SIZE(tiff_resolution_test_data
); i
++)
739 const struct tiff_resolution_test_data
*test_data
= &tiff_resolution_test_data
[i
];
740 tiff_resolution_image_data
.resx
= test_data
->resx
;
741 tiff_resolution_image_data
.resy
= test_data
->resy
;
742 tiff_resolution_image_data
.entry
[12].value
= test_data
->resolution_unit
;
744 hr
= create_decoder(&tiff_resolution_image_data
, sizeof(tiff_resolution_image_data
), &decoder
);
745 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
746 if (hr
!= S_OK
) return;
748 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
749 ok(hr
== S_OK
, "%d: GetFrame error %#x\n", i
, hr
);
751 hr
= IWICBitmapFrameDecode_GetResolution(frame
, &dpi_x
, &dpi_y
);
752 ok(hr
== S_OK
, "%d: GetResolution error %#x\n", i
, hr
);
754 if (test_data
->broken_dpi_x
!= 0)
756 ok(fabs(dpi_x
- test_data
->expected_dpi_x
) < 0.01 || broken(fabs(dpi_x
- test_data
->broken_dpi_x
) < 0.01),
757 "%d: x: expected %f or %f, got %f\n", i
, test_data
->expected_dpi_x
, test_data
->broken_dpi_x
, dpi_x
);
761 ok(fabs(dpi_x
- test_data
->expected_dpi_x
) < 0.01,
762 "%d: x: expected %f, got %f\n", i
, test_data
->expected_dpi_x
, dpi_x
);
765 if (test_data
->broken_dpi_y
!= 0)
767 ok(fabs(dpi_y
- test_data
->expected_dpi_y
) < 0.01 || broken(fabs(dpi_y
- test_data
->broken_dpi_y
) < 0.01),
768 "%d: y: expected %f or %f, got %f\n", i
, test_data
->expected_dpi_y
, test_data
->broken_dpi_y
, dpi_y
);
772 ok(fabs(dpi_y
- test_data
->expected_dpi_y
) < 0.01,
773 "%d: y: expected %f, got %f\n", i
, test_data
->expected_dpi_y
, dpi_y
);
776 IWICBitmapFrameDecode_Release(frame
);
777 IWICBitmapDecoder_Release(decoder
);
781 static void test_tiff_24bpp(void)
784 IWICBitmapDecoder
*decoder
;
785 IWICBitmapFrameDecode
*frame
;
786 UINT count
, width
, height
, i
, stride
;
791 static const BYTE expected_data
[] = { 0x33,0x22,0x11 };
793 hr
= create_decoder(&tiff_24bpp_data
, sizeof(tiff_24bpp_data
), &decoder
);
794 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
795 if (hr
!= S_OK
) return;
796 ok(decoder
!= NULL
, "Failed to load TIFF image data\n");
798 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &count
);
799 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
800 ok(count
== 1, "got %u\n", count
);
802 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
803 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
805 hr
= IWICBitmapFrameDecode_GetSize(frame
, &width
, &height
);
806 ok(hr
== S_OK
, "GetSize error %#x\n", hr
);
807 ok(width
== 1, "got %u\n", width
);
808 ok(height
== 1, "got %u\n", height
);
810 hr
= IWICBitmapFrameDecode_GetResolution(frame
, &dpi_x
, &dpi_y
);
811 ok(hr
== S_OK
, "GetResolution error %#x\n", hr
);
812 ok(dpi_x
== 300.0, "got %f\n", dpi_x
);
813 ok(dpi_y
== 300.0, "got %f\n", dpi_y
);
815 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
816 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
817 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat24bppBGR
),
818 "got wrong format %s\n", wine_dbgstr_guid(&format
));
820 for (stride
= 0; stride
<= 32; stride
++)
822 memset(data
, 0, sizeof(data
));
827 hr
= IWICBitmapFrameDecode_CopyPixels(frame
, &rc
, stride
, sizeof(data
), data
);
829 ok(hr
== E_INVALIDARG
, "CopyPixels(%u) should fail: %#x\n", stride
, hr
);
832 ok(hr
== S_OK
, "CopyPixels(%u) error %#x\n", stride
, hr
);
834 for (i
= 0; i
< sizeof(data
); i
++)
835 ok(data
[i
] == expected_data
[i
], "%u: expected %02x, got %02x\n", i
, expected_data
[i
], data
[i
]);
839 IWICBitmapFrameDecode_Release(frame
);
840 IWICBitmapDecoder_Release(decoder
);
843 #include "pshpack2.h"
844 static const struct tiff_1x1_data
849 USHORT number_of_entries
;
850 struct IFD_entry entry
[12];
852 struct IFD_rational res
;
853 short palette_data
[3][256];
858 #ifdef WORDS_BIGENDIAN
864 FIELD_OFFSET(struct tiff_1x1_data
, number_of_entries
),
867 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
868 { 0x100, IFD_LONG
, 1, 1 }, /* IMAGEWIDTH */
869 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
870 { 0x102, IFD_SHORT
, 3, FIELD_OFFSET(struct tiff_1x1_data
, bps_data
) }, /* BITSPERSAMPLE */
871 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
872 { 0x106, IFD_SHORT
, 1, 2 }, /* PHOTOMETRIC */
873 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) }, /* STRIPOFFSETS */
874 { 0x115, IFD_SHORT
, 1, 3 }, /* SAMPLESPERPIXEL */
875 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1x1_data
, res
) },
876 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1x1_data
, res
) },
877 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
878 { 0x140, IFD_SHORT
, 256*3, FIELD_OFFSET(struct tiff_1x1_data
, palette_data
) } /* COLORMAP */
884 { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 }
888 static UINT
width_bytes(UINT width
, UINT bpp
)
890 return (width
* bpp
+ 7) / 8;
893 static void test_color_formats(void)
900 const WICPixelFormatGUID
*format
;
903 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 };
904 static const struct bitmap_data data_1bpsBGR
=
906 24, 10, 2, &GUID_WICPixelFormat24bppBGR
, bits_1bpsBGR
908 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 };
909 static const struct bitmap_data data_4bpsBGR
=
911 24, 5, 2, &GUID_WICPixelFormat24bppBGR
, bits_4bpsBGR
913 static const BYTE bits_8bpsBGR
[] = { 2,0,1,5,4,3,8,7,6 };
914 static const struct bitmap_data data_8bpsBGR
=
916 24, 3, 1, &GUID_WICPixelFormat24bppBGR
, bits_8bpsBGR
918 static const BYTE bits_48bppRGB
[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
919 static const struct bitmap_data data_48bppRGB
=
921 48, 2, 1, &GUID_WICPixelFormat48bppRGB
, bits_48bppRGB
923 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 };
924 static const struct bitmap_data data_1bpsBGRA
=
926 32, 5, 2, &GUID_WICPixelFormat32bppBGRA
, bits_1bpsBGRA
928 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 };
929 static const struct bitmap_data data_4bpsBGRA
=
931 32, 5, 2, &GUID_WICPixelFormat32bppBGRA
, bits_4bpsBGRA
933 static const BYTE bits_8bpsBGRA
[] = { 2,0,1,3,6,5,4,7,0,9,8,1,4,3,2,5 };
934 static const struct bitmap_data data_8bpsBGRA
=
936 32, 4, 1, &GUID_WICPixelFormat32bppBGRA
, bits_8bpsBGRA
938 static const BYTE bits_64bppRGBA
[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
939 static const struct bitmap_data data_64bppRGBA
=
941 64, 2, 1, &GUID_WICPixelFormat64bppRGBA
, bits_64bppRGBA
943 static const BYTE bits_BlackWhite
[] = { 85,195,184,85 };
944 static const struct bitmap_data data_BlackWhite
=
946 1, 30, 1, &GUID_WICPixelFormatBlackWhite
, bits_BlackWhite
948 static const BYTE bits_BlackWhite_xp
[] = { 85,195,184,84 };
949 static const struct bitmap_data data_BlackWhite_xp
=
951 1, 30, 1, &GUID_WICPixelFormatBlackWhite
, bits_BlackWhite_xp
953 static const BYTE bits_4bppGray
[] = { 85,195,184,85 };
954 static const struct bitmap_data data_4bppGray
=
956 4, 7, 1, &GUID_WICPixelFormat4bppGray
, bits_4bppGray
958 static const BYTE bits_4bppGray_xp
[] = { 85,195,184,80 };
959 static const struct bitmap_data data_4bppGray_xp
=
961 4, 7, 1, &GUID_WICPixelFormat4bppGray
, bits_4bppGray_xp
963 static const BYTE bits_8bppGray
[] = { 1,0,2,3,4,5,6,7,8,9 };
964 static const struct bitmap_data data_8bppGray
=
966 8, 10, 1, &GUID_WICPixelFormat8bppGray
, bits_8bppGray
968 static const BYTE bits_16bppGray
[] = { 1,0,2,3,4,5 };
969 static const struct bitmap_data data_16bppGray
=
971 16, 3, 1, &GUID_WICPixelFormat16bppGray
, bits_16bppGray
973 static const BYTE bits_32bppGrayFloat
[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
974 static const struct bitmap_data data_32bppGrayFloat
=
976 32, 3, 1, &GUID_WICPixelFormat32bppGrayFloat
, bits_32bppGrayFloat
979 static const BYTE bits_96bpp3Channels
[] = { 0 };
980 static const struct bitmap_data data_96bpp3Channels
=
982 64, 1, 1, &GUID_WICPixelFormat96bpp3Channels
, bits_96bpp3Channels
985 static const BYTE bits_128bppRGBAFloat
[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
986 static const struct bitmap_data data_128bppRGBAFloat
=
988 128, 1, 1, &GUID_WICPixelFormat128bppRGBAFloat
, bits_128bppRGBAFloat
990 static const BYTE bits_1bppIndexed
[] = { 85,195,184,85 };
991 static const struct bitmap_data data_1bppIndexed
=
993 1, 32, 1, &GUID_WICPixelFormat1bppIndexed
, bits_1bppIndexed
995 static const BYTE bits_4bppIndexed
[] = { 85,195,184,85 };
996 static const struct bitmap_data data_4bppIndexed
=
998 4, 7, 1, &GUID_WICPixelFormat4bppIndexed
, bits_4bppIndexed
1000 static const BYTE bits_4bppIndexed_xp
[] = { 85,195,184,80 };
1001 static const struct bitmap_data data_4bppIndexed_xp
=
1003 4, 7, 1, &GUID_WICPixelFormat4bppIndexed
, bits_4bppIndexed_xp
1005 static const BYTE bits_8bppIndexed
[] = { 1,0,2,3,4,5,6,7,8,9 };
1006 static const struct bitmap_data data_8bppIndexed
=
1008 8, 3, 1, &GUID_WICPixelFormat8bppIndexed
, bits_8bppIndexed
1010 static const BYTE bits_32bppCMYK
[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
1011 static const struct bitmap_data data_32bppCMYK
=
1013 32, 3, 1, &GUID_WICPixelFormat32bppCMYK
, bits_32bppCMYK
1015 static const BYTE bits_64bppCMYK
[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
1016 static const struct bitmap_data data_64bppCMYK
=
1018 64, 2, 1, &GUID_WICPixelFormat64bppCMYK
, bits_64bppCMYK
1022 int photometric
; /* PhotometricInterpretation */
1023 int samples
; /* SamplesPerPixel */
1024 int bps
; /* BitsPerSample */
1025 const struct bitmap_data
*data
;
1026 const struct bitmap_data
*alt_data
;
1030 { 2, 3, 1, &data_1bpsBGR
},
1031 { 2, 3, 4, &data_4bpsBGR
},
1032 { 2, 3, 8, &data_8bpsBGR
},
1033 { 2, 3, 16, &data_48bppRGB
},
1036 { 2, 3, 32, &data_96bpp3Channels
},
1038 { 2, 4, 1, &data_1bpsBGRA
},
1039 { 2, 4, 4, &data_4bpsBGRA
},
1040 { 2, 4, 8, &data_8bpsBGRA
},
1041 { 2, 4, 16, &data_64bppRGBA
},
1043 { 2, 4, 32, &data_128bppRGBAFloat
},
1044 /* 1 - BlackIsZero (Bilevel) */
1045 { 1, 1, 1, &data_BlackWhite
, &data_BlackWhite_xp
},
1046 { 1, 1, 4, &data_4bppGray
, &data_4bppGray_xp
},
1047 { 1, 1, 8, &data_8bppGray
},
1048 { 1, 1, 16, &data_16bppGray
},
1050 { 1, 1, 32, &data_32bppGrayFloat
},
1051 /* 3 - Palette Color */
1052 { 3, 1, 1, &data_1bppIndexed
},
1053 { 3, 1, 4, &data_4bppIndexed
, &data_4bppIndexed_xp
},
1054 { 3, 1, 8, &data_8bppIndexed
},
1055 #if 0 /* FIXME: for some reason libtiff replaces photometric 3 by 1 for bps > 8 */
1056 { 3, 1, 16, &data_8bppIndexed
},
1057 { 3, 1, 24, &data_8bppIndexed
},
1058 { 3, 1, 32, &data_8bppIndexed
},
1063 { 5, 4, 8, &data_32bppCMYK
},
1064 { 5, 4, 16, &data_64bppCMYK
},
1068 BYTE buf
[sizeof(tiff_1x1_data
)];
1071 IWICBitmapDecoder
*decoder
;
1072 IWICBitmapFrameDecode
*frame
;
1074 UINT count
, i
, bpp
, channels
, ret
;
1076 struct IFD_entry
*tag
, *tag_photo
= NULL
, *tag_bps
= NULL
, *tag_samples
= NULL
, *tag_colormap
= NULL
;
1077 struct IFD_entry
*tag_width
= NULL
, *tag_height
= NULL
;
1080 memcpy(buf
, &tiff_1x1_data
, sizeof(tiff_1x1_data
));
1081 generate_tiff_palette(buf
+ FIELD_OFFSET(struct tiff_1x1_data
, palette_data
), 256);
1083 count
= *(short *)(buf
+ tiff_1x1_data
.dir_offset
);
1084 tag
= (struct IFD_entry
*)(buf
+ tiff_1x1_data
.dir_offset
+ sizeof(short));
1086 /* verify the TIFF structure */
1087 for (i
= 0; i
< count
; i
++)
1089 if (tag
[i
].id
== 0x100) /* ImageWidth */
1090 tag_width
= &tag
[i
];
1091 else if (tag
[i
].id
== 0x101) /* ImageLength */
1092 tag_height
= &tag
[i
];
1093 else if (tag
[i
].id
== 0x102) /* BitsPerSample */
1095 else if (tag
[i
].id
== 0x106) /* PhotometricInterpretation */
1096 tag_photo
= &tag
[i
];
1097 else if (tag
[i
].id
== 0x115) /* SamplesPerPixel */
1098 tag_samples
= &tag
[i
];
1099 else if (tag
[i
].id
== 0x140) /* ColorMap */
1100 tag_colormap
= &tag
[i
];
1103 ok(tag_bps
&& tag_photo
&& tag_samples
&& tag_colormap
, "tag 0x102,0x106,0x115 or 0x140 is missing\n");
1104 if (!tag_bps
|| !tag_photo
|| !tag_samples
|| !tag_colormap
) return;
1106 ok(tag_bps
->type
== IFD_SHORT
, "tag 0x102 should have type IFD_SHORT\n");
1107 bps
= (short *)(buf
+ tag_bps
->value
);
1108 ok(bps
[0] == 8 && bps
[1] == 8 && bps
[2] == 8 && bps
[3] == 0,
1109 "expected bps 8,8,8,0 got %d,%d,%d,%d\n", bps
[0], bps
[1], bps
[2], bps
[3]);
1111 for (i
= 0; i
< sizeof(td
)/sizeof(td
[0]); i
++)
1115 bpp
= td
[i
].samples
* td
[i
].bps
;
1116 if (winetest_debug
> 1)
1117 trace("samples %u, bps %u, bpp %u, width %u => width_bytes %u\n", td
[i
].samples
, td
[i
].bps
, bpp
,
1118 td
[i
].data
->width
, width_bytes(td
[i
].data
->width
, bpp
));
1119 tag_width
->value
= td
[i
].data
->width
;
1120 tag_height
->value
= td
[i
].data
->height
;
1124 tag_width
->value
= 1;
1125 tag_height
->value
= 1;
1128 tag_colormap
->count
= (1 << td
[i
].bps
) * 3;
1132 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
)] = 0x55;
1133 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 1] = 0xc3;
1134 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 2] = 0xb8;
1135 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 3] = 0x55;
1139 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
)] = 1;
1140 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 1] = 0;
1141 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 2] = 2;
1142 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 3] = 3;
1145 tag_photo
->value
= td
[i
].photometric
;
1146 tag_bps
->count
= td
[i
].samples
;
1147 tag_samples
->value
= td
[i
].samples
;
1149 if (td
[i
].samples
== 1)
1150 tag_bps
->value
= td
[i
].bps
;
1151 else if (td
[i
].samples
== 2)
1152 tag_bps
->value
= MAKELONG(td
[i
].bps
, td
[i
].bps
);
1153 else if (td
[i
].samples
== 3)
1155 tag_bps
->value
= (BYTE
*)bps
- buf
;
1156 bps
[0] = bps
[1] = bps
[2] = td
[i
].bps
;
1158 else if (td
[i
].samples
== 4)
1160 tag_bps
->value
= (BYTE
*)bps
- buf
;
1161 bps
[0] = bps
[1] = bps
[2] = bps
[3] = td
[i
].bps
;
1165 ok(0, "%u: unsupported samples count %d\n", i
, td
[i
].samples
);
1169 hr
= create_decoder(buf
, sizeof(buf
), &decoder
);
1172 ok(hr
== WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT
|| hr
== WINCODEC_ERR_COMPONENTNOTFOUND
/* win8+ */ || WINCODEC_ERR_BADIMAGE
/* XP */,
1173 "%u: (%d,%d,%d) wrong error %#x\n", i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
, hr
);
1176 IWICBitmapDecoder_Release(decoder
);
1182 ok(hr
== S_OK
|| broken(hr
== WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT
|| hr
== WINCODEC_ERR_BADIMAGE
) /* XP */,
1183 "%u: failed to load TIFF image data (%d,%d,%d) %#x\n",
1184 i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
, hr
);
1185 if (hr
!= S_OK
) continue;
1187 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
1188 ok(hr
== S_OK
, "%u: GetFrame error %#x\n", i
, hr
);
1190 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
1191 ok(hr
== S_OK
, "%u: GetPixelFormat error %#x\n", i
, hr
);
1192 ok(IsEqualGUID(&format
, td
[i
].data
->format
),
1193 "%u (%d,%d,%d): expected %s, got %s\n",
1194 i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
,
1195 wine_dbgstr_guid(td
[i
].data
->format
), wine_dbgstr_guid(&format
));
1197 trasparency
= (td
[i
].photometric
== 2 && td
[i
].samples
== 4); /* for XP */
1198 hr
= get_pixelformat_info(&format
, &bpp
, &channels
, &trasparency
);
1199 ok(hr
== S_OK
, "%u: get_pixelformat_bpp error %#x\n", i
, hr
);
1200 ok(bpp
== td
[i
].data
->bpp
, "%u: expected %u, got %u\n", i
, td
[i
].data
->bpp
, bpp
);
1201 ok(channels
== td
[i
].samples
, "%u: expected %u, got %u\n", i
, td
[i
].samples
, channels
);
1202 ok(trasparency
== (td
[i
].photometric
== 2 && td
[i
].samples
== 4), "%u: got %u\n", i
, trasparency
);
1204 memset(pixels
, 0, sizeof(pixels
));
1205 hr
= IWICBitmapFrameDecode_CopyPixels(frame
, NULL
, width_bytes(td
[i
].data
->width
, bpp
), sizeof(pixels
), pixels
);
1206 ok(hr
== S_OK
, "%u: CopyPixels error %#x\n", i
, hr
);
1207 ret
= memcmp(pixels
, td
[i
].data
->bits
, width_bytes(td
[i
].data
->width
, bpp
));
1208 if (ret
&& td
[i
].alt_data
)
1209 ret
= memcmp(pixels
, td
[i
].alt_data
->bits
, width_bytes(td
[i
].data
->width
, bpp
));
1210 ok(ret
== 0, "%u: (%d,%d,%d) wrong pixel data\n", i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
);
1213 UINT j
, n
= width_bytes(td
[i
].data
->width
, bpp
);
1214 for (j
= 0; j
< n
; j
++)
1215 printf("%u%s", pixels
[j
], (j
+ 1) < n
? "," : "\n");
1218 IWICBitmapFrameDecode_Release(frame
);
1219 IWICBitmapDecoder_Release(decoder
);
1223 static void test_tiff_4bps_bgra(void)
1226 IWICBitmapDecoder
*decoder
;
1227 IWICBitmapFrameDecode
*frame
;
1228 UINT frame_count
, width
, height
, i
;
1229 double dpi_x
, dpi_y
;
1230 IWICPalette
*palette
;
1234 static const BYTE expected_data
[24] = { 0,0,0,0xff, 0xff,0,0,0, 0xff,0,0,0xff,
1235 0,0xff,0,0, 0xff,0xff,0,0xff, 0xff,0xff,0xff,0 };
1237 hr
= create_decoder(&tiff_4bps_bgra
, sizeof(tiff_4bps_bgra
), &decoder
);
1238 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
1239 if (hr
!= S_OK
) return;
1241 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
1242 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
1243 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
1245 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
1246 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
1248 hr
= IWICBitmapFrameDecode_GetSize(frame
, &width
, &height
);
1249 ok(hr
== S_OK
, "GetSize error %#x\n", hr
);
1250 ok(width
== 3, "got %u\n", width
);
1251 ok(height
== 2, "got %u\n", height
);
1253 hr
= IWICBitmapFrameDecode_GetResolution(frame
, &dpi_x
, &dpi_y
);
1254 ok(hr
== S_OK
, "GetResolution error %#x\n", hr
);
1255 ok(dpi_x
== 96.0, "expected 96.0, got %f\n", dpi_x
);
1256 ok(dpi_y
== 96.0, "expected 96.0, got %f\n", dpi_y
);
1258 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
1259 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
1260 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat32bppBGRA
),
1261 "got wrong format %s\n", wine_dbgstr_guid(&format
));
1263 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
1264 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
1265 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
1266 ok(hr
== WINCODEC_ERR_PALETTEUNAVAILABLE
,
1267 "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %#x\n", hr
);
1268 IWICPalette_Release(palette
);
1270 memset(data
, 0xaa, sizeof(data
));
1275 hr
= IWICBitmapFrameDecode_CopyPixels(frame
, &rc
, 12, sizeof(data
), data
);
1276 ok(hr
== S_OK
, "CopyPixels error %#x\n", hr
);
1278 for (i
= 0; i
< sizeof(data
); i
++)
1279 ok(data
[i
] == expected_data
[i
], "%u: expected %02x, got %02x\n", i
, expected_data
[i
], data
[i
]);
1281 IWICBitmapFrameDecode_Release(frame
);
1282 IWICBitmapDecoder_Release(decoder
);
1285 START_TEST(tiffformat
)
1289 CoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
1291 hr
= CoCreateInstance(&CLSID_WICImagingFactory
, NULL
, CLSCTX_INPROC_SERVER
,
1292 &IID_IWICImagingFactory
, (void **)&factory
);
1293 ok(hr
== S_OK
, "CoCreateInstance error %#x\n", hr
);
1294 if (FAILED(hr
)) return;
1296 test_tiff_4bps_bgra();
1297 test_color_formats();
1298 test_tiff_1bpp_palette();
1299 test_tiff_8bpp_palette();
1300 test_QueryCapability();
1301 test_tiff_8bpp_alpha();
1302 test_tiff_resolution();
1305 IWICImagingFactory_Release(factory
);