======================================================
        |                                                      |
        |    Programmierung von Modulen f�r GEM-View 3.00      |
        |               ----------------------                 |
        |               GEM-View ist SHAREWARE                 |
        |               ----------------------                 |
        |                                                      |
        |                 � 1990/91/92/93 by                   |
        |                                                      |
        |                  Dieter Fiebelkorn                   |
        |                   Gr�ner Weg  29a                    |
        |                 45768 Marl-Brassert                  |
        |                      (Germany)                       |
        |                                                      |
         ======================================================


!!!!! BITTE LESEN SIE AUCH DIE DATEIEN "CHANGES" UND "GEMVIEW3.TXT" !!!!!


Inhalts�bersicht: (Lesen Sie auch "CHANGES")
============================================
  - Modularisierung
    - Allgemeines
    - Lademodule
      - GDPS Treiber
    - Speichermodule
    - Druckmodule
    - Bearbeitungsmodule
    - Das Konvertierungsmodul
    - "EXTOBFIX.PRG" von Interface
    - Abschlie�ende Worte
  - Parameter�bergabe und allgemeine Strukturen
    - Parameter�bergabe
    - IMAGE-Struktur
    - IMAGEOPTIONS-Struktur
    - LOAD-Struktur
    - SAVE-Struktur
    - PRINT-Struktur
    - PROC-Struktur
    - CONV-Struktur
  - Entwickler-Support


