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