[PATCH v2 2/2] gdi32: Add a vertical font replacement if it's a DBCS font.

Huw Davies huw at codeweavers.com
Thu Jun 4 04:43:15 CDT 2020


From: Akihiro Sagawa <sagawa.aki at gmail.com>

For example, if one maps MS Gothic to a font, also map @MS Gothic to
that font.

Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/gdi32/freetype.c | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 9801c32d65..f82a8c1641 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -288,6 +288,8 @@ typedef struct tagFace {
     struct enum_data *cached_enum_data;
 } Face;
 
+#define FS_DBCS_MASK (FS_JISJAPAN|FS_CHINESESIMP|FS_WANSUNG|FS_CHINESETRAD|FS_JOHAB)
+
 #define ADDFONT_EXTERNAL_FONT 0x01
 #define ADDFONT_ALLOW_BITMAP  0x02
 #define ADDFONT_ADD_TO_CACHE  0x04
@@ -618,6 +620,7 @@ static const WCHAR font_mutex_nameW[] = {'_','_','W','I','N','E','_','F','O','N'
 static const WCHAR szDefaultFallbackLink[] = {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0};
 static BOOL use_default_fallback = FALSE;
 
+static BOOL map_font_family(const WCHAR *orig, const WCHAR *repl);
 static BOOL get_glyph_index_linked(GdiFont *font, UINT c, GdiFont **linked_font, FT_UInt *glyph, BOOL *vert);
 static BOOL get_outline_text_metrics(GdiFont *font);
 static BOOL get_bitmap_text_metrics(GdiFont *font);
@@ -2270,7 +2273,6 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
 #endif /* HAVE_CARBON_CARBON_H */
 
     do {
-        const DWORD FS_DBCS_MASK = FS_JISJAPAN|FS_CHINESESIMP|FS_WANSUNG|FS_CHINESETRAD|FS_JOHAB;
         FONTSIGNATURE fs;
 
         ft_face = new_ft_face( file, font_data_ptr, font_data_size, face_index, flags & ADDFONT_ALLOW_BITMAP );
@@ -2360,6 +2362,30 @@ static void DumpFontList(void)
     }
 }
 
+static BOOL map_vertical_font_family(const WCHAR *orig, const WCHAR *repl, const Family *family)
+{
+    Face *face;
+    BOOL ret = FALSE;
+    WCHAR *at_orig, *at_repl = NULL;
+
+    face = LIST_ENTRY(list_head(&family->faces), Face, entry);
+    if (!face || !(face->fs.fsCsb[0] & FS_DBCS_MASK))
+        return FALSE;
+
+    at_orig = prepend_at(strdupW(orig));
+    if (at_orig && !find_family_from_any_name(at_orig))
+    {
+        at_repl = prepend_at(strdupW(repl));
+        if (at_repl)
+            ret = map_font_family(at_orig, at_repl);
+    }
+
+    HeapFree(GetProcessHeap(), 0, at_orig);
+    HeapFree(GetProcessHeap(), 0, at_repl);
+
+    return ret;
+}
+
 static BOOL map_font_family(const WCHAR *orig, const WCHAR *repl)
 {
     Family *family = find_family_from_any_name(repl);
@@ -2374,6 +2400,10 @@ static BOOL map_font_family(const WCHAR *orig, const WCHAR *repl)
             list_init(&new_family->faces);
             new_family->replacement = &family->faces;
             list_add_tail(&font_list, &new_family->entry);
+
+            if (repl[0] != '@')
+                map_vertical_font_family(orig, repl, family);
+
             return TRUE;
         }
     }
-- 
2.23.0




More information about the wine-devel mailing list