В предыдущей статье я писал, что PostScript стековый язык программирования, но не форт. Строго говоря, это так. Но разница между ними невелика. Эта статья больше памятка для себя, чем толковое описание PostScript.
Postscript - весьма старый язык программирования. И, строго говоря, это не совсем язык программирования. Он был создан в середине 80-х годов фирмой Adobe как универсальный язык управления абстрактным графическим устройством, реальным прототипом которого выступал лазерный принтер. Необходимость такого языка объяснялась маленькой мощностью компьютеров того времени и медленными интерфейсами передачи данных. Сегодня можно сформировать всю страницу для печати на компьютере и передать на печать как растровую картинку. Это почти не нагрузит ни компьютер ни увеличит время печати. Разве что чуть-чуть. Но в те времена у среднего компьютера просто не хватало оперативной памяти, чтобы прорисовать страницу для печати в цвете и с высоким разрешением.
Язык Postscript просто позволял переложить эту работу на специализированный контроллер принтера. Для нас ва жно то, что Postscript не просто язык управления принтером, а язык программирования на котором пишутся программы для принтера. Например, если нужно выполнить простейшую задачу и напечатать лист с линейной разметкой. Язык управления принтером должен направить принтеру указание напечатать столько-то линий на таком-то расстоянии друг от друга. При этом программа на Postscript может просто запустить на принтере цикл и напечатать линовку не отвлекая компьютер.
Одно из важных преимуществ Форта - этот язык одновременно и интерпретируемый и компилируемый. Программировать можно в диалоговом режиме, постепенно развивая словарь для создания нужной программы. Как это делается в других интерпретируемых языках. В качестве среды исполнения программ я использую Ghostscript. Файл “gswin64.exe” как раз запускает интерпретатор языка PostScript
При этом открывается окно Ghostscript Image куда будут выводиться результаты выполнения программы. Я не буду касаться того, как работают стековые языки, а сразу приступлю к описанию параллелей между Форт и Postscript.
Базовые понятия
Path
Я не буду переводить это на русский язык, хорошего аналога нет. Самый подходящий перевод - “контур”, но это слово нигде не используется. Path - это совокупность графических примитивов (линий, дуг, текстовых строк и т.п.). Path группирует эти графические элементы, так что с ними можно проводить общие операции. Например, чтобы нарисовать квадрат, нужно собрать четыре линии образующие стороны квадрата внутри path, тогда для них можно задать единую ширину линий, сделать заливку и т.п. Если каждая линия будет в собственном path, то параметры каждой линии придётсяс задавать отдельно, а выполнить заливку и вовсе не получится.
Есть также специальный clipping path, это path, который задаёт границы в которых можно рисовать. Всё, что рисуется за границами clipping path просто не будет отображаться. По умолчанию clipping path соответствует границам листа. Но это поведение можно и переопределить. В типографском деле clipping path называют “обтравочный контур”, это неплхо знать, но я так называть не буду.
Система коодинат
Язык Postscript изначально предназначен для создания изображений, поэтому система координат - одна из базовых вещей языка. Ситема координат - аппаратно независимая. Например, при рисовании на экране система координат обычно аппаратно-зависимая, т.к. рисование зависит от количества пикселей на области рисования, её разрешающей способности. Используются декартовы координаты, начало координат слева внизу, ось X идёт направо, ось Y - вверх. Базовая единица измерений - “пункт”, равный 1/72 дюйма. Это типографская мера длины. Систему координат можно менять, масштабировать, вращать и т.п. средствами самого языка. Иногда это создаёт удобство при рисовании
Арифметические операции
Арифметические операции задаются словами, а не знаками арифметики. Знаки арифметических операций не рабтают, хотя никто не мешает переопределить слова, чтобы делать операции в привычном виде.
add
- сложение;
sub
- вычитание;
div
- деление. Важное отличие Postscript от Форт в том, что в Postscript базовая арифметика - числа с плавающей точкой. При этом второй элемент стека делится на первый элемент стека.
idiv
- целочисленное деление;
mod
- целочисленный остаток от деления;
neg
- изменение знака числа.
В Postscript используется обратная польская нотация, так что арифметические операции работают в точности так же, как в Форте.
Операции над стеком
Стек - это основная особенность стековых языков программирования, которые включают в себя Форт, Postscript и некоторые другие. Как и в большинстве языков стек используется в режиме LIFO (последним пришёл, первым вышел). Стек используется для хранения данных. Все слова (операторы языка) используют данные, хранимые на стеке. Стек переводится на русский, как стопка. И это лучшая иллюстрация идеи. Представьте, что у вас стопка бумаг, на которых записаны значения, с которыми работает язык. Слово последовательно берёт из этой стопки бумажки, начиная с верхней, прводит необходимые операции и результат этих операций снова записывается на бумажки, которые складываются в стопку. Таким образом, операция
5 100 mul
Приведёт к тому, что два числа со стека будут умножены друг на друга, а вместо них будет записан результат умножения 5x100.
clear
- очистка стека;
dup
- удвоение числа на вершине стека;
pop
- удаление числа на вершине стека;
exch
- меняет местами два верхних элемента стека;
roll
- прокручивание стека, при этом два верхних элемента стека - это аргументы операции, верхнее число задаёт сколько элементов и в каком направлении прокручивать, второе число - сколько элементов прокручивать. Таким образом:
7 8 9 3 1 roll --> 9 7 8
7 8 9 3 -1 roll --> 8 9 7
pstack
- печать всего содержимого стека, при этом стек сохраняется;
==
- печать верхнего элемента стека, при этом он удаляется.
Базовые графические операции
Графика в языке Postscript рисуется невидимым “карандашом”. Каждая линия при рисовании - вектор с координатами начала и конца. Но в Postscript принято указывать две координаты - координаты конца линии. Начальная позиция соответсвует последней точке, на которой закончилось рисование предыдущей линии. Слова fill
, stroke
и некоторые другие сбрасывают эту позицию и её нужно задавать заново.
newpath
- этим оператором создаётся новый элемент для рисования, аналог canvas во многих графических средах;
moveto
- позицию начала рисования в координаты x y, координаты берутся с вершины стека. То есть:
144 72 moveto
lineto
- чертит линию в абсолютные координаты x, y заданные на вершине стека.
rlineto
- чертит линию в относительные координаты x, y заданные на вершине стека. Координаты задаются относительно последней точки заданной предыдущими командами графических примитивов или moveto.
setlinewidth
- задаёт ширину линий в пунктах. Пункт - типографская мера длины, 1/72 дюйма.
closepath
- проводит линию от текущей точки рисования до последней точки, заданной оператором moveto. Это позволяет строить аккуратные замкнутые фигуры.
stroke
- отображает всё, что быо нарисовано в newpath, т.к. предыдущие операторы задают графические примитвы, но не отображают их до этой команды;
fill
- делает заливку текущего path.
setgray
- устанавливает цвета в градациях серого.
showpage
- печатает страницу. Это команда для принтера, которая говорит, что вся страница сформирована и пора печатать. Если достаточно посмотреть содержимое страницы на экране - showpage не нужен, а в Encapsulated postscript, который и предназначен для показа на экране, эта команда запрещена. Поскольку мои примеры для вывода на экран, а не на принтер - я не привожу команду showpage дальше по тексту. Просто знайте, если отправляете файл на принтер - showpage добавить нужно.
Таким образом, простейшая программа для рисования квадрата будет такой.
newpath
270 360 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
closepath
4 setlinewidth
stroke
Операции с текстом
Язык Postscript и создавался для операций с текстом. Его возможности очень обширны и только некоторые из них будут приведены здесь. Текстовые строки в этом языке обрабатываются как любая другая графика. Ниже приведено несколько примеров по работе с текстом.
Изменение системы координат
Так как в Postscript используется пользовательская система координат - её тоже можно менять.
translate
- переносит начало системы координат в новую точку.
rotate
- позволяет повернуть оси системы координат на заданный угол, он отсчитывается от вертикальной оси против часовой стрелки.
scale
- позволяет изменить масштаб по каждой из координатных осей отдельно, поэтому параметра 2, scaleX и scaleY, масштаб по осям x и y соответственно.
Эта страница даже не пытается быть учебником по языку программирования Postscript. Для этого есть другие ресурсы, где можно найти куда больше информации.
- PostScript Tutorial - на английском языке, но очень краткое и на простом языке. Хотел бы я научиться так писать краткие пособия. Оно написано в 1998 году, но даёт всё необходимую информацию для начала работы.
- Mathematical illustrations - этой книгой можно было бы и ограничиться. Это именно учебник по компьютерной графике на Postscript. от основ языка до трёхмерной графики на Postscript. В книге рассматривается и теория, т.е. уравнения двух и трёх-мерной графики. При этом объём каждой главы довольно невелик, а английский довольно несложен.
- POSTSCRIPT УМЕР ДА ЗДРАВСТВУЕТ PDF?! - статья, где хорошо описана история создания Postscript и его дальнейшая судьба. В статье довольно много информации о недостатках Postscript, но они специфичны для издательского дела. На русском языке.
- Стековые языки - публикация в блоге, которая полностью соответствует названию, она описывает стековые языки. Маленькая статья, но приводит краткие сведения о многих стековых языках. На русском языке.
- Getting started with postscript - хорошее вводное руководство по языку Postscript с полезными сслылками. Документ изначально на английском языке, но поддерживается автоперевод на другие языки, включая русский. Качеество страдает.
- Русскоязычный сайт с материалами о Postscript. Он давно не обновляется, но работает и содержит все необходимые сведения на русском языке.
Подборка исчерпывающая. Из этих ресурсов мы можете узнать о Postscript больше, чем когда-либо хотели бы знать.