PostScript——PostScript语言教程

摘要:
POSTSCRIPT页面描述是由解析器运行的程序,postscript程序通常是由其他应用程序生成的。这种处理数据的方法被称为POSTSCRIPT对象。

转载自:https://www.cnblogs.com/Ansing/tag/PostScript%E8%AF%AD%E8%A8%80%E6%95%99%E7%A8%8B/

一、介绍

POSTSCRIPT语言是打印机页面魔术的一种程序设计语言。他拥有着广泛的图形操作,并且可以以任意方式,包含变量,函数,以及过程的任意组合。

POSTSCRIPT页面描述是由解析器运行的程序(gs),postscript程序通常是由其他应用程序生成的。

1.1、POSTSCRIPT作为页面语言

POSTSCRIPT具有大量的图形运算符,通过他可以更加详细的描述你的页面。

文本的字体,位置,方向,尺寸。
几何图形的大小,方向,宽度,直线和曲线的位置,任何大小形状颜色的空间填充。

1.2、POSTSCRIPT作为编程语言


二、堆栈和运算

POSTSCRIPT 编程语言和其他编程语言一样,适用于各种各样的数据,例如数字,数组,字符串,以及字符。这种处理数据的方法被称为POSTSCRIPT对象。
操作数据的方法有多种多样,例如:将数据放入变量名,通过变量名称进行处理。POSTSCRRIPT语言拥有变量,但也可以通过堆栈直接操作数据。

2.1、POSTSCRIPT堆栈

堆栈是一段用于处理数据的内存,是一种先入后出的存储原理。

将数字入栈:12 6.3 -99
说明:

1.将12入栈
2.将6.3,入栈,12压栈
3.将-99 入栈,前两个一次类推

2.2、运算

运算代码示例结果
5 27 add32
8.3 6.6 sub1.7
13 8 div1.625
除返回整数25 3 idiv8
除返回余数12 10 mod2
6 8 mul48
取反-27 neg27

组合运算:

6 + (3 ÷ 8)
1. 3 8 div 6 add
将3,8入栈,除运算,0.375,再讲6 入栈,加运算,得6.375
2. 6 3 8 div add
将6,3,8,入栈,8为栈顶,取3,8,进行除运算,结果再与6 进行加运算


8 - (7 × 3)
1. 7 3 mul 8 exch sub
2. 8 7 3 mul sub

exch:交换栈的前两项空间数据

清除所有栈数据: 6 8 12 32 clear => 空
复制堆栈顶部的数据: 6 dup => 6 6
删除堆栈顶部数据: 17 8 pop => 17
旋转数据: 7 8 9 3 1 roll => 9 7 8 : 789依次入栈,1代表从顶到底,798,978
7 8 9 3 -1 roll => 897 : -1代表从低端到顶端,879, 897

2.3、交互运算符
== 将堆栈顶端的数据打印出来,并且删除。
pstack 将整个栈中的数据打印数来,保留数据。


三、绘图

3.1、画线

线:

newpath
144 72 moveto
144 432 lineto
stroke
showpage

说明:

我们首先调用newpath,初始化当画笔状态。

x y moveto,将画笔的移动到x,y的位置
x y lineto,以x,y为终点进行画线
stroke将构建的路径绘制到当前页面
showpage打印当前页

交叉线:

复制代码
newpath
72 360 moveto
144 72 rlineto
144 432 moveto
0 -246 rlineto
storke
showpage
复制代码

说明:

x y rlineto:将画笔位以x,y进行位移

正方形:

复制代码
newpath
270 360 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
4 setlinewidth
stroke showpage
复制代码

说明:

setline设置线的宽度

复制代码
newpath
270 360 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
closepath
4 setlinewidth
stroke showpage
复制代码

closepath:使图形闭合(不使用的时候在拐角的地方会出现一个小缺口)


3.2、填充图形

复制代码
newpath
270 360 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
closepath
fill showpage  
复制代码

