PostScript程序集和资源存储在哪里?

时间:2017-08-28 09:58:52

标签: postscript

PostScript包含过程集(ProcSets)。 过程集是包含命名过程和运算符的字典。

这些程序集按类别组织。 现在这些类别存储在哪里?

  1. (常规)资源存储在哪里? (例如Font,CIDFont,CMap,ProcSet,......)
  2. ProcSet的类别在哪里存储?
  3. 你是否只需要在systemdict中使用两个额外的词典(localDict和一个globalDict来存储资源或者这些存储资源到底在哪里?)

    更新1 :(在回答KenS之后)

    好的,也许现在应该是第一个问题。资源如何存储在解释器中。

    根据我的理解,可能有这样的结构:

    Resources (Dictionary ??? is this local or global or ...?)
    - Font (Dictionary)
    - CIDFont (Dictionary)
    --- CIDFontType (integer)
    --- CIDFontName (name)
    --- CIDSystemInfo (dictionary)
    --- FontBBox (array)
    --- FontMatrix (array)
    --- FontType (integer)
    --- ...
    --- ...
    - CMap (Dictionary)
    - FontSet (Dictionary)
    - Encoding (Array)
    - Form (Dictionary)
    - Pattern (Dictionary)
    - ProcSet (Dictionary)
    --- BitmapFontInit (Dictionary)
    --- CIDInit (Dictionary)
    --- ColorRendering (Dictionary)
    --- FontSetInit (Dictionary)
    --- Trapping (Dictionary)
    - ColorSpace (Array)
    - ...
    - ...
    - Category (Dictionary)
    --- Generic (Dictionary)
    

    其中大多数是存储在VM中的字典。在本地VM或全局VM中。

    这些资源是否也在userdict和globaldict中添加,因为:

    • 如果您在本地VM中存储了某些内容,则很可能会将其添加到用户指令中。
    • 如果您在全局VM中存储某些内容,则很可能会将其添加到globaldict中。

    请参阅PostScript语言参考手册3(第66页第3章):

      

    字典userdict和globaldict旨在成为   应用程序定义的字典和其他的主要存储库   对象。当PostScript程序在本地VM中创建字典时,   然后它通常将该字典与userdict中的名称相关联。   同样,当程序在全局VM中创建字典时,它   通常将字典与globaldict中的名称相关联。

    所以最简单的就是创建2个字典:“MyLocalResources”和“MyGlobalResources”,其中第一个存储在userdict中,另一个存储在globaldict中。 这两个词典将包含类别(字体,CIDFont,ProcSet等)。

    findresource 运算符是您必须自己实现的机制,可以查看这两个词典中的一个。

    这是对的吗?

    FontDirectory GlobalFontDirectory 这些实际上是本地和全球“字体”类别资源的实现吗?

1 个答案:

答案 0 :(得分:1)

确定首先,程序集按类别排列,它们与其他资源一样。所以你按名称和类别引用它们(在这种情况下,类别是ProcSet)。

存储资源可以存储在方便实施的任何地方。通常这是在磁盘上,但它不一定是;例如,Ghostscript可以将其标准资源存储在ROM文件系统中。

一旦实例化,无论是通过从PostScript程序创建定义,还是通过查找和实例化命名的资源,资源都存储在VM中。

我没有看到你需要localdict或globaldict中的任何额外条目,因为findresource可以使用你喜欢的任何机制来定位资源(注意字体的行为有点不同,并且有规则可以遵循那里)

老实说,ProcSet资源或多或少没有意义,它的唯一用途是允许PostScript程序生成器在每次生成新的PostScript程序时避免将它们自己的ProcSet定义发送给解释器。

显然,这仅适用于紧凑的工作流程,您可以控制PostScript的生成方式。这非常罕见。对于大多数应用程序ProcSets,每次发送ProcSet的开销与程序的其余部分相比非常小。我想当时这似乎是一个好主意。

[发布问题编辑]

如果您遵循PLRM中定义的规则,您可以自行决定如何定义资源。例如,Ghostscript确实定义了两个“实例”词典,一个用于全局VM,一个用于本地VM实例,这些是在localdict和globaldict中定义的IIRC。您可以通过阅读/ghostpdl/Resource/Init/gs_res.ps找到有关实现此方法的更多信息,您可能会发现一些评论很有帮助。特别是有关复制通用资源类别实现的说明。

FontDirectory和GlobalFontDirectory完全合理地实现了Font Category的实例,虽然没有实际的要求,我不这么认为。显然,在这种情况下,您必须首先在现有实例的字典中查找字体类别findresource实现。另一方面,如果你没有这样实现它,那么你必须保持FontDirectory和GlobalFontDirectory与Font Category实例实现同步,这可能是尴尬和浪费。

正如您所指出的那样,字体与其他大多数资源有所不同,原因是历史原因,以及与早期PostScript版本的向后兼容性。

不要忘记隐式资源实现。