PostScript当前图形状态实现

时间:2013-04-26 09:35:18

标签: stack interpreter postscript

我对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'?

提前致谢

1 个答案:

答案 0 :(得分:0)

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

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

但您可能希望以不同于其他堆栈的方式实现图形堆栈,因为它也受saverestore的影响。 restore应该弹出比上一个save更新的所有州。如果图形堆栈是作为数组或字典的链接列表实现的,那么restore将毫不费力地发挥其作用。

来自PLRM,3ed:

  

- grestore -

     

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

     

如果堆栈中最顶层的图形状态是使用save而不是gsave保存的   (也就是说,如果自最近一次无法比拟以来没有gsave操作   保存),grestore恢复最顶层的图形状态而不从中弹出它   堆。如果没有不匹配的保存(只有在未封装的情况下才会发生)   作业)并且图形状态堆栈为空,grestore无效。

您可能首先要忽略saverestore,然后只关注gsavegrestore(以及其他图形功能)。 saverestore变得非常复杂。我已经多次重新设计了我的翻译,试图让他们正常工作。