Index: reactos/win32ss/gdi/ntgdi/freetype.c =================================================================== --- reactos/win32ss/gdi/ntgdi/freetype.c (revision 74543) +++ reactos/win32ss/gdi/ntgdi/freetype.c (working copy) @@ -3005,6 +3005,25 @@ return TRUE; } +static FT_UInt +IntGetGlyphIndex(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 = FT_Get_Char_Index(face, code); + if (glyph_index == 0 && code < 0x100) + { + /* use M$ symbol area */ + glyph_index = FT_Get_Char_Index(face, code | 0xF000); + } + } + return glyph_index; +} /* * Based on WineEngGetGlyphOutline @@ -3086,12 +3105,8 @@ 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 = IntGetGlyphIndex(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; @@ -3520,10 +3535,7 @@ for (i = 0; i < Count; i++) { - if (fl & GTEF_INDICES) - glyph_index = *String; - else - glyph_index = FT_Get_Char_Index(face, *String); + glyph_index = IntGetGlyphIndex(face, *String, GTEF_INDICES, fl); if (EmuBold || EmuItalic) realglyph = NULL; @@ -5351,10 +5363,8 @@ 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 = IntGetGlyphIndex(face, *TempText, ETO_GLYPH_INDEX, + fuOptions); if (EmuBold || EmuItalic) realglyph = NULL; @@ -5462,10 +5472,8 @@ 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 = IntGetGlyphIndex(face, String[i], ETO_GLYPH_INDEX, + fuOptions); error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); if (error) @@ -5576,10 +5584,8 @@ 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 = IntGetGlyphIndex(face, String[i], ETO_GLYPH_INDEX, + fuOptions); if (EmuBold || EmuItalic) realglyph = NULL; @@ -6123,17 +6129,12 @@ if (Safepwch) { - if (fl & GCABCW_INDICES) - glyph_index = Safepwch[i - FirstChar]; - else - glyph_index = FT_Get_Char_Index(face, Safepwch[i - FirstChar]); + glyph_index = IntGetGlyphIndex(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 = IntGetGlyphIndex(face, i, GCABCW_INDICES, fl); } FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); @@ -6317,17 +6318,12 @@ { if (Safepwc) { - if (fl & GCW_INDICES) - glyph_index = Safepwc[i - FirstChar]; - else - glyph_index = FT_Get_Char_Index(face, Safepwc[i - FirstChar]); + glyph_index = IntGetGlyphIndex(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 = IntGetGlyphIndex(face, i, GCW_INDICES, fl); } FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); if (!fl) @@ -6482,7 +6478,7 @@ for (i = 0; i < cwc; i++) { - Buffer[i] = FT_Get_Char_Index(FontGDI->SharedFace->Face, Safepwc[i]); + Buffer[i] = IntGetGlyphIndex(FontGDI->SharedFace->Face, Safepwc[i], 0, 0); if (Buffer[i] == 0) { Buffer[i] = DefChar;