From 9db71b35d88bdac200b8ee913427ec2fbcd363aa Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Sun, 21 Nov 2004 15:48:18 +0000 Subject: [PATCH] Implement and test GetColorProfileElementTag, GetCountColorProfileElements and IsColorProfileTagPresent. Stub GetStandardColorSpaceProfile{A,W}. --- dlls/mscms/lcms_api.h | 2 + dlls/mscms/mscms.spec | 10 ++-- dlls/mscms/mscms_main.c | 1 + dlls/mscms/profile.c | 138 ++++++++++++++++++++++++++++++++++++++++++++- dlls/mscms/tests/profile.c | 83 ++++++++++++++++++++++++++- include/icm.h | 7 +++ 6 files changed, 232 insertions(+), 9 deletions(-) diff --git a/dlls/mscms/lcms_api.h b/dlls/mscms/lcms_api.h index 5cf7ac388ff..e35cf396916 100644 --- a/dlls/mscms/lcms_api.h +++ b/dlls/mscms/lcms_api.h @@ -27,11 +27,13 @@ #ifdef HAVE_LCMS_H LCMS_API_FUNCTION(cmsCloseProfile) +LCMS_API_FUNCTION(cmsIsTag) LCMS_API_FUNCTION(cmsOpenProfileFromFile) LCMS_API_FUNCTION(cmsOpenProfileFromMem) #ifndef LCMS_API_NO_REDEFINE #define cmsCloseProfile pcmsCloseProfile +#define cmsIsTag pcmsIsTag #define cmsOpenProfileFromFile pcmsOpenProfileFromFile #define cmsOpenProfileFromMem pcmsOpenProfileFromMem #endif /* LCMS_API_NO_REDEFINE */ diff --git a/dlls/mscms/mscms.spec b/dlls/mscms/mscms.spec index ff92aae6300..075de40b9bf 100644 --- a/dlls/mscms/mscms.spec +++ b/dlls/mscms/mscms.spec @@ -21,16 +21,16 @@ @ stdcall GetColorDirectoryA(ptr ptr long) @ stdcall GetColorDirectoryW(ptr ptr long) @ stub GetColorProfileElement -@ stub GetColorProfileElementTag +@ stdcall GetColorProfileElementTag(ptr long ptr) @ stub GetColorProfileFromHandle @ stub GetColorProfileHeader -@ stub GetCountColorProfileElements +@ stdcall GetCountColorProfileElements(ptr long) @ stub GetNamedProfileInfo @ stub GetPS2ColorRenderingDictionary @ stub GetPS2ColorRenderingIntent @ stub GetPS2ColorSpaceArray -@ stub GetStandardColorSpaceProfileA -@ stub GetStandardColorSpaceProfileW +@ stdcall GetStandardColorSpaceProfileA(ptr long ptr ptr) +@ stdcall GetStandardColorSpaceProfileW(ptr long ptr ptr) @ stdcall InstallColorProfileA(ptr ptr) @ stdcall InstallColorProfileW(ptr ptr) @ stub InternalGetDeviceConfig @@ -39,7 +39,7 @@ @ stub InternalGetPS2ColorSpaceArray @ stub InternalGetPS2PreviewCRD @ stub InternalSetDeviceConfig -@ stub IsColorProfileTagPresent +@ stdcall IsColorProfileTagPresent(ptr long ptr) @ stdcall IsColorProfileValid(ptr long) @ stdcall OpenColorProfileA(ptr long long long) @ stdcall OpenColorProfileW(ptr long long long) diff --git a/dlls/mscms/mscms_main.c b/dlls/mscms/mscms_main.c index 5d0f4665865..97dd4cbabf4 100644 --- a/dlls/mscms/mscms_main.c +++ b/dlls/mscms/mscms_main.c @@ -73,6 +73,7 @@ static BOOL MSCMS_init_lcms() goto sym_not_found; LOAD_FUNCPTR(cmsCloseProfile); + LOAD_FUNCPTR(cmsIsTag); LOAD_FUNCPTR(cmsOpenProfileFromFile); LOAD_FUNCPTR(cmsOpenProfileFromMem); #undef LOAD_FUNCPTR diff --git a/dlls/mscms/profile.c b/dlls/mscms/profile.c index d26c70ca604..7535e3de625 100644 --- a/dlls/mscms/profile.c +++ b/dlls/mscms/profile.c @@ -67,7 +67,7 @@ BOOL WINAPI GetColorDirectoryA( PCSTR machine, PSTR buffer, PDWORD size ) if (bufferW) { ret = GetColorDirectoryW( NULL, bufferW, &sizeW ); - *size = sizeW / sizeof(WCHAR); + *size = WideCharToMultiByte( CP_ACP, 0, bufferW, -1, NULL, 0, NULL, NULL ); if (ret) { @@ -118,6 +118,110 @@ BOOL WINAPI GetColorDirectoryW( PCWSTR machine, PWSTR buffer, PDWORD size ) } /****************************************************************************** + * GetColorProfileElementTag [MSCMS.@] + * + * Get a tag name from a color profile by index. + * + * PARAMS + * profile [I] Handle to a color profile. + * index [I] Index into the tag table of the color profile. + * tag [O] Pointer to a TAGTYPE variable. + * + * RETURNS + * Success: TRUE + * Failure: FALSE + * + * NOTES + * The tag table index starts at 1. + * Use GetCountColorProfileElements to retrieve a count of tagged elements. + */ +BOOL WINAPI GetColorProfileElementTag( HPROFILE profile, DWORD index, PTAGTYPE tag ) +{ + BOOL ret = FALSE; +#ifdef HAVE_LCMS_H + LCMSICCPROFILE *cmsprofile = (LCMSICCPROFILE *)MSCMS_hprofile2cmsprofile( profile ); + + TRACE( "( %p, %ld, %p )\n", profile, index, tag ); + + if (cmsprofile) + { + *tag = cmsprofile->TagNames[index - 1]; + ret = TRUE; + } + +#endif /* HAVE_LCMS_H */ + return ret; +} + +/****************************************************************************** + * GetCountColorProfileElements [MSCMS.@] + * + * Retrieve the number of elements in a color profile. + * + * PARAMS + * profile [I] Handle to a color profile. + * count [O] Pointer to a variable which is set to the number of elements + * in the color profile. + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL WINAPI GetCountColorProfileElements( HPROFILE profile, PDWORD count ) +{ + BOOL ret = FALSE; +#ifdef HAVE_LCMS_H + LCMSICCPROFILE *cmsprofile = (LCMSICCPROFILE *)MSCMS_hprofile2cmsprofile( profile ); + + TRACE( "( %p, %p )\n", profile, count ); + + if (cmsprofile) + { + *count = cmsprofile->TagCount; + ret = TRUE; + } + +#endif /* HAVE_LCMS_H */ + return ret; +} + +BOOL WINAPI GetStandardColorSpaceProfileA( PCSTR machine, DWORD id, PSTR profile, PDWORD size ) +{ + INT len; + LPWSTR profileW; + BOOL ret = FALSE; + DWORD sizeW = *size * sizeof(WCHAR); + + TRACE( "( 0x%08lx, %p, %ld )\n", id, profile, *size ); + + if (machine || !profile) return FALSE; + + profileW = HeapAlloc( GetProcessHeap(), 0, sizeW ); + + if (profileW) + { + ret = GetStandardColorSpaceProfileW( NULL, id, profileW, &sizeW ); + *size = WideCharToMultiByte( CP_ACP, 0, profileW, -1, NULL, 0, NULL, NULL ); + + if (ret) + { + len = WideCharToMultiByte( CP_ACP, 0, profileW, *size, profile, *size, NULL, NULL ); + if (!len) ret = FALSE; + } + + HeapFree( GetProcessHeap(), 0, profileW ); + } + return ret; +} + +BOOL WINAPI GetStandardColorSpaceProfileW( PCWSTR machine, DWORD id, PWSTR profile, PDWORD size ) +{ + FIXME( "( %lx, %p, %ld ) stub\n", id, profile, *size ); + + return FALSE; +} + +/****************************************************************************** * InstallColorProfileA [MSCMS.@] * * See InstallColorProfileW. @@ -183,6 +287,34 @@ BOOL WINAPI InstallColorProfileW( PCWSTR machine, PCWSTR profile ) } /****************************************************************************** + * IsColorProfileTagPresent [MSCMS.@] + * + * Determine if a given ICC tag is present in a color profile. + * + * PARAMS + * profile [I] Color profile handle. + * tag [I] ICC tag. + * present [O] Pointer to a BOOL variable. Set to TRUE if tag is present, + * FALSE otherwise. + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL WINAPI IsColorProfileTagPresent( HPROFILE profile, TAGTYPE tag, PBOOL present ) +{ + BOOL ret = FALSE; + + TRACE( "( %p, 0x%08lx, %p )\n", profile, tag, present ); + +#ifdef HAVE_LCMS_H + ret = cmsIsTag( MSCMS_hprofile2cmsprofile( profile ), tag ); + +#endif /* HAVE_LCMS_H */ + return *present = ret; +} + +/****************************************************************************** * IsColorProfileValid [MSCMS.@] * * Determine if a given color profile is valid. @@ -268,7 +400,7 @@ HPROFILE WINAPI OpenColorProfileA( PPROFILE profile, DWORD access, DWORD sharing { HPROFILE handle = NULL; - TRACE( "( %p, %lx, %lx, %lx )\n", profile, access, sharing, creation ); + TRACE( "( %p, 0x%08lx, 0x%08lx, 0x%08lx )\n", profile, access, sharing, creation ); if (!profile || !profile->pProfileData) return NULL; @@ -325,7 +457,7 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing cmsHPROFILE cmsprofile = NULL; HANDLE handle = NULL; - TRACE( "( %p, %lx, %lx, %lx )\n", profile, access, sharing, creation ); + TRACE( "( %p, 0x%08lx, 0x%08lx, 0x%08lx )\n", profile, access, sharing, creation ); if (!profile || !profile->pProfileData) return NULL; diff --git a/dlls/mscms/tests/profile.c b/dlls/mscms/tests/profile.c index ee27bbe0019..52c5ac43d69 100644 --- a/dlls/mscms/tests/profile.c +++ b/dlls/mscms/tests/profile.c @@ -144,6 +144,53 @@ static void test_GetColorDirectoryW() ok( ret, "GetColorDirectoryW() failed (%ld)\n", GetLastError() ); } +static void test_GetColorProfileElementTag() +{ + if (standardprofile) + { + PROFILE profile; + HPROFILE handle; + BOOL ret; + DWORD index = 1; + TAGTYPE tag, expect = 0x63707274; /* 'cprt' */ + + profile.dwType = PROFILE_FILENAME; + profile.pProfileData = standardprofile; + profile.cbDataSize = strlen(standardprofile); + + handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING ); + ok( handle != NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + ret = GetColorProfileElementTag( handle, index, &tag ); + ok( ret && tag == expect, "GetColorProfileElementTag() failed (%ld)\n", GetLastError() ); + + CloseColorProfile( handle ); + } +} + +static void test_GetCountColorProfileElements() +{ + if (standardprofile) + { + PROFILE profile; + HPROFILE handle; + BOOL ret; + DWORD count, expect = 17; + + profile.dwType = PROFILE_FILENAME; + profile.pProfileData = standardprofile; + profile.cbDataSize = strlen(standardprofile); + + handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING ); + ok( handle != NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + ret = GetCountColorProfileElements( handle, &count ); + ok( ret && count == expect, "GetCountColorProfileElements() failed (%ld)\n", GetLastError() ); + + CloseColorProfile( handle ); + } +} + static void test_InstallColorProfileA() { BOOL ret; @@ -246,6 +293,36 @@ static void test_InstallColorProfileW() } } +static void test_IsColorProfileTagPresent() +{ + if (standardprofile) + { + PROFILE profile; + HPROFILE handle; + BOOL ret, present; + TAGTYPE tag; + + profile.dwType = PROFILE_FILENAME; + profile.pProfileData = standardprofile; + profile.cbDataSize = strlen(standardprofile); + + handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING ); + ok( handle != NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + tag = 0; + + ret = IsColorProfileTagPresent( handle, tag, &present ); + ok( !(ret && present), "IsColorProfileTagPresent() succeeded (%ld)\n", GetLastError() ); + + tag = 0x63707274; /* 'cprt' */ + + ret = IsColorProfileTagPresent( handle, tag, &present ); + ok( ret && present, "IsColorProfileTagPresent() failed (%ld)\n", GetLastError() ); + + CloseColorProfile( handle ); + } +} + static void test_OpenColorProfileA() { PROFILE profile; @@ -459,7 +536,6 @@ START_TEST(profile) { if (CopyFileA( standardprofile, file, FALSE )) { - testprofile = (LPSTR)&file; len = MultiByteToWideChar( CP_ACP, 0, testprofile, -1, NULL, 0 ); @@ -473,9 +549,14 @@ START_TEST(profile) test_GetColorDirectoryA(); test_GetColorDirectoryW(); + test_GetColorProfileElementTag(); + test_GetCountColorProfileElements(); + test_InstallColorProfileA(); test_InstallColorProfileW(); + test_IsColorProfileTagPresent(); + test_OpenColorProfileA(); test_OpenColorProfileW(); diff --git a/include/icm.h b/include/icm.h index 4decd1efe00..c55abb8aaf1 100644 --- a/include/icm.h +++ b/include/icm.h @@ -158,9 +158,16 @@ BOOL WINAPI CloseColorProfile(HPROFILE); BOOL WINAPI GetColorDirectoryA(PCSTR,PSTR,PDWORD); BOOL WINAPI GetColorDirectoryW(PCWSTR,PWSTR,PDWORD); #define GetColorDirectory WINELIB_NAME_AW(GetColorDirectory) +BOOL WINAPI GetColorProfileElement(HPROFILE,TAGTYPE,DWORD,PDWORD,PVOID,PBOOL); +BOOL WINAPI GetColorProfileElementTag(HPROFILE,DWORD,PTAGTYPE); +BOOL WINAPI GetCountColorProfileElements(HPROFILE,PDWORD); +BOOL WINAPI GetStandardColorSpaceProfileA(PCSTR,DWORD,PSTR,PDWORD); +BOOL WINAPI GetStandardColorSpaceProfileW(PCWSTR,DWORD,PWSTR,PDWORD); +#define GetStandardColorSpaceProfile WINELIB_NAME_AW(GetStandardColorSpaceProfile) BOOL WINAPI InstallColorProfileA(PCSTR,PCSTR); BOOL WINAPI InstallColorProfileW(PCWSTR,PCWSTR); #define InstallColorProfile WINELIB_NAME_AW(InstallColorProfile) +BOOL WINAPI IsColorProfileTagPresent(HPROFILE,TAGTYPE,PBOOL); BOOL WINAPI IsColorProfileValid(HPROFILE,PBOOL); HPROFILE WINAPI OpenColorProfileA(PPROFILE,DWORD,DWORD,DWORD); HPROFILE WINAPI OpenColorProfileW(PPROFILE,DWORD,DWORD,DWORD); -- 2.11.4.GIT