Alexandre Julliard : gdi32: Avoid some redundant registry calls while loading the font cache.
Alexandre Julliard
julliard at winehq.org
Thu Nov 1 14:42:58 CDT 2012
Module: wine
Branch: master
Commit: c1f8a0bf619d0100870b693a828e1759ced47db8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c1f8a0bf619d0100870b693a828e1759ced47db8
Author: Alexandre Julliard <julliard at 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)
More information about the wine-cvs
mailing list