Неправильные / отсутствующие метрики шрифта в Java? - PullRequest
9 голосов
/ 29 мая 2009

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

Любая идея

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

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

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

Ответы [ 2 ]

10 голосов
/ 03 июня 2009

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

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

alt text

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

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

3 голосов
/ 02 июня 2009

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

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

...