PostScript 程序初探

来源:互联网 发布:sencon美瞳 知乎 编辑:程序博客网 时间:2024/05/13 10:09

符号说明

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

 

变量定义

定义 XY两个变量,分别赋值12

/ 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          VAR32VAR33数组为参数设定色彩空间,

主要是特色的设定。

 

      Left Top translate         坐标偏移。

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

                           

      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 */       如果SpaceType2,输出CMYK和特色S1两组颜色。

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

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

          }

          { %/* CMYK + S1 + S2 */如果SpaceType3,输出CMYKS1/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)

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

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

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

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

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

                            Maxvalue比较大小,用大的值给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

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

/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      这个过程产生的结果,也就是在操作

                            数栈顶增加了4max的值。

          }

      ] 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