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

         

Траектория отсечения


В графическом состоянии PostScript имеется траектория отсечения

(clipping path), представляющая собой границы области на текущей странице, в которой изображения могут быть нарисованы. Первоначально этот путь совпадал с углами бумаги, используемой принтером. Текущая траектория отсечения может быть изменена с помощью оператора clip. Этот оператор делает текущую траекторию траекторией отсечения. Все последующие "рисующие" операторы будут отсекаться, если изображение выходит за границы траектории отсечения.

Например, следующая программа конструирует траекторию в виде треугольника и делает его траекторией отсечения. Затем она рисует прямоугольную сетку и после печати мы видим, что осталось только та часть сетки, которая попала в этот прямоугольник.

/triangle

/inch {72 mul} def

{newpath

  0 0 moveto

  2 inch 0 lineto

  1 inch 2.8 inch lineto

  closepath} def

/vgrid

{newpath

  0 9 2 inch

 {0 moveto

  0 3 inch rlineto} for

  stroke} def

/hgrid

{newpath

  0 10 2.8 inch

  {0 exch moveto

  2 inch 0 rlineto} for

  stroke} def

% main program

200 300 translate

triangle clip

vgrid

hgrid

showpage

<сюда вставить после выполнения>

В качестве отсекающих границ может быть использован любая траектория, включая и след символа, оставляемый оператором сharpath.

Урок шестой

Начать это занятие, наверное, нужно с извинений. В тексте предыдущего урока (см. №12/1996) по техническим причинам во всех строчках с описанием синтаксиса операторов PostScript вместо правой стрелки (à), показывающей результат операции, напечатан символ “n”. Сделайте, пожалуйста, авторучкой замену.

Встраивание PostScript-программ в документы

Так как в России наиболее широко для издательской подготовки текстов и даже для вёрстки используется Word для Windows, то следующей вопрос, который требует пояснения, – как встроить программу на PostScript в документ Word. Дело в том, что Word имеет собственный формат файлов, а программа на PostScript – это обычный ASCII-текст. Разработчики решили эту задачу просто: они оставили для таких случаев лазейку, которая называется поле print. Напомню, что полями в Word называются специальные команды редактора, заключённые в фигурные скобки. Поле print предназначено для того, чтобы выводить символы непосредственно на принтер (например, команды прямого управления принтером, команды на языке PCL и, конечно, PostSript-программы). Формат поля:


  {print \p Size “текст”}

Ключ \p указывает, что в поле текст будет записана PostSript-программа. Операторы PostScript, заданные в этом поле, могут работать только в окне рисования, определённом атрибутом Size, значения которого приведены в таблице.

Аргумент

Значение

page

Рисунок на всей текущей странице (по умолчанию)

para

В пределах абзаца (высотой не менее дюйма), содержащего поле print

pic

Рисунок располагается после поля print и до конца абзаца, содержащего это поле

row

Рисунок в текущей строке таблицы

cell

Рисунок в текущем элементе таблицы

Dict

Используется для создания определений и процедур на PostScript, которые будут выполнены позже на той же самой странице. Поэтому dict не следует использовать для рисования.

Так как текст и графика документа Word печатаются на той же PostScript-странице, что и результат PostScript-программы, не следует использовать операторы, которые изменяют или сбрасывают среду PostScript, а именно, избегайте операторов: banddevice, copypage, framedevice, grestoreall, initgraphics, initmatrix, nulldevice, renderbands и showpage.

При работе с PostScript в Word вам доступны переменные, которые я свёл в следующую таблицу. Значения, представленные этими переменными, даны в пунктах.

Size

Переменная

Описание

Для всех аргументов

wp$x

wp$y

wp$page

wp$fpage

wp$date

wp$time

wp$box

Ширина прямоугольника рисования для

заданного аргумента Size

Высота прямоугольника рисования для

заданного аргумента Size

Текущий номер страницы

Отформатированный номер страницы (строка)

Текущая дата (строка)

Текущая дата (строка)

Путь, содержащий прямоугольник рисования

page, para

wp$top

wp$bottom

wp$left

wp$right

Верхняя граница (page); расстояние до (para)

