PostScript 程序初探

符号说明

  1. 字典 <</PageSize [809 1150] >>
  2. 字符串 (aabbcc)
  3. ASCII 数组 < 3042 3046 3046 >
  4. 数组 [1 2 3 4]
  5. 过程体 / 函数体 { do something }
  6. 变量名 /VarName

 

变量定义

定义 X Y 两个变 量,分别赋值 1 2

/ X 1 def

/ Y 2 def

和下面的代码等同

2 1

/ X exch def

/ Y exch def

定义字符串,名字是 str , 值是 TestString

/ str  /TestString def

定义字符串,名字是 StripC ,把 nCyan 数值值转换成字符串的值

/StripC nCyan string def

定义字典

/MyCallbook <</Huang /88886666 /Zhang /888866667>> def

定义复杂字典:可容纳 30 个元 素

30 dict begin

/Height exch def

/Width exch def

/Y exch def

/X exch def

End

Begin 是把这个字典放到操作数栈中, end 是 从操作数栈中删除字典。

定义数组

/Decode [1 0 1 0 1 0] def

定义矩阵

matrix currentmatrix

这个说是定义,有点牵强,因为这个是专门用于定义坐标矩阵。

Matrix 指令是新建一个坐标矩阵变量并放入操作数栈, currentmatrix 指令是把当前的坐标矩阵的值赋值到新建的坐标矩阵变量中。

定义过程、函数

/DrawGridLines

{

0 exch 1800 {

dup

0 moveto 0 1800 rlineto

0 exch moveto 1800 0 rlineto

} for

} def

 

调试,查看变量值

       可以用双等号 == print 指 令输出变量的值。

如:

/nCount 10 def

(nCount = ) print

nCount ==

输出结果是: nCount = 10

==输出的是一行,自动换行; Print 换 行时需要加“ /n” (/n) print

输出栈顶的元素:

       Dup ==

输出栈顶的第二个元素:

       Dup 2 pop ==

 

还有许许多多的关键字、指令或函数,只有去看 PostScrip 的文档了。

下面实战演习,来解读一段可以生成一个条形码的 PostScript 程序吧。

 

% DRAW BARCODE

%   left top width height length patternC patternM patternY patternK PatternS1 SpaceType VAR29 --> -       

%

% parameters:

%   left      ... x-coord of barcode's upper-left corner

%   top       ... y-coord of barcode's upper-left corner

%   height    ... barcode's height

%   width     ... barcode's width

%   length    ... number of bits PatternX includes

%   patternC  ... pattern of Cyan color space

%   patternM  ... pattern of Magenta color space

%   patternY  ... pattern of Yellow color space

%   patternK  ... pattern of Black color space

%   patternS1 ... pattern of Spot1 color space

%   patternS2 ... pattern of Spot2 color space

%   spacetype ... kinf of color space

PS 语言的注视用%号,没发现用于块注释的方法。

/VAR30 11 dict def          定义字典变量 VAR30 , 可容纳 11 个元素

/VAR31 8 dict def           定义字典变量 VAR31 , 可容纳 8 个元素

