【问题标题】:PostScript current graphics state implementationPostScript 当前图形状态实现
【发布时间】:2013-04-26 09:35:17
【问题描述】:

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

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

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

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

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

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

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

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

提前致谢

【问题讨论】:

标签: stack interpreter postscript


【解决方案1】:

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

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

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

来自 PLRM,第 3 版:

– grestore –

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

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

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

【讨论】:

  • 这是正确的:如果您启动解释器,您将拥有一个具有一个默认图形状态的图形状态堆栈。当前图形状态不使用 .Peek() 直接查看堆栈,但在图形状态堆栈中具有最顶层项目的副本。所以解释器有一个默认的 GSStack,其中有一个 GS 和当前图形状态下的那个 GS 的副本。 ?
  • active gstate 制作副本似乎很好。但是使用 .Peek() 也应该有效。对于我的解释器,我将 Cairo 用于具有自己内部 gstate 堆栈的图形。所以很难使用 gsave/grestore 进行保存/恢复。
  • 但 Peek() 看起来并与您放置在堆栈上的最后一个项目一起工作。这听起来不太好? :s
  • 当前图形状态是栈顶状态。使用 Peek() 似乎是最简单的方法。但是通过制作副本并更直接地访问它可能会提高性能。我建议您使用 Peek() 开始;但如果分析告诉您 Peek() 是性能瓶颈,那么您可能需要考虑使用 CurrentGState 对象并在 gsavegrestore 中更新它。
猜你喜欢
  • 1970-01-01
  • 2020-01-07
  • 2013-02-20
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2012-10-31
  • 2012-08-06
相关资源
最近更新 更多