====================================================== | | | 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 ;-)