工作日记——PS中的Graphics State
PS中的“图形状态”(Graphics State)
PS解释器维护了一个内部数据结构,称之为“图形状态”,里面保存了当前的图形控制参数。这些参数定义了全局框架内图形操作符的执行,比如,stroke操作符会隐含使用“图形状态”中的当前线宽的参数,fill操作符会隐含的使用其中的当前颜色。绝大多数“图形状态”参数是普通的PS对象,可以被适当的“图形状态”操作符读取和修改。比如,setlinewidth操作符改变当前线宽参数,currentlinewidth从“图形状态”中读取线宽参数。通常,设置参数的操作符会无改变的把值设置成“图形状态”的参数,以供后面的相关操作符使用,然而也有例外: 1.大多数参数必须具有正确的数据类型,或它的值要在某个特定范围内; 2.数值类型的参数,比如color,line width,miter limit,必须在合法的范围,如果有必要,会被当作实型存储,如果他们后面被读出,依旧是实数,而不管他们当初是什么值。当然,他们并不会被调整成反映光栅输出设备能力的值,比如分辨率,或可识别的色彩数目等,图形渲染操作符会做这样的调整,但是调整后的值不会被保存回“图形状态”; 3.有些参数是复合类型的对象,比如字典,数组。图形操作符会随时参考这些值,或者缓存起来供后面使用,所以,改变他们将会引起不可预知的结果。一个ps程序把这样的值(包括已经保存的“图形状态”)当作只读类型来使用。 “当前路径”,“裁剪路径”,以及设备参数是内部对象,不能直接被ps程序访问。 表一列出了设备无关的参数;表二列出的参数控制渲染过程的细节,是设备相关的,如果一个页面描述被定义为设备无关,就不能改变这些参数。 表一 “图形状态”的设备无关参数 参数 类型 值 CTM array 当前变换矩阵,它可以把用户坐标映射成设备坐标,这个矩阵可以被坐标系统操作符修改。初始值:一个把默认用户坐标转换成设备坐标的矩阵。 position two-numbers 用户空间当前点的坐标,当前路径的最后一个元素。初始值:没有定义。 path (internal) 路径构建操作符创建的当前路径。一般当作fill,stroke,clip等类似的操作符的一个隐含参数使用。初始值:空。 clipping path (internal) 一个定义了所有输出被裁剪的区域。初始值:当前页面的所有可以画图的区域。 clipping path stack (internal) (适用于PS Level3)一个栈,用来存放所有使用clipsave操作符保存但还没有使用cliprestore恢复的裁剪路径。 color-space array (适用于PS Level 2)用来解释颜色值。初始值:DeviceGray。 color (various) 进行描绘操作的时候使用的颜色值。这个参数的类型和解释依赖于当前的color space。对于大多数color space,颜色值由1-4个数字组成。初始值:黑色。 font dictionary 描述当前字体下字母的字形的一个集合。初始值:一个无效的字体字典。 line-width number 用用户坐标单位描述的线宽。初始值:1.0。 line-cap integer 代表任何一个open的路径被stroke的时候,点末端的形状代码。初始值:0,代表直角平头(square butt)。 line-join integer 一个shape被stroke的时候,连接的线段之间的链接方式。初始值:0 ,表示斜接(mitered joins)。 miter-limit number The maximum length of mitered line joins for the stroke operator.This limits the length of “spikes” produced when line segments join at sharp angles. Initial value: 10.0 for a miter cutoff below 11 degrees. dash-pattern array和number stroke操作符描绘线的时候使用的虚线描述参数。初始值:实线。 stroke-adjustment boolean (适用于 PS Level 2)线宽小的时候是否需要补偿。初始值:false。 表二 “图形状态”的设备相关参数 参数 类型 值 color-rendering dictionary (适用于PS Level 2) 一组参数的集合,用来确定如何把CIE-based颜色编码转换成设备颜色值。初始值:installation-dependent. overprint boolean (适用于PS Level 2) 描绘的时候是否保留已有色彩。 擦除(false),不改变(true),初始值:false。 black-generation procedure (适用于PS Level 2) 一个过程,用来计算从RGB转换到CMYK的时候黑色总量。初始值:installation-dependent。 undercolor-removal procedure (适用于PS Level 2) 一个过程,用来计算青色,洋红,黄色通道在补偿黑色的时候减少的总量。初始值:installation-dependent. transfer procedure 在特定的设备上调整设备灰度或彩色通道值,校正非线性响应的一个转换函数。在PS level 2中,支持4个转换函数。初始值:installation-dependent。 halftone (various) A halftone screen for gray and color rendering, specified either as frequency, angle, and spot function or as a halftone dictionary. Halftone dictionaries, as well as support for four halftone screens, are LanguageLevel 2 features. Initial value: installation-dependent. flatness number 曲线在输出设备上被描绘出来的精度。这个数字给出了允许的最大的误差(单位是设备像素)。Smaller numbers give smoother curves at the expense of more computation and memory use. 初始值:1.0。 smoothness number (适用于PS Level 3) 在输出设备上渲染的时候色差的精度。这个数字给出了使用分段线性插值近似描述的shading和函数描述的shading真实色彩值之间的最大误差。Smaller numbers give smoother color transitions at the expense of more computation and memory use. 初始值:installation-dependent。 device (internal) 一个描述当前输出设备的内部数据结构。初始值:installation-dependent。 尽管图形状态包含很多对象,但是它本身不是一个PS对象,并且不能被PS程序直接访问。但是,有两种机制用来保存和稍后恢复整个图形状态,一个是图形状态栈,通过如下两个操作符管理: gsave 把整个图形状态的一份拷贝push到栈里面。 grestore 通过从栈里面pop,恢复整个图形状态。 图形状态栈是后进先出顺序,服务于页面描述PS程序的需要。一个典型的结构合理的文档应该包含很多互不干扰的图形元素,并且有时候会有多层嵌套。gsave 和 grestore操作符可以封装这些元素,从而只影响本身的图形状态,而不会干扰其他图形状态。 In some interactive applications, however, a program must switch its attention among multiple, more-or-less independent imaging contexts in an unpredictable order. 第二种机制,只在PS Level 2 and 3适用,在虚拟内存里面使用包含保存过的图形状态的gstate对象来实现。 ? gstate 创建一个新的gstate对象。 ? currentgstate 复制整个当前图像状态到一个gstate对象。 ? setgstate 用gstate对象替换当前的图形状态。 交互式程序使用这些操作符为每个图形内容创建一个分离的gstate对象,并且根据需要动态切换。 注意,保存一个图形状态,不管是使用gsave还是currentgstate,都会保存所有参数,包括当前路径和当前裁剪路径。比如,如果在执行gsave,gstate,或者currentgstate的时候当前路径是非空的, 那么这个路径会在执行相应的grestore或setgstate的时候恢复。除非你想要这种效果,否则最好在当前路径为空,并且当前裁剪路径为默认值的时候保存图形状态,使其对空间的需求最小。 |