[PATCH 4/4] gdi32: Store family and second names on font faces.

Rémi Bernon rbernon at codeweavers.com
Thu Sep 24 06:41:12 CDT 2020


We will use these names to find or create the corresponding family.

Keeping these names on the face will allow us to fill them when parsing
the face by hand, or in the FreeType parsing fallback, making family
creation independent of FreeType usage.

This also saves the GetEnumStructs family name parameter, making it
independent of FreeType parsing too.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/gdi32/freetype.c | 113 ++++++++++++++++++++----------------------
 1 file changed, 55 insertions(+), 58 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 51c67514856..0071db3d4fc 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -269,6 +269,8 @@ struct enum_data
 typedef struct tagFace {
     struct list entry;
     unsigned int refcount;
+    WCHAR *family_name;
+    WCHAR *second_name;
     WCHAR *style_name;
     WCHAR *full_name;
     WCHAR *file;
@@ -1594,6 +1596,8 @@ static void release_face( Face *face )
         release_family( face->family );
     }
     HeapFree( GetProcessHeap(), 0, face->file );
+    HeapFree( GetProcessHeap(), 0, face->family_name );
+    HeapFree( GetProcessHeap(), 0, face->second_name );
     HeapFree( GetProcessHeap(), 0, face->style_name );
     HeapFree( GetProcessHeap(), 0, face->full_name );
     HeapFree( GetProcessHeap(), 0, face->cached_enum_data );
