我对PostScript中的当前图形状态和图形状态堆栈有疑问。
在我的代码中,我现在有一个代表当前图形状态的Stack。 当我初始化我的解释器时,它会创建一个新的GraphicsState对象并将其添加到'gsstack'。
My Current Graphics State实现为:'gsstack'.Peek(),它总是返回最顶层的图形状态。
使用gsave运算符我创建了当前图形状态的克隆并将其推送到'gsstack',因此我在堆栈上有一个新的最顶层图形状态(这意味着我有一个新的Current Graphics State对象)。
现在有了grestore我从http://www.tailrecursive.org/postscript/operators.html#grestore
读到了这个“将当前图形状态设置为图形状态堆栈上最顶层的图形状态,并弹出该状态。”
grestore如何工作,因为我当前的图形状态已经是最顶层的图形状态...我应该将它从堆栈中弹出来吗?
或者我的实施错了? 当我初始化我的解释器时,我应该创建一个新的当前图形状态对象,但不是将它添加到'gsstack'并且只在调用gsave运算符时将其推送到'gsstack'?
提前致谢
答案 0 :(得分:0)
是的,grestore
只是弹出图形堆栈。
就像字典堆栈应该总是在底部有systemdict和userdict(至少)一样,图形堆栈上应该总是至少有一个图形状态。所以grestore
如果在堆栈上只找到一个状态就会抛出一个错误(就像end
如果只找到永久字典(systemdict和userdict)就会抛出一个错误Level-1,为Level-2添加statusdict和globaldict))。
但您可能希望以不同于其他堆栈的方式实现图形堆栈,因为它也受save
和restore
的影响。 restore
应该弹出比上一个save
更新的所有州。如果图形堆栈是作为数组或字典的链接列表实现的,那么restore
将毫不费力地发挥其作用。
来自PLRM,3ed:
- grestore -
从图形状态堆栈顶部的图形状态重置当前图形状态 并弹出图形状态堆栈,恢复当时生效的图形状态 匹配的gsave操作。此运算符提供了一种简单的撤消方法 复杂的转换和其他图形状态修改没有 单独重新建立所有图形状态参数。
如果堆栈中最顶层的图形状态是使用save而不是gsave保存的 (也就是说,如果自最近一次无法比拟以来没有gsave操作 保存),grestore恢复最顶层的图形状态而不从中弹出它 堆。如果没有不匹配的保存(只有在未封装的情况下才会发生) 作业)并且图形状态堆栈为空,grestore无效。
您可能首先要忽略save
和restore
,然后只关注gsave
和grestore
(以及其他图形功能)。 save
和restore
变得非常复杂。我已经多次重新设计了我的翻译,试图让他们正常工作。