[PATCH] gdi32: For symbol fonts check whether the char has been converted to Unicode.

Huw Davies huw at codeweavers.com
Fri Jun 22 05:35:43 CDT 2018


From: Dmitry Timoshkov <dmitry at baikal.ru>

This means that Unicode versions of text functions can use the result
of a A->W conversion under CP_ACP.

It's required so that the following will work:
  hfont = CreateFont("Wingdings", SYMBOL_CHARSET);
  SendMessageA(hwnd, WM_SETFONT, hfont);
  SendMessageA(hwnd, WM_SETTEXT, textA);

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/gdi32/freetype.c | 57 ++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 41 insertions(+), 16 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 1293e08a73..b7e2413753 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -6303,24 +6303,47 @@ static FT_UInt get_GSUB_vert_glyph(const GdiFont *font, UINT glyph)
     return GSUB_apply_feature(header, feature, glyph);
 }
 
+static FT_UInt get_glyph_index_symbol(const GdiFont *font, UINT glyph)
+{
+    FT_UInt ret;
+
+    if (glyph < 0x100) glyph += 0xf000;
+    /* there are a number of old pre-Unicode "broken" TTFs, which
+       do have symbols at U+00XX instead of U+f0XX */
+    if (!(ret = pFT_Get_Char_Index(font->ft_face, glyph)))
+        ret = pFT_Get_Char_Index(font->ft_face, glyph - 0xf000);
+
+    return ret;
+}
+
 static FT_UInt get_glyph_index(const GdiFont *font, UINT glyph)
 {
-    FT_UInt glyphId;
+    FT_UInt ret;
+    WCHAR wc;
+    char buf;
 
-    if(font->ft_face->charmap->encoding == FT_ENCODING_NONE) {
-        WCHAR wc = (WCHAR)glyph;
+    if (font->ft_face->charmap->encoding == FT_ENCODING_NONE)
+    {
         BOOL default_used;
         BOOL *default_used_pointer;
-        FT_UInt ret;
-        char buf;
+
         default_used_pointer = NULL;
         default_used = FALSE;
         if (codepage_sets_default_used(font->codepage))
             default_used_pointer = &default_used;
-        if(!WideCharToMultiByte(font->codepage, 0, &wc, 1, &buf, sizeof(buf), NULL, default_used_pointer) || default_used)
+        wc = (WCHAR)glyph;
+        if (!WideCharToMultiByte(font->codepage, 0, &wc, 1, &buf, sizeof(buf), NULL, default_used_pointer) ||
+            default_used)
         {
-            if (font->codepage == CP_SYMBOL && wc < 0x100)
-                ret = pFT_Get_Char_Index(font->ft_face, (unsigned char)wc);
+            if (font->codepage == CP_SYMBOL)
+            {
+                ret = get_glyph_index_symbol(font, glyph);
+                if (!ret)
+                {
+                    if (WideCharToMultiByte(CP_ACP, 0, &wc, 1, &buf, 1, NULL, NULL))
+                        ret = get_glyph_index_symbol(font, buf);
+                }
+            }
             else
                 ret = 0;
         }
@@ -6330,17 +6353,19 @@ static FT_UInt get_glyph_index(const GdiFont *font, UINT glyph)
         return ret;
     }
 
-    if(font->ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL)
+    if (font->ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL)
     {
-        if (glyph < 0x100) glyph += 0xf000;
-        /* there is a number of old pre-Unicode "broken" TTFs, which
-           do have symbols at U+00XX instead of U+f0XX */
-        if (!(glyphId = pFT_Get_Char_Index(font->ft_face, glyph)))
-            glyphId = pFT_Get_Char_Index(font->ft_face, glyph-0xf000);
+        ret = get_glyph_index_symbol(font, glyph);
+        if (!ret)
+        {
+            wc = (WCHAR)glyph;
+            if (WideCharToMultiByte(CP_ACP, 0, &wc, 1, &buf, 1, NULL, NULL))
+                ret = get_glyph_index_symbol(font, (unsigned char)buf);
+        }
+        return ret;
     }
-    else glyphId = pFT_Get_Char_Index(font->ft_face, glyph);
 
-    return glyphId;
+    return pFT_Get_Char_Index(font->ft_face, glyph);
 }
 
 /* helper for freetype_GetGlyphIndices */
-- 
2.16.2




More information about the wine-devel mailing list