Комментарий %%PageFonts, если он имеется, должен идти сразу после %%Page. Очередной комментарий %%Page обозначает конец предыдущей страницы и начало следующей. Конец последней страницы отмечается комментарием %%Trailer.
В языке PostScript нет четкого деления файла с описанием документа на раздел описания и раздел операторов (тело программы), как, например, в языках программирования Pascal или Фортран. Определения переменных в PostScript могут чередоваться с командами формирования изображения.
Текст в PostScript тоже является изображением. Важно лишь, что правильно составленная программа должна иметь правильную структуру. Определения общих для всех страниц документа переменных и процедур следует выносить в пролог.
На рисунке 3 представлена структура программы, написанная на языке описания страниц – PostScript
Рисунок 3 Структура программы4.5.4 Обзор универсальных команд
Для описания команд используется следующая нотация:
аргумент1, аргумвнт2, ... команда @ результат1, результат2, ... %комментарий
Имя команды выделяется специальным шрифтом. Слева от имени описывается состояние стека до исполнения команды, а справа от стрелки — после ее исполнения. Минус вместо аргумента или результата обозначает отсутствие значения. Данные обозначаются словами, производными от названии типов или математических обозначений, характеризующих операцию. Такая запись приближена к записи текста программы. Например, описание операции сложения выглядит так:
р q add -> p+q
Запись команды в тексте PostScript-файла может быть такой:
4М 5.0 add
или
1710 add
Целые числа обозначаются буквами i, j, n, вещественные числа — х, у, z, логические (булевы) значения — буквой b, координаты — х, у. Буквами р, q, г, s обозначаются любые числа, как целые, так и вещественные если их тип не имеет значения. Строки, массивы и процедуры указываются вместе со скобками, в которых они определяются.
PostScript имеет команды общего назначения для работы c данными (присваивание, работа со стеком)^операторы вызова подпрограмм, ветвления и циклы. Операторов безусловного перехода и меток нет. Имеются команды ввода/вывода> но при печати на принтере они теряют смысл, так как PostScript-файл передается в принтер и обрабатывается в нем автономно, без связи с компьютером.
При интерпретации команды интерпретатор PostScript ищет ее имя в стеке словарей. Если имя найдено, соответствующее значение либо заносится в стек операндов (если это не процедура), либо исполняется (если это процедура). Если имя не найдено ни в одном из словарей, возникает ошибка и интерпретация PostScript-файла завершается. Имена стандартных команд представляют собой имена процедур, записанные в системном словаре. При необходимости эти имена можно переопределить. Команда load выполняет поиск указанного имени, но в любом сяучае заносит найденное значение в стек. Эту команду можно применять для того, чтобы использовать описанную ранее процедуру в качестве тела цикла или условного оператора.
Условный оператор if удаляет из стека операндов процедуру и логическое значение, после чего, либо исполняет процедуру,, либо нет. Процедура может использовать значения в стеке операндов, записанные до того, как туда было записано логическое значение. Условный оператор ifelse удаляет из стека операндов обе процедуры и логическое значение, после чего исполняет одну из процедур. В этом случае обе процедуры должны одинаково использовать старые значения в стеке и оставлять там одинаковое количество новых значений.
Оператор цикла for удаляет из стека операндов все свои 4 аргумента и устанавливает. значение параметра цикла равным рнач. После этого он циклически выполняет следующие действия: проверяет, не вышло ли текущее значение параметра за допустимую границу sK0Hj помещает значение параметра цикла в стек операндов, выполняет процедуру, увеличивает значение параметра на величину qшar. Шаг может быть как положительным, так и отрицательным. Если начальное значение больше конечного при положительном шаге или меньше конечного при отрицательном шаге, процедура не выполняется. Процедура может использовать предыдущие значения в стеке, а также значение параметра цикла. После окончания цикла стек не восстанавливает автоматически свое прежнее состояние, что может привести к его переполнению, поэтому, в частности, необходимо удалять из стека операндов очередное значение параметра цикла.
В таблице 1 приведен обзор некоторых универсальных команд.
4.5.5 Графический контекст
В операторах вывода графики используются неявные параметры, влияющие на их выполнение. Совокупность этих параметров называется графическим контекстом. Графический контекст составляют положение, ориентация и масштаб системы координат, толщина и стиль рисования линии, область рисования, текущий путь построения линии и некоторые другие. В PostScript имеются команды для работы с графическим контекстом.
Среди них команды, которые заносят в специальный стек графических контекстов текущий графический контекст и могут восстановить ранее записанное состояние. Это позволяет изменять параметры вывода одной части рисунка и возвращаться к предыдущему состоянию перед выводом другой его части. Команда gsave выполняет запись в стек графических контекстов, а команда grestore считывает из этого стека графический контекст, делая его текущим. Таким образом, все изменения параметров рисования, произведенные с момента сохранения контекста, перестают действовать на последующие команды вывода графических объектов. Команда grestoreall восстанавливает самое первое состояние, записанное в стек командой gsave. Более «мощные» команды save и restore кроме сохранения графического контекста сохраняют еще и область памяти виртуальной ЭВМ, содержащую все переменные, и восстанавливают как графический контекст так и значения переменных. Эти команды можно использовать для предотвращения побочных эффектов при печати страниц, если среди команд печати встречаются команды изменения каких-либо объектов. Команда grestoreall восстанавливает последний графический контекст, сохраненный командой save, или, если таких команд не было, самый первый (верхний в стеке), сохраненный командой gsave. Образ памяти, создаваемый командой save, рекомендуется хранить в стеке операндов и использовать команду restore, предварительно убрав из стека все записанные чуда .позже операнды.
Таблица 1 Перечень команд
Описание команды | Примечание |
р q add->p+q | - |
р q sub->p-q | - |
р qmul->p*q | - |
р q div->p/q. | - |
ijidiv->[i/j] | Целая часть от деления. Аргументы только целого типа. |
i j mod->imodj | Остаток от деления. Аргументы только целого типа. |
p neg~>-p | Изменение знака |
p abs->|p| | Модуль числа - |
p cv.i->i | Преобразование к целому типу. У вещественного числа отбрасывается дробная часть. |
p cvr->x | Преобразование к вещественному типу. |
p round ->q | Округление числа. Тип результата совпадает стипом аргумента. |
(строка) cvi~> i | Преобразование символьного представления числаГ1 в целое |
(строка) cvr->x | Преобразование символьного представления числа в вещественное |
Функции | |
a0sin —> sin(o:D) | Угол задается в градусах |
P sqrt-> 4~p | Квадратный корень |
p ln-»ln(p) | Натуральный логарифм |
plog-Hgt» | Десятичный логарифм |
-rand->i | Генератор псевдослучайных чисел в диапазоне от 0 до 231-1 |
Отношения | |
P q eq->p=q | В стек помещается логическое значение true или false |
pq ne->p*q | |
pq le->p<q | |
p q lt->p<q | |
P-q #->p>q | |
Логические операции | |
bTb2and->blAb2 | Логическое И |
bl b2or->blvb2 | Логическое ИЛИ |
Ы Ь2 хог->М=Ь2 | Исключающее-ИЛИ |
bnot->£ | Логическое отрицание |
Команды save/restore рекомендуется использовать в начале и в конце описания каждой страницы.
Такой стиль программирования позволит в начале каждой страницы получать тот графический контекст и переменные, которые были определены в прологе программы. Использование в начале/конце описания страниц команд gsave/grestore позволяет сохранять графический контекст, но не освобождает память от определенных, но уже не используемых значений. Эти команды выполняются быстрее, чем save/restore? поэтому при печати больших файлов они могут оказаться более эффективными, В таблице 2 приведены команды для работы с графическими объектами.
4.5.6 Рисование и закраска фигур
Отличительным аспектом PostScript является то, что даже текст - это разновидность графики. Первой задачей будет рисование линий для создания изображения.
Основные шаги рисования и закраски фигур:
• Начать путь оператором newpath;
• Собрать путь из отрезков и кривых (не обязательно смежных);
• Нарисовать линию оператором stroke или закрасить оператором fill.
Эта последовательность действий может быть изменена для получения более сложных результатов.
Рисование прямоугольника
Нарисуем прямоугольник на расстоянии в дюйм от сторон левого нижнего угла страницы. Начнем с функции, переводящей дюймы в единицы измерения PostScript - пункты (один пункт равен 1/72 дюйма). Осуществить такое преобразование просто - достаточно умножить число дюймов на 72: