Rémi Bernon : gdi32: Look for another secondary font family name.

Alexandre Julliard julliard at winehq.org
Mon Sep 21 15:12:15 CDT 2020


Module: wine
Branch: master
Commit: d560182624fbe9ba901aaf7f91ab4b393c14a935
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d560182624fbe9ba901aaf7f91ab4b393c14a935

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Thu Sep 17 19:30:43 2020 +0200

gdi32: Look for another secondary font family name.

If English is the current locale, or if the primary langid does not
have a name in the font (in which case the English name is used), look
for another non-English name.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/freetype.c   | 60 ++++++++++++++++++++++++++++---------------------
 dlls/gdi32/tests/font.c |  4 ++--
 2 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index cf53f148ad..8658588234 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -301,7 +301,7 @@ typedef struct tagFamily {
     struct list entry;
     unsigned int refcount;
     WCHAR family_name[LF_FACESIZE];
-    WCHAR english_name[LF_FACESIZE];
+    WCHAR second_name[LF_FACESIZE];
     struct list faces;
     struct list *replacement;
 } Family;
@@ -574,7 +574,7 @@ typedef struct tagFontSubst {
 static const WCHAR wine_fonts_key[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
                                        'F','o','n','t','s',0};
 static const WCHAR wine_fonts_cache_key[] = {'C','a','c','h','e',0};
-static const WCHAR english_name_value[] = {'E','n','g','l','i','s','h',' ','N','a','m','e',0};
+static const WCHAR second_name_value[] = {'S','e','c','o','n','d',' ','N','a','m','e',0};
 static const WCHAR face_index_value[] = {'I','n','d','e','x',0};
 static const WCHAR face_ntmflags_value[] = {'N','t','m','f','l','a','g','s',0};
 static const WCHAR face_version_value[] = {'V','e','r','s','i','o','n',0};
@@ -1076,7 +1076,7 @@ static Family *find_family_from_any_name(const WCHAR *name)
     LIST_FOR_EACH_ENTRY(family, &font_list, Family, entry)
     {
         if (!strncmpiW( family->family_name, name, LF_FACESIZE - 1 )) return family;
-        if (!strncmpiW( family->english_name, name, LF_FACESIZE - 1 )) return family;
+        if (!strncmpiW( family->second_name, name, LF_FACESIZE - 1 )) return family;
     }
 
     return NULL;
@@ -1415,6 +1415,7 @@ static int match_name_table_language( const FT_SfntName *name, LANGID lang )
     if (name_lang == lang) res += 30;
     else if (PRIMARYLANGID( name_lang ) == PRIMARYLANGID( lang )) res += 20;
     else if (name_lang == MAKELANGID( LANG_ENGLISH, SUBLANG_DEFAULT )) res += 10;
+    else if (lang == MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL )) res += 5 * (0x100000 - name_lang);
     return res;
 }
 
@@ -1623,13 +1624,13 @@ static BOOL insert_face_in_family_list( Face *face, Family *family )
  * NB This function stores the ptrs to the strings to save copying.
  * Don't free them after calling.
  */
-static Family *create_family( WCHAR *family_name, WCHAR *english_name )
+static Family *create_family( WCHAR *family_name, WCHAR *second_name )
 {
     Family * const family = HeapAlloc( GetProcessHeap(), 0, sizeof(*family) );
     family->refcount = 1;
     lstrcpynW( family->family_name, family_name, LF_FACESIZE );
-    if (english_name) lstrcpynW( family->english_name, english_name, LF_FACESIZE );
-    else family->english_name[0] = 0;
+    if (second_name) lstrcpynW( family->second_name, second_name, LF_FACESIZE );
+    else family->second_name[0] = 0;
     list_init( &family->faces );
     family->replacement = &family->faces;
     list_add_tail( &font_list, &family->entry );
@@ -1794,22 +1795,22 @@ static void load_font_list_from_cache(HKEY hkey_font_cache)
     size = sizeof(buffer);
     while (!RegEnumKeyExW(hkey_font_cache, family_index++, buffer, &size, NULL, NULL, NULL, NULL))
     {
-        WCHAR *english_name = NULL;
+        WCHAR *second_name = NULL;
         WCHAR *family_name = strdupW( buffer );
         DWORD face_index = 0;
 
         RegOpenKeyExW(hkey_font_cache, family_name, 0, KEY_ALL_ACCESS, &hkey_family);
         TRACE("opened family key %s\n", debugstr_w(family_name));
         size = sizeof(buffer);
-        if (!RegQueryValueExW(hkey_family, english_name_value, NULL, NULL, (BYTE *)buffer, &size))
-            english_name = strdupW( buffer );
+        if (!RegQueryValueExW( hkey_family, second_name_value, NULL, NULL, (BYTE *)buffer, &size ))
+            second_name = strdupW( buffer );
 
-        family = create_family( family_name, english_name );
+        family = create_family( family_name, second_name );
 
-        if (english_name)
+        if (second_name)
         {
             FontSubst *subst = HeapAlloc(GetProcessHeap(), 0, sizeof(*subst));
-            subst->from.name = strdupW( english_name );
+            subst->from.name = strdupW( second_name );
             subst->from.charset = -1;
             subst->to.name = strdupW(family_name);
             subst->to.charset = -1;
@@ -1832,7 +1833,7 @@ static void load_font_list_from_cache(HKEY hkey_font_cache)
         }
 
         HeapFree( GetProcessHeap(), 0, family_name );
-        HeapFree( GetProcessHeap(), 0, english_name );
+        HeapFree( GetProcessHeap(), 0, second_name );
 
         RegCloseKey(hkey_family);
         release_family( family );
@@ -1869,9 +1870,9 @@ static void add_face_to_cache(Face *face)
 
     RegCreateKeyExW( hkey_font_cache, face->family->family_name, 0, NULL, REG_OPTION_VOLATILE,
                      KEY_ALL_ACCESS, NULL, &hkey_family, NULL );
-    if (face->family->english_name[0])
-        RegSetValueExW( hkey_family, english_name_value, 0, REG_SZ, (BYTE *)face->family->english_name,
-                        (strlenW( face->family->english_name ) + 1) * sizeof(WCHAR) );
+    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->scalable) face_key_name = face->style_name;
     else
@@ -1947,28 +1948,35 @@ static WCHAR *get_vertical_name( WCHAR *name )
 static Family *get_family( FT_Face ft_face, BOOL vertical )
 {
     Family *family;
-    WCHAR *family_name, *english_name;
+    WCHAR *family_name, *second_name;
 
     family_name = ft_face_get_family_name( ft_face, GetSystemDefaultLCID() );
-    english_name = ft_face_get_family_name( ft_face, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) );
+    second_name = ft_face_get_family_name( ft_face, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) );
 
