Неправильные / отсутствующие показатели шрифта в Java?
Вопрос
Используя определенный шрифт, я использую Java FontLayout для определения его подъема, спуска и начала.(смотрите учебник Java по FontLayout здесь)
В моем конкретном случае я использую Arial Unicode MS, размер шрифта 8.Используя следующий код:
Font font = new Font("Arial Unicode MS", 0, 8);
TextLayout layout = new TextLayout("Pp", font,
new FontRenderContext(null, true, true));
System.out.println( "Ascent: "+layout.getAscent());
System.out.println( "Descent: "+layout.getDescent());
System.out.println( "Leading: "+layout.getLeading());
Java выдает мне следующие значения:
Ascent: 8.550781
Descent: 2.1679688
Leading: 0.0
Пока все идет хорошо.Однако, если я использую сумму этих значений в качестве межстрочного интервала для различных строк текста, это немного отличается от межстрочного интервала, используемого в OpenOffice, Microsoft Word и т.д.:он меньше.При использовании однострочного интервала по умолчанию Word и OO, кажется, имеют межстрочный интервал около 13.7pt (вместо 10.7pt, как я вычислил, используя метрики шрифтов Java выше).
Есть какие-нибудь идеи
- почему это происходит?
- могу ли я каким-то образом получить доступ к информации о шрифте, к которой, похоже, обращаются Word и OpenOffice, что приводит к такому различному межстрочному интервалу?
То, что я уже пробовал до сих пор:
- добавление всех символов в вектор символов с помощью
font.getNumGlyphs()
и т.д.- по-прежнему получаем те же значения показателей шрифта - использование нескольких строк, как описано здесь - каждая строка, которую я получаю, имеет те же показатели шрифта, что и описанные выше.
- используя
FontMetrics
" такие методы , какgetLeading()
Решение
Зарконнен не заслуживает отрицательных оценок, поскольку он на правильном пути.Многие шрифты Java, похоже, возвращают ноль для своего начала, когда, возможно, они не должны этого делать.Может быть, все дело в этот баг:Я не знаю.Казалось бы, от вас зависит вернуть этот пробел обратно.
Высота типографской линии обычно определяется как подъем + спуск + начало.Подъем и спуск измеряются вверх и вниз от базовой линии, на которой сидят персонажи, а начало - это промежуток между спуском одной строки и подъемом строки под ней.
Но лидерство не является фиксированным.Вы можете установить ведущее значение в большинстве текстовых редакторов и типографских программ.Word называет это межстрочным интервалом.Первоначальный вопрос, вероятно, заключается в том, как Microsoft Word вычисляет однострочный интервал.Компания Microsoft рекомендации по использованию шрифтов OpenType похоже, это наводит на мысль, что программное обеспечение на разных платформах вычисляет это по-разному.(Может быть, именно поэтому Java теперь возвращает ноль?)
Быстрый поиск в Google, по-видимому, указывает на то, что эмпирическим правилом для лидерства является 120% подъема + спуск для однострочного интервала, или фиксированный интервал между точками;допустим, 2 пункта, ведущие между всеми строками.В отсутствие каких-либо жестких правил, которые я могу найти, я бы сказал, что все сводится к разборчивости текста, который вы представляете, и вы должны просто выбрать то, что, по вашему мнению, выглядит лучше всего.
Другие советы
Включают ли Word и OO пробел между строками, в то время как Java - нет?
Итак, в Word / OO ваш номер равен Ascent + Descent + Пробел, в то время как в Java у вас просто Ascent + Descent ?