IFF - nicht nur für den Amiga, Teil 1

Das Konzept des »Interchange File Formats«

Haben Sie sich nicht auch schon gewünscht, Ihre wertvollen Dateien, seien es Bilder, Musik, Texte oder Datenbankdateien, zwischen verschiedenen Programmen oder sogar Computern auszutauschen, ohne nervenaufreibende Umwandlungen durchführen zu müssen? Schon früh fanden Software-Entwickler eine Lösung für dieses Problem, indem sie Standard-Austausch-Formate definierten. Verbreitet hat sich vor allem das Macintosh-Format und das darauf aufbauende IFF (Interchange File Format). 1985 definierte eine Kommission aus Amiga-Entwicklern zusammen mit Electronic Arts den IFF-Standard und veröffentlichte ihn.

Der Aufbau einer IFF-Datei

IFF ist sehr einfach aber erweiterungsfähig aufgebaut. Das bedeutet, daß sich Formate für künftige Anwendungen ohne Probleme in diesen Standard aufnehmen lassen. Bisher hat man im IFF Grafik-, Musik- und Textformate festgelegt. Diese erlauben es den Programmen, auch komplexe Dateien wie beispielsweise Animationen so anzulegen, daß sie ohne Anpassung sogar auf anderen Computern laufen.

Um IFF zu verstehen, ist es notwendig, seine Struktur zu kennen. Eine IFF-Datei besteht grundsätzlich nur aus sogenannten »Chunks« (zu deutsch etwa Datenblöcken). Diese enthalten jeweils ein oder mehrere Daten- oder Informationssegmente, die somit logisch getrennt und damit leicht verwaltbar sind. Stellen Sie sich beispielsweise eine in Chunks aufgeteilte Textdatei vor. Ein IFF unterstützendes Textprogramm kann einen Chunk für die nötigen Textinformationen wie Lineal und Seitenlayout verwenden und einen weiteren für den Text. Das Schema einer Chunkstruktur läßt sich in C so formulieren:

/* erst Typendeklaration */
typedef unsigned char UCHAR;
typedef short WORD;
typedef unsigned short UWORD;
typedef long LONG;
typedef char ID[4];
typedef struct	/* eigentliche Struktur */
{
	ID ckID;
	LONG ckSize;	/* sizeof (ckData) */
	UBYTE ckData[/* ckSize */]
} Chunk;

Als Beispiel sehen Sie folgenden Chunk, der 12 Byte Farbinformationen enthält:

ckID: ‚CMAP‘
ckSize: 12
ckData: 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 64

Jeder Chunk beginnt mit einer ID, der sogenannten Identifikationskennung, die im obigen Beispiel »CMAP« lautet. Es folgt die Längenangabe des »ckData«-Feldes, die in unserem CMAP-Beispiel 12 beträgt. Zuletzt kommen die Daten des »ckData«-Feldes. Wichtig ist hierbei, daß, falls die Daten eine ungerade Länge haben, der nächste Chunk erst bei der folgenden geraden Adresse beginnt. So ist immer gewährleistet, daß man auf den Chunkkopf mit einer Langwortadressierung zugreifen kann. Der Aufbau eines Chunks läßt sich auch mit dem Ausdruck

Chunk : = ID # {f UBYTE* } [0]

beschreiben, wobei »#« die Länge der geklammerten Daten ist. »[0]« steht für ein Ausgleichsbyte, um am Ende ungerade Adressen zu vermeiden. Der »*« besagt, daß weitere Daten (hier UBYTEs) im »ckData«-Feld folgen können, also eine Art »...«-Symbol. Der erste und wichtigste Chunk-Typ ist der sogenannte FORM-Chunk. Dieser enthält als ID »FORM«. Jede IFF-Datei beginnt grundsätzlich mit diesem Chunk. Um zu erkennen, ob eine Datei im IFF abgelegt ist, brauchen Sie demnach nur die ersten 4 Byte auf die Kennung »FORM« zu überprüfen. Die Größe der Datei ist mit der Länge dieses FORM-Chunks identisch. In dessen Datenbereich sind die Daten- und Informations-Chunks enthalten. Er läßt sich deswegen mit einer C-Struktur vergleichen, in der die einzelnen Strukturelemente den untergeordneten Chunks entsprechen. Folgender Ausdruck beschreibt den FORM-Chunk:

FORM:= ‚FORM‘ # { Formtyp (lokaler Chunk | FORM | LIST | CAT)  *}
Formtyp:= ID
lokaler Chunk := Merkmal-Chunk | Daten-Chunk