fill:填充图形

复制代码
newpath
270 360 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
closepath
.5 setgray
fill showpage
复制代码

gray:设置透明度

多图的叠层:

复制代码
newpath
    252 324 moveto
    0 72 rlineto
    72 0 rlineto
    0 -72 rlineto
    -72 0 rlineto
closepath
.5 setgray
fill showpage
 
newpath
    270 360 moveto
    0 72 rlineto
    72 0 rlineto
    0 -72 rlineto
    -72 0 rlineto
closepath
.5 setgray
fill showpage
 
newpath
    288 396 moveto
    0 72 rlineto
    72 0 rlineto
    0 -72 rlineto
    -72 0 rlineto
closepath
.5 setgray
fill showpage
复制代码

3.3、总结

closepath 闭合图形
lineto 绘制直线
moveto 设置绘制的起始点
newpath 初始化绘制方式
rlineto 移动
fill 绘制填充图形
setgray 设置透明度
setlinewidth 设置线的宽度
stoke 绘制路径
showpage 打印当前页


四、程序变量使用

4.1、变量定义
POSTSCRIPT 变量
变量的定义是将变量名和值用def进行关联类似:

/ppi 75 def   %将ppi定义为75
/ppi ppi 1 add def  %将ppi + 1的值定义为ppi ppi = 75 + 1 = 86

POSTSCRIPT 程序块:

/inch {72 mul} def

4.2、使用程序和变量


方块:

复制代码
/box
{
72 0 rlineto
0 72 rlineto
-72 0 rlineto
closepath
}def
 
newpath
252 324 moveto box
.4 setgray fill
复制代码
复制代码
/inch {72 mul}def
 
/box
{
newpath moveto
1 inch 0 rlineto
0 1 inch rlineto
-1 inch 0 rlineto
closepath
}def
 
/fillbox
{
setgray fill
}def
 
3.5 inch 4.5 inch box
0 fillbox
2.75 inch 5 inch box
.4 fillbox
复制代码

五、文本打印

5.1、POSTSCRIPT字体

字体是具有统一规格的字符集。其中包含数百个字符集,包含熟悉的TIMES和HELVETICA

使用POSTSCRIPT字体
在你打印文本之前,你需要指定所需的字体,这个过程需要三个步骤:

  1. 查找字体的信息。保存在当前环境中,他用来提供特定字体的形状,信息。
  2. 将字体缩放。
  3. 将缩放的额字体设置为当前字体,然后打印出来
复制代码
%!PS-Adobe-3.0
 
/Times-Roman findfont 15 scalefont setfont
 
72 200 moveto (typography) show
 
showpage
复制代码

/Times-Roman findfont

查找名称为Times-Roman的字体,并把它保存到当前程序中

15 scalefont
设置字体大小为15号的Times-Roman字体

setfont
根据已经保存好的规格,对字体进行设置

5.2、动态设置字体大小

复制代码
%!PS-Adobe-3.0
 
/scaleTimes % stack:scale
{
/Times-Roman findfont
each scalefont setfont
}def
 
6 scaleTimes
72 200 moveto (typography) show
showpage
复制代码

/Times-Roman findfont 入栈

each scalefont setfont 入栈

6 scaleTimes意义为
6 /Times-Roman findfont each scalefont setfont
each 将 6 和 /Times-Roman 交换位置得
/Times-Roman findfont 6 scalefont setfont

默认支持的字体字体:
Times-Roman
Times-Bold
Times-Italic
Times-Boldltalic
Helvetica
Helvetica-Bold
Helvetica-Oblique
Helvetica-Boldltalic
Courier
Courier-Bold
Courier-Oblique
Courier-BoldOblique

复制代码
%!PS-Adobe-3.0
 
/MainFont
    /STSong-Light--GB-EUC-H findfont 15 scalefont def
/SloganFont
    /Helvetica-Oblique findfont 7 scalefont def
