PostScript-шрифты
Шрифт - это набор символов, имеющих единый дизайн. Дизайн конкретного шрифта называется гарнитурой. Набор гарнитур, разработанных для совместного использования, называется семейством гарнитур. Наиболее популярные гарнитуры: Таймс, Курьер, Журнальная и др.
Конкретный PostScript-шрифт является реализацией начертания некоторого семейства гарнитур. PostScript-шрифты относятся к классу векторных и, следовательно, масштабируемых шрифтов. Существующие методы описания векторных шрифтов позволяют автоматически менять размер шрифта (кегель) с минимальными искажениями его начертания при преобразовании размера.
Чтобы задать шрифт, нужно выполнить следующие действия:
- найти описание шрифта в словаре шрифтов. Это описание позволяет построить контуры каждого отдельного символа. Подробнее об этом словаре будет рассказано несколько позже;
- отмасштабировать шрифт до нужного размера. Его размер задается минимальным расстоянием по вертикали между строками текста, необходимым, чтобы эти строки не накладывались одна на другую, например обычный шрифт часто задается высотой в 12 пунктов (напомним, что 1 пункт = 1/72 дюйма);
- установить отмасштабированный шрифт в качестве текущего шрифта, которым и будет печататься текст.
Чтобы посмотреть, как это работает, давайте напечатаем слова PC Week шрифтом Helvetica размером 14 пунктов.
/Helvetica findfont
14 scalefont
setfont
100 150 moveto
(PC Week) show
showpage
В этом фрагменте используется ряд новых операторов. В первой строке в стек сначала помещается литерал с именем шрифта, а затем вызывается оператор findfont. Этот оператор ищет это имя в словаре с названием FontDictionary и помещает соответствующий словарь шрифта в стек. Данный словарь содержит описания образов символов для шрифта размером в один пункт. Нужный размер устанавливается с помощью оператора scalefont, который берет из стека число и словарь шрифта и возвращает в стек словарь шрифта модифицированный под нужный размер. Так, в нашем примере строка
14 scalefont
вернет в стек словарь для шрифта Helvetica с кеглем 14 пунктов. Наконец, оператор setfont переводит словарь шрифта из стека в текущий шрифт, который и будет использован для печати текста. Чтобы что-либо напечатать, нужно установить местоположение текущей точки, поместить в стек заключенную в круглые скобки строку и вызвать оператор show. Этот оператор "печатает" строку из стека на текущей странице, начиная с текущей точки. По мере печати текущая точка перемещается в конец строки.
Изменение размера шрифта при печати
Следующий пример показывает, как во время печати текста можно менять шрифт. Определим процедуру устанавливающую шрифт нужного размера.
/newsize % в стеке размер
{ scalefont setfont} def
/ getfont
{ Helvetica findfont} def
getfont 8 newsize
72 250 moveto (example) show
getfont 10 newsize
72 275 moveto (example) show
getfont 12 newsize
72 300 moveto (example) show
showpage
Эта программа напечатает три раза слово example шрифтом разного размера. Процедуры newsize и getfont можно объединить, если учесть порядок следования аргументов в стеке. (Понятно, что в нем хранится не сам словарь шрифта непосредственно, а ссылка на него).
/scaleHelv %в стеке размер
{/ Helvetica findfont
exch scalefont % кегель в стеке
setfont } def
Теперь запись строки программы станет еще компактней:
6 scaleHelv
Графика и текст
В PostScript не существует различия между графикой и текстом. Символ текста рассматривается как один из графических объектов, размещаемых на текущей странице. Поэтому для совмещения на ней текста и графики не требуется никаких специальных действий.
Графические операторы PostScript выполняют свои действия в пространстве пользователя, или, иначе говоря, в пользовательской системе координат. Как уже говорилось, это пространство независимо от какого-либо физического устройства и результат работы операторов PostScript при печати автоматически преобразуется в систему координат устройства. Однако иногда бывает удобно изменить действующую по умолчанию систему координат. Можно, например, перенести в другое место начало координат, изменить ориентацию осей и масштабы по ним.
Перенесение начала координат. Для этой цели служит оператор translate. Он берет из стека два числа, и перемещает пространство пользователя в точку с этими новыми координатами. Например строка:
150 180 translate
переместит их начало координат в точку (150, 180). После этого все позиции на текущей странице будут отмеряться от этой точки.
Пример.
Треугольник. Переместить 3 раза.
/treangl
0 0 moveto
90 0 lineto
x y lineto
closepath fill} def
treangl
200 250 translate
treangl
200 250 translate
treangl
showpage
Обратите внимание, что второй перенос системы координат осуществляется уже относительно новой системы координат, а не относительно исходной.