工作日记——PS中的Graphics State

来源:互联网 发布:把app软件绿色 编辑:程序博客网 时间:2024/04/27 23:25

工作日记——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的时候恢复。除非你想要这种效果,否则最好在当前路径为空,并且当前裁剪路径为默认值的时候保存图形状态,使其对空间的需求最小。