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 const TCHAR
* szFiles
[] = {
25 static TCHAR szTempPath
[MAX_PATH
];
26 TCHAR
* file_name(const TCHAR
* file
)
28 static TCHAR buffer
[MAX_PATH
];
29 lstrcpy(buffer
, szTempPath
);
30 lstrcat(buffer
, TEXT("\\"));
31 lstrcat(buffer
, file
);
35 static void write_bitmap(HINSTANCE hInst
, int id
, TCHAR
* file
)
39 rsrc
= FindResource(hInst
, MAKEINTRESOURCE(id
), RT_BITMAP
);
40 ok(rsrc
!= NULL
, "Expected to find an image resource\n");
46 HGLOBAL glob
= LoadResource(hInst
, rsrc
);
47 DWORD rsrc_size
= SizeofResource(hInst
, rsrc
);
49 rsrc_data
= LockResource(glob
);
51 hfile
= CreateFile(file
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, 0);
52 ok(hfile
!= INVALID_HANDLE_VALUE
, "Unable to open temp file: %lu\n", GetLastError());
53 if (hfile
!= INVALID_HANDLE_VALUE
)
55 BITMAPFILEHEADER bfh
= { 0 };
59 bfh
.bfSize
= rsrc_size
+ sizeof(BITMAPFILEHEADER
);
60 bfh
.bfOffBits
= sizeof(BITMAPFILEHEADER
) + sizeof(BITMAPINFOHEADER
);
61 bfh
.bfReserved1
= bfh
.bfReserved2
= 0;
62 ret
= WriteFile(hfile
, &bfh
, sizeof(bfh
), &dwWritten
, NULL
);
63 ok(ret
, "Unable to write temp file: %lu\n", GetLastError());
64 ret
= WriteFile(hfile
, rsrc_data
, rsrc_size
, &dwWritten
, NULL
);
65 ok(ret
, "Unable to write temp file: %lu\n", GetLastError());
68 UnlockResource(rsrc_data
);
72 typedef Gdiplus::GpStatus (WINAPI
*STARTUP
)(ULONG_PTR
*, const Gdiplus::GdiplusStartupInput
*, Gdiplus::GdiplusStartupOutput
*);
73 typedef void (WINAPI
*SHUTDOWN
)(ULONG_PTR
);
74 typedef Gdiplus::GpStatus (WINGDIPAPI
*CREATEBITMAPFROMFILE
)(GDIPCONST WCHAR
*, Gdiplus::GpBitmap
**);
75 typedef Gdiplus::GpStatus (WINGDIPAPI
*GETPIXELFORMAT
)(Gdiplus::GpImage
*image
, Gdiplus::PixelFormat
*format
);
76 typedef Gdiplus::GpStatus (WINGDIPAPI
*DISPOSEIMAGE
)(Gdiplus::GpImage
*);
78 static HINSTANCE hinstGdiPlus
;
79 static ULONG_PTR gdiplusToken
;
81 static STARTUP Startup
;
82 static SHUTDOWN Shutdown
;
83 static CREATEBITMAPFROMFILE CreateBitmapFromFile
;
84 static GETPIXELFORMAT GetImagePixelFormat
;
85 static DISPOSEIMAGE DisposeImage
;
87 template <typename TYPE
>
88 TYPE
AddrOf(const char *name
)
90 FARPROC proc
= ::GetProcAddress(hinstGdiPlus
, name
);
91 return reinterpret_cast<TYPE
>(proc
);
94 static void init_gdip()
96 hinstGdiPlus
= ::LoadLibraryA("gdiplus.dll");
97 Startup
= AddrOf
<STARTUP
>("GdiplusStartup");
98 Shutdown
= AddrOf
<SHUTDOWN
>("GdiplusShutdown");
99 CreateBitmapFromFile
= AddrOf
<CREATEBITMAPFROMFILE
>("GdipCreateBitmapFromFile");
100 GetImagePixelFormat
= AddrOf
<GETPIXELFORMAT
>("GdipGetImagePixelFormat");
101 DisposeImage
= AddrOf
<DISPOSEIMAGE
>("GdipDisposeImage");
105 static void determine_file_bpp(TCHAR
* tfile
, Gdiplus::PixelFormat expect_pf
)
107 using namespace Gdiplus
;
108 GpBitmap
*pBitmap
= NULL
;
113 WCHAR file
[MAX_PATH
];
114 ::MultiByteToWideChar(CP_ACP
, 0, tfile
, -1, file
, MAX_PATH
);
120 Gdiplus::GdiplusStartupInput gdiplusStartupInput
;
121 Startup(&gdiplusToken
, &gdiplusStartupInput
, NULL
);
124 Gdiplus::GpStatus status
= CreateBitmapFromFile(file
, &pBitmap
);
125 ok(status
== Gdiplus::Ok
, "Expected status to be %i, was: %i\n", (int)Gdiplus::Ok
, (int)status
);
126 ok(pBitmap
!= NULL
, "Expected a valid bitmap\n");
130 GetImagePixelFormat(pBitmap
, &pf
);
131 ok(pf
== expect_pf
, "Expected PixelFormat to be 0x%x, was: 0x%x\n", (int)expect_pf
, (int)pf
);
133 DisposeImage(pBitmap
);
135 Shutdown(gdiplusToken
);
144 int width
, height
, bpp
;
146 CImage image1
, image2
;
151 width
= image1
.GetWidth();
152 height
= image1
.GetHeight();
153 bpp
= image1
.GetBPP();
156 HINSTANCE hInst
= GetModuleHandle(NULL
);
157 GetTempPath(MAX_PATH
, szTempPath
);
159 image1
.LoadFromResource(hInst
, IDB_ANT
);
160 ok(!image1
.IsNull(), "Expected image1 is not null\n");
162 width
= image1
.GetWidth();
163 ok(width
== 48, "Expected width to be 48, was: %d\n", width
);
164 height
= image1
.GetHeight();
165 ok(height
== 48, "Expected height to be 48, was: %d\n", height
);
166 bpp
= image1
.GetBPP();
167 ok(bpp
== 8, "Expected bpp to be 8, was: %d\n", bpp
);
170 image2
.LoadFromResource(hInst
, IDB_CROSS
);
171 ok(!image2
.IsNull(), "Expected image2 is not null\n");
172 image2
.SetTransparentColor(RGB(255, 255, 255));
174 width
= image2
.GetWidth();
175 ok(width
== 32, "Expected width to be 32, was: %d\n", width
);
176 height
= image2
.GetHeight();
177 ok(height
== 32, "Expected height to be 32, was: %d\n", height
);
178 bpp
= image2
.GetBPP();
179 ok(bpp
== 8, "Expected bpp to be 8, was: %d\n", bpp
);
181 color
= image1
.GetPixel(5, 5);
182 ok(color
== RGB(166, 202, 240), "Expected color to be 166, 202, 240; was: %i, %i, %i\n", GetRValue(color
), GetGValue(color
), GetBValue(color
));
184 hDC
= image1
.GetDC();
185 bOK
= image2
.Draw(hDC
, 0, 0);
187 ok(bOK
!= FALSE
, "Expected bDraw to be TRUE, was: %d\n", bOK
);
190 color
= image1
.GetPixel(5, 5);
191 ok(color
== RGB(255, 0,0), "Expected color to be 255, 0, 0; was: %i, %i, %i\n", GetRValue(color
), GetGValue(color
), GetBValue(color
));
193 file
= file_name(TEXT("ant.bmp"));
194 write_bitmap(hInst
, IDB_ANT
, file
);
198 determine_file_bpp(file
, PixelFormat8bppIndexed
);
200 hr
= image2
.Load(file
);
201 ok(hr
== S_OK
, "Expected hr to be S_OK, was: %08lx\n", hr
);
202 ok(!image2
.IsNull(), "Expected image1 is not null\n");
203 bOK
= DeleteFile(file
);
204 ok(bOK
, "Expected bOK to be TRUE, was: %d\n", bOK
);
206 width
= image2
.GetWidth();
207 ok(width
== 48, "Expected width to be 48, was: %d\n", width
);
208 height
= image2
.GetHeight();
209 ok(height
== 48, "Expected height to be 48, was: %d\n", height
);
210 bpp
= image2
.GetBPP();
211 ok(bpp
== 8, "Expected bpp to be 8, was: %d\n", bpp
);
213 for (n
= 0; n
< _countof(szFiles
); ++n
)
215 file
= file_name(szFiles
[n
]);
219 hr
= image1
.Save(file
, Gdiplus::ImageFormatPNG
);
221 hr
= image1
.Save(file
);
222 ok(hr
== S_OK
, "Expected hr to be S_OK, was: %08lx (for %i)\n", hr
, n
);
224 bOK
= (GetFileAttributes(file
) != 0xFFFFFFFF);
225 ok(bOK
, "Expected bOK to be TRUE, was: %d (for %i)\n", bOK
, n
);
227 hr
= image2
.Load(file
);
228 ok(hr
== S_OK
, "Expected hr to be S_OK, was: %08lx (for %i)\n", hr
, n
);
230 width
= image2
.GetWidth();
231 ok(width
== 48, "Expected width to be 48, was: %d (for %i)\n", width
, n
);
232 height
= image2
.GetHeight();
233 ok(height
== 48, "Expected height to be 48, was: %d (for %i)\n", height
, n
);
234 bpp
= image2
.GetBPP();
237 ok(bpp
== 24, "Expected bpp to be 24, was: %d (for %i)\n", bpp
, n
);
238 determine_file_bpp(file
, PixelFormat24bppRGB
);
242 ok(bpp
== 8, "Expected bpp to be 8, was: %d (for %i)\n", bpp
, n
);
243 determine_file_bpp(file
, PixelFormat8bppIndexed
);
245 color
= image1
.GetPixel(5, 5);
246 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
);
248 bOK
= DeleteFile(file
);
249 ok(bOK
, "Expected bOK to be TRUE, was: %d (for %i)\n", bOK
, n
);
252 ATL::IAtlStringMgr
*mgr
= CAtlStringMgr::GetInstance();
253 CSimpleArray
<GUID
> aguidFileTypes
;
261 CSimpleString
strImporters(mgr
);
262 aguidFileTypes
.RemoveAll();
263 hr
= CImage::GetImporterFilterString(strImporters
,
265 TEXT("All Image Files"), 0);
266 ok(hr
== S_OK
, "Expected hr to be S_OK, was: %ld\n", hr
);
267 ok(aguidFileTypes
.GetSize() == 9, "Expected aguidFileTypes.GetSize() to be 8, was %d.", aguidFileTypes
.GetSize());
268 ok(IsEqualGUID(aguidFileTypes
[0], GUID_NULL
), "Expected aguidFileTypes[0] to be GUID_NULL.\n");
269 ok(IsEqualGUID(aguidFileTypes
[1], Gdiplus::ImageFormatBMP
), "Expected aguidFileTypes[1] to be Gdiplus::ImageFormatBMP.\n");
270 ok(IsEqualGUID(aguidFileTypes
[2], Gdiplus::ImageFormatJPEG
), "Expected aguidFileTypes[2] to be Gdiplus::ImageFormatJPEG.\n");
271 ok(IsEqualGUID(aguidFileTypes
[3], Gdiplus::ImageFormatGIF
), "Expected aguidFileTypes[3] to be Gdiplus::ImageFormatGIF.\n");
272 ok(IsEqualGUID(aguidFileTypes
[4], Gdiplus::ImageFormatEMF
), "Expected aguidFileTypes[4] to be Gdiplus::ImageFormatEMF.\n");
273 ok(IsEqualGUID(aguidFileTypes
[5], Gdiplus::ImageFormatWMF
), "Expected aguidFileTypes[5] to be Gdiplus::ImageFormatWMF.\n");
274 ok(IsEqualGUID(aguidFileTypes
[6], Gdiplus::ImageFormatTIFF
), "Expected aguidFileTypes[6] to be Gdiplus::ImageFormatTIFF.\n");
275 ok(IsEqualGUID(aguidFileTypes
[7], Gdiplus::ImageFormatPNG
), "Expected aguidFileTypes[7] to be Gdiplus::ImageFormatPNG.\n");
276 ok(IsEqualGUID(aguidFileTypes
[8], Gdiplus::ImageFormatIcon
), "Expected aguidFileTypes[8] to be Gdiplus::ImageFormatIcon.\n");
278 psz
= strImporters
.GetString();
280 WideCharToMultiByte(CP_ACP
, 0, psz
, -1, szBuff
, 512, NULL
, NULL
);
281 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,
282 "The importer filter string is bad, was: %s\n", szBuff
);
284 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,
285 "The importer filter string is bad, was: %s\n", psz
);
288 CSimpleString
strExporters(mgr
);
289 aguidFileTypes
.RemoveAll();
290 hr
= CImage::GetExporterFilterString(strExporters
,
292 TEXT("All Image Files"), 0);
293 ok(hr
== S_OK
, "Expected hr to be S_OK, was: %ld\n", hr
);
294 ok(aguidFileTypes
.GetSize() == 9, "Expected aguidFileTypes.GetSize() to be 8, was %d.", aguidFileTypes
.GetSize());
295 ok(IsEqualGUID(aguidFileTypes
[0], GUID_NULL
), "Expected aguidFileTypes[0] to be GUID_NULL.\n");
296 ok(IsEqualGUID(aguidFileTypes
[1], Gdiplus::ImageFormatBMP
), "Expected aguidFileTypes[1] to be Gdiplus::ImageFormatBMP.\n");
297 ok(IsEqualGUID(aguidFileTypes
[2], Gdiplus::ImageFormatJPEG
), "Expected aguidFileTypes[2] to be Gdiplus::ImageFormatJPEG.\n");
298 ok(IsEqualGUID(aguidFileTypes
[3], Gdiplus::ImageFormatGIF
), "Expected aguidFileTypes[3] to be Gdiplus::ImageFormatGIF.\n");
299 ok(IsEqualGUID(aguidFileTypes
[4], Gdiplus::ImageFormatEMF
), "Expected aguidFileTypes[4] to be Gdiplus::ImageFormatEMF.\n");
300 ok(IsEqualGUID(aguidFileTypes
[5], Gdiplus::ImageFormatWMF
), "Expected aguidFileTypes[5] to be Gdiplus::ImageFormatWMF.\n");
301 ok(IsEqualGUID(aguidFileTypes
[6], Gdiplus::ImageFormatTIFF
), "Expected aguidFileTypes[6] to be Gdiplus::ImageFormatTIFF.\n");
302 ok(IsEqualGUID(aguidFileTypes
[7], Gdiplus::ImageFormatPNG
), "Expected aguidFileTypes[7] to be Gdiplus::ImageFormatPNG.\n");
303 ok(IsEqualGUID(aguidFileTypes
[8], Gdiplus::ImageFormatIcon
), "Expected aguidFileTypes[8] to be Gdiplus::ImageFormatIcon.\n");
305 psz
= strExporters
.GetString();
307 WideCharToMultiByte(CP_ACP
, 0, psz
, -1, szBuff
, 512, NULL
, NULL
);
308 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,
309 "The exporter filter string is bad, was: %s\n", szBuff
);
311 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,
312 "The exporter filter string is bad, was: %s\n", psz
);