/OwnerFont
    /Helvetica  findfont 10 scalefont def
 
/rightshow
{
    dup stringwidth pop
    150 exch sub
    0 rmoveto
    show
}def
 
/CardOutline
{
    newpath
    90 90 moveto
    0 144 rlineto
    252 0 rlineto
    0 -144 rlineto
    closepath
    .5 setlinewidth
    stroke
}def
 
/doBorder
{
    99 99 moveto
    0 126 rlineto
    234 0 rlineto
    0 -126 rlineto
    closepath
    2 setlinewidth
    stroke
}def
 
/Diamond
{
    newpath
    207 216 moveto
    36 -54 rlineto
    -36 -54 rlineto
    -36 54 rlineto
    closepath
    .8 setgray
    fill
}def
 
/doText
{
    0 setgray
    90 180 moveto
    MainFont setfont
    (AAA丶死刘) rightshow
 
    90 168 moveto
    SloganFont setfont
    ("The Club of Lonely Hearts") rightshow
 
 
    216 126 moveto
    OwnerFont setfont
    (Sam Spade) show
 
    216 111 moveto
    (Owner) show
}def
 
 
CardOutline
doBorder
Diamond
doText
 
showpage
复制代码

/STSong-Light--GB-EUC-H 为中文打印(注:中文打印时候要求文件格式为gb2312,否则字库不识别,打印出来是乱码)

stringwidth 获取当前字符串的宽度,寄存起为字符串宽度 ,字符串内容,宽度在顶端

dup stringwidth pop 
150 exch sub 
0 rmoveto
show


意义为:
  获取字符串宽度,并将(150 - 字符串宽度的值,0)进行偏移,即:打印字符串在150处右端对齐。

免责声明:文章转载自《PostScript——PostScript语言教程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇游戏开发之UDK引擎介绍和模型导入Unity动态换装之Spine换装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

FPU:fldpi,fmul等指令说明

协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。 协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。协处理器在指令执行期间内利用数据总线来传递数据。80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而80387~...

元数据MetaData

1.3.2 元数据 元数据是描述数据的数据。在CLR的上下文中,元数据表示由描述符组成的一套体系,这些操作符包括了在一个模块中被声明或引用的所有项。由于CLR模型是面向对象的,因此在元数据中描述的项是类和它们的成员,以及它们伴随着的特性、属性和关联。本节简单地介绍元数据,与原数据安全相关的内容会在后续章节中继续讲解,元数据的详细内容不在本书的论述范围之内。...

C++ 常见崩溃问题分析

一、前言 从事自动化测试平台开发的编程实践中,遭遇了几个程序崩溃问题,解决它们颇费了不少心思,解决过程中的曲折和彻夜的辗转反侧却历历在目,一直寻思写点东西,为这段难忘的经历留点纪念,总结惨痛的教训带来的经验,以期通过自己的经历为他人和自己带来福祉:写出更高质量的程序; 由于 C 和 C++ 这两种语言血缘非常近,文本亦对 C 编程语言有借鉴作用; 二、C+...

GDB调试汇编堆栈过程分析

GDB调试汇编堆栈 准备工作 · 终端编译工具: ·         编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386 分析过程 ·         1.生成汇编代码:gcc -g test.c -o test -m32 ·         2.调试:gdb test...

CPU架构的llvm后端

Creating an LLVM Backend for the Cpu0 ArchitectureBackend structure TargetMachine structure Add AsmPrinter Add Cpu0DAGToDAGISel class Handle return register $lr Add Prologue/Epi...

ARM参数传递规则

1.       r0,r1,r2,r3,在调用函数时,用来存放前4个函数参数和返回值,r4-r11,r14,在调用函数时必须保存这些寄存器到堆栈当中。如果函数的参数多于4个,则多余参数存放在堆栈当中,即sp,sp+4,sp+8,…依次类推。   2.       函数内部通用的入栈出栈代码可以为: STMFD sp!,{r4-r11,lr} // bod...