/VAR29 where { pop } {      where 指令是在字典 栈中查找 VAR29 变量,如果有,执行 pop 指令,把 VAR29 变 量的内容(函数体)放入操作数栈。否则执行 VAR29 函数的定义

  /VAR29 {                  定义 VAR29 函 数

    VAR30 begin           新建 VAR30 字 典,压入操作数栈

      /SpaceType exch def     从这儿以下的变量定义及赋值,是和函数传入的参数

      /PatternS2 exch def      一一对应的。

      /PatternS1 exch def      Exch 指令是交换操作 数栈顶两个元素位置。

      /PatternK exch def        这里需要注意栈的先进后出特性以及每个指令出入

      /PatternY exch def        栈的操作数的数量。

      /PatternM exch def              变量名声明进栈一次, exch 进出栈各两次,

      /PatternC exch def        def 出栈两次,每个变 量定义需要操作栈 7 次。

      /Length exch def          

      /Height exch def           

      /Width exch def            

      /Top exch def

      /Left exch def

 

      SpaceType 1 eq             ifelse 的判断条 件。

      { [/DeviceCMYK] }         如果 SpaceType 等于 1 执行此句。

      {                       否则执行这个过程体。

               SpaceType 2 eq    ifelse 的判断条 件。

               { VAR32  }   如果 SpaceType 等于 2, VAR32 数组放到操作数栈。

               { VAR33 } ifelse    否 则 , VAR33 数组放到操作数栈。

      } ifelse

      Setcolorspace          VAR32 VAR33 数 组为参数设定色彩空间,

主要是特色的设定。

 

      Left Top translate         坐标偏移。

      Width Height scale              坐标缩放, X Y 的缩放比 例可以不一样。

                           

      VAR31 begin            新建 VAR31 字 典,压入操作数栈。

        /ImageType 1 def              变量定义。

        /Width Length def     其实这里定义字典主要的功能相当于 C 语言中 的局部

        /Height 1 def              变量的使用范围的设定。

        /ImageMatrix [Length 0 0 1 0 0] def    定义数组。

        /MultipleDataSources true def              定义 Boolean 型变量。

 

        SpaceType 1 eq          ifelse 的判断条 件。

        {                   如果 SpaceType 等于 1

          /DataSource [{PatternC} {PatternM} {PatternY} {PatternK}] def

                            定义一个数组放到操作数栈中,看到{}了吗?

                            这是个过程数组。有点向 C 语言中 的函数指针数组。

          /Decode [0 1 0 1 0 1 0 1] def

        }

        {                    如果 SpaceType 等于其他值时。

          SpaceType 2 eq      ifelse 的判断条 件。

          { %/* CMYL + S1 */       如果 SpaceType 2 ,输出 CMYK 和特色 S1 两组颜 色。

             /DataSource [{PatternC} {PatternM} {PatternY} {PatternK} {PatternS1}] def

             /Decode [0 1 0 1 0 1 0 1 1 0] def

          }

          { %/* CMYK + S1 + S2 */ 如果 SpaceType 3 ,输出 CMYK S1/S2 三 组颜色。

             /DataSource [{PatternC} {PatternM} {PatternY} {PatternK} {PatternS1} {PatternS2}] def                 定义数组。

             /Decode [0 1 0 1 0 1 0 1 1 0 1 0] def    定义数组。

          } ifelse

        } ifelse

        /BitsPerComponent 1 def  定义一个变量。

        Currentdict         把字典栈的最上面一个元素(即上面定义的

VAR31 字典)拷贝到操作数栈中。

      End                  从字典栈中删除 VAR31 字 典。

      image               VAR31 字 典作为参数,执行 image 指令。

    end                      从字典栈中删除 VAR30 字 典。

  } bind def                完成 VAR29 函 数的定义,并把 VAR29 压入字典栈的

当前字典中

} ifelse

 

% OBTAIN MAXIMUM VALUE

%   array VAR34 --> max   

%

% parameters:

%   array ... an array of numbers

%

% result:

%   max   ... maximum value among the array

/VAR35 4 dict def             声明 VAR35 字 典

/VAR34 where { pop } {        检查 VAR34 函 数是否已经定义

  /VAR34 {                   定义 VAR34 函 数

    VAR35 begin              定义 VAR35 字 典,相当增加一个局部变量空间。

      /ary exch def          取得传入的参数(参数为数组)

      /max ary 0 get def         定义一个临时变量 max , 并把数组的第 0 个值赋给它

      1 1 ary length 1 sub      先执行 ary length ,取得数组的长度,再执行减 1(1 sub)

                            最后栈顶的三个元素为、: 1 1 和数组 的长度。用于

for 循环,意思是,从 1 到数组长度,步长为 1.

      { /n exch def           数组长度赋值给变量 n

        /value ary n get def   得到数组中的第 n 个值赋值 给变量 value

        /max max value gt {max} {value} ifelse def

                            Max value 比 较大小,用大的值给 max 重新赋值

      } for                  for 循环

      Max                 max 变量 的值放到操作数栈中

    End                            删除 CSD35 字典

  } bind def                完成 VAR29 函 数的定义,并把 VAR29 压入字典栈的

当前字典中

} ifelse

 

 

