Краткий курс языка программирования PostScript
В предыдущей статье я писал, что 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
Приведёт к тому, что два числа со стека будут умножены друг на друга, а вместо них будет записан результат умножения 5×100.
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 во многих графических средах;
— позицию начала рисования в координаты 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 и создавался для операций с текстом. Его возможности очень обширны и только некоторые из них будут приведены здесь. Текстовые строки в этом языке обрабатываются как любая другая графика. Ниже приведено несколько примеров по работе с текстом.
Изменение системы координат
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 больше, чем когда-либо хотели бы знать.
|
Учебное пособие по PostScript
Оригинал: ноябрь 1990 г. Последнее обновление: декабрь 1998 г. Перевод на болгарский язык Альберта Уорда. Справочное руководство ВведениеPostscript — это язык программирования, предназначенный для указания макет печатной страницы. Принтеры Postscript и дисплей Postscript программное обеспечение использует интерпретатор для преобразования описания страницы в отображаемая графика. Следующая информация разработана в качестве первого руководства к постскриптуму. язык. Он будет сосредоточен на том, как использовать PostScript для создания графики. а не изучать его как язык программирования. К концу вы должны чувствовать себя уверенно в написании простых программы postscript для рисования графики и текста. Дальнейшая информация а полную спецификацию языка можно получить по адресу Справочное руководство по языку Postscript от Adobe Systems Inc, опубликовано Addison-Wesley, Reading, Massachusetts, 19.85. Зачем учить постскриптум, ведь многие программы могут его сгенерировать за вас а драйверы печати postscript могут печатать в файл? Некоторые причины могут быть:
Основы Файлы Postscript (как правило) представляют собой обычные текстовые файлы, поэтому их можно
легко генерируются вручную или в качестве вывода программ, написанных пользователем.
Как и в большинстве языков программирования, файлы PostScript (программы)
должен быть хотя бы частично удобочитаемым для человека. Таким образом, они
вообще свободный формат, то есть текст можно разбивать по строкам и
с отступом, чтобы выделить логическую структуру. ПутьПуть — это совокупность, возможно, несвязанных линий и областей, описывающих Изображение. Путь сам по себе не рисуется, после его указания его можно заштрихованы (линии) или заполнены (области), делая соответствующие отметки на странице. Существует специальный тип пути, называемый путем отсечения, это путь внутри которых ограничен будущий рисунок. По умолчанию путь отсечения прямоугольник, который соответствует границе бумаги, он не будет изменен во время этого урока. СтекPostscript использует стек, также известный как LIFO (Last In First Out). стек для хранения программ и данных. Интерпретатор постскриптума помещает программа postscript в стеке и выполняет ее, инструкции, которые require data будет считывать эти данные из стека. Например, есть оператор в постскриптуме для умножения двух чисел, mul . это требует два аргумента, а именно два числа, которые нужно умножить вместе. В постскриптуме это может быть указано как 10 20 мул Интерпретатор поместит в стек 10, а затем 20. Оператор mul удалит 20, а затем 10 из стека, умножьте их вместе и оставьте результат 200 в стеке. Система координатPostscript использует систему координат, которая не зависит от устройства, т. е. он не зависит от разрешения, размера бумаги и т. д. конечного вывода. устройство. Исходная система координат имеет ось x справа и ось y вверх, начало координат находится в нижнем левом углу страницы. Единицы представляют собой «точки», длина которых составляет 1/72 дюйма. Другими словами, если мы проведем линию от постскриптумной координаты (72,72) до (144,72), мы получим иметь линию, начинающуюся на один дюйм слева и справа от страницы, линия будет горизонтальной и иметь длину один дюйм. Систему координат можно изменить, то есть масштабировать, поворачивать и перемещать. Часто это делается для того, чтобы сформировать более удобную систему для конкретного создается рисунок. Основные команды рисованияПора что-нибудь нарисовать. Следующее состоит из ряда операторов и данные, некоторые операторы, такие как newpath , не нуждаются в аргументах, другие например, строк до берут два аргумента из стека. Все примеры в этом тексте показаны в виде постскриптума слева с результирующим изображение справа. Текст слева также действует как ссылка на печатную форму. форме файла постскриптума.
Также существуют относительные команды moveto и lineto, а именно rmoveto и rlineto . В следующем примере объект с заливкой будет нарисован в определенном месте. оттенок, как для контура, так и для интерьера. Диапазон оттенков от 0 (черный) до 1 (белый). Обратите внимание на closepath , который соединяет первую вершину путь с последним.
Команды рисования, такие как штрих и заполнение уничтожают текущий путь, способ обойти это — использовать gsave , который сохраняет текущий путь, чтобы его можно было восстановить с помощью grestore . ТекстТекст, пожалуй, самый сложный и мощный аспект постскриптума. поэтому здесь будет обсуждаться только часть его возможностей. Одна из приятных вещей заключается в том, что символы размещаются на страница ничем не отличается от любой другой графики. Интерпретатор создает путь для символа, а затем он либо обводится, либо заполняется как по обычному.
Как и следовало ожидать, позиция (100 200) выше указывает позицию нижнего левого угла текстовой строки. Первые три строчки в приведенный выше пример — это уборка, которую необходимо выполнить в первый раз используется шрифт. По умолчанию размер шрифта равен 1 пункту, затем устанавливается масштабный шрифт. размер шрифта в пунктах (1/72 дюйма). Скобки вокруг слов «Пример 3» указывает, что это строка. Слегка модифицированная версия вышеприведенного использует charpath для обработки символы в строке в виде пути, который можно погладить или заполнить.
Вы должны убедиться, что понимаете порядок операторов выше и результирующая ориентация и масштаб текста, процедурно это рисует текст, масштабировать ось y с коэффициентом 2, вращать счетчик по часовой стрелке вокруг начала координат, наконец, переведите систему координат до (100 200). ЦветДля тех, у кого есть цветные LaserWriters, основная интересующая инструкция, которая заменяет setgray в предыдущих примерах setrgbcolor . Требуется 3 аргумента, красно-зелено-синие компоненты цвета каждый варьируется от 0 до 1.
Программирование Как упоминалось во введении, постскриптум — это язык программирования.
Полный объем этого языка здесь не рассматривается, за исключением демонстрации
некоторые примеры процедур, которые могут быть полезны для упрощения постскриптума
генерации и сделать файлы PostScript меньше.
Эта процедура рисует три цветных квадрата рядом друг с другом, каждый 20/72 дюйма квадрат, обратите внимание на масштаб из 20 в системе координат. Процедура рисует единичный квадрат и ожидает, что цвет RGB будет в стеке. Это можно использовать как метод (хотя и неэффективный) рисования растровое изображение. Даже если вы просто рисуете много линий на странице, чтобы уменьшить Размер файла обычно определяется процедурой, как показано ниже. Это просто определяет один символ «l» для рисования сегмента линии, затем можно использовать команды типа 100 200 200 200 l», чтобы нарисовать отрезок от (100 200) до (200,200). /l { новый путь перейти к строке к штриху } def Некоторые другие полезные командыНиже приведены некоторые другие часто используемые команды, а также краткое описание, опять же, вам следует обратиться к справочному руководству для всего набор команд.
Рисунок «маленький» ИзображенияПечать изображений с использованием постскриптума несколько сложнее, чем графика обсуждалась до сих пор. Будут представлены примеры двух типов изображений, изображения в оттенках серого (которые также можно использовать для черно-белых изображений) и 24-битные изображения RGB. 8-битная шкала серогоСамый простой метод, применимый к небольшим images — это команда постскриптума image . Это принимает 5 аргументов: ширина и высота изображения, биты на пиксель, преобразование матрица (6 чисел) и, наконец, процедура получения данных изображения. В следующем примере изображение в градациях серого (8 бит) имеет ширину 24 пикселя и высоту 34 пикселя. Поскольку в постскриптуме изображение определяется из левого нижнего угла, и изображение определяется из его верхнего левого угла, преобразование матрица, используемая здесь, выполняет соответствующее вертикальное отражение. Процедура используемая здесь, по сути, нулевая процедура, это шестнадцатеричная строка как указано в угловых скобках. Postscript отображает изображения как одна квадратная точка, следовательно, масштабирование на 24 по горизонтали и 34 по вертикали. В этом обсуждении осталось много деталей, читателю необходимо для получения дополнительной информации обратитесь к справочному руководству Postscript.
24-битный цвет RGB Изображения RGB с 8 битами на пиксель могут быть представлены в постскриптуме с помощью команда colorimage , которая очень похожа на команду image . В следующем примере изображение имеет ширину 32 пикселя и высоту 38 пикселей.
Что такое EPS? EPS (Encapsulated PostScript) — это обычный постскриптум с некоторыми ограничениями.
и несколько комментариев в указанном формате, которые предоставляют больше информации о
последующий постскриптум.
Это было сделано для того, чтобы приложениям было проще включать постскриптум.
созданные в другом месте на их собственных страницах.
Полную спецификацию можно получить в Adobe, но
для создания файла постскриптума DSC (Adobe’s Document Structuring Convention)
должно быть верно следующее: Возможно, самое главное, поскольку обычно приложение, поддерживающее вставка файла postscript не имеет полного интерпретатора postscript, файл EPS обычно имеет изображение предварительного просмотра, связанное с ним. Приложение работа с файлом EPS может отображать предварительный просмотр в пользовательском интерфейсе давая лучшее представление о том, что будет напечатано. Следует отметить, что превью EPS являются одним из наиболее зависимых от машины/ОС аспектов EPS. Часто используемые комментарииКомментарии, конечно, могут быть добавлены где угодно, и они будут проигнорированы переводчик. Есть несколько стандартных комментариев, наиболее распространенные из которых перечислены ниже. Текст в квадратных скобках заменить с соответствующим текстом для файла, в котором они появляются (без []). %!PS-Adobe-3.0 EPSF-3.0 %%Creator: [обычно программа, сгенерировавшая постскриптум] %%Title: [описательное имя или просто имя файла] %%CreationDate: [дата создания файла] %%DocumentData: Clean7Bit %%Происхождение: [например: 0 0] %%BoundingBox: xmin ymin xmax ymax %%LanguageLevel: 2 [может быть 1 2 или 3] %%Страниц: 1 %%Страница: 1 1 %%EOF Рисование «больших» изображенийИз-за длины строки и других ограничений преобразование «больших» растровых изображений в postscript требует изменения методов, обсуждавшихся ранее. Далее будет описан наиболее общий случай представления 24-битного Цветное изображение RGB в виде файла EPS. Хотя это неэффективно, это также можно использовать для изображений в оттенках серого и даже черно-белых. В следующем коде «ширина» и «высота» должны быть заменены на числа, соответствующие изображению.
Модификации для изображений в оттенках серого довольно просты, измените строку {currentfile 3 ширина mul string readhexstring pop} привязкак {текущая ширина файла строка readhexstring pop} привязка и, конечно же, напишите только одно шестнадцатеричное число (обозначающее серый уровень пикселя) для каждого пикселя изображения. Эта техника должна работать для изображений любого размера. Размеры бумагиРазмер бумаги (в пунктах) ------------------ --------------------- Сообщение #10 Конверт 297 х 684 Конверт C5 461 x 648 Конверт DL 312 x 624 Фолио 595 х 935 Исполнительный 522 x 756 Письмо 612 х 792 Легальный 612 x 1008 Леджер 1224 x 792 Таблоид 792 x 1224 А0 2384 х 3370 А1 1684 х 2384 А2 1191 х 1684 А3 842 х 1191 А4 595 х 842 А5 420 х 595 А6 297 х 420 А7 210 х 297 А8 148 х 210 А9 105 х 148 В0 2920 х 4127 В1 2064 х 2920 В2 1460 х 2064 B3 1032 х 1460 Б4 729х 1032 В5 516 х 729 В6 363 х 516 В7 258 х 363 В8 181 х 258 В9 127 х 181 В10 91 х 127 |
PostScript — это язык программирования
Перейти к содержимому
PostScript — это в первую очередь язык описания страниц, который используется для описания графических элементов и текста на странице или другом типе документа. Однако этот язык достаточно универсален, чтобы называть его настоящим языком программирования высокого уровня.
- Как и другие компьютерные языки, PostScript поддерживает различные типы данных, такие как числа, массивы и строки. В программе PostScript могут быть циклы, условные операторы и процедуры. Язык чем-то напоминает язык программирования Forth.
- Синтаксис языка описан в так называемой Красной книге, которую можно найти здесь. Как и во всех компьютерных языках, малейшее отклонение от четко определенных соглашений языка приводит к сообщению об ошибке и компьютерной системе, которая вообще отказывается что-либо делать. Если вы распечатываете задание на устройстве PostScript, а сбой сети приводит к тому, что команда «showpage» поступает на выходное устройство как «shopage», система с радостью выдаст сообщение об ошибке «undefined» и откажется печатать ваше задание, даже если он уже обработал всю вашу страницу, и команда ‘showpage’ просто должна сообщить устройству вывода, что оно может начать вывод вашего шедевра. В прошлом такие ошибки возникали регулярно — отсюда и длинный список сообщений об ошибках PostScript, которые можно найти на этом сайте.
- Как и некоторые калькуляторы HP, язык PostScript использует обратную польскую запись (RPN).
- Поскольку PostScript практически всегда используется для описания того, где что-то находится на странице, он имеет систему координат. По умолчанию его отправной точкой считается левый нижний угол страницы. Расстояния или измерения обычно выражаются в пунктах. В дюйме 72 точки. 1 точка измеряет 0,352 мм.
Вот видео Computerphile о программировании на PostScript:
PostScript — это высококлассный язык программирования, а это означает, что даже простые люди могут смотреть на инструкции и понимать, что они означают.