3

我对 PostScript 中的当前图形状态和图形状态堆栈有疑问。

在我的代码中,我现在有一个代表当前图形状态的堆栈。当我初始化我的解释器时,它会创建一个新的 GraphicsState 对象并将其添加到“gsstack”中。

我的当前图形状态实现为:'gsstack'.Peek(),它总是返回最顶层的图形状态。

使用 gsave 运算符,我创建了当前图形状态的克隆并将其推送到“gsstack”上,因此我在堆栈上有一个新的最顶层图形状态(这意味着我有一个新的当前图形状态对象)。

现在有了 grestore,我从http://www.tailrecursive.org/postscript/operators.html#grestore读到了这个

“将当前图形状态设置为图形状态堆栈上的最顶层图形状态,并将该状态从堆栈中弹出。”

该 grestore 是如何工作的,因为我当前的图形状态已经是最顶层的图形状态......我应该将它从堆栈中弹出吗?

还是我的实施错误?当我初始化我的解释器时,我是否应该创建一个新的 Current Graphics State 对象,但不将其添加到“gsstack”,并且只在调用 gsave 运算符时将其推送到“gsstack”?

提前致谢

4

1 回答 1

0

grestore的,只需弹出图形堆栈。

就像字典堆栈应该总是在底部有 systemdict 和 userdict(至少)一样,图形堆栈上应该总是至少有一个图形状态。因此grestore,如果它在堆栈上只找到一个状态应该抛出一个错误(就像end如果它只找到永久字典(对于 Level-1 的 systemdict 和 userdict,对于 Level-2 添加 statusdict 和 globaldict)应该抛出一个错误)。

但是您可能希望以不同于其他堆栈的方式实现图形堆栈,因为它也受save和影响restorerestore应该弹出比上一个更新的所有状态save。如果图形堆栈被实现为数组或字典的链表,那么restore将尽其所能,没有任何额外的麻烦。

来自 PLRM,第 3 版:

– grestore –

从图形状态堆栈顶部的状态重置当前图形状态并弹出图形状态堆栈,恢复匹配 gsave 操作时有效的图形状态。此运算符提供了一种简单的方法来撤消复杂的转换和其他图形状态修改,而无需单独重新建立所有图形状态参数。

如果堆栈上最顶层的图形状态是用 save 而不是 gsave 保存的(也就是说,如果自最近一次不匹配的保存后没有 gsave 操作),grestore 将恢复该最顶层图形状态而不将其从堆栈中弹出。如果没有不匹配的保存(仅在未封装的作业期间可能发生)并且图形状态堆栈为空,则 grestore 无效。

一开始您可能想忽略saverestore,而只关注gsavegrestore(以及其余的图形功能)。save并且restore变得非常复杂。我已经多次重新设计了我的解释器,试图让它们正常工作。

于 2013-04-27T13:14:43.870 回答