7.9 Lade- und Adaptermodule

Viele Hollywood-Befehle unterstützen Lade- und Adaptermodule. Der Unterschied zwischen einem Lade- und einem Adaptermodul ist folgender: Ein Lademodul fügt Unterstützung für zusätzliche Bild-, Ton-, Video-, Piktogramm-, Schriftart- oder Animationsformate hinzu, während ein Adaptermodul bestimmte Teile von Hollywood durch eine eigene Implementierung ersetzt. Zum Beispiel gibt es Display-Adapter, die verwendet werden können, um Hollywoods integrierter Display-Handler durch einen benutzerdefinierten zu ersetzen (z.B. von SDL oder OpenGL verwalteten Displays), es gibt Netzwerkadapter, die es Plugins ermöglichen, Hollywoods integrierte Netzwerkimplementierung zu überschreiben, und natürlich gibt es Datei-Adapter.

Dateiadapter können beispielsweise verwendet werden, um Unterstützung für neue Containerformate hinzuzufügen. Sie können so an Lademodule gebunden werden, dass der Adapter die Rohdaten bereitstellt, die dann später im Prozess von einem Lademodule interpretiert werden. Beispielsweise könnte ein Adaptermodul das Lesen von gzip-komprimierten Dateien unterstützen. Die so von einem Adaptermodul extrahierten Daten könnten dann von einem Lademodul verarbeitet werden. Beispielsweise könnte ein BMP-Bild in einer gzip-komprimierten Datei enthalten sein: Hollywood würde dann zuerst das Adaptermpdul verwenden, um die unkomprimierten Daten der gzip-Datei bereitzustellen, und dann das Lademodul benutzen, um das eigentliche BMP-Bild zu laden. Ein Datei-Adaptermodul kann auch Daten aus einer zufälligen Quelle implementieren, z.B. von HTTP-Server oder anderen Quellen.

Beginnend mit Hollywood 6.0 können Sie bei fast allen Befehlen, die mit Dateien umgehen können, ein Lade- und/oder ein Adaptermodul in der optionalen Argumenttabelle angeben. Die Idee ist, das Laden von externen Daten zu beschleunigen. Wenn Sie nicht ein Lade- oder ein Adaptermodul angeben, wird Hollywood mit allen derzeit installierten Modulen prüfen, ob diese Datei geöffnet werden kann. Je nachdem, wie viele Plugins Sie installiert haben und wie viele Dateien geladen werden müssen, kann diese Überprüfung den ganzen Prozess erheblich verlangsamen. Wenn Sie das Lade- oder Adaptermodul kennen, mit dem Ihre externen Daten geladen werden sollen, können Sie den Namen in dem Ladebefehl angeben und so den Ladevorgang beschleunigen.

Die Zeichenfolge, die Sie zu den Tags Loader oder Adapter durch das optionale Tabellenargument übergeben, muss mindestens ein Einzellademodul- oder Adaptermodulnamen beinhalten. Oder ein reserviertes Schlüsselwort beschreibt ein spezielles Lade- oder Adaptermodul. Mehrere Namen und Schlüsselworte müssen durch einen senkrechten Strich (|) getrennt werden. Die folgenden Schlüsselwörter sind zur Zeit verfügbar:

Default:
Dies ist der Standardbetriebsmodus. Er kann nicht mit anderen Schlüsselwörtern oder Lade- sowie Adaptermodulnamen kombiniert werden. Er muss immer unabhängig von den anderen verwendet werden. Im Standard-Betriebsmodus wird Hollywood zuerst alle Lade- und Adaptermodule prüfen, ob sie eine Datei behandeln können. Wenn kein Plugin das handhaben kann, kommen die in Hollywood eingebauten Module zum Zuge. Wenn keine integrierten Module die Datei erkennen, werden native Ladeprogramme des Host-Betriebssystems benutzt, um die Datei zu laden.

Inbuilt:
Wenn dieses Schlüsselwort angegeben ist, werden die in Hollywood eingebauten Lademodule überprüft, ob sie die Datei laden können. Hollywoods eingebaute Module unterstützen folgende Dateiformate:

Eingebauts Bildlademodul:
IFF ILBM, JPEG, PNG, GIF und BMP.

Eingebautes Animlademodul:
IFF ANIM, GIF ANIM und AVI MJPEG.

Eingebautes Soundlademodul:
IFF 8SVX, IFF 16SV, RIFF WAVE und Protracker.

Eingebautes Videolademodul:
CDXL video.

