Implement and test access flags for color profiles.
Write the color profile back to disk when it was opened for writing.
This commit is contained in:
parent
2cc5f1e469
commit
89de92ef26
|
@ -44,12 +44,15 @@ static CRITICAL_SECTION MSCMS_handle_cs = { &MSCMS_handle_cs_debug, -1, 0, 0, 0,
|
||||||
/* A simple structure to tie together a pointer to an icc profile, an lcms
|
/* A simple structure to tie together a pointer to an icc profile, an lcms
|
||||||
* color profile handle and a Windows file handle. Windows color profile
|
* color profile handle and a Windows file handle. Windows color profile
|
||||||
* handles are built from indexes into an array of these structures. If
|
* handles are built from indexes into an array of these structures. If
|
||||||
* the profile is memory based the file handle field is NULL.
|
* the profile is memory based the file handle field is NULL. The 'access'
|
||||||
|
* field records the access parameter supplied to an OpenColorProfile()
|
||||||
|
* call, i.e. PROFILE_READ or PROFILE_READWRITE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct handlemap
|
struct handlemap
|
||||||
{
|
{
|
||||||
HANDLE file;
|
HANDLE file;
|
||||||
|
DWORD access;
|
||||||
icProfile *iccprofile;
|
icProfile *iccprofile;
|
||||||
cmsHPROFILE cmsprofile;
|
cmsHPROFILE cmsprofile;
|
||||||
};
|
};
|
||||||
|
@ -96,6 +99,20 @@ HANDLE MSCMS_hprofile2handle( HPROFILE profile )
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DWORD MSCMS_hprofile2access( HPROFILE profile )
|
||||||
|
{
|
||||||
|
DWORD access;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
EnterCriticalSection( &MSCMS_handle_cs );
|
||||||
|
|
||||||
|
i = (unsigned int)profile - 1;
|
||||||
|
access = handlemaptable[i].access;
|
||||||
|
|
||||||
|
LeaveCriticalSection( &MSCMS_handle_cs );
|
||||||
|
return access;
|
||||||
|
}
|
||||||
|
|
||||||
HPROFILE MSCMS_cmsprofile2hprofile( cmsHPROFILE cmsprofile )
|
HPROFILE MSCMS_cmsprofile2hprofile( cmsHPROFILE cmsprofile )
|
||||||
{
|
{
|
||||||
HPROFILE profile = NULL;
|
HPROFILE profile = NULL;
|
||||||
|
@ -172,7 +189,8 @@ icProfile *MSCMS_hprofile2iccprofile( HPROFILE profile )
|
||||||
return iccprofile;
|
return iccprofile;
|
||||||
}
|
}
|
||||||
|
|
||||||
HPROFILE MSCMS_create_hprofile_handle( HANDLE file, icProfile *iccprofile, cmsHPROFILE cmsprofile )
|
HPROFILE MSCMS_create_hprofile_handle( HANDLE file, icProfile *iccprofile,
|
||||||
|
cmsHPROFILE cmsprofile, DWORD access )
|
||||||
{
|
{
|
||||||
HPROFILE profile = NULL;
|
HPROFILE profile = NULL;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -186,6 +204,7 @@ HPROFILE MSCMS_create_hprofile_handle( HANDLE file, icProfile *iccprofile, cmsHP
|
||||||
if (handlemaptable[i].iccprofile == 0)
|
if (handlemaptable[i].iccprofile == 0)
|
||||||
{
|
{
|
||||||
handlemaptable[i].file = file;
|
handlemaptable[i].file = file;
|
||||||
|
handlemaptable[i].access = access;
|
||||||
handlemaptable[i].iccprofile = iccprofile;
|
handlemaptable[i].iccprofile = iccprofile;
|
||||||
handlemaptable[i].cmsprofile = cmsprofile;
|
handlemaptable[i].cmsprofile = cmsprofile;
|
||||||
|
|
||||||
|
@ -195,7 +214,6 @@ HPROFILE MSCMS_create_hprofile_handle( HANDLE file, icProfile *iccprofile, cmsHP
|
||||||
|
|
||||||
out:
|
out:
|
||||||
LeaveCriticalSection( &MSCMS_handle_cs );
|
LeaveCriticalSection( &MSCMS_handle_cs );
|
||||||
|
|
||||||
return profile;
|
return profile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* MSCMS - Color Management System for Wine
|
* MSCMS - Color Management System for Wine
|
||||||
*
|
*
|
||||||
* Copyright 2004 Hans Leidekker
|
* Copyright 2004, 2005 Hans Leidekker
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -101,4 +101,12 @@ void MSCMS_set_tag_data( icProfile *iccprofile, icTag *tag, DWORD offset, void *
|
||||||
memcpy( (char *)iccprofile + tag->offset + offset, buffer, tag->size - offset );
|
memcpy( (char *)iccprofile + tag->offset + offset, buffer, tag->size - offset );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DWORD MSCMS_get_profile_size( icProfile *iccprofile )
|
||||||
|
{
|
||||||
|
DWORD size = ((icHeader *)iccprofile)->size;
|
||||||
|
|
||||||
|
MSCMS_adjust_endianess32( (ULONG *)&size );
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* HAVE_LCMS_H */
|
#endif /* HAVE_LCMS_H */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* MSCMS - Color Management System for Wine
|
* MSCMS - Color Management System for Wine
|
||||||
*
|
*
|
||||||
* Copyright 2004 Hans Leidekker
|
* Copyright 2004, 2005 Hans Leidekker
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -68,6 +68,7 @@
|
||||||
#define DWORD DWORD
|
#define DWORD DWORD
|
||||||
#define LPDWORD LPDWORD
|
#define LPDWORD LPDWORD
|
||||||
|
|
||||||
|
extern DWORD MSCMS_hprofile2access( HPROFILE );
|
||||||
extern HPROFILE MSCMS_handle2hprofile( HANDLE file );
|
extern HPROFILE MSCMS_handle2hprofile( HANDLE file );
|
||||||
extern HPROFILE MSCMS_cmsprofile2hprofile( cmsHPROFILE cmsprofile );
|
extern HPROFILE MSCMS_cmsprofile2hprofile( cmsHPROFILE cmsprofile );
|
||||||
extern HPROFILE MSCMS_iccprofile2hprofile( icProfile *iccprofile );
|
extern HPROFILE MSCMS_iccprofile2hprofile( icProfile *iccprofile );
|
||||||
|
@ -75,7 +76,8 @@ extern HANDLE MSCMS_hprofile2handle( HPROFILE profile );
|
||||||
extern cmsHPROFILE MSCMS_hprofile2cmsprofile( HPROFILE profile );
|
extern cmsHPROFILE MSCMS_hprofile2cmsprofile( HPROFILE profile );
|
||||||
extern icProfile *MSCMS_hprofile2iccprofile( HPROFILE profile );
|
extern icProfile *MSCMS_hprofile2iccprofile( HPROFILE profile );
|
||||||
|
|
||||||
extern HPROFILE MSCMS_create_hprofile_handle( HANDLE file, icProfile *iccprofile, cmsHPROFILE cmsprofile );
|
extern HPROFILE MSCMS_create_hprofile_handle( HANDLE file, icProfile *iccprofile,
|
||||||
|
cmsHPROFILE cmsprofile, DWORD access );
|
||||||
extern void MSCMS_destroy_hprofile_handle( HPROFILE profile );
|
extern void MSCMS_destroy_hprofile_handle( HPROFILE profile );
|
||||||
|
|
||||||
extern DWORD MSCMS_get_tag_count( icProfile *iccprofile );
|
extern DWORD MSCMS_get_tag_count( icProfile *iccprofile );
|
||||||
|
@ -84,5 +86,6 @@ extern void MSCMS_get_tag_data( icProfile *iccprofile, icTag *tag, DWORD offset,
|
||||||
extern void MSCMS_set_tag_data( icProfile *iccprofile, icTag *tag, DWORD offset, void *buffer );
|
extern void MSCMS_set_tag_data( icProfile *iccprofile, icTag *tag, DWORD offset, void *buffer );
|
||||||
extern void MSCMS_get_profile_header( icProfile *iccprofile, PROFILEHEADER *header );
|
extern void MSCMS_get_profile_header( icProfile *iccprofile, PROFILEHEADER *header );
|
||||||
extern void MSCMS_set_profile_header( icProfile *iccprofile, PROFILEHEADER *header );
|
extern void MSCMS_set_profile_header( icProfile *iccprofile, PROFILEHEADER *header );
|
||||||
|
extern DWORD MSCMS_get_profile_size( icProfile *iccprofile );
|
||||||
|
|
||||||
#endif /* HAVE_LCMS_H */
|
#endif /* HAVE_LCMS_H */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* MSCMS - Color Management System for Wine
|
* MSCMS - Color Management System for Wine
|
||||||
*
|
*
|
||||||
* Copyright 2004 Hans Leidekker
|
* Copyright 2004, 2005 Hans Leidekker
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -554,12 +554,14 @@ BOOL WINAPI SetColorProfileElement( HPROFILE profile, TAGTYPE type, DWORD offset
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
#ifdef HAVE_LCMS_H
|
#ifdef HAVE_LCMS_H
|
||||||
icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile );
|
icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile );
|
||||||
DWORD i, count;
|
DWORD i, count, access = MSCMS_hprofile2access( profile );
|
||||||
icTag tag;
|
icTag tag;
|
||||||
|
|
||||||
TRACE( "( %p, 0x%08lx, %ld, %p, %p )\n", profile, type, offset, size, buffer );
|
TRACE( "( %p, 0x%08lx, %ld, %p, %p )\n", profile, type, offset, size, buffer );
|
||||||
|
|
||||||
if (!iccprofile || !size || !buffer) return FALSE;
|
if (!iccprofile || !size || !buffer) return FALSE;
|
||||||
|
if (!(access & PROFILE_READWRITE)) return FALSE;
|
||||||
|
|
||||||
count = MSCMS_get_tag_count( iccprofile );
|
count = MSCMS_get_tag_count( iccprofile );
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
|
@ -584,10 +586,12 @@ BOOL WINAPI SetColorProfileHeader( HPROFILE profile, PPROFILEHEADER header )
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
#ifdef HAVE_LCMS_H
|
#ifdef HAVE_LCMS_H
|
||||||
icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile );
|
icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile );
|
||||||
|
DWORD access = MSCMS_hprofile2access( profile );
|
||||||
|
|
||||||
TRACE( "( %p, %p )\n", profile, header );
|
TRACE( "( %p, %p )\n", profile, header );
|
||||||
|
|
||||||
if (!iccprofile || !header) return FALSE;
|
if (!iccprofile || !header) return FALSE;
|
||||||
|
if (!(access & PROFILE_READWRITE)) return FALSE;
|
||||||
|
|
||||||
MSCMS_set_profile_header( iccprofile, header );
|
MSCMS_set_profile_header( iccprofile, header );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -794,7 +798,7 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmsprofile)
|
if (cmsprofile)
|
||||||
return MSCMS_create_hprofile_handle( handle, iccprofile, cmsprofile );
|
return MSCMS_create_hprofile_handle( handle, iccprofile, cmsprofile, access );
|
||||||
|
|
||||||
#endif /* HAVE_LCMS_H */
|
#endif /* HAVE_LCMS_H */
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -815,15 +819,26 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing
|
||||||
BOOL WINAPI CloseColorProfile( HPROFILE profile )
|
BOOL WINAPI CloseColorProfile( HPROFILE profile )
|
||||||
{
|
{
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
|
#ifdef HAVE_LCMS_H
|
||||||
|
icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile );
|
||||||
|
HANDLE file = MSCMS_hprofile2handle( profile );
|
||||||
|
DWORD access = MSCMS_hprofile2access( profile );
|
||||||
|
|
||||||
TRACE( "( %p )\n", profile );
|
TRACE( "( %p )\n", profile );
|
||||||
|
|
||||||
#ifdef HAVE_LCMS_H
|
if (file && (access & PROFILE_READWRITE))
|
||||||
|
{
|
||||||
|
DWORD written, size = MSCMS_get_profile_size( iccprofile );
|
||||||
|
|
||||||
|
if (SetFilePointer( file, 0, NULL, FILE_BEGIN ) ||
|
||||||
|
!WriteFile( file, iccprofile, size, &written, NULL ) || written != size)
|
||||||
|
ERR( "Unable to write color profile\n" );
|
||||||
|
}
|
||||||
|
|
||||||
ret = cmsCloseProfile( MSCMS_hprofile2cmsprofile( profile ) );
|
ret = cmsCloseProfile( MSCMS_hprofile2cmsprofile( profile ) );
|
||||||
|
|
||||||
HeapFree( GetProcessHeap(), 0, MSCMS_hprofile2iccprofile( profile ) );
|
HeapFree( GetProcessHeap(), 0, MSCMS_hprofile2iccprofile( profile ) );
|
||||||
CloseHandle( MSCMS_hprofile2handle( profile ) );
|
|
||||||
|
|
||||||
|
CloseHandle( MSCMS_hprofile2handle( profile ) );
|
||||||
MSCMS_destroy_hprofile_handle( profile );
|
MSCMS_destroy_hprofile_handle( profile );
|
||||||
|
|
||||||
#endif /* HAVE_LCMS_H */
|
#endif /* HAVE_LCMS_H */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Tests for color profile functions
|
* Tests for color profile functions
|
||||||
*
|
*
|
||||||
* Copyright 2004 Hans Leidekker
|
* Copyright 2004, 2005 Hans Leidekker
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -743,22 +743,19 @@ static void test_SetColorProfileElement()
|
||||||
profile.pProfileData = testprofile;
|
profile.pProfileData = testprofile;
|
||||||
profile.cbDataSize = strlen(testprofile);
|
profile.cbDataSize = strlen(testprofile);
|
||||||
|
|
||||||
|
/* Parameter checks */
|
||||||
|
|
||||||
handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
|
handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
|
||||||
ok( handle != NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() );
|
ok( handle != NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() );
|
||||||
|
|
||||||
todo_wine
|
|
||||||
{
|
|
||||||
ret = SetColorProfileElement( handle, tag, 0, &size, data );
|
ret = SetColorProfileElement( handle, tag, 0, &size, data );
|
||||||
ok( !ret, "SetColorProfileElement() succeeded (%ld)\n", GetLastError() );
|
ok( !ret, "SetColorProfileElement() succeeded (%ld)\n", GetLastError() );
|
||||||
}
|
|
||||||
|
|
||||||
CloseColorProfile( handle );
|
CloseColorProfile( handle );
|
||||||
|
|
||||||
handle = OpenColorProfileA( &profile, PROFILE_READWRITE, 0, OPEN_EXISTING );
|
handle = OpenColorProfileA( &profile, PROFILE_READWRITE, 0, OPEN_EXISTING );
|
||||||
ok( handle != NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() );
|
ok( handle != NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() );
|
||||||
|
|
||||||
/* Parameter checks */
|
|
||||||
|
|
||||||
ret = SetColorProfileElement( NULL, 0, 0, NULL, NULL );
|
ret = SetColorProfileElement( NULL, 0, 0, NULL, NULL );
|
||||||
ok( !ret, "SetColorProfileElement() succeeded (%ld)\n", GetLastError() );
|
ok( !ret, "SetColorProfileElement() succeeded (%ld)\n", GetLastError() );
|
||||||
|
|
||||||
|
@ -827,11 +824,8 @@ static void test_SetColorProfileHeader()
|
||||||
handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
|
handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING );
|
||||||
ok( handle != NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() );
|
ok( handle != NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() );
|
||||||
|
|
||||||
todo_wine
|
|
||||||
{
|
|
||||||
ret = SetColorProfileHeader( handle, &header );
|
ret = SetColorProfileHeader( handle, &header );
|
||||||
ok( !ret, "SetColorProfileHeader() succeeded (%ld)\n", GetLastError() );
|
ok( !ret, "SetColorProfileHeader() succeeded (%ld)\n", GetLastError() );
|
||||||
}
|
|
||||||
|
|
||||||
CloseColorProfile( handle );
|
CloseColorProfile( handle );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue