home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
graphics
/
gvw_docg
/
modlprog.txt
< prev
Wrap
Text File
|
1994-06-07
|
104KB
|
1,658 lines
======================================================
| |
| 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 ;-)