Dmitry Timoshkov : gdi32: For symbol fonts check whether the char has been converted to Unicode.
Alexandre Julliard
julliard at winehq.org
Fri Jun 22 18:32:37 CDT 2018
Module: wine
Branch: master
Commit: c1f742021fe4898345e9b0ae6b76e8eebcf0f95e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c1f742021fe4898345e9b0ae6b76e8eebcf0f95e
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Fri Jun 22 11:35:43 2018 +0100
gdi32: For symbol fonts check whether the char has been converted to Unicode.
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>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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 1293e08..b7e2413 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 */
More information about the wine-cvs
mailing list