PostScript(页面)设备问题

时间:2017-05-09 09:51:18

标签: postscript

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

PLRM第679页:

  

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

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

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

通过阅读手册,您知道有多个设备:

  • pagedevice
  • cachedevice
  • nulldevice
  • ...

但图形状态似乎只关心页面设备。它是否正确? 设置时存储的cachedevice和nulldevice在哪里?

如果我尝试使用IdePS,那么我看到ghostscript只在状态字典中有一个currentpage设备。执行“nulldevice”时,当前页面设备仍然存在。 enter image description here

这个“当前页面设备”(不是字典)又是如何存储在图形状态中的呢?

1 个答案:

答案 0 :(得分:2)

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

然而,可能有许多其他设备,最明显的是nulldevice,这只是一个桶。如果执行nulldevice,那么将使用null设备替换图形状态下的当前页面设备。显然,您通常在gsave / grestore对中执行此操作,以便grestore可以返回原始设备!

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

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

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

所以我希望:

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

给出不同的结果。

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

图形状态是设备本身,而且通常是某种不透明的物体,你无法做任何事情。

我不确定你的意思是:“如果我尝试使用IdePS,那么我看到ghostscript只在状态字典中有一个currentpage设备。当执行”nulldevice“时,当前页面设备仍在那里。”

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

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

[修改

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

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

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

我建议IdePS程序(幕后)简单地执行当前页面设备并读取字典内容。请注意,左边的字典有内容,右边是空的。

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