@@ -1717,7 +1721,8 @@ 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, void *buffer, DWORD buffer_size)
+static void load_face( HKEY hkey_face, WCHAR *face_name, WCHAR *family_name, WCHAR *second_name,
+                       Family *family, void *buffer, DWORD buffer_size )
 {
     DWORD needed, strike_index = 0;
     HKEY hkey_strike;
@@ -1735,6 +1740,8 @@ static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family, void *bu
         face->refcount = 1;
         face->file = strdupW( buffer );
         face->style_name = strdupW( face_name );
+        face->family_name = strdupW( family_name );
+        if (second_name) face->second_name = strdupW( second_name );
 
         needed = buffer_size;
         if (RegQueryValueExW( hkey_face, face_full_name_value, NULL, NULL, buffer, &needed ) != ERROR_SUCCESS)
@@ -1791,7 +1798,7 @@ static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family, void *bu
     {
         if (!RegOpenKeyExW(hkey_face, buffer, 0, KEY_ALL_ACCESS, &hkey_strike))
         {
-            load_face(hkey_strike, face_name, family, buffer, buffer_size);
+            load_face( hkey_strike, face_name, family_name, second_name, family, buffer, buffer_size );
             RegCloseKey(hkey_strike);
         }
         needed = buffer_size;
@@ -1870,7 +1877,7 @@ static void load_font_list_from_cache(HKEY hkey_font_cache)
 
             if (!RegOpenKeyExW(hkey_family, face_name, 0, KEY_ALL_ACCESS, &hkey_face))
             {
-                load_face(hkey_face, face_name, family, buffer, sizeof(buffer));
+                load_face( hkey_face, face_name, family_name, second_name, family, buffer, sizeof(buffer) );
                 RegCloseKey(hkey_face);
             }
             HeapFree( GetProcessHeap(), 0, face_name );
@@ -1913,11 +1920,11 @@ static void add_face_to_cache(Face *face)
     HKEY hkey_family, hkey_face;
     WCHAR *face_key_name;
 
-    RegCreateKeyExW( hkey_font_cache, face->family->family_name, 0, NULL, REG_OPTION_VOLATILE,
+    RegCreateKeyExW( hkey_font_cache, face->family_name, 0, NULL, REG_OPTION_VOLATILE,
                      KEY_ALL_ACCESS, NULL, &hkey_family, NULL );
-    if (face->family->second_name[0])
-        RegSetValueExW( hkey_family, second_name_value, 0, REG_SZ, (BYTE *)face->family->second_name,
-                        (strlenW( face->family->second_name ) + 1) * sizeof(WCHAR) );
+    if (face->second_name)
+        RegSetValueExW( hkey_family, second_name_value, 0, REG_SZ, (BYTE *)face->second_name,
+                        (strlenW( face->second_name ) + 1) * sizeof(WCHAR) );
 
     if (face->scalable) face_key_name = face->style_name;
     else
@@ -1960,7 +1967,7 @@ static void remove_face_from_cache( Face *face )
 {
     HKEY hkey_family;
 
-    RegOpenKeyExW( hkey_font_cache, face->family->family_name, 0, KEY_ALL_ACCESS, &hkey_family );
+    RegOpenKeyExW( hkey_font_cache, face->family_name, 0, KEY_ALL_ACCESS, &hkey_family );
 
     if (face->scalable)
     {
@@ -1990,47 +1997,21 @@ static WCHAR *get_vertical_name( WCHAR *name )
     return name;
 }
 
-static Family *get_family( FT_Face ft_face, BOOL vertical )
+static Family *face_get_family( Face *face )
 {
     Family *family;
-    WCHAR *family_name, *second_name;
-
-    family_name = ft_face_get_family_name( ft_face, GetSystemDefaultLCID() );
-    second_name = ft_face_get_family_name( ft_face, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) );
-
-    /* try to find another secondary name, preferring the lowest langids */
-    if (!strcmpiW( family_name, second_name ))
-    {
-        HeapFree( GetProcessHeap(), 0, second_name );
-        second_name = ft_face_get_family_name( ft_face, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL) );
-    }
-
-    if (!strcmpiW( family_name, second_name ))
-    {
-        HeapFree( GetProcessHeap(), 0, second_name );
-        second_name = NULL;
-    }
-
-    if (vertical)
-    {
-        family_name = get_vertical_name( family_name );
-        second_name = get_vertical_name( second_name );
-    }
 
-    if ((family = find_family_from_name( family_name ))) family->refcount++;
-    else if ((family = create_family( family_name, second_name )) && second_name)
+    if ((family = find_family_from_name( face->family_name ))) family->refcount++;
+    else if ((family = create_family( face->family_name, face->second_name )) && face->second_name)
     {
         FontSubst *subst = HeapAlloc( GetProcessHeap(), 0, sizeof(*subst) );
-        subst->from.name = strdupW( second_name );
+        subst->from.name = strdupW( face->second_name );
         subst->from.charset = -1;
-        subst->to.name = strdupW( family_name );
+        subst->to.name = strdupW( face->family_name );
         subst->to.charset = -1;
         add_font_subst( &font_subst_list, subst, 0 );
     }
 
-    HeapFree( GetProcessHeap(), 0, family_name );
-    HeapFree( GetProcessHeap(), 0, second_name );
-
     return family;
 }
 
@@ -2156,9 +2137,31 @@ static inline void get_fontsig( FT_Face ft_face, FONTSIGNATURE *fs )
 
 static void face_init_from_ft_face( Face *face, FT_Face ft_face )
 {
+    face->family_name = ft_face_get_family_name( ft_face, GetSystemDefaultLCID() );
+    face->second_name = ft_face_get_family_name( ft_face, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) );
+
+    /* try to find another secondary name, preferring the lowest langids */
+    if (!strcmpiW( face->family_name, face->second_name ))
+    {
+        HeapFree( GetProcessHeap(), 0, face->second_name );
+        face->second_name = ft_face_get_family_name( ft_face, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL) );
+    }
+
+    if (!strcmpiW( face->family_name, face->second_name ))
+    {
+        HeapFree( GetProcessHeap(), 0, face->second_name );
+        face->second_name = NULL;
+    }
+
     face->style_name = ft_face_get_style_name( ft_face, GetSystemDefaultLangID() );
     face->full_name = ft_face_get_full_name( ft_face, GetSystemDefaultLangID() );
-    if (face->flags & ADDFONT_VERTICAL_FONT) face->full_name = get_vertical_name( face->full_name );
+
+    if (face->flags & ADDFONT_VERTICAL_FONT)
+    {
+        face->family_name = get_vertical_name( face->family_name );
+        face->second_name = get_vertical_name( face->second_name );
+        face->full_name = get_vertical_name( face->full_name );
+    }
 
     get_fontsig( ft_face, &face->fs );
     face->ntmFlags = get_ntm_flags( ft_face );
@@ -2172,10 +2175,10 @@ static void face_init_from_ft_face( Face *face, FT_Face ft_face )
           face->fs.fsUsb[2], face->fs.fsUsb[3]);
 }
 
