Уважение лигатуры шрифтов в Java / Swing - PullRequest
0 голосов
/ 31 мая 2018

Я столкнулся с проблемой, которая заставляет меня почесать голову, когда я имею дело с объектами Swing в java (и JFX, но я буду беспокоиться об этом позже ...).

Здесьэто код, который я использую для открытия шрифтов в моей программе.Это довольно стандартно.

public static Font getFontFromFile(String filePath) throws FontFormatException, IOException {
    File fontFile = new File(filePath);
    return Font.createFont(Font.TRUETYPE_FONT, fontFile);
}

Моя проблема в том, что когда я действительно использую эти шрифты, лигатуры внутри них не соблюдаются.Одна из основных функций моей программы позволяет пользователям загружать пользовательские шрифты, многие из которых имеют специальные лигатуры.Их не уважают, и я не уверен, что делаю неправильно.Если пользователь вводит два символа, которые должны быть уменьшены до одной лигатуры, второй символ выглядит нормально, без преобразования.Когда я загружаю шрифты в любую другую программу или текстовый редактор, я вижу, что лигатуры соблюдаются в точности так, как я ожидал.

Я сократил код, где я фактически устанавливаю шрифт в нескольких местахк абсолютной чистоте, и я вижу (неправильное) поведение даже в тех местах, где я делаю что-то простое:

jTextField.setFont(myFont);

Есть ли какие-то настройки для импорта, которые мне не хватает?Или это должно быть глобально перевернуто на объекте 2D графики?Любая помощь будет принята с благодарностью.Спасибо,

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

НАЙДЕНО.

Хорошо.Так.Это разочаровало, так как я корректно устанавливал TextAttributes при загрузке шрифтов с помощью метода, который страдает от давней ошибки. Предполагается, что лигатуры представлены в JTextFields и JTextAreas, но при определенных обстоятельствах они не будут,Есть две вещи, которые нужно иметь в виду.

1) Существует старая ошибка (https://bugs.openjdk.java.net/browse/JDK-8139741), которая препятствует соблюдению лигатур при использовании шаблона

// BROKEN PATTERN
Font myFont = new Font(<FONT_CAMILY_NAME>, Font.PLAIN, 72);

Вместо этого лигатуры шрифтов будут учитываться только в том случае, еслизагружается из двоичного местоположения:

// WORKING PATTERN
File myFontFile = new File(<FILE_LOCATION>);
Font fixed = Font.createFont(Font.TRUETYPE_FONT, myFontFile);

2) После того, как шрифт загружен из двоичного файла, лигатуры должны быть установлены через TextAttributes следующим образом:

Map attributes = fixed.getAttributes();
attributes.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON);
fixed = fixed.deriveFont(attributes);

При загрузке шрифтов непосредственно изОС, я взял фактический файл шрифта в системе и загрузил его как двоичный файл.Это громоздко, но работает.

0 голосов
/ 01 июня 2018

По крайней мере, в отношении Java2D, я прочитал this - см. Рисунок 4-13 , поскольку он предполагает, что Java просто возьмет список предоставленных кодовых точек и отобразит глиф для каждого без объединения для создания лигатур.

Еще до JavaFX 2 в javafx.scene.text.Font существовало логическое свойство ligatures, которое утверждало, что оно контролирует использование лигатур, но что , похоже, больше не существует .

Исторически (прошло не менее 7 лет) мне приходилось анализировать шрифты TT / OT для лигатур и выполнять комбинирование вручную (а иногда даже парным кернингом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...