Неправильные / отсутствующие показатели шрифта в Java?

StackOverflow https://stackoverflow.com/questions/925147

  •  06-09-2019
  •  | 
  •  

Вопрос

Используя определенный шрифт, я использую 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 выше).

Есть какие-нибудь идеи

  1. почему это происходит?
  2. могу ли я каким-то образом получить доступ к информации о шрифте, к которой, похоже, обращаются Word и OpenOffice, что приводит к такому различному межстрочному интервалу?

То, что я уже пробовал до сих пор:

  • добавление всех символов в вектор символов с помощью font.getNumGlyphs() и т.д.- по-прежнему получаем те же значения показателей шрифта
  • использование нескольких строк, как описано здесь - каждая строка, которую я получаю, имеет те же показатели шрифта, что и описанные выше.
  • используя FontMetrics" такие методы , как getLeading()
Это было полезно?

Решение

Зарконнен не заслуживает отрицательных оценок, поскольку он на правильном пути.Многие шрифты Java, похоже, возвращают ноль для своего начала, когда, возможно, они не должны этого делать.Может быть, все дело в этот баг:Я не знаю.Казалось бы, от вас зависит вернуть этот пробел обратно.

Высота типографской линии обычно определяется как подъем + спуск + начало.Подъем и спуск измеряются вверх и вниз от базовой линии, на которой сидят персонажи, а начало - это промежуток между спуском одной строки и подъемом строки под ней.

alt text

Но лидерство не является фиксированным.Вы можете установить ведущее значение в большинстве текстовых редакторов и типографских программ.Word называет это межстрочным интервалом.Первоначальный вопрос, вероятно, заключается в том, как Microsoft Word вычисляет однострочный интервал.Компания Microsoft рекомендации по использованию шрифтов OpenType похоже, это наводит на мысль, что программное обеспечение на разных платформах вычисляет это по-разному.(Может быть, именно поэтому Java теперь возвращает ноль?)

Быстрый поиск в Google, по-видимому, указывает на то, что эмпирическим правилом для лидерства является 120% подъема + спуск для однострочного интервала, или фиксированный интервал между точками;допустим, 2 пункта, ведущие между всеми строками.В отсутствие каких-либо жестких правил, которые я могу найти, я бы сказал, что все сводится к разборчивости текста, который вы представляете, и вы должны просто выбрать то, что, по вашему мнению, выглядит лучше всего.

Другие советы

Включают ли Word и OO пробел между строками, в то время как Java - нет?

Итак, в Word / OO ваш номер равен Ascent + Descent + Пробел, в то время как в Java у вас просто Ascent + Descent ?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top