2013-04-26 55 views
3

我有一个关于当前图形状态和PostScript中的图形状态堆栈的问题。PostScript当前图形状态实现

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

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

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

现在用grestore我读这从http://www.tailrecursive.org/postscript/operators.html#grestore

“设置当前图形状态的图形状态栈最上面的图形状态并弹出该状态出栈。”

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

或者是我的执行错误? 当我初始化我的解释器时,我应该创建一个新的当前图形状态对象,但不会将它添加到'gsstack',并且只有在调用gsave操作符时才将它推送到'gsstack'?

在此先感谢

+0

使用正确的PostScript参考手册http://www.adobe.com/products/postscript/pdfs/PLRM.pdf非第三方教程 – piokuc 2013-04-26 09:43:20

+0

“最顶级的图形状态总是当前的图形状态。”令人困惑的信息http://stackoverflow.com/a/11139870/187650 – juFo 2013-04-26 10:09:47

+0

如果它对你有用,我可以在C中找到一个大部分完整的Level-1解释器[here](http://code.google.com /p/xpost/downloads/detail?name=xpost2g.zip)(它缺少一些像'definefont'这样的非常困难的操作符。) – 2013-04-27 13:22:45

回答

0

是,grestore简单地弹出图形堆栈。

就像字典堆栈应该始终在底部有systemdict和userdict(至少)一样,图形堆栈上应始终至少有一个图形状态。因此grestore应该在堆栈中只发现一个状态时发出错误(就像end如果它只发现永久字典(level-1的systemdict和userdict,为level-2添加statusdict和globaldict) )。

但是,您可能想实现与其他堆栈不同的图形堆栈,因为它也受saverestore的影响。 restore应弹出比上一次更新的所有状态save。如果图形堆栈是作为数组或词典的链接列表实现的,那么restore将尽其所能,而不会有任何额外的麻烦。

从PLRM,3ED:

-   grestore   -

重置从上的图形状态栈 的顶部的一个当前图形状态并弹出图形状态堆叠,恢复在匹配gsave操作的时间 处有效的图形状态。此运算符提供了一种简单的方法,可以在不需要单独重建所有图形状态参数的情况下撤消复杂转换和其他图形状态修改。

如果堆栈最顶端的图形状态保存与保存,而不是gsave (即,如果出现了自最近一次无与伦比的 保存没有gsave操作),grestore恢复,如果不从弹出它最上面的图形状态 堆栈。如果不存在不匹配的保存(只能在未封装的作业中发生),并且图形状态堆栈为空,则grestore不起作用。

您可能要忽略saverestore在第一,而只是专注于gsavegrestore(和图形功能的其余部分)。 saverestore变得非常复杂。我已经多次重新设计我的翻译,试图让他们正确地工作。

+1

这是正确的:如果你启动你的解释器,你有一个图形状态堆栈,它有一个默认图形状态。当前图形状态并不直接在.Peek()堆栈中看到,而是在图形状态堆栈中有一个最顶层项目的副本。 因此,解释器在当前图形状态下具有一个GS的默认GSStack和该GS的副本。 ? – juFo 2013-04-28 07:22:44

+0

为* active * gstate制作副本似乎很好。但使用.Peek()也应该起作用。对于我的翻译,我用开罗的图形,它有自己的内部gstate堆栈。所以用gsave/grestore进行保存/恢复工作很困难。 – 2013-04-28 07:33:38

+0

但Peek()看起来并且与放置在堆栈上的最后一个项目一起工作。这听起来不太好? :s – juFo 2013-04-28 07:36:38