Почему num_glyphs не соответствует количеству глифов, перечисленных FT_Get_First_Char/FT_Get_Next_Char

Рассмотрим следующий пример. Он использует 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,
...

person Paul Panzer    schedule 22.06.2019    source источник
comment
Я не эксперт по шрифтам, но из таких функций, как FT_Face_GetCharVariantIndex, я бы сказал, что есть варианты глифов, которые соответствуют одной и той же кодовой точке, поэтому глифов будет больше, чем кодовых точек.   -  person Mark Tolonen    schedule 23.06.2019
comment
@MarkTolonen достаточно эксперт, чтобы найти за пять минут то, что я не мог найти за день. Большое спасибо!   -  person Paul Panzer    schedule 23.06.2019