Module: wine Branch: master Commit: c1f8a0bf619d0100870b693a828e1759ced47db8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c1f8a0bf619d0100870b693a82...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Nov 1 12:35:32 2012 +0100
gdi32: Avoid some redundant registry calls while loading the font cache.
---
dlls/gdi32/freetype.c | 110 ++++++++++++++++++++----------------------------- 1 files changed, 45 insertions(+), 65 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 6af977c..58d3c5d 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -1298,11 +1298,15 @@ static Family *create_family( WCHAR *name, WCHAR *english_name )
static LONG reg_load_dword(HKEY hkey, const WCHAR *value, DWORD *data) { - DWORD type, needed; - LONG r = RegQueryValueExW(hkey, value, NULL, &type, NULL, &needed); - if(r != ERROR_SUCCESS) return r; - if(type != REG_DWORD || needed != sizeof(DWORD)) return ERROR_BAD_CONFIGURATION; - return RegQueryValueExW(hkey, value, NULL, &type, (BYTE*)data, &needed); + DWORD type, size = sizeof(DWORD); + + if (RegQueryValueExW(hkey, value, NULL, &type, (BYTE *)data, &size) || + type != REG_DWORD || size != sizeof(DWORD)) + { + *data = 0; + return ERROR_BAD_CONFIGURATION; + } + return ERROR_SUCCESS; }
static inline LONG reg_save_dword(HKEY hkey, const WCHAR *value, DWORD data) @@ -1310,30 +1314,26 @@ static inline LONG reg_save_dword(HKEY hkey, const WCHAR *value, DWORD data) return RegSetValueExW(hkey, value, 0, REG_DWORD, (BYTE*)&data, sizeof(DWORD)); }
-static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family) +static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family, void *buffer, DWORD buffer_size) { - DWORD needed; - DWORD num_strikes, max_strike_key_len; + DWORD needed, strike_index = 0; + HKEY hkey_strike;
/* If we have a File Name key then this is a real font, not just the parent key of a bunch of non-scalable strikes */ - if(RegQueryValueExA(hkey_face, "File Name", NULL, NULL, NULL, &needed) == ERROR_SUCCESS) + needed = buffer_size; + if(RegQueryValueExA(hkey_face, "File Name", NULL, NULL, buffer, &needed) == ERROR_SUCCESS) { Face *face; face = HeapAlloc(GetProcessHeap(), 0, sizeof(*face)); face->cached_enum_data = NULL;
- face->file = HeapAlloc(GetProcessHeap(), 0, needed); - RegQueryValueExA(hkey_face, "File Name", NULL, NULL, (BYTE*)face->file, &needed); - + face->file = strdupA( buffer ); face->StyleName = strdupW(face_name);
- if(RegQueryValueExW(hkey_face, face_full_name_value, NULL, NULL, NULL, &needed) == ERROR_SUCCESS) - { - WCHAR *fullName = HeapAlloc(GetProcessHeap(), 0, needed); - RegQueryValueExW(hkey_face, face_full_name_value, NULL, NULL, (BYTE*)fullName, &needed); - face->FullName = fullName; - } + needed = buffer_size; + if(RegQueryValueExW(hkey_face, face_full_name_value, NULL, NULL, buffer, &needed) == ERROR_SUCCESS) + face->FullName = strdupW( buffer ); else face->FullName = NULL;
@@ -1374,57 +1374,41 @@ static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family) TRACE("Added font %s %s\n", debugstr_w(family->FamilyName), debugstr_w(face->StyleName)); }
- /* do we have any bitmap strikes? */ - RegQueryInfoKeyW(hkey_face, NULL, NULL, NULL, &num_strikes, &max_strike_key_len, NULL, NULL, - NULL, NULL, NULL, NULL); - if(num_strikes != 0) - { - WCHAR strike_name[10]; - DWORD strike_index = 0; + /* load bitmap strikes */
- needed = sizeof(strike_name) / sizeof(WCHAR); - while(RegEnumKeyExW(hkey_face, strike_index++, strike_name, &needed, - NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + needed = buffer_size; + while (!RegEnumKeyExW(hkey_face, strike_index++, buffer, &needed, NULL, NULL, NULL, NULL)) + { + if (!RegOpenKeyExW(hkey_face, buffer, 0, KEY_ALL_ACCESS, &hkey_strike)) { - HKEY hkey_strike; - RegOpenKeyExW(hkey_face, strike_name, 0, KEY_ALL_ACCESS, &hkey_strike); - load_face(hkey_strike, face_name, family); + load_face(hkey_strike, face_name, family, buffer, buffer_size); RegCloseKey(hkey_strike); - needed = sizeof(strike_name) / sizeof(WCHAR); } + needed = buffer_size; } }
static void load_font_list_from_cache(HKEY hkey_font_cache) { - DWORD max_family_key_len, size; - WCHAR *family_name; - DWORD family_index = 0; + DWORD size, family_index = 0; Family *family; HKEY hkey_family; + WCHAR buffer[4096];
- RegQueryInfoKeyW(hkey_font_cache, NULL, NULL, NULL, NULL, &max_family_key_len, NULL, NULL, - NULL, NULL, NULL, NULL); - family_name = HeapAlloc(GetProcessHeap(), 0, (max_family_key_len + 1) * sizeof(WCHAR)); - - size = max_family_key_len + 1; - while(RegEnumKeyExW(hkey_font_cache, family_index++, family_name, &size, - NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + size = sizeof(buffer); + while (!RegEnumKeyExW(hkey_font_cache, family_index++, buffer, &size, NULL, NULL, NULL, NULL)) { WCHAR *english_family = NULL; + WCHAR *family_name = strdupW( buffer ); DWORD face_index = 0; - WCHAR *face_name; - DWORD max_face_key_len;
RegOpenKeyExW(hkey_font_cache, family_name, 0, KEY_ALL_ACCESS, &hkey_family); TRACE("opened family key %s\n", debugstr_w(family_name)); - if(RegQueryValueExW(hkey_family, english_name_value, NULL, NULL, NULL, &size) == ERROR_SUCCESS) - { - english_family = HeapAlloc(GetProcessHeap(), 0, size); - RegQueryValueExW(hkey_family, english_name_value, NULL, NULL, (BYTE*)english_family, &size); - } + size = sizeof(buffer); + if (!RegQueryValueExW(hkey_family, english_name_value, NULL, NULL, (BYTE *)buffer, &size)) + english_family = strdupW( buffer );
- family = create_family(strdupW(family_name), english_family); + family = create_family(family_name, english_family); list_add_tail(&font_list, &family->entry);
if(english_family) @@ -1437,27 +1421,23 @@ static void load_font_list_from_cache(HKEY hkey_font_cache) add_font_subst(&font_subst_list, subst, 0); }
- RegQueryInfoKeyW(hkey_family, NULL, NULL, NULL, NULL, &max_face_key_len, NULL, NULL, - NULL, NULL, NULL, NULL); - - face_name = HeapAlloc(GetProcessHeap(), 0, (max_face_key_len + 1) * sizeof(WCHAR)); - size = max_face_key_len + 1; - while(RegEnumKeyExW(hkey_family, face_index++, face_name, &size, - NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + size = sizeof(buffer); + while (!RegEnumKeyExW(hkey_family, face_index++, buffer, &size, NULL, NULL, NULL, NULL)) { + WCHAR *face_name = strdupW( buffer ); HKEY hkey_face;
- RegOpenKeyExW(hkey_family, face_name, 0, KEY_ALL_ACCESS, &hkey_face); - load_face(hkey_face, face_name, family); - RegCloseKey(hkey_face); - size = max_face_key_len + 1; + if (!RegOpenKeyExW(hkey_family, face_name, 0, KEY_ALL_ACCESS, &hkey_face)) + { + load_face(hkey_face, face_name, family, buffer, sizeof(buffer)); + RegCloseKey(hkey_face); + } + HeapFree( GetProcessHeap(), 0, face_name ); + size = sizeof(buffer); } - HeapFree(GetProcessHeap(), 0, face_name); RegCloseKey(hkey_family); - size = max_family_key_len + 1; + size = sizeof(buffer); } - - HeapFree(GetProcessHeap(), 0, family_name); }
static LONG create_font_cache_key(HKEY *hkey, DWORD *disposition)