当前页面设备是在媒体上做标记的设备,在 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 并读取字典内容。注意左边的字典有内容,右边是空的。
我不认为“状态”是指解释器中的任何特定实现,它只是程序跟踪内容本身。