PostScript中文版是一款非常强大的编程语言,直译为后处理脚本,学名为页面描述语言。PostScript中文版主要用意是为以相对设备独立的方式描述影像提供一种方便的语言。该设备相对独立是指不以某种特定设备特性作参照,来描述影像(比如印表机的解析度),这样同一种描述不需修改就可适用于任何一种PostScript印表机(比如,LaserWriter 或Linotron)。实际情况下,有些PostScript中文版文件对于目标设备做假设定(比如它的解析度或纸匣的数量),但这并不实用,而且局限了可转移性。
增进的速度和可靠性:在Level 2出现之前,Limitcheck和Vmerror PostScript错误非常麻烦,令人头痛。Adobe优化了PostScript程式码和增强程式码的记忆管理功能。该功能提高了功效,尤其对於旋转的扫描作业。
支持分立的内置RIP:Level 2 RIPs能够接受合成的PostScript文件,自行处理分色工作。它并不是一个必须遵循的功能,不同生产商的Level 2 RIPs的功能也有不同。
RIP中解压缩影像:Level 2 RIPs能够解压缩JPEG和CCITT
支持合成字体:该功能对于亚洲国家来讲相当重要,他们的字符比欧洲使用的大。Apple通过QuickDraw
GX来支持合成字体。现今你可能只在Apple的档案储藏柜里找到,还有其他的一些技术突破如OpenDoc 和the Newton。
字体和字型的缓存:有了Level 2,令人讨厌的字体缓存删除没有了。
字型的缓存问题几年后通过一些整版应用程式如PressWise 和Preps 解决了。
改进的驱动程式:Macintosh的LaserWriter 8和Adobe的Windows 3.1系统PostScript driver 2.X为基础,联合恰当的PPD-drivers。
改进的网屏算法:对于许多的RIP生产商,当Level2推出时已是过时的新闻。比如Agfa,已在这前一年就已销售它的对称网屏技术,为胶印业提供高品质的无网屏镜像效果。Adobe版本被称为准确网屏。
算法
例如:
3 4 add 5 1 sub mul将执行 (3 + 4) × (5 - 1) 这样的计算。
让我们详细地分析一下这是如何完成的:
3 和 4 都是符号,它们将自己放到堆栈中,在这两个命令之后,堆栈将变成这样:
43add是一个运算符,它将堆栈中最上面的两个元素取出(在我们的例子中是3和4)、将它们相加、然后将结果放到堆栈上:
7下面又是两个符号,它们将把堆栈变成这样(需要注意的是操作仅仅局限在堆栈顶部,下面的元素不受影响):
157另外一个运算符sub,从堆栈顶取出两个元素、第二个减去第一个、然后将结果放到堆栈:
47很显然mul同其它两个运算符一样,从堆栈取出两个元素、将它们的乘积放到堆栈:
28
Named variables
上面的例子只是一个古老的逆波兰表示法计算,当然PostScript也使用变量。详细地说就是它有一个字典用来查找所有不是符号的东西;如果查到的话,那个名字下保存的值就会压缩到栈中(或者更应该说是执行——参见后面的内容);找不到就返回错误。将一个变量放到字典中需要使用def运算符,它用一个名字和一个值作为参数,通过在前面使用斜线构建一个名字。因此
/x1 15 def首先将名字“x1”放到堆栈上、然后是值15、然后执行def,它将从堆栈中取出“x1”和15,并且将15写到字典中“x1”的下面。后面出现的“x1”(注意不要与“/x1”混淆)将会将15放到堆栈而变量并不改变。下面的代码会将x1的值增加2:
/x1 x1 2 add def
堆栈运算符
PostScript有几个操作符用于重组或者控制堆栈:复制(dup)、丢弃(pop)和交换(exch)在堆栈顶部进行操作,然而roll旋转堆栈中的某一部分,copy复制某个特定的部分,index允许象数组那样访问堆栈。
处理过程定义
{和}提供了一些编程的工具。{将解释器切换到延迟运行模式,所有的东西甚至是运算符和其它的可执行对象都放到堆栈中,其中一个例外就是},它将堆栈中从{开始的所有内容,绑定成一个(匿名)处理过程,然后将它放到堆栈上。
这种结构有几种不同的用途,如子程序定义(匿名程序赋给一个变量)、循环、条件等等:
x1 0 eq { 0 } { 1 x1 div } ifelse这段代码首先使用eq测试 x1 是否是 0;根据结果的不同将真或者假放到堆栈上。在此之后,将两个过程放到堆栈上,然后执行ifelse,它从堆栈中取出三个参数,如果第三个参数是真就执行第二个否则就执行第一个。总之,如果 x1 是 0 结果就是 0, 其它情况结果就是 1/x1。
/inc3 { 3 add } defHeredefis used to place something in thedictionary, only this time it is a procedure instead of a simple integer. This works because the values coming from the dictionary areexecuted, not just pushed (as simplistically stated above). Since executing a literal amounts to pushing it, that did not make a difference before. Now executing "inc3" will first look it up in the dictionary, find the procedure object representing "{ 3 add }" and execute that. One value must reside on the stack for this to work, sinceaddneeds two arguments, only one of which is given in the procedure itself. Naturally, one passes arguments to procedures by placing them on the stack, so we can simply view "inc3" as a procedure that takes one argument. Example call: 这里def将内容放到字典中,仅仅在这个时候它是一个过程而不是简单整数。
71 inc3将71放到堆栈上,inc3将它的值加3,这样就得到结果74。
同类推荐
2022-08-27
立即下载2022-07-02
立即下载2022-07-02
立即下载2022-01-13
立即下载2022-08-23
立即下载2022-06-08
立即下载