Язык PostScript

Автор работы: Пользователь скрыл имя, 16 Января 2013 в 18:54, статья

Описание работы

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

Файлы: 1 файл

комп граф.doc

— 78.50 Кб (Скачать файл)

Это - первая в серии статей о 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

Информация о работе Язык PostScript