2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for CImage
5 * PROGRAMMER: Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
17 int g_tests_executed
= 0;
18 int g_tests_failed
= 0;
19 void ok_func(const char *file
, int line
, BOOL value
, const char *fmt
, ...)
25 printf("%s (%d): ", file
, line
);
33 #define ok(value, ...) ok_func(__FILE__, __LINE__, value, __VA_ARGS__)
34 #define START_TEST(x) int main(void)
37 const TCHAR
* szFiles
[] = {
45 static TCHAR szTempPath
[MAX_PATH
];
46 TCHAR
* file_name(const TCHAR
* file
)
48 static TCHAR buffer
[MAX_PATH
];
49 lstrcpy(buffer
, szTempPath
);
50 lstrcat(buffer
, TEXT("\\"));
51 lstrcat(buffer
, file
);
55 static void write_bitmap(HINSTANCE hInst
, int id
, TCHAR
* file
)
59 rsrc
= FindResource(hInst
, MAKEINTRESOURCE(id
), RT_BITMAP
);
60 ok(rsrc
!= NULL
, "Expected to find an image resource\n");
66 HGLOBAL glob
= LoadResource(hInst
, rsrc
);
67 DWORD rsrc_size
= SizeofResource(hInst
, rsrc
);
69 rsrc_data
= LockResource(glob
);
71 hfile
= CreateFile(file
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, 0);
72 ok(hfile
!= INVALID_HANDLE_VALUE
, "Unable to open temp file: %lu\n", GetLastError());
73 if (hfile
!= INVALID_HANDLE_VALUE
)
75 BITMAPFILEHEADER bfh
= { 0 };
79 bfh
.bfSize
= rsrc_size
+ sizeof(BITMAPFILEHEADER
);
80 bfh
.bfOffBits
= sizeof(BITMAPFILEHEADER
) + sizeof(BITMAPINFOHEADER
);
81 bfh
.bfReserved1
= bfh
.bfReserved2
= 0;
82 ret
= WriteFile(hfile
, &bfh
, sizeof(bfh
), &dwWritten
, NULL
);
83 ok(ret
, "Unable to write temp file: %lu\n", GetLastError());
84 ret
= WriteFile(hfile
, rsrc_data
, rsrc_size
, &dwWritten
, NULL
);
85 ok(ret
, "Unable to write temp file: %lu\n", GetLastError());
88 UnlockResource(rsrc_data
);
92 typedef Gdiplus::GpStatus (WINAPI
*STARTUP
)(ULONG_PTR
*, const Gdiplus::GdiplusStartupInput
*, Gdiplus::GdiplusStartupOutput
*);
93 typedef void (WINAPI
*SHUTDOWN
)(ULONG_PTR
);
94 typedef Gdiplus::GpStatus (WINGDIPAPI
*CREATEBITMAPFROMFILE
)(GDIPCONST WCHAR
*, Gdiplus::GpBitmap
**);
95 typedef Gdiplus::GpStatus (WINGDIPAPI
*GETPIXELFORMAT
)(Gdiplus::GpImage
*image
, Gdiplus::PixelFormat
*format
);
96 typedef Gdiplus::GpStatus (WINGDIPAPI
*DISPOSEIMAGE
)(Gdiplus::GpImage
*);
98 static HINSTANCE hinstGdiPlus
;
99 static ULONG_PTR gdiplusToken
;
101 static STARTUP Startup
;
102 static SHUTDOWN Shutdown
;
103 static CREATEBITMAPFROMFILE CreateBitmapFromFile
;
104 static GETPIXELFORMAT GetImagePixelFormat
;
105 static DISPOSEIMAGE DisposeImage
;
107 template <typename TYPE
>
108 TYPE
AddrOf(const char *name
)
110 FARPROC proc
= ::GetProcAddress(hinstGdiPlus
, name
);
111 return reinterpret_cast<TYPE
>(proc
);
114 static void init_gdip()
116 hinstGdiPlus
= ::LoadLibraryA("gdiplus.dll");
117 Startup
= AddrOf
<STARTUP
>("GdiplusStartup");
118 Shutdown
= AddrOf
<SHUTDOWN
>("GdiplusShutdown");
119 CreateBitmapFromFile
= AddrOf
<CREATEBITMAPFROMFILE
>("GdipCreateBitmapFromFile");
120 GetImagePixelFormat
= AddrOf
<GETPIXELFORMAT
>("GdipGetImagePixelFormat");
121 DisposeImage
= AddrOf
<DISPOSEIMAGE
>("GdipDisposeImage");
125 static void determine_file_bpp(TCHAR
* tfile
, Gdiplus::PixelFormat expect_pf
)
127 using namespace Gdiplus
;
128 GpBitmap
*pBitmap
= NULL
;
133 WCHAR file
[MAX_PATH
];
134 ::MultiByteToWideChar(CP_ACP
, 0, tfile
, -1, file
, MAX_PATH
);
140 Gdiplus::GdiplusStartupInput gdiplusStartupInput
;
141 Startup(&gdiplusToken
, &gdiplusStartupInput
, NULL
);
144 Gdiplus::GpStatus status
= CreateBitmapFromFile(file
, &pBitmap
);
145 ok(status
== Gdiplus::Ok
, "Expected status to be %i, was: %i\n", (int)Gdiplus::Ok
, (int)status
);
146 ok(pBitmap
!= NULL
, "Expected a valid bitmap\n");
150 GetImagePixelFormat(pBitmap
, &pf
);
151 ok(pf
== expect_pf
, "Expected PixelFormat to be 0x%x, was: 0x%x\n", (int)expect_pf
, (int)pf
);
153 DisposeImage(pBitmap
);
155 Shutdown(gdiplusToken
);
164 int width
, height
, bpp
;
166 CImage image1
, image2
;
171 width
= image1
.GetWidth();
172 height
= image1
.GetHeight();
173 bpp
= image1
.GetBPP();
176 HINSTANCE hInst
= GetModuleHandle(NULL
);
177 GetTempPath(MAX_PATH
, szTempPath
);
179 image1
.LoadFromResource(hInst
, IDB_ANT
);
180 ok(!image1
.IsNull(), "Expected image1 is not null\n");
182 width
= image1
.GetWidth();
183 ok(width
== 48, "Expected width to be 48, was: %d\n", width
);
184 height
= image1
.GetHeight();
185 ok(height
== 48, "Expected height to be 48, was: %d\n", height
);
186 bpp
= image1
.GetBPP();
187 ok(bpp
== 8, "Expected bpp to be 8, was: %d\n", bpp
);
190 image2
.LoadFromResource(hInst
, IDB_CROSS
);
191 ok(!image2
.IsNull(), "Expected image2 is not null\n");
192 image2
.SetTransparentColor(RGB(255, 255, 255));
194 width
= image2
.GetWidth();
195 ok(width
== 32, "Expected width to be 32, was: %d\n", width
);
196 height
= image2
.GetHeight();
197 ok(height
== 32, "Expected height to be 32, was: %d\n", height
);
198 bpp
= image2
.GetBPP();
199 ok(bpp
== 8, "Expected bpp to be 8, was: %d\n", bpp
);
201 color
= image1
.GetPixel(5, 5);
202 ok(color
== RGB(166, 202, 240), "Expected color to be 166, 202, 240; was: %i, %i, %i\n", GetRValue(color
), GetGValue(color
), GetBValue(color
));
204 hDC
= image1
.GetDC();
205 bOK
= image2
.Draw(hDC
, 0, 0);
207 ok(bOK
!= FALSE
, "Expected bDraw to be TRUE, was: %d\n", bOK
);
210 color
= image1
.GetPixel(5, 5);
211 ok(color
== RGB(255, 0,0), "Expected color to be 255, 0, 0; was: %i, %i, %i\n", GetRValue(color
), GetGValue(color
), GetBValue(color
));
213 file
= file_name(TEXT("ant.bmp"));
214 write_bitmap(hInst
, IDB_ANT
, file
);
218 determine_file_bpp(file
, PixelFormat8bppIndexed
);
220 hr
= image2
.Load(file
);
221 ok(hr
== S_OK
, "Expected hr to be S_OK, was: %08lx\n", hr
);
222 ok(!image2
.IsNull(), "Expected image1 is not null\n");
223 bOK
= DeleteFile(file
);
224 ok(bOK
, "Expected bOK to be TRUE, was: %d\n", bOK
);
226 width
= image2
.GetWidth();
227 ok(width
== 48, "Expected width to be 48, was: %d\n", width
);
228 height
= image2
.GetHeight();
229 ok(height
== 48, "Expected height to be 48, was: %d\n", height
);
230 bpp
= image2
.GetBPP();
231 ok(bpp
== 8, "Expected bpp to be 8, was: %d\n", bpp
);
233 for (n
= 0; n
< _countof(szFiles
); ++n
)
235 file
= file_name(szFiles
[n
]);
239 hr
= image1
.Save(file
, Gdiplus::ImageFormatPNG
);
241 hr
= image1
.Save(file
);
242 ok(hr
== S_OK
, "Expected hr to be S_OK, was: %08lx (for %i)\n", hr
, n
);
244 bOK
= (GetFileAttributes(file
) != 0xFFFFFFFF);
245 ok(bOK
, "Expected bOK to be TRUE, was: %d (for %i)\n", bOK
, n
);
247 hr
= image2
.Load(file
);
248 ok(hr
== S_OK
, "Expected hr to be S_OK, was: %08lx (for %i)\n", hr
, n
);
250 width
= image2
.GetWidth();
251 ok(width
== 48, "Expected width to be 48, was: %d (for %i)\n", width
, n
);
252 height
= image2
.GetHeight();
253 ok(height
== 48, "Expected height to be 48, was: %d (for %i)\n", height
, n
);
254 bpp
= image2
.GetBPP();
257 ok(bpp
== 24, "Expected bpp to be 24, was: %d (for %i)\n", bpp
, n
);
258 determine_file_bpp(file
, PixelFormat24bppRGB
);
262 ok(bpp
== 8, "Expected bpp to be 8, was: %d (for %i)\n", bpp
, n
);
263 determine_file_bpp(file
, PixelFormat8bppIndexed
);
265 color
= image1
.GetPixel(5, 5);
266 ok(color
== RGB(255, 0,0), "Expected color to be 255, 0, 0; was: %i, %i, %i (for %i)\n", GetRValue(color
), GetGValue(color
), GetBValue(color
), n
);
268 bOK
= DeleteFile(file
);
269 ok(bOK
, "Expected bOK to be TRUE, was: %d (for %i)\n", bOK
, n
);
272 ATL::IAtlStringMgr
*mgr
= CAtlStringMgr::GetInstance();
273 CSimpleArray
<GUID
> aguidFileTypes
;
281 CSimpleString
strImporters(mgr
);
282 aguidFileTypes
.RemoveAll();
283 hr
= CImage::GetImporterFilterString(strImporters
,
285 TEXT("All Image Files"), 0);
286 ok(hr
== S_OK
, "Expected hr to be S_OK, was: %ld\n", hr
);
287 ok(aguidFileTypes
.GetSize() == 9, "Expected aguidFileTypes.GetSize() to be 8, was %d.", aguidFileTypes
.GetSize());
288 ok(IsEqualGUID(aguidFileTypes
[0], GUID_NULL
), "Expected aguidFileTypes[0] to be GUID_NULL.\n");
289 ok(IsEqualGUID(aguidFileTypes
[1], Gdiplus::ImageFormatBMP
), "Expected aguidFileTypes[1] to be Gdiplus::ImageFormatBMP.\n");
290 ok(IsEqualGUID(aguidFileTypes
[2], Gdiplus::ImageFormatJPEG
), "Expected aguidFileTypes[2] to be Gdiplus::ImageFormatJPEG.\n");
291 ok(IsEqualGUID(aguidFileTypes
[3], Gdiplus::ImageFormatGIF
), "Expected aguidFileTypes[3] to be Gdiplus::ImageFormatGIF.\n");
292 ok(IsEqualGUID(aguidFileTypes
[4], Gdiplus::ImageFormatEMF
), "Expected aguidFileTypes[4] to be Gdiplus::ImageFormatEMF.\n");
293 ok(IsEqualGUID(aguidFileTypes
[5], Gdiplus::ImageFormatWMF
), "Expected aguidFileTypes[5] to be Gdiplus::ImageFormatWMF.\n");
294 ok(IsEqualGUID(aguidFileTypes
[6], Gdiplus::ImageFormatTIFF
), "Expected aguidFileTypes[6] to be Gdiplus::ImageFormatTIFF.\n");
295 ok(IsEqualGUID(aguidFileTypes
[7], Gdiplus::ImageFormatPNG
), "Expected aguidFileTypes[7] to be Gdiplus::ImageFormatPNG.\n");
296 ok(IsEqualGUID(aguidFileTypes
[8], Gdiplus::ImageFormatIcon
), "Expected aguidFileTypes[8] to be Gdiplus::ImageFormatIcon.\n");
298 psz
= strImporters
.GetString();
300 WideCharToMultiByte(CP_ACP
, 0, psz
, -1, szBuff
, 512, NULL
, NULL
);
301 ok(lstrcmpA(szBuff
, "All Image Files|*.BMP;*.DIB;*.RLE;*.JPG;*.JPEG;*.JPE;*.JFIF;*.GIF;*.EMF;*.WMF;*.TIF;*.TIFF;*.PNG;*.ICO|BMP (*.BMP;*.DIB;*.RLE)|*.BMP;*.DIB;*.RLE|JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)|*.JPG;*.JPEG;*.JPE;*.JFIF|GIF (*.GIF)|*.GIF|EMF (*.EMF)|*.EMF|WMF (*.WMF)|*.WMF|TIFF (*.TIF;*.TIFF)|*.TIF;*.TIFF|PNG (*.PNG)|*.PNG|ICO (*.ICO)|*.ICO||") == 0,
302 "The importer filter string is bad, was: %s\n", szBuff
);
304 ok(lstrcmpA(psz
, "All Image Files|*.BMP;*.DIB;*.RLE;*.JPG;*.JPEG;*.JPE;*.JFIF;*.GIF;*.EMF;*.WMF;*.TIF;*.TIFF;*.PNG;*.ICO|BMP (*.BMP;*.DIB;*.RLE)|*.BMP;*.DIB;*.RLE|JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)|*.JPG;*.JPEG;*.JPE;*.JFIF|GIF (*.GIF)|*.GIF|EMF (*.EMF)|*.EMF|WMF (*.WMF)|*.WMF|TIFF (*.TIF;*.TIFF)|*.TIF;*.TIFF|PNG (*.PNG)|*.PNG|ICO (*.ICO)|*.ICO||") == 0,
305 "The importer filter string is bad, was: %s\n", psz
);
308 CSimpleString
strExporters(mgr
);
309 aguidFileTypes
.RemoveAll();
310 hr
= CImage::GetExporterFilterString(strExporters
,
312 TEXT("All Image Files"), 0);
313 ok(hr
== S_OK
, "Expected hr to be S_OK, was: %ld\n", hr
);
314 ok(aguidFileTypes
.GetSize() == 9, "Expected aguidFileTypes.GetSize() to be 8, was %d.", aguidFileTypes
.GetSize());
315 ok(IsEqualGUID(aguidFileTypes
[0], GUID_NULL
), "Expected aguidFileTypes[0] to be GUID_NULL.\n");
316 ok(IsEqualGUID(aguidFileTypes
[1], Gdiplus::ImageFormatBMP
), "Expected aguidFileTypes[1] to be Gdiplus::ImageFormatBMP.\n");
317 ok(IsEqualGUID(aguidFileTypes
[2], Gdiplus::ImageFormatJPEG
), "Expected aguidFileTypes[2] to be Gdiplus::ImageFormatJPEG.\n");
318 ok(IsEqualGUID(aguidFileTypes
[3], Gdiplus::ImageFormatGIF
), "Expected aguidFileTypes[3] to be Gdiplus::ImageFormatGIF.\n");
319 ok(IsEqualGUID(aguidFileTypes
[4], Gdiplus::ImageFormatEMF
), "Expected aguidFileTypes[4] to be Gdiplus::ImageFormatEMF.\n");
320 ok(IsEqualGUID(aguidFileTypes
[5], Gdiplus::ImageFormatWMF
), "Expected aguidFileTypes[5] to be Gdiplus::ImageFormatWMF.\n");
321 ok(IsEqualGUID(aguidFileTypes
[6], Gdiplus::ImageFormatTIFF
), "Expected aguidFileTypes[6] to be Gdiplus::ImageFormatTIFF.\n");
322 ok(IsEqualGUID(aguidFileTypes
[7], Gdiplus::ImageFormatPNG
), "Expected aguidFileTypes[7] to be Gdiplus::ImageFormatPNG.\n");
323 ok(IsEqualGUID(aguidFileTypes
[8], Gdiplus::ImageFormatIcon
), "Expected aguidFileTypes[8] to be Gdiplus::ImageFormatIcon.\n");
325 psz
= strExporters
.GetString();
327 WideCharToMultiByte(CP_ACP
, 0, psz
, -1, szBuff
, 512, NULL
, NULL
);
328 ok(lstrcmpA(szBuff
, "All Image Files|*.BMP;*.DIB;*.RLE;*.JPG;*.JPEG;*.JPE;*.JFIF;*.GIF;*.EMF;*.WMF;*.TIF;*.TIFF;*.PNG;*.ICO|BMP (*.BMP;*.DIB;*.RLE)|*.BMP;*.DIB;*.RLE|JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)|*.JPG;*.JPEG;*.JPE;*.JFIF|GIF (*.GIF)|*.GIF|EMF (*.EMF)|*.EMF|WMF (*.WMF)|*.WMF|TIFF (*.TIF;*.TIFF)|*.TIF;*.TIFF|PNG (*.PNG)|*.PNG|ICO (*.ICO)|*.ICO||") == 0,
329 "The exporter filter string is bad, was: %s\n", szBuff
);
331 ok(lstrcmpA(psz
, "All Image Files|*.BMP;*.DIB;*.RLE;*.JPG;*.JPEG;*.JPE;*.JFIF;*.GIF;*.EMF;*.WMF;*.TIF;*.TIFF;*.PNG;*.ICO|BMP (*.BMP;*.DIB;*.RLE)|*.BMP;*.DIB;*.RLE|JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)|*.JPG;*.JPEG;*.JPE;*.JFIF|GIF (*.GIF)|*.GIF|EMF (*.EMF)|*.EMF|WMF (*.WMF)|*.WMF|TIFF (*.TIF;*.TIFF)|*.TIF;*.TIFF|PNG (*.PNG)|*.PNG|ICO (*.ICO)|*.ICO||") == 0,
332 "The exporter filter string is bad, was: %s\n", psz
);
336 printf("CImage: %i tests executed (0 marked as todo, %i failures), 0 skipped.\n", g_tests_executed
, g_tests_failed
);
337 return g_tests_failed
;