как шрифт сообщает ОС, что Я ШРИФТ С МЕСЯЦОМ / ФИКСИРОВАННОЙ ШИРИНОЙ?

в самом начале, я только хочу знать, почему в IDE PYCHARM в Windows 10, когда установлен флажок «Показывать только моноширинные шрифты», многие шрифты не будут перечислены в диалоговом окне выбора шрифта редактора [настройки / редактор / цвета и шрифты / font], также в мятном цвете.

Я не знаю, как работает pycharm, но mintty использует Win32 API «LOGFONT».

тогда как ОС Windows узнала, является ли шрифт моноширинным (фиксированной шириной)?

то есть: "исходный код про" указан, "исходный код про черный / сверхлегкий / светлый ... нет;

указан "код fira", но нет кода fira light / medium / retina;

и, некоторые другие моноширинные шрифты не перечислены там, если "показывать только моноширинные".

кажется, что pycharm распознает только имя семейства шрифтов, когда установлен флажок «показывать только моноширинные шрифты»

в OSX (Mavericks) это немного сложно: если установлен флажок «Показывать только моноширинные шрифты», pycharm все равно может получить имя семейства, но не может знать, какой вес шрифта установлен по умолчанию, если установлена ​​версия шрифта с грубым взвешиванием.


затем я попытался изменить некоторые шрифты и, кстати, взглянул на исходную информацию о файле шрифта в кузнице шрифтов, но я не знаю, какая часть действительно влияет на WINDOWS или PYCHARM (IDEA / INTELIJ / by JDK на самом деле?), чтобы узнать, какой шрифт моноширинный.

в части "OS / 2" все параметры, упомянутые в фиксированной ширине / моноширинном / моноширинном, проверены, но не помогли, а в Windows pycharm все еще не может их обнаружить.

Итак, наконец, мне действительно интересно, какой параметр используют файлы TTF или любые другие типы файлов шрифтов, чтобы сообщить ОС [windows / osx / mac os / linux], что «я моноширинный»?


person Puter.B166ER    schedule 03.04.2017    source источник


Ответы (2)


PyCharm и весь пакет JetBrains IDEA не используют флаги шрифтов для идентификации моноширинных шрифтов. Вместо этого они определяют, является ли шрифт моноширинным, используя следующий алгоритм:

  • Имеют ли символы 'l', 'W' и ' ' в обычном варианте одинаковую ширину при размере 12?
  • Имеют ли символы 'l', 'W' и ' ', выделенные жирным шрифтом, такую ​​же ширину, что и обычный вариант с размером 12?
  • Имеют ли символы 'l', 'W' и ' ' в варианте курсивом ту же ширину, что и у обычного варианта с размером 12?
  • Имеют ли символы 'l', 'W' и ' ' в варианте, выделенном жирным курсивом, такую ​​же ширину, что и у обычного варианта с размером 12?

Шрифт будет указан как немоноширинный, если какой-либо из вышеперечисленных вычислений ширины даст противоречивый ответ.

Чтобы решить эту проблему, вы должны установить полужирный вариант шрифта, который вы пытаетесь использовать. Если жирная версия шрифта недоступна, средство визуализации шрифтов IntelliJ автоматически сгенерирует тот, который влияет на ширину символов и, следовательно, вызывает сбой проверки моноширинности.


Источник: Исходный код IntelliJ Community Edition (выдержки сокращены для краткости и используются по лицензии Apache 2.0, а не по лицензии CC-BY-SA StackOverflow.)

private static int getFontWidth(Font font, int mask) {
    int width = getCharWidth(font, ' ');
    return width == getCharWidth(font, 'l')
        && width == getCharWidth(font, 'W') ? width : 0;
}

В конструкторе FontInfo.

int width = getFontWidth(font, Font.PLAIN);
if (!plainOnly) {
    if (width != 0 && width != getFontWidth(font, Font.BOLD)) width = 0;
    if (width != 0 && width != getFontWidth(font, Font.ITALIC)) width = 0;
    if (width != 0 && width != getFontWidth(font, Font.BOLD | Font.ITALIC)) width = 0;
}
boolean isMonospaced = width > 0;
person Randy the Dev    schedule 15.03.2018

Шрифт TrueType может содержать post таблицу. Таблица post содержит 32-битное поле с именем isFixedPitch. Если он содержит 0, это указывает на пропорциональный шрифт. Моноширинный шрифт должен иметь это значение 1 (но обычно рекомендуется, чтобы движок шрифтов принимал любое ненулевое значение, указывающее на моноширинный шрифт, поскольку это то, что требовалось в ранних версиях спецификации TT).

Моноширинный шрифт также должен иметь numberOfHMetrics в таблицах hhea и hmtx, установленный на 3.

Также есть данные в данных сопоставления шрифтов panose (в таблице OS / 2), чтобы указать, является ли шрифт моноширинным или нет.

Если бы мне пришлось угадывать, я бы сказал, что Apple с большей вероятностью будет использовать таблицу post, в то время как Microsoft с большей вероятностью будет использовать данные Panose (но я легко могу ошибаться в одном или обоих из них).


Использованная литература:

  1. Документация Apple о таблице сообщений
  2. Рекомендации Microsoft OpenType
  3. Руководство по метрикам классификации Panose
person Jerry Coffin    schedule 03.04.2017
comment
Большое спасибо, удивительный мир, чтобы получить ценные ответы. Казалось, что шрифт, который я модифицировал с битом панорамирования '9' для моноширинного, был успешным, и он успешно распознается OSX, и, согласно вашей ссылке № 2, Microsoft рекомендует использовать данные панорамирования, но pycharm не может его распознать, возможно тогда это проблема pycharm или jdk. - person Puter.B166ER; 03.04.2017