Рассмотрим следующий пример. Он использует freetype
(через оболочку Python) для загрузки шрифта, а затем подсчитывает glyphs
.
import freetype as FT
f = FT.Face('/usr/share/fonts/truetype/Hack-Regular.ttf')
f.num_glyphs
# 1573
len([*f.get_chars()])
# 1549
Как видите, число, полученное в результате подсчета, не совпадает с числом, сообщаемым библиотекой при прямом запросе.
Почему?
Примечание. Знание оболочки python не обязательно для решения этого вопроса. Используемые здесь функции Python представляют собой тонкие оболочки функций из C-API. Соответствующие биты
get_chars
использует FT_Get_First_Char
и FT_Get_Next_Char
для перебора всех (?) предоставленных символов
charcode, agindex = self.get_first_char()
yield charcode, agindex
while agindex != 0:
charcode, agindex = self.get_next_char(charcode, 0)
yield charcode, agindex
num_glyphs
просто подтягивает своего тезку
num_glyphs = property(lambda self: self._FT_Face.contents.num_glyphs,
...
FT_Face_GetCharVariantIndex
, я бы сказал, что есть варианты глифов, которые соответствуют одной и той же кодовой точке, поэтому глифов будет больше, чем кодовых точек. - person Mark Tolonen   schedule 23.06.2019