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

PostScript过程集和资源存储在哪里?,postscript,Postscript,PostScript包含过程集(ProcSets)。 过程集是包含命名过程和运算符的字典 这些程序集按类别组织。 现在这些类别存储在哪里 (常规)资源存储在哪里?(例如字体、CIDFont、CMap、ProcSet等) ProcSet的类别存储在哪里 您是否只需要systemdict中的两个额外字典(localDict和globalDict来存储资源,或者这些字典存储在哪里?) 更新1:(在KenS回答之后) 好吧,也许现在的第一个问题应该是。资源如何存储在解释器中 据我所知,可能有这样一种结构

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

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

  • (常规)资源存储在哪里?(例如字体、CIDFont、CMap、ProcSet等)
  • ProcSet的类别存储在哪里
  • 您是否只需要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中存储了某些内容,则很可能会将其添加到userdict中
    • 如果您在全局VM中存储某些内容,则很可能会将其添加到全局VM中
    参见PostScript语言参考手册3(第66页第3章):

    userdict和globaldict词典旨在成为 应用程序定义的字典和其他 物体。当PostScript程序在本地VM中创建字典时, 然后,它通常将该词典与userdict中的名称关联。 类似地,当程序在全局VM中创建字典时,它 通常将词典与globaldict中的名称关联

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

    findresource操作符是一种您必须自己实现的机制,可以在这两个字典中查找

    这是正确的吗


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

    好的。首先,程序集不是按类别排列的,它们与其他任何资源一样。所以您可以按名称和类别引用它们(在本例中,类别是ProcSet)

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

    实例化后,无论是通过从PostScript程序创建定义,还是通过定位和实例化命名资源,资源都存储在VM中

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

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

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

    [发布问题编辑]

    如果您遵循PLRM中定义的规则,则取决于您如何定义资源。例如,Ghostscript确实定义了两个“实例”字典,一个用于全局VM,一个用于本地VM实例,它们是在localdict和globaldict中定义的IIRC。通过阅读/ghostpdl/Resource/Init/gs_res.ps,您可以了解更多关于这一实现方式的信息,您可能会发现一些注释很有用。特别是关于复制通用资源类别实现的注释

    FontDirectory和GlobalFontDirectory作为字体类别实例的实现是完全合理的,尽管我认为没有实际的要求。显然,在这种情况下,您必须让字体类别findresource实现首先在这些字典中查找现有实例。另一方面,如果不以这种方式实现,则必须使FontDirectory和GlobalFontDirectory与字体类别实例实现保持同步,这可能会造成尴尬和浪费

    正如您所注意到的,由于历史原因,字体与大多数其他资源略有不同,并且与早期PostScript版本向后兼容

    不要忘记隐式资源实现