нижняя граница (page); расстояние после (para)

Левая граница (page); левый отступ (para)

Правая граница (page); правый отступ (para)

page

wp$col

wp$colx

wp$colxb

Число столбцов на странице. Это число может различаться в зависимости от секции документа, в которой появилось поле с PostScript-операторами

Ширина каждого столбца

Расстояние между столбцами

para

wp$first

wp$style

Отступ до первой строки

Стиль

<


Пример.

{print \p page "/Times-Roman findfont strsize scalefont 0.8 setgray" }

Ещё о типах данных

Все данные, доступные PostScript-программам, существуют в виде объектов. Объекты делятся на простые, не имеющие внутренней структуры, и сложные (или составные). К последним относятся строки, массивы и словари.

Говоря о строках в PostScript, следует отметить, что в нём, как и в языке Си, есть возможность с помощью обратной косой черты и следующего за ним символа задавать специальные и управляющие символы. Вот ещё одна полезная таблица с такими комбинациями знаков.

\n     новая строка

\r     возврат каретки

\t     табуляция

\b     возврат на позицию

\f     перевод формата

\\     обратная косая черта

\(     левая скобка

\)     правая скобка

\ddd        символ с восьмеричным кодом ddd

Если за \ следует символ, не перечисленный выше, то и он, и обратная косая черта игнорируются. Следующие две строки одинаковы:

