2017-08-28 6 views
1

PostScript enthält Prozedurgruppen (ProcSets). Eine Prozedurgruppe ist ein Wörterbuch, das benannte Prozeduren und Operatoren enthält.Wo werden PostScript-Prozeduren und -Ressourcen gespeichert?

Diese Prozedurgruppen sind in Kategorien unterteilt. Wo werden diese Kategorien gespeichert?

  1. Wo werden (normale) Ressourcen gespeichert? (z. B. Schriftart, CIDFont, CMap, ProcSet, ...)
  2. Wo sind die Kategorien von ProcSet gespeichert?

Sie benötigen nur zwei zusätzliche Wörterbücher in systemdict

UPDATE 1 (localDict und globalDict Ressourcen zu speichern oder wo genau diese gespeichert werden?): (Nach Antwort von Kens)

Ok, vielleicht sollte jetzt die erste Frage sein. Wie werden Ressourcen in einem Interpreter gespeichert?

Von dem, was ich verstehe, ist, dass es vielleicht eine Struktur wie folgt ist:

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) 

Die meisten davon sind Wörterbücher, die in VM gespeichert werden. Entweder in der lokalen VM oder in der globalen VM.

Sind diese Ressourcen auch in userdict und globaldict hinzugefügt, weil:

  • Wenn Sie etwas in lokalen VM speichern es ist höchstwahrscheinlich auf die userdict hinzugefügt.
  • Wenn Sie etwas in einer globalen VM speichern, wird es höchstwahrscheinlich zum globaldict hinzugefügt.

siehe Postscript Language Reference Manual 3 (Seite 66 Kapitel 3):

Die Wörterbücher userdict und globaldict sollen die Hauptlager für die Anwendung definierten Wörterbücher und andere Objekte. Wenn ein PostScript-Programm ein Wörterbuch in der lokalen VM erstellt, ordnet es diesem Verzeichnis dann normalerweise einen Namen in userdict zu ( ). Wenn das Programm ein Dictionary in einer globalen VM erstellt, ordnet es normalerweise dem Dictionary einen Namen in globaldict zu.

Der einfachste wäre die Schaffung 2 Wörterbücher: „MyLocalResources“ und „MyGlobalResources“, wo die erste in userdict und die andere in globaldict gespeichert ist. Diese beiden Wörterbücher enthalten die Kategorien (Schriftart, CIDFont, ProcSet usw.).

Der findresource Operator ist ein Mechanismus, den Sie selbst implementieren müssen, der in einem dieser zwei Wörterbücher suchen wird.

Ist das korrekt?

Fontdirectory und GlobalFontDirectory sind diese tatsächlich die Umsetzung der lokalen und globalen „Font“ Kategorie Ressource?

Antwort

1

OK zuerst Die Prozeduren sind nicht angeordnet in Kategorien, sie sind eine Ressource wie jede andere. Sie verweisen also nach Name und Kategorie (wobei in diesem Fall die Kategorie ProcSet ist).

Gespeicherte Ressourcen können überall dort gespeichert werden, wo es für die Implementierung geeignet ist. Normalerweise ist dies auf der Festplatte, aber es muss nicht sein; Ghostscript kann beispielsweise seine Standardressourcen in einem ROM-Dateisystem speichern.

Einmal instanziiert, entweder durch Erstellen einer Definition aus einem PostScript-Programm oder durch Suchen und Instanziieren einer benannten Ressource, wird eine Ressource in VM gespeichert.

Ich sehe nicht, dass Sie keine zusätzlichen Einträge in localdict oder globaldict benötigen, da Findresource jeden Mechanismus Sie Ressourcen ausfindig machen möchten verwenden können, um (beachten Sie, dass Schriftarten dort ein wenig anders, und es gibt Regeln zu folgen, verhalten)

Um ehrlich zu sein, die ProcSet-Ressource ist mehr oder weniger sinnlos, ihre einzige Verwendung besteht darin, dass PostScript-Programmgeneratoren es vermeiden, jedes Mal, wenn sie ein neues PostScript-Programm erzeugen, eine eigene ProcSet-Definition an den Interpreter zu senden.

Offensichtlich funktioniert dies nur in einem engen Arbeitsablauf, wo Sie Kontrolle darüber haben, wie das PostScript generiert wird. Das ist ziemlich selten. Der Aufwand, das ProcSet jedes Mal für die meisten AnwendungsprocSets zu senden, ist im Vergleich mit dem Rest des Programms ziemlich klein. Ich denke, es schien damals eine gute Idee zu sein.

[Beitrag Frage bearbeiten]

Sofern Sie die Regeln in der PLRM definiert, um Ihnen seine nach oben, wie definieren Sie Ressourcen. Ghostscript zum Beispiel definiert zwei Wörterbücher für Instanzen, eine für globale VM und eine für lokale VM-Instanzen, und diese sind IIRC in localdict und globaldict definiert. Sie können mehr über die Art und Weise herausfinden, wie dies implementiert wird, indem Sie /ghostpdl/Resource/Init/gs_res.ps lesen. Einige der Kommentare könnten hilfreich sein. Insbesondere die Hinweise zum Kopieren der generischen Ressourcentyp-Implementierung.

Es ist ganz vernünftig für FontDirectory und GlobalFontDirectory, die Implementierung von Instanzen der Font Category zu sein, obwohl es keine tatsächliche Voraussetzung dafür gibt, denke ich nicht. Offensichtlich müssen Sie in diesem Fall zuerst die Findresource-Implementierung der Font-Kategorie in diesen Dictionaries zuerst nach vorhandenen Instanzen suchen lassen. Auf der anderen Seite, wenn Sie es nicht so implementieren, müssen Sie das FontDirectory und GlobalFontDirectory mit der Implementierung der Font Category-Instanz synchronisiert halten, die wahrscheinlich umständlich und verschwenderisch ist.

Schriftarten sind, wie Sie feststellen, ein wenig anders als die meisten anderen Ressourcen, aus historischen Gründen wirklich, und Rückwärtskompatibilität mit früheren PostScript-Versionen.

Vergessen Sie nicht die impliziten Ressourcenimplementierungen.

Verwandte Themen