Neue Modularisierung:
"""""""""""""""""""""

Allgemeines:
������������
 Die externen Module haben die Endungen: GVL, GVS, GVP und GVR (jeweils
 f�r Load, Save, Print unf pRocess) und werden in einem einstellbaren
 Modulverzeichnis ("Install path ...   ^Z") in den Unterordern GVWLOAD,
 GVWSAVE, GVWPRINT und GVWMODUL gesucht! Von diesem Modulen darf es
 beliebig viele geben; Hauptsache es ist genug Speicher vorhanden um die
 allgemeinen Verwaltungsinformationen zu allen Modulen anzulegen. Aber
 wenn das nicht klappt, dann sollten Sie besser keine Bilder mehr laden,
 daf�r reicht der Speicher dann mit Sicherheit nicht mehr! Allerdings
 bleibt GEM-View mit seinen internen Modulen (GEM-XIMG, GEM-Metafile, Text,
 Resourcen und Hexdump f�rs Laden, sowie GEM-XIMG f�rs Speichern) funktions-
 t�chtig!

 Auch wenn "verbose" eingeschaltet ist sollte nicht mehr als notwendig
 "gelabert" werden. Eine einzeilige Information �ber die Aktion ist
 vollkommen ausreichend. Wenn jemand sein Copyright unbedingt einbringen
 mu�, dann ist die Meldung auf eine Zeile zu beschr�nken und darf nur
 bei dem Speicher-, Druck- und Bearbeitungsmodulen eingebaut werden.
 Bei den Lademodulen ist es nur st�rend und wird ohne meine Zustimmung
 nicht geduldet. Im �u�ersten Fall ;-{ kann ich mich dazu durchringen
 es bei einem komplexen Modul NACH der Identifizierung des Bildes zu
 erlauben!

 F�r das Copyright ist der Modulheader und die Infofunktion in den
 "Load type"-, Speicher-, Druck- und Bearbeitungs-Dialogen geschaffen
 worden!
 Da Beispiele meist mehr sagen als viele Worte, liegen eine Reihe von
 Sourcen f�r die einzelnen Modulen dem Paket bei! Allerdings finden
 sich hier doch einige Anmerkungen und Hinweise, die in den Sourcen
 und in der Beschreibung der Strukturen nicht so offensichtlich zu
 Tage treten.


Lademodule:
�����������
Folgende Bildtypen d�rfen von dem Ladetreiber geliefert werden:
- Mono      : IATARIMONO, IBITMAP
- Color     : IATARI_RGB, IRGB
- True-Color: IATARI__TC, ITRUEC

Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
der Funktion, zu beachten ist nur, da� der Zeiger auf die Struktur
"LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
im Register D0 �bergeben wird:

  Image *gvw_loader(LOAD_Structure*  ls, int verbose);

Der Zeiger auf die "Image"-Struktur wird ebenfalls im Register A0
zur�ckgegeben. Neben dem Zeiger auf die Struktur sind zwei Sonder-
f�lle m�glich:
"NULL" oder "0L" im Register A0 bedeutet, da� kein Bild identifiziert
                 oder geladen wurde!
"(Image* -1L)"   im Register A0 bedeutet, da� das Bild zwar eindeutig
                 identifiziert werden konnte, aber es war aber nicht
                 m�glich es zu laden (Speicherplatzmangel, defekte
                 Bilddaten, ...)
Alle anderen Werte werden als Zeiger auf eine "Image"-Struktur ver-
wendet. Also, hier ist Gewissenhaftigkeit angesagt!

Lademodule m�ssen, wenn Sie automatisch von GEM-View aufgerufen werden
zuerst versuchen das Format des Bildes zu identifizieren, d.h. pr�fen,
ob das angegebene File eindeutige Merkmale des Formates besitzt, das
dieses Modul repr�sentiert. Ein automatischer Aufruf kann von dem
benutzer-gew�hlten Aufruf durch das Flag "ls->user_identified" unter-
schieden werden. Soll das Format nur identifiziert, aber nicht geladen,
werden, so ist das Flag "ls->only_identified" gesetzt. In diesem Fall
wird, wie beim Laden, eine Meldung �ber das Bild ausgegeben, wenn das
Bild identifiziert werden konnte und ein Wert ungleich NULL ((void*)0L)
in A0 zur�ckgegeben. Konnte das Bild nicht identifiziert werden, so
wird als Funktionswert NULL ((void*)0L) in A0 zur�ckgegeben.

Bei den Lademodulen kann �ber "Schalter" (Flags) die Verwaltung und
Verwendung der Module gesteuert werden. Weiterhin existiert ein Flag,
welches nur vom Programmierer des Moduls eingestellt werden kann:
Das "File-Selector"-Flag.

Der Schalter "Res." (Resistent) bewirkt im eingeschalteten Zustand, da�
dieses Modul dauerhaft, d.h. w�hrend der Laufzeit von GEM-View, im
Hauptspeicher gehalten wird. Ist dieser Schalter im Modul eingeschaltet,
wenn GEM-View gestartet wird, so wird das Modul w�hrend des "Scan" oder
Absuchvorganges geladen und im Speicher verwaltet. Wird der Schalter
erst nach dem Start von GEM-View aktiviert, so wird das Modul resistent
nachdem es einmalig zur Analyse des Bildformates in den Speicher ge-
laden worden ist.

Der Schalter "Auto" (Automatischer Aufruf) wird dazu verwendet GEM-View
mitzuteilen, ob dieses Modul zur Identifizierung des Bildformates ein-
gesetzt werden soll. Eingeschaltet wird das Modul geladen und mit den
dort vorhandenen Pr�fmechanismen versucht das Bild zu analysieren, wird
es erkannt, so wird es mit diesem Modul auch sofort geladen. Ist der
Schalter nicht aktiviert, so wird das Modul einfach �bersprungen, aller-
dings k�nnen Sie es �ber "Load type" immer noch direkt ausw�hlen!

Das "File-Selector"-Flag gibt an, ob eine File-Selector-Box zur
Auswahl eines Bildes ge�ffnet werden soll in der Regel ist dies
der Fall, wenn allerdings das Bild nicht einer Datei, sondern einem
externen Ger�t entnommen wird (z.B. Scanner) so ist die File-Selector-
Box �berfl�ssig und kann deaktiviert werden. Dies bietet sich gerade
im Zusammenhang mit dem "Auto"-Flag an um beispielweise einen GDPS-
Treiber f�r GEM-View zu realisieren.

Nebenbei empfehle ich zur Sicherheit, das Module, die externe Ger�te
ansprechen oder vor der Analyse des Bildes einen Benutzerdialog f�hren
m�ssen in der Struktur "LOAD_Structure" das Flag "ls->user_identified"
�berpr�ft wird. Ist es gel�scht handelt es sich um einen automatischen
Aufruf von GEM-View, so das h�ufig ein sofortiges Verlassen des Moduls
sinnvoll sein d�rfte. Ist das "ls->user_identified"-Flag hingegen ge-
setzt kann das sich Modul voll ins Zeug legen, weil ... der Benutzer
will es ja nicht besser! ;-/

  GDPS Treiber:
  �������������
  Dieser Abschnitt ist dazu da um Neugierig zu machen in den letzten
  Abs�tzen sollte klar geworden sein, das ein GDPS-Treiber einfach an
  GEM-View anzubinden sein sollte, wenn mal die GDPS-Schnittstellen-
  Beschreibung vorliegt. Am besten ist aber ein Programmierer, der
  sich schonmal damit rumgeschlagen hat macht sich daran zu schaffen.
  Ich kann es nicht selber machen, da mir Beschreibung, Ger�te zum
  testen und inzwischen auch die Zeit fehlt. Tja, ;-(


Speichermodule:
���������������
Folgende Bildtypen k�nnen dem Speichermodul �bergeben werden:
- Mono      : IATARIMONO, IBITMAP
- Color     : IATARI_RGB, IRGB
- True-Color: IATARI__TC, ITRUEC

Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
der Funktion, zu beachten ist nur, da� der Zeiger auf die Struktur
"LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
im Register D0 �bergeben wird:

  int    gvw_saver (SAVE_Structure*  ss, int verbose);
Der R�ckgabewert der Funktion, der angibt ob die Funktion korrekt
ihren Dienst verrichtet hat wird im Register D0 erwartet.


Druckmodule:
������������
Folgende Bildtypen k�nnen dem Druckmodul �bergeben werden:
- Mono      : IATARIMONO
- Color     : IATARI_RGB
- True-Color: IATARI__TC

Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
der Funktion, zu beachten ist nur, da� der Zeiger auf die Struktur
"LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
im Register D0 �bergeben wird:

  int    gvw_print (PRINT_Structure* ps, int verbose);
Der R�ckgabewert der Funktion, der angibt ob die Funktion korrekt
ihren Dienst verrichtet hat wird im Register D0 erwartet.


Bearbeitungsmodule:
�������������������
Folgende Bildtypen k�nnen dem Bearbeitungsmodul �bergeben werden:
- Mono      : IATARIMONO
- Color     : IATARI_RGB
- True-Color: IATARI__TC

Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
der Funktion, zu beachten ist nur, da� der Zeiger auf die Struktur
"LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
im Register D0 �bergeben wird:

  Image *gvw_proc  (PROC_Structure*  rs, int verbose);
Der Zeiger auf die "Image"-Struktur wird ebenfalls im Register A0
zur�ckgegeben. Neben dem Zeiger auf die Struktur ist ein Sonder-
fall m�glich:
"NULL" oder "0L" im Register A0 bedeutet, das die Operation nicht
                 durchgef�hrt werden konnte. Der Grund sollte dem
                 Benutzer durch eine Zeile im Protokoll-Fenster
                 angezeigt werden. Alternativ kann in diesem Fall
                 auch der Zeiger auf das "Input"-Bild "rs->image"
                 zur�ckgegeben werden, es hat den gleichen N�hrwert!

Das Bild, welches dem Bearbeitungsmodul �bergeben wird von GEM-View aus dem
Speicher entfernt und darf nicht vom Modul gel�scht werden.


Das Konvertierungsmodul:
������������������������
  Eine neue Funktion im Modul GEMVIEW.GVC wird durch "Convert ..." im
  Deskmen� aufgerufen, wenn das Modul gefunden wird. Sie liefert eine
  Kette von ImageOptions-Strukturen zur�ck, die dann von GEM-View ab-
  gearbeitet wird. Der Zeiger auf die Struktur "CONV_Structure" wird
  im Register A0 �bergeben.
  ImageOptions *gvw_proc  (CONV_Structure*  cs);

Der Zeiger auf die "ImageOptions"-Struktur wird ebenfalls im Register
A0 erwartet. Neben dem Zeiger auf die Struktur ist ein Sonderfall
m�glich:
"NULL" oder "0L" Nichts zu Konvertieren! (*Puh*) Nochmal an der an-
                 strengenden Arbeit vorbei gekommen.

Die Hauptfunktion des Moduls "CONVERT", das auch als Quelltext vorliegt,
hilft sicherlich beim Entwerfen eines neuen Konvertierungsmodule, welches
nur noch die Strukturen zusammenstellen mu�. GEM-View �bernimmt ja die
eigentliche Arbeit. Schauen Sie sich also mal ein wenig in der Funktion
"gvw_convert" aus dem "CONVERT"-Modul um.
Die anderen Funktionen im Modul "CONVERT" sind "schm�ckendes" Beiwerk und
f�r die die Gesamtfunktionsweise von untergeordneter Bedeutung.


"EXTOBFIX.PRG" von Interface
����������������������������

Die Idee, f�r die Anzeige von erweiterten Resourcen, externe Module zu
verwenden geht leider mal nicht auf mich zur�ck. Vielmehr hat Georg Kr�mer
diesem Vorschlag Anfang Oktober gemacht, den ich gerne aufgegriffen habe,
weil Olaf Meisiek (Autor von Interface) die meiste Arbeit mit seiner
Definition und der Realisierng von "EXTOBFIX.PRG" schon geleistet hatte.
W�re ich nicht so bl�d gewesen, h�tte die Einbindung auch wesentlich
schneller und unproblematischer ablaufen k�nnen. Na ja, reden wir besser
nicht dar�ber.
Also langer Rede kurzer Sinn, wenn Sie ihr pers�nliches "EXTOBFIX.PRG" in
den Modulordner kopieren dann werden die Resourcen nun in voller Pracht
und Sch�nheit angezeigt. F�r alle Wissensdurstigen sei gesagt: GEM-View
verwendet ausschlie�lich die "fix_objs"-Routine aus dem Zeigerarray und
legt wie Interface Kopien der aller OBJECT-Strukturen an (Edit-Objekte
gibt es in GEM-View nicht ;-). F�r weitere Informationen schlagen Sie
bitte im Interface-Handbuch unter "Programmierung eines EXTOBFIX-Programmes"
nach (bei mir ist es Kapitel 7, Seite 63).


Abschlie�ende Worte:
��������������������
Speichermodule schreiben ihre Ausgaben in eine Datei, eine Umlenkung
auf den Drucker wird nicht speziell unterst�tzt, daf�r ist es aber
m�glich sowohl Farbbilder, als auch TrueColor-Bilder in einer mono-
chromen Bildschirmaufl�sung zu erhalten.
Die Druckmodule geben in der Regel die Daten direkt auf den Drucker
aus. Hierf�r stehen "PRN:" f�r die parallele Schnittstelle und "AUX:"
f�r die serielle Schnittstelle zur Verf�gung. Eine Ausgabe in eine
Datei kann ohne weiteres durch die Angabe eines absoluten Pfades
erfolgen. Allerdings kann NUR das angezeigte Bild gedruckt werden.

Abfragen �ber Alert-Boxen oder mit Hilfe von Dialogen oder die Ver-
wendung der File-Selector-Box sind zul�ssig. Als Beispiel sei angef�hrt:
- JPEG Speichermodul (ist mir von Guido Vollbeding zugesichert worden!):
  Kann mit einem Dialog die Qualit�t der Ausgabe einstellen.
- PostScript Druckmodul (wird von Bj�rn Tiemann (Schweiz) erstellt):
  Kann mit einer Alert-Box abfragen, ob auf der paralellen, der seriellen
  Schnittstelle oder in ein File "gedruckt" werden soll. Die File-Selector-
  Box wird zur Auswahl der Zieldatei aufgerufen.
Ich m�chte allerdings darauf hinweisen, da� ein Modul seinem spezifischen
Zweck nachkommen soll und nicht mehrere unterschiedliche Funktionen bereit-
stellt. Es wird nur un�bersichtlich, wenn das Speichermodul mit dem Drucker
musiziert und vielleicht dann irgendwann ein Druckmodul versucht ein neues
Bild zu Laden. Vieles ist m�glich, aber nicht alles ist sinnvoll.
Achtet also auf eine saubere Trennung der Module! DANKE!

Soll ein Modul erstellt werden, das in einer beliebigen Bildschirmaufl�sung,
in der Lage sein soll, einen beliebigen Bildtyp wieder in voller Farbtiefe
abzulegen, so sollte es konsequenterweise als Speichermodul ausgelegt
werden. Im Beispiel einer PostScript Ausgabe sollte ein Modul f�r die
Speicherung zust�ndig sein (dies verarbeitet alle m�glichen Bildtypen,
unabh�ngig von der Bildschirmaufl�sung). Ein weiteres Modul ist f�r den
Druck zust�ndig und erh�lt ausschlie�lich angezeigte Bilder.

Die GEM-View Module d�rfen "fast" alles, was ein GEM-Programm darf.
Nicht erlaubt ist die Verwendung der Funktionen appl_init() und appl_exit()!
Alles was nach Ende des Moduls nicht mehr erreichbar mu� vor Ende des Moduls
wieder entfernt werden. Zum Beispiel:
- VDI-Workstation (auch virtuelle) m�ssen vor Beendigung des Moduls
  geschlossen werden.
- Fenster die erzeugt und ge�ffnet wurden m�ssen wieder geschlossen und
  gel�scht werden.
- Zu jedem wind_update(BEG_UPDATE/BEG_MCTRL) mu� ein wind_update(END_UPDATE/
  END_MCTRL) vorhanden sein.
- ... (was sonst noch anf�llt) ...
CONVERT.C zeigt schon ein bissel (bischen) davon, was gemacht werden darf!

Nach einer Richtlinie von ATARI m�ssen Dialog durch wind_update(BEG_UPDATE/
BEG_MCTRL) und wind_update(END_UPDATE/END_MCTRL) umschlossen werden, da es
sonst zum "�bermalen" des Dialoges durch den Desktop kommt (AES 3.x, 4.x)!
CONVERT.C ber�cksichtigt diese Richtlinie!


Parameter�bergabe und allgemeine Strukturen:
""""""""""""""""""""""""""""""""""""""""""""

Parameter�bergabe
�����������������
F�r die Parameter�bergabe gelten die Regeln von Turbo C / Pure C:
Parameter�bergabe Pure C (Auszug aus der Online Hilfe von PureC)
======================================================================
- Die ersten drei Variablen vom Typ char, int oder long werden in den
  Registern D0, D1, D2 �bergeben.
- Die ersten zwei Adressparameter (Pointer) werden in den Registern A0 und
  A1 �bergeben.
- Weitere Parameter, die keinen Platz mehr in den Registern D0, D1, D2, A0
  A1 finden werden �ber den Stack �bergeben.
- Parameter werden in der Reihenfolge von rechts nach links �bergeben.

Beispiel:
---------
extern void lbf(int x1, int y1, int x2, int y2, int *l, int *b, int *f);
main()
{
	int x1 = 10, y1 = 10, x2 = 20, y2 = 20, l, b, f;
	lbf(x1, y1, x2, y2, &l, &b, &f);
}
Da mehr Werte-, als auch Adress-Parameter an die Funktion "lbf" �bergeben
werden, als Register zur Verf�gung stehen, ben�tigen wir also in jedem Fall
den Stack. Der vierte Werte-Parameter mu� auf dem Stack abgelegt werden.
Ebenso findet der dritte Adress-Parameter keinen Platz in den Registern,
so da� auch dieser auf dem Stack abgelegt werden mu�.

In den Registern befinden sich:     D0: x1  (Wert von x1)
                                    D1: y1  (Wert von y1)
                                    D2: x2  (Wert von x2)
                                    A0: &l  (Adresse der Variablen l)
                                    A1: &b  (Adresse der Variablen b)
Auf dem Stack befinden sich:        &f (hi) (h�chstwertiges Wort im Stack)
                                    &f (lo)
                                    y2      (Wert von y2)
                                    Return- (R�cksprungadresse)
                                    Adresse (Stackpointer zeigt hierauf)

Der Adress-Parameter f wird nach der Regel "von-rechts-nach-links" zuerst
auf den Stack gelegt. Danach kommt der Wert von y2 auf den Stack. Bitte
beachten Sie, da� die R�cksprungadresse des Unterprogrammes als letzter
"Parameter" auf den Stack gelegt wird, so da� die Parameter im Stack ab dem
Offset 4 anfangen. y2 (Offset 4), &f (Offset 6)!

�bergabe von float und double Parametern (Wird hier nicht verwendet!)
---------------------------------------------------------------------
- Variablen vom Typ "float" und "double" werden grunds�tzlich auf dem
  Stack �bergeben.
- Jede Funktion die eine andere Funktion mit R�ckgabewert vom Typ "double"
  oder "float" aufruft, reserviert als Erstes eine lokale "double"-Variable
  (d.h. 10 Byte) auf dem Stack zur Aufnahme des R�ckgabewertes.
- Der R�ckgabewert hat intern immer den Typ "double", auch wenn er als
  "float" deklariert wurde. In diesem Fall wird er nach der R�ckkehr in
  einen "float" konvertiert.

Allgemeines
-----------
Obiges gilt sinngem�� auch f�r Funktionen, die Strukturen zur�ckliefern,
nur werden nicht 10 Bytes auf dem Stack reserviert, sondern gen�gend
Speicher, um die ganze Struktur aufzunehmem.

In C r�umt die aufrufende Funktion nach dem Aufruf die Parameter selbst
vom Stack (z.B. mit ADDQ.W #8,A7", nach einem Aufruf mit zwei Adresspara-
metern). Dies er�brigt sich nat�rlich, wenn alle Parameter in Registern
�bergeben wurden.
======================================================================


IMAGE-Struktur (Zur Aufnahme und die Definition der Bilder)
�����������������������������������������������������������
Hier ist die "Image"-Struktur, mit den Hilfsstrukturen aufgef�hrt und
kurz erl�utert.

typedef struct rgbmap {
  unsigned int  size;         /* Gr��e der Farbpalette in red, green und blue,
                                 mu� unbedingt eine Zweierpotenz (2^n) sein */
  unsigned int  used;         /* Anzahl der verwendeten Farben in Palette   */
  unsigned char compressed;   /* (interne Verwendung) wird auf 0 gesetzt    */
  unsigned char reserved;     /* (reserviert) f�r k�nftige Erweiterung      */
  unsigned int  unused16;     /* (interne Verwendung) wird auf 0 gesetzt    */
  Intensity    *red;          /* Farbwerte f�r Rot: Wertebereich [0..65535] */
  Intensity    *green;        /* entsprechende Gr�n-Farbwerte von 0 bis used*/
  Intensity    *blue;         /* dazu passende Farbwerte in Blau. Sum:Farbe */
} RGBMap;


typedef struct Scaling {
  unsigned       count : 4;   /* ScaleDialog/Punkte: 1(a), 2(a,b), 3(a,b,c) */
  unsigned       a     : 4;   /* Wertebereich: 1 (unterste Position)        */
  unsigned       b     : 4;   /*               4 (mittlere Position,default)*/
  unsigned       c     : 4;   /*               7 (oberste Position)         */
} Scaling;


typedef struct Image {
  char          *title;       /* Pfadname, z.B. durch new...Image() gesetzt */
  unsigned short type;        /* Typ des Bildes, durch new...Image() gesetzt
                                IBITMAP    0x11: Bild ist eine Bitplane
                                IATARIMONO 0x11: Bild ist Atari Mono Bitplane
                                IATARI_RGB 0x12: Bild ist AtariColor Bitmap
                                IATARI__TC 0x13: Bild ist Atari TrueColor
                                ITRUEC     0x13: Bild ist TrueColor Bild
                                IRGB       0x14: Bild ist RGB-Paletten Bild */
  unsigned short width;       /* LOAD: sichtbare Breite des Bildes in Punkten
                                 Nach dem Alignment (f�r SAVE, PRINT, PROC):
                                 Gespeicherte Breite des Bildes in "data"   */
  unsigned short height;      /* H�he des Bildes in Punkten                 */
  unsigned short depth;       /* Tiefe des Bildes, B/H/T gesetzt durch ...  */
  unsigned short unalignwidth;/* (intern) sichbare Breite nach Alignment
                              /* LOAD: nicht verwendet, auf 0 gesetzt.
                              /* SAVE, PRINT, PROC: diese Breite beachten!  */
  RGBMap         rgb;         /* Farbpalette des Bildes, Struktur siehe oben*/
  byte          *data;        /* Bilddaten, gerundet nach den Angaben aus:
                                 - "width" und "alignTo8" (bei LOAD)
                                 - "width" (bei SAVE, PRINT, PROC, auf Worte)
                                   wird durch Alignment auf Worte gerundet  */
  unsigned int   pixlen;      /* Zahl der Bytes/Pixel: Mono/Color:1 ; TC:3  */
  Scaling        scalered;    /* (intern) Scale-Beschreibung f�r Rot        */
  Scaling        scalegreen;  /* (intern) Scale-Beschreibung f�r Gr�n       */
  Scaling        scaleblue;   /* (intern) Scale-Beschreibung f�r Blau       */
  Scaling        scaleadjust; /* (intern) Scale-Beschreibung f. Grauwandlung*/
  unsigned       alignTo8 :2; /* 1: Bild ist schon auf Bytes aligned;
                                    sollte in bei MONOs gesetzt werden
                                 2: Bild steht schon Worte aligned in data  */
  unsigned   fastload     :1; /* (internal)                                 */
  unsigned   loadgdosfonts:1; /* (internal)                                 */
  unsigned   scaleused    :1; /* (internal)                                 */
  unsigned   unused       :3; /* (internal)                                 */
  unsigned   font_point   :8; /* (internal)                                 */
} Image;


Folgende Bildtypen sind zul�ssig:

- Mono
  - IATARIMONO, IBITMAP
    In diesen Bildtypen wird eine Bitplane in "image->data" abgelegt. Ein
    gesetztes Bit ist schwarz ein gel�schtes Bit ist wei�. Die Definition
    entspricht einer GEM-Mono-Standard-Bitmap. Im Fall eines "IATARIMONO"-
    Bildes sind die Daten auf 16 Bit (Worte) begradigt. Bei Bildern vom
    Typ "IBITMAP" sind die Daten in der Regel byteweise ausgrichtet.

- Color
  - IATARI_RGB
    In "image->data" befindet sich eine GEM-Color-Standard-Bitmap, d.h. es
    sind genau "image->depth" viele monochrome Bitplanes mit der folgenden
    Gr��e hintereinander angeordnet: "image->width * image->height / 8".
    Beachten Sie, da� "image->width" auf 16 begradigt ist und die Rechnung
    in LONG durchgef�hrt werden sollte.
    Die Reihenfolge der Farben ergibt sich aus der Kodierung der Pixel,
    wobei die erste Plane das niederwertigste Bit repr�sentiert.
    Die Daten von Bilder des "IATARI_RGB"-Typs sind immer auf 16 Bit (Worte)
    ausgerichtet! Beispiel: Ein Bild mit 3 Planes!
    Plane 1: %01010101 ........
    Plane 2: %00110011 ........
    Plane 3: %00001111 ........
    image->rgb.size = 8; image->used = 8
    image->rgb.red  : 0xFFFF 0xFFFF 0x0000 0x0000 0xFFFF 0xFFFF 0x0000 0x0000
    image->rgb.green: 0xFFFF 0x0000 0xFFFF 0x0000 0xFFFF 0x0000 0xFFFF 0x0000
    image->rgb.blue : 0xFFFF 0x0000 0x0000 0xFFFF 0x0000 0xFFFF 0xFFFF 0x0000
    Die Punkte habe von links nach rechts folgende Kodierungen und Farben:
    0(wei�), 1(rot), 2(gr�n), 3(blau), 4(gelb), 5(magenta), 6(cyan), 7(schwarz)
  - IRGB
    Das "IRGB"-Bildformat verwendet je ein Byte pro Bildpunkt und speichert
    dort direkt den Index auf die Farbpalette ab. Dabei wird unabh�ngig von
    der Bildtiefe immer ein volles Byte verwendet. Das hei�t, da� bei 16
    Farben (Bildtiefe: 4) die obersten 4 Bit immer 0 sind!
    Beispiel: wie oben!
    "->data": 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
    Die Kodierungen und die Farben entsprechen von links nach recht denen
    des obigen Beispiels.

- True-Color
  - IATARI__TC, ITRUEC
    Vom Speicherumfang das gr��te Format. Hier werden pro Bildpunkt drei
    hintereinanderliegende/unmittelbar-aufeinander-folgende Bytes verwendet,
    dabei wird jeder Farbanteil (Rot, Gr�n, Blau) jeweils durch ein Byte
    repr�sentiert. Jeder Farbanteil hat somit einen Wertebereich von 0 bis
    255, was genau dem True Color Format mit 16777216 Farben entspricht.
    Die Reihenfolge der Farbanteile ist: Rot, Gr�n, Blau!
    Im Fall eines "IATARI__TC"-Bildes sind die Daten auf 16 PIXEL ausge-
    richtet. ACHTUNG: PIXEL = 3 Byte!


IMAGEOPTIONS-Struktur (zur Vorbereitung der automatischen Konvertierung)
������������������������������������������������������������������������
Die "ImageOptions"-Struktur wird ausschlie�lich von dem externen
Konvertierungsmodul "GEMVIEW.GVC" verwendet.

typedef struct {
  unsigned      tocolors      :16; /* # der Farben, Wertebereich [4 .. 256] */
  unsigned      process       : 4; /* Typ des Bearbeitungsalgorithmus:
                                      PROC_ORDER    0: Order-Dither Verfahren
                                      PROC_NEAR     1: Benachtbarte Farbe
                                      PROC_FLOYD    2: --"-- mit Fehlerfort.
                                      PROC_JJN      3: --"-- mit Fehlerfort.
                                      PROC_STUCKI   4: --"-- mit Fehlerfort.*/
  unsigned      colormap      : 4; /* Typ der Farbpaletten-Berechnung:
                                      CMAP_FIX      0: Feste  Farbpalette
                                      CMAP_USERDEF1 1: Aus oberstem Fenster
                                      CMAP_USERDEF2 2: Standardpalette
                                      CMAP_OCTREEA  3: OcTree/Appromimativ
                                      CMAP_OCTREE   4: OcTree/Alle Punkte
                                      CMAP_STATA    5: Varianz/Appromimativ
                                      CMAP_STAT     6: Varianz/Alle Punkte  */
  unsigned      spec_active   : 1; /* aktiviert die eingestellten Werte     */
  unsigned      spec_always   : 1; /* immer durchf�hren (also if no need)   */
  unsigned      spec_grey     : 1; /* Dithering auf Grauwert-Palette        */
  unsigned      spec_noise    : 1; /* Verwende "noise reduction"-Filter     */
  unsigned      spec_compress : 1; /* Verdichte Palatte auf benutzte Farben */
  unsigned      unused        : 3; /* (reserviert) f�r k�nftige Erweiterung */
} ColorDither;


typedef struct _ios{
  char         *name;         /* Pfadname des zu ladenden Bildes            */
  int           merged;       /* mit dem vorherigen Bild verschmelzen ?(0/1)*/
  int           atx, aty;     /* Pos. an der das Bild einzuf�gen ist (merge)*/
  unsigned int  bright;       /* Aufhellugsfaktor in Prozent, 100=0 default */
  unsigned int  clipx, clipy; /* Obere linke Ecke des zu verwendenden Bildes*/
  unsigned int  clipw, cliph; /* Ausdehnung des Zielbildes (Breite/H�he)    */
  unsigned int  last_clipx;   /* (interne Verwendung) wird auf 0 gesetzt    */
  unsigned int  last_clipy;   /* (interne Verwendung) wird auf 0 gesetzt    */
  unsigned int  last_clipw;   /* (interne Verwendung) wird auf 0 gesetzt    */
  unsigned int  last_cliph;   /* (interne Verwendung) wird auf 0 gesetzt    */
  unsigned int  dither;       /* Verfahren f�rs s/w-Dither:
                                "Ausgeschltet" 0: Keine s/w Reduzierung
                                 FS_Dither     1: "Floyd-Steinberg"-Verfahren
                                 JJN_Dither    2: "Jarvis-Judice-Ninke" Algo
                                 Stk_Dither    3: "Stucki"-Ditherverfahren
                                 Halftone      4: Halbton mit 4x4-Raster
                                 Ordereddither 5: Order-Dither (nachladbar) */
  unsigned int  colors;       /* # Farben, f�rs Zielbild (Farbvermelzung!)  */
  int           rotate;	      /* # Grad zu rotieren, mu� Mehrfaches von 90  */
  int           xzoom, yzoom; /* Vergr��erungsfaktor in Promille (1 zu 1000)
                                 Positiv: Relativer Faktor in Promille
                                 Negativ: Absolute Gr��e des Zielbildes     */
  int           align;        /* (intern) f�r dem ATARI immer auf 16 gesetzt*/
  int           save;         /* Speichere das Bild als:
                                 1: Monochromes Bild; dither Bild wenn n�tig
                                 2: Farbbild; Farbquantisierung falls n�tig
                                 3: True-Color-Bild                         */
  char         *savename;     /* Pfadname des Zielbildes; Name zum speichern*/
  int           autoname;     /* (interne Verwendung) auf 0 gesetzt         */
  unsigned int  full,         /* F�lle Bild durch Vergr��ern/Weiterholung   */
                                 FULL_NO       0: Normal/Default
                                 FULL_ZOOM     1: F�llen durch Vergr��ern
                                 FULL_REPEAT   2: F�llen durch Weiterholung */
                fullw, fullh; /* Ausdehnung (Breite/H�he) des "Full"-Bildes */
  ColorDither   colordither;  /* siehe Beschreibung der Struktur oben       */
  Scaling       scalered;     /* siehe Beschreibung in IMAGE.H              */
  Scaling       scalegreen;
  Scaling       scaleblue;
  Scaling       scaleadjust;
  int           load_hexdump; /* Lade Datei immer als Text/Hexdump          */
  struct _ios  *prev, *next;  /* doppelt verkettete Liste diese Struktur    */
  char          tc_saver   [14]; /* Modulname ohne Pfad zum speichern (TC)  */
  char          color_saver[14]; /* Modulname ohne Pfad zum speichern (col.)*/
  char          mono_saver [14]; /* Modulname ohne Pfad zum speichern (mono)*/
} ImageOptions;


LOAD-Struktur (f�r die externen Lade-Module von GEM-View3 *.GVL)
����������������������������������������������������������������
Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
Sie beim Aufruf der Funktionen bitte den Parameter�bergabemechanismus von
Turbo C / Pure C.

typedef struct LOAD_Structure {
  long     identify;          /* GVWL_module  == 'GVWL' */
  int      version;           /* GVWL_Version == 0x0100 */
  char    *in_filename;       /* Pfadname der Datei, die geladen werden soll*/
  int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Aufl�sung*/
  int      identify_only;     /* Gesetzt: Nur Identifizieren/Mitteilung     */
  int      user_identified;   /* Gel�scht: Automatischer Aufruf von GEM-View
                                 Gesetzt : Vom Benutzer ausgew�hltes Format */
  struct {
    ZFILE *(*open)            (char *name, int attrib);
                              /* �ffnet virtuell die angegebene Datei, der
                                 Wert von "attrib" ist auf 0 zu setzen.
                                 Die R�ckgabe ist ein Zeiger auf eine interne
                                 Struktur, die mit FILE* vergleichbar ist.
                                 Hinter dieser und den folgenden Funktionen
                                 verbirgt sich eine effektive Pufferverwal-
                                 tung. Nur beim ersten Aufruf wird die Datei
                                 physikalisch ge�ffnet. Ein weiterer Aufruf
                                 setzt nur einige Marke zur�ck, wenn beim
                                 Lesen die Puffergrenze (Default: 8kB, in
                                 GEMVIEW.INF �nderbar) nicht �berschritten
                                 wird. Verwendet werden GEMDOS-Funktionen   */
    ulong  (*read)            (ZFILE *zf, void *buf, ulong len);
                              /* Lie�t aus der ge�ffneten Datei, die durch
                                 "zf" identifiziert wird, "len" viele Bytes
                                 in den Buffer "buf". Die Funktion liefert
                                 als Ergebnis die Zahl der gelesenen Zeichen*/
    int    (*getchr)          (ZFILE *zf);
                              /* Lie�t ein Byte aus und gibt es als Wert
                                 zur�ck. Im Fehlerfall wird "errno" auf
                                 -1 gesetzt und EOF zur�ckgegeben.          */
    char  *(*gets)            (void *buf, ulong len, ZFILE *zf);
                              /* Lie�t eine String bis zum ersten Auftreten
                                 von '\n', dem Dateiende ein oder wenn "le"
                                 viele Zeichen eingelesen wurde. R�ckgabewert
                                 ist ein Zeiger auf den Buffer oder NULL,
                                 wenn kein Zeichen eingelesen wurde.        */
    ulong  (*skip)            (ZFILE *zf, ulong len);
                              /* �berspringt "len" viele Bytes. Die Funktion
                                 liefert die neue Dateiposition als Ergebnis*/
    ulong  (*seek)            (ZFILE *zf, int seekmode, ulong offset);
                              /* Postitioniert die Schreibmarke neu. Mit
                                 SEEK_SET (0) wird auf die absolute Position
                                 "offset" positioniert. Bei SEEK_CUR (1) wird
                                 die Position um "offset" Byte weitergesetzt.
                                 SEEK_END (2) positioniert relativ vom Datei-
                                 ende in Richtung Anfang der Datei.
                                 Die Funktion liefert die neue Dateiposition
                                 als Ergebnis                               */
    ulong  (*tell)            (ZFILE *zf);
                              /* Liefert als Wert die L�nge der Datei.      */
    int    (*eof)             (ZFILE *zf);
                              /* Pr�ft die aktuelle Dateiposition darauf hin
                                 ob das Dateiende �berschritten wurde. Wert
                                 0 zeigt einen Aufruffehler an. 1 wei�t auf
                                 Dateiende hin. Ansonsten wird -1 geliefert.*/
    void   (*close)           (ZFILE *zf);
                              /* Schlie�t die Datei virtuell. Die Datei wird
                                 automatisch physikalisch geschlossen, wenn
                                 eine Datei als Bild identifiziert und ge-
                                 laden oder die Aktion abgebrochen wurde.   */
  } input;
  struct {
    int    (*printout)        (const char* format, ...);
                              /* Schreibt eine Meldung in das Protokollfenster
                                 von GEM-View. Die Aufrufstruktur und die
                                 Parameter entsprechen "printf()" aus der
                                 C-Standard-Library.
                                 Folgende Sonderzeichen wurden verarbeitet:
                                 "\001" : Positioniere eine Zeile nach oben
                                 "\002" : Positioniere eine Spalte nach links
                                 "\033E": L�sche Protokollfenster (CLR-HOME)
                                 "\034\001": Schalte auf Fett-Schrift
                                 "\034\010": Schalte Unterstreichung ein
                                 "\034\011": Fett und Unterstreichung ein
                                 "\034\100": Auf Normalschrift schalten     */
  } print;
  struct {
    void   (*printerr)        (const char* format, ...);
                              /* Wie "printout" (siehe oben). Zus�tzlich:
                                 - Der Text wird "Fett" ausgegeben.
                                 - Ist das Protokollfenster geschlossen, wird
                                   eine Alert-Box ge�ffnet.
                                 - Ist das Protokollfenster auf "klein" ge-
                                   schaltet, so wird das Fenster auf "gro�"
                                   geschaltet und in den Vordergrund gebracht
                                 - Ist das Protokollfenster auf "gro�" ge-
                                   schaltet, so wird das Fenster in den
                                   Vordergrund gebracht                     */
    void   (*userexit)        (void);
                              /* Wenn in einem Modul ein fatalen Fehler auf-
                                 tritt, kann die das Modul sofort verlassen
                                 werden. Aller angeforderter Speicher wird
                                 zur�ckgegeben. Allerdings sind vorher alle
                                 VDI-Worstations zu schlie�en und alle
                                 wind_updates() abzuschie�en ...
                                 Sollte nur im schlimmsten Fall (und nur
                                 dann) verwendet werden.                    */
  } error;
  struct {
    byte  *(*malloc)          (ulong size);
                              /* Reserviert "size" Bytes dynamischen Speicher.
                                 Die Funktion verwaltet selbstt�tig kleine
                                 Speicherbl�cke in gr��eren "Clustern", um
                                 die Speicherfragmentierunggefahr etwas zu
                                 veringern. Verwenden Sie nur diese Funktion
                                 um Speicher dynamisch anzufordern.         */
    void   (*free)            (void *area);
                              /* Gibt den reservierten Speicher wieder frei.*/
  } memory;
  struct {
    Image *(*newBitImage)     (char *title, unsigned int width, unsigned int height);
                              /* Erzeugt und initialisiert eine "Image"-
                                 Struktur, wobei der Pfadname oder NULL �ber
                                 den Parameter "title" �bergeben werden kann.
                                 F�r den Datenbreich wird eine Bitplane mit
                                 alignwidth (auf 16 begradigtes "width") mal
                                 "height" reserviert.
                                 In "image->width" wird "width" eingetragen.
                                 Achten Sie in jedem Fall darauf "image->
                                 alignTo8" zu setzen.                       */
    Image *(*newRGBImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
                              /* Erzeugt und initialisiert eine "Image"-
                                 Struktur, wobei der Pfadname oder NULL �ber
                                 den Parameter "title" �bergeben werden kann.
                                 F�r den Datenbreich wird eine ein Speicher
                                 mit alignwidth (auf 16 begradigtes "width")
                                 mal "height" Bytes reserviert. "depth" ist
                                 die Zahl der Bitebenen des Bildes f�r die
                                 Brechnung der Gr��e der Farbpalette.
                                 In "image->width" wird "width" eingetragen.
                                 Achten Sie in jedem Fall darauf eventuell
                                 "image->alignTo8" zu setzen.               */
    Image *(*newTCImage)      (char *title, unsigned int width, unsigned int height);
                              /* Erzeugt und initialisiert eine "Image"-
                                 Struktur, wobei der Pfadname oder NULL �ber
                                 den Parameter "title" �bergeben werden kann.
                                 F�r den Datenbreich wird eine ein Speicher
                                 mit alignwidth (auf 16 begradigtes "width")
                                 mal "height" Tripel (RBG=3 Byte) reserviert.
                                 In "image->width" wird "width" eingetragen.
                                 Achten Sie in jedem Fall darauf eventuell
                                 "image->alignTo8" zu setzen.               */
    Image *(*newGEMImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
                              /* Erzeugt und initialisiert eine "Image"-
                                 Struktur, wobei der Pfadname oder NULL �ber
                                 den Parameter "title" �bergeben werden kann.
                                 F�r den Datenbreich werden "depth" Bitplanes
                                 mit alignwidth (auf 16 begradigtes "width")
                                 mal "height" reserviert. Zur Aufnahme des
                                 GEM-Standard-Formats. Das Bild ist IMMER
                                 auf Worte begradigt zu Laden!              */
    void   (*freeGVImage)     (Image *image);
                              /* Gibt die reservierten Strukturen wieder frei,
                                 wenn zum Beispiel des Bild w�hrend des Ladens
                                 als defekt, fehlerhaft oder unvollst�ndig
                                 erkannt wird.                              */
    Image *(*rotate)          (Image *image, int rotate);
                              /* Dreht an Bild um 90, 180 oder 270 Grad, zum
                                 Beispiel f�r Photo-CD-Bilder im Hochformat */
  } images;
  struct {
    void   (*evntHandle)      (int wait);
                              /* L��t GEM-View "wait" Millisekunden Zeit um
                                 eine Nachricht entgegenzunehmen und sie dann
                                 abzuarbeiten. Wird nach "wait" Millisekunden
                                 keine Narchricht empfangen wird die Funktion
                                 wieder verlassen. Sehr praktisch um GEM-View
                                 ein paar Redraws und �hnliches machen zu
                                 lassen.                                    */
    void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Mausereignis, die Parameter
                                 ev_mx, ev_my, keystate, keypress entsprechen
                                 den Werten, die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Tastaturereignis, die Para-
                                 meter keystate, keypress entsprechen den
                                 Werten, die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Mausknopfereignis, die Para-
                                 meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
                                 keystate, keypress entsprechen den Werten,
                                 die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Messageereignis, die Para-
                                 meter msg, ev_mx, ev_my, keystate, keypress
                                 entsprechen den Werten, die evnt_multi()
                                 liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
                              /* Verarbeitet ein Zeitereignis, die Parameter
                                 ev_mx, ev_my, keystate, keypress, ev_mbutton
                                 entsprechen den Werten die evnt_multi()
                                 liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
                              */
    int    (*alert)           (int button, const char *astring);
                              /* Die Funktion entspricht exakt form_alert().*/
  } events;
  struct {
    void   (*reset_dialogCol) (int flag);
                              /* Setzt die Desktopfarben (0 bis 15) wieder
                                 auf den urspr�nglichen Wert zur�ck, nachdem
                                 die Bildfarben gesichert wurden (flag = 1).
                                 Restauriert die Bildfarben wieder, wenn
                                 "flag" auf 0 gesetzt ist.
                                 Die Funktion erlaubt einen verschachtelten
                                 Aufruf und sollte vor und nach jedem Dialog
                                 aufgerufen werden. Beachten Sie auch die
                                 Richtlinie von ATARI "Abschlie�ende Worte" */
    void   (*send_windOpen)   (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View an, damit es bei
                                 der "Cycle Window"-Behandlung mitbehandelt
                                 wird.
                                 Das Fenster ist selbst zu �ffnen.          */
    void   (*send_windClosed) (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View ab, damit es bei
                                 der "Cycle Window"-Behandlung nun nicht
                                 mehr mitarbeitet wird.
                                 Das Fenster ist selbst zu �ffnen.          */
    void   (*send_windTop)    (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View als "getopped",
                                 damit die "Cycle Window"-Behandlung an-
                                 gepa�t werden kann.                        */
    void   (*send_windBottom) (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View als "in-den-Hinter-
                                 grund-gebracht", damit die "Cycle Window"-
                                 Behandlung angepa�t werden kann.           */
  } diawin;
  struct {
    int    applicationID;     /* Enth�lt die appl_id von appl_init()        */
    int    gemview_vers;      /* Enth�lt die GEM-View Version 0x0300 (3.00) */
    int    tos_version;       /* Enth�lt die TOS Versionsnummer z.B. 0x0404 */
    int    aes_version;       /* Enth�lt die AES Versionsnummer z.B. 0x0340 */
    int    multi_task;        /* Enth�lt den Wert aus GemParBlk.global[1]   */
  } versions;
  struct {
    unsigned IMG_fastload      :  1;
    unsigned IMG_vdicolororder :  1;
    unsigned IMG_TCalign16     :  1;
    unsigned PCD_loadBase      :  3;
    unsigned DSP_usingit       :  1;
    unsigned DSP_greyscale     :  1;
    unsigned UNUSED            :  8;
    unsigned FUTUREUSED        : 16;
    long     RESERVED;
  } flags;
} LOAD_Structure;


SAVE-Struktur (f�r die externen Speicher-Module von GEM-View3 *.GVS)
��������������������������������������������������������������������
Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
Sie beim Aufruf der Funktionen bitte den Parameter�bergabemechanismus von
Turbo C / Pure C.

typedef struct SAVE_Structure {
  long     identify;          /* GVWS_module  == 'GVWS' */
  int      version;           /* GVWS_Version == 0x0100 */
  Image   *image;             /* Zeiger auf "Image", das zu speichern ist.  */
  int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Aufl�sung*/
  char    *out_filename;      /* Dateiname, in der das Bild gespeichert wird*/
  struct {
    int    (*open)            (char *file);
                              /* �ffnet die angegebene Datei, eine eventuell
                                 vorhandene Datei wird �berschrieben. R�ck-
                                 gabewert ist ein positives Dateihandle.
                                 Im Fehlerfall wird ein negativer Wert
                                 zur�ckgegeben                              */
    ulong  (*write)           (int handle, ulong count, void *buf);
                              /* Schreibt "count" Bytes aus dem Buffer "buf"
                                 in die entsprechende Datei. Ein Puffer von
                                 8 Kilobyte ist zwischengeschaltet.
                                 Die Funktion liefert als Ergebnis die Anzahl
                                 der gespeicherten Bytes zur�ck oder 0 im
                                 Fehlerfall                                 */
    int    (*close)           (int handle);
                              /* Speichert gegebenenfalls den "internen"
                                 Puffer ab und schlie�t die Datei.
                                 Die Funktion liefert als Ergebnis eine 0,
                                 wenn die Datei geschlossen werden konnte,
                                 ansonsten eine negative Zahl.              */
    int    (*delete)          (const char *fname);
                              /* L�scht die die mit fname bezeichnete Datei.
                                 Die Funktion liefert als Ergebnis eine 0,
                                 wenn die Datei gel�scht werden konnte, und
                                 ein von 0 verschiedenes Ergebnis, wenn die
                                 Datei nicht gel�scht werden konnte.        */
  } output;
  struct {
    int    (*printout)        (const char* format, ...);
                              /* Schreibt eine Meldung in das Protokollfenster
                                 von GEM-View. Die Aufrufstruktur und die
                                 Parameter entsprechen "printf()" aus der
                                 C-Standard-Library.
                                 Folgende Sonderzeichen wurden verarbeitet:
                                 "\001" : Positioniere eine Zeile nach oben
                                 "\002" : Positioniere eine Spalte nach links
                                 "\033E": L�sche Protokollfenster (CLR-HOME)
                                 "\034\001": Schalte auf Fett-Schrift
                                 "\034\010": Schalte Unterstreichung ein
                                 "\034\011": Fett und Unterstreichung ein
                                 "\034\100": Auf Normalschrift schalten     */
  } print;
  struct {
    void   (*printerr)        (const char* format, ...);
                              /* Wie "printout" (siehe oben). Zus�tzlich:
                                 - Der Text wird "Fett" ausgegeben.
                                 - Ist das Protokollfenster geschlossen, wird
                                   eine Alert-Box ge�ffnet.
                                 - Ist das Protokollfenster auf "klein" ge-
                                   schaltet, so wird das Fenster auf "gro�"
                                   geschaltet und in den Vordergrund gebracht
                                 - Ist das Protokollfenster auf "gro�" ge-
                                   schaltet, so wird das Fenster in den
                                   Vordergrund gebracht                     */
    void   (*userexit)        (void);
                              /* Wenn in einem Modul ein fatalen Fehler auf-
                                 tritt, kann die das Modul sofort verlassen
                                 werden. Aller angeforderter Speicher wird
                                 zur�ckgegeben. Allerdings sind vorher alle
                                 VDI-Worstations zu schlie�en und alle
                                 wind_updates() abzuschie�en ...
                                 Sollte nur im schlimmsten Fall (und nur
                                 dann) verwendet werden.                    */
  } error;
  struct {
    byte  *(*malloc)          (ulong size);
                              /* Reserviert "size" Bytes dynamischen Speicher.
                                 Die Funktion verwaltet selbstt�tig kleine
                                 Speicherbl�cke in gr��eren "Clustern", um
                                 die Speicherfragmentierunggefahr etwas zu
                                 veringern. Verwenden Sie nur diese Funktion
                                 um Speicher dynamisch anzufordern.         */
    void   (*free)            (void *area);
                              /* Gibt den reservierten Speicher wieder frei.*/
  } memory;
  struct {
    void   (*evntHandle)      (int wait);
                              /* L��t GEM-View "wait" Millisekunden Zeit um
                                 eine Nachricht entgegenzunehmen und sie dann
                                 abzuarbeiten. Wird nach "wait" Millisekunden
                                 keine Narchricht empfangen wird die Funktion
                                 wieder verlassen. Sehr praktisch um GEM-View
                                 ein paar Redraws und �hnliches machen zu
                                 lassen.                                    */
    void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Mausereignis, die Parameter
                                 ev_mx, ev_my, keystate, keypress entsprechen
                                 den Werten, die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Tastaturereignis, die Para-
                                 meter keystate, keypress entsprechen den
                                 Werten, die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Mausknopfereignis, die Para-
                                 meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
                                 keystate, keypress entsprechen den Werten,
                                 die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Messageereignis, die Para-
                                 meter msg, ev_mx, ev_my, keystate, keypress
                                 entsprechen den Werten, die evnt_multi()
                                 liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
                              /* Verarbeitet ein Zeitereignis, die Parameter
                                 ev_mx, ev_my, keystate, keypress, ev_mbutton
                                 entsprechen den Werten die evnt_multi()
                                 liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
                              */
    int    (*alert)           (int button, const char *astring);
                              /* Die Funktion entspricht exakt form_alert().*/
  } events;
  struct {
    void   (*reset_dialogCol) (int flag);
                              /* Setzt die Desktopfarben (0 bis 15) wieder
                                 auf den urspr�nglichen Wert zur�ck, nachdem
                                 die Bildfarben gesichert wurden (flag = 1).
                                 Restauriert die Bildfarben wieder, wenn
                                 "flag" auf 0 gesetzt ist.
                                 Die Funktion erlaubt einen verschachtelten
                                 Aufruf und sollte vor und nach jedem Dialog
                                 aufgerufen werden. Beachten Sie auch die
                                 Richtlinie von ATARI "Abschlie�ende Worte" */
    void   (*send_windOpen)   (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View an, damit es bei
                                 der "Cycle Window"-Behandlung mitbehandelt
                                 wird.
                                 Das Fenster ist selbst zu �ffnen.          */
    void   (*send_windClosed) (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View ab, damit es bei
                                 der "Cycle Window"-Behandlung nun nicht
                                 mehr mitarbeitet wird.
                                 Das Fenster ist selbst zu �ffnen.          */
    void   (*send_windTop)    (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View als "getopped",
                                 damit die "Cycle Window"-Behandlung an-
                                 gepa�t werden kann.                        */
    void   (*send_windBottom) (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View als "in-den-Hinter-
                                 grund-gebracht", damit die "Cycle Window"-
                                 Behandlung angepa�t werden kann.           */
  } diawin;
  struct {
    int    applicationID;     /* Enth�lt die appl_id von appl_init()        */
    int    gemview_vers;      /* Enth�lt die GEM-View Version 0x0300 (3.00) */
    int    tos_version;       /* Enth�lt die TOS Versionsnummer z.B. 0x0404 */
    int    aes_version;       /* Enth�lt die AES Versionsnummer z.B. 0x0340 */
    int    multi_task;        /* Enth�lt den Wert aus GemParBlk.global[1]   */
  } versions;
} SAVE_Structure;


PRINT-Struktur (f�r die externen Druck-Module von GEM-View3 *.GVP)
������������������������������������������������������������������
Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
Sie beim Aufruf der Funktionen bitte den Parameter�bergabemechanismus von
Turbo C / Pure C.

typedef struct PRINT_Structure {
  long     identify;          /* GVWP_module  == 'GVWP' */
  int      version;           /* GVWP_Version == 0x0100 */
  Image   *image;             /* Zeiger auf "Image", das zu bearbeiten ist. */
  int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Aufl�sung*/
  struct {
    int    (*open)            (char *file);
                              /* �ffnet die angegebene Datei, eine eventuell
                                 vorhandene Datei wird �berschrieben.
                                 F�r die paralelle Schnittstelle ist "PRN:"
                                 und f�r die serielle Schnittstelle ist "AUX:"
                                 zuverwenden.
                                 R�ckgabewert ist ein positives Dateihandle.
                                 Im Fehlerfall wird ein negativer Wert
                                 zur�ckgegeben                              */
    ulong  (*write)           (int handle, ulong count, void *buf);
                              /* Schreibt "count" Bytes aus dem Buffer "buf"
                                 in die entsprechende Datei oder schickt die
                                 Daten zum Drucker. Ein Puffer von 8 Kilobyte
                                 ist zwischengeschaltet.
                                 Die Funktion liefert als Ergebnis die Anzahl
                                 der gespeicherten Bytes zur�ck oder 0 im
                                 Fehlerfall                                 */
    int    (*status)          (int handle);
                              /* Die Funktion �berpr�ft, ob die Drucker-
                                 schnittstelle bereit ist, Zeichen anzunehmen.
                                 Die Funktion liefert als Ergebnis den
                                 Drucker-Status.
                                 Wenn der Drucker bereit ist, wird ein Wert
                                 ungleich 0 zur�ckgegeben, ansonsten eine 0.*/
    int    (*close)           (int handle);
                              /* Speichert bzw. druckt gegebenenfalls den
                                 Puffer ab und schlie�t die "Datei".
                                 Die Funktion liefert als Ergebnis eine 0,
                                 wenn die Datei geschlossen werden konnte,
                                 ansonsten eine negative Zahl.              */
  } output;
  struct {
    int    (*printout)        (const char* format, ...);
                              /* Schreibt eine Meldung in das Protokollfenster
                                 von GEM-View. Die Aufrufstruktur und die
                                 Parameter entsprechen "printf()" aus der
                                 C-Standard-Library.
                                 Folgende Sonderzeichen wurden verarbeitet:
                                 "\001" : Positioniere eine Zeile nach oben
                                 "\002" : Positioniere eine Spalte nach links
                                 "\033E": L�sche Protokollfenster (CLR-HOME)
                                 "\034\001": Schalte auf Fett-Schrift
                                 "\034\010": Schalte Unterstreichung ein
                                 "\034\011": Fett und Unterstreichung ein
                                 "\034\100": Auf Normalschrift schalten     */
  } print;
  struct {
    void   (*printerr)        (const char* format, ...);
                              /* Wie "printout" (siehe oben). Zus�tzlich:
                                 - Der Text wird "Fett" ausgegeben.
                                 - Ist das Protokollfenster geschlossen, wird
                                   eine Alert-Box ge�ffnet.
                                 - Ist das Protokollfenster auf "klein" ge-
                                   schaltet, so wird das Fenster auf "gro�"
                                   geschaltet und in den Vordergrund gebracht
                                 - Ist das Protokollfenster auf "gro�" ge-
                                   schaltet, so wird das Fenster in den
                                   Vordergrund gebracht                     */
    void   (*userexit)        (void);
                              /* Wenn in einem Modul ein fatalen Fehler auf-
                                 tritt, kann die das Modul sofort verlassen
                                 werden. Aller angeforderter Speicher wird
                                 zur�ckgegeben. Allerdings sind vorher alle
                                 VDI-Worstations zu schlie�en und alle
                                 wind_updates() abzuschie�en ...
                                 Sollte nur im schlimmsten Fall (und nur
                                 dann) verwendet werden.                    */
  } error;
  struct {
    byte  *(*malloc)          (ulong size);
                              /* Reserviert "size" Bytes dynamischen Speicher.
                                 Die Funktion verwaltet selbstt�tig kleine
                                 Speicherbl�cke in gr��eren "Clustern", um
                                 die Speicherfragmentierunggefahr etwas zu
                                 veringern. Verwenden Sie nur diese Funktion
                                 um Speicher dynamisch anzufordern.         */
    void   (*free)            (void *area);
                              /* Gibt den reservierten Speicher wieder frei.*/
  } memory;
  struct {
    void   (*evntHandle)      (int wait);
                              /* L��t GEM-View "wait" Millisekunden Zeit um
                                 eine Nachricht entgegenzunehmen und sie dann
                                 abzuarbeiten. Wird nach "wait" Millisekunden
                                 keine Narchricht empfangen wird die Funktion
                                 wieder verlassen. Sehr praktisch um GEM-View
                                 ein paar Redraws und �hnliches machen zu
                                 lassen.                                    */
    void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Mausereignis, die Parameter
                                 ev_mx, ev_my, keystate, keypress entsprechen
                                 den Werten, die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Tastaturereignis, die Para-
                                 meter keystate, keypress entsprechen den
                                 Werten, die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Mausknopfereignis, die Para-
                                 meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
                                 keystate, keypress entsprechen den Werten,
                                 die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Messageereignis, die Para-
                                 meter msg, ev_mx, ev_my, keystate, keypress
                                 entsprechen den Werten, die evnt_multi()
                                 liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
                              /* Verarbeitet ein Zeitereignis, die Parameter
                                 ev_mx, ev_my, keystate, keypress, ev_mbutton
                                 entsprechen den Werten die evnt_multi()
                                 liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
                              */
    int    (*alert)           (int button, const char *astring);
                              /* Die Funktion entspricht exakt form_alert().*/
  } events;
  struct {
    void   (*reset_dialogCol) (int flag);
                              /* Setzt die Desktopfarben (0 bis 15) wieder
                                 auf den urspr�nglichen Wert zur�ck, nachdem
                                 die Bildfarben gesichert wurden (flag = 1).
                                 Restauriert die Bildfarben wieder, wenn
                                 "flag" auf 0 gesetzt ist.
                                 Die Funktion erlaubt einen verschachtelten
                                 Aufruf und sollte vor und nach jedem Dialog
                                 aufgerufen werden. Beachten Sie auch die
                                 Richtlinie von ATARI "Abschlie�ende Worte" */
    void   (*send_windOpen)   (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View an, damit es bei
                                 der "Cycle Window"-Behandlung mitbehandelt
                                 wird.
                                 Das Fenster ist selbst zu �ffnen.          */
    void   (*send_windClosed) (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View ab, damit es bei
                                 der "Cycle Window"-Behandlung nun nicht
                                 mehr mitarbeitet wird.
                                 Das Fenster ist selbst zu �ffnen.          */
    void   (*send_windTop)    (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View als "getopped",
                                 damit die "Cycle Window"-Behandlung an-
                                 gepa�t werden kann.                        */
    void   (*send_windBottom) (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View als "in-den-Hinter-
                                 grund-gebracht", damit die "Cycle Window"-
                                 Behandlung angepa�t werden kann.           */
  } diawin;
  struct {
    int    applicationID;     /* Enth�lt die appl_id von appl_init()        */
    int    gemview_vers;      /* Enth�lt die GEM-View Version 0x0300 (3.00) */
    int    tos_version;       /* Enth�lt die TOS Versionsnummer z.B. 0x0404 */
    int    aes_version;       /* Enth�lt die AES Versionsnummer z.B. 0x0340 */
    int    multi_task;        /* Enth�lt den Wert aus GemParBlk.global[1]   */
  } versions;
} PRINT_Structure;


PROC-Struktur (f�r die externen Bearbeitungs-Module von GEM-View3 *.GVR)
������������������������������������������������������������������������
Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
Sie beim Aufruf der Funktionen bitte den Parameter�bergabemechanismus von
Turbo C / Pure C.

typedef struct PROC_Structure {
  long     identify;          /* GVWR_module  == 'GVWR' */
  int      version;           /* GVWR_Version == 0x0100 */
  Image   *image;             /* Zeiger auf "Image",das gedruckt werden soll*/
  int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Aufl�sung*/
  struct {
    int    (*printout)        (const char* format, ...);
                              /* Schreibt eine Meldung in das Protokollfenster
                                 von GEM-View. Die Aufrufstruktur und die
                                 Parameter entsprechen "printf()" aus der
                                 C-Standard-Library.
                                 Folgende Sonderzeichen wurden verarbeitet:
                                 "\001" : Positioniere eine Zeile nach oben
                                 "\002" : Positioniere eine Spalte nach links
                                 "\033E": L�sche Protokollfenster (CLR-HOME)
                                 "\034\001": Schalte auf Fett-Schrift
                                 "\034\010": Schalte Unterstreichung ein
                                 "\034\011": Fett und Unterstreichung ein
                                 "\034\100": Auf Normalschrift schalten     */
  } print;
  struct {
    void   (*printerr)        (const char* format, ...);
                              /* Wie "printout" (siehe oben). Zus�tzlich:
                                 - Der Text wird "Fett" ausgegeben.
                                 - Ist das Protokollfenster geschlossen, wird
                                   eine Alert-Box ge�ffnet.
                                 - Ist das Protokollfenster auf "klein" ge-
                                   schaltet, so wird das Fenster auf "gro�"
                                   geschaltet und in den Vordergrund gebracht
                                 - Ist das Protokollfenster auf "gro�" ge-
                                   schaltet, so wird das Fenster in den
                                   Vordergrund gebracht                     */
    void   (*userexit)        (void);
                              /* Wenn in einem Modul ein fatalen Fehler auf-
                                 tritt, kann die das Modul sofort verlassen
                                 werden. Aller angeforderter Speicher wird
                                 zur�ckgegeben. Allerdings sind vorher alle
                                 VDI-Worstations zu schlie�en und alle
                                 wind_updates() abzuschie�en ...
                                 Sollte nur im schlimmsten Fall (und nur
                                 dann) verwendet werden.                    */
  } error;
  struct {
    byte  *(*malloc)          (ulong size);
                              /* Reserviert "size" Bytes dynamischen Speicher.
                                 Die Funktion verwaltet selbstt�tig kleine
                                 Speicherbl�cke in gr��eren "Clustern", um
                                 die Speicherfragmentierunggefahr etwas zu
                                 veringern. Verwenden Sie nur diese Funktion
                                 um Speicher dynamisch anzufordern.         */
    void   (*free)            (void *area);
                              /* Gibt den reservierten Speicher wieder frei.*/
  } memory;
  struct {
    Image *(*newBitImage)     (char *title, unsigned int width, unsigned int height);
                              /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
                                 Erzeugt und initialisiert eine "Image"-
                                 Struktur, wobei der Pfadname oder NULL �ber
                                 den Parameter "title" �bergeben werden kann.
                                 F�r den Datenbreich wird eine Bitplane mit
                                 alignwidth (auf 16 begradigtes "width") mal
                                 "height" reserviert.
                                 In "image->unalignwidth" wird "width" ein-
                                 getragen. "alignwidth" wird in "->width"
                                 eingetragen.
                                 Das Bild ist IMMER auf Worte begradigt auf-
                                 gebaut und ist auch so wieder aufzubauen.  */
    Image *(*newRGBImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
                              /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
                                 Erzeugt und initialisiert eine "Image"-
                                 Struktur, wobei der Pfadname oder NULL �ber
                                 den Parameter "title" �bergeben werden kann.
                                 F�r den Datenbreich werden "depth" Bitplanes
                                 mit alignwidth (auf 16 begradigtes "width")
                                 mal "height" reserviert. Zur Aufnahme des
                                 GEM-Standard-Formats.
                                 In "image->unalignwidth" wird "width" ein-
                                 getragen. "alignwidth" wird in "->width"
                                 eingetragen.
                                 Das Bild ist IMMER auf Worte begradigt auf-
                                 gebaut und ist auch so wieder aufzubauen.  */
    Image *(*newTCImage)      (char *title, unsigned int width, unsigned int height);
                              /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
                                 Erzeugt und initialisiert eine "Image"-
                                 Struktur, wobei der Pfadname oder NULL �ber
                                 den Parameter "title" �bergeben werden kann.
                                 F�r den Datenbreich werden alignwidth (auf
                                 16 begradigtes "width") mal "height" viele
                                 RGB-Tripel reserviert.
                                 In "image->unalignwidth" wird "width" ein-
                                 getragen. "alignwidth" wird in "->width"
                                 eingetragen.
                                 Das Bild ist IMMER auf Worte begradigt auf-
                                 gebaut und ist auch so wieder aufzubauen.  */
    Image *(*newGEMImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
                              /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
                                 Erzeugt und initialisiert eine "Image"-
                                 Struktur, wobei der Pfadname oder NULL �ber
                                 den Parameter "title" �bergeben werden kann.
                                 F�r den Datenbreich werden "depth" Bitplanes
                                 mit alignwidth (auf 16 begradigtes "width")
                                 mal "height" reserviert. Zur Aufnahme des
                                 GEM-Standard-Formats.
                                 In "image->unalignwidth" wird "width" ein-
                                 getragen. "alignwidth" wird in "->width"
                                 eingetragen.
                                 Das Bild ist IMMER auf Worte begradigt auf-
                                 gebaut und ist auch so wieder aufzubauen.  */
    void   (*freeGVImage)     (Image *image);
                              /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
                                 Gibt die reservierten Strukturen wieder frei,
                                 wenn zum Beispiel w�hrend der Umwandlung
                                 etwas unvorhergesehenes passiert.
                                 Das Bild, welches dem Bearbeitungsmodul
                                 �bergeben wird von GEM-View aus dem Speicher
                                 entfernt und darf nicht vom Modul gel�scht
                                 werden.                                    */
  } images;
  struct {
    void   (*evntHandle)      (int wait);
                              /* L��t GEM-View "wait" Millisekunden Zeit um
                                 eine Nachricht entgegenzunehmen und sie dann
                                 abzuarbeiten. Wird nach "wait" Millisekunden
                                 keine Narchricht empfangen wird die Funktion
                                 wieder verlassen. Sehr praktisch um GEM-View
                                 ein paar Redraws und �hnliches machen zu
                                 lassen.                                    */
    void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Mausereignis, die Parameter
                                 ev_mx, ev_my, keystate, keypress entsprechen
                                 den Werten, die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Tastaturereignis, die Para-
                                 meter keystate, keypress entsprechen den
                                 Werten, die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Mausknopfereignis, die Para-
                                 meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
                                 keystate, keypress entsprechen den Werten,
                                 die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Messageereignis, die Para-
                                 meter msg, ev_mx, ev_my, keystate, keypress
                                 entsprechen den Werten, die evnt_multi()
                                 liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
                              /* Verarbeitet ein Zeitereignis, die Parameter
                                 ev_mx, ev_my, keystate, keypress, ev_mbutton
                                 entsprechen den Werten die evnt_multi()
                                 liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
                              */
    int    (*alert)           (int button, const char *astring);
                              /* Die Funktion entspricht exakt form_alert().*/
  } events;
  struct {
    void   (*reset_dialogCol) (int flag);
                              /* Setzt die Desktopfarben (0 bis 15) wieder
                                 auf den urspr�nglichen Wert zur�ck, nachdem
                                 die Bildfarben gesichert wurden (flag = 1).
                                 Restauriert die Bildfarben wieder, wenn
                                 "flag" auf 0 gesetzt ist.
                                 Die Funktion erlaubt einen verschachtelten
                                 Aufruf und sollte vor und nach jedem Dialog
                                 aufgerufen werden. Beachten Sie auch die
                                 Richtlinie von ATARI "Abschlie�ende Worte" */
    void   (*send_windOpen)   (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View an, damit es bei
                                 der "Cycle Window"-Behandlung mitbehandelt
                                 wird.
                                 Das Fenster ist selbst zu �ffnen.          */
    void   (*send_windClosed) (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View ab, damit es bei
                                 der "Cycle Window"-Behandlung nun nicht
                                 mehr mitarbeitet wird.
                                 Das Fenster ist selbst zu �ffnen.          */
    void   (*send_windTop)    (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View als "getopped",
                                 damit die "Cycle Window"-Behandlung an-
                                 gepa�t werden kann.                        */
    void   (*send_windBottom) (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View als "in-den-Hinter-
                                 grund-gebracht", damit die "Cycle Window"-
                                 Behandlung angepa�t werden kann.           */
  } diawin;
  struct {
    int    applicationID;     /* Enth�lt die appl_id von appl_init()        */
    int    gemview_vers;      /* Enth�lt die GEM-View Version 0x0300 (3.00) */
    int    tos_version;       /* Enth�lt die TOS Versionsnummer z.B. 0x0404 */
    int    aes_version;       /* Enth�lt die AES Versionsnummer z.B. 0x0340 */
    int    multi_task;        /* Enth�lt den Wert aus GemParBlk.global[1]   */
  } versions;
} PROC_Structure;


CONV-Struktur (f�r das externe Konvertierungs-Module von GEM-View3)
�������������������������������������������������������������������
Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
Sie beim Aufruf der Funktionen bitte den Parameter�bergabemechanismus von
Turbo C / Pure C.

typedef struct CONV_Structure {
  long     identify;          /* GVWC_module  == 'GVWC' */
  int      version;           /* GVWC_Version == 0x0100 */
  int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Aufl�sung*/
  struct {
    byte  *(*malloc)          (ulong size);
                              /* Reserviert "size" Bytes dynamischen Speicher.
                                 Die Funktion verwaltet selbstt�tig kleine
                                 Speicherbl�cke in gr��eren "Clustern", um
                                 die Speicherfragmentierunggefahr etwas zu
                                 veringern. Verwenden Sie nur diese Funktion
                                 um Speicher dynamisch anzufordern.         */
    void   (*free)            (void *area);
                              /* Gibt den reservierten Speicher wieder frei.*/
  } memory;
  struct {
    void   (*evntHandle)      (int wait);
                              /* L��t GEM-View "wait" Millisekunden Zeit um
                                 eine Nachricht entgegenzunehmen und sie dann
                                 abzuarbeiten. Wird nach "wait" Millisekunden
                                 keine Narchricht empfangen wird die Funktion
                                 wieder verlassen. Sehr praktisch um GEM-View
                                 ein paar Redraws und �hnliches machen zu
                                 lassen.                                    */
    void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Mausereignis, die Parameter
                                 ev_mx, ev_my, keystate, keypress entsprechen
                                 den Werten, die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Tastaturereignis, die Para-
                                 meter keystate, keypress entsprechen den
                                 Werten, die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Mausknopfereignis, die Para-
                                 meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
                                 keystate, keypress entsprechen den Werten,
                                 die evnt_multi() liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
                              /* Verarbeitet ein Messageereignis, die Para-
                                 meter msg, ev_mx, ev_my, keystate, keypress
                                 entsprechen den Werten, die evnt_multi()
                                 liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
    void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
                              /* Verarbeitet ein Zeitereignis, die Parameter
                                 ev_mx, ev_my, keystate, keypress, ev_mbutton
                                 entsprechen den Werten die evnt_multi()
                                 liefert.
                                 gvwInAction ist immer auf TRUE (1) zu setzen
                                 In exit wird ein Wert ungleich 0 zur�ckge-
                                 geben, wenn das Modul seine Arbeit abbrechen
                                 soll. Dieses sollte so schnell wie m�glich
                                 geschehen!                                 */
                              */
    int    (*alert)           (int button, const char *astring);
                              /* Die Funktion entspricht exakt form_alert().*/
  } events;
  struct {
    void   (*reset_dialogCol) (int flag);
                              /* Setzt die Desktopfarben (0 bis 15) wieder
                                 auf den urspr�nglichen Wert zur�ck, nachdem
                                 die Bildfarben gesichert wurden (flag = 1).
                                 Restauriert die Bildfarben wieder, wenn
                                 "flag" auf 0 gesetzt ist.
                                 Die Funktion erlaubt einen verschachtelten
                                 Aufruf und sollte vor und nach jedem Dialog
                                 aufgerufen werden. Beachten Sie auch die
                                 Richtlinie von ATARI "Abschlie�ende Worte" */
    void   (*send_windOpen)   (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View an, damit es bei
                                 der "Cycle Window"-Behandlung mitbehandelt
                                 wird.
                                 Das Fenster ist selbst zu �ffnen.          */
    void   (*send_windClosed) (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View ab, damit es bei
                                 der "Cycle Window"-Behandlung nun nicht
                                 mehr mitarbeitet wird.
                                 Das Fenster ist selbst zu �ffnen.          */
    void   (*send_windTop)    (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View als "getopped",
                                 damit die "Cycle Window"-Behandlung an-
                                 gepa�t werden kann.                        */
    void   (*send_windBottom) (int wind_id);
                              /* Meldet das Fenster mit der Identifikation
                                 "wind_id" bei GEM-View als "in-den-Hinter-
                                 grund-gebracht", damit die "Cycle Window"-
                                 Behandlung angepa�t werden kann.           */
    int    (*getMSaving)      (char *title, char *extention, char *name, char *filename);
                              /* F�hrt einen Benutzerdialog zur Auswahl eines
                                 monochromen Speicherformats.
                                 Der Text "title" wird im Dialog eingetragen.
                                 In "extention" wird die �bliche Dateiendung
                                 (6 Bytes), in "name" der Name des Formates
                                 (18 Bytes) und in "filename" der Modulname
                                 (14 Bytes) zur�ckgebenen. Als Funktionswert
                                 erh�lt man einen Wert ungleich 0, wenn die
                                 Werte g�ltig sind, ansonsten 0.            */
    int    (*getCSaving)      (char *title, char *extention, char *name, char *filename);
                              /* F�hrt einen Benutzerdialog zur Auswahl eines
                                 farbigen Speicherformats.
                                 Der Text "title" wird im Dialog eingetragen.
                                 In "extention" wird die �bliche Dateiendung
                                 (6 Bytes), in "name" der Name des Formates
                                 (18 Bytes) und in "filename" der Modulname
                                 (14 Bytes) zur�ckgebenen. Als Funktionswert
                                 erh�lt man einen Wert ungleich 0, wenn die
                                 Werte g�ltig sind, ansonsten 0.            */
    int    (*getTSaving)      (char *title, char *extention, char *name, char *filename);
                              /* F�hrt einen Benutzerdialog zur Auswahl eines
                                 True-Color Speicherformats.
                                 Der Text "title" wird im Dialog eingetragen.
                                 In "extention" wird die �bliche Dateiendung
                                 (6 Bytes), in "name" der Name des Formates
                                 (18 Bytes) und in "filename" der Modulname
                                 (14 Bytes) zur�ckgebenen. Als Funktionswert
                                 erh�lt man einen Wert ungleich 0, wenn die
                                 Werte g�ltig sind, ansonsten 0.            */
  } diawin;
  struct {
    int    applicationID;     /* Enth�lt die appl_id von appl_init()        */
    int    gemview_vers;      /* Enth�lt die GEM-View Version 0x0300 (3.00) */
    int    tos_version;       /* Enth�lt die TOS Versionsnummer z.B. 0x0404 */
    int    aes_version;       /* Enth�lt die AES Versionsnummer z.B. 0x0340 */
    int    multi_task;        /* Enth�lt den Wert aus GemParBlk.global[1]   */
  } versions;
} CONV_Structure;


Entwickler-Support
""""""""""""""""""
Bei Fragen zur Modulprogrammierung kann ich am Samstags zwischen
14:00 und 16:00 Uhr angerufen werden.
Dies gilt ausschlie�lich f�r Fragen zur Modulprogrammierung, quasi
ein Entwickler-Support ;-)