Как определить высоту и глубину шрифта PostScript? - PullRequest
5 голосов
/ 28 ноября 2011

Я ищу код PostScript, который оценивает высоту шрифта PostScript (место для восходящего элемента) и глубину (место для сходящего элемента). Может ли для этого использоваться ограничительная рамка шрифта (FontBBox)? `

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

Я видел Код PostScript, который отображает данную строку для проверки ее размера . Меня скорее интересует общий ответ для данного шрифта.

Ответы [ 2 ]

8 голосов
/ 29 ноября 2011

Ну, вы уже обнаружили два "ярлыка". FontBBox дает ограничивающую рамку для всех глифов в шрифте, наложенных вместе. false charpath flattenpath pathbbox дает поле для указанной строки.

Для шрифта типа 3 (определяемого пользователем) это все, что вы можете разумно ожидать; но для более популярных шрифтов Type 1 существует множество метрической информации как в шрифте, так и в файле «metrics» (для других приложений).

Но это та часть, которую я не очень хорошо знаю. Итак, я собираюсь прочитать (в руководстве по Adobe Type 1) и расширить этот ответ позже.

Редактировать: На самом деле, похоже, что это может быть лучшим способом в целом.

Там - это массив значений вертикального выравнивания шрифтом типа 1 в / частном словаре под именем / BlueValues; но нет никакой гарантии, что шрифт их соблюдает. Первое число в массиве - базовый выброс ; это нижний край букв типа «О», которые опускаются ниже базовой линии. И самое большое значение в массиве будет либо: превышение по высоте , либо превышение по высоте (в зависимости от того, что выше). Но любой отдельный символ может быть нанесен без учета этих значений (следовательно, нет гарантии).

С другой стороны, сам FontBBox может отражать ограничивающую рамку любых «специальных» символов, присутствующих в шрифте, независимо от того, доступны ли они через вектор кодирования (т. Е. Вы не можете show их, но должны glyphshow их).

Так что, вероятно, лучше всего взять pathbbox из строки всех символов, которые вы собираетесь использовать. Это будет игнорировать вклад любых других персонажей, которые могут присутствовать, но не имеют отношения к вашей цели. И не забудьте flattenpath убрать контрольные точки из кривых (которые могут находиться далеко за пределами «реальной» ограничительной рамки).

5 голосов
/ 09 октября 2013

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

%!ps-nonconforming
/inch {72 mul} bind def
/Helvetica 10 selectfont
1 inch 10 inch moveto
/fontheight currentfont dup /FontBBox get dup 3 get % top
 exch 1 get sub % top - bottom
 exch /FontMatrix get 3 get mul def % adjusted by height multiplier
/lineheight fontheight 1.2 mul def % add 20% for line spacing
/newline {0 lineheight neg rmoveto} bind def % negate height to move downwards
gsave (lineheight: ) show lineheight 20 string cvs show grestore
newline gsave (that worked!) show grestore
showpage

результат запуска с gs test.ps:

ghostscript rendering of test.ps


день спустя, глядя наэто снова, и понял, что OP хотел рассматривать восходящие и спусковые устройства отдельно.вот пример использования спусков:

%!ps-nonconforming
/inch {72 mul} bind def
/Helvetica 30 selectfont
1 inch 2 inch moveto
/descender currentfont dup /FontBBox get 1 get % bottom (negative number!)
 exch /FontMatrix get 3 get mul def % adjusted by height multiplier
% first draw a gray line at base of text
gsave 7.5 inch 0 rlineto 0.5 setgray stroke grestore
gsave (descender: ) show descender 20 string cvs show ( pixels) show grestore
gsave 0 descender 1 sub rmoveto  % one pixel below lowest descender
7.5 inch 0 rlineto 0 setgray stroke grestore
showpage

и результат gs -sDEVICE=pnggray -g640x480 -o/tmp/descender.png descender.ps: line under lowest descender

...