Автор работы: Пользователь скрыл имя, 16 Января 2013 в 18:54, статья
Это - первая в серии статей о PostScript. Главная наша цель - не научить читателя всем подробностям этой программы, а дать материал, достаточный для человека, находящего PostScript интересным и занимательным языком подготовки документов. Мы не собираемся создавать исчерпывающее руководство по этой теме, а просто попытаемся представить необходимую и достаточную информацию о PostScript.
Это - первая в серии статей о 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>_Одновременно с появлением
приглашения открывается
Программа, которую запишем в файл 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