Native:
Wenn dieses Schlüsselwort angegeben ist, wird Hollywood im Host-Betriebssystem nach Lade- und Adaptermodulen suchen, um die Datei zu laden. Dies wird nur von bestimmten Typen und Betriebssysteme unterstützt. Hier eine Übersicht:

AmigaOS:
Als native Lademodule werden Datatypes verwendet, um Bilder, Animationen und Sounds zu laden. Es gibt kein natives Videolademodul.

Windows:
Es gibt native Sound- und Videolader, die auf DirectShow und Media Foundation basieren, und native Bild- und Animationslader, die auf der Windows-Imaging-Komponente basieren.

macOS:
Es hat native Sound-, Video- und Bildlademodule basierend auf macOS-Technologien. Es gibt kein natives Animlademodul.

Linux:
Es gibt keine nativen Lademodule.

iOS:
Es gibt native Sound-, Video- und Bildlademodule, die auf iOS-Technologien basieren. Es gibt kein natives Animlademodul.

Android:
Es gibt keine nativen Lademodule.

Plugin:
Wenn dieses Schlüsselwort angegeben ist, wird Hollywood alle Plugins prüfen, ob sie die Datei bearbeiten können. Plugins werden in der Reihenfolge geprüft, in der sie von Hollywood geladen wurden. Dies ist eher zufällig, da dies von der Reihenfolge abhängt, in der sie vom Dateisystem an Hollywood zurückgegeben werden. Wenn Sie sicherstellen möchten, dass ein bestimmtes Plugin aufgefordert wird, eine Datei vor einem anderen Plugin zu bearbeiten, müssen Sie den Namen dieses Plugins explizit in die Zeichenkette aufnehmen, anstatt das generische Schlüsselwort Plugin zu verwenden.

Wenn Sie ein allgemeines Schlüsselwort wie Plugin verwenden und Sie wollen herausfinden, welche Module für das Laden der Datei verwendet wurde, können Sie die Attribute #ATTRLOADER oder #ATTRADAPTER im Befehl GetAttribute() verwenden. Lade- und Adaptermodule können auch einen Formatnamen für die geladene Datei bereitstellen. Sie erhalten dies, indem Sie das Attribut #ATTRFORMAT ermitteln.

Hier sind einige Beispiele:

 
LoadBrush(1, "test.png", {Loader = "inbuilt"})

Der obige Code lädt die angegebene Datei mit dem eingebauten PNG-Bildlademodul. Weder externe Bild, Plugins oder Host-OS-Lademodule werden jemals berücksichtigt.

 
LoadBrush(1, "test.png", {Loader = "myplugin"})

Der obige Code versucht mit myplugin.hwp die Datei test.png zu laden. Wenn myplugin.hwp fehlschlägt, wird LoadBrush() auch scheitern. Die eingebauten Bildlademodule werden nicht berücksichtigt. Wenn Sie wollen, dass LoadBrush() zurück zu dem eingebauten Bildlademodul geht, müssen Sie das Schlüsselwort Inbuilt mit einem senkrechten Strich (|) getrennt hinzuzufügen:

 
LoadBrush(1, "test.png", {Loader = "myplugin|inbuilt"})

In diesem Fall wird LoadBrush() das eingebaute Bildlademodul bereitstellen, falls das Lademodul von myplugin.hwp fehlschlägt. Der folgende Code wird auf AmigaOS, Windows und macOS arbeiten, aber auf allen anderen Plattformen scheitern, da sie nicht über ein natives Bildlademodul verfügen (siehe oben):

 
LoadBrush(1, "test.png", {Loader = "native"})

Auf AmigaOS wird test.png über die Datatypes geladen, unter Windows mit der Windows-Imaging-Komponente, während dies auf dem macOS über die CGImage API geschieht. Unter Linux und Android wird das jedoch scheitern, weil Hollywood keine nativen Bildlademodule auf diesen Plattformen hat.

Sie können auch die Tags Adapter und Loader zum Beispiel wie folgt zusammen verwenden:

 
LoadBrush(1, "test.bmp.gz", {Adapter = "gzip", Loader = "inbuilt"})

Der obige Code wird zunächst die Datei test.png.gz mit gzip.hwp entpacken und dann das entpackten BMP-Bild mit dem eingebauten Bildlademodul laden. Natürlich können Sie auch den folgenden Code so schreiben und es würde auch funktionieren:

 
LoadBrush(1, "test.bmp.gz")