(Строка с символом перевода строки.



(Строка с символом перевода строки.\n)

Ещё один тип данных, о котором мы почти не говорили, – словари. Словарь – это ассоциативная таблица, элементы которой – пары PostScript-объектов. Первый элемент пары называется ключом, а второй – значением.

Обычно в качестве ключей используются имена объектов, а в качестве значений – переменные и процедуры. В частности, шрифты в PostScript также задаются словарями: именам символов соответствуют процедуры рисования образов этих символов. Есть и другие примеры использования словарей. В языке есть операторы, которые ищут ключ и выбирают соответствующее ему значение, вставляют пару ключ--значение в словарь и выполняют некоторые другие действия.

Для работы со словарями в языке имеется специальный стек. Словарь, находящийся в вершине этого стека, называется текущим словарём. Обычно, встречая имя объекта в выполняемой программе, интерпретатор обращается с ним к текущему словарю. Если он не находит там это имя, он обращается к словарю, расположенному в стеке словарей вслед за текущим, и так далее, пока не будут просмотрены все словари в стеке.



В интерпретаторе имеется два встроенных словаря, называющихся systemdict и userdict (в PostScript Level 2 к ним добавился ещё один словарь – globaldict). Первый из них связывает (ассоциирует) имена всех операторов языка с их значениями (т. е. действиями, которые выполняются самим интерпретатором). Второй словарь предназначен для связи имён переменных среды с их значениями. Оба встроенных словаря находятся внизу стека (userdict над systemdict) и не могут быть из него удалены.

Операторы для работы со словарями

Создать пустой словарь ёмкостью N элементов можно с помощью оператора dict. Его синтаксис:

число_элементов dict à словарь

Этот пустой словарь помещается в стек операндов. Аргумент число_элементов

не может быть отрицательным.

Оператор currentdict выполняет обратное действие – помещает копию текущего словаря в стек операндов.

Синтаксис: - currentdict à словарь

Оператор countdictstack пересчитывает число словарей, находящихся в стеке словарей, и помещает это число в стек операндов.

Синтаксис: - countdictstack à int

Оператор cleardictstack извлекает из стека все словари, кроме постоянных.

Синтаксис: - cleardictstack à -

Для замены или внесения нового элемента в словарь используется оператор put. На самом деле этот оператор полиморфен и позволяет также заменять элементы массивов и строк.

Синтаксис:

массив индекс значение put à -

словарь ключ значение put à -

строка индекс целое

put à -

Если первый операнд массив или строка, то второй рассматривается как индекс, значение которого лежит в диапазоне от 0 до n-1 (где n – длина строки или массива). Элемент с этим индексом замещается третьим операндом.

Если первый операнд — массив, то второй —  рассматривается как ключ и в словаре сохраняется пара ключ--значение, если данный ключ не будет найден, либо замещается только значение, если пара с таким ключом уже существует. Конечно, при создании нового входа в словарь интерпретатор проверяет наличие там свободного места и выдаёт сообщение об ошибке dictfull, если число входов уже исчерпано.



Пример.

/mydict 10 dict def

mydict /A 65 put

Обратное действие выполняет оператор get. С его помощью можно получить значение элемента массива, строки или по ключу найти соответствующее значение в словаре.

Синтаксис:

массив индекс put à

значение

словарь ключ put à

значение

строка индекс put à

целое

Пример.

/abc [1 2 3] def

currentdict /abc get à [1 2 3]

Со словарём очень интересно работает также оператор forall. Ранее его действие рассматривалось только по отношению к массиву, но он, как и два предыдущих оператора, работает и со словарями, и со строками.

Синтаксис:

массив proc forall à

-

словарь proc forall à

-

строка proc forall à -

Если первый операнд — словарь, то forall помещает ключ и значение в стек операндов и выполняет заданную процедуру (proc) над каждой парой ключ--значение в словаре. Если процедура пустая "{}", то таким образом все пары из словаря просто переписываются в стек операндов.

Объекты типа operator

Этот несколько необычный для языков программирования тип объектов в PostScript означает одно из встроенных в язык действий, вызываемое при исполнении объекта. Операторы имеют имена, большинство из которых хранится в systemdict в качестве ключей, а значением является программа, реализующая семантику данного оператора.

Другие типы объектов (name, file, mark, null, save, fontID), которые не были рассмотрены до сих пор, мы изучим в разделах, с ними непосредственно связанных. Но вот что важно для объектов всех типов: каждый объект кроме типа и значения имеет один или несколько атрибутов, которые влияют на поведении объекта при его исполнении или когда над ним выполняются определённые операции (кроме случая, когда объект рассматривается только как данные).

Атрибуты объекта

Каждый объект либо литерал (literal), либо исполняемый(executable). Это важно для интерпретатора при исполнении PostScript-программы. Отметим, что при такие операторы, как "[" и "]" создают литеральные объекты, а операторы "{" и "}" – исполняемые. Другим атрибутом объекта является тип доступа (access) к нему. Имеется четыре типа доступа (расположены в списке по возрастанию ограничений): неограниченный (unlimited), только чтение (read only), только исполнение (execute-only) и без доступа (none).



Как правило, объект имеет неограниченный доступ. Это означает, что допускается применение к нему всех операторов, какие определены для работы с ним. Объекты с атрибутом "только чтение" не допускают модификацию своего значения и могут быть только считаны или выполнены. Аналогично, атрибут "только исполнение" определяет, что объект не может быть прочитан, а только исполнен интерпретатором. И наконец, объекты с атрибутом "без доступа" служат для каких-то внутренних целей, о которых я в данный момент ничего не знаю. Понятно, что они не используются программами напрямую. Для получения типа объекта служит оператор type.

Синтаксис: объект type à имя_типа

Результатом операции может быть одно из перечисленных имен:

arraytype        booleantype        dicttype

filetype         fonttype           integertype

marktype         nametype           nulltype

operatortype     realtype           savetype

stringtype

Следующие три оператора проверяют соответственно тип доступа объекта: wcheck - возвращает true, если объект имеет атрибут ulimited; xcheck – возвращает true, если объект исполняемый, и false, если литерал; rcheck – возвращает true, если объект "только для чтения".

Синтаксис у них одинаковый. Например, для wcheck он выглядит так:

объект

wcheck à

лог_значение

Операторы cvlit и cvx позволяют изменить атрибут объекта, находящегося в вершине стека операндов, с исполняемого на литеральный и наоборот.

Синтаксис: объект cvlit à объект

       объект cvx à объект

Виртуальная память

Виртуальной памятью (обозначается VM) называется область памяти, в которой хранятся значения составных объектов. В некоторых реализациях PostScript может сохранять VM в файле в конце сеанса и восстанавливать её в начале следующего. Сохранить и восстановить текущее состояние VM во время выполнения программы можно также с помощью операторов save и restore, а проверить состояние VM – с помощью оператора vmstatus.



Цветовые модели в PostScript

В языке поддерживаются две цветовые модели: HSB (тон-насыщенность-яркость) и RGB (красный-зеленый-голубой). В каждой из этих моделей можно задать любой цвет с помощью трёх числовых параметров. В более простой модели RGB цвет задаётся сочетанием интенсивности трёх основных цветов: красного, зеленого и голубого. Интенсивность цвета задаётся числом в диапазоне от 0 до 1, причём 0 означает полное отсутствие данного цвета, а 1 – его максимальную интенсивность. Если для всех трёх цветов заданы равные интенсивности, то в результате получится чистый серый цвет с градацией по всей шкале от белого (0, 0, 0) до черного (1, 1, 1). Напомню, что уровень серого цвета обычно устанавливается оператором setgray.

В HSB тон

задаёт собственно цвет. Он определяется его расположением на цветовом круге: 0°

-- чистый красный, 120°

-- зелёный, 240° -- синий. Остальные цвета получаются из смешения двух соседних. (Так, 60° -- жёлтый, , 180°

-- голубой, 300°

-- фиолетовый.) Насыщенность – густота цвета заданного тона: 0 соответствует отсутствию цвета, а 1 – максимальной его насыщенности. Яркость

– общая интенсивность цвета (содержание белого цвета в данном цвете): 0 соответствует чёрному цвету, а 1 – белому (максимальной интенсивности).

Цвет может быть задан с помощью соответствующих модели операторов setrgbcolor и sethsbcolor.

Выборка произвольного элемента из стека

Оператор index удаляет неотрицательное целое число n из стека операндов, отсчитывает n-й элемент от вершины стека и помещает копию этого элемента в стек. Это очень напоминает выборку элемента массива. При этом первый элемент в стеке имеет индекс 0. Вместе с операторами copy, dup и roll он позволяет свободно манипулировать содержимым стека операндов.

Синтаксис: an ... a0 n index à an ... a0 an

где an ... a0 – элементы стека операндов.

Пример.

Обозначим буквами содержимое стека, тогда:

A D G 0 index à A D G G

A D G J F 4 index à A D G J F A



Оператор clear извлекает все объекты из стека операндов и уничтожает их.

Синтаксис: a1 ... an clear à -

Оператор count пересчитывает число элементов в стеке операндов и возвращает его в вершине стека.

Синтаксис: a1 ... an count a1 ... an n

Примеры.

clear count -à 0

clear 1 2 3 count à 1 2 3 3

Оператор countexecstack считает число объектов в стеке исполнения и помещает это число в стек операндов.

Синтаксис:- countexecstack à int

Оператор counttomark считает число любых объектов в стеке операндов начиная с вершины стека и до первого маркера (не включая его самого).

Синтаксис: mark ob1 ... obn counttomark à

mark ob1 ... obn n

Пример.

1 mark 2 3 counttomark à 1 mark 2 3 2

Оператор cleartomark извлекает любые объекты из стека операндов, пока не будет достигнут маркер, который также удаляется из стека.

Синтаксис: mark ob1 ... obn cleartomark à -

Ещё о работе с отсечениями

Операторы clip и clippath мы рассмотрели на прошлом занятии. Теперь несколько углубим эту важную тему.

Оператор eoclip находит пересечение внутри текущей траектории отсечения с внутренней областью текущей траектории, чтобы создать новый, меньший текущий путь отсечения. Область внутри текущего пути определяется по правилу чётное-нечётное, тогда как область внутри текущего пути отсечения определяется правилом, использованным при создании данного пути отсечения.

За исключением указанных правил, действие оператора eoclip аналогично действию оператора clip.

Синтаксис:  - eoclip à -

Оператор initclip замещает параметр текущей траектории отсечения в состоянии графической среды на траекторию отсечения, устанавливаемую для текущего графического устройства по умолчанию. Этот путь обычно соответствует границам максимально большой области для вывода изображения. Для устройств, ориентированных на постраничный вывод, его размерности устанавливаются оператором setpagedevice. Для экрана область отсечения, устанавливаемая оператором initclip, не очень хорошо определена.



Ситуаций, когда в PostScript- программе следует применять оператор initclip, не так много. Описание страницы, в которой применён этот оператор, обычно даёт некорректный результат, если оно встроено в другую, составную страницу.

Синтаксис:  - initclip à -

Оператор eoviewclip (L2) аналогичен оператору viewclip за исключением того, что использует правило чётный-нечётный для определения области внутри пути отсечения.

Синтаксис:  - eoviewclip à -

К сожалению, за одно занятие удаётся рассказать не так много, как хотелось бы, поэтому рекомендую посмотреть очень полезные примеры программ на PostScript из Голубой книги по адресу: http://www.fwi.uva.nl/~heederik/ps/bluebook/

Урок седьмой

О работе с файлами

Отмечу, что здесь по сравнению с другими языками нет почти ничего нового. В PostScript файл определяется как конечная последовательность символов, заканчивающаяся маркером "конец файла". Нет разницы между файлом, хранящимся на диске, и файлом, получаемым по линии связи или генерируемым "на лету" каким-либо приложением. Различаются входные (input) и выходные (output) файлы. Входные файлы служат для интерпретатора PostScript источником исполняемых программ и они могут им читаться как последовательность символов. При этом входной файл может быть закрыт явно с помощью оператора closefile, либо неявно – при достижении маркера конца файла. Файл – это один из объектов языка. Объект такого типа создаётся с помощью оператора file. По существу это обычное открытие файла. Кстати, существует ограничение на число одновременно открытых файлов (зависит от ОС).

Синтаксис: имя_файла тип_доступа file à файл

Аргумент имя_файла должен соответствовать соглашениям операционной системы, в которой работает интерпретатор. В PostScript существуют предопределённые имена файлов, такие как %stdin и %stdout. Тип_доступа задаётся одной из букв:

'r' – входной файл (только чтение);

'w' – выходной файл (только запись).



Для удобства в языке есть несколько операторов чтения: read, readstring, readhexstring и readline.

Оператор read проверяет есть ли в файле ещё непрочитанные символы. Если нет (конец файла), закрывает файл и возвращает в стеке false. В противном случае читает из файла следующий символ, помещает его в стек, а затем, как признак успешной операции, помещает в стек true.

Синтаксис: файл read à байт true 'if not EOF

à

false 'if EOF

Оператор readline читает из файла последовательность символов, ограниченную символом конца строки, и сохраняет их в аргументе строка (при этом сам терминатор строки туда не записывается). Если строка заполнена раньше, чем встретился символ новой строки, возникает ошибка, которая называется rangecheck. При успешном завершении операции чтения в стеке возвращается также true, иначе – false.

Синтаксис: файл строка readline à

подстрока true 'if not EOF

à

false 'if EOF

Так как изображение в PostScript часто кодируется как массив 16-ричных чисел и, если оно достаточно большое, его неудобно держать внутри программы, то считать его из файла поможет специальный оператор – readhexstring.

Он последовательно считывает 16-ричные цифры из файла проверяя их на диапазон 0-9, A-F. Происходит последовательное формирование из двух цифр одного байта и запоминание его в строке. При этом все символы типа пробелов, табуляций и возвратов каретки игнорируются. Чтение заканчивается, когда достигается конец файла. Ограничения на максимальную длину строки накладываются операционной системой. Синтаксис как и у оператора readline.

Такой же синтаксис имеет и оператор readstring. От readline он отличается только тем, что считанные символы рассматриваются как целые числа в диапазоне от 0 до 255. Особо рассматривается только символ новой строки.

Информация о числе байтов, доступных для чтения в файле, возвращается оператором bytesavaiable. Если результат равен -1, достигнут конец файла.

Синтаксис: файл bytesavaiable à число_байтов



Оператор currentfile возвращает объект типа file, из которого интерпретатор PostScript читал наиболее недавно.

Синтаксис: - currentfile à

файл

Обычно возвращается стандартный файл ввода. Если не было чтения из какого-либо файла, то оно производится из файла программы. При этом указатель текущей позиции устанавливается после последнего считанного интерпретатором слова (оператора или элемента данных). Данное свойство используется для того, чтобы поместить в переменные текст или рисунок, находящиеся непосредственно в программе. Это демонстрирует пример, взятый из описания оператора:

/str 128 string def

currentfile str readline

строка, помещаемая в переменную текст

pop /text exch def

Оператор closefile разрывает связь между объектом типа file и соответствующим ему реальным файлом.

Синтаксис: файл closefile à -

Наконец, среди операторов ввода-вывода есть ещё ряд вспомогательных и очевидных операторов типа status, flush.

Соглашения по структуре программы

Язык PostScript не определяет общую структуру PostScript-программы, однако существуют некоторые соглашения, облегчающие её структуризацию. Для записи информации о программе используются комментарии специального вида. Такой комментарий занимает строку целиком и начинается не с одного знака процента, а с двух. Специальные комментарии делятся на три группы: заголовочные комментарии (header comments), комментарии тела программы (body comments) и комментарии эпилога(trailer comments).

Заголовочные комментарии предшествуют тексту программы. Комментарии тела программы служат для разделения разных частей описания страницы. Комментарии эпилога следуют после текста программы и дают о ней дополнительную информацию.

 

Заголовочные комментарии

Некоторые из этих комментариев могут помещаться в конце программы по усмотрению программиста или приложения, генерирующего PostScript-файл.

%%DocumentFonts: шрифт1 шрифт2 ...

где шрифт1 шрифт2 – имена PostScript-шрифтов, используемых в документе. Данная информация может использоваться некоторыми утилитами, загружающими шрифты в принтер до печати документа. Допускается указывать (atend), означающее присутствие, ожидание или что-то в этом роде.



%%Title: текст

задаёт заголовок документа. текст – строка заголовка.

%%Creator: имя_создателя

содержит имя программиста (или программы), породившего данный текст.

%%CreationDate: дата_и_время_создания

%%For: текст

указывает имя персоны, для которой был создан документ. Если комментарий %%For пропущен, подразумевается автор документа, указанный в %%Creator.

%%Pages: страниц

число страниц в документе (неотрицательное целое число), либо слово (atend).

%%BoundingBox: llx lly urx ury

координаты левого нижнего и правого верхнего угла в системе координат пользователя, либо слово (atend).

%%EndComments

завершает секцию заголовочных комментариев.

Пример.

%!PS-Adobe-2.1

%%Creator: Adobe Illustrator(TM) 3.2

%%For: (Eduard Projdakov) (PC Week/RE)

%%Title: (NewPS)

%%CreationDate: (2/10/97) (4:30 PM)

%%BoundingBox: 429 490 495 565

%%Pages: (atend)

%%DocumentFonts: (atend)

%%EndComments

Комментарии тела программы

%%EndProlog

конец секции пролога программы.

%%Page: метка порядковый_номер

где метка – текст с названием страницы, а порядковый_номер – номер страницы в многостраничном документе.

%%PageFonts: шрифт1 шрифт2 ...

задает список шрифтов, используемых для текущей страницы документа.

%%Trailer

отмечает конец тела программы и начало эпилога.

Комментарии эпилога

Эта секция состоит из комментариев типа %%DocumentFonts, %%Pages и %%BoundingBox.

Операторы рисования

В языке PostScript в операторах рисования важно знать когда точка считается внутренней по отношению к текущей траектории (отсечению), а когда – внешней. Есть два правила определения внутренней точки: чётный-нечётный

и ненулевого поворота (on-zero winding). Оба правила основываются на подсчете пересечений лучей из проверяемой точки с текущей траекторией.

Метод ненулевого поворота заключается в следующем: из проверяемой точки по всем направлениям рисуются лучи, а затем анализируются места пересечения с сегментом траектории. Начиная со счётчика равного нулю мы добавляем к нему единицу, если луч пересекает траекторию слева направо, вычитаем единицы, если он пересекает её справа налево. Если счётчик равен нулю, точка внешняя, иначе – внутренняя. Правило не определяет, что происходит в случае, если луч проходит по касательной или перпендикулярно к сегменту.



Правило чётный- нечётный отличается от предыдущего тем, что подсчитывается просто число пересечений лучом сегментов траектории. Если число чётное, точка внутри области. Если нечётное – внешняя.

Для простых фигур результат применения каждого из правил совпадает. Различие проявляется на более сложных фигурах.

Оператор fill заполняет текущим цветом область, ограниченную текущей траекторией используя правило ненулевого поворота. Любое предыдущее содержимое этой области на текущей странице теряется, поэтому если заливка производится белым цветом, то это свойство может быть использовано для очистки области .

(Замечу, что страница целиком очищается с помощью не имеющего аргументов оператора erasepage, который закрашивает её серым цветом уровня 1, не изменяя состояния графической среды. Этот оператор выполняется также автоматически после оператора showpage.)

Синтаксис: - fill à

-

Перед рисованием fill явным образом закрывает любые открытые подпути текущей траектории. Для её сохранения следует использовать последовательность операторов gsave fill grestore.

Для заливки области по правилу чётный-нечётный используется оператор eofill. В остальном он полностью идентичен оператору fill.

Задание. Чтобы почувствовать разницу между двумя этими правилами, нарисуйте с помощью PostScript две одинаковых пятиугольных звезды (не убирая внутренние линии) и заполните их внутренние области с помощью операторов fill и eofill соответственно.

Для того, чтобы поместить графическое изображение на страницу, используется оператор image.

Синтаксис:

ширина высота бит/точка матрица процедура image à -

Изображение помещается в прямоугольную область размером ширина на высоту точек, каждая из которых представлена значением из бит/точка данных (1, 2, 4 или 8 битов на точку). Данные изображения считываются как последовательность символов, причём, если точка кодируется менее 8 битами, то данные упакованы в байте слева направо.

Изображение на странице имеет свою собственную систему координат, за начало которой (0,0) принят нижний левый угол прямоугольной области изображения, а верхний правый угол имеет координаты (ширина, высота). Операнд матрица задаёт преобразование из пространства пользователя в систему координат изображения.



Последний операнд (процедура) последовательно выполняется оператором image, чтобы получить данные изображения. Обычно эти данные читаются из файла с помощью оператора readhexstring.

Операторы поиска и другие полезные операторы

Оператор anchorsearch определяет, совпадает ли начальная подстрока строки1 со строкой2. (в этом случае строка1

как минимум равна по длине строке2

и соответствующие символы совпадают). Если совпадает, то строка1 разбивается на две подстроки в одну из которых помещается совпавшая часть, а в другую остаток строки1.

Синтаксис: строка1 строка2 anchorsearch à

остаток совпавшая_часть true (если найдена)

строка1 false (если не найдена)

Примеры.

(edward) (ed) anchorsearch à (ward) (ed) true

(edward) (dw) anchorsearch à

(edward) false

Более общую форму поиска даёт оператор search. Он позволяет найти первое вхождение строки2 в строку1. Результат поиска как и у anchorsearch возвращается в стеке операндов. При этом в вершине стека находится результат операции (true или false), а строка1 разбивается на 3 сегмента: часть строки до совпавшей подстроки (pre), совпавшая подстрока

(match) и остаток строки

(post).

Синтаксис: строка1 строка2 search à

post match pre true (если найдена)

строка1 false (если не найдена)

Примеры.

(edward) (ed) search à (ward) (ed) () true

(edward) (dw) search à

(ard) (dw) (e) true

(edw) (W) search à

(edw) false

В одном из писем читатель спросил, нет ли ещё каких-либо операторов отсечения, так как тех, что были описаны в уроках, ему недостаточно. Вот некоторые из них:

 - reversepath à -

изменяет направление текущего пути;

- pathbox à llx lly urx ury

возвращает границы области текущего пути;

- currentpoint à x y

возвращает координаты текущей точки.

PostScript Level 3

11 сентября 1996 г. фирма Adobe Systems объявила о выходе следующего уровня языка PostScript. В PostScript Level 3, по заявлению фирмы, улучшена производительность, функциональные возможности и качество. На самом деле, предпринята попытка создать совокупность решений, покрывающих очень широкую область применений: от домашних систем и малых офисов до больших корпоративных сетей и Интернет. По заявлению представителя фирмы, PostScript Level 3 это результат воздействия трёх тенденций рынка: распространения Интернет, усиления использования цвета и перехода от печати и дистрибуции к дистрибуции и печати по запросу. Учитывая, что появилось много новых источников цифровых документов, например онлайновые службы, intranet, цифровые камеры, электронная почта и т. д., а сами документы становятся всё более сложными и предназначенными для печати в любой точке планеты, создание нового уровня PostScript вполне закономерно. Adobe предложила больше чем язык описания страниц для выпуска и печати электронных документов. В Level 3 реализован ряд новых технологий: Advanced Page Processing, Enhanced Image Technology, NetWorks System и PlanetReady Printing.



Технология Enhanced Image Technology (EIT) обеспечивает более быструю, простую и качественную печать документов. Главное преимущество для пользователя в том, что EIT распознаёт объекты изображения и автоматически оптимизирует их обработку. Введена поддержка печати трёхмерных изображений, изображений с фотографическим качеством и др.

Технология Advanced Page Processing (APP) увеличивает производительность системы обработки изображения. Так как компоненты документа становятся более сложными печатающая система будет обрабатывать каждую компоненту как отдельный объект, в последовательности оптимизированной для повышения пропускной способности. PostScript Level 3 будет поддерживать обработку содержимого Web-узлов, включая работу с HTML- и PDF-файлами. Чтобы обеспечить совместимость с основными операционными системами и сократить время пересылки шрифтов в принтер, в APP расширен также набор резидентных шрифтов. Это. Кроме того, фирма Adobe интегрировала в Level 3 поддержку формата PDF.

Система NetWorks System упрощает использование и управление принтером, подсоединённым к сети. Принтер с этой системой имеет свою Web-страницу, базирующееся на Web управление, печать непосредственно с Web-страницы принтера, поддержку всех промышленных стандартов на технологию дистанционного управления и другие возможности.

Технология PlanetReady Printing, реализованная, обеспечивает в принтерах с PostScript Level 3 поддержку национальных языков.

Adobe завершила разработку PostScript Level 3 и сейчас занимается его внедрением. План-график выпуска продукта предусматривает два внутренних цикла улучшения качества перед поставкой системы производителям принтеров и партнерам, разрабатывающим ПО (начало поставок планировалось на декабрь прошлого года). Во второй половине этого года, когда начнётся выпуск продуктов, базирующихся на этой версии языка, фирма Adobe обещала опубликовать описание PostScript Level 3. Подождём. Время бежит быстро.

Книги по PostScript фирмы Adobe Systems



Литературы по PostScript не так уж много. В основном это три руководства, изданных (и переиздаваемые) фирмой Adobe в издательстве Addison-Wesley Publishing.

PostScript Language Program Design. ISBN 0-201-14396-8, 256 pp., $24.95.

PostScript Language Reference Manual, Second Edition. ISBN 0-201-18127-4, 784 pp., $32.95.

PostScript Language Tutorial and Cookbook. ISBN 0-201-10179-3, 256 pp., $21.95.

Возможно вам окажутся полезными ещё несколько книг:

Programming the Display PostScript System with NEXTSTEP. ISBN 0-201-58135-3, 416 pp. $26.95.

Programming the Display PostScript System with X. ISBN 0-201-62203-3, 624 pp. $29.95.

Adobe Type 1 Font Format. ISBN 0-201-57044-0, 114 pp., $16.95.

Portable Document Format Reference Manual: The Official Guide to the File Format for Adobe Acrobat. ISBN 0-201-62628-4, 240 pp., $24.95

Кроме печатных книг по языку, существует ряд полезных публикаций на различных Web-узлах. Так, задав в поисковой системе строку "PostScript Level 2" AND "David Burch", вы найдете в Интернет весьма полезный справочник, составленный этим автором.

Вместо заключения

На этом заканчивается наш вводный курс в язык PostScript. Мы почти полностью прошли PostScript Level 1 и чуть-чуть коснулись L2. Как всегда, в конце работы видно, что её нужно было делать совсем не так. Конечно же, к седьмому уроку автор уже сам почти всё понял ;).

С Эдуардом Пройдаковым, главным редактором еженедельника PC Week/RE, можно связаться по адресу: chief@pcweek.ru.


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