mscms/tests: Avoid accessing uninitialized memory.
[wine/multimedia.git] / dlls / mscms / tests / profile.c
blob91ae97a0912160dc3289b36dc9d5f1ebbdb6eaf0
1 /*
2 * Tests for color profile functions
4 * Copyright 2004, 2005, 2006 Hans Leidekker
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include <stdarg.h>
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winreg.h"
26 #include "winnls.h"
27 #include "wingdi.h"
28 #include "winuser.h"
29 #include "icm.h"
31 #include "wine/test.h"
33 HMODULE hmscms;
34 HMODULE huser32;
36 static BOOL (WINAPI *pAssociateColorProfileWithDeviceA)(PCSTR,PCSTR,PCSTR);
37 static BOOL (WINAPI *pCloseColorProfile)(HPROFILE);
38 static BOOL (WINAPI *pDisassociateColorProfileFromDeviceA)(PCSTR,PCSTR,PCSTR);
39 static BOOL (WINAPI *pGetColorDirectoryA)(PCHAR,PCHAR,PDWORD);
40 static BOOL (WINAPI *pGetColorDirectoryW)(PWCHAR,PWCHAR,PDWORD);
41 static BOOL (WINAPI *pGetColorProfileElement)(HPROFILE,TAGTYPE,DWORD,PDWORD,PVOID,PBOOL);
42 static BOOL (WINAPI *pGetColorProfileElementTag)(HPROFILE,DWORD,PTAGTYPE);
43 static BOOL (WINAPI *pGetColorProfileFromHandle)(HPROFILE,PBYTE,PDWORD);
44 static BOOL (WINAPI *pGetColorProfileHeader)(HPROFILE,PPROFILEHEADER);
45 static BOOL (WINAPI *pGetCountColorProfileElements)(HPROFILE,PDWORD);
46 static BOOL (WINAPI *pGetStandardColorSpaceProfileA)(PCSTR,DWORD,PSTR,PDWORD);
47 static BOOL (WINAPI *pGetStandardColorSpaceProfileW)(PCWSTR,DWORD,PWSTR,PDWORD);
48 static BOOL (WINAPI *pEnumColorProfilesA)(PCSTR,PENUMTYPEA,PBYTE,PDWORD,PDWORD);
49 static BOOL (WINAPI *pEnumColorProfilesW)(PCWSTR,PENUMTYPEW,PBYTE,PDWORD,PDWORD);
50 static BOOL (WINAPI *pInstallColorProfileA)(PCSTR,PCSTR);
51 static BOOL (WINAPI *pInstallColorProfileW)(PCWSTR,PCWSTR);
52 static BOOL (WINAPI *pIsColorProfileTagPresent)(HPROFILE,TAGTYPE,PBOOL);
53 static HPROFILE (WINAPI *pOpenColorProfileA)(PPROFILE,DWORD,DWORD,DWORD);
54 static HPROFILE (WINAPI *pOpenColorProfileW)(PPROFILE,DWORD,DWORD,DWORD);
55 static BOOL (WINAPI *pSetColorProfileElement)(HPROFILE,TAGTYPE,DWORD,PDWORD,PVOID);
56 static BOOL (WINAPI *pSetColorProfileHeader)(HPROFILE,PPROFILEHEADER);
57 static BOOL (WINAPI *pSetStandardColorSpaceProfileA)(PCSTR,DWORD,PSTR);
58 static BOOL (WINAPI *pSetStandardColorSpaceProfileW)(PCWSTR,DWORD,PWSTR);
59 static BOOL (WINAPI *pUninstallColorProfileA)(PCSTR,PCSTR,BOOL);
60 static BOOL (WINAPI *pUninstallColorProfileW)(PCWSTR,PCWSTR,BOOL);
62 static BOOL (WINAPI *pEnumDisplayDevicesA)(LPCSTR,DWORD,PDISPLAY_DEVICE,DWORD);
64 #define GETFUNCPTR(func) p##func = (void *)GetProcAddress( hmscms, #func ); \
65 if (!p##func) return FALSE;
67 static BOOL init_function_ptrs( void )
69 GETFUNCPTR( AssociateColorProfileWithDeviceA )
70 GETFUNCPTR( CloseColorProfile )
71 GETFUNCPTR( DisassociateColorProfileFromDeviceA )
72 GETFUNCPTR( GetColorDirectoryA )
73 GETFUNCPTR( GetColorDirectoryW )
74 GETFUNCPTR( GetColorProfileElement )
75 GETFUNCPTR( GetColorProfileElementTag )
76 GETFUNCPTR( GetColorProfileFromHandle )
77 GETFUNCPTR( GetColorProfileHeader )
78 GETFUNCPTR( GetCountColorProfileElements )
79 GETFUNCPTR( GetStandardColorSpaceProfileA )
80 GETFUNCPTR( GetStandardColorSpaceProfileW )
81 GETFUNCPTR( EnumColorProfilesA )
82 GETFUNCPTR( EnumColorProfilesW )
83 GETFUNCPTR( InstallColorProfileA )
84 GETFUNCPTR( InstallColorProfileW )
85 GETFUNCPTR( IsColorProfileTagPresent )
86 GETFUNCPTR( OpenColorProfileA )
87 GETFUNCPTR( OpenColorProfileW )
88 GETFUNCPTR( SetColorProfileElement )
89 GETFUNCPTR( SetColorProfileHeader )
90 GETFUNCPTR( SetStandardColorSpaceProfileA )
91 GETFUNCPTR( SetStandardColorSpaceProfileW )
92 GETFUNCPTR( UninstallColorProfileA )
93 GETFUNCPTR( UninstallColorProfileW )
95 pEnumDisplayDevicesA = (void *)GetProcAddress( huser32, "EnumDisplayDevicesA" );
97 return TRUE;
100 static const char machine[] = "dummy";
101 static const WCHAR machineW[] = { 'd','u','m','m','y',0 };
103 /* To do any real functionality testing with this suite you need a copy of
104 * the freely distributable standard RGB color space profile. It comes
105 * standard with Windows, but on Wine you probably need to install it yourself
106 * in one of the locations mentioned below.
109 /* Two common places to find the standard color space profile, relative
110 * to the system directory.
112 static const char profile1[] =
113 "\\color\\srgb color space profile.icm";
114 static const char profile2[] =
115 "\\spool\\drivers\\color\\srgb color space profile.icm";
117 static const WCHAR profile1W[] =
118 { '\\','c','o','l','o','r','\\','s','r','g','b',' ','c','o','l','o','r',' ',
119 's','p','a','c','e',' ','p','r','o','f','i','l','e','.','i','c','m',0 };
120 static const WCHAR profile2W[] =
121 { '\\','s','p','o','o','l','\\','d','r','i','v','e','r','s','\\',
122 'c','o','l','o','r','\\','s','r','g','b',' ','c','o','l','o','r',' ',
123 's','p','a','c','e',' ','p','r','o','f','i','l','e','.','i','c','m',0 };
125 static const unsigned char rgbheader[] =
126 { 0x48, 0x0c, 0x00, 0x00, 0x6f, 0x6e, 0x69, 0x4c, 0x00, 0x00, 0x10, 0x02,
127 0x72, 0x74, 0x6e, 0x6d, 0x20, 0x42, 0x47, 0x52, 0x20, 0x5a, 0x59, 0x58,
128 0x02, 0x00, 0xce, 0x07, 0x06, 0x00, 0x09, 0x00, 0x00, 0x00, 0x31, 0x00,
129 0x70, 0x73, 0x63, 0x61, 0x54, 0x46, 0x53, 0x4d, 0x00, 0x00, 0x00, 0x00,
130 0x20, 0x43, 0x45, 0x49, 0x42, 0x47, 0x52, 0x73, 0x00, 0x00, 0x00, 0x00,
131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf6, 0x00, 0x00,
132 0x00, 0x00, 0x01, 0x00, 0x2d, 0xd3, 0x00, 0x00, 0x20, 0x20, 0x50, 0x48 };
134 static LPSTR standardprofile;
135 static LPWSTR standardprofileW;
137 static LPSTR testprofile;
138 static LPWSTR testprofileW;
140 #define IS_SEPARATOR(ch) ((ch) == '\\' || (ch) == '/')
142 static void MSCMS_basenameA( LPCSTR path, LPSTR name )
144 INT i = strlen( path );
146 while (i > 0 && !IS_SEPARATOR(path[i - 1])) i--;
147 strcpy( name, &path[i] );
150 static void MSCMS_basenameW( LPCWSTR path, LPWSTR name )
152 INT i = lstrlenW( path );
154 while (i > 0 && !IS_SEPARATOR(path[i - 1])) i--;
155 lstrcpyW( name, &path[i] );
158 static void test_GetColorDirectoryA(void)
160 BOOL ret;
161 DWORD size;
162 char buffer[MAX_PATH];
164 /* Parameter checks */
166 ret = pGetColorDirectoryA( NULL, NULL, NULL );
167 ok( !ret, "GetColorDirectoryA() succeeded (%d)\n", GetLastError() );
169 size = 0;
171 ret = pGetColorDirectoryA( NULL, NULL, &size );
172 ok( !ret && size > 0, "GetColorDirectoryA() succeeded (%d)\n", GetLastError() );
174 size = 0;
176 ret = pGetColorDirectoryA( NULL, buffer, &size );
177 ok( !ret && size > 0, "GetColorDirectoryA() succeeded (%d)\n", GetLastError() );
179 size = 1;
181 ret = pGetColorDirectoryA( NULL, buffer, &size );
182 ok( !ret && size > 0, "GetColorDirectoryA() succeeded (%d)\n", GetLastError() );
184 /* Functional checks */
186 size = sizeof(buffer);
188 ret = pGetColorDirectoryA( NULL, buffer, &size );
189 ok( ret && size > 0, "GetColorDirectoryA() failed (%d)\n", GetLastError() );
192 static void test_GetColorDirectoryW(void)
194 BOOL ret;
195 DWORD size;
196 WCHAR buffer[MAX_PATH];
198 /* Parameter checks */
200 /* This one crashes win2k
202 ret = pGetColorDirectoryW( NULL, NULL, NULL );
203 ok( !ret, "GetColorDirectoryW() succeeded (%d)\n", GetLastError() );
207 size = 0;
209 ret = pGetColorDirectoryW( NULL, NULL, &size );
210 ok( !ret && size > 0, "GetColorDirectoryW() succeeded (%d)\n", GetLastError() );
212 size = 0;
214 ret = pGetColorDirectoryW( NULL, buffer, &size );
215 ok( !ret && size > 0, "GetColorDirectoryW() succeeded (%d)\n", GetLastError() );
217 size = 1;
219 ret = pGetColorDirectoryW( NULL, buffer, &size );
220 ok( !ret && size > 0, "GetColorDirectoryW() succeeded (%d)\n", GetLastError() );
222 /* Functional checks */
224 size = sizeof(buffer);
226 ret = pGetColorDirectoryW( NULL, buffer, &size );
227 ok( ret && size > 0, "GetColorDirectoryW() failed (%d)\n", GetLastError() );
230 static void test_GetColorProfileElement(void)
232 if (standardprofile)
234 PROFILE profile;
235 HPROFILE handle;
236 BOOL ret, ref;
237 DWORD size;
238 TAGTYPE tag = 0x63707274; /* 'cprt' */
239 static char buffer[51];
240 static const char expect[] =
241 { 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x70,
242 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20,
243 0x31, 0x39, 0x39, 0x38, 0x20, 0x48, 0x65, 0x77, 0x6c, 0x65, 0x74,
244 0x74, 0x2d, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x72, 0x64, 0x20, 0x43,
245 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x00 };
247 profile.dwType = PROFILE_FILENAME;
248 profile.pProfileData = standardprofile;
249 profile.cbDataSize = strlen(standardprofile);
251 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
252 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
254 /* Parameter checks */
256 ret = pGetColorProfileElement( handle, tag, 0, NULL, NULL, &ref );
257 ok( !ret, "GetColorProfileElement() succeeded (%d)\n", GetLastError() );
259 ret = pGetColorProfileElement( handle, tag, 0, &size, NULL, NULL );
260 ok( !ret, "GetColorProfileElement() succeeded (%d)\n", GetLastError() );
262 size = 0;
264 ret = pGetColorProfileElement( handle, tag, 0, &size, NULL, &ref );
265 ok( !ret && size > 0, "GetColorProfileElement() succeeded (%d)\n", GetLastError() );
267 size = sizeof(buffer);
269 /* Functional checks */
271 ret = pGetColorProfileElement( handle, tag, 0, &size, buffer, &ref );
272 ok( ret && size > 0, "GetColorProfileElement() failed (%d)\n", GetLastError() );
274 ok( !memcmp( buffer, expect, sizeof(expect) ), "Unexpected tag data\n" );
276 pCloseColorProfile( handle );
280 static void test_GetColorProfileElementTag(void)
282 if (standardprofile)
284 PROFILE profile;
285 HPROFILE handle;
286 BOOL ret;
287 DWORD index = 1;
288 TAGTYPE tag, expect = 0x63707274; /* 'cprt' */
290 profile.dwType = PROFILE_FILENAME;
291 profile.pProfileData = standardprofile;
292 profile.cbDataSize = strlen(standardprofile);
294 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
295 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
297 /* Parameter checks */
299 ret = pGetColorProfileElementTag( NULL, index, &tag );
300 ok( !ret, "GetColorProfileElementTag() succeeded (%d)\n", GetLastError() );
302 ret = pGetColorProfileElementTag( handle, 0, &tag );
303 ok( !ret, "GetColorProfileElementTag() succeeded (%d)\n", GetLastError() );
305 ret = pGetColorProfileElementTag( handle, index, NULL );
306 ok( !ret, "GetColorProfileElementTag() succeeded (%d)\n", GetLastError() );
308 ret = pGetColorProfileElementTag( handle, 18, NULL );
309 ok( !ret, "GetColorProfileElementTag() succeeded (%d)\n", GetLastError() );
311 /* Functional checks */
313 ret = pGetColorProfileElementTag( handle, index, &tag );
314 ok( ret && tag == expect, "GetColorProfileElementTag() failed (%d)\n",
315 GetLastError() );
317 pCloseColorProfile( handle );
321 static void test_GetColorProfileFromHandle(void)
323 if (testprofile)
325 PROFILE profile;
326 HPROFILE handle;
327 DWORD size;
328 BOOL ret;
329 static const unsigned char expect[] =
330 { 0x00, 0x00, 0x0c, 0x48, 0x4c, 0x69, 0x6e, 0x6f, 0x02, 0x10, 0x00,
331 0x00, 0x6d, 0x6e, 0x74, 0x72, 0x52, 0x47, 0x42, 0x20, 0x58, 0x59,
332 0x5a, 0x20, 0x07, 0xce, 0x00, 0x02, 0x00, 0x09, 0x00, 0x06, 0x00,
333 0x31, 0x00, 0x00, 0x61, 0x63, 0x73, 0x70, 0x4d, 0x53, 0x46, 0x54,
334 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x43, 0x20, 0x73, 0x52, 0x47,
335 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00, 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00,
337 0x00, 0xd3, 0x2d, 0x48, 0x50, 0x20, 0x20 };
339 unsigned char *buffer;
341 profile.dwType = PROFILE_FILENAME;
342 profile.pProfileData = testprofile;
343 profile.cbDataSize = strlen(testprofile);
345 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
346 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
348 /* Parameter checks */
350 size = 0;
352 ret = pGetColorProfileFromHandle( handle, NULL, &size );
353 ok( !ret && size > 0, "GetColorProfileFromHandle() failed (%d)\n", GetLastError() );
355 buffer = HeapAlloc( GetProcessHeap(), 0, size );
357 if (buffer)
359 ret = pGetColorProfileFromHandle( NULL, buffer, &size );
360 ok( !ret, "GetColorProfileFromHandle() succeeded (%d)\n", GetLastError() );
362 ret = pGetColorProfileFromHandle( handle, buffer, NULL );
363 ok( !ret, "GetColorProfileFromHandle() succeeded (%d)\n", GetLastError() );
365 /* Functional checks */
367 ret = pGetColorProfileFromHandle( handle, buffer, &size );
368 ok( ret && size > 0, "GetColorProfileFromHandle() failed (%d)\n", GetLastError() );
370 ok( !memcmp( buffer, expect, sizeof(expect) ), "Unexpected header data\n" );
372 HeapFree( GetProcessHeap(), 0, buffer );
375 pCloseColorProfile( handle );
379 static void test_GetColorProfileHeader(void)
381 if (testprofile)
383 PROFILE profile;
384 HPROFILE handle;
385 BOOL ret;
386 PROFILEHEADER header;
388 profile.dwType = PROFILE_FILENAME;
389 profile.pProfileData = testprofile;
390 profile.cbDataSize = strlen(testprofile);
392 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
393 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
395 /* Parameter checks */
397 ret = pGetColorProfileHeader( NULL, NULL );
398 ok( !ret, "GetColorProfileHeader() succeeded (%d)\n", GetLastError() );
400 ret = pGetColorProfileHeader( NULL, &header );
401 ok( !ret, "GetColorProfileHeader() succeeded (%d)\n", GetLastError() );
403 if (0) /* Crashes on Vista */
405 ret = pGetColorProfileHeader( handle, NULL );
406 ok( !ret, "GetColorProfileHeader() succeeded (%d)\n", GetLastError() );
409 /* Functional checks */
411 ret = pGetColorProfileHeader( handle, &header );
412 ok( ret, "GetColorProfileHeader() failed (%d)\n", GetLastError() );
414 ok( !memcmp( &header, rgbheader, sizeof(rgbheader) ), "Unexpected header data\n" );
416 pCloseColorProfile( handle );
420 static void test_GetCountColorProfileElements(void)
422 if (standardprofile)
424 PROFILE profile;
425 HPROFILE handle;
426 BOOL ret;
427 DWORD count, expect = 17;
429 profile.dwType = PROFILE_FILENAME;
430 profile.pProfileData = standardprofile;
431 profile.cbDataSize = strlen(standardprofile);
433 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
434 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
436 /* Parameter checks */
438 ret = pGetCountColorProfileElements( NULL, &count );
439 ok( !ret, "GetCountColorProfileElements() succeeded (%d)\n",
440 GetLastError() );
442 ret = pGetCountColorProfileElements( handle, NULL );
443 ok( !ret, "GetCountColorProfileElements() succeeded (%d)\n",
444 GetLastError() );
446 /* Functional checks */
448 ret = pGetCountColorProfileElements( handle, &count );
449 ok( ret && count == expect,
450 "GetCountColorProfileElements() failed (%d)\n", GetLastError() );
452 pCloseColorProfile( handle );
456 static void test_GetStandardColorSpaceProfileA(void)
458 BOOL ret;
459 DWORD size;
460 CHAR oldprofile[MAX_PATH];
461 CHAR newprofile[MAX_PATH];
462 const CHAR emptyA[] = "";
463 DWORD zero = 0;
464 DWORD sizeP = sizeof(newprofile);
466 /* Parameter checks */
468 /* Single invalid parameter checks: */
470 SetLastError(0xfaceabee); /* 1st param, */
471 ret = pGetStandardColorSpaceProfileA(machine, LCS_sRGB, newprofile, &sizeP);
472 ok( !ret && GetLastError() == ERROR_NOT_SUPPORTED, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() );
474 SetLastError(0xfaceabee); /* 2nd param, */
475 ret = pGetStandardColorSpaceProfileA(NULL, (DWORD)-1, newprofile, &sizeP);
476 ok( !ret && GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() );
478 SetLastError(0xfaceabee); /* 4th param, */
479 ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, NULL);
480 ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() );
482 SetLastError(0xfaceabee); /* 3rd param, */
483 ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, NULL, &sizeP);
484 ok( !ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() );
486 SetLastError(0xfaceabee); /* dereferenced 4th param, */
487 ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, &zero);
488 ok( !ret && (GetLastError() == ERROR_MORE_DATA || GetLastError() == ERROR_INSUFFICIENT_BUFFER),
489 "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() );
491 /* Several invalid parameter checks: */
493 SetLastError(0xfaceabee); /* 1st, maybe 2nd and then dereferenced 4th param, */
494 ret = pGetStandardColorSpaceProfileA(machine, 0, newprofile, &zero);
495 ok( !ret && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_NOT_SUPPORTED),
496 "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() );
498 SetLastError(0xfaceabee); /* maybe 2nd and then 4th param, */
499 ret = pGetStandardColorSpaceProfileA(NULL, 0, newprofile, NULL);
500 ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() );
502 SetLastError(0xfaceabee); /* maybe 2nd, then 3rd and dereferenced 4th param, */
503 ret = pGetStandardColorSpaceProfileA(NULL, 0, NULL, &zero);
504 ok( !ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || GetLastError() == ERROR_FILE_NOT_FOUND),
505 "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() );
507 SetLastError(0xfaceabee); /* maybe 2nd param. */
508 ret = pGetStandardColorSpaceProfileA(NULL, 0, newprofile, &sizeP);
509 if (!ret) ok( GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() );
510 else ok( !lstrcmpiA( newprofile, emptyA ) && GetLastError() == 0xfaceabee,
511 "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() );
513 /* Functional checks */
515 size = sizeof(oldprofile);
516 ret = pGetStandardColorSpaceProfileA( NULL, LCS_sRGB, oldprofile, &size );
517 ok( ret, "GetStandardColorSpaceProfileA() failed (%d)\n", GetLastError() );
519 SetLastError(0xdeadbeef);
520 ret = pSetStandardColorSpaceProfileA( NULL, LCS_sRGB, standardprofile );
521 if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
523 skip("Not enough rights for SetStandardColorSpaceProfileA\n");
524 return;
526 ok( ret, "SetStandardColorSpaceProfileA() failed (%d)\n", GetLastError() );
528 size = sizeof(newprofile);
529 ret = pGetStandardColorSpaceProfileA( NULL, LCS_sRGB, newprofile, &size );
530 ok( ret, "GetStandardColorSpaceProfileA() failed (%d)\n", GetLastError() );
532 ret = pSetStandardColorSpaceProfileA( NULL, LCS_sRGB, oldprofile );
533 ok( ret, "SetStandardColorSpaceProfileA() failed (%d)\n", GetLastError() );
536 static void test_GetStandardColorSpaceProfileW(void)
538 BOOL ret;
539 DWORD size;
540 WCHAR oldprofile[MAX_PATH];
541 WCHAR newprofile[MAX_PATH];
542 CHAR newprofileA[MAX_PATH];
543 const CHAR empty[] = "";
544 DWORD zero = 0;
545 DWORD sizeP = sizeof(newprofile);
547 /* Parameter checks */
549 /* Single invalid parameter checks: */
551 SetLastError(0xfaceabee); /* 1st param, */
552 ret = pGetStandardColorSpaceProfileW(machineW, LCS_sRGB, newprofile, &sizeP);
553 ok( !ret && GetLastError() == ERROR_NOT_SUPPORTED, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
555 SetLastError(0xfaceabee); /* 2nd param, */
556 ret = pGetStandardColorSpaceProfileW(NULL, (DWORD)-1, newprofile, &sizeP);
557 ok( !ret && GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
559 SetLastError(0xfaceabee); /* 2nd param, */
560 ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &sizeP);
561 ok( (!ret && GetLastError() == ERROR_FILE_NOT_FOUND) ||
562 broken(ret), /* Win98 and WinME */
563 "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
565 SetLastError(0xfaceabee); /* 3rd param, */
566 ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, NULL, &sizeP);
567 ok( !ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
569 SetLastError(0xfaceabee); /* 4th param, */
570 ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, NULL);
571 ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
573 SetLastError(0xfaceabee); /* dereferenced 4th param. */
574 ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, &zero);
575 ok( !ret && (GetLastError() == ERROR_MORE_DATA || GetLastError() == ERROR_INSUFFICIENT_BUFFER),
576 "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
578 /* Several invalid parameter checks: */
580 SetLastError(0xfaceabee); /* 1st, maybe 2nd and then dereferenced 4th param, */
581 ret = pGetStandardColorSpaceProfileW(machineW, 0, newprofile, &zero);
582 ok( !ret && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_NOT_SUPPORTED),
583 "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
585 SetLastError(0xfaceabee); /* maybe 2nd and then 4th param, */
586 ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, NULL);
587 ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
589 SetLastError(0xfaceabee); /* maybe 2nd, then 3rd and dereferenced 4th param, */
590 ret = pGetStandardColorSpaceProfileW(NULL, 0, NULL, &zero);
591 ok( !ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || GetLastError() == ERROR_FILE_NOT_FOUND),
592 "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
594 SetLastError(0xfaceabee); /* maybe 2nd param. */
595 ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &sizeP);
596 if (!ret) ok( GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
597 else
599 WideCharToMultiByte(CP_ACP, 0, newprofile, -1, newprofileA, sizeof(newprofileA), NULL, NULL);
600 ok( !lstrcmpiA( newprofileA, empty ) && GetLastError() == 0xfaceabee,
601 "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() );
604 /* Functional checks */
606 size = sizeof(oldprofile);
607 ret = pGetStandardColorSpaceProfileW( NULL, LCS_sRGB, oldprofile, &size );
608 ok( ret, "GetStandardColorSpaceProfileW() failed (%d)\n", GetLastError() );
610 SetLastError(0xdeadbeef);
611 ret = pSetStandardColorSpaceProfileW( NULL, LCS_sRGB, standardprofileW );
612 if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
614 skip("Not enough rights for SetStandardColorSpaceProfileW\n");
615 return;
617 ok( ret, "SetStandardColorSpaceProfileW() failed (%d)\n", GetLastError() );
619 size = sizeof(newprofile);
620 ret = pGetStandardColorSpaceProfileW( NULL, LCS_sRGB, newprofile, &size );
621 ok( ret, "GetStandardColorSpaceProfileW() failed (%d)\n", GetLastError() );
623 ret = pSetStandardColorSpaceProfileW( NULL, LCS_sRGB, oldprofile );
624 ok( ret, "SetStandardColorSpaceProfileW() failed (%d)\n", GetLastError() );
627 static void test_EnumColorProfilesA(void)
629 BOOL ret;
630 DWORD total, size, number;
631 ENUMTYPEA record;
632 BYTE *buffer;
634 /* Parameter checks */
636 memset( &record, 0, sizeof(ENUMTYPEA) );
638 record.dwSize = sizeof(ENUMTYPEA);
639 record.dwVersion = ENUM_TYPE_VERSION;
640 record.dwFields |= ET_DATACOLORSPACE;
641 record.dwDataColorSpace = SPACE_RGB;
643 total = 0;
644 ret = pEnumColorProfilesA( NULL, &record, NULL, &total, &number );
645 ok( !ret, "EnumColorProfilesA() failed (%d)\n", GetLastError() );
646 buffer = HeapAlloc( GetProcessHeap(), 0, total );
648 size = total;
649 ret = pEnumColorProfilesA( machine, &record, buffer, &size, &number );
650 ok( !ret, "EnumColorProfilesA() succeeded (%d)\n", GetLastError() );
652 ret = pEnumColorProfilesA( NULL, NULL, buffer, &size, &number );
653 ok( !ret, "EnumColorProfilesA() succeeded (%d)\n", GetLastError() );
655 ret = pEnumColorProfilesA( NULL, &record, buffer, NULL, &number );
656 ok( !ret, "EnumColorProfilesA() succeeded (%d)\n", GetLastError() );
658 ret = pEnumColorProfilesA( NULL, &record, buffer, &size, &number );
659 if (standardprofile)
660 ok( ret, "EnumColorProfilesA() failed (%d)\n", GetLastError() );
661 else
662 todo_wine ok( ret, "EnumColorProfilesA() failed (%d)\n", GetLastError() );
664 size = 0;
666 ret = pEnumColorProfilesA( NULL, &record, buffer, &size, &number );
667 ok( !ret, "EnumColorProfilesA() succeeded (%d)\n", GetLastError() );
669 /* Functional checks */
671 size = total;
672 ret = pEnumColorProfilesA( NULL, &record, buffer, &size, &number );
673 if (standardprofile)
674 ok( ret, "EnumColorProfilesA() failed (%d)\n", GetLastError() );
675 else
676 todo_wine ok( ret, "EnumColorProfilesA() failed (%d)\n", GetLastError() );
678 HeapFree( GetProcessHeap(), 0, buffer );
681 static void test_EnumColorProfilesW(void)
683 BOOL ret;
684 DWORD total, size, number;
685 ENUMTYPEW record;
686 BYTE *buffer;
688 /* Parameter checks */
690 memset( &record, 0, sizeof(ENUMTYPEW) );
692 record.dwSize = sizeof(ENUMTYPEW);
693 record.dwVersion = ENUM_TYPE_VERSION;
694 record.dwFields |= ET_DATACOLORSPACE;
695 record.dwDataColorSpace = SPACE_RGB;
697 total = 0;
698 ret = pEnumColorProfilesW( NULL, &record, NULL, &total, &number );
699 ok( !ret, "EnumColorProfilesW() failed (%d)\n", GetLastError() );
700 buffer = HeapAlloc( GetProcessHeap(), 0, total * sizeof(WCHAR) );
702 size = total;
703 ret = pEnumColorProfilesW( machineW, &record, buffer, &size, &number );
704 ok( !ret, "EnumColorProfilesW() succeeded (%d)\n", GetLastError() );
706 ret = pEnumColorProfilesW( NULL, NULL, buffer, &size, &number );
707 ok( !ret, "EnumColorProfilesW() succeeded (%d)\n", GetLastError() );
709 ret = pEnumColorProfilesW( NULL, &record, buffer, NULL, &number );
710 ok( !ret, "EnumColorProfilesW() succeeded (%d)\n", GetLastError() );
712 ret = pEnumColorProfilesW( NULL, &record, buffer, &size, &number );
713 if (standardprofileW)
714 ok( ret, "EnumColorProfilesW() failed (%d)\n", GetLastError() );
715 else
716 todo_wine ok( ret, "EnumColorProfilesW() failed (%d)\n", GetLastError() );
718 size = 0;
719 ret = pEnumColorProfilesW( NULL, &record, buffer, &size, &number );
720 ok( !ret, "EnumColorProfilesW() succeeded (%d)\n", GetLastError() );
722 /* Functional checks */
724 size = total;
725 ret = pEnumColorProfilesW( NULL, &record, buffer, &size, &number );
726 if (standardprofileW)
727 ok( ret, "EnumColorProfilesW() failed (%d)\n", GetLastError() );
728 else
729 todo_wine ok( ret, "EnumColorProfilesW() failed (%d)\n", GetLastError() );
731 HeapFree( GetProcessHeap(), 0, buffer );
734 static void test_InstallColorProfileA(void)
736 BOOL ret;
738 /* Parameter checks */
740 ret = pInstallColorProfileA( NULL, NULL );
741 ok( !ret, "InstallColorProfileA() succeeded (%d)\n", GetLastError() );
743 ret = pInstallColorProfileA( machine, NULL );
744 ok( !ret, "InstallColorProfileA() succeeded (%d)\n", GetLastError() );
746 ret = pInstallColorProfileA( NULL, machine );
747 ok( !ret, "InstallColorProfileA() succeeded (%d)\n", GetLastError() );
749 if (standardprofile)
751 ret = pInstallColorProfileA( NULL, standardprofile );
752 ok( ret, "InstallColorProfileA() failed (%d)\n", GetLastError() );
755 /* Functional checks */
757 if (testprofile)
759 CHAR dest[MAX_PATH], base[MAX_PATH];
760 DWORD size = sizeof(dest);
761 CHAR slash[] = "\\";
762 HANDLE handle;
764 SetLastError(0xdeadbeef);
765 ret = pInstallColorProfileA( NULL, testprofile );
766 if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
768 skip("Not enough rights for InstallColorProfileA\n");
769 return;
771 ok( ret, "InstallColorProfileA() failed (%d)\n", GetLastError() );
773 ret = pGetColorDirectoryA( NULL, dest, &size );
774 ok( ret, "GetColorDirectoryA() failed (%d)\n", GetLastError() );
776 MSCMS_basenameA( testprofile, base );
778 lstrcatA( dest, slash );
779 lstrcatA( dest, base );
781 /* Check if the profile is really there */
782 handle = CreateFileA( dest, 0 , 0, NULL, OPEN_EXISTING, 0, NULL );
783 ok( handle != INVALID_HANDLE_VALUE, "Couldn't find the profile (%d)\n", GetLastError() );
784 CloseHandle( handle );
786 ret = pUninstallColorProfileA( NULL, dest, TRUE );
787 ok( ret, "UninstallColorProfileA() failed (%d)\n", GetLastError() );
791 static void test_InstallColorProfileW(void)
793 BOOL ret;
795 /* Parameter checks */
797 ret = pInstallColorProfileW( NULL, NULL );
798 ok( !ret, "InstallColorProfileW() succeeded (%d)\n", GetLastError() );
800 ret = pInstallColorProfileW( machineW, NULL );
801 ok( !ret, "InstallColorProfileW() succeeded (%d)\n", GetLastError() );
803 ret = pInstallColorProfileW( NULL, machineW );
804 ok( !ret, "InstallColorProfileW() failed (%d)\n", GetLastError() );
806 if (standardprofileW)
808 ret = pInstallColorProfileW( NULL, standardprofileW );
809 ok( ret, "InstallColorProfileW() failed (%d)\n", GetLastError() );
812 /* Functional checks */
814 if (testprofileW)
816 WCHAR dest[MAX_PATH], base[MAX_PATH];
817 DWORD size = sizeof(dest);
818 WCHAR slash[] = { '\\', 0 };
819 HANDLE handle;
821 SetLastError(0xdeadbeef);
822 ret = pInstallColorProfileW( NULL, testprofileW );
823 if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
825 skip("Not enough rights for InstallColorProfileW\n");
826 return;
828 ok( ret, "InstallColorProfileW() failed (%d)\n", GetLastError() );
830 ret = pGetColorDirectoryW( NULL, dest, &size );
831 ok( ret, "GetColorDirectoryW() failed (%d)\n", GetLastError() );
833 MSCMS_basenameW( testprofileW, base );
835 lstrcatW( dest, slash );
836 lstrcatW( dest, base );
838 /* Check if the profile is really there */
839 handle = CreateFileW( dest, 0 , 0, NULL, OPEN_EXISTING, 0, NULL );
840 ok( handle != INVALID_HANDLE_VALUE, "Couldn't find the profile (%d)\n", GetLastError() );
841 CloseHandle( handle );
843 ret = pUninstallColorProfileW( NULL, dest, TRUE );
844 ok( ret, "UninstallColorProfileW() failed (%d)\n", GetLastError() );
848 static void test_IsColorProfileTagPresent(void)
850 if (standardprofile)
852 PROFILE profile;
853 HPROFILE handle;
854 BOOL ret, present;
855 TAGTYPE tag;
857 profile.dwType = PROFILE_FILENAME;
858 profile.pProfileData = standardprofile;
859 profile.cbDataSize = strlen(standardprofile);
861 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
862 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
864 /* Parameter checks */
866 tag = 0;
868 ret = pIsColorProfileTagPresent( handle, tag, &present );
869 ok( !(ret && present), "IsColorProfileTagPresent() succeeded (%d)\n", GetLastError() );
871 tag = 0x63707274; /* 'cprt' */
873 ret = pIsColorProfileTagPresent( NULL, tag, &present );
874 ok( !ret, "IsColorProfileTagPresent() succeeded (%d)\n", GetLastError() );
876 ret = pIsColorProfileTagPresent( handle, tag, NULL );
877 ok( !ret, "IsColorProfileTagPresent() succeeded (%d)\n", GetLastError() );
879 /* Functional checks */
881 ret = pIsColorProfileTagPresent( handle, tag, &present );
882 ok( ret && present, "IsColorProfileTagPresent() failed (%d)\n", GetLastError() );
884 pCloseColorProfile( handle );
888 static void test_OpenColorProfileA(void)
890 PROFILE profile;
891 HPROFILE handle;
892 BOOL ret;
894 profile.dwType = PROFILE_FILENAME;
895 profile.pProfileData = NULL;
896 profile.cbDataSize = 0;
898 /* Parameter checks */
900 handle = pOpenColorProfileA( NULL, 0, 0, 0 );
901 ok( handle == NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
903 handle = pOpenColorProfileA( &profile, 0, 0, 0 );
904 ok( handle == NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
906 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, 0 );
907 ok( handle == NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
909 handle = pOpenColorProfileA( &profile, PROFILE_READWRITE, 0, 0 );
910 ok( handle == NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
912 ok ( !pCloseColorProfile( NULL ), "CloseColorProfile() succeeded\n" );
914 if (standardprofile)
916 profile.pProfileData = standardprofile;
917 profile.cbDataSize = strlen(standardprofile);
919 handle = pOpenColorProfileA( &profile, 0, 0, 0 );
920 ok( handle == NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
922 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, 0 );
923 ok( handle == NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
925 handle = pOpenColorProfileA( &profile, PROFILE_READ|PROFILE_READWRITE, 0, 0 );
926 ok( handle == NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
928 /* Functional checks */
930 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
931 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
933 ret = pCloseColorProfile( handle );
934 ok( ret, "CloseColorProfile() failed (%d)\n", GetLastError() );
938 static void test_OpenColorProfileW(void)
940 PROFILE profile;
941 HPROFILE handle;
942 BOOL ret;
944 profile.dwType = PROFILE_FILENAME;
945 profile.pProfileData = NULL;
946 profile.cbDataSize = 0;
948 /* Parameter checks */
950 handle = pOpenColorProfileW( NULL, 0, 0, 0 );
951 ok( handle == NULL, "OpenColorProfileW() failed (%d)\n", GetLastError() );
953 handle = pOpenColorProfileW( &profile, 0, 0, 0 );
954 ok( handle == NULL, "OpenColorProfileW() failed (%d)\n", GetLastError() );
956 handle = pOpenColorProfileW( &profile, PROFILE_READ, 0, 0 );
957 ok( handle == NULL, "OpenColorProfileW() failed (%d)\n", GetLastError() );
959 handle = pOpenColorProfileW( &profile, PROFILE_READWRITE, 0, 0 );
960 ok( handle == NULL, "OpenColorProfileW() failed (%d)\n", GetLastError() );
962 ok ( !pCloseColorProfile( NULL ), "CloseColorProfile() succeeded\n" );
964 if (standardprofileW)
966 profile.pProfileData = standardprofileW;
967 profile.cbDataSize = lstrlenW(standardprofileW) * sizeof(WCHAR);
969 handle = pOpenColorProfileW( &profile, 0, 0, 0 );
970 ok( handle == NULL, "OpenColorProfileW() failed (%d)\n", GetLastError() );
972 handle = pOpenColorProfileW( &profile, PROFILE_READ, 0, 0 );
973 ok( handle == NULL, "OpenColorProfileW() failed (%d)\n", GetLastError() );
975 handle = pOpenColorProfileW( &profile, PROFILE_READ|PROFILE_READWRITE, 0, 0 );
976 ok( handle == NULL, "OpenColorProfileW() failed (%d)\n", GetLastError() );
978 /* Functional checks */
980 handle = pOpenColorProfileW( &profile, PROFILE_READ, 0, OPEN_EXISTING );
981 ok( handle != NULL, "OpenColorProfileW() failed (%d)\n", GetLastError() );
983 ret = pCloseColorProfile( handle );
984 ok( ret, "CloseColorProfile() failed (%d)\n", GetLastError() );
988 static void test_SetColorProfileElement(void)
990 if (testprofile)
992 PROFILE profile;
993 HPROFILE handle;
994 DWORD size;
995 BOOL ret, ref;
997 TAGTYPE tag = 0x63707274; /* 'cprt' */
998 static char data[] = "(c) The Wine Project";
999 static char buffer[51];
1001 profile.dwType = PROFILE_FILENAME;
1002 profile.pProfileData = testprofile;
1003 profile.cbDataSize = strlen(testprofile);
1005 /* Parameter checks */
1007 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
1008 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
1010 ret = pSetColorProfileElement( handle, tag, 0, &size, data );
1011 ok( !ret, "SetColorProfileElement() succeeded (%d)\n", GetLastError() );
1013 pCloseColorProfile( handle );
1015 handle = pOpenColorProfileA( &profile, PROFILE_READWRITE, 0, OPEN_EXISTING );
1016 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
1018 ret = pSetColorProfileElement( NULL, 0, 0, NULL, NULL );
1019 ok( !ret, "SetColorProfileElement() succeeded (%d)\n", GetLastError() );
1021 ret = pSetColorProfileElement( handle, 0, 0, NULL, NULL );
1022 ok( !ret, "SetColorProfileElement() succeeded (%d)\n", GetLastError() );
1024 ret = pSetColorProfileElement( handle, tag, 0, NULL, NULL );
1025 ok( !ret, "SetColorProfileElement() succeeded (%d)\n", GetLastError() );
1027 ret = pSetColorProfileElement( handle, tag, 0, &size, NULL );
1028 ok( !ret, "SetColorProfileElement() succeeded (%d)\n", GetLastError() );
1030 /* Functional checks */
1032 size = sizeof(data);
1034 ret = pSetColorProfileElement( handle, tag, 0, &size, data );
1035 ok( ret, "SetColorProfileElement() failed (%d)\n", GetLastError() );
1037 size = sizeof(buffer);
1039 ret = pGetColorProfileElement( handle, tag, 0, &size, buffer, &ref );
1040 ok( ret && size > 0, "GetColorProfileElement() failed (%d)\n", GetLastError() );
1042 ok( !memcmp( data, buffer, sizeof(data) ),
1043 "Unexpected tag data, expected %s, got %s (%d)\n",
1044 data, buffer, GetLastError() );
1046 pCloseColorProfile( handle );
1050 static void test_SetColorProfileHeader(void)
1052 if (testprofile)
1054 PROFILE profile;
1055 HPROFILE handle;
1056 BOOL ret;
1057 PROFILEHEADER header;
1059 profile.dwType = PROFILE_FILENAME;
1060 profile.pProfileData = testprofile;
1061 profile.cbDataSize = strlen(testprofile);
1063 header.phSize = 0x00000c48;
1064 header.phCMMType = 0x4c696e6f;
1065 header.phVersion = 0x02100000;
1066 header.phClass = 0x6d6e7472;
1067 header.phDataColorSpace = 0x52474220;
1068 header.phConnectionSpace = 0x58595a20;
1069 header.phDateTime[0] = 0x07ce0002;
1070 header.phDateTime[1] = 0x00090006;
1071 header.phDateTime[2] = 0x00310000;
1072 header.phSignature = 0x61637370;
1073 header.phPlatform = 0x4d534654;
1074 header.phProfileFlags = 0x00000000;
1075 header.phManufacturer = 0x49454320;
1076 header.phModel = 0x73524742;
1077 header.phAttributes[0] = 0x00000000;
1078 header.phAttributes[1] = 0x00000000;
1079 header.phRenderingIntent = 0x00000000;
1080 header.phIlluminant.ciexyzX = 0x0000f6d6;
1081 header.phIlluminant.ciexyzY = 0x00010000;
1082 header.phIlluminant.ciexyzZ = 0x0000d32d;
1083 header.phCreator = 0x48502020;
1085 /* Parameter checks */
1087 handle = pOpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
1088 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
1090 ret = pSetColorProfileHeader( handle, &header );
1091 ok( !ret, "SetColorProfileHeader() succeeded (%d)\n", GetLastError() );
1093 pCloseColorProfile( handle );
1095 handle = pOpenColorProfileA( &profile, PROFILE_READWRITE, 0, OPEN_EXISTING );
1096 ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
1098 ret = pSetColorProfileHeader( NULL, NULL );
1099 ok( !ret, "SetColorProfileHeader() succeeded (%d)\n", GetLastError() );
1101 ret = pSetColorProfileHeader( handle, NULL );
1102 ok( !ret, "SetColorProfileHeader() succeeded (%d)\n", GetLastError() );
1104 ret = pSetColorProfileHeader( NULL, &header );
1105 ok( !ret, "SetColorProfileHeader() succeeded (%d)\n", GetLastError() );
1107 /* Functional checks */
1109 ret = pSetColorProfileHeader( handle, &header );
1110 ok( ret, "SetColorProfileHeader() failed (%d)\n", GetLastError() );
1112 ret = pGetColorProfileHeader( handle, &header );
1113 ok( ret, "GetColorProfileHeader() failed (%d)\n", GetLastError() );
1115 ok( !memcmp( &header, rgbheader, sizeof(rgbheader) ), "Unexpected header data\n" );
1117 pCloseColorProfile( handle );
1121 static void test_UninstallColorProfileA(void)
1123 BOOL ret;
1125 /* Parameter checks */
1127 ret = pUninstallColorProfileA( NULL, NULL, FALSE );
1128 ok( !ret, "UninstallColorProfileA() succeeded (%d)\n", GetLastError() );
1130 ret = pUninstallColorProfileA( machine, NULL, FALSE );
1131 ok( !ret, "UninstallColorProfileA() succeeded (%d)\n", GetLastError() );
1133 /* Functional checks */
1135 if (testprofile)
1137 CHAR dest[MAX_PATH], base[MAX_PATH];
1138 DWORD size = sizeof(dest);
1139 CHAR slash[] = "\\";
1140 HANDLE handle;
1142 SetLastError(0xdeadbeef);
1143 ret = pInstallColorProfileA( NULL, testprofile );
1144 if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
1146 skip("Not enough rights for InstallColorProfileA\n");
1147 return;
1149 ok( ret, "InstallColorProfileA() failed (%d)\n", GetLastError() );
1151 ret = pGetColorDirectoryA( NULL, dest, &size );
1152 ok( ret, "GetColorDirectoryA() failed (%d)\n", GetLastError() );
1154 MSCMS_basenameA( testprofile, base );
1156 lstrcatA( dest, slash );
1157 lstrcatA( dest, base );
1159 ret = pUninstallColorProfileA( NULL, dest, TRUE );
1160 ok( ret, "UninstallColorProfileA() failed (%d)\n", GetLastError() );
1162 /* Check if the profile is really gone */
1163 handle = CreateFileA( dest, 0 , 0, NULL, OPEN_EXISTING, 0, NULL );
1164 ok( handle == INVALID_HANDLE_VALUE, "Found the profile (%d)\n", GetLastError() );
1165 CloseHandle( handle );
1169 static void test_UninstallColorProfileW(void)
1171 BOOL ret;
1173 /* Parameter checks */
1175 ret = pUninstallColorProfileW( NULL, NULL, FALSE );
1176 ok( !ret, "UninstallColorProfileW() succeeded (%d)\n", GetLastError() );
1178 ret = pUninstallColorProfileW( machineW, NULL, FALSE );
1179 ok( !ret, "UninstallColorProfileW() succeeded (%d)\n", GetLastError() );
1181 /* Functional checks */
1183 if (testprofileW)
1185 WCHAR dest[MAX_PATH], base[MAX_PATH];
1186 char destA[MAX_PATH];
1187 DWORD size = sizeof(dest);
1188 WCHAR slash[] = { '\\', 0 };
1189 HANDLE handle;
1190 int bytes_copied;
1192 SetLastError(0xdeadbeef);
1193 ret = pInstallColorProfileW( NULL, testprofileW );
1194 if (!ret && (GetLastError() == ERROR_ACCESS_DENIED))
1196 skip("Not enough rights for InstallColorProfileW\n");
1197 return;
1199 ok( ret, "InstallColorProfileW() failed (%d)\n", GetLastError() );
1201 ret = pGetColorDirectoryW( NULL, dest, &size );
1202 ok( ret, "GetColorDirectoryW() failed (%d)\n", GetLastError() );
1204 MSCMS_basenameW( testprofileW, base );
1206 lstrcatW( dest, slash );
1207 lstrcatW( dest, base );
1209 ret = pUninstallColorProfileW( NULL, dest, TRUE );
1210 ok( ret, "UninstallColorProfileW() failed (%d)\n", GetLastError() );
1212 bytes_copied = WideCharToMultiByte(CP_ACP, 0, dest, -1, destA, MAX_PATH, NULL, NULL);
1213 ok( bytes_copied > 0 , "WideCharToMultiByte() returns %d\n", bytes_copied);
1214 /* Check if the profile is really gone */
1215 handle = CreateFileA( destA, 0 , 0, NULL, OPEN_EXISTING, 0, NULL );
1216 ok( handle == INVALID_HANDLE_VALUE, "Found the profile (%d)\n", GetLastError() );
1217 CloseHandle( handle );
1221 static void test_AssociateColorProfileWithDeviceA(void)
1223 BOOL ret;
1224 char profile[MAX_PATH], basename[MAX_PATH];
1225 DWORD error, size = sizeof(profile);
1226 DISPLAY_DEVICE display;
1227 BOOL res;
1228 DISPLAY_DEVICE monitor;
1230 if (testprofile && pEnumDisplayDevicesA)
1232 display.cb = sizeof( DISPLAY_DEVICE );
1233 res = pEnumDisplayDevicesA( NULL, 0, &display, 0 );
1234 ok( res, "Can't get display info\n" );
1236 monitor.cb = sizeof( DISPLAY_DEVICE );
1237 res = pEnumDisplayDevicesA( display.DeviceName, 0, &monitor, 0 );
1238 if (res)
1240 SetLastError(0xdeadbeef);
1241 ret = pAssociateColorProfileWithDeviceA( "machine", testprofile, NULL );
1242 error = GetLastError();
1243 ok( !ret, "AssociateColorProfileWithDevice() succeeded\n" );
1244 ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error );
1246 SetLastError(0xdeadbeef);
1247 ret = pAssociateColorProfileWithDeviceA( "machine", NULL, monitor.DeviceID );
1248 error = GetLastError();
1249 ok( !ret, "AssociateColorProfileWithDevice() succeeded\n" );
1250 ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error );
1252 SetLastError(0xdeadbeef);
1253 ret = pAssociateColorProfileWithDeviceA( "machine", testprofile, monitor.DeviceID );
1254 error = GetLastError();
1255 ok( !ret, "AssociateColorProfileWithDevice() succeeded\n" );
1256 ok( error == ERROR_NOT_SUPPORTED, "expected ERROR_NOT_SUPPORTED, got %u\n", error );
1258 ret = pInstallColorProfileA( NULL, testprofile );
1259 ok( ret, "InstallColorProfileA() failed (%u)\n", GetLastError() );
1261 ret = pGetColorDirectoryA( NULL, profile, &size );
1262 ok( ret, "GetColorDirectoryA() failed (%d)\n", GetLastError() );
1264 MSCMS_basenameA( testprofile, basename );
1265 lstrcatA( profile, "\\" );
1266 lstrcatA( profile, basename );
1268 ret = pAssociateColorProfileWithDeviceA( NULL, profile, monitor.DeviceID );
1269 ok( ret, "AssociateColorProfileWithDevice() failed (%u)\n", GetLastError() );
1271 SetLastError(0xdeadbeef);
1272 ret = pDisassociateColorProfileFromDeviceA( "machine", profile, NULL );
1273 error = GetLastError();
1274 ok( !ret, "DisassociateColorProfileFromDeviceA() succeeded\n" );
1275 ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error );
1277 SetLastError(0xdeadbeef);
1278 ret = pDisassociateColorProfileFromDeviceA( "machine", NULL, monitor.DeviceID );
1279 error = GetLastError();
1280 ok( !ret, "DisassociateColorProfileFromDeviceA() succeeded\n" );
1281 ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error );
1283 SetLastError(0xdeadbeef);
1284 ret = pDisassociateColorProfileFromDeviceA( "machine", profile, monitor.DeviceID );
1285 error = GetLastError();
1286 ok( !ret, "DisassociateColorProfileFromDeviceA() succeeded\n" );
1287 ok( error == ERROR_NOT_SUPPORTED, "expected ERROR_NOT_SUPPORTED, got %u\n", error );
1289 ret = pDisassociateColorProfileFromDeviceA( NULL, profile, monitor.DeviceID );
1290 ok( ret, "DisassociateColorProfileFromDeviceA() failed (%u)\n", GetLastError() );
1292 ret = pUninstallColorProfileA( NULL, profile, TRUE );
1293 ok( ret, "UninstallColorProfileA() failed (%d)\n", GetLastError() );
1295 else
1296 skip("Unable to obtain monitor name\n");
1300 START_TEST(profile)
1302 UINT len;
1303 HANDLE handle;
1304 char path[MAX_PATH], file[MAX_PATH];
1305 char profilefile1[MAX_PATH], profilefile2[MAX_PATH];
1306 WCHAR profilefile1W[MAX_PATH], profilefile2W[MAX_PATH];
1307 WCHAR fileW[MAX_PATH];
1308 UINT ret;
1310 hmscms = LoadLibraryA( "mscms.dll" );
1311 if (!hmscms) return;
1313 huser32 = LoadLibraryA( "user32.dll" );
1314 if (!huser32)
1316 FreeLibrary( hmscms );
1317 return;
1320 if (!init_function_ptrs())
1322 FreeLibrary( huser32 );
1323 FreeLibrary( hmscms );
1324 return;
1327 /* See if we can find the standard color profile */
1328 ret = GetSystemDirectoryA( profilefile1, sizeof(profilefile1) );
1329 ok( ret > 0, "GetSystemDirectoryA() returns %d, LastError = %d\n", ret, GetLastError());
1330 ok( lstrlenA(profilefile1) > 0 && lstrlenA(profilefile1) < MAX_PATH,
1331 "GetSystemDirectoryA() returns %d, LastError = %d\n", ret, GetLastError());
1332 MultiByteToWideChar(CP_ACP, 0, profilefile1, -1, profilefile1W, MAX_PATH);
1333 ok( lstrlenW(profilefile1W) > 0 && lstrlenW(profilefile1W) < MAX_PATH,
1334 "GetSystemDirectoryA() returns %d, LastError = %d\n", ret, GetLastError());
1335 lstrcpyA(profilefile2, profilefile1);
1336 lstrcpyW(profilefile2W, profilefile1W);
1338 lstrcatA( profilefile1, profile1 );
1339 lstrcatW( profilefile1W, profile1W );
1340 handle = CreateFileA( profilefile1, 0 , 0, NULL, OPEN_EXISTING, 0, NULL );
1342 if (handle != INVALID_HANDLE_VALUE)
1344 standardprofile = profilefile1;
1345 standardprofileW = profilefile1W;
1346 CloseHandle( handle );
1349 lstrcatA( profilefile2, profile2 );
1350 lstrcatW( profilefile2W, profile2W );
1351 handle = CreateFileA( profilefile2, 0 , 0, NULL, OPEN_EXISTING, 0, NULL );
1353 if (handle != INVALID_HANDLE_VALUE)
1355 standardprofile = profilefile2;
1356 standardprofileW = profilefile2W;
1357 CloseHandle( handle );
1360 /* If found, create a temporary copy for testing purposes */
1361 if (standardprofile && GetTempPath( sizeof(path), path ))
1363 if (GetTempFileName( path, "rgb", 0, file ))
1365 if (CopyFileA( standardprofile, file, FALSE ))
1367 testprofile = (LPSTR)&file;
1369 len = MultiByteToWideChar( CP_ACP, 0, testprofile, -1, NULL, 0 );
1370 MultiByteToWideChar( CP_ACP, 0, testprofile, -1, fileW, len );
1372 testprofileW = (LPWSTR)&fileW;
1377 test_GetColorDirectoryA();
1378 test_GetColorDirectoryW();
1380 test_GetColorProfileElement();
1381 test_GetColorProfileElementTag();
1383 test_GetColorProfileFromHandle();
1384 test_GetColorProfileHeader();
1386 test_GetCountColorProfileElements();
1388 test_GetStandardColorSpaceProfileA();
1389 test_GetStandardColorSpaceProfileW();
1391 test_EnumColorProfilesA();
1392 test_EnumColorProfilesW();
1394 test_InstallColorProfileA();
1395 test_InstallColorProfileW();
1397 test_IsColorProfileTagPresent();
1399 test_OpenColorProfileA();
1400 test_OpenColorProfileW();
1402 test_SetColorProfileElement();
1403 test_SetColorProfileHeader();
1405 test_UninstallColorProfileA();
1406 test_UninstallColorProfileW();
1408 test_AssociateColorProfileWithDeviceA();
1410 /* Clean up */
1411 if (testprofile)
1412 DeleteFileA( testprofile );
1414 FreeLibrary( huser32 );
1415 FreeLibrary( hmscms );