Семь уроков по PostScript

         

Кодирование шрифта



Кодирование шрифта

Каждый словарь шрифта содержит описание символов в соответствии с некоторой кодовой таблицей, в частности это может быть 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.



Содержание раздела