2017-08-28 28 views
1

PostScript包含過程集(ProcSets)。 過程集是包含命名過程和操作符的字典。PostScript過程集和資源存儲在哪裏?

這些程序集按類別排列。 現在這些類別存儲在哪裏?

  1. 哪裏是(常規)資源存儲? (例如字體,CIDFont,CMap,ProcSet,...)
  2. ProcSet的類別存儲在哪裏?

你需要systemdict只是兩個額外的詞典

更新1(localDict和globalDict存儲資源,或者究竟是這些存儲?):

(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,因爲:

  • 如果存儲在本地虛擬機的東西是最有可能加入到了UserDict。
  • 如果您在全局VM中存儲了某些內容,則很可能會將其添加到globaldict中。

看到PostScript語言參考手冊3(第66頁第3章):

的字典的UserDict和globaldict旨在是爲應用程序定義的詞典等 對象 主存儲庫。當PostScript程序在本地VM中創建字典時,它通常會將該字典與userdict中的名稱關聯起來。 同樣,當程序在全局VM中創建字典時,它通常會將該字典與globaldict中的名稱關聯起來。

所以最簡單的將創造200點字典:「MyLocalResources」,並在第一儲存在UserDict中,另一個在globaldict「MyGlobalResources」。 這兩個字典將包含類別(字體,CIDFont,ProcSet等)。

查找資源運算符是一種機制,你必須實現自己將看看這兩個字典之一。

這是正確的嗎?

FontDirectoryGlobalFontDirectory是這些實際上是局部和全局的「字體」資源類的實現?

回答

1

OK首先程序集是而不是按類別排列,它們是任何其他資源。所以你可以通過名字和類別來引用它們(這裏的類別是ProcSet)。

存儲資源可以存儲在任何方便執行的地方。通常這是在磁盤上,但它不一定是;例如Ghostscript可以將其標準資源存儲在ROM文件系統中。

一旦實例化,無論是通過從PostScript程序創建定義,還是通過查找和實例化指定的資源,資源都存儲在VM中。

我不明白,你需要在localdict或globaldict任何額外的條目,因爲findresource可以使用任何機制要定位資源(注意字體的行爲有所不同,有規律可循那裏)

說實話,ProcSet資源或多或少毫無意義,它的唯一用途是允許PostScript程序生成器在每次生成新的PostScript程序時避免向解釋器發送它們自己的ProcSet定義。

顯然,這隻適用於工作流程緊密的地方,您可以在這裏控制PostScript的生成方式。這很少見。對於大多數應用程序ProcSet,每次發送ProcSet的開銷與程序的其餘部分相比非常小。我想這當時似乎是個好主意。

[交的問題編輯]

只要你遵循PLRM定義的規則,它取決於你如何定義資源。例如,Ghostscript確實定義了兩個「實例」字典,一個用於全局虛擬機,另一個用於本地虛擬機實例,這些字典是在localdict和globaldict中定義的IIRC。您可以通過閱讀/ghostpdl/Resource/Init/gs_res.ps來了解更多關於實現方式的信息,您可能會發現一些評論很有幫助。特別是有關複製通用資源類別實現的注意事項。

對於FontDirectory和GlobalFontDirectory是Font類實例的實現是完全合理的,雖然沒有實際的要求,我不認爲。很顯然,在這種情況下,您必須先在這些字典中查找現有實例的字體類別findresource實現。另一方面,如果你沒有這樣實現,那麼你必須保持FontDirectory和GlobalFontDirectory與字體類別實例的實現同步,這可能很尷尬和浪費。

由於歷史原因,字體和大多數其他資源一樣,都是與其他資源有所不同,並且與早期的PostScript版本具有向後兼容性。

不要忘記隱式資源實現。