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:
Inbuilt:
Eingebauts Bildlademodul:
Eingebautes Animlademodul:
Eingebautes Soundlademodul:
Eingebautes Videolademodul:
Native:
AmigaOS:
Windows:
macOS:
Linux:
iOS:
Android:
Plugin:
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().