PostScript包含过程集(ProcSets)。 过程集是包含命名过程和运算符的字典。
这些程序集按类别组织。 现在这些类别存储在哪里?
你是否只需要在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中添加,因为:
请参阅PostScript语言参考手册3(第66页第3章):
字典userdict和globaldict旨在成为 应用程序定义的字典和其他的主要存储库 对象。当PostScript程序在本地VM中创建字典时, 然后它通常将该字典与userdict中的名称相关联。 同样,当程序在全局VM中创建字典时,它 通常将字典与globaldict中的名称相关联。
所以最简单的就是创建2个字典:“MyLocalResources”和“MyGlobalResources”,其中第一个存储在userdict中,另一个存储在globaldict中。 这两个词典将包含类别(字体,CIDFont,ProcSet等)。
findresource 运算符是您必须自己实现的机制,可以查看这两个词典中的一个。
这是对的吗?
FontDirectory 和 GlobalFontDirectory 这些实际上是本地和全球“字体”类别资源的实现吗?
答案 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版本的向后兼容性。
不要忘记隐式资源实现。