-static BOOL face_insert_in_family( Face *face, FT_Face ft_face )
+static BOOL face_insert_in_family( Face *face )
 {
     Family *family;
-    if (!(family = get_family( ft_face, face->flags & ADDFONT_VERTICAL_FONT ))) return FALSE;
+    if (!(family = face_get_family( face ))) return FALSE;
 
     if (insert_face_in_family_list( face, family ))
     {
@@ -2301,14 +2304,13 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
         if (!(ft_face = new_ft_face( file, font_data_ptr, font_data_size, face_index, flags & ADDFONT_ALLOW_BITMAP )))
             goto failed;
 
-        if (ft_face->family_name[0] == '.') /* Ignore fonts with names beginning with a dot */
+        face_init_from_ft_face( face, ft_face );
+        if (face->family_name[0] == '.') /* Ignore fonts with names beginning with a dot */
         {
             TRACE( "Ignoring %s since its family name begins with a dot\n", debugstr_a(file) );
             goto failed;
         }
-
-        face_init_from_ft_face( face, ft_face );
-        if (!face_insert_in_family( face, ft_face )) goto failed;
+        if (!face_insert_in_family( face )) goto failed;
         ++ret;
 
         if (face->fs.fsCsb[0] & FS_DBCS_MASK)
@@ -2317,7 +2319,7 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
             if (!(face = create_face( file, face_index, font_data_ptr, font_data_size, flags | ADDFONT_VERTICAL_FONT )))
                 goto failed;
             face_init_from_ft_face( face, ft_face );
-            if (!face_insert_in_family( face, ft_face )) goto failed;
+            if (!face_insert_in_family( face )) goto failed;
             ++ret;
         }
 
@@ -3518,14 +3520,12 @@ struct fontdir
 
 #include <poppack.h>
 
-static void GetEnumStructs(Face *face, const WCHAR *family_name, LPENUMLOGFONTEXW pelf,
-                           NEWTEXTMETRICEXW *pntm, LPDWORD ptype);
+static void GetEnumStructs( Face *face, LPENUMLOGFONTEXW pelf, NEWTEXTMETRICEXW *pntm, LPDWORD ptype );
 
 static BOOL get_fontdir( const char *unix_name, struct fontdir *fd )
 {
     FT_Face ft_face;
     Face *face;
-    WCHAR *family_name;
     ENUMLOGFONTEXW elf;
     NEWTEXTMETRICEXW ntm;
     DWORD type;
@@ -3537,12 +3537,10 @@ static BOOL get_fontdir( const char *unix_name, struct fontdir *fd )
         return FALSE;
     }
     face_init_from_ft_face( face, ft_face );
-    family_name = ft_face_get_family_name( ft_face, GetSystemDefaultLCID() );
     pFT_Done_Face( ft_face );
 
-    GetEnumStructs( face, family_name, &elf, &ntm, &type );
+    GetEnumStructs( face, &elf, &ntm, &type );
     release_face( face );
-    HeapFree( GetProcessHeap(), 0, family_name );
 
     if ((type & TRUETYPE_FONTTYPE) == 0) return FALSE;
 
@@ -6139,8 +6137,7 @@ static DWORD create_enum_charset_list(DWORD charset, struct enum_charset_list *l
     return n;
 }
 
-static void GetEnumStructs(Face *face, const WCHAR *family_name, LPENUMLOGFONTEXW pelf,
-			   NEWTEXTMETRICEXW *pntm, LPDWORD ptype)
+static void GetEnumStructs( Face *face, LPENUMLOGFONTEXW pelf, NEWTEXTMETRICEXW *pntm, LPDWORD ptype )
 {
     GdiFont *font;
     LONG width, height;
@@ -6171,7 +6168,7 @@ static void GetEnumStructs(Face *face, const WCHAR *family_name, LPENUMLOGFONTEX
         return;
     }
 
-    font->name = strdupW( family_name );
+    font->name = strdupW( face->family_name );
     font->ntmFlags = face->ntmFlags;
 
     if (get_outline_text_metrics(font))
@@ -6200,7 +6197,7 @@ static void GetEnumStructs(Face *face, const WCHAR *family_name, LPENUMLOGFONTEX
         pntm->ntmTm.ntmCellHeight = pntm->ntmTm.tmHeight;
         pntm->ntmTm.ntmAvgWidth = pntm->ntmTm.tmAveCharWidth;
 
-        lstrcpynW(pelf->elfLogFont.lfFaceName, family_name, LF_FACESIZE);
+        lstrcpynW( pelf->elfLogFont.lfFaceName, face->family_name, LF_FACESIZE );
         lstrcpynW( pelf->elfFullName, face->full_name, LF_FULLFACESIZE );
         lstrcpynW( pelf->elfStyle, face->style_name, LF_FACESIZE );
     }
@@ -6271,7 +6268,7 @@ static BOOL enum_face_charsets(const Family *family, Face *face, struct enum_cha
     DWORD type = 0;
     DWORD i;
 
-    GetEnumStructs( face, face->family->family_name, &elf, &ntm, &type );
+    GetEnumStructs( face, &elf, &ntm, &type );
     for(i = 0; i < list->total; i++) {
         if(!face->scalable && face->fs.fsCsb[0] == 0) { /* OEM bitmap */
             elf.elfLogFont.lfCharSet = ntm.ntmTm.tmCharSet = OEM_CHARSET;
-- 
2.28.0




More information about the wine-devel mailing list