Новости

О проекте

Зачем?

Используемое ПО

Методика разработки сцен на PostScript

Операторы языка PostScript

Библиотека

Изучение языка

Урок 1

Урок 2

Урок 3

Урок 4

Урок 5

Урок 6

Урок 7

Статьи

Ссылки...

Занятие седьмое

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

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

 имя_файла тип_доступа file -> файл 

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

  • 'r' - входной файл (только чтение);
  • 'w' - выходной файл (только запись).

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

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

  файл read  -> байт true (если не конец файла)
             -> байт false (если конец файла)

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

 файл строка readline -> подстрока true (если не конец файла)
                      -> байт false (если конец файла)

Так как изображение в 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  %% в стеке: (строка) true
   pop                      %% удалили true
  /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 изменяет направление текущего пути.

  reversepath  ->  - 

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

 pathbox      -> llx lly urx ury

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

 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. Как всегда, в конце работы видно, что её нужно было делать совсем не так. Конечно же, к седьмому уроку автор уже сам почти всё понял ;).

26.11.2001



©Фурашев А. 2002
e-mail

Хостинг от uCoz