Der FORM-Chunk-Typ ist eine 4-Byte-ID, die den Inhalt der folgenden Chunks beschreibt. In einem IFF-Bild steht beispielsweise als Typ »ILBM«, eine Abkürzung für »InterLeaved BitMap« (etwa »zeilenorientiertes Bild«). Ein IFF-Bildlader sucht sich aus einer IFF-Datei demnach nur FORM-Chunks, deren Typ ILBM ist. Dies ist wichtig, da eine IFF-Datei beispielsweise auch Musikdaten enthalten kann.

Verschiedene Chunk-Typen

Nach dem FORM-Typ stehen im Datenbereich des FORM-Chunks weitere, diesem untergeordnete Chunks. Dabei kann es sich um weitere FORM-Chunks mit ihrem charakteristischen Aufbau, LIST- oder CAT-Chunks, oder die sogenannten lokalen Chunks handeln. Ein lokaler Chunk ist entweder ein Merkmals-Chunk, der bestimmte Einstellungen für die folgenden Daten-Chunks setzt (zum Beispiel XY = 200, 322), oder ein Daten-Chunk, der die Daten enthält. In einem FORM-Chunk dürfen beliebig viele lokale Chunks vorkommen. So enthält zum Beispiel in einer IFF-Bilddatei ein Merkmals-Chunk die Farben, ein weiterer definiert die Bildgröße und ein Daten-Chunk enthält das Bitimage des Bildes:

tFORM1 24068 ‚ILBM‘	(Dateikopf mit dem FORM-Chunk)
‚BMHD‘ 20	(Merkmals-Chunk Bildgröße)
320, 200, 0, 0, 3, 0, 0, ...
‚CMAP‘ 20	(Merkmals-Chunk Farbwerte)
0, 0, 0, 3, 4, 3, 2, ...
‚BODY‘ 24000	(Daten-Chunk Bilddaten)
0, 0, 0, 4, ...

Sieht man jeden Chunk als eine Art Struktur mit individueller Länge, so deklariert man den obigen Aufbau in C folgendermaßen:

Struktur-Chunk FORM (Typ: ILBM)
{
	struct Merkmal-Chunk BMHD;	/* 20 Bytes */
	struct Merkmal-Chunk CMAP;	/* 20 Bytes */
	struct Daten-Chunk BODY;	/* 24000 Bytes*/
};

Neben den lokalen Chunks treten in einem FORM-Chunk unter Umständen noch CAT- und LIST-Chunks auf. Ein CAT-Chunk dient dazu, mehrere gleichartige Objekte wie beispielsweise Bilder zusammenzufassen. Er hat folgenden Aufbau:

CAT := ‚CAT ‘ # {CAT-Typ (FORM | LIST | CAT) *}
CAT-Typ:= ID

Der CAT-Typ weist darauf hin, welche Art von Objekten in diesem CAT-Chunk zusammengefaßt sind. Hängt man Bilder zusammen, die durch den Typ ILBM definiert sind, dann ist es sinnvoll, ILBM auch als CAT-Typ zu verwenden. Sind die zusammengefassten Objekte jedoch nicht einheitlich (beispielsweise Bilder mit Animationsanweisungen), dann steht es dem Programmierer frei, auch selbsterfundene CAT-Typen zu verwenden. Nach dem CAT-Typ folgen FORM-, LIST- oder weitere CAT-Chunks, welche die einzelnen Objekte enthalten. Ein Beispiel für einen CAT-Chunk-Aufbau sieht in der C-Notation so aus:

Struktur-Chunk CAT (Typ: ILBM)
{
	struct Struktur-Chunk FORM ILBM;	/* vielleicht ein Titelbild */
	struct Struktur-Chunk FORM ILBM;	/* noch ein Titelbild */
	struct Struktur-Chunk CAT DIA;	/* die eigentliche Diashow */
}

Ähnlich dem CAT-Chunk ist auch der LIST-Chunk aufgebaut, der allerdings auch globale Merkmals-Chunks enthalten kann, sogenannte PROP-Chunks (PROPerty: Merkmal). Dies ist sinnvoll, wenn man beispielsweise mehrere Bilder aneinanderhängen will. Dabei besitzt jedes Bild einen eigenen FORM-Chunk mit Formtyp ILBM, aber in einem globalen PROP-Chunk sind für alle Bilder die einheitlichen Farben definiert. Wird ein gleichnamiger Merkmals-Chunk innerhalb eines Einzelbildes verwendet, so wird anstatt der globalen Definition diese lokale verwendet. Der Aufbau der LIST- Chunk ist:

