1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for CImage and CImageDC
5 * PROGRAMMER: Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 */
7
8 #include <atlimage.h>
9 #include <strsafe.h>
10 #include "resource.h"
11
12 #ifdef HAVE_APITEST
13 #include <apitest.h>
14 #else
15 #include "atltest.h"
16 #endif
17
18 struct BITMAPINFOEX : BITMAPINFO
19 {
20 RGBQUAD bmiColorsExtra[256 - 1];
21 };
22
23 static void
Test_PixelAddress(INT iLine,const CImage & image1,const BITMAP & bm,INT x,INT y,BOOL bTopDown)24 Test_PixelAddress(INT iLine, const CImage &image1, const BITMAP &bm, INT x, INT y, BOOL bTopDown)
25 {
26 LPBYTE pb = (LPBYTE)bm.bmBits;
27
28 if (bTopDown)
29 pb += bm.bmWidthBytes * y;
30 else
31 pb += bm.bmWidthBytes * (bm.bmHeight - y - 1);
32
33 pb += (x * bm.bmBitsPixel) / 8;
34
35 LPCVOID addr = image1.GetPixelAddress(x, y);
36 ok(pb == addr, "Line %d: (%d, %d): %p vs %p\n", iLine, x, y, pb, addr);
37 }
38
39 static void
Test_BitmapEntry(INT iLine,INT bpp,INT width,INT height,BOOL bTopDown)40 Test_BitmapEntry(INT iLine, INT bpp, INT width, INT height, BOOL bTopDown)
41 {
42 HBITMAP hBitmap = ::CreateBitmap(width, height, bpp, 1, NULL);
43 ok(hBitmap != NULL, "Line %d: hBitmap was NULL\n", iLine);
44
45 CImage image1;
46
47 ok(image1.IsNull(), "Line %d: IsNull() was TRUE\n", iLine);
48 image1.Attach(hBitmap, (bTopDown ? CImage::DIBOR_TOPDOWN : CImage::DIBOR_BOTTOMUP));
49
50 ok(!image1.IsNull(), "Line %d: IsNull() was FALSE\n", iLine);
51 ok(!image1.IsDIBSection(), "Line %d: IsDIBSection() was TRUE\n", iLine);
52
53 ok(image1.GetWidth() == width, "Line %d: %d vs %d\n", iLine, image1.GetWidth(), width);
54 ok(image1.GetHeight() == height, "Line %d: %d vs %d\n", iLine, image1.GetHeight(), height);
55 ok(image1.GetBPP() == bpp, "Line %d: %d vs %d\n", iLine, image1.GetBPP(), 1);
56 }
57
Test_Bitmap(void)58 static void Test_Bitmap(void)
59 {
60 Test_BitmapEntry(__LINE__, 1, 20, 30, FALSE);
61 Test_BitmapEntry(__LINE__, 1, 30, 20, TRUE);
62 Test_BitmapEntry(__LINE__, 4, 20, 30, FALSE);
63 Test_BitmapEntry(__LINE__, 4, 30, 20, TRUE);
64 Test_BitmapEntry(__LINE__, 8, 20, 30, FALSE);
65 Test_BitmapEntry(__LINE__, 8, 30, 20, TRUE);
66 Test_BitmapEntry(__LINE__, 24, 20, 30, FALSE);
67 Test_BitmapEntry(__LINE__, 24, 30, 20, TRUE);
68 Test_BitmapEntry(__LINE__, 32, 20, 30, FALSE);
69 Test_BitmapEntry(__LINE__, 32, 30, 20, TRUE);
70 }
71
Test_CompatBitmapEntry(INT iLine,HDC hdc,INT width,INT height)72 static void Test_CompatBitmapEntry(INT iLine, HDC hdc, INT width, INT height)
73 {
74 HBITMAP hBitmap = ::CreateCompatibleBitmap(hdc, width, height);
75 ok(hBitmap != NULL, "Line %d: hBitmap was NULL\n", iLine);
76
77 CImage image1;
78
79 ok(image1.IsNull(), "Line %d: IsNull() was TRUE\n", iLine);
80 image1.Attach(hBitmap);
81
82 ok(!image1.IsNull(), "Line %d: IsNull() was FALSE\n", iLine);
83 ok(!image1.IsDIBSection(), "Line %d: IsDIBSection() was TRUE\n", iLine);
84
85 ok(image1.GetWidth() == width, "Line %d: %d vs %d\n", iLine, image1.GetWidth(), width);
86 ok(image1.GetHeight() == height, "Line %d: %d vs %d\n", iLine, image1.GetHeight(), height);
87 }
88
Test_CompatBitmap(void)89 static void Test_CompatBitmap(void)
90 {
91 HDC hdc = ::CreateCompatibleDC(NULL);
92
93 Test_CompatBitmapEntry(__LINE__, hdc, 20, 30);
94 Test_CompatBitmapEntry(__LINE__, hdc, 20, 30);
95 Test_CompatBitmapEntry(__LINE__, hdc, 20, 30);
96 Test_CompatBitmapEntry(__LINE__, hdc, 20, 30);
97 Test_CompatBitmapEntry(__LINE__, hdc, 20, 30);
98
99 ::DeleteDC(hdc);
100
101 hdc = ::GetDC(NULL);
102
103 Test_CompatBitmapEntry(__LINE__, hdc, 20, 30);
104 Test_CompatBitmapEntry(__LINE__, hdc, 20, 30);
105 Test_CompatBitmapEntry(__LINE__, hdc, 20, 30);
106 Test_CompatBitmapEntry(__LINE__, hdc, 20, 30);
107 Test_CompatBitmapEntry(__LINE__, hdc, 20, 30);
108
109 ::ReleaseDC(NULL, hdc);
110 }
111
112 static void
Test_DIBSectionEntry(INT iLine,HDC hdc,INT bpp,INT width,INT height,BOOL bTopDown)113 Test_DIBSectionEntry(INT iLine, HDC hdc, INT bpp, INT width, INT height, BOOL bTopDown)
114 {
115 // Initialize BITMAPINFOEX
116 BITMAPINFOEX bmi;
117 ZeroMemory(&bmi, sizeof(bmi));
118 bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
119 bmi.bmiHeader.biWidth = width;
120 bmi.bmiHeader.biHeight = (bTopDown ? -height : height);
121 bmi.bmiHeader.biPlanes = 1;
122 bmi.bmiHeader.biBitCount = bpp;
123 switch (bpp)
124 {
125 case 1:
126 bmi.bmiHeader.biClrUsed = 2;
127 bmi.bmiColorsExtra[0].rgbBlue = 0xFF;
128 bmi.bmiColorsExtra[0].rgbGreen = 0xFF;
129 bmi.bmiColorsExtra[0].rgbRed = 0xFF;
130 break;
131 case 4:
132 case 8:
133 bmi.bmiHeader.biClrUsed = 3;
134 bmi.bmiColorsExtra[0].rgbBlue = 0xFF;
135 bmi.bmiColorsExtra[0].rgbGreen = 0xFF;
136 bmi.bmiColorsExtra[0].rgbRed = 0xFF;
137 bmi.bmiColorsExtra[1].rgbBlue = 0;
138 bmi.bmiColorsExtra[1].rgbGreen = 0;
139 bmi.bmiColorsExtra[1].rgbRed = 0xFF;
140 break;
141 default:
142 break;
143 }
144
145 // Create a DIB bitmap
146 HBITMAP hBitmap = ::CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, NULL, NULL, 0);
147 ok(hBitmap != NULL, "Line %d: hBitmap was NULL\n", iLine);
148
149 BITMAP bm;
150 ::GetObject(hBitmap, sizeof(bm), &bm);
151 INT pitch = (bTopDown ? bm.bmWidthBytes : -bm.bmWidthBytes);
152
153 CImage image1;
154
155 ok(image1.IsNull(), "Line %d: IsNull() was FALSE\n", iLine);
156
157 image1.Attach(hBitmap, (bTopDown ? CImage::DIBOR_TOPDOWN : CImage::DIBOR_BOTTOMUP));
158
159 ok(!image1.IsNull(), "Line %d: IsNull() was FALSE\n", iLine);
160 ok(image1.IsDIBSection(), "Line %d: IsDIBSection() was FALSE\n", iLine);
161 if (bpp == 4 || bpp == 8)
162 {
163 ok(image1.GetTransparentColor() == 0xFFFFFFFF, "Line %d: 0x%08lX\n", iLine,
164 image1.GetTransparentColor());
165 }
166
167 switch (bpp)
168 {
169 case 1:
170 ok(image1.GetMaxColorTableEntries() == 2,
171 "Line %d: %d\n", iLine, image1.GetMaxColorTableEntries());
172 break;
173 case 4:
174 ok(image1.GetMaxColorTableEntries() == 16,
175 "Line %d: %d\n", iLine, image1.GetMaxColorTableEntries());
176 break;
177 case 8:
178 ok(image1.GetMaxColorTableEntries() == 256,
179 "Line %d: %d\n", iLine, image1.GetMaxColorTableEntries());
180 break;
181 case 24:
182 case 32:
183 ok(image1.GetMaxColorTableEntries() == 0,
184 "Line %d: %d\n", iLine, image1.GetMaxColorTableEntries());
185 break;
186 }
187
188 ok(image1.GetWidth() == width, "Line %d: %d vs %d\n", iLine, image1.GetWidth(), width);
189 ok(image1.GetHeight() == height, "Line %d: %d vs %d\n", iLine, image1.GetHeight(), height);
190 ok(image1.GetBPP() == bpp, "Line %d: %d vs %d\n", iLine, image1.GetBPP(), bpp);
191 ok(image1.GetPitch() == pitch, "Line %d: %d vs %d\n", iLine, image1.GetPitch(), pitch);
192
193 LPBYTE pbBits = (LPBYTE)bm.bmBits;
194 if (!bTopDown)
195 pbBits += bm.bmWidthBytes * (height - 1);
196 ok(image1.GetBits() == pbBits, "Line %d: %p vs %p\n", iLine, image1.GetBits(), pbBits);
197
198 // Test Color Table
199 if (bpp <= 8)
200 {
201 DWORD Colors[3];
202 C_ASSERT(sizeof(DWORD) == sizeof(RGBQUAD));
203 FillMemory(Colors, sizeof(Colors), 0xCC);
204 image1.GetColorTable(0, _countof(Colors), (RGBQUAD *)Colors);
205 ok(Colors[0] == 0, "Line %d: 0x%08lX\n", iLine, Colors[0]);
206 ok(Colors[1] == 0xFFFFFF, "Line %d: 0x%08lX\n", iLine, Colors[1]);
207 if (bpp >= 4)
208 ok(Colors[2] == 0xFF0000, "Line %d: 0x%08lX\n", iLine, Colors[2]);
209 }
210
211 // Test SetPixel/GetPixel
212 COLORREF color;
213 image1.SetPixel(0, 0, RGB(255, 255, 255));
214 color = image1.GetPixel(0, 0);
215 ok(color == RGB(255, 255, 255), "Line %d: color was 0x%08lX\n", iLine, color);
216 image1.SetPixel(0, 0, RGB(0, 0, 0));
217 color = image1.GetPixel(0, 0);
218 ok(color == RGB(0, 0, 0), "Line %d: color was 0x%08lX\n", iLine, color);
219
220 // Test GetDC/ReleaseDC
221 {
222 HDC hdc1 = image1.GetDC();
223 ok(hdc1 != NULL, "Line %d: hdc1 was NULL\n", iLine);
224 ::SetPixelV(hdc1, 2, 2, RGB(255, 255, 255));
225 {
226 HDC hdc2 = image1.GetDC();
227 ok(hdc2 != NULL, "Line %d: hdc2 was NULL\n", iLine);
228 color = ::GetPixel(hdc2, 2, 2);
229 ok(color == RGB(255, 255, 255), "Line %d: color was 0x%08lX\n", iLine, color);
230 image1.ReleaseDC();
231 }
232 image1.ReleaseDC();
233 }
234
235 // Test CImageDC
236 {
237 CImageDC hdc1(image1);
238 ok(hdc1 != NULL, "Line %d: hdc1 was NULL\n", iLine);
239 ::SetPixelV(hdc1, 1, 0, RGB(255, 255, 255));
240 {
241 CImageDC hdc2(image1);
242 ok(hdc2 != NULL, "Line %d: hdc2 was NULL\n", iLine);
243 color = ::GetPixel(hdc2, 1, 0);
244 ok(color == RGB(255, 255, 255), "Line %d: color was 0x%08lX\n", iLine, color);
245 }
246 }
247
248 HRESULT hr;
249 TCHAR szFileName[MAX_PATH];
250 LPCTSTR dotexts[] =
251 {
252 TEXT(".bmp"), TEXT(".jpg"), TEXT(".png"), TEXT(".gif"), TEXT(".tif")
253 };
254
255 // Test Save/Load
256 for (UINT iDotExt = 0; iDotExt < _countof(dotexts); ++iDotExt)
257 {
258 ::ExpandEnvironmentStrings(TEXT("%TEMP%\\CImage"), szFileName, _countof(szFileName));
259 StringCchCat(szFileName, _countof(szFileName), dotexts[iDotExt]);
260 hr = image1.Save(szFileName);
261 ok(hr == S_OK, "Line %d: %d: hr was 0x%08lX\n", iLine, iDotExt, hr);
262
263 CImage image2;
264 hr = image2.Load(szFileName);
265 ok(hr == S_OK, "Line %d: %d: hr was 0x%08lX\n", iLine, iDotExt, hr);
266 ::DeleteFile(szFileName);
267
268 CImageDC hdc2(image2);
269 ok(hdc2 != NULL, "Line %d: %d: hdc2 was NULL\n", iLine, iDotExt);
270 color = ::GetPixel(hdc2, 0, 0);
271 ok(color == RGB(0, 0, 0), "Line %d: %d: color was 0x%08lX\n", iLine, iDotExt, color);
272 color = ::GetPixel(hdc2, 1, 0);
273 ok(color == RGB(255, 255, 255), "Line %d: %d: color was 0x%08lX\n", iLine, iDotExt, color);
274 }
275
276 // Test GetPixelAddress
277 Test_PixelAddress(iLine, image1, bm, 0, 0, bTopDown);
278 Test_PixelAddress(iLine, image1, bm, 10, 0, bTopDown);
279 Test_PixelAddress(iLine, image1, bm, 0, 10, bTopDown);
280 Test_PixelAddress(iLine, image1, bm, 4, 6, bTopDown);
281 Test_PixelAddress(iLine, image1, bm, 6, 2, bTopDown);
282 }
283
Test_DIBSection(void)284 static void Test_DIBSection(void)
285 {
286 HDC hdc = ::CreateCompatibleDC(NULL);
287
288 Test_DIBSectionEntry(__LINE__, hdc, 1, 30, 20, FALSE);
289 Test_DIBSectionEntry(__LINE__, hdc, 1, 20, 30, TRUE);
290 Test_DIBSectionEntry(__LINE__, hdc, 4, 30, 20, FALSE);
291 Test_DIBSectionEntry(__LINE__, hdc, 4, 20, 30, TRUE);
292 Test_DIBSectionEntry(__LINE__, hdc, 8, 30, 20, FALSE);
293 Test_DIBSectionEntry(__LINE__, hdc, 8, 20, 30, TRUE);
294 Test_DIBSectionEntry(__LINE__, hdc, 24, 30, 20, FALSE);
295 Test_DIBSectionEntry(__LINE__, hdc, 24, 20, 30, TRUE);
296 Test_DIBSectionEntry(__LINE__, hdc, 32, 30, 20, FALSE);
297 Test_DIBSectionEntry(__LINE__, hdc, 32, 20, 30, TRUE);
298
299 ::DeleteDC(hdc);
300 }
301
Test_ResBitmap(void)302 static void Test_ResBitmap(void)
303 {
304 HINSTANCE hInst = GetModuleHandle(NULL);
305
306 CImage image1;
307 ok_int(image1.IsNull(), TRUE);
308 image1.LoadFromResource(hInst, IDB_ANT);
309 ok_int(image1.IsNull(), FALSE);
310
311 ok_int(image1.GetWidth(), 48);
312 ok_int(image1.GetHeight(), 48);
313 ok_int(image1.GetBPP(), 8);
314 ok_int(image1.GetPitch(), -48);
315
316 CImage image2;
317 ok_int(image2.IsNull(), TRUE);
318 image2.LoadFromResource(hInst, IDB_CROSS);
319 ok_int(image2.IsNull(), FALSE);
320
321 ok_int(image2.GetWidth(), 32);
322 ok_int(image2.GetHeight(), 32);
323 ok_int(image2.GetBPP(), 8);
324 ok_int(image2.GetPitch(), -32);
325 }
326
FindGUID(REFGUID rguid,const CSimpleArray<GUID> & guids)327 static INT FindGUID(REFGUID rguid, const CSimpleArray<GUID>& guids)
328 {
329 for (INT i = 0; i < guids.GetSize(); ++i)
330 {
331 if (memcmp(&rguid, &guids[i], sizeof(GUID)) == 0)
332 return i;
333 }
334 return -1;
335 }
336
FindFilterItem(const TCHAR * filter,const TCHAR * item)337 static INT FindFilterItem(const TCHAR *filter, const TCHAR *item)
338 {
339 INT iFilter = 0;
340 DWORD cbItem = lstrlen(item) * sizeof(TCHAR);
341 BOOL bSep = TRUE;
342
343 for (; *filter; ++filter)
344 {
345 if (bSep && memcmp(item, filter, cbItem) == 0)
346 return (iFilter + 1) / 2;
347
348 bSep = (*filter == TEXT('|'));
349 if (bSep)
350 ++iFilter;
351 }
352
353 return -1;
354 }
355
Test_Importer(void)356 static void Test_Importer(void)
357 {
358 HRESULT hr;
359 ATL::IAtlStringMgr *mgr = CAtlStringMgr::GetInstance();
360 CSimpleArray<GUID> aguidFileTypes;
361 INT iNULL, iBMP, iJPEG, iGIF, iPNG, iTIFF, iEMF, iWMF;
362
363 // Try importer with "All Image Files"
364 CSimpleString strImporters(mgr);
365 aguidFileTypes.RemoveAll();
366 hr = CImage::GetImporterFilterString(strImporters, aguidFileTypes, TEXT("All Image Files"), 0);
367 ok(hr == S_OK, "Expected hr to be S_OK, was: %ld\n", hr);
368 ok(aguidFileTypes.GetSize() >= 8,
369 "Expected aguidFileTypes.GetSize() to be >= 8, was %d.", aguidFileTypes.GetSize());
370
371 iNULL = FindGUID(GUID_NULL, aguidFileTypes);
372 iBMP = FindGUID(Gdiplus::ImageFormatBMP, aguidFileTypes);
373 iJPEG = FindGUID(Gdiplus::ImageFormatJPEG, aguidFileTypes);
374 iGIF = FindGUID(Gdiplus::ImageFormatGIF, aguidFileTypes);
375 iPNG = FindGUID(Gdiplus::ImageFormatPNG, aguidFileTypes);
376 iTIFF = FindGUID(Gdiplus::ImageFormatTIFF, aguidFileTypes);
377 iEMF = FindGUID(Gdiplus::ImageFormatEMF, aguidFileTypes);
378 iWMF = FindGUID(Gdiplus::ImageFormatWMF, aguidFileTypes);
379
380 ok_int(iNULL, 0);
381 ok(iBMP > 0, "iBMP was %d\n", iBMP);
382 ok(iJPEG > 0, "iJPEG was %d\n", iJPEG);
383 ok(iGIF > 0, "iGIF was %d\n", iGIF);
384 ok(iPNG > 0, "iPNG was %d\n", iPNG);
385 ok(iTIFF > 0, "iTIFF was %d\n", iTIFF);
386 ok(iEMF > 0, "iEMF was %d\n", iEMF);
387 ok(iWMF > 0, "iWMF was %d\n", iWMF);
388
389 ok_int(memcmp(strImporters, TEXT("All Image Files|"), sizeof(TEXT("All Image Files|")) - sizeof(TCHAR)), 0);
390 ok_int(iBMP, FindFilterItem(strImporters, TEXT("BMP (*.BMP;*.DIB;*.RLE)|*.BMP;*.DIB;*.RLE|")));
391 ok_int(iJPEG, FindFilterItem(strImporters, TEXT("JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)|*.JPG;*.JPEG;*.JPE;*.JFIF|")));
392 ok_int(iGIF, FindFilterItem(strImporters, TEXT("GIF (*.GIF)|*.GIF|")));
393 ok_int(iPNG, FindFilterItem(strImporters, TEXT("PNG (*.PNG)|*.PNG|")));
394 ok_int(iTIFF, FindFilterItem(strImporters, TEXT("TIFF (*.TIF;*.TIFF)|*.TIF;*.TIFF|")));
395
396 // Try importer without "All Image Files"
397 aguidFileTypes.RemoveAll();
398 strImporters.Empty();
399 hr = CImage::GetImporterFilterString(strImporters, aguidFileTypes, NULL, 0);
400 ok(hr == S_OK, "Expected hr to be S_OK, was: %ld\n", hr);
401 ok(aguidFileTypes.GetSize() >= 7,
402 "Expected aguidFileTypes.GetSize() to be >= 7, was %d.", aguidFileTypes.GetSize());
403
404 iNULL = FindGUID(GUID_NULL, aguidFileTypes);
405 iBMP = FindGUID(Gdiplus::ImageFormatBMP, aguidFileTypes);
406 iJPEG = FindGUID(Gdiplus::ImageFormatJPEG, aguidFileTypes);
407 iGIF = FindGUID(Gdiplus::ImageFormatGIF, aguidFileTypes);
408 iPNG = FindGUID(Gdiplus::ImageFormatPNG, aguidFileTypes);
409 iTIFF = FindGUID(Gdiplus::ImageFormatTIFF, aguidFileTypes);
410 iEMF = FindGUID(Gdiplus::ImageFormatEMF, aguidFileTypes);
411 iWMF = FindGUID(Gdiplus::ImageFormatWMF, aguidFileTypes);
412
413 ok_int(iNULL, -1);
414 ok_int(iBMP, 0);
415 ok(iJPEG > 0, "iJPEG was %d\n", iJPEG);
416 ok(iGIF > 0, "iGIF was %d\n", iGIF);
417 ok(iPNG > 0, "iPNG was %d\n", iPNG);
418 ok(iTIFF > 0, "iTIFF was %d\n", iTIFF);
419 ok(iEMF > 0, "iEMF was %d\n", iEMF);
420 ok(iWMF > 0, "iWMF was %d\n", iWMF);
421
422 ok_int(iBMP, FindFilterItem(strImporters, TEXT("BMP (*.BMP;*.DIB;*.RLE)|*.BMP;*.DIB;*.RLE|")));
423 ok_int(iJPEG, FindFilterItem(strImporters, TEXT("JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)|*.JPG;*.JPEG;*.JPE;*.JFIF|")));
424 ok_int(iGIF, FindFilterItem(strImporters, TEXT("GIF (*.GIF)|*.GIF|")));
425 ok_int(iPNG, FindFilterItem(strImporters, TEXT("PNG (*.PNG)|*.PNG|")));
426 ok_int(iTIFF, FindFilterItem(strImporters, TEXT("TIFF (*.TIF;*.TIFF)|*.TIF;*.TIFF|")));
427 }
428
Test_Exporter(void)429 static void Test_Exporter(void)
430 {
431 HRESULT hr;
432 ATL::IAtlStringMgr *mgr = CAtlStringMgr::GetInstance();
433 CSimpleArray<GUID> aguidFileTypes;
434 INT iNULL, iBMP, iJPEG, iGIF, iPNG, iTIFF;
435
436 // Try exporter with "All Image Files"
437 CSimpleString strExporters(mgr);
438 aguidFileTypes.RemoveAll();
439 hr = CImage::GetExporterFilterString(strExporters, aguidFileTypes, TEXT("All Image Files"), 0);
440 ok(hr == S_OK, "Expected hr to be S_OK, was: %ld\n", hr);
441 ok(aguidFileTypes.GetSize() >= 6,
442 "Expected aguidFileTypes.GetSize() to be >= 6, was %d.", aguidFileTypes.GetSize());
443
444 iNULL = FindGUID(GUID_NULL, aguidFileTypes);
445 iBMP = FindGUID(Gdiplus::ImageFormatBMP, aguidFileTypes);
446 iJPEG = FindGUID(Gdiplus::ImageFormatJPEG, aguidFileTypes);
447 iGIF = FindGUID(Gdiplus::ImageFormatGIF, aguidFileTypes);
448 iPNG = FindGUID(Gdiplus::ImageFormatPNG, aguidFileTypes);
449 iTIFF = FindGUID(Gdiplus::ImageFormatTIFF, aguidFileTypes);
450
451 ok_int(iNULL, 0);
452 ok(iBMP > 0, "iBMP was %d\n", iBMP);
453 ok(iJPEG > 0, "iJPEG was %d\n", iJPEG);
454 ok(iGIF > 0, "iGIF was %d\n", iGIF);
455 ok(iPNG > 0, "iPNG was %d\n", iPNG);
456 ok(iTIFF > 0, "iTIFF was %d\n", iTIFF);
457
458 ok_int(iBMP, FindFilterItem(strExporters, TEXT("BMP (*.BMP;*.DIB;*.RLE)|*.BMP;*.DIB;*.RLE|")));
459 ok_int(iJPEG, FindFilterItem(strExporters, TEXT("JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)|*.JPG;*.JPEG;*.JPE;*.JFIF|")));
460 ok_int(iGIF, FindFilterItem(strExporters, TEXT("GIF (*.GIF)|*.GIF|")));
461 ok_int(iPNG, FindFilterItem(strExporters, TEXT("PNG (*.PNG)|*.PNG|")));
462 ok_int(iTIFF, FindFilterItem(strExporters, TEXT("TIFF (*.TIF;*.TIFF)|*.TIF;*.TIFF|")));
463
464 // Try exporter without "All Image Files"
465 strExporters.Empty();
466 aguidFileTypes.RemoveAll();
467 hr = CImage::GetExporterFilterString(strExporters, aguidFileTypes, NULL, 0);
468 ok(hr == S_OK, "Expected hr to be S_OK, was: %ld\n", hr);
469 ok(aguidFileTypes.GetSize() >= 5,
470 "Expected aguidFileTypes.GetSize() to be >= 5, was %d.", aguidFileTypes.GetSize());
471
472 iNULL = FindGUID(GUID_NULL, aguidFileTypes);
473 iBMP = FindGUID(Gdiplus::ImageFormatBMP, aguidFileTypes);
474 iJPEG = FindGUID(Gdiplus::ImageFormatJPEG, aguidFileTypes);
475 iGIF = FindGUID(Gdiplus::ImageFormatGIF, aguidFileTypes);
476 iPNG = FindGUID(Gdiplus::ImageFormatPNG, aguidFileTypes);
477 iTIFF = FindGUID(Gdiplus::ImageFormatTIFF, aguidFileTypes);
478
479 ok_int(iNULL, -1);
480 ok_int(iBMP, 0);
481 ok(iJPEG > 0, "iJPEG was %d\n", iJPEG);
482 ok(iGIF > 0, "iGIF was %d\n", iGIF);
483 ok(iPNG > 0, "iPNG was %d\n", iPNG);
484 ok(iTIFF > 0, "iTIFF was %d\n", iTIFF);
485
486 ok_int(iBMP, FindFilterItem(strExporters, TEXT("BMP (*.BMP;*.DIB;*.RLE)|*.BMP;*.DIB;*.RLE|")));
487 ok_int(iJPEG, FindFilterItem(strExporters, TEXT("JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)|*.JPG;*.JPEG;*.JPE;*.JFIF|")));
488 ok_int(iGIF, FindFilterItem(strExporters, TEXT("GIF (*.GIF)|*.GIF|")));
489 ok_int(iPNG, FindFilterItem(strExporters, TEXT("PNG (*.PNG)|*.PNG|")));
490 ok_int(iTIFF, FindFilterItem(strExporters, TEXT("TIFF (*.TIF;*.TIFF)|*.TIF;*.TIFF|")));
491 }
492
START_TEST(CImage)493 START_TEST(CImage)
494 {
495 Test_Bitmap();
496 Test_CompatBitmap();
497 Test_DIBSection();
498 Test_ResBitmap();
499 Test_Importer();
500 Test_Exporter();
501 }
502