Как шрифт сообщает ОС, что "Я - ШРИФТ С ПЛОЩАДЬЮ / ФИКСИРОВАННОЙ ШИРОКОЙ"?
Вначале я только хочу знать, почему в IDE PYCHARM в Windows 10, хотя установлен флажок "показывать только моноширинные шрифты", многие шрифты не будут перечислены в диалоговом окне выбора шрифта редактора [settings/editor/colors and fonts/font], также в мятном.
Я не знаю, как работает pycharm, но монетный двор использует win32 API "LOGFONT".
тогда как ОС Windows узнала, является ли шрифт моноширинным (фиксированной ширины)?
то есть: "исходный код pro" указан, "исходный код pro black / extralight / light ... нет;
"код ФИРА" указан, но код ФИРА светлый / средний / сетчатка не указан;
и некоторые другие моноширинные шрифты там не перечислены, если "показывать только моноширинный".
кажется, что pycharm распознает только имя семейства шрифтов, если установлен флажок "показывать только моноширинные шрифты"
в OSX(Mavericks) это немного сложно: если был установлен флажок "показывать только моноширинные шрифты", pycharm все еще может получить имя семейства, но не может знать, какой font-weight является значением по умолчанию, если установлена версия шрифта с взвешенным шрифтом.
затем я попытался изменить некоторые шрифты и, кстати, взглянул на 'file-info' исходного шрифта в шрифтовой кузнице, но я не знаю, какая часть действительно влияет на WINDOWS или PYCHARM(IDEA/INTELIJ/by JDK) на самом деле?) чтобы узнать, какой шрифт моноширинный.
в части "OS/2" все упомянутые параметры с фиксированной шириной / моноширией / моношириной проверяются, но не помогают, а в Windows pycharm все еще не может их обнаружить.
Итак, наконец, мне действительно интересно, какой параметр используют файлы TTF или любые другие типы файлов шрифтов, чтобы сообщить ОС [windows/osx/mac os/linux], что "я моноширинный"?
2 ответа
PyCharm, и в этом отношении весь пакет JetBrains IDEA не использует шрифтовые флаги для идентификации моноширинных шрифтов. Вместо этого они определяют, является ли шрифт моноширинным, используя следующий алгоритм:
- Являются ли
'l'
,'W'
а также' '
символы обычного варианта одинаковой ширины при размере 12? - Являются ли
'l'
,'W'
а также' '
символы жирного варианта той же ширины, что и обычный вариант в размере 12? - Являются ли
'l'
,'W'
а также' '
символы варианта курсива такой же ширины, как обычный вариант в размере 12? - Являются ли
'l'
,'W'
а также' '
символы варианта, выделенного полужирным курсивом, имеют ту же ширину, что и обычный вариант размера 12?
Шрифт будет указан как не моноширинный, если какой-либо из приведенных выше расчетов ширины даст противоречивый ответ.
Чтобы решить эту проблему, вы должны установить жирный вариант шрифта, который вы пытаетесь использовать. Если полужирная версия шрифта недоступна, средство визуализации шрифтов IntelliJ автоматически сгенерирует тот, который влияет на ширину символов и, следовательно, приводит к сбою проверки моноширинного пространства.
Источник: исходный код IntelliJ Community Edition (выдержки сокращены для краткости и лицензированы по лицензии Apache 2.0, а не по лицензии Stackru CC-BY-SA.)
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;
Шрифт TrueType может содержать post
Таблица. post
таблица содержит 32-битное поле с именем isFixedPitch
, Если это содержит 0
, это указывает на пропорциональный шрифт. Моноширинный шрифт должен иметь этот набор 1
(но обычно рекомендуется, чтобы механизм шрифтов принимал любое ненулевое значение как обозначение моноширинного шрифта, поскольку это требовалось в ранних версиях спецификации TT).
Моноширинный шрифт также должен иметь numberOfHMetrics
в hhea
а также hmtx
таблицы на 3
,
В данных сопоставления шрифтов panose также есть данные (в таблице OS/2), чтобы указать, является ли шрифт моноширинным или нет.
Если бы мне пришлось угадывать, я бы сказал, что Apple, скорее всего, будет использовать post
таблица, в то время как Microsoft с большей вероятностью будет использовать данные Panose (но я могу легко ошибиться в одном или обоих).
Рекомендации: