Home Index Search Links About Us
[LinuxFocus Image]
[Navegation Bar]
  Новости   Архивы   Компании   Советы  

Язык PostScript

Emre Demiralp


Stock the chaff, the day will come to use it.
-Turkish Proverb-.

Введение

Рисунок

Текст

Цвет

Еще информация

Введение

Это --- первая в серии статей о PostScript. Главная наша цель --- не научить читателя всем подробностям этой программы, а дать материал, достаточный для человека, находящего PostScript интересным и занимательным языком подготовки документов. Мы не собираемся создавать исчерпывающее руководство по этой теме, а просто попытаемся представить необходимую и достаточную информацию о PostScript.

Основные идеи, стоящие за PostScript, были рождены двадцать два года назад. Сделал это John Gaffney из компании Evans & Sutherland. Вначале он назывался "Design System", а позже разрабатывался компанией Adobe Systems под именем PostScript в качестве независимого от платформы и аппаратуры инструмента для дизайна страниц. Adobe Systems была образована в 1982 году Chuck Geschke и John Warnock. C.Geschke и J.Warnock провели новый дизайн и реализацию языка, большой вклад в который также внесли Doug Brotz, Billi Paxton и Ed Taft.

Сегодня он является одним из основных инструментов подготовки документов, хотя и не используемым напрямую большинством конечных пользователей. Его возможности находятся на довольно высоком уровне, однако большинство пользователей ленятся разбираться в деталях этого мощного языка, предпочитая использовать инструменты, ориентированные на конечного пользователя, обычно основанные на философии "What You See Is What You Get". На самом деле многие WYSIWYG программы используют файлы формата PostScript для поддержки своих документов или для взаимодействия с другими задачами, например, печатью. В этом смысле он все еще используется как мощная подпорка многих вычислительных задач, связанных с рисунком, цветом, обработкой изображений, цветоделением, моделированием и анимацией, даже если он и не заметен в работе. С другой стороны, если вы хотите изучить его структуру для программирования на PostScript, вы найдете это несложным.

Команды PostScript выполняются интерпретаторами. Среди них них есть широко известная программа, свободно распространяемая через Internet. Она называется "ghostscript", выпускает ее фирма Aladdin Enterprise. К ней существует графический интерфейс пользователя той же фирмы, "ghostview". Проект GNU включает также свою версию ghostscript. Они доступны на всех платформах Linux, и все дистрибутивы Linux содержат их в штатной поставке. Далее мы будем иметь дело с ghostscript и его спецификой, хотя примеры программ могут быть выполнены на других интерпретаторах.

Предположим, мы активизировали сервер X Window и открыли окно xterm. Если мы хотим использовать ghostscript, то каждая команда или группа команд дается на приглашении, которое появляется после использовании команды ghostscript

Initializing... done. Ghostscript 2.6.2 (4/19/95) Copyright (C) 1990-1995 Aladdin Enterprises, Menlo Park, CA. All rights reserved. Ghostscript comes with NO WARRANTY: see the file COPYING for details.
GS>_


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

Чтобы закрыть сессию ghostscript, просто выдайте после приглашения GS> команду quit. EOF (Ctrl-D) тоже будет работать в этом качестве.

Ghostscript может также выполнять команды, читая их из файла. В следующем примере мы открываем файл по имени sample.ps. Все команды, которые нужно выполнить ghostscript, записаны в этом файле. Поэтому мы называем содержимое этого файла PostScript-программой. Все содержимое этой программы или отдельных ее команд будет последовательно выполнено ghostscript, если мы запустим следующую команду

gs sample.ps

и результаты ее будут отображены (если, конечно, программа создает какое-то изображение. На самом деле PostScript может использоваться и для других целей, например, математических вычислений, операций со стеком и т.п. Мы расскажем о них в будущих статьях этой серии) в окне ghostscript. Если программа создает более, чем одну страницу, то окно ghostscript показывает первую страницу и выводит приглашение showpage, требуя нажать клавишу Enter для вывода следующей страницы.

PostScript использует обратную польскую нотацию. Иными словами, параметры команды даются перед командой. Команды разделяются пробелами. PostScript пользуется стековыми операциями для обработки данных и выполнения команд. Для работы PostScript есть четыре стека: стек операндов, стек словарей, стек выполнения и стек состояния графики. Стек операндов содержит любые объекты PostScript, являющиеся операндами и результатами выполнения операторов. Рассмотрим, например, арифметические операции:

20 30 add 10 sub 

дает 40, так как 20 30 add дает 50 и sub даст 40, получив 50 и 10. mul (умножение) и div (деление) работают таким же образом. Имя = ассоциировано с процедурой, которая выталкивает один объект из стека операндов и записывает в стандартный файл вывода текстовое представление его значения с символом новой строки. == действует аналогично, но выводит синтаксическое представление своего операнда. Команда pop удаляет верхний элемент стека операндов. Мы рассмотрим стек более подробно в последующих статьях этой серии.

Как пользоваться PostScript для рисования?

Рассмотрим вначале геометрическую структуру страницы, на которой мы рисуем. Координаты точек на странице PostScript выражает в пиксельных единицах, равных одной семьдесят второй дюйма. Левый нижний угол прямоугольной страницы соответствует координатам (0,0), горизонтальный и вертикальный размеры страницы равны 612 и 792, соответственно. Эти размеры соответствуют формату бумаги letter. Можно определить размеры бумаги другими:

note: 540 на 720, или

legal: 612 на 1008, или

a4: 595 на 842.

Это --- обычные команды gs. Команда a4 сменит размер вашего листа на A4, например.

Определения размера страницы находятся в файле инициализации по имени gs_statd.ps. Он находится в каталоге /usr/lib/ghostscript (для Slackware). Вы можете определить любые нестандартные размеры бумаги добавлениями и исправлениями этого файла. Здесь мы полагаем, что вы используете размер по умолчанию letter.

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

x y moveto

Где x и y обозначают горизонтальную и вертикальную координаты курсора, соответственно. x и y являются числами и выражаются в пиксельных единицах. Как видите, функциональная структура PostScript слегка отличается от структуры других языков программирования, таких, как C или FORTRAN. moveto --- команда, помещающая курсор в точку с координатами (x,y).

Поскольку PostScript использует стек, параметры вначале последовательно кладутся на стек. Затем дается команда. Она снимает со стека предыдущие два элемента в качестве своих параметров. Синтаксис здесь отличается от того, к которому привыкли те, кто знаком с языками типа C, поэтому мы подробно на этом останавливаемся. В заключение скажем, что каждая команда, требующая параметров, задается после ее параметров.

Теперь мы готовы к рисованию фигур. Начнем с простого: с отрезка. Все, что нужно, чтобы его нарисовать, --- выполнить следующую команду:

xx yy lineto

где xx и yy отмечают положение конца отрезка. Его начало --- текущее положение курсора, x и y. Так что эта команда конструирует отрезок от точки (x,y) до точки (xx,yy). Чтобы он действительно оказался нарисован, нужно выполнить еще команды определения контура newpath и stroke.

Теперь напишем PostScript программу для рисования прямоугольника. Это можно сделать, используя уже описанные приемы. Программа, которую запишем в файл sample1.ps, может выглядеть так:

newpath
100 100 moveto
300 100 lineto
300 250 lineto
100 250 lineto
100 100 lineto stroke

Хотя мы задавали каждую команду на отдельной строчке, это на самом деле не обязательно. Мы можем набирать из на одной строчке, вставляя между командами пробелы, как уже упоминалось выше.

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

newpath
% Инициализация курсора
100 100 moveto
% Рисование прямоугольника
300 100 lineto
300 250 lineto
100 250 lineto
100 100 lineto stroke

Теперь мы можем выполнить в окне xterm команду gs sample1.ps, и появится обычное окно ghostscript, в котором будет нарисован желаемый прямоугольник. После приглашения GS> то же самое делает команда (sample1.ps) run.

Команда stroke указывает интерпретатору нарисовать фигуру. Для вышеприведенной программы в окне ghostscript при этом рисуется прямоугольник размером 200 на 150 пикселей.

Прямые не обязаны быть вертикальными или горизонтальными. Их можно прокладывать в любом направлении.

Следующая программа, как вы увидите, создает треугольник. Вы можете создавать любые фигуры, состоящие из отрезков, при помощи команд moveto и lineto.

Есть еще две команды, удобные при конструировании отрезков: rmoveto и rlineto. Они принимают по два параметра и используются так:

x y rmoveto
x y rlineto

где x и y задают горизонтальное и вертикальное расстояние между начальной и конечной точкой каждой операции. 'r' в rmoveto и rlineto означает relative (относительный). Иными словами, первая команда перемещает курсор на x единиц вправо и на y единиц вверх от его текущего положения. Вторая команда работает аналогично, только еще и рисует отрезок, а не только перемещает курсор.

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

x setlinewidth

где x задает толщину линии в пикселях. Действие этой команды продолжается до следующего изменения толщины линии.

Разумеется, рисование на PostScript не ограничено проведением отрезков. Можно рисовать дуги окружности. Для этого есть команда

x y r a b arc

где x, y, r, a и b задают горизонтальную и вертикальную координаты центра дуги, радиус дуги и углы между положительным направлением горизонтальной оси и лучами из центра в начало и конец дуги, соответственно. Углы измеряются против часовой стрелки. Если начальная точка дуги не совпадает с положением курсора, то от курсора до нее рисуется отрезок. Для прояснения картины посмотрите на результат работы следующей программы:


