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:
Jacek Caban 2022-04-22 14:46:31 +02:00 committed by Alexandre Julliard
parent ea9fb81c09
commit f1fb42ac4d

View file

@ -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;