【问题标题】:PostScript (page)device questionsPostScript(页面)设备问题
【发布时间】:2017-05-09 09:51:18
【问题描述】:

我对图形状态和设备有点困惑。

PLRM 第 679 页:

如果适用于 当前页面设备,这些请求的值由 setpagedevice 合并到 当前页面设备字典。第 6.2 节“页面设备参数”中描述了这些参数的解释。

如果我读到这篇文章,我知道图形状态维护着一个当前页面设备字典。 它似乎还持有一个“当前页面设备

我假设字典是您可以修改的字典,并且当前页面设备是一个只读“对象”,具有来自设备的默认值?

通过阅读手册,您知道设备不止一种:

  • 页面设备
  • 缓存设备
  • 空设备
  • ...

但 graphicsstate 似乎只关心页面设备。它是否正确? 设置时cachedevice和nulldevice存放在哪里?

如果我尝试 IdePS,那么我看到 ghostscript 在状态 dict 中只有一个 currentpagedevice。执行“nulldevice”时,currentpagedevice 仍然存在。

这个“当前页面设备”(不是字典)呢,这也存储在图形状态中吗?

【问题讨论】:

    标签: postscript


    【解决方案1】:

    当前页面设备是在媒体上做标记的设备,在 Ghostscript 中-sDEVICE 参数是初始页面设备。

    但是可以有许多其他设备,最明显的是nulldevice,它只是一个比特桶。如果您执行nulldevice,那么它将用空设备替换处于图形状态的当前页面设备。显然,您通常在 gsave/grestore 对中执行此操作,以便您可以 grestore 回到原始设备!

    类似地,在将字形渲染到缓存时,将缓存设备推送并使其成为当前页面设备是正常的。同样,这是在隐式保存/恢复中完成的,这样您就可以返回到正常的页面设备。这样您就可以获取表示所渲染字形的位图,以便对其进行缓存。

    这些被称为页面设备以区别于其他设备,例如 I/O 设备。

    每个页面设备都有一个页面设备字典(可能为空),其中包含键和值。您可以通过执行currentpagedevice 以字典形式检索设备的当前设置。您可以通过使用键/值对创建字典并使用setpagedevice 将请求发送到设备来修改设备的行为。请注意,设备可能会忽略该请求,如果没有,它将重置当前页面。

    所以我希望:

    currentpagedevice {exch == ==} forall
    nulldevice
    currentpagedevice {exch == ==} forall
    

    给出不同的结果。

    注意 页面设备字典不作为图形状态的一部分进行维护,它由设备维护。

    处于图形状态的是设备本身,它通常是某种不透明的对象,您无法对其进行任何操作。

    我不确定你的意思是什么:“如果我尝试 IdePS,那么我看到 ghostscript 在状态 dict 中只有一个 currentpagedevice。执行“nulldevice”时,currentpagedevice 仍然存在。”

    currentpagdevice 是返回属于当前页面设备的页面设备字典的运算符。所以你不能有“状态字典中的当前页面设备”。 currentpagedevice 始终存在,因为它是一个运算符。

    如果我运行上面的代码,我会看到原始页面设备有一个包含许多条目的字典,但空设备有一个空页面设备字典。

    [编辑]

    嗯,它确实是 Ghostscript 中的字典,但这(至少部分)是因为 Ghostscript 实现 setpagedevice 的奇怪方式。 FWIW Distiller 也将它实现为字典,但我知道至少有一个解释器没有,它从 C 结构中维护的条目创建一个新字典,并在执行 currentpagedevice 时返回它。我的印象是这是一个 PostScript 问题,而不是一个特定的 Ghostscript 问题.... :-)

    如果您将其实现为字典,则必须确保设备维护的字典与图形状态下的字典同步,或者您使用任何其他方式从 currentpagedevice 返回字典。当然,这些可以是同一个字典,这意味着它不是问题。

    我不确定你的程序是如何工作的,图形状态是一个不透明的对象,它不能询问它。我的猜测是该程序正在维护自己的“状态”记录。该记录与解释器的内部状态无关。我可以告诉你一个事实,你在“状态”下看到的内容与 Ghostscript 内部维护的图形状态的内容并不接近。

    我建议 IdePS 程序(在幕后)简单地执行一个 currentpagedevice 并读取字典内容。注意左边的字典有内容,右边是空的。

    我不认为“状态”是指解释器中的任何特定实现,它只是程序跟踪内容本身。

    【讨论】:

    • "页面设备字典不作为图形状态的一部分维护,它由设备维护。"看我的截图你看到“currentpagedevice”是图形状态中的一个dicttype。所以它是图形状态的一部分,但你说它不是作为图形状态的一部分维护的,它是一个单独的对象。你能说得清楚一点吗?我是否正确理解 nulldevice、cachedevice 和 displaydevice 都是“页面设备”。而 nulldevice 只是一个带有空页面设备字典的页面设备?
    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2014-12-07
    • 2023-03-26
    相关资源
    最近更新 更多