Jacek Caban : gdi32: Directly use ntdll in update_external_font_keys.
Alexandre Julliard
julliard at winehq.org
Mon Sep 27 15:21:45 CDT 2021
Module: wine
Branch: master
Commit: b544b748800e936e5dc008e3ef9203304b4b70e5
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b544b748800e936e5dc008e3ef9203304b4b70e5
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Sep 27 13:05:15 2021 +0200
gdi32: Directly use ntdll in update_external_font_keys.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/gdi32/font.c | 65 ++++++++++++++++++++++++++++++-------------------------
1 file changed, 36 insertions(+), 29 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 9132c9b6849..9d2cd37e642 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -91,6 +91,8 @@ static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
static const WCHAR nt_prefixW[] = {'\\','?','?','\\'};
+static const WCHAR true_type_suffixW[] = {' ','(','T','r','u','e','T','y','p','e',')',0};
+
static const WCHAR system_link_keyW[] =
{
'\\','R','e','g','i','s','t','r','y',
@@ -5984,40 +5986,45 @@ static void update_external_font_keys(void)
struct gdi_font_family *family;
struct external_key *key, *next;
struct gdi_font_face *face;
- DWORD len, i = 0, type, dlen, vlen;
- WCHAR value[LF_FULLFACESIZE + 12], path[MAX_PATH + 4], *tmp;
+ DWORD len, i = 0;
+ WCHAR value[LF_FULLFACESIZE + 12], *tmp, *path;
+ char buffer[2048];
+ KEY_VALUE_FULL_INFORMATION *info = (KEY_VALUE_FULL_INFORMATION *)buffer;
WCHAR *file;
HKEY hkey;
- RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts",
- 0, NULL, 0, KEY_ALL_ACCESS, NULL, &winnt_key, NULL );
- RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Fonts",
- 0, NULL, 0, KEY_ALL_ACCESS, NULL, &win9x_key, NULL );
+ static const WCHAR external_fontsW[] = {'E','x','t','e','r','n','a','l',' ','F','o','n','t','s'};
+
+ winnt_key = reg_create_key( NULL, fonts_winnt_config_keyW, sizeof(fonts_winnt_config_keyW), 0, NULL );
+ win9x_key = reg_create_key( NULL, fonts_win9x_config_keyW, sizeof(fonts_win9x_config_keyW), 0, NULL );
/* enumerate the fonts and add external ones to the two keys */
- if (RegCreateKeyW( wine_fonts_key, L"External Fonts", &hkey )) return;
+ if (!(hkey = reg_create_key( wine_fonts_key, external_fontsW, sizeof(external_fontsW), 0, NULL )))
+ return;
- memcpy( path, nt_prefixW, sizeof(nt_prefixW) );
- vlen = ARRAY_SIZE(value);
- dlen = sizeof(path) - sizeof(nt_prefixW);
- while (!RegEnumValueW( hkey, i++, value, &vlen, NULL, &type, (BYTE *)path + sizeof(nt_prefixW), &dlen ))
+ while (reg_enum_value( hkey, i++, info, sizeof(buffer) - sizeof(nt_prefixW),
+ value, LF_FULLFACESIZE * sizeof(WCHAR) ))
{
- if (type != REG_SZ) goto next;
- if ((tmp = wcsrchr( value, ' ' )) && !facename_compare( tmp, L" (TrueType)", -1 )) *tmp = 0;
- if ((face = find_face_from_full_name( value )) &&
- !wcsicmp( face->file, path[5] == ':' ? path : path + ARRAYSIZE(nt_prefixW) ))
+ if (info->Type != REG_SZ) continue;
+
+ path = (WCHAR *)(buffer + info->DataOffset);
+ if (path[0] && path[1] == ':')
+ {
+ memmove( path, path + ARRAYSIZE(nt_prefixW), sizeof(nt_prefixW) );
+ memcpy( path, nt_prefixW, sizeof(nt_prefixW) );
+ }
+
+ if ((tmp = wcsrchr( value, ' ' )) && !facename_compare( tmp, true_type_suffixW, -1 )) *tmp = 0;
+ if ((face = find_face_from_full_name( value )) && !wcsicmp( face->file, path ))
{
face->flags |= ADDFONT_EXTERNAL_FOUND;
- goto next;
+ continue;
}
if (tmp && !*tmp) *tmp = ' ';
if (!(key = HeapAlloc( GetProcessHeap(), 0, sizeof(*key) ))) break;
lstrcpyW( key->value, value );
list_add_tail( &external_keys, &key->entry );
- next:
- vlen = ARRAY_SIZE(value);
- dlen = sizeof(path) - sizeof(nt_prefixW);
}
WINE_RB_FOR_EACH_ENTRY( family, &family_name_tree, struct gdi_font_family, name_entry )
@@ -6028,7 +6035,7 @@ static void update_external_font_keys(void)
if ((face->flags & ADDFONT_EXTERNAL_FOUND)) continue;
lstrcpyW( value, face->full_name );
- if (face->scalable) lstrcatW( value, L" (TrueType)" );
+ if (face->scalable) lstrcatW( value, true_type_suffixW );
if (face->file[0] == '\\')
{
@@ -6041,22 +6048,22 @@ static void update_external_font_keys(void)
file = face->file;
len = (lstrlenW(file) + 1) * sizeof(WCHAR);
- RegSetValueExW( winnt_key, value, 0, REG_SZ, (BYTE *)file, len );
- RegSetValueExW( win9x_key, value, 0, REG_SZ, (BYTE *)file, len );
- RegSetValueExW( hkey, value, 0, REG_SZ, (BYTE *)file, len );
+ set_reg_value( winnt_key, value, REG_SZ, file, len );
+ set_reg_value( win9x_key, value, REG_SZ, file, len );
+ set_reg_value( hkey, value, REG_SZ, file, len );
}
}
LIST_FOR_EACH_ENTRY_SAFE( key, next, &external_keys, struct external_key, entry )
{
- RegDeleteValueW( win9x_key, key->value );
- RegDeleteValueW( winnt_key, key->value );
- RegDeleteValueW( hkey, key->value );
+ reg_delete_value( win9x_key, key->value );
+ reg_delete_value( winnt_key, key->value );
+ reg_delete_value( hkey, key->value );
list_remove( &key->entry );
HeapFree( GetProcessHeap(), 0, key );
}
- RegCloseKey( win9x_key );
- RegCloseKey( winnt_key );
- RegCloseKey( hkey );
+ NtClose( win9x_key );
+ NtClose( winnt_key );
+ NtClose( hkey );
}
static void load_registry_fonts(void)
More information about the wine-cvs
mailing list