LIST := ‚LIST‘ # {LIST-Typ PROP* (FORM : LIST | CAT) *}
LIST-Typ := ID

Wie aus dieser Formulierung ersichtlich ist, dürfen PROP-Chunks nur vor den Strukturchunks (FORM, LIST, CAT) stehen. Der Aufbau eines PROP-Chunks ist:

PROP :=  ‚PROP‘ # {PROP-Typ Merkmal-Chunks*}
PROP-Typ := ID

Der PROP-Typ gibt einen Hinweis darauf, welche Art von Objekten (Bilder, Musik usw.) diese globalen Merkmale verwenden. Wollen Sie also globale Bildinformationen definieren, so ist der PROP-Typ ILBM. Dies ist wichtig, da in einem LIST-Chunk verschiedene Objekte wie Grafik, Musik (der Text vorkommen können und diese ungünstigerweise gleichnamige Merkmal-Chunks besitzen können. So kann eine Bilddefinition, aber auch ein Musikdefinition »INFO« heißen. Um eindeutig festzulegen, daß nur die Bilddefinitionen zu ersetzen sind, benutzt man als PROP-Typ ILBM. Hier ein Beispiel für einen kompletten LIST-Chunk:

‚LIST‘ 48114 ‚ILBM‘
‚PROP‘ 62 ‚ILBM‘	(Beginn der globalen Merkmale)
‚BMHD‘ 20 	(globale Bildgröße)
320, 200, 0, ...
‚CMAP‘ 22	(globale Farben)
0, 0, 0, 3, 4, ...
‚FORM‘ 24012 ‚ILBM‘	(Jetzt die Bilddaten)
‚BODY‘ 24000	(Bild 1)
0, 0, 0, 0, ...
‚FORM‘ 24012 ‚ILBM‘
‚BODY‘ 24000	(Bild 2)
0, 0, 0, ...

Wie Sie sehen, sind mit IFF auch komplexe Dateien mit unterschiedlichsten Objekten sehr übersichtlich und leicht verwaltbar. Im Bild finden Sie den Aufbau einer kompletten IFF-Datei. Diese enthält alle nötigen Informationen für eine Diashow mit Musikunterstützung. Da die Datei unterschiedliche Objekte, nämlich Bilder und Musik enthält, hat sie den neutralen FORM-Typ »DEMO«. Der erste untergeordnete Chunk ist eine Liste (»LIST«) gleichartiger Bildobjekte. Da diese viele Einstellungen gemeinsam haben, sind solche Informationen in globalen Merkmals-Chunks (»PROP ILBM«) vordefiniert.
Es folgen die drei Diashow-Bilder, die jeweils in einem eigenen FORM-Chunk abgelegt sind. Als zweite Liste sind im »LIST 8SVX« Musikinstrumente zusammengefaßt. Auch hierbei werden gemeinsame Einstellungen im PROP-Chunk vordefiniert. Zuletzt kommen die Daten der drei Instrumente. Die Rahmen im Bild deuten die Unterordnung der Chunks an. In der folgenden Übersicht finden Sie die wichtigsten Chunk-Typen.

Chunk-Arten:

FORM	leitet Objekt(e) ein
LIST	leitet Objektliste ein
CAT 	leitet Objektvereinigung ein
PROP	leitet globale Merkmale ein

Typen:

8svx	8-Bit Sample Sound Voice (Digitalsound)
ANBM	ANimated BitMap
FNTR	Raster FONT
FNTV	Vector FONT
FTXT	Formatted TeXT
GSCR	General-use musical SCoRe
ILBM	InterLeaved raster BitMap image (Zeilenorientierte Rasterbild)
PDEF	deluxe print Page DEFinition
PICS	Macintosh PICture
USCR	Uhuru sound software musical SCRore
UVOX	Uhuru sound software macintosh VOice
SMUS	Simple MUsic Score
VDEO	deluxe video Construction Set ViDEO

In der nächsten Ausgabe befassen wir uns detailiert mit dem wohl meist verbreitetsten Grafikstandard für Heimcomputer, dem Grafik-IFF »ILBM«. (uh)

Literaturverweis:
Amiga ROM Kernal Reference Manual: Exec, Addison Wesley, ISBN 0-201-11099-7


Martin Backschat
Aus: ST-Magazin 09 / 1989, Seite 70

Links

Copyright-Bestimmungen: siehe Über diese Seite