3 setlinewidth
200 200 moveto
100 200 100 0 75 arc
stroke
300 300 moveto
400 500 200 20 50 arc
stroke

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

Контур начинается оператором newpath. Он инициализирует текущий контур. Затем он конструируется выполнением команд, добавляющих сегменты к текущему контуру.

Команду arc можно использовать для рисования полной окружности. Для этого достаточно начальный и конечный углы дуги задать как 0 и 360, соответственно. arc можно также заставить рисовать эллипсы. Для этого нужно вспомнить о масштабирующих свойствах PostScript. Пользователь может раздельно менять масштаб по горизонтальной и вертикальной осям командой

x y scale

где x и y задают, соответственно, коэффициенты масштабирования по горизонтали и вертикали. Если они равны 1, никакого эффекта команда не имеет. Действие команды сохраняется до следующей команды scale. Следующая команда scale не снимает действия предыдущей, а комбинируется с ней. Если первая команда задала коэффициенты масштабирования x1, y1, а вторая --- x2, y2, то после выполнения второй команды коэффициенты станут равны x1*x2, y1*y2. Про это стоит не забывать, чтобы не получить нежелательных эффектов на рисунке. PostScript по умолчанию считает, что масштабирования нет. Следующая программа, которую запишем в файл sample4.ps, содержит пример для прояснения масштабирования.

3 setlinewidth
200 200 100 0 360 arc
stroke
newpath
2 1 scale
200 300 50 0 360 arc
stroke
newpath
1 4 scale
100 150 40 0 360 arc
stroke

Как можно заметить, масштабирование влияет на все размеры, включая толщину линий. Поэтому толщина контуров эллипсов и окружности оказалась разной.

PostScript включает еще две команды для рисования дуг. Одна из них, arcn, отличается от arc только направлением рисования: она рисует дугу по часовой стрелке. Третья команда рисует дугу окружности, являющуюся касательной к двум данным прямым. Она выглядит так:

x1 y1 x2 y2 r arcto xt1 yt1 xt2 yt2

где xt1, yt1, xt2, yt2 задают горизонтальные и вертикальные координаты дуги, а концы касательных отрезков имеют координаты x0, y0, x1, y1 и x1, y1, x2, y2. r задает радиус дуги. Если контур не новый и текущая точка не совпадает с началом дуги, то к контуру добавляется отрезок от текущей точки до начала дуги. В конце рисования текущей становится точка (xt2, yt2).

В PostScript есть также команда рисования кривых Безье, которые можно использовать для интерполяции или экстраполяции набора данных. Это --- команда curveto, которая используется так:

x1 y1 x2 y2 x3 y3 curveto

где кривая начинается в текущей точке, координаты которой принимаются за (x0, y0). Кривая в начальной точке является касательной к отрезку между (x0, y0) и (x1, y1). Заканчивается она в точке (x3, y3) и касается отрезка от (x2, y2) до (x3, y3). По умолчанию считается, что все четыре точки различны и определяют форму фигуры.

Текст

PostScript имеет различные шрифты, стандартно используемые для DTP. Есть также средства создания шрифтов, доступные путем определения словарей на стеке, где хранятся шрифты. Рассмотрим следующую программу.

/Times-Roman findfont
15 scalefont
setfont
100 500 moveto
(I love PostScript!) show
/Times-Italic findfont
20 scalefont
setfont
100 450 moveto
(I love PostScript!) show
/Times-Bold findfont
25 scalefont
setfont
100 400 moveto
(I love PostScript!) show
/Helvetica findfont
30 scalefont
setfont
100 350 moveto
(I love PostScript!) show
/Courier findfont
35 scalefont
setfont
100 300 moveto
(I love PostScript!) show
/Helvetica-Bold findfont
40 scalefont
setfont
100 250 moveto
(I love PostScript!) show
showpage

Как можно понять из программы, команда findfont используется для получения доступа к структуре желаемого шрифта. Имя шрифта начинается с символа '/', и задается в качестве параметра команды ('/' указывает интерпретатору положить его значение на стек "как есть"). Позже мы вернемся к подробностям стековых операций, и это станет более ясным. После выбора шрифта он масштабируется командой scalefont. Коэффициент масштабирования ставится перед этой командой. После масштабирования шрифта, команда setfont делает шрифт готовым к использованию в программе. После помещения курсора командой moveto с соответствующими параметрами, команде show дается текст для вывода в виде параметра, заключенного в круглые скобки. Команда showpage завершает вывод написанного. Приведенная программа использует шрифты разного типа и размера для вывода одного и того же текста в разных местах страницы. Несколько доступных PostScript шрифтов обычно можно найти, покопавшись в файловой системе вашего Linux. Буквы можно располагать вдоль прямых или кривых, так что, в принципе, возможно создавать сколь угодно сложный набор.

