2 * This library is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU Lesser General Public
4 * License as published by the Free Software Foundation; either
5 * version 2.1 of the License, or (at your option) any later version.
7 * This library is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * Lesser General Public License for more details.
12 * You should have received a copy of the GNU Lesser General Public
13 * License along with this library; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "wine/test.h"
23 static const char jpeg_adobe_cmyk_1x5
[] =
24 "\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x01\x01\x2c"
25 "\x01\x2c\x00\x00\xff\xee\x00\x0e\x41\x64\x6f\x62\x65\x00\x64\x00"
26 "\x00\x00\x00\x02\xff\xfe\x00\x13\x43\x72\x65\x61\x74\x65\x64\x20"
27 "\x77\x69\x74\x68\x20\x47\x49\x4d\x50\xff\xdb\x00\x43\x00\x01\x01"
28 "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
29 "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
30 "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
31 "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xff\xdb"
32 "\x00\x43\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
33 "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
34 "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
35 "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
36 "\x01\x01\x01\xff\xc0\x00\x14\x08\x00\x05\x00\x01\x04\x01\x11\x00"
37 "\x02\x11\x01\x03\x11\x01\x04\x11\x00\xff\xc4\x00\x15\x00\x01\x01"
38 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x08"
39 "\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
40 "\x00\x00\x00\x00\x00\x00\xff\xc4\x00\x14\x01\x01\x00\x00\x00\x00"
41 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\xff\xc4\x00\x14"
42 "\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
43 "\x00\x00\xff\xda\x00\x0e\x04\x01\x00\x02\x11\x03\x11\x04\x00\x00"
44 "\x3f\x00\x40\x44\x02\x1e\xa4\x1f\xff\xd9";
46 static void test_decode_adobe_cmyk(void)
48 IWICBitmapDecoder
*decoder
;
49 IWICBitmapFrameDecode
*framedecode
;
55 UINT count
=0, width
=0, height
=0;
56 BYTE imagedata
[5 * 4] = {1};
59 const BYTE expected_imagedata
[5 * 4] = {
60 0x00, 0xb0, 0xfc, 0x6d,
61 0x00, 0xb0, 0xfc, 0x6d,
62 0x00, 0xb0, 0xfc, 0x6d,
63 0x00, 0xb0, 0xfc, 0x6d,
64 0x00, 0xb0, 0xfc, 0x6d,
67 const BYTE expected_imagedata_24bpp
[5 * 4] = {
68 0x0d, 0x4b, 0x94, 0x00,
69 0x0d, 0x4b, 0x94, 0x00,
70 0x0d, 0x4b, 0x94, 0x00,
71 0x0d, 0x4b, 0x94, 0x00,
72 0x0d, 0x4b, 0x94, 0x00,
75 hr
= CoCreateInstance(&CLSID_WICJpegDecoder
, NULL
, CLSCTX_INPROC_SERVER
,
76 &IID_IWICBitmapDecoder
, (void**)&decoder
);
77 ok(SUCCEEDED(hr
), "CoCreateInstance failed, hr=%x\n", hr
);
78 if (FAILED(hr
)) return;
80 hjpegdata
= GlobalAlloc(GMEM_MOVEABLE
, sizeof(jpeg_adobe_cmyk_1x5
));
81 ok(hjpegdata
!= 0, "GlobalAlloc failed\n");
84 jpegdata
= GlobalLock(hjpegdata
);
85 memcpy(jpegdata
, jpeg_adobe_cmyk_1x5
, sizeof(jpeg_adobe_cmyk_1x5
));
86 GlobalUnlock(hjpegdata
);
88 hr
= CreateStreamOnHGlobal(hjpegdata
, FALSE
, &jpegstream
);
89 ok(SUCCEEDED(hr
), "CreateStreamOnHGlobal failed, hr=%x\n", hr
);
92 hr
= IWICBitmapDecoder_Initialize(decoder
, jpegstream
, WICDecodeMetadataCacheOnLoad
);
93 ok(hr
== S_OK
, "Initialize failed, hr=%x\n", hr
);
95 hr
= IWICBitmapDecoder_GetContainerFormat(decoder
, &guidresult
);
96 ok(SUCCEEDED(hr
), "GetContainerFormat failed, hr=%x\n", hr
);
97 ok(IsEqualGUID(&guidresult
, &GUID_ContainerFormatJpeg
), "unexpected container format\n");
99 hr
= IWICBitmapDecoder_GetFrameCount(decoder
, &count
);
100 ok(SUCCEEDED(hr
), "GetFrameCount failed, hr=%x\n", hr
);
101 ok(count
== 1, "unexpected count %u\n", count
);
103 hr
= IWICBitmapDecoder_GetFrame(decoder
, 0, &framedecode
);
104 ok(SUCCEEDED(hr
), "GetFrame failed, hr=%x\n", hr
);
107 hr
= IWICBitmapFrameDecode_GetSize(framedecode
, &width
, &height
);
108 ok(SUCCEEDED(hr
), "GetSize failed, hr=%x\n", hr
);
109 ok(width
== 1, "expected width=1, got %u\n", width
);
110 ok(height
== 5, "expected height=5, got %u\n", height
);
112 hr
= IWICBitmapFrameDecode_GetPixelFormat(framedecode
, &guidresult
);
113 ok(SUCCEEDED(hr
), "GetPixelFormat failed, hr=%x\n", hr
);
114 ok(IsEqualGUID(&guidresult
, &GUID_WICPixelFormat32bppCMYK
) ||
115 broken(IsEqualGUID(&guidresult
, &GUID_WICPixelFormat24bppBGR
)), /* xp/2003 */
116 "unexpected pixel format: %s\n", wine_dbgstr_guid(&guidresult
));
118 /* We want to be sure our state tracking will not impact output
119 * data on subsequent calls */
122 hr
= IWICBitmapFrameDecode_CopyPixels(framedecode
, NULL
, 4, sizeof(imagedata
), imagedata
);
123 ok(SUCCEEDED(hr
), "CopyPixels failed, hr=%x\n", hr
);
124 ok(!memcmp(imagedata
, expected_imagedata
, sizeof(imagedata
)) ||
125 broken(!memcmp(imagedata
, expected_imagedata_24bpp
, sizeof(expected_imagedata
))), /* xp/2003 */
126 "unexpected image data\n");
128 IWICBitmapFrameDecode_Release(framedecode
);
130 IStream_Release(jpegstream
);
132 GlobalFree(hjpegdata
);
134 IWICBitmapDecoder_Release(decoder
);
138 START_TEST(jpegformat
)
140 CoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
142 test_decode_adobe_cmyk();