Allerdings gibt es hier einige Zusatzarbeiten, weil Hollywood zunächst alle Dateiadaptermodule und danach alle Bildlademodul-Plugins prüft, ob sie die Datei test.bmp.gz bearbeiten können oder nicht. Je nachdem, wie viele Plugins Sie installiert haben, kann dies einige Zeit in Anspruch nehmen. Wenn Sie also wissen, welche Adapter- und Lademodule Sie verwenden können, wird es die Ladegeschwindigkeit erhöhen, wenn Sie direkt den Namen des Lade- oder Adaptermoduls angeben.

Beachten Sie auch, dass die Reihenfolge der einzelnen Lader und Adapter von Bedeutung ist, wenn Sie mehrere Lader oder Adapter an einen Hollywood-Befehl übergeben und sie durch einen senkrechten Strich (|) trennen. Der folgende Code benutzt beispielsweise zuerst das Plugin digibooster.hwp, um die Datei zu öffnen, und dann das Plugin xmp.hwp:

 
OpenMusic(1, "shades.dbm", {Loader = "digibooster|xmp"})

Auf diese Weise können Sie auch bestimmte generische Lader wie Native, Inbuilt und Plugin priorisieren. Wie oben beschrieben, benutzt Hollywood standardmäßig zuerst Plugin-Lader, dann die integrierten und nachher die nativen Lader, um eine Datei zu öffnen. Wenn Sie möchten, dass native und integrierte Lademodule vor Plugin-Ladern benutzt werden, können Sie die Zeichenkette native|inbuilt|plugin übergeben, um dies zu erreichen. Mit einer solchen Zeichenkette werden native Lader zuerst und Plugin-Lader zuletzt benutzt. Sie können die Standardreihenfolge auch global ändern, indem Sie den Befehl SetDefaultLoader() bzw. SetDefaultAdapter() verwenden. Siehe SetDefaultLoader für Details.

Beachten Sie, dass die Reihenfolge, in der die verschiedenen Lademodule überprüft werden, zur Zeit so festgelegt ist: Hollywood wird immer zuerst Plugins, dann die eingebauten und schließlich die einheimischen Lademodule des Gastgeber-OS durchgehen. Es gibt derzeit keine Möglichkeit, diese Reihenfolge zu ändern. Aber Sie können einfach durch die Angabe von einem Lade- oder Adaptermodul diese Einschränkung umgehen.

Außerdem werden Plugins in der Reihenfolge angefragt, wie sie in Hollywood geladen wurden. Die Reihenfolge in der Zeichenfolge im Tag Loader spielt keine Rolle.

Ein weiterer Vorteil vom direkt angegebenen Lade- oder Adaptermodul ist, dass Sie auf Lade- und Adaptermodule zugreifen können, die vor dem allgemeinen Gebrauch versteckt sind. Plugin-Autoren können entscheiden, dass Lade- oder Adaptermodul-Plugins nicht automatisch zur Verfügung stehen, sobald Hollywood das Plugin geladen hat. Es kann nur verwendet werden, wenn es entweder explizit mit dem Befehl @Require aktiviert oder direkt mit dem Namen des Plugins im Tag Loader oder Adapter angegeben wurde. Diese beiden Tags können also auch versteckte Plugins direkt verwenden.

Ab Version 8.0 unterstützt Hollywood jetzt auch Netzwerkadapter. Diese Adapter folgen demselben Prinzip wie die Datei- und Verzeichnisadapter, d.h. sie können verwendet werden, um die Befehle der Hollywood-Netzwerkbibliothek durch benutzerdefinierte Handler zu leiten, die als Hollywood-Plugins implementiert sind. Netzwerkadapter können beispielsweise die Funktionalität von DownloadFile() und UploadFile() erweitern, um auch TLS/SSL-Verbindungen zu unterstützen. Sie können auch verwendet werden, um die Unterstützung für völlig unterschiedliche Netzwerktypen und -protokolle zu implementieren, da die Netzwerkadapter-Schnittstelle von Hollywood vollständig von jeder Art spezifischer Netzwerk-API abstrahiert wird. Dadurch ist die Anpassung an neue Umgebungen sehr flexibel.

Ab Version 10.0 unterstützt Hollywood auch Dateisystemadapter. Dateisystemadapter können verwendet werden, um zentrale Dateisystemfunktionen wie das Umbenennen von Dateien und Verzeichnissen, das Erstellen von Verzeichnissen, das Verschieben von Dateien und Verzeichnissen usw. durch benutzerdefinierte Funktionen zu ersetzen. Mehrere Hollywood-Befehle unterstützen Dateisystemadapter, z.B. CopyFile(), MakeDirectory() oder DeleteFile().


Navigation zeigen