Каждый словарь шрифта содержит описание символов в соответствии с некоторой кодовой таблицей, в частности это может быть ASCII. Таким образом каждый символ имеет свой цифровой код -- число от 0 до 255. Кодовая таблица не является постоянной, ее можно изменять из приложения.
Коды символов можно использовать двумя способами:
- их можно с помощью оператора put вставлять в строку;
- или непосредственно использовать в строке в виде восьмеричных чисел.
Многие шрифты имеют символы не входящие в стандартную кодировку и кроме того, часто такие символы отсутствуют на клавиатуре. Чтобы посмотреть как кодируются символы того или иного шрифта, напишем программу, которая распечатывает кодовую таблицу любого заданного шрифта.
/Helvetica findfont 12 scalefont setfont
/cod 3 string def
/char 1 string def
/newline
{currentpoint 13 sub
exch pop LM
exch moveto }def
/prtnum % в стеке код
{cod cvs show}def
/prtchar %в стеке код
{char 3 - 1 0 roll put
char show}def
/prtall
{dup prtnum () show
prtchar newline} def
% основная программа.
/LM 72 def
LM 450 moveto
12 1 60 {prtall} for
/LM 144 def
LM 144 moveto
6 1 100 {prtall} for
showpage
Преобразование шрифта задается матрицей преобразования (трансформации), представляющей из себя массив из шести чисел. Они определяют, как координаты пространства пользователя должны быть трансформированы в позицию на текущей странице. Элементы этого массива определяют масштаб, ориентацию и позицию осей х и у.
Графическое состояние программы работает с текущей матрицей трансформирования, определяющей, как на текущей странице позиционируются все изображения.
Операторы translate, rotate и scale для модификации координат пространства пользователя изменяет соответствующие элементы этой матрицы.
Отдельная матрица преобразования ассоциируется с каждым шрифтом, определяя как символы этого шрифта должны печататься на текущей странице. Эта матрица шрифта может быть изменена непосредственно оператором makefont, который берет из стека словарь шрифта и шестиэлементный массив, а затем преобразует с помощью этого массива матрицу шрифта и помещает измененный словарь шрифта обратно в стек.
Чтобы изменить масштаб шрифта по х и по у, нужно задать соответственно значения чисел m и n в матрице
[m 0 0 n 0 0 ]
Так строки
/Helvetica findfont 6 scalefont
/Helvetica findfont [6 0 0 6 0 0] makefont
выполняют ровно одно и тоже: создают шрифт Helvetica размером 6 пунктов. Действие оператора makefont однако значительтно шире, чем у scalefont. Он позволяет как угодно сжимать и растягивать текст. Следующая прграмма из “Голубой книги” показывает технику работы с makefont.
/basefont /Helvetica findfont def
/LM 72 def
/newline
{currentpoint 13 sub
exch pop LM
exch moveto} def
% основная программа
LM 400 moveto
% обычная печать
basefont [12 0 0 12 0 0] makefont setfont
(Пример нормальной печати) show newline
% растянутый.
basefont [17 0 0 12 0 0] makefont setfont
(Растянутый шрифт) show newline
% сжатый
basefont [7 0 0 12 0 0] makefont setfont
(Сжатый шрифт) show newline
% наклонный
basefont [12 0 6.93 12 0 0] makefont
setfont
(Italic) show
showpage
<рис. файл p4_4.ps>
Программа печатает четыре строки, каждый раз преобразуя текущий шрифт, с помощью различных матриц шрифта. Во второй и третьей строке изменялся масштаб по горизонтали (Вы можете поэксперементировать, задавая различный масштаб и по вертикали, но не забудьте поменять константу в процедуре newline, чтобы строки не наползали одна на другую). Интересна последняя строка. Третье число в матрице 6.93 представляет собой результат умножения у на tg 30 градусов. Таким образом задан наклон шрифта.
Вы можете поэкспериментировать с матрицами преобразования, чтобы лучше почувствовать, что происходит с шрифтом.
Все эти преобразования пространства пользователя можно выполнить также с помощью операторов scale и setmatrix. Однако в отличие от makefont их действие распространяется на все, что печатается на текущей странице. Если нужно сжать, растянуть или наклонить текст, то следует пользоваться только makefont.