-    if (!strcmpiW( family_name, english_name ))
+    /* try to find another secondary name, preferring the lowest langids */
+    if (!strcmpiW( family_name, second_name ))
     {
-        HeapFree( GetProcessHeap(), 0, english_name );
-        english_name = NULL;
+        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 );
-        english_name = get_vertical_name( english_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, english_name )) && english_name)
+    else if ((family = create_family( family_name, second_name )) && second_name)
     {
         FontSubst *subst = HeapAlloc( GetProcessHeap(), 0, sizeof(*subst) );
-        subst->from.name = strdupW( english_name );
+        subst->from.name = strdupW( second_name );
         subst->from.charset = -1;
         subst->to.name = strdupW( family_name );
         subst->to.charset = -1;
@@ -1976,7 +1984,7 @@ static Family *get_family( FT_Face ft_face, BOOL vertical )
     }
 
     HeapFree( GetProcessHeap(), 0, family_name );
-    HeapFree( GetProcessHeap(), 0, english_name );
+    HeapFree( GetProcessHeap(), 0, second_name );
 
     return family;
 }
@@ -2411,7 +2419,7 @@ static BOOL map_font_family(const WCHAR *orig, const WCHAR *repl)
         {
             TRACE("mapping %s to %s\n", debugstr_w(repl), debugstr_w(orig));
             lstrcpynW( new_family->family_name, orig, LF_FACESIZE );
-            new_family->english_name[0] = 0;
+            new_family->second_name[0] = 0;
             list_init(&new_family->faces);
             new_family->replacement = &family->faces;
             list_add_tail(&font_list, &new_family->entry);
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 33dcc3b31a..0ada22d95d 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -7208,7 +7208,7 @@ static void test_lang_names(void)
         memset( &efnd, 0, sizeof(efnd) );
         EnumFontFamiliesExA( dc, &font, enum_fullname_data_proc, (LPARAM)&efnd, 0 );
         if (PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH)
-            todo_wine ok( efnd.total == min( 2, i + 1 ), "%d: EnumFontFamiliesExA unexpected count %u.\n", i, efnd.total );
+            ok( efnd.total == min( 2, i + 1 ), "%d: EnumFontFamiliesExA unexpected count %u.\n", i, efnd.total );
         else /* (zh-tw) doesn't match here probably because there's an (en) name too */
             ok( efnd.total == 0, "%d: EnumFontFamiliesExA unexpected count %u.\n", i, efnd.total );
 
@@ -7222,7 +7222,7 @@ static void test_lang_names(void)
         memset( &efnd, 0, sizeof(efnd) );
         EnumFontFamiliesExA( dc, &font, enum_fullname_data_proc, (LPARAM)&efnd, 0 );
         /* as wine_langnames3.sfd does not specify (en) name, (fr) is preferred */
-        if (i == 2) todo_wine ok( efnd.total == 1, "%d: EnumFontFamiliesExA unexpected count %u.\n", i, efnd.total );
+        if (i == 2) ok( efnd.total == 1, "%d: EnumFontFamiliesExA unexpected count %u.\n", i, efnd.total );
         else ok( efnd.total == 0, "%d: EnumFontFamiliesExA unexpected count %u.\n", i, efnd.total );
 
         strcpy( font.lfFaceName, "Wine Lang Cond (ko)" );




More information about the wine-cvs mailing list