Неверные / отсутствующие метрики шрифтов в Java?

используя определенный шрифт, я использую FontLayout Java для определения его восхождения, спуска и ведущего. (см. учебник FontLayout Java здесь)

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

идеи

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

вещи, которые я пробовал до сих пор:

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

2 ответов


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

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

alt text

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

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


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

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