% SET CMYK + SPOT1,2 COLOR SPACE

%   name1 c1 m1 y1 k1 name2 c2 m2 y2 k2 VAR36 --> -   

%

% parameters:

%   nameX ... name of spot color X

%   cX    ... value of Cyan component of spot color X

%   mX    ... value of Magenta component of spot color X

%   yX    ... value of Yellow component of spot color X

%   kX    ... value of Black component of spot color X

这个函数的功能是产生两个在输出条形码图形的时候需要用到的 数组变量 VAR32 VAR33 ,这俩字典中分别保存着特色 S1 S2 的信 息。

/VAR37 10 dict def            声明 VAR37 字 典

/VAR38 6 dict def             声明 VAR38 字 典

/VAR36 where { pop } {        检查 VAR36 函 数是否已经定义

  /VAR36 {                   定义 VAR34 函 数

    VAR37 begin              定义 VAR37 字 典

      /S2K exch def         取得传入的参数

      /S2Y exch def

      /S2M exch def

      /S2C exch def

      /S2Name exch def

      /S1K exch def

      /S1Y exch def

      /S1M exch def

      /S1C exch def

      /S1Name exch def

      userdict /VAR32           定义 VAR32 数 组,并把此数组变量放到用户字典栈中,

                            相当于定义了一个全局变量。

      [ /DeviceN               数组变量名 DeviceN

          [/Cyan /Magenta /Yellow /Black S1Name] 数组 DeviceN 的值

          /DeviceCMYK         过程变量名 DeviceCMYK

          { VAR38 begin       定义 VAR38 字 典,压入字典栈中

              /S1 exch def     字典元素(局部变量)的声明

              /Black exch def

              /Yellow exch def

              /Magenta exch def

              /Cyan exch def

              VAR37 begin   定义 VAR37 字 典,压入字典栈中

                [Cyan    S1 S1C mul] VAR34      函数调用,求最大值

                [Magenta S1 S1M mul] VAR34    

                [Yellow  S1 S1Y mul] VAR34      

                [Black   S1 S1K mul] VAR34      

              End           删除 VAR37 字 典

                           

            End                     删除 VAR38 字典

这个地方也许让人困惑,看起来什么都没做。实际上,

                            VAR34 函 数是把 max 的值压入到操作数栈中了。

                            DeviceCMYK      这个过程产生的结果,也就是在操作

                            数栈顶增加了 4 max 的 值。

          }

      ] put

      userdict /VAR33           VAR32 数 组的定义一致,唯一不同的地方是求最

大值的时候,特色 S2 的值也 参与了进去。

      [ /DeviceN

          [/Cyan /Magenta /Yellow /Black S1Name S2Name]

          /DeviceCMYK

          { VAR38 begin      

              /S2 exch def

              /S1 exch def

              /Black exch def

              /Yellow exch def

              /Magenta exch def

              /Cyan exch def

              VAR37 begin    

                [Cyan    S1 S1C mul S2 S2C mul] VAR34      

                [Magenta S1 S1M mul S2 S2M mul] VAR34      

                [Yellow  S1 S1Y mul S2 S2Y mul] VAR34      

                [Black   S1 S1K mul S2 S2K mul] VAR34      

              end

            end

          }

      ] put

    end

  } bind def

} ifelse

 

(S1) 0 10 0 (S2) 0 0 1 0 VAR36      调 用 VAR36 函数设置特色

Gsave                         保存当前坐标矩阵

190 590 200 160 16 <73EA> <0000> <0000> <0000> <0002> <0000> 2 VAR29

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值