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 */
307 static IWICImagingFactory
*factory
;
309 static IStream
*create_stream(const void *data
, int data_size
)
316 hdata
= GlobalAlloc(GMEM_MOVEABLE
, data_size
);
317 ok(hdata
!= 0, "GlobalAlloc failed\n");
318 if (!hdata
) return NULL
;
320 locked_data
= GlobalLock(hdata
);
321 memcpy(locked_data
, data
, data_size
);
324 hr
= CreateStreamOnHGlobal(hdata
, TRUE
, &stream
);
325 ok(hr
== S_OK
, "CreateStreamOnHGlobal failed, hr=%x\n", hr
);
330 static HRESULT
create_decoder(const void *image_data
, UINT image_size
, IWICBitmapDecoder
**decoder
)
341 hmem
= GlobalAlloc(0, image_size
);
342 data
= GlobalLock(hmem
);
343 memcpy(data
, image_data
, image_size
);
346 hr
= CreateStreamOnHGlobal(hmem
, TRUE
, &stream
);
347 ok(hr
== S_OK
, "CreateStreamOnHGlobal error %#x\n", hr
);
349 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, decoder
);
352 hr
= IWICBitmapDecoder_GetContainerFormat(*decoder
, &format
);
353 ok(hr
== S_OK
, "GetContainerFormat error %#x\n", hr
);
354 ok(IsEqualGUID(&format
, &GUID_ContainerFormatTiff
),
355 "wrong container format %s\n", wine_dbgstr_guid(&format
));
357 refcount
= IStream_Release(stream
);
358 ok(refcount
> 0, "expected stream refcount > 0\n");
364 static HRESULT
get_pixelformat_info(const GUID
*format
, UINT
*bpp
, UINT
*channels
, BOOL
*trasparency
)
367 IWICComponentInfo
*info
;
368 IWICPixelFormatInfo2
*formatinfo
;
370 hr
= IWICImagingFactory_CreateComponentInfo(factory
, format
, &info
);
371 ok(hr
== S_OK
, "CreateComponentInfo(%s) error %#x\n", wine_dbgstr_guid(format
), hr
);
374 hr
= IWICComponentInfo_QueryInterface(info
, &IID_IWICPixelFormatInfo2
, (void **)&formatinfo
);
377 hr
= IWICPixelFormatInfo2_SupportsTransparency(formatinfo
, trasparency
);
378 ok(hr
== S_OK
, "SupportsTransparency error %#x\n", hr
);
379 IWICPixelFormatInfo2_Release(formatinfo
);
381 hr
= IWICComponentInfo_QueryInterface(info
, &IID_IWICPixelFormatInfo
, (void **)&formatinfo
);
384 hr
= IWICPixelFormatInfo2_GetBitsPerPixel(formatinfo
, bpp
);
385 ok(hr
== S_OK
, "GetBitsPerPixel error %#x\n", hr
);
386 hr
= IWICPixelFormatInfo2_GetChannelCount(formatinfo
, channels
);
387 ok(hr
== S_OK
, "GetChannelCount error %#x\n", hr
);
388 IWICPixelFormatInfo2_Release(formatinfo
);
390 IWICComponentInfo_Release(info
);
395 static void dump_tiff(void *buf
)
398 struct tiff_1bpp_data
*tiff
;
399 struct IFD_entry
*tag
;
402 count
= *(short *)((char *)tiff
+ tiff
->dir_offset
);
403 tag
= (struct IFD_entry
*)((char *)tiff
+ tiff
->dir_offset
+ sizeof(short));
405 for (i
= 0; i
< count
; i
++)
407 printf("tag %u: id %04x, type %04x, count %u, value %d",
408 i
, tag
[i
].id
, tag
[i
].type
, tag
[i
].count
, tag
[i
].value
);
409 if (tag
[i
].id
== 0x102 && tag
[i
].count
> 2)
411 short *bps
= (short *)((char *)tiff
+ tag
[i
].value
);
412 printf(" (%d,%d,%d,%d)\n", bps
[0], bps
[1], bps
[2], bps
[3]);
419 static void test_tiff_1bpp_palette(void)
422 IWICBitmapDecoder
*decoder
;
423 IWICBitmapFrameDecode
*frame
;
424 IWICPalette
*palette
;
427 hr
= create_decoder(&tiff_1bpp_data
, sizeof(tiff_1bpp_data
), &decoder
);
428 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
429 if (hr
!= S_OK
) return;
431 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
432 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
434 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
435 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
436 ok(IsEqualGUID(&format
, &GUID_WICPixelFormatBlackWhite
),
437 "got wrong format %s\n", wine_dbgstr_guid(&format
));
439 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
440 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
441 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
442 ok(hr
== WINCODEC_ERR_PALETTEUNAVAILABLE
,
443 "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %#x\n", hr
);
445 IWICPalette_Release(palette
);
446 IWICBitmapFrameDecode_Release(frame
);
447 IWICBitmapDecoder_Release(decoder
);
450 static void test_QueryCapability(void)
454 IWICBitmapDecoder
*decoder
;
455 IWICBitmapFrameDecode
*frame
;
456 static const DWORD exp_caps
= WICBitmapDecoderCapabilityCanDecodeAllImages
|
457 WICBitmapDecoderCapabilityCanDecodeSomeImages
|
458 WICBitmapDecoderCapabilityCanEnumerateMetadata
;
459 static const DWORD exp_caps_xp
= WICBitmapDecoderCapabilityCanDecodeAllImages
|
460 WICBitmapDecoderCapabilityCanDecodeSomeImages
;
463 ULARGE_INTEGER cur_pos
;
466 stream
= create_stream(&tiff_1bpp_data
, sizeof(tiff_1bpp_data
));
469 hr
= IWICImagingFactory_CreateDecoder(factory
, &GUID_ContainerFormatTiff
, NULL
, &decoder
);
470 ok(hr
== S_OK
, "CreateDecoder error %#x\n", hr
);
471 if (FAILED(hr
)) return;
473 frame_count
= 0xdeadbeef;
474 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
475 ok(hr
== S_OK
|| broken(hr
== E_POINTER
) /* XP */, "GetFrameCount error %#x\n", hr
);
476 ok(frame_count
== 0, "expected 0, got %u\n", frame_count
);
478 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
479 ok(hr
== WINCODEC_ERR_FRAMEMISSING
|| broken(hr
== E_POINTER
) /* XP */, "expected WINCODEC_ERR_FRAMEMISSING, got %#x\n", hr
);
482 hr
= IStream_Seek(stream
, pos
, SEEK_SET
, NULL
);
483 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
485 capability
= 0xdeadbeef;
486 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
487 ok(hr
== S_OK
, "QueryCapability error %#x\n", hr
);
488 ok(capability
== exp_caps
|| capability
== exp_caps_xp
,
489 "expected %#x, got %#x\n", exp_caps
, capability
);
491 frame_count
= 0xdeadbeef;
492 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
493 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
494 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
496 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
497 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
498 IWICBitmapFrameDecode_Release(frame
);
501 hr
= IStream_Seek(stream
, pos
, SEEK_CUR
, &cur_pos
);
502 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
503 ok(cur_pos
.QuadPart
> 4 && cur_pos
.QuadPart
< sizeof(tiff_1bpp_data
),
504 "current stream pos is at %x/%x\n", cur_pos
.u
.LowPart
, cur_pos
.u
.HighPart
);
506 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
507 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
509 hr
= IWICBitmapDecoder_Initialize(decoder
, stream
, WICDecodeMetadataCacheOnDemand
);
510 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
512 IWICBitmapDecoder_Release(decoder
);
514 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, &decoder
);
516 ok(hr
== WINCODEC_ERR_COMPONENTNOTFOUND
, "expected WINCODEC_ERR_COMPONENTNOTFOUND, got %#x\n", hr
);
519 IWICBitmapDecoder_Release(decoder
);
522 hr
= IStream_Seek(stream
, pos
, SEEK_SET
, NULL
);
523 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
525 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, &decoder
);
526 ok(hr
== S_OK
, "CreateDecoderFromStream error %#x\n", hr
);
528 frame_count
= 0xdeadbeef;
529 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
530 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
531 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
533 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
534 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
535 IWICBitmapFrameDecode_Release(frame
);
537 hr
= IWICBitmapDecoder_Initialize(decoder
, stream
, WICDecodeMetadataCacheOnDemand
);
538 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
540 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
541 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
543 IWICBitmapDecoder_Release(decoder
);
544 IStream_Release(stream
);
547 static void test_tiff_8bpp_alpha(void)
550 IWICBitmapDecoder
*decoder
;
551 IWICBitmapFrameDecode
*frame
;
552 UINT frame_count
, width
, height
, i
;
554 IWICPalette
*palette
;
558 static const BYTE expected_data
[16] = { 0x11,0x11,0x11,0x22,0x33,0x33,0x33,0x44,
559 0x55,0x55,0x55,0x66,0x77,0x77,0x77,0x88 };
561 hr
= create_decoder(&tiff_8bpp_alpha
, sizeof(tiff_8bpp_alpha
), &decoder
);
562 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
563 if (hr
!= S_OK
) return;
565 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
566 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
567 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
569 EXPECT_REF(decoder
, 1);
570 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
571 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
572 EXPECT_REF(decoder
, 2);
573 IWICBitmapDecoder_Release(decoder
);
575 hr
= IWICBitmapFrameDecode_GetSize(frame
, &width
, &height
);
576 ok(hr
== S_OK
, "GetSize error %#x\n", hr
);
577 ok(width
== 2, "expected 2, got %u\n", width
);
578 ok(height
== 2, "expected 2, got %u\n", height
);
580 hr
= IWICBitmapFrameDecode_GetResolution(frame
, &dpi_x
, &dpi_y
);
581 ok(hr
== S_OK
, "GetResolution error %#x\n", hr
);
582 ok(dpi_x
== 96.0, "expected 96.0, got %f\n", dpi_x
);
583 ok(dpi_y
== 96.0, "expected 96.0, got %f\n", dpi_y
);
585 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
586 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
587 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat32bppPBGRA
),
588 "got wrong format %s\n", wine_dbgstr_guid(&format
));
590 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
591 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
592 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
593 ok(hr
== WINCODEC_ERR_PALETTEUNAVAILABLE
,
594 "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %#x\n", hr
);
595 IWICPalette_Release(palette
);
601 hr
= IWICBitmapFrameDecode_CopyPixels(frame
, &rc
, 8, sizeof(data
), data
);
602 ok(hr
== S_OK
, "CopyPixels error %#x\n", hr
);
604 for (i
= 0; i
< sizeof(data
); i
++)
605 ok(data
[i
] == expected_data
[i
], "%u: expected %02x, got %02x\n", i
, expected_data
[i
], data
[i
]);
607 IWICBitmapFrameDecode_Release(frame
);
610 static void generate_tiff_palette(void *buf
, unsigned count
)
612 unsigned short *r
, *g
, *b
;
632 for (i
= 4; i
< count
; i
++)
635 g
[i
] = (i
| 0x40) * 257;
636 b
[i
] = (i
| 0x80) * 257;
640 static void test_tiff_8bpp_palette(void)
642 char buf
[sizeof(tiff_8bpp_data
)];
644 IWICBitmapDecoder
*decoder
;
645 IWICBitmapFrameDecode
*frame
;
646 IWICPalette
*palette
;
651 memcpy(buf
, &tiff_8bpp_data
, sizeof(tiff_8bpp_data
));
652 generate_tiff_palette(buf
+ FIELD_OFFSET(struct tiff_8bpp_data
, palette_data
), 256);
654 hr
= create_decoder(buf
, sizeof(buf
), &decoder
);
655 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
656 if (hr
!= S_OK
) return;
658 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
659 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
661 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
662 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
663 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat8bppIndexed
),
664 "expected GUID_WICPixelFormat8bppIndexed, got %s\n", wine_dbgstr_guid(&format
));
666 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
667 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
668 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
669 ok(hr
== S_OK
, "CopyPalette error %#x\n", hr
);
671 hr
= IWICPalette_GetColorCount(palette
, &count
);
672 ok(hr
== S_OK
, "GetColorCount error %#x\n", hr
);
673 ok(count
== 256, "expected 256, got %u\n", count
);
675 hr
= IWICPalette_GetColors(palette
, 256, color
, &ret
);
676 ok(hr
== S_OK
, "GetColors error %#x\n", hr
);
677 ok(ret
== count
, "expected %u, got %u\n", count
, ret
);
678 ok(color
[0] == 0xff112233, "got %#x\n", color
[0]);
679 ok(color
[1] == 0xff445566, "got %#x\n", color
[1]);
680 ok(color
[2] == 0xff778899, "got %#x\n", color
[2]);
681 ok(color
[3] == 0xffa1b5ff, "got %#x\n", color
[3]);
683 IWICPalette_Release(palette
);
684 IWICBitmapFrameDecode_Release(frame
);
685 IWICBitmapDecoder_Release(decoder
);
688 static void test_tiff_resolution(void)
691 IWICBitmapDecoder
*decoder
;
692 IWICBitmapFrameDecode
*frame
;
696 for (i
= 0; i
< ARRAY_SIZE(tiff_resolution_test_data
); i
++)
698 const struct tiff_resolution_test_data
*test_data
= &tiff_resolution_test_data
[i
];
699 tiff_resolution_image_data
.resx
= test_data
->resx
;
700 tiff_resolution_image_data
.resy
= test_data
->resy
;
701 tiff_resolution_image_data
.entry
[12].value
= test_data
->resolution_unit
;
703 hr
= create_decoder(&tiff_resolution_image_data
, sizeof(tiff_resolution_image_data
), &decoder
);
704 ok(hr
== S_OK
, "Failed to load TIFF image data %#x\n", hr
);
705 if (hr
!= S_OK
) return;
707 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
708 ok(hr
== S_OK
, "%d: GetFrame error %#x\n", i
, hr
);
710 hr
= IWICBitmapFrameDecode_GetResolution(frame
, &dpi_x
, &dpi_y
);
711 ok(hr
== S_OK
, "%d: GetResolution error %#x\n", i
, hr
);
713 if (test_data
->broken_dpi_x
!= 0)
715 ok(fabs(dpi_x
- test_data
->expected_dpi_x
) < 0.01 || broken(fabs(dpi_x
- test_data
->broken_dpi_x
) < 0.01),
716 "%d: x: expected %f or %f, got %f\n", i
, test_data
->expected_dpi_x
, test_data
->broken_dpi_x
, dpi_x
);
720 ok(fabs(dpi_x
- test_data
->expected_dpi_x
) < 0.01,
721 "%d: x: expected %f, got %f\n", i
, test_data
->expected_dpi_x
, dpi_x
);
724 if (test_data
->broken_dpi_y
!= 0)
726 ok(fabs(dpi_y
- test_data
->expected_dpi_y
) < 0.01 || broken(fabs(dpi_y
- test_data
->broken_dpi_y
) < 0.01),
727 "%d: y: expected %f or %f, got %f\n", i
, test_data
->expected_dpi_y
, test_data
->broken_dpi_y
, dpi_y
);
731 ok(fabs(dpi_y
- test_data
->expected_dpi_y
) < 0.01,
732 "%d: y: expected %f, got %f\n", i
, test_data
->expected_dpi_y
, dpi_y
);
735 IWICBitmapFrameDecode_Release(frame
);
736 IWICBitmapDecoder_Release(decoder
);
740 static void test_tiff_24bpp(void)
743 IWICBitmapDecoder
*decoder
;
744 IWICBitmapFrameDecode
*frame
;
745 UINT count
, width
, height
, i
, stride
;
750 static const BYTE expected_data
[] = { 0x33,0x22,0x11 };
752 hr
= create_decoder(&tiff_24bpp_data
, sizeof(tiff_24bpp_data
), &decoder
);
753 ok(hr
== S_OK
, "got %#x\n", hr
);
754 ok(decoder
!= NULL
, "Failed to load TIFF image data\n");
756 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &count
);
757 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
758 ok(count
== 1, "got %u\n", count
);
760 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
761 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
763 hr
= IWICBitmapFrameDecode_GetSize(frame
, &width
, &height
);
764 ok(hr
== S_OK
, "GetSize error %#x\n", hr
);
765 ok(width
== 1, "got %u\n", width
);
766 ok(height
== 1, "got %u\n", height
);
768 hr
= IWICBitmapFrameDecode_GetResolution(frame
, &dpi_x
, &dpi_y
);
769 ok(hr
== S_OK
, "GetResolution error %#x\n", hr
);
770 ok(dpi_x
== 300.0, "got %f\n", dpi_x
);
771 ok(dpi_y
== 300.0, "got %f\n", dpi_y
);
773 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
774 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
775 ok(IsEqualGUID(&format
, &GUID_WICPixelFormat24bppBGR
),
776 "got wrong format %s\n", wine_dbgstr_guid(&format
));
778 for (stride
= 0; stride
<= 32; stride
++)
780 memset(data
, 0, sizeof(data
));
785 hr
= IWICBitmapFrameDecode_CopyPixels(frame
, &rc
, stride
, sizeof(data
), data
);
787 ok(hr
== E_INVALIDARG
, "CopyPixels(%u) should fail: %#x\n", stride
, hr
);
790 ok(hr
== S_OK
, "CopyPixels(%u) error %#x\n", stride
, hr
);
792 for (i
= 0; i
< sizeof(data
); i
++)
793 ok(data
[i
] == expected_data
[i
], "%u: expected %02x, got %02x\n", i
, expected_data
[i
], data
[i
]);
797 IWICBitmapFrameDecode_Release(frame
);
798 IWICBitmapDecoder_Release(decoder
);
801 #include "pshpack2.h"
802 static const struct tiff_1x1_data
807 USHORT number_of_entries
;
808 struct IFD_entry entry
[12];
810 struct IFD_rational res
;
811 short palette_data
[3][256];
816 #ifdef WORDS_BIGENDIAN
822 FIELD_OFFSET(struct tiff_1x1_data
, number_of_entries
),
825 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
826 { 0x100, IFD_LONG
, 1, 1 }, /* IMAGEWIDTH */
827 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
828 { 0x102, IFD_SHORT
, 3, FIELD_OFFSET(struct tiff_1x1_data
, bps_data
) }, /* BITSPERSAMPLE */
829 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
830 { 0x106, IFD_SHORT
, 1, 2 }, /* PHOTOMETRIC */
831 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) }, /* STRIPOFFSETS */
832 { 0x115, IFD_SHORT
, 1, 3 }, /* SAMPLESPERPIXEL */
833 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1x1_data
, res
) },
834 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1x1_data
, res
) },
835 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
836 { 0x140, IFD_SHORT
, 256*3, FIELD_OFFSET(struct tiff_1x1_data
, palette_data
) } /* COLORMAP */
842 { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 }
846 static UINT
width_bytes(UINT width
, UINT bpp
)
848 return (width
* bpp
+ 7) / 8;
851 static void test_color_formats(void)
858 const WICPixelFormatGUID
*format
;
861 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 };
862 static const struct bitmap_data data_1bpsBGR
=
864 24, 10, 2, &GUID_WICPixelFormat24bppBGR
, bits_1bpsBGR
866 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 };
867 static const struct bitmap_data data_4bpsBGR
=
869 24, 5, 2, &GUID_WICPixelFormat24bppBGR
, bits_4bpsBGR
871 static const BYTE bits_8bpsBGR
[] = { 2,0,1,5,4,3,8,7,6 };
872 static const struct bitmap_data data_8bpsBGR
=
874 24, 3, 1, &GUID_WICPixelFormat24bppBGR
, bits_8bpsBGR
876 static const BYTE bits_48bppRGB
[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
877 static const struct bitmap_data data_48bppRGB
=
879 48, 2, 1, &GUID_WICPixelFormat48bppRGB
, bits_48bppRGB
881 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 };
882 static const struct bitmap_data data_1bpsBGRA
=
884 32, 5, 2, &GUID_WICPixelFormat32bppBGRA
, bits_1bpsBGRA
886 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 };
887 static const struct bitmap_data data_4bpsBGRA
=
889 32, 5, 2, &GUID_WICPixelFormat32bppBGRA
, bits_4bpsBGRA
891 static const BYTE bits_8bpsBGRA
[] = { 2,0,1,3,6,5,4,7,0,9,8,1,4,3,2,5 };
892 static const struct bitmap_data data_8bpsBGRA
=
894 32, 4, 1, &GUID_WICPixelFormat32bppBGRA
, bits_8bpsBGRA
896 static const BYTE bits_64bppRGBA
[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
897 static const struct bitmap_data data_64bppRGBA
=
899 64, 2, 1, &GUID_WICPixelFormat64bppRGBA
, bits_64bppRGBA
901 static const BYTE bits_BlackWhite
[] = { 85,195,184,85 };
902 static const struct bitmap_data data_BlackWhite
=
904 1, 30, 1, &GUID_WICPixelFormatBlackWhite
, bits_BlackWhite
906 static const BYTE bits_BlackWhite_xp
[] = { 85,195,184,84 };
907 static const struct bitmap_data data_BlackWhite_xp
=
909 1, 30, 1, &GUID_WICPixelFormatBlackWhite
, bits_BlackWhite_xp
911 static const BYTE bits_4bppGray
[] = { 85,195,184,85 };
912 static const struct bitmap_data data_4bppGray
=
914 4, 7, 1, &GUID_WICPixelFormat4bppGray
, bits_4bppGray
916 static const BYTE bits_4bppGray_xp
[] = { 85,195,184,80 };
917 static const struct bitmap_data data_4bppGray_xp
=
919 4, 7, 1, &GUID_WICPixelFormat4bppGray
, bits_4bppGray_xp
921 static const BYTE bits_8bppGray
[] = { 1,0,2,3,4,5,6,7,8,9 };
922 static const struct bitmap_data data_8bppGray
=
924 8, 10, 1, &GUID_WICPixelFormat8bppGray
, bits_8bppGray
926 static const BYTE bits_16bppGray
[] = { 1,0,2,3,4,5 };
927 static const struct bitmap_data data_16bppGray
=
929 16, 3, 1, &GUID_WICPixelFormat16bppGray
, bits_16bppGray
931 static const BYTE bits_32bppGrayFloat
[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
932 static const struct bitmap_data data_32bppGrayFloat
=
934 32, 3, 1, &GUID_WICPixelFormat32bppGrayFloat
, bits_32bppGrayFloat
937 static const BYTE bits_96bpp3Channels
[] = { 0 };
938 static const struct bitmap_data data_96bpp3Channels
=
940 64, 1, 1, &GUID_WICPixelFormat96bpp3Channels
, bits_96bpp3Channels
943 static const BYTE bits_128bppRGBAFloat
[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
944 static const struct bitmap_data data_128bppRGBAFloat
=
946 128, 1, 1, &GUID_WICPixelFormat128bppRGBAFloat
, bits_128bppRGBAFloat
948 static const BYTE bits_1bppIndexed
[] = { 85,195,184,85 };
949 static const struct bitmap_data data_1bppIndexed
=
951 1, 32, 1, &GUID_WICPixelFormat1bppIndexed
, bits_1bppIndexed
953 static const BYTE bits_4bppIndexed
[] = { 85,195,184,85 };
954 static const struct bitmap_data data_4bppIndexed
=
956 4, 7, 1, &GUID_WICPixelFormat4bppIndexed
, bits_4bppIndexed
958 static const BYTE bits_4bppIndexed_xp
[] = { 85,195,184,80 };
959 static const struct bitmap_data data_4bppIndexed_xp
=
961 4, 7, 1, &GUID_WICPixelFormat4bppIndexed
, bits_4bppIndexed_xp
963 static const BYTE bits_8bppIndexed
[] = { 1,0,2,3,4,5,6,7,8,9 };
964 static const struct bitmap_data data_8bppIndexed
=
966 8, 3, 1, &GUID_WICPixelFormat8bppIndexed
, bits_8bppIndexed
968 static const BYTE bits_32bppCMYK
[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
969 static const struct bitmap_data data_32bppCMYK
=
971 32, 3, 1, &GUID_WICPixelFormat32bppCMYK
, bits_32bppCMYK
973 static const BYTE bits_64bppCMYK
[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
974 static const struct bitmap_data data_64bppCMYK
=
976 64, 2, 1, &GUID_WICPixelFormat64bppCMYK
, bits_64bppCMYK
980 int photometric
; /* PhotometricInterpretation */
981 int samples
; /* SamplesPerPixel */
982 int bps
; /* BitsPerSample */
983 const struct bitmap_data
*data
;
984 const struct bitmap_data
*alt_data
;
988 { 2, 3, 1, &data_1bpsBGR
},
989 { 2, 3, 4, &data_4bpsBGR
},
990 { 2, 3, 8, &data_8bpsBGR
},
991 { 2, 3, 16, &data_48bppRGB
},
994 { 2, 3, 32, &data_96bpp3Channels
},
996 { 2, 4, 1, &data_1bpsBGRA
},
997 { 2, 4, 4, &data_4bpsBGRA
},
998 { 2, 4, 8, &data_8bpsBGRA
},
999 { 2, 4, 16, &data_64bppRGBA
},
1001 { 2, 4, 32, &data_128bppRGBAFloat
},
1002 /* 1 - BlackIsZero (Bilevel) */
1003 { 1, 1, 1, &data_BlackWhite
, &data_BlackWhite_xp
},
1004 { 1, 1, 4, &data_4bppGray
, &data_4bppGray_xp
},
1005 { 1, 1, 8, &data_8bppGray
},
1006 { 1, 1, 16, &data_16bppGray
},
1008 { 1, 1, 32, &data_32bppGrayFloat
},
1009 /* 3 - Palette Color */
1010 { 3, 1, 1, &data_1bppIndexed
},
1011 { 3, 1, 4, &data_4bppIndexed
, &data_4bppIndexed_xp
},
1012 { 3, 1, 8, &data_8bppIndexed
},
1013 #if 0 /* FIXME: for some reason libtiff replaces photometric 3 by 1 for bps > 8 */
1014 { 3, 1, 16, &data_8bppIndexed
},
1015 { 3, 1, 24, &data_8bppIndexed
},
1016 { 3, 1, 32, &data_8bppIndexed
},
1021 { 5, 4, 8, &data_32bppCMYK
},
1022 { 5, 4, 16, &data_64bppCMYK
},
1026 BYTE buf
[sizeof(tiff_1x1_data
)];
1029 IWICBitmapDecoder
*decoder
;
1030 IWICBitmapFrameDecode
*frame
;
1032 UINT count
, i
, bpp
, channels
, ret
;
1034 struct IFD_entry
*tag
, *tag_photo
= NULL
, *tag_bps
= NULL
, *tag_samples
= NULL
, *tag_colormap
= NULL
;
1035 struct IFD_entry
*tag_width
= NULL
, *tag_height
= NULL
;
1038 memcpy(buf
, &tiff_1x1_data
, sizeof(tiff_1x1_data
));
1039 generate_tiff_palette(buf
+ FIELD_OFFSET(struct tiff_1x1_data
, palette_data
), 256);
1041 count
= *(short *)(buf
+ tiff_1x1_data
.dir_offset
);
1042 tag
= (struct IFD_entry
*)(buf
+ tiff_1x1_data
.dir_offset
+ sizeof(short));
1044 /* verify the TIFF structure */
1045 for (i
= 0; i
< count
; i
++)
1047 if (tag
[i
].id
== 0x100) /* ImageWidth */
1048 tag_width
= &tag
[i
];
1049 else if (tag
[i
].id
== 0x101) /* ImageLength */
1050 tag_height
= &tag
[i
];
1051 else if (tag
[i
].id
== 0x102) /* BitsPerSample */
1053 else if (tag
[i
].id
== 0x106) /* PhotometricInterpretation */
1054 tag_photo
= &tag
[i
];
1055 else if (tag
[i
].id
== 0x115) /* SamplesPerPixel */
1056 tag_samples
= &tag
[i
];
1057 else if (tag
[i
].id
== 0x140) /* ColorMap */
1058 tag_colormap
= &tag
[i
];
1061 ok(tag_bps
&& tag_photo
&& tag_samples
&& tag_colormap
, "tag 0x102,0x106,0x115 or 0x140 is missing\n");
1062 if (!tag_bps
|| !tag_photo
|| !tag_samples
|| !tag_colormap
) return;
1064 ok(tag_bps
->type
== IFD_SHORT
, "tag 0x102 should have type IFD_SHORT\n");
1065 bps
= (short *)(buf
+ tag_bps
->value
);
1066 ok(bps
[0] == 8 && bps
[1] == 8 && bps
[2] == 8 && bps
[3] == 0,
1067 "expected bps 8,8,8,0 got %d,%d,%d,%d\n", bps
[0], bps
[1], bps
[2], bps
[3]);
1069 for (i
= 0; i
< sizeof(td
)/sizeof(td
[0]); i
++)
1073 bpp
= td
[i
].samples
* td
[i
].bps
;
1074 if (winetest_debug
> 1)
1075 trace("samples %u, bps %u, bpp %u, width %u => width_bytes %u\n", td
[i
].samples
, td
[i
].bps
, bpp
,
1076 td
[i
].data
->width
, width_bytes(td
[i
].data
->width
, bpp
));
1077 tag_width
->value
= td
[i
].data
->width
;
1078 tag_height
->value
= td
[i
].data
->height
;
1082 tag_width
->value
= 1;
1083 tag_height
->value
= 1;
1086 tag_colormap
->count
= (1 << td
[i
].bps
) * 3;
1090 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
)] = 0x55;
1091 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 1] = 0xc3;
1092 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 2] = 0xb8;
1093 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 3] = 0x55;
1097 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
)] = 1;
1098 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 1] = 0;
1099 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 2] = 2;
1100 buf
[FIELD_OFFSET(struct tiff_1x1_data
, pixel_data
) + 3] = 3;
1103 tag_photo
->value
= td
[i
].photometric
;
1104 tag_bps
->count
= td
[i
].samples
;
1105 tag_samples
->value
= td
[i
].samples
;
1107 if (td
[i
].samples
== 1)
1108 tag_bps
->value
= td
[i
].bps
;
1109 else if (td
[i
].samples
== 2)
1110 tag_bps
->value
= MAKELONG(td
[i
].bps
, td
[i
].bps
);
1111 else if (td
[i
].samples
== 3)
1113 tag_bps
->value
= (BYTE
*)bps
- buf
;
1114 bps
[0] = bps
[1] = bps
[2] = td
[i
].bps
;
1116 else if (td
[i
].samples
== 4)
1118 tag_bps
->value
= (BYTE
*)bps
- buf
;
1119 bps
[0] = bps
[1] = bps
[2] = bps
[3] = td
[i
].bps
;
1123 ok(0, "%u: unsupported samples count %d\n", i
, td
[i
].samples
);
1127 hr
= create_decoder(buf
, sizeof(buf
), &decoder
);
1130 ok(hr
== WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT
|| hr
== WINCODEC_ERR_COMPONENTNOTFOUND
/* win8+ */ || WINCODEC_ERR_BADIMAGE
/* XP */,
1131 "%u: (%d,%d,%d) wrong error %#x\n", i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
, hr
);
1134 IWICBitmapDecoder_Release(decoder
);
1140 ok(hr
== S_OK
|| broken(hr
== WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT
|| hr
== WINCODEC_ERR_BADIMAGE
) /* XP */,
1141 "%u: failed to load TIFF image data (%d,%d,%d) %#x\n",
1142 i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
, hr
);
1143 if (hr
!= S_OK
) continue;
1145 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
1146 ok(hr
== S_OK
, "%u: GetFrame error %#x\n", i
, hr
);
1148 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
1149 ok(hr
== S_OK
, "%u: GetPixelFormat error %#x\n", i
, hr
);
1150 ok(IsEqualGUID(&format
, td
[i
].data
->format
),
1151 "%u (%d,%d,%d): expected %s, got %s\n",
1152 i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
,
1153 wine_dbgstr_guid(td
[i
].data
->format
), wine_dbgstr_guid(&format
));
1155 trasparency
= (td
[i
].photometric
== 2 && td
[i
].samples
== 4); /* for XP */
1156 hr
= get_pixelformat_info(&format
, &bpp
, &channels
, &trasparency
);
1157 ok(hr
== S_OK
, "%u: get_pixelformat_bpp error %#x\n", i
, hr
);
1158 ok(bpp
== td
[i
].data
->bpp
, "%u: expected %u, got %u\n", i
, td
[i
].data
->bpp
, bpp
);
1159 ok(channels
== td
[i
].samples
, "%u: expected %u, got %u\n", i
, td
[i
].samples
, channels
);
1160 ok(trasparency
== (td
[i
].photometric
== 2 && td
[i
].samples
== 4), "%u: got %u\n", i
, trasparency
);
1162 memset(pixels
, 0, sizeof(pixels
));
1163 hr
= IWICBitmapFrameDecode_CopyPixels(frame
, NULL
, width_bytes(td
[i
].data
->width
, bpp
), sizeof(pixels
), pixels
);
1164 ok(hr
== S_OK
, "%u: CopyPixels error %#x\n", i
, hr
);
1165 ret
= memcmp(pixels
, td
[i
].data
->bits
, width_bytes(td
[i
].data
->width
, bpp
));
1166 if (ret
&& td
[i
].alt_data
)
1167 ret
= memcmp(pixels
, td
[i
].alt_data
->bits
, width_bytes(td
[i
].data
->width
, bpp
));
1168 ok(ret
== 0, "%u: (%d,%d,%d) wrong pixel data\n", i
, td
[i
].photometric
, td
[i
].samples
, td
[i
].bps
);
1171 UINT j
, n
= width_bytes(td
[i
].data
->width
, bpp
);
1172 for (j
= 0; j
< n
; j
++)
1173 printf("%u%s", pixels
[j
], (j
+ 1) < n
? "," : "\n");
1176 IWICBitmapFrameDecode_Release(frame
);
1177 IWICBitmapDecoder_Release(decoder
);
1181 START_TEST(tiffformat
)
1185 CoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
1187 hr
= CoCreateInstance(&CLSID_WICImagingFactory
, NULL
, CLSCTX_INPROC_SERVER
,
1188 &IID_IWICImagingFactory
, (void **)&factory
);
1189 ok(hr
== S_OK
, "CoCreateInstance error %#x\n", hr
);
1190 if (FAILED(hr
)) return;
1192 test_color_formats();
1193 test_tiff_1bpp_palette();
1194 test_tiff_8bpp_palette();
1195 test_QueryCapability();
1196 test_tiff_8bpp_alpha();
1197 test_tiff_resolution();
1200 IWICImagingFactory_Release(factory
);