Module: wine Branch: master Commit: b544b748800e936e5dc008e3ef9203304b4b70e5 URL: https://source.winehq.org/git/wine.git/?a=commit;h=b544b748800e936e5dc008e3e...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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)