Цвет

Язык PostScript включает несколько способов раскраски фигур или создания цветных картинок. Начнем с упоминания о командах смены цвета. PostScript по умолчанию использует черный цвет. Поэтому вывод всех предыдущих программ был черно-белым. Для включения цвета в PostScript можно пользоваться тремя разными командами. Первая базируется на формате цвета RGB. В этом формате каждый цвет составляется из трех основных цветов: красного, зеленого и синего. Компоненты цвета задаются отдельными значениями интенсивности, принимающими значения между 0 и 256. Значение интенсивности может быть дробным числом, имеющим до трех знаков после запятой, например, 111.223. Таким образом, команда выглядит так:

x y z setrgbcolor

где x,y и z являются значениями интенсивности для красной, зеленой и синей компонент, а setrgbcolor --- команда. Таким образом, 1 0 0 setrgbcolor создает красный цвет, а 0 1 0 setrgbcolor --- зеленый. Черный соответствует случаю, когда все параметры интенсивности равны 1. Команда установки цвета влияет на все команды рисования до следующей смены цвета. При этом старые установки забываются, и начинают действовать новые. Используя установки цвета, вы может создавать произвольно сложные рисунки.

Второе средство установки цвета базируется на четырехкомпонентном формате цвета. Он называется форматом CMYK. Четыре базовых цвета --- голубой, пурпурный, желтый и черный. Каждая цветовая компонента влияет на цвет в соответствии с параметром интенсивности, изменяющимся от 0 до 1. Таким образом, соответствующая команда выглядит так:

w x y z setcmykcolor

где w, x, y, z --- значения интенсивности голубой, пурпурной, желтой и черной компонент, соответственно. Эта команда также продолжает действовать до следующей смены цвета, после чего действуют следующие установки. Нет никаких ограничений на число вызовов этой команды в PostScript программе.

Третья команда выглядит так:

x y z sethsbcolor

где x, y, z означают интенсивность трех свойств цвета. Первый соответствует оттенку, определяющему положение цвета в спектре. Второй соответствует насыщенности, а третий --- яркости цвета. Читатель, не знакомый с пространством цветов HSB (hue-saturation-brightness, цвет-насыщенность-яркость), может попробовать поработать с программой xfig.

Самые важные команды раскрашивания в PostScript --- fill и closepath. Следующий пример, который предполагается записанным в файл sample6.ps, поясняет важные свойства рисования и раскрашивания в PostScript.

1 1 0 0 setcmykcolor
100 100 moveto
300 100 lineto
300 250 lineto
100 250 lineto
100 100 lineto
stroke
1 0.5 0.8 0 setcmykcolor
5 setlinewidth
200 200 moveto
400 300 lineto
300 300 lineto
closepath fill
stroke
1 0 0 setrgbcolor
3 setlinewidth
200 200 moveto
100 200 100 0 75 arc
stroke
newpath
400 500 200 20 50 arc
stroke
0 0 1 0.2 setcmykcolor
3 setlinewidth
200 200 100 0 360 arc
stroke
1 0 0 setrgbcolor
newpath
2 1 scale
200 300 50 0 360 arc
gsave fill grestore stroke

stroke
0 1 0 setrgbcolor
newpath
1 4 scale
100 150 40 0 360 arc
gsave fill grestore stroke

Здесь closepath закрывает открытый контур, соединяя конечные точки отрезком, а команда fill служит для заливки внутренности закрытого контура установленным цветом.

PostScript может также использовать оттенки серого. Это делается командой

x setgray

где x задает интенсивность серого, чье значение может меняться от 0, соответствующего черному, до 1, соответствующего белому. Следующая программа, которую запишем под именем sample7.ps, не требует пояснений.

0.2 setgray
10 setlinewidth
100 700 moveto
200 0 rlineto
stroke
newpath
0.3 setgray
100 600 moveto
200 0 rlineto
stroke
newpath
0.4 setgray
100 500 moveto
200 0 rlineto
stroke
newpath
0.5 setgray
100 400 moveto
200 0 rlineto
stroke
newpath
0.6 setgray
100 300 moveto
200 0 rlineto
stroke
newpath
0.7 setgray
100 200 moveto
200 0 rlineto
stroke
newpath
0.8 setgray
100 100 moveto
200 0 rlineto
stroke

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

Автор признателен Oliver Thilmann за его весьма полезные комментарии об организации и представлению этой статьи.


Перевод: Boris Tobotras

Еще информация:
  • Смотрите книги Adobe Systems Inc., опубликованные издательством Addison-Wesley: PostScript Language
    (Три тома: Tutorial and Cookbook, Language Reference, Program Design)


© 1998 Emre Demiralp
This website is maintained by Miguel A Sepulveda.