winex11: Use a simple sdbm hash implementation in X11DRV_GetICMProfile.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
ea9fb81c09
commit
f1fb42ac4d
|
@ -1621,12 +1621,13 @@ fallback:
|
|||
return dev->funcs->pGradientFill( dev, vert_array, nvert, grad_array, ngrad, mode );
|
||||
}
|
||||
|
||||
static unsigned char *get_icm_profile( unsigned long *size )
|
||||
static char *get_icm_profile( unsigned long *size )
|
||||
{
|
||||
Atom type;
|
||||
int format;
|
||||
unsigned long count, remaining;
|
||||
unsigned char *profile, *ret = NULL;
|
||||
unsigned char *profile;
|
||||
char *ret = NULL;
|
||||
|
||||
XGetWindowProperty( gdi_display, DefaultRootWindow(gdi_display),
|
||||
x11drv_atom(_ICC_PROFILE), 0, ~0UL, False, AnyPropertyType,
|
||||
|
@ -1674,15 +1675,15 @@ BOOL CDECL X11DRV_GetICMProfile( PHYSDEV dev, BOOL allow_default, LPDWORD size,
|
|||
DWORD required;
|
||||
char buf[4096];
|
||||
KEY_VALUE_FULL_INFORMATION *info = (void *)buf;
|
||||
unsigned char *buffer;
|
||||
unsigned long buflen;
|
||||
char *buffer;
|
||||
unsigned long buflen, i;
|
||||
ULONG full_size;
|
||||
WCHAR profile[MAX_PATH], fullname[MAX_PATH + ARRAY_SIZE( color_path )];
|
||||
WCHAR fullname[MAX_PATH + ARRAY_SIZE( color_path )], *p;
|
||||
|
||||
if (!size) return FALSE;
|
||||
|
||||
memcpy( fullname, color_path, sizeof(color_path) );
|
||||
fullname[ARRAYSIZE(color_path)] = 0;
|
||||
p = fullname + ARRAYSIZE(color_path);
|
||||
|
||||
hkey = reg_open_key( NULL, mntr_key, sizeof(mntr_key) );
|
||||
|
||||
|
@ -1690,27 +1691,25 @@ BOOL CDECL X11DRV_GetICMProfile( PHYSDEV dev, BOOL allow_default, LPDWORD size,
|
|||
info, sizeof(buf), &full_size ))
|
||||
{
|
||||
/* FIXME handle multiple values */
|
||||
memcpy( fullname + ARRAYSIZE(color_path), info->Name, info->NameLength );
|
||||
fullname[ARRAYSIZE(color_path) + info->NameLength / sizeof(WCHAR)] = 0;
|
||||
memcpy( p, info->Name, info->NameLength );
|
||||
p[info->NameLength / sizeof(WCHAR)] = 0;
|
||||
}
|
||||
else if ((buffer = get_icm_profile( &buflen )))
|
||||
{
|
||||
static const WCHAR fmt[] = {'%','0','2','x',0};
|
||||
static const WCHAR icm[] = {'.','i','c','m',0};
|
||||
|
||||
unsigned char sha1sum[20];
|
||||
unsigned int i;
|
||||
sha_ctx ctx;
|
||||
UINT64 hash = 0;
|
||||
HANDLE file;
|
||||
|
||||
A_SHAInit( &ctx );
|
||||
A_SHAUpdate( &ctx, buffer, buflen );
|
||||
A_SHAFinal( &ctx, sha1sum );
|
||||
for (i = 0; i < buflen; i++) hash = (hash << 16) - hash + buffer[i];
|
||||
for (i = 0; i < sizeof(hash) * 2; i++)
|
||||
{
|
||||
int digit = hash & 0xf;
|
||||
p[i] = digit < 10 ? '0' + digit : 'a' - 10 + digit;
|
||||
hash >>= 4;
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof(sha1sum); i++) sprintfW( &profile[i * 2], fmt, sha1sum[i] );
|
||||
memcpy( &profile[i * 2], icm, sizeof(icm) );
|
||||
memcpy( p + i, icm, sizeof(icm) );
|
||||
|
||||
strcatW( fullname, profile );
|
||||
file = CreateFileW( fullname, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0 );
|
||||
if (file != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
|
@ -1723,7 +1722,7 @@ BOOL CDECL X11DRV_GetICMProfile( PHYSDEV dev, BOOL allow_default, LPDWORD size,
|
|||
HeapFree( GetProcessHeap(), 0, buffer );
|
||||
}
|
||||
else if (!allow_default) return FALSE;
|
||||
else strcatW( fullname, srgb );
|
||||
else lstrcpyW( p, srgb );
|
||||
|
||||
NtClose( hkey );
|
||||
required = strlenW( fullname ) + 1;
|
||||
|
|
Loading…
Reference in New Issue