Hans Leidekker : mscms: Fix OpenColorProfile to handle relative file names.
Alexandre Julliard
julliard at winehq.org
Tue Sep 20 13:08:35 CDT 2011
Module: wine
Branch: master
Commit: 7200072622dc14873bd0a9430c5dfd5949a6ebe9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7200072622dc14873bd0a9430c5dfd5949a6ebe9
Author: Hans Leidekker <hans at codeweavers.com>
Date: Tue Sep 20 11:31:13 2011 +0200
mscms: Fix OpenColorProfile to handle relative file names.
---
dlls/mscms/Makefile.in | 2 +-
dlls/mscms/profile.c | 21 ++++++++++++++++++++-
dlls/mscms/tests/profile.c | 10 ++++++++++
3 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/dlls/mscms/Makefile.in b/dlls/mscms/Makefile.in
index 9a55cdb..6589598 100644
--- a/dlls/mscms/Makefile.in
+++ b/dlls/mscms/Makefile.in
@@ -1,6 +1,6 @@
MODULE = mscms.dll
IMPORTLIB = mscms
-IMPORTS = advapi32
+IMPORTS = shlwapi advapi32
EXTRALIBS = @LCMSLIBS@
C_SRCS = \
diff --git a/dlls/mscms/profile.c b/dlls/mscms/profile.c
index 7fc94be..c4eae9d 100644
--- a/dlls/mscms/profile.c
+++ b/dlls/mscms/profile.c
@@ -30,6 +30,7 @@
#include "wingdi.h"
#include "winuser.h"
#include "winreg.h"
+#include "shlwapi.h"
#include "icm.h"
#include "mscms_priv.h"
@@ -1470,7 +1471,25 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing
if (!flags) return NULL;
if (!sharing) sharing = FILE_SHARE_READ;
- handle = CreateFileW( profile->pProfileData, flags, sharing, NULL, creation, 0, NULL );
+ if (!PathIsRelativeW( profile->pProfileData ))
+ handle = CreateFileW( profile->pProfileData, flags, sharing, NULL, creation, 0, NULL );
+ else
+ {
+ DWORD size;
+ WCHAR *path;
+
+ if (!GetColorDirectoryW( NULL, NULL, &size ) && GetLastError() == ERROR_MORE_DATA)
+ {
+ size += (strlenW( profile->pProfileData ) + 2) * sizeof(WCHAR);
+ if (!(path = HeapAlloc( GetProcessHeap(), 0, size ))) return NULL;
+ GetColorDirectoryW( NULL, path, &size );
+ PathAddBackslashW( path );
+ strcatW( path, profile->pProfileData );
+ }
+ else return NULL;
+ handle = CreateFileW( path, flags, sharing, NULL, creation, 0, NULL );
+ HeapFree( GetProcessHeap(), 0, path );
+ }
if (handle == INVALID_HANDLE_VALUE)
{
WARN( "Unable to open color profile %u\n", GetLastError() );
diff --git a/dlls/mscms/tests/profile.c b/dlls/mscms/tests/profile.c
index 7cbface..d4293ff 100644
--- a/dlls/mscms/tests/profile.c
+++ b/dlls/mscms/tests/profile.c
@@ -952,6 +952,16 @@ static void test_OpenColorProfileA(void)
ret = pCloseColorProfile( handle );
ok( ret, "CloseColorProfile() failed (%d)\n", GetLastError() );
+
+ profile.dwType = PROFILE_FILENAME;
+ profile.pProfileData = (void *)"sRGB Color Space Profile.icm";
+ profile.cbDataSize = sizeof("sRGB Color Space Profile.icm");
+
+ handle = pOpenColorProfileA( &profile, PROFILE_READ, FILE_SHARE_READ, OPEN_EXISTING );
+ ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() );
+
+ ret = pCloseColorProfile( handle );
+ ok( ret, "CloseColorProfile() failed (%d)\n", GetLastError() );
}
}
More information about the wine-cvs
mailing list