2 * Copyright 2012 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
26 #include "wine/test.h"
32 #define IFD_RATIONAL 5
34 #define IFD_UNDEFINED 7
37 #define IFD_SRATIONAL 10
56 static const struct tiff_1bpp_data
61 USHORT number_of_entries
;
62 struct IFD_entry entry
[13];
64 struct IFD_rational res
;
68 #ifdef WORDS_BIGENDIAN
74 FIELD_OFFSET(struct tiff_1bpp_data
, number_of_entries
),
77 { 0xff, IFD_SHORT
, 1, 0 }, /* SUBFILETYPE */
78 { 0x100, IFD_LONG
, 1, 1 }, /* IMAGEWIDTH */
79 { 0x101, IFD_LONG
, 1, 1 }, /* IMAGELENGTH */
80 { 0x102, IFD_SHORT
, 1, 1 }, /* BITSPERSAMPLE */
81 { 0x103, IFD_SHORT
, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
82 { 0x106, IFD_SHORT
, 1, 1 }, /* PHOTOMETRIC */
83 { 0x111, IFD_LONG
, 1, FIELD_OFFSET(struct tiff_1bpp_data
, pixel_data
) }, /* STRIPOFFSETS */
84 { 0x115, IFD_SHORT
, 1, 1 }, /* SAMPLESPERPIXEL */
85 { 0x116, IFD_LONG
, 1, 1 }, /* ROWSPERSTRIP */
86 { 0x117, IFD_LONG
, 1, 1 }, /* STRIPBYTECOUNT */
87 { 0x11a, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1bpp_data
, res
) },
88 { 0x11b, IFD_RATIONAL
, 1, FIELD_OFFSET(struct tiff_1bpp_data
, res
) },
89 { 0x128, IFD_SHORT
, 1, 2 }, /* RESOLUTIONUNIT */
93 { 0x11, 0x22, 0x33, 0 }
97 static IWICImagingFactory
*factory
;
99 static const char *debugstr_guid(const GUID
*guid
)
103 if (!guid
) return "(null)";
104 sprintf(buf
, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
105 guid
->Data1
, guid
->Data2
, guid
->Data3
, guid
->Data4
[0],
106 guid
->Data4
[1], guid
->Data4
[2], guid
->Data4
[3], guid
->Data4
[4],
107 guid
->Data4
[5], guid
->Data4
[6], guid
->Data4
[7]);
111 static IStream
*create_stream(const void *data
, int data_size
)
118 hdata
= GlobalAlloc(GMEM_MOVEABLE
, data_size
);
119 ok(hdata
!= 0, "GlobalAlloc failed\n");
120 if (!hdata
) return NULL
;
122 locked_data
= GlobalLock(hdata
);
123 memcpy(locked_data
, data
, data_size
);
126 hr
= CreateStreamOnHGlobal(hdata
, TRUE
, &stream
);
127 ok(hr
== S_OK
, "CreateStreamOnHGlobal failed, hr=%x\n", hr
);
132 static IWICBitmapDecoder
*create_decoder(const void *image_data
, UINT image_size
)
136 IWICBitmapDecoder
*decoder
= NULL
;
139 stream
= create_stream(image_data
, image_size
);
141 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, &decoder
);
142 ok(hr
== S_OK
, "CreateDecoderFromStream error %#x\n", hr
);
144 hr
= IWICBitmapDecoder_GetContainerFormat(decoder
, &guid
);
145 ok(hr
== S_OK
, "GetContainerFormat error %#x\n", hr
);
146 ok(IsEqualGUID(&guid
, &GUID_ContainerFormatTiff
), "container format is not TIFF\n");
148 IStream_Release(stream
);
153 static void test_tiff_palette(void)
156 IWICBitmapDecoder
*decoder
;
157 IWICBitmapFrameDecode
*frame
;
158 IWICPalette
*palette
;
161 decoder
= create_decoder(&tiff_1bpp_data
, sizeof(tiff_1bpp_data
));
162 ok(decoder
!= 0, "Failed to load TIFF image data\n");
164 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
165 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
167 hr
= IWICBitmapFrameDecode_GetPixelFormat(frame
, &format
);
168 ok(hr
== S_OK
, "GetPixelFormat error %#x\n", hr
);
169 ok(IsEqualGUID(&format
, &GUID_WICPixelFormatBlackWhite
),
170 "got wrong format %s\n", debugstr_guid(&format
));
172 hr
= IWICImagingFactory_CreatePalette(factory
, &palette
);
173 ok(hr
== S_OK
, "CreatePalette error %#x\n", hr
);
174 hr
= IWICBitmapFrameDecode_CopyPalette(frame
, palette
);
175 ok(hr
== WINCODEC_ERR_PALETTEUNAVAILABLE
,
176 "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %#x\n", hr
);
178 IWICPalette_Release(palette
);
179 IWICBitmapFrameDecode_Release(frame
);
180 IWICBitmapDecoder_Release(decoder
);
183 static void test_QueryCapability(void)
187 IWICBitmapDecoder
*decoder
;
188 IWICBitmapFrameDecode
*frame
;
189 static const DWORD exp_caps
= WICBitmapDecoderCapabilityCanDecodeAllImages
|
190 WICBitmapDecoderCapabilityCanDecodeSomeImages
|
191 WICBitmapDecoderCapabilityCanEnumerateMetadata
;
192 static const DWORD exp_caps_xp
= WICBitmapDecoderCapabilityCanDecodeAllImages
|
193 WICBitmapDecoderCapabilityCanDecodeSomeImages
;
196 ULARGE_INTEGER cur_pos
;
199 stream
= create_stream(&tiff_1bpp_data
, sizeof(tiff_1bpp_data
));
202 hr
= IWICImagingFactory_CreateDecoder(factory
, &GUID_ContainerFormatTiff
, NULL
, &decoder
);
203 ok(hr
== S_OK
, "CreateDecoder error %#x\n", hr
);
205 frame_count
= 0xdeadbeef;
206 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
207 ok(hr
== S_OK
|| broken(hr
== E_POINTER
) /* XP */, "GetFrameCount error %#x\n", hr
);
208 ok(frame_count
== 0, "expected 0, got %u\n", frame_count
);
210 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
211 ok(hr
== WINCODEC_ERR_FRAMEMISSING
|| broken(hr
== E_POINTER
) /* XP */, "expected WINCODEC_ERR_FRAMEMISSING, got %#x\n", hr
);
214 hr
= IStream_Seek(stream
, pos
, SEEK_SET
, NULL
);
215 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
217 capability
= 0xdeadbeef;
218 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
219 ok(hr
== S_OK
, "QueryCapability error %#x\n", hr
);
220 ok(capability
== exp_caps
|| capability
== exp_caps_xp
,
221 "expected %#x, got %#x\n", exp_caps
, capability
);
223 frame_count
= 0xdeadbeef;
224 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
225 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
226 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
228 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
229 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
230 IWICBitmapFrameDecode_Release(frame
);
233 hr
= IStream_Seek(stream
, pos
, SEEK_CUR
, &cur_pos
);
234 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
235 ok(cur_pos
.QuadPart
> 4 && cur_pos
.QuadPart
< sizeof(tiff_1bpp_data
),
236 "current stream pos is at %x/%x\n", cur_pos
.u
.LowPart
, cur_pos
.u
.HighPart
);
238 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
239 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
241 hr
= IWICBitmapDecoder_Initialize(decoder
, stream
, WICDecodeMetadataCacheOnDemand
);
242 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
244 IWICBitmapDecoder_Release(decoder
);
246 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, &decoder
);
248 ok(hr
== WINCODEC_ERR_COMPONENTNOTFOUND
, "expected WINCODEC_ERR_COMPONENTNOTFOUND, got %#x\n", hr
);
251 hr
= IStream_Seek(stream
, pos
, SEEK_SET
, NULL
);
252 ok(hr
== S_OK
, "IStream_Seek error %#x\n", hr
);
254 hr
= IWICImagingFactory_CreateDecoderFromStream(factory
, stream
, NULL
, 0, &decoder
);
255 ok(hr
== S_OK
, "CreateDecoderFromStream error %#x\n", hr
);
257 frame_count
= 0xdeadbeef;
258 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &frame_count
);
259 ok(hr
== S_OK
, "GetFrameCount error %#x\n", hr
);
260 ok(frame_count
== 1, "expected 1, got %u\n", frame_count
);
262 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &frame
);
263 ok(hr
== S_OK
, "GetFrame error %#x\n", hr
);
264 IWICBitmapFrameDecode_Release(frame
);
266 hr
= IWICBitmapDecoder_Initialize(decoder
, stream
, WICDecodeMetadataCacheOnDemand
);
267 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
269 hr
= IWICBitmapDecoder_QueryCapability(decoder
, stream
, &capability
);
270 ok(hr
== WINCODEC_ERR_WRONGSTATE
, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr
);
272 IWICBitmapDecoder_Release(decoder
);
273 IStream_Release(stream
);
276 START_TEST(tiffformat
)
280 CoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
282 hr
= CoCreateInstance(&CLSID_WICImagingFactory
, NULL
, CLSCTX_INPROC_SERVER
,
283 &IID_IWICImagingFactory
, (void **)&factory
);
284 ok(hr
== S_OK
, "CoCreateInstance error %#x\n", hr
);
285 if (FAILED(hr
)) return;
288 test_QueryCapability();
290 IWICImagingFactory_Release(factory
);