PostScript(页面)设备问题

PostScript (page)device questions

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

PLRM 第 679 页:

If valid for the current page device, these requested values are merged by setpagedevice into the current page device dictionary. The interpretation of these parameters is described in Section 6.2, “Page Device Parameters.”

如果我读到这篇文章,我就会明白图形状态维护着一个当前页面设备字典。 它似乎还包含一个“当前页面设备

我假设字典是您可以修改的字典,并且当前页面设备是只读的"object",具有设备的默认值?

看说明书就知道不止一台设备:

但是图形状态似乎只关心页面设备。这个对吗? 设置时cachedevice和nulldevice存放在哪里?

如果我尝试 IdePS,那么我会看到 ghostscript 在 state dict 中只有一个 currentpagedevice。执行 "nulldevice" 时,currentpagedevice 还在。

这个"current page device"(不是字典)怎么样也存储在图形状态中吗?

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

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

同理,在将一个字形渲染到缓存中时,将缓存设备推入并使其成为当前页面设备是正常的。同样,这是在隐式 save/restore 中完成的,以便您可以返回到普通页面设备。这样您就可以获取代表呈现的字形的位图,以便对其进行缓存。

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

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

所以我希望:

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

给出不同的结果。

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

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

我不确定你的意思:"If I try IdePS then I see ghostscript only has a currentpagedevice in state dict. When executing "nulldevice“当前页面设备仍然存在。”

currentpagdevice是一个运算符,return是属于当前页面设备的页面设备字典。所以你不能有 "a currentpagedevice in state dict"。 currentpagedevice 始终存在,因为它是一个运算符。

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

[编辑]

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

如果将其实现为字典,则必须确保设备维护的字典与图形状态下的字典同步,或者您使用任何其他方式 return 字典来自当前页面设备。当然,这些可以是同一个字典,那就没问题了。

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

我建议 IdePS 程序(在幕后)只是执行当前页面设备并读取字典内容。请注意,字典左侧有内容,右侧为空。

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