From 5b89e663af7e5e23c46cde20705f3c75dbd5de0b Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Thu, 16 Aug 2018 21:38:46 +0900 Subject: [PATCH 1/1] [FONT][WIN32SS] Support MS symbol encoding (#759) This commit adds support for the MS symbol encoding (FT_ENCODING_MS_SYMBOL) in our font engine. It also fixes the display of the Anastasia font. And replacing our Marlett font with Windows' Marlett font is also fixed. CORE-13269, CORE-14907 --- win32ss/gdi/ntgdi/freetype.c | 116 ++++++++++++++++++++++------------- 1 file changed, 73 insertions(+), 43 deletions(-) diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c index 31d68a16154..118b7444e42 100644 --- a/win32ss/gdi/ntgdi/freetype.c +++ b/win32ss/gdi/ntgdi/freetype.c @@ -1536,8 +1536,11 @@ static BOOL face_has_symbol_charmap(FT_Face ft_face) for(i = 0; i < ft_face->num_charmaps; i++) { - if(ft_face->charmaps[i]->encoding == FT_ENCODING_MS_SYMBOL) + if (ft_face->charmaps[i]->platform_id == TT_PLATFORM_MICROSOFT && + ft_face->charmaps[i]->encoding == FT_ENCODING_MS_SYMBOL) + { return TRUE; + } } return FALSE; } @@ -3155,19 +3158,31 @@ TextIntUpdateSize(PDC dc, for (n = 0; n < face->num_charmaps; n++) { charmap = face->charmaps[n]; - DPRINT("Found charmap encoding: %i\n", charmap->encoding); - if (charmap->encoding != 0) + if (charmap->encoding == FT_ENCODING_UNICODE) { found = charmap; break; } } if (!found) + { + for (n = 0; n < face->num_charmaps; n++) + { + charmap = face->charmaps[n]; + if (charmap->encoding == FT_ENCODING_MS_SYMBOL) + { + found = charmap; + break; + } + } + } + if (!found) { DPRINT1("WARNING: Could not find desired charmap!\n"); } else { + DPRINT("Found charmap encoding: %i\n", found->encoding); error = FT_Set_Charmap(face, found); if (error) { @@ -3192,6 +3207,49 @@ TextIntUpdateSize(PDC dc, return TRUE; } +static inline FT_UInt FASTCALL +get_glyph_index_symbol(FT_Face ft_face, 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 = FT_Get_Char_Index(ft_face, glyph))) + ret = FT_Get_Char_Index(ft_face, glyph - 0xf000); + + return ret; +} + +static inline FT_UInt FASTCALL +get_glyph_index(FT_Face ft_face, UINT glyph) +{ + FT_UInt ret; + + if (face_has_symbol_charmap(ft_face)) + { + ret = get_glyph_index_symbol(ft_face, glyph); + if (ret != 0) + return ret; + } + + return FT_Get_Char_Index(ft_face, glyph); +} + +static inline FT_UInt FASTCALL +get_glyph_index_flagged(FT_Face face, FT_ULong code, DWORD indexed_flag, DWORD flags) +{ + FT_UInt glyph_index; + if (flags & indexed_flag) + { + glyph_index = code; + } + else + { + glyph_index = get_glyph_index(face, code); + } + return glyph_index; +} /* * Based on WineEngGetGlyphOutline @@ -3280,12 +3338,8 @@ ftGdiGetGlyphOutline( TEXTOBJ_UnlockText(TextObj); - if (iFormat & GGO_GLYPH_INDEX) - { - glyph_index = wch; - iFormat &= ~GGO_GLYPH_INDEX; - } - else glyph_index = FT_Get_Char_Index(ft_face, wch); + glyph_index = get_glyph_index_flagged(ft_face, wch, GGO_GLYPH_INDEX, iFormat); + iFormat &= ~GGO_GLYPH_INDEX; if (orientation || (iFormat != GGO_METRICS && iFormat != GGO_BITMAP) || aveWidth || pmat2) load_flags |= FT_LOAD_NO_BITMAP; @@ -3727,10 +3781,7 @@ TextIntGetTextExtentPoint(PDC dc, for (i = 0; i < Count; i++) { - if (fl & GTEF_INDICES) - glyph_index = *String; - else - glyph_index = FT_Get_Char_Index(face, *String); + glyph_index = get_glyph_index_flagged(face, *String, GTEF_INDICES, fl); if (EmuBold || EmuItalic) realglyph = NULL; @@ -5503,10 +5554,7 @@ GreExtTextOutW( for (i = iStart; i < Count; i++) { - if (fuOptions & ETO_GLYPH_INDEX) - glyph_index = *TempText; - else - glyph_index = FT_Get_Char_Index(face, *TempText); + glyph_index = get_glyph_index_flagged(face, *TempText, ETO_GLYPH_INDEX, fuOptions); if (EmuBold || EmuItalic) realglyph = NULL; @@ -5608,10 +5656,7 @@ GreExtTextOutW( BackgroundLeft = (RealXStart + 32) >> 6; for (i = 0; i < Count; ++i) { - if (fuOptions & ETO_GLYPH_INDEX) - glyph_index = String[i]; - else - glyph_index = FT_Get_Char_Index(face, String[i]); + glyph_index = get_glyph_index_flagged(face, String[i], ETO_GLYPH_INDEX, fuOptions); error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); if (error) @@ -5726,10 +5771,7 @@ GreExtTextOutW( BackgroundLeft = (RealXStart + 32) >> 6; for (i = 0; i < Count; ++i) { - if (fuOptions & ETO_GLYPH_INDEX) - glyph_index = String[i]; - else - glyph_index = FT_Get_Char_Index(face, String[i]); + glyph_index = get_glyph_index_flagged(face, String[i], ETO_GLYPH_INDEX, fuOptions); if (EmuBold || EmuItalic) realglyph = NULL; @@ -6271,17 +6313,11 @@ NtGdiGetCharABCWidthsW( if (Safepwch) { - if (fl & GCABCW_INDICES) - glyph_index = Safepwch[i - FirstChar]; - else - glyph_index = FT_Get_Char_Index(face, Safepwch[i - FirstChar]); + glyph_index = get_glyph_index_flagged(face, Safepwch[i - FirstChar], GCABCW_INDICES, fl); } else { - if (fl & GCABCW_INDICES) - glyph_index = i; - else - glyph_index = FT_Get_Char_Index(face, i); + glyph_index = get_glyph_index_flagged(face, i, GCABCW_INDICES, fl); } FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); @@ -6465,17 +6501,11 @@ NtGdiGetCharWidthW( { if (Safepwc) { - if (fl & GCW_INDICES) - glyph_index = Safepwc[i - FirstChar]; - else - glyph_index = FT_Get_Char_Index(face, Safepwc[i - FirstChar]); + glyph_index = get_glyph_index_flagged(face, Safepwc[i - FirstChar], GCW_INDICES, fl); } else { - if (fl & GCW_INDICES) - glyph_index = i; - else - glyph_index = FT_Get_Char_Index(face, i); + glyph_index = get_glyph_index_flagged(face, i, GCW_INDICES, fl); } FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); if (!fl) @@ -6587,7 +6617,7 @@ NtGdiGetGlyphIndicesW( if (FT_IS_SFNT(Face)) { TT_OS2 *pOS2 = FT_Get_Sfnt_Table(Face, ft_sfnt_os2); - DefChar = (pOS2->usDefaultChar ? FT_Get_Char_Index(Face, pOS2->usDefaultChar) : 0); + DefChar = (pOS2->usDefaultChar ? get_glyph_index(Face, pOS2->usDefaultChar) : 0); } else { @@ -6631,7 +6661,7 @@ NtGdiGetGlyphIndicesW( for (i = 0; i < cwc; i++) { - Buffer[i] = FT_Get_Char_Index(FontGDI->SharedFace->Face, Safepwc[i]); + Buffer[i] = get_glyph_index(FontGDI->SharedFace->Face, Safepwc[i]); if (Buffer[i] == 0) { Buffer[i] = DefChar; -- 2.17.1