home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / graphics / gvw_docg / modlprog.txt < prev   
Text File  |  1994-06-07  |  104KB  |  1,658 lines

  1.  
  2.  
  3.          ======================================================
  4.         |                                                      |
  5.         |    Programmierung von Modulen für GEM-View 3.00      |
  6.         |               ----------------------                 |
  7.         |               GEM-View ist SHAREWARE                 |
  8.         |               ----------------------                 |
  9.         |                                                      |
  10.         |                 © 1990/91/92/93 by                   |
  11.         |                                                      |
  12.         |                  Dieter Fiebelkorn                   |
  13.         |                   Grüner Weg  29a                    |
  14.         |                 45768 Marl-Brassert                  |
  15.         |                      (Germany)                       |
  16.         |                                                      |
  17.          ======================================================
  18.  
  19.  
  20. !!!!! BITTE LESEN SIE AUCH DIE DATEIEN "CHANGES" UND "GEMVIEW3.TXT" !!!!!
  21.  
  22.  
  23. Inhaltsübersicht: (Lesen Sie auch "CHANGES")
  24. ============================================
  25.   - Modularisierung
  26.     - Allgemeines
  27.     - Lademodule
  28.       - GDPS Treiber
  29.     - Speichermodule
  30.     - Druckmodule
  31.     - Bearbeitungsmodule
  32.     - Das Konvertierungsmodul
  33.     - "EXTOBFIX.PRG" von Interface
  34.     - Abschließende Worte
  35.   - Parameterübergabe und allgemeine Strukturen
  36.     - Parameterübergabe
  37.     - IMAGE-Struktur
  38.     - IMAGEOPTIONS-Struktur
  39.     - LOAD-Struktur
  40.     - SAVE-Struktur
  41.     - PRINT-Struktur
  42.     - PROC-Struktur
  43.     - CONV-Struktur
  44.   - Entwickler-Support
  45.  
  46.  
  47. Neue Modularisierung:
  48. """""""""""""""""""""
  49.  
  50. Allgemeines:
  51. ¯¯¯¯¯¯¯¯¯¯¯¯
  52.  Die externen Module haben die Endungen: GVL, GVS, GVP und GVR (jeweils
  53.  für Load, Save, Print unf pRocess) und werden in einem einstellbaren
  54.  Modulverzeichnis ("Install path ...   ^Z") in den Unterordern GVWLOAD,
  55.  GVWSAVE, GVWPRINT und GVWMODUL gesucht! Von diesem Modulen darf es
  56.  beliebig viele geben; Hauptsache es ist genug Speicher vorhanden um die
  57.  allgemeinen Verwaltungsinformationen zu allen Modulen anzulegen. Aber
  58.  wenn das nicht klappt, dann sollten Sie besser keine Bilder mehr laden,
  59.  dafür reicht der Speicher dann mit Sicherheit nicht mehr! Allerdings
  60.  bleibt GEM-View mit seinen internen Modulen (GEM-XIMG, GEM-Metafile, Text,
  61.  Resourcen und Hexdump fürs Laden, sowie GEM-XIMG fürs Speichern) funktions-
  62.  tüchtig!
  63.  
  64.  Auch wenn "verbose" eingeschaltet ist sollte nicht mehr als notwendig
  65.  "gelabert" werden. Eine einzeilige Information über die Aktion ist
  66.  vollkommen ausreichend. Wenn jemand sein Copyright unbedingt einbringen
  67.  muß, dann ist die Meldung auf eine Zeile zu beschränken und darf nur
  68.  bei dem Speicher-, Druck- und Bearbeitungsmodulen eingebaut werden.
  69.  Bei den Lademodulen ist es nur störend und wird ohne meine Zustimmung
  70.  nicht geduldet. Im äußersten Fall ;-{ kann ich mich dazu durchringen
  71.  es bei einem komplexen Modul NACH der Identifizierung des Bildes zu
  72.  erlauben!
  73.  
  74.  Für das Copyright ist der Modulheader und die Infofunktion in den
  75.  "Load type"-, Speicher-, Druck- und Bearbeitungs-Dialogen geschaffen
  76.  worden!
  77.  Da Beispiele meist mehr sagen als viele Worte, liegen eine Reihe von
  78.  Sourcen für die einzelnen Modulen dem Paket bei! Allerdings finden
  79.  sich hier doch einige Anmerkungen und Hinweise, die in den Sourcen
  80.  und in der Beschreibung der Strukturen nicht so offensichtlich zu
  81.  Tage treten.
  82.  
  83.  
  84. Lademodule:
  85. ¯¯¯¯¯¯¯¯¯¯¯
  86. Folgende Bildtypen dürfen von dem Ladetreiber geliefert werden:
  87. - Mono      : IATARIMONO, IBITMAP
  88. - Color     : IATARI_RGB, IRGB
  89. - True-Color: IATARI__TC, ITRUEC
  90.  
  91. Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
  92. der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
  93. "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
  94. im Register D0 übergeben wird:
  95.  
  96.   Image *gvw_loader(LOAD_Structure*  ls, int verbose);
  97.  
  98. Der Zeiger auf die "Image"-Struktur wird ebenfalls im Register A0
  99. zurückgegeben. Neben dem Zeiger auf die Struktur sind zwei Sonder-
  100. fälle möglich:
  101. "NULL" oder "0L" im Register A0 bedeutet, daß kein Bild identifiziert
  102.                  oder geladen wurde!
  103. "(Image* -1L)"   im Register A0 bedeutet, daß das Bild zwar eindeutig
  104.                  identifiziert werden konnte, aber es war aber nicht
  105.                  möglich es zu laden (Speicherplatzmangel, defekte
  106.                  Bilddaten, ...)
  107. Alle anderen Werte werden als Zeiger auf eine "Image"-Struktur ver-
  108. wendet. Also, hier ist Gewissenhaftigkeit angesagt!
  109.  
  110. Lademodule müssen, wenn Sie automatisch von GEM-View aufgerufen werden
  111. zuerst versuchen das Format des Bildes zu identifizieren, d.h. prüfen,
  112. ob das angegebene File eindeutige Merkmale des Formates besitzt, das
  113. dieses Modul repräsentiert. Ein automatischer Aufruf kann von dem
  114. benutzer-gewählten Aufruf durch das Flag "ls->user_identified" unter-
  115. schieden werden. Soll das Format nur identifiziert, aber nicht geladen,
  116. werden, so ist das Flag "ls->only_identified" gesetzt. In diesem Fall
  117. wird, wie beim Laden, eine Meldung über das Bild ausgegeben, wenn das
  118. Bild identifiziert werden konnte und ein Wert ungleich NULL ((void*)0L)
  119. in A0 zurückgegeben. Konnte das Bild nicht identifiziert werden, so
  120. wird als Funktionswert NULL ((void*)0L) in A0 zurückgegeben.
  121.  
  122. Bei den Lademodulen kann über "Schalter" (Flags) die Verwaltung und
  123. Verwendung der Module gesteuert werden. Weiterhin existiert ein Flag,
  124. welches nur vom Programmierer des Moduls eingestellt werden kann:
  125. Das "File-Selector"-Flag.
  126.  
  127. Der Schalter "Res." (Resistent) bewirkt im eingeschalteten Zustand, daß
  128. dieses Modul dauerhaft, d.h. während der Laufzeit von GEM-View, im
  129. Hauptspeicher gehalten wird. Ist dieser Schalter im Modul eingeschaltet,
  130. wenn GEM-View gestartet wird, so wird das Modul während des "Scan" oder
  131. Absuchvorganges geladen und im Speicher verwaltet. Wird der Schalter
  132. erst nach dem Start von GEM-View aktiviert, so wird das Modul resistent
  133. nachdem es einmalig zur Analyse des Bildformates in den Speicher ge-
  134. laden worden ist.
  135.  
  136. Der Schalter "Auto" (Automatischer Aufruf) wird dazu verwendet GEM-View
  137. mitzuteilen, ob dieses Modul zur Identifizierung des Bildformates ein-
  138. gesetzt werden soll. Eingeschaltet wird das Modul geladen und mit den
  139. dort vorhandenen Prüfmechanismen versucht das Bild zu analysieren, wird
  140. es erkannt, so wird es mit diesem Modul auch sofort geladen. Ist der
  141. Schalter nicht aktiviert, so wird das Modul einfach übersprungen, aller-
  142. dings können Sie es über "Load type" immer noch direkt auswählen!
  143.  
  144. Das "File-Selector"-Flag gibt an, ob eine File-Selector-Box zur
  145. Auswahl eines Bildes geöffnet werden soll in der Regel ist dies
  146. der Fall, wenn allerdings das Bild nicht einer Datei, sondern einem
  147. externen Gerät entnommen wird (z.B. Scanner) so ist die File-Selector-
  148. Box überflüssig und kann deaktiviert werden. Dies bietet sich gerade
  149. im Zusammenhang mit dem "Auto"-Flag an um beispielweise einen GDPS-
  150. Treiber für GEM-View zu realisieren.
  151.  
  152. Nebenbei empfehle ich zur Sicherheit, das Module, die externe Geräte
  153. ansprechen oder vor der Analyse des Bildes einen Benutzerdialog führen
  154. müssen in der Struktur "LOAD_Structure" das Flag "ls->user_identified"
  155. überprüft wird. Ist es gelöscht handelt es sich um einen automatischen
  156. Aufruf von GEM-View, so das häufig ein sofortiges Verlassen des Moduls
  157. sinnvoll sein dürfte. Ist das "ls->user_identified"-Flag hingegen ge-
  158. setzt kann das sich Modul voll ins Zeug legen, weil ... der Benutzer
  159. will es ja nicht besser! ;-/
  160.  
  161.   GDPS Treiber:
  162.   ¯¯¯¯¯¯¯¯¯¯¯¯¯
  163.   Dieser Abschnitt ist dazu da um Neugierig zu machen in den letzten
  164.   Absätzen sollte klar geworden sein, das ein GDPS-Treiber einfach an
  165.   GEM-View anzubinden sein sollte, wenn mal die GDPS-Schnittstellen-
  166.   Beschreibung vorliegt. Am besten ist aber ein Programmierer, der
  167.   sich schonmal damit rumgeschlagen hat macht sich daran zu schaffen.
  168.   Ich kann es nicht selber machen, da mir Beschreibung, Geräte zum
  169.   testen und inzwischen auch die Zeit fehlt. Tja, ;-(
  170.  
  171.  
  172. Speichermodule:
  173. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  174. Folgende Bildtypen können dem Speichermodul übergeben werden:
  175. - Mono      : IATARIMONO, IBITMAP
  176. - Color     : IATARI_RGB, IRGB
  177. - True-Color: IATARI__TC, ITRUEC
  178.  
  179. Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
  180. der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
  181. "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
  182. im Register D0 übergeben wird:
  183.  
  184.   int    gvw_saver (SAVE_Structure*  ss, int verbose);
  185. Der Rückgabewert der Funktion, der angibt ob die Funktion korrekt
  186. ihren Dienst verrichtet hat wird im Register D0 erwartet.
  187.  
  188.  
  189. Druckmodule:
  190. ¯¯¯¯¯¯¯¯¯¯¯¯
  191. Folgende Bildtypen können dem Druckmodul übergeben werden:
  192. - Mono      : IATARIMONO
  193. - Color     : IATARI_RGB
  194. - True-Color: IATARI__TC
  195.  
  196. Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
  197. der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
  198. "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
  199. im Register D0 übergeben wird:
  200.  
  201.   int    gvw_print (PRINT_Structure* ps, int verbose);
  202. Der Rückgabewert der Funktion, der angibt ob die Funktion korrekt
  203. ihren Dienst verrichtet hat wird im Register D0 erwartet.
  204.  
  205.  
  206. Bearbeitungsmodule:
  207. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  208. Folgende Bildtypen können dem Bearbeitungsmodul übergeben werden:
  209. - Mono      : IATARIMONO
  210. - Color     : IATARI_RGB
  211. - True-Color: IATARI__TC
  212.  
  213. Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
  214. der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
  215. "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
  216. im Register D0 übergeben wird:
  217.  
  218.   Image *gvw_proc  (PROC_Structure*  rs, int verbose);
  219. Der Zeiger auf die "Image"-Struktur wird ebenfalls im Register A0
  220. zurückgegeben. Neben dem Zeiger auf die Struktur ist ein Sonder-
  221. fall möglich:
  222. "NULL" oder "0L" im Register A0 bedeutet, das die Operation nicht
  223.                  durchgeführt werden konnte. Der Grund sollte dem
  224.                  Benutzer durch eine Zeile im Protokoll-Fenster
  225.                  angezeigt werden. Alternativ kann in diesem Fall
  226.                  auch der Zeiger auf das "Input"-Bild "rs->image"
  227.                  zurückgegeben werden, es hat den gleichen Nährwert!
  228.  
  229. Das Bild, welches dem Bearbeitungsmodul übergeben wird von GEM-View aus dem
  230. Speicher entfernt und darf nicht vom Modul gelöscht werden.
  231.  
  232.  
  233. Das Konvertierungsmodul:
  234. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  235.   Eine neue Funktion im Modul GEMVIEW.GVC wird durch "Convert ..." im
  236.   Deskmenü aufgerufen, wenn das Modul gefunden wird. Sie liefert eine
  237.   Kette von ImageOptions-Strukturen zurück, die dann von GEM-View ab-
  238.   gearbeitet wird. Der Zeiger auf die Struktur "CONV_Structure" wird
  239.   im Register A0 übergeben.
  240.   ImageOptions *gvw_proc  (CONV_Structure*  cs);
  241.  
  242. Der Zeiger auf die "ImageOptions"-Struktur wird ebenfalls im Register
  243. A0 erwartet. Neben dem Zeiger auf die Struktur ist ein Sonderfall
  244. möglich:
  245. "NULL" oder "0L" Nichts zu Konvertieren! (*Puh*) Nochmal an der an-
  246.                  strengenden Arbeit vorbei gekommen.
  247.  
  248. Die Hauptfunktion des Moduls "CONVERT", das auch als Quelltext vorliegt,
  249. hilft sicherlich beim Entwerfen eines neuen Konvertierungsmodule, welches
  250. nur noch die Strukturen zusammenstellen muß. GEM-View übernimmt ja die
  251. eigentliche Arbeit. Schauen Sie sich also mal ein wenig in der Funktion
  252. "gvw_convert" aus dem "CONVERT"-Modul um.
  253. Die anderen Funktionen im Modul "CONVERT" sind "schmückendes" Beiwerk und
  254. für die die Gesamtfunktionsweise von untergeordneter Bedeutung.
  255.  
  256.  
  257. "EXTOBFIX.PRG" von Interface
  258. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  259.  
  260. Die Idee, für die Anzeige von erweiterten Resourcen, externe Module zu
  261. verwenden geht leider mal nicht auf mich zurück. Vielmehr hat Georg Krämer
  262. diesem Vorschlag Anfang Oktober gemacht, den ich gerne aufgegriffen habe,
  263. weil Olaf Meisiek (Autor von Interface) die meiste Arbeit mit seiner
  264. Definition und der Realisierng von "EXTOBFIX.PRG" schon geleistet hatte.
  265. Wäre ich nicht so blöd gewesen, hätte die Einbindung auch wesentlich
  266. schneller und unproblematischer ablaufen können. Na ja, reden wir besser
  267. nicht darüber.
  268. Also langer Rede kurzer Sinn, wenn Sie ihr persönliches "EXTOBFIX.PRG" in
  269. den Modulordner kopieren dann werden die Resourcen nun in voller Pracht
  270. und Schönheit angezeigt. Für alle Wissensdurstigen sei gesagt: GEM-View
  271. verwendet ausschließlich die "fix_objs"-Routine aus dem Zeigerarray und
  272. legt wie Interface Kopien der aller OBJECT-Strukturen an (Edit-Objekte
  273. gibt es in GEM-View nicht ;-). Für weitere Informationen schlagen Sie
  274. bitte im Interface-Handbuch unter "Programmierung eines EXTOBFIX-Programmes"
  275. nach (bei mir ist es Kapitel 7, Seite 63).
  276.  
  277.  
  278. Abschließende Worte:
  279. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  280. Speichermodule schreiben ihre Ausgaben in eine Datei, eine Umlenkung
  281. auf den Drucker wird nicht speziell unterstützt, dafür ist es aber
  282. möglich sowohl Farbbilder, als auch TrueColor-Bilder in einer mono-
  283. chromen Bildschirmauflösung zu erhalten.
  284. Die Druckmodule geben in der Regel die Daten direkt auf den Drucker
  285. aus. Hierfür stehen "PRN:" für die parallele Schnittstelle und "AUX:"
  286. für die serielle Schnittstelle zur Verfügung. Eine Ausgabe in eine
  287. Datei kann ohne weiteres durch die Angabe eines absoluten Pfades
  288. erfolgen. Allerdings kann NUR das angezeigte Bild gedruckt werden.
  289.  
  290. Abfragen über Alert-Boxen oder mit Hilfe von Dialogen oder die Ver-
  291. wendung der File-Selector-Box sind zulässig. Als Beispiel sei angeführt:
  292. - JPEG Speichermodul (ist mir von Guido Vollbeding zugesichert worden!):
  293.   Kann mit einem Dialog die Qualität der Ausgabe einstellen.
  294. - PostScript Druckmodul (wird von Björn Tiemann (Schweiz) erstellt):
  295.   Kann mit einer Alert-Box abfragen, ob auf der paralellen, der seriellen
  296.   Schnittstelle oder in ein File "gedruckt" werden soll. Die File-Selector-
  297.   Box wird zur Auswahl der Zieldatei aufgerufen.
  298. Ich möchte allerdings darauf hinweisen, daß ein Modul seinem spezifischen
  299. Zweck nachkommen soll und nicht mehrere unterschiedliche Funktionen bereit-
  300. stellt. Es wird nur unübersichtlich, wenn das Speichermodul mit dem Drucker
  301. musiziert und vielleicht dann irgendwann ein Druckmodul versucht ein neues
  302. Bild zu Laden. Vieles ist möglich, aber nicht alles ist sinnvoll.
  303. Achtet also auf eine saubere Trennung der Module! DANKE!
  304.  
  305. Soll ein Modul erstellt werden, das in einer beliebigen Bildschirmauflösung,
  306. in der Lage sein soll, einen beliebigen Bildtyp wieder in voller Farbtiefe
  307. abzulegen, so sollte es konsequenterweise als Speichermodul ausgelegt
  308. werden. Im Beispiel einer PostScript Ausgabe sollte ein Modul für die
  309. Speicherung zuständig sein (dies verarbeitet alle möglichen Bildtypen,
  310. unabhängig von der Bildschirmauflösung). Ein weiteres Modul ist für den
  311. Druck zuständig und erhält ausschließlich angezeigte Bilder.
  312.  
  313. Die GEM-View Module dürfen "fast" alles, was ein GEM-Programm darf.
  314. Nicht erlaubt ist die Verwendung der Funktionen appl_init() und appl_exit()!
  315. Alles was nach Ende des Moduls nicht mehr erreichbar muß vor Ende des Moduls
  316. wieder entfernt werden. Zum Beispiel:
  317. - VDI-Workstation (auch virtuelle) müssen vor Beendigung des Moduls
  318.   geschlossen werden.
  319. - Fenster die erzeugt und geöffnet wurden müssen wieder geschlossen und
  320.   gelöscht werden.
  321. - Zu jedem wind_update(BEG_UPDATE/BEG_MCTRL) muß ein wind_update(END_UPDATE/
  322.   END_MCTRL) vorhanden sein.
  323. - ... (was sonst noch anfällt) ...
  324. CONVERT.C zeigt schon ein bissel (bischen) davon, was gemacht werden darf!
  325.  
  326. Nach einer Richtlinie von ATARI müssen Dialog durch wind_update(BEG_UPDATE/
  327. BEG_MCTRL) und wind_update(END_UPDATE/END_MCTRL) umschlossen werden, da es
  328. sonst zum "übermalen" des Dialoges durch den Desktop kommt (AES 3.x, 4.x)!
  329. CONVERT.C berücksichtigt diese Richtlinie!
  330.  
  331.  
  332. Parameterübergabe und allgemeine Strukturen:
  333. """"""""""""""""""""""""""""""""""""""""""""
  334.  
  335. Parameterübergabe
  336. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  337. Für die Parameterübergabe gelten die Regeln von Turbo C / Pure C:
  338. Parameterübergabe Pure C (Auszug aus der Online Hilfe von PureC)
  339. ======================================================================
  340. - Die ersten drei Variablen vom Typ char, int oder long werden in den
  341.   Registern D0, D1, D2 übergeben.
  342. - Die ersten zwei Adressparameter (Pointer) werden in den Registern A0 und
  343.   A1 übergeben.
  344. - Weitere Parameter, die keinen Platz mehr in den Registern D0, D1, D2, A0
  345.   A1 finden werden über den Stack übergeben.
  346. - Parameter werden in der Reihenfolge von rechts nach links übergeben.
  347.  
  348. Beispiel:
  349. ---------
  350. extern void lbf(int x1, int y1, int x2, int y2, int *l, int *b, int *f);
  351. main()
  352. {
  353.     int x1 = 10, y1 = 10, x2 = 20, y2 = 20, l, b, f;
  354.     lbf(x1, y1, x2, y2, &l, &b, &f);
  355. }
  356. Da mehr Werte-, als auch Adress-Parameter an die Funktion "lbf" übergeben
  357. werden, als Register zur Verfügung stehen, benötigen wir also in jedem Fall
  358. den Stack. Der vierte Werte-Parameter muß auf dem Stack abgelegt werden.
  359. Ebenso findet der dritte Adress-Parameter keinen Platz in den Registern,
  360. so daß auch dieser auf dem Stack abgelegt werden muß.
  361.  
  362. In den Registern befinden sich:     D0: x1  (Wert von x1)
  363.                                     D1: y1  (Wert von y1)
  364.                                     D2: x2  (Wert von x2)
  365.                                     A0: &l  (Adresse der Variablen l)
  366.                                     A1: &b  (Adresse der Variablen b)
  367. Auf dem Stack befinden sich:        &f (hi) (höchstwertiges Wort im Stack)
  368.                                     &f (lo)
  369.                                     y2      (Wert von y2)
  370.                                     Return- (Rücksprungadresse)
  371.                                     Adresse (Stackpointer zeigt hierauf)
  372.  
  373. Der Adress-Parameter f wird nach der Regel "von-rechts-nach-links" zuerst
  374. auf den Stack gelegt. Danach kommt der Wert von y2 auf den Stack. Bitte
  375. beachten Sie, daß die Rücksprungadresse des Unterprogrammes als letzter
  376. "Parameter" auf den Stack gelegt wird, so daß die Parameter im Stack ab dem
  377. Offset 4 anfangen. y2 (Offset 4), &f (Offset 6)!
  378.  
  379. Übergabe von float und double Parametern (Wird hier nicht verwendet!)
  380. ---------------------------------------------------------------------
  381. - Variablen vom Typ "float" und "double" werden grundsätzlich auf dem
  382.   Stack übergeben.
  383. - Jede Funktion die eine andere Funktion mit Rückgabewert vom Typ "double"
  384.   oder "float" aufruft, reserviert als Erstes eine lokale "double"-Variable
  385.   (d.h. 10 Byte) auf dem Stack zur Aufnahme des Rückgabewertes.
  386. - Der Rückgabewert hat intern immer den Typ "double", auch wenn er als
  387.   "float" deklariert wurde. In diesem Fall wird er nach der Rückkehr in
  388.   einen "float" konvertiert.
  389.  
  390. Allgemeines
  391. -----------
  392. Obiges gilt sinngemäß auch für Funktionen, die Strukturen zurückliefern,
  393. nur werden nicht 10 Bytes auf dem Stack reserviert, sondern genügend
  394. Speicher, um die ganze Struktur aufzunehmem.
  395.  
  396. In C räumt die aufrufende Funktion nach dem Aufruf die Parameter selbst
  397. vom Stack (z.B. mit ADDQ.W #8,A7", nach einem Aufruf mit zwei Adresspara-
  398. metern). Dies erübrigt sich natürlich, wenn alle Parameter in Registern
  399. übergeben wurden.
  400. ======================================================================
  401.  
  402.  
  403. IMAGE-Struktur (Zur Aufnahme und die Definition der Bilder)
  404. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  405. Hier ist die "Image"-Struktur, mit den Hilfsstrukturen aufgeführt und
  406. kurz erläutert.
  407.  
  408. typedef struct rgbmap {
  409.   unsigned int  size;         /* Größe der Farbpalette in red, green und blue,
  410.                                  muß unbedingt eine Zweierpotenz (2^n) sein */
  411.   unsigned int  used;         /* Anzahl der verwendeten Farben in Palette   */
  412.   unsigned char compressed;   /* (interne Verwendung) wird auf 0 gesetzt    */
  413.   unsigned char reserved;     /* (reserviert) für künftige Erweiterung      */
  414.   unsigned int  unused16;     /* (interne Verwendung) wird auf 0 gesetzt    */
  415.   Intensity    *red;          /* Farbwerte für Rot: Wertebereich [0..65535] */
  416.   Intensity    *green;        /* entsprechende Grün-Farbwerte von 0 bis used*/
  417.   Intensity    *blue;         /* dazu passende Farbwerte in Blau. Sum:Farbe */
  418. } RGBMap;
  419.  
  420.  
  421. typedef struct Scaling {
  422.   unsigned       count : 4;   /* ScaleDialog/Punkte: 1(a), 2(a,b), 3(a,b,c) */
  423.   unsigned       a     : 4;   /* Wertebereich: 1 (unterste Position)        */
  424.   unsigned       b     : 4;   /*               4 (mittlere Position,default)*/
  425.   unsigned       c     : 4;   /*               7 (oberste Position)         */
  426. } Scaling;
  427.  
  428.  
  429. typedef struct Image {
  430.   char          *title;       /* Pfadname, z.B. durch new...Image() gesetzt */
  431.   unsigned short type;        /* Typ des Bildes, durch new...Image() gesetzt
  432.                                 IBITMAP    0x11: Bild ist eine Bitplane
  433.                                 IATARIMONO 0x11: Bild ist Atari Mono Bitplane
  434.                                 IATARI_RGB 0x12: Bild ist AtariColor Bitmap
  435.                                 IATARI__TC 0x13: Bild ist Atari TrueColor
  436.                                 ITRUEC     0x13: Bild ist TrueColor Bild
  437.                                 IRGB       0x14: Bild ist RGB-Paletten Bild */
  438.   unsigned short width;       /* LOAD: sichtbare Breite des Bildes in Punkten
  439.                                  Nach dem Alignment (für SAVE, PRINT, PROC):
  440.                                  Gespeicherte Breite des Bildes in "data"   */
  441.   unsigned short height;      /* Höhe des Bildes in Punkten                 */
  442.   unsigned short depth;       /* Tiefe des Bildes, B/H/T gesetzt durch ...  */
  443.   unsigned short unalignwidth;/* (intern) sichbare Breite nach Alignment
  444.                               /* LOAD: nicht verwendet, auf 0 gesetzt.
  445.                               /* SAVE, PRINT, PROC: diese Breite beachten!  */
  446.   RGBMap         rgb;         /* Farbpalette des Bildes, Struktur siehe oben*/
  447.   byte          *data;        /* Bilddaten, gerundet nach den Angaben aus:
  448.                                  - "width" und "alignTo8" (bei LOAD)
  449.                                  - "width" (bei SAVE, PRINT, PROC, auf Worte)
  450.                                    wird durch Alignment auf Worte gerundet  */
  451.   unsigned int   pixlen;      /* Zahl der Bytes/Pixel: Mono/Color:1 ; TC:3  */
  452.   Scaling        scalered;    /* (intern) Scale-Beschreibung für Rot        */
  453.   Scaling        scalegreen;  /* (intern) Scale-Beschreibung für Grün       */
  454.   Scaling        scaleblue;   /* (intern) Scale-Beschreibung für Blau       */
  455.   Scaling        scaleadjust; /* (intern) Scale-Beschreibung f. Grauwandlung*/
  456.   unsigned       alignTo8 :2; /* 1: Bild ist schon auf Bytes aligned;
  457.                                     sollte in bei MONOs gesetzt werden
  458.                                  2: Bild steht schon Worte aligned in data  */
  459.   unsigned   fastload     :1; /* (internal)                                 */
  460.   unsigned   loadgdosfonts:1; /* (internal)                                 */
  461.   unsigned   scaleused    :1; /* (internal)                                 */
  462.   unsigned   unused       :3; /* (internal)                                 */
  463.   unsigned   font_point   :8; /* (internal)                                 */
  464. } Image;
  465.  
  466.  
  467. Folgende Bildtypen sind zulässig:
  468.  
  469. - Mono
  470.   - IATARIMONO, IBITMAP
  471.     In diesen Bildtypen wird eine Bitplane in "image->data" abgelegt. Ein
  472.     gesetztes Bit ist schwarz ein gelöschtes Bit ist weiß. Die Definition
  473.     entspricht einer GEM-Mono-Standard-Bitmap. Im Fall eines "IATARIMONO"-
  474.     Bildes sind die Daten auf 16 Bit (Worte) begradigt. Bei Bildern vom
  475.     Typ "IBITMAP" sind die Daten in der Regel byteweise ausgrichtet.
  476.  
  477. - Color
  478.   - IATARI_RGB
  479.     In "image->data" befindet sich eine GEM-Color-Standard-Bitmap, d.h. es
  480.     sind genau "image->depth" viele monochrome Bitplanes mit der folgenden
  481.     Größe hintereinander angeordnet: "image->width * image->height / 8".
  482.     Beachten Sie, daß "image->width" auf 16 begradigt ist und die Rechnung
  483.     in LONG durchgeführt werden sollte.
  484.     Die Reihenfolge der Farben ergibt sich aus der Kodierung der Pixel,
  485.     wobei die erste Plane das niederwertigste Bit repräsentiert.
  486.     Die Daten von Bilder des "IATARI_RGB"-Typs sind immer auf 16 Bit (Worte)
  487.     ausgerichtet! Beispiel: Ein Bild mit 3 Planes!
  488.     Plane 1: %01010101 ........
  489.     Plane 2: %00110011 ........
  490.     Plane 3: %00001111 ........
  491.     image->rgb.size = 8; image->used = 8
  492.     image->rgb.red  : 0xFFFF 0xFFFF 0x0000 0x0000 0xFFFF 0xFFFF 0x0000 0x0000
  493.     image->rgb.green: 0xFFFF 0x0000 0xFFFF 0x0000 0xFFFF 0x0000 0xFFFF 0x0000
  494.     image->rgb.blue : 0xFFFF 0x0000 0x0000 0xFFFF 0x0000 0xFFFF 0xFFFF 0x0000
  495.     Die Punkte habe von links nach rechts folgende Kodierungen und Farben:
  496.     0(weiß), 1(rot), 2(grün), 3(blau), 4(gelb), 5(magenta), 6(cyan), 7(schwarz)
  497.   - IRGB
  498.     Das "IRGB"-Bildformat verwendet je ein Byte pro Bildpunkt und speichert
  499.     dort direkt den Index auf die Farbpalette ab. Dabei wird unabhängig von
  500.     der Bildtiefe immer ein volles Byte verwendet. Das heißt, daß bei 16
  501.     Farben (Bildtiefe: 4) die obersten 4 Bit immer 0 sind!
  502.     Beispiel: wie oben!
  503.     "->data": 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
  504.     Die Kodierungen und die Farben entsprechen von links nach recht denen
  505.     des obigen Beispiels.
  506.  
  507. - True-Color
  508.   - IATARI__TC, ITRUEC
  509.     Vom Speicherumfang das größte Format. Hier werden pro Bildpunkt drei
  510.     hintereinanderliegende/unmittelbar-aufeinander-folgende Bytes verwendet,
  511.     dabei wird jeder Farbanteil (Rot, Grün, Blau) jeweils durch ein Byte
  512.     repräsentiert. Jeder Farbanteil hat somit einen Wertebereich von 0 bis
  513.     255, was genau dem True Color Format mit 16777216 Farben entspricht.
  514.     Die Reihenfolge der Farbanteile ist: Rot, Grün, Blau!
  515.     Im Fall eines "IATARI__TC"-Bildes sind die Daten auf 16 PIXEL ausge-
  516.     richtet. ACHTUNG: PIXEL = 3 Byte!
  517.  
  518.  
  519. IMAGEOPTIONS-Struktur (zur Vorbereitung der automatischen Konvertierung)
  520. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  521. Die "ImageOptions"-Struktur wird ausschließlich von dem externen
  522. Konvertierungsmodul "GEMVIEW.GVC" verwendet.
  523.  
  524. typedef struct {
  525.   unsigned      tocolors      :16; /* # der Farben, Wertebereich [4 .. 256] */
  526.   unsigned      process       : 4; /* Typ des Bearbeitungsalgorithmus:
  527.                                       PROC_ORDER    0: Order-Dither Verfahren
  528.                                       PROC_NEAR     1: Benachtbarte Farbe
  529.                                       PROC_FLOYD    2: --"-- mit Fehlerfort.
  530.                                       PROC_JJN      3: --"-- mit Fehlerfort.
  531.                                       PROC_STUCKI   4: --"-- mit Fehlerfort.*/
  532.   unsigned      colormap      : 4; /* Typ der Farbpaletten-Berechnung:
  533.                                       CMAP_FIX      0: Feste  Farbpalette
  534.                                       CMAP_USERDEF1 1: Aus oberstem Fenster
  535.                                       CMAP_USERDEF2 2: Standardpalette
  536.                                       CMAP_OCTREEA  3: OcTree/Appromimativ
  537.                                       CMAP_OCTREE   4: OcTree/Alle Punkte
  538.                                       CMAP_STATA    5: Varianz/Appromimativ
  539.                                       CMAP_STAT     6: Varianz/Alle Punkte  */
  540.   unsigned      spec_active   : 1; /* aktiviert die eingestellten Werte     */
  541.   unsigned      spec_always   : 1; /* immer durchführen (also if no need)   */
  542.   unsigned      spec_grey     : 1; /* Dithering auf Grauwert-Palette        */
  543.   unsigned      spec_noise    : 1; /* Verwende "noise reduction"-Filter     */
  544.   unsigned      spec_compress : 1; /* Verdichte Palatte auf benutzte Farben */
  545.   unsigned      unused        : 3; /* (reserviert) für künftige Erweiterung */
  546. } ColorDither;
  547.  
  548.  
  549. typedef struct _ios{
  550.   char         *name;         /* Pfadname des zu ladenden Bildes            */
  551.   int           merged;       /* mit dem vorherigen Bild verschmelzen ?(0/1)*/
  552.   int           atx, aty;     /* Pos. an der das Bild einzufügen ist (merge)*/
  553.   unsigned int  bright;       /* Aufhellugsfaktor in Prozent, 100=0 default */
  554.   unsigned int  clipx, clipy; /* Obere linke Ecke des zu verwendenden Bildes*/
  555.   unsigned int  clipw, cliph; /* Ausdehnung des Zielbildes (Breite/Höhe)    */
  556.   unsigned int  last_clipx;   /* (interne Verwendung) wird auf 0 gesetzt    */
  557.   unsigned int  last_clipy;   /* (interne Verwendung) wird auf 0 gesetzt    */
  558.   unsigned int  last_clipw;   /* (interne Verwendung) wird auf 0 gesetzt    */
  559.   unsigned int  last_cliph;   /* (interne Verwendung) wird auf 0 gesetzt    */
  560.   unsigned int  dither;       /* Verfahren fürs s/w-Dither:
  561.                                 "Ausgeschltet" 0: Keine s/w Reduzierung
  562.                                  FS_Dither     1: "Floyd-Steinberg"-Verfahren
  563.                                  JJN_Dither    2: "Jarvis-Judice-Ninke" Algo
  564.                                  Stk_Dither    3: "Stucki"-Ditherverfahren
  565.                                  Halftone      4: Halbton mit 4x4-Raster
  566.                                  Ordereddither 5: Order-Dither (nachladbar) */
  567.   unsigned int  colors;       /* # Farben, fürs Zielbild (Farbvermelzung!)  */
  568.   int           rotate;          /* # Grad zu rotieren, muß Mehrfaches von 90  */
  569.   int           xzoom, yzoom; /* Vergrößerungsfaktor in Promille (1 zu 1000)
  570.                                  Positiv: Relativer Faktor in Promille
  571.                                  Negativ: Absolute Größe des Zielbildes     */
  572.   int           align;        /* (intern) für dem ATARI immer auf 16 gesetzt*/
  573.   int           save;         /* Speichere das Bild als:
  574.                                  1: Monochromes Bild; dither Bild wenn nötig
  575.                                  2: Farbbild; Farbquantisierung falls nötig
  576.                                  3: True-Color-Bild                         */
  577.   char         *savename;     /* Pfadname des Zielbildes; Name zum speichern*/
  578.   int           autoname;     /* (interne Verwendung) auf 0 gesetzt         */
  579.   unsigned int  full,         /* Fülle Bild durch Vergrößern/Weiterholung   */
  580.                                  FULL_NO       0: Normal/Default
  581.                                  FULL_ZOOM     1: Füllen durch Vergrößern
  582.                                  FULL_REPEAT   2: Füllen durch Weiterholung */
  583.                 fullw, fullh; /* Ausdehnung (Breite/Höhe) des "Full"-Bildes */
  584.   ColorDither   colordither;  /* siehe Beschreibung der Struktur oben       */
  585.   Scaling       scalered;     /* siehe Beschreibung in IMAGE.H              */
  586.   Scaling       scalegreen;
  587.   Scaling       scaleblue;
  588.   Scaling       scaleadjust;
  589.   int           load_hexdump; /* Lade Datei immer als Text/Hexdump          */
  590.   struct _ios  *prev, *next;  /* doppelt verkettete Liste diese Struktur    */
  591.   char          tc_saver   [14]; /* Modulname ohne Pfad zum speichern (TC)  */
  592.   char          color_saver[14]; /* Modulname ohne Pfad zum speichern (col.)*/
  593.   char          mono_saver [14]; /* Modulname ohne Pfad zum speichern (mono)*/
  594. } ImageOptions;
  595.  
  596.  
  597. LOAD-Struktur (für die externen Lade-Module von GEM-View3 *.GVL)
  598. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  599. Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
  600. Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
  601. Turbo C / Pure C.
  602.  
  603. typedef struct LOAD_Structure {
  604.   long     identify;          /* GVWL_module  == 'GVWL' */
  605.   int      version;           /* GVWL_Version == 0x0100 */
  606.   char    *in_filename;       /* Pfadname der Datei, die geladen werden soll*/
  607.   int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
  608.   int      identify_only;     /* Gesetzt: Nur Identifizieren/Mitteilung     */
  609.   int      user_identified;   /* Gelöscht: Automatischer Aufruf von GEM-View
  610.                                  Gesetzt : Vom Benutzer ausgewähltes Format */
  611.   struct {
  612.     ZFILE *(*open)            (char *name, int attrib);
  613.                               /* Öffnet virtuell die angegebene Datei, der
  614.                                  Wert von "attrib" ist auf 0 zu setzen.
  615.                                  Die Rückgabe ist ein Zeiger auf eine interne
  616.                                  Struktur, die mit FILE* vergleichbar ist.
  617.                                  Hinter dieser und den folgenden Funktionen
  618.                                  verbirgt sich eine effektive Pufferverwal-
  619.                                  tung. Nur beim ersten Aufruf wird die Datei
  620.                                  physikalisch geöffnet. Ein weiterer Aufruf
  621.                                  setzt nur einige Marke zurück, wenn beim
  622.                                  Lesen die Puffergrenze (Default: 8kB, in
  623.                                  GEMVIEW.INF änderbar) nicht überschritten
  624.                                  wird. Verwendet werden GEMDOS-Funktionen   */
  625.     ulong  (*read)            (ZFILE *zf, void *buf, ulong len);
  626.                               /* Ließt aus der geöffneten Datei, die durch
  627.                                  "zf" identifiziert wird, "len" viele Bytes
  628.                                  in den Buffer "buf". Die Funktion liefert
  629.                                  als Ergebnis die Zahl der gelesenen Zeichen*/
  630.     int    (*getchr)          (ZFILE *zf);
  631.                               /* Ließt ein Byte aus und gibt es als Wert
  632.                                  zurück. Im Fehlerfall wird "errno" auf
  633.                                  -1 gesetzt und EOF zurückgegeben.          */
  634.     char  *(*gets)            (void *buf, ulong len, ZFILE *zf);
  635.                               /* Ließt eine String bis zum ersten Auftreten
  636.                                  von '\n', dem Dateiende ein oder wenn "le"
  637.                                  viele Zeichen eingelesen wurde. Rückgabewert
  638.                                  ist ein Zeiger auf den Buffer oder NULL,
  639.                                  wenn kein Zeichen eingelesen wurde.        */
  640.     ulong  (*skip)            (ZFILE *zf, ulong len);
  641.                               /* Überspringt "len" viele Bytes. Die Funktion
  642.                                  liefert die neue Dateiposition als Ergebnis*/
  643.     ulong  (*seek)            (ZFILE *zf, int seekmode, ulong offset);
  644.                               /* Postitioniert die Schreibmarke neu. Mit
  645.                                  SEEK_SET (0) wird auf die absolute Position
  646.                                  "offset" positioniert. Bei SEEK_CUR (1) wird
  647.                                  die Position um "offset" Byte weitergesetzt.
  648.                                  SEEK_END (2) positioniert relativ vom Datei-
  649.                                  ende in Richtung Anfang der Datei.
  650.                                  Die Funktion liefert die neue Dateiposition
  651.                                  als Ergebnis                               */
  652.     ulong  (*tell)            (ZFILE *zf);
  653.                               /* Liefert als Wert die Länge der Datei.      */
  654.     int    (*eof)             (ZFILE *zf);
  655.                               /* Prüft die aktuelle Dateiposition darauf hin
  656.                                  ob das Dateiende überschritten wurde. Wert
  657.                                  0 zeigt einen Aufruffehler an. 1 weißt auf
  658.                                  Dateiende hin. Ansonsten wird -1 geliefert.*/
  659.     void   (*close)           (ZFILE *zf);
  660.                               /* Schließt die Datei virtuell. Die Datei wird
  661.                                  automatisch physikalisch geschlossen, wenn
  662.                                  eine Datei als Bild identifiziert und ge-
  663.                                  laden oder die Aktion abgebrochen wurde.   */
  664.   } input;
  665.   struct {
  666.     int    (*printout)        (const char* format, ...);
  667.                               /* Schreibt eine Meldung in das Protokollfenster
  668.                                  von GEM-View. Die Aufrufstruktur und die
  669.                                  Parameter entsprechen "printf()" aus der
  670.                                  C-Standard-Library.
  671.                                  Folgende Sonderzeichen wurden verarbeitet:
  672.                                  "\001" : Positioniere eine Zeile nach oben
  673.                                  "\002" : Positioniere eine Spalte nach links
  674.                                  "\033E": Lösche Protokollfenster (CLR-HOME)
  675.                                  "\034\001": Schalte auf Fett-Schrift
  676.                                  "\034\010": Schalte Unterstreichung ein
  677.                                  "\034\011": Fett und Unterstreichung ein
  678.                                  "\034\100": Auf Normalschrift schalten     */
  679.   } print;
  680.   struct {
  681.     void   (*printerr)        (const char* format, ...);
  682.                               /* Wie "printout" (siehe oben). Zusätzlich:
  683.                                  - Der Text wird "Fett" ausgegeben.
  684.                                  - Ist das Protokollfenster geschlossen, wird
  685.                                    eine Alert-Box geöffnet.
  686.                                  - Ist das Protokollfenster auf "klein" ge-
  687.                                    schaltet, so wird das Fenster auf "groß"
  688.                                    geschaltet und in den Vordergrund gebracht
  689.                                  - Ist das Protokollfenster auf "groß" ge-
  690.                                    schaltet, so wird das Fenster in den
  691.                                    Vordergrund gebracht                     */
  692.     void   (*userexit)        (void);
  693.                               /* Wenn in einem Modul ein fatalen Fehler auf-
  694.                                  tritt, kann die das Modul sofort verlassen
  695.                                  werden. Aller angeforderter Speicher wird
  696.                                  zurückgegeben. Allerdings sind vorher alle
  697.                                  VDI-Worstations zu schließen und alle
  698.                                  wind_updates() abzuschießen ...
  699.                                  Sollte nur im schlimmsten Fall (und nur
  700.                                  dann) verwendet werden.                    */
  701.   } error;
  702.   struct {
  703.     byte  *(*malloc)          (ulong size);
  704.                               /* Reserviert "size" Bytes dynamischen Speicher.
  705.                                  Die Funktion verwaltet selbsttätig kleine
  706.                                  Speicherblöcke in größeren "Clustern", um
  707.                                  die Speicherfragmentierunggefahr etwas zu
  708.                                  veringern. Verwenden Sie nur diese Funktion
  709.                                  um Speicher dynamisch anzufordern.         */
  710.     void   (*free)            (void *area);
  711.                               /* Gibt den reservierten Speicher wieder frei.*/
  712.   } memory;
  713.   struct {
  714.     Image *(*newBitImage)     (char *title, unsigned int width, unsigned int height);
  715.                               /* Erzeugt und initialisiert eine "Image"-
  716.                                  Struktur, wobei der Pfadname oder NULL über
  717.                                  den Parameter "title" übergeben werden kann.
  718.                                  Für den Datenbreich wird eine Bitplane mit
  719.                                  alignwidth (auf 16 begradigtes "width") mal
  720.                                  "height" reserviert.
  721.                                  In "image->width" wird "width" eingetragen.
  722.                                  Achten Sie in jedem Fall darauf "image->
  723.                                  alignTo8" zu setzen.                       */
  724.     Image *(*newRGBImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
  725.                               /* Erzeugt und initialisiert eine "Image"-
  726.                                  Struktur, wobei der Pfadname oder NULL über
  727.                                  den Parameter "title" übergeben werden kann.
  728.                                  Für den Datenbreich wird eine ein Speicher
  729.                                  mit alignwidth (auf 16 begradigtes "width")
  730.                                  mal "height" Bytes reserviert. "depth" ist
  731.                                  die Zahl der Bitebenen des Bildes für die
  732.                                  Brechnung der Größe der Farbpalette.
  733.                                  In "image->width" wird "width" eingetragen.
  734.                                  Achten Sie in jedem Fall darauf eventuell
  735.                                  "image->alignTo8" zu setzen.               */
  736.     Image *(*newTCImage)      (char *title, unsigned int width, unsigned int height);
  737.                               /* Erzeugt und initialisiert eine "Image"-
  738.                                  Struktur, wobei der Pfadname oder NULL über
  739.                                  den Parameter "title" übergeben werden kann.
  740.                                  Für den Datenbreich wird eine ein Speicher
  741.                                  mit alignwidth (auf 16 begradigtes "width")
  742.                                  mal "height" Tripel (RBG=3 Byte) reserviert.
  743.                                  In "image->width" wird "width" eingetragen.
  744.                                  Achten Sie in jedem Fall darauf eventuell
  745.                                  "image->alignTo8" zu setzen.               */
  746.     Image *(*newGEMImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
  747.                               /* Erzeugt und initialisiert eine "Image"-
  748.                                  Struktur, wobei der Pfadname oder NULL über
  749.                                  den Parameter "title" übergeben werden kann.
  750.                                  Für den Datenbreich werden "depth" Bitplanes
  751.                                  mit alignwidth (auf 16 begradigtes "width")
  752.                                  mal "height" reserviert. Zur Aufnahme des
  753.                                  GEM-Standard-Formats. Das Bild ist IMMER
  754.                                  auf Worte begradigt zu Laden!              */
  755.     void   (*freeGVImage)     (Image *image);
  756.                               /* Gibt die reservierten Strukturen wieder frei,
  757.                                  wenn zum Beispiel des Bild während des Ladens
  758.                                  als defekt, fehlerhaft oder unvollständig
  759.                                  erkannt wird.                              */
  760.     Image *(*rotate)          (Image *image, int rotate);
  761.                               /* Dreht an Bild um 90, 180 oder 270 Grad, zum
  762.                                  Beispiel für Photo-CD-Bilder im Hochformat */
  763.   } images;
  764.   struct {
  765.     void   (*evntHandle)      (int wait);
  766.                               /* Läßt GEM-View "wait" Millisekunden Zeit um
  767.                                  eine Nachricht entgegenzunehmen und sie dann
  768.                                  abzuarbeiten. Wird nach "wait" Millisekunden
  769.                                  keine Narchricht empfangen wird die Funktion
  770.                                  wieder verlassen. Sehr praktisch um GEM-View
  771.                                  ein paar Redraws und ähnliches machen zu
  772.                                  lassen.                                    */
  773.     void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  774.                               /* Verarbeitet ein Mausereignis, die Parameter
  775.                                  ev_mx, ev_my, keystate, keypress entsprechen
  776.                                  den Werten, die evnt_multi() liefert.
  777.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  778.                                  In exit wird ein Wert ungleich 0 zurückge-
  779.                                  geben, wenn das Modul seine Arbeit abbrechen
  780.                                  soll. Dieses sollte so schnell wie möglich
  781.                                  geschehen!                                 */
  782.     void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
  783.                               /* Verarbeitet ein Tastaturereignis, die Para-
  784.                                  meter keystate, keypress entsprechen den
  785.                                  Werten, die evnt_multi() liefert.
  786.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  787.                                  In exit wird ein Wert ungleich 0 zurückge-
  788.                                  geben, wenn das Modul seine Arbeit abbrechen
  789.                                  soll. Dieses sollte so schnell wie möglich
  790.                                  geschehen!                                 */
  791.     void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
  792.                               /* Verarbeitet ein Mausknopfereignis, die Para-
  793.                                  meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
  794.                                  keystate, keypress entsprechen den Werten,
  795.                                  die evnt_multi() liefert.
  796.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  797.                                  In exit wird ein Wert ungleich 0 zurückge-
  798.                                  geben, wenn das Modul seine Arbeit abbrechen
  799.                                  soll. Dieses sollte so schnell wie möglich
  800.                                  geschehen!                                 */
  801.     void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  802.                               /* Verarbeitet ein Messageereignis, die Para-
  803.                                  meter msg, ev_mx, ev_my, keystate, keypress
  804.                                  entsprechen den Werten, die evnt_multi()
  805.                                  liefert.
  806.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  807.                                  In exit wird ein Wert ungleich 0 zurückge-
  808.                                  geben, wenn das Modul seine Arbeit abbrechen
  809.                                  soll. Dieses sollte so schnell wie möglich
  810.                                  geschehen!                                 */
  811.     void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
  812.                               /* Verarbeitet ein Zeitereignis, die Parameter
  813.                                  ev_mx, ev_my, keystate, keypress, ev_mbutton
  814.                                  entsprechen den Werten die evnt_multi()
  815.                                  liefert.
  816.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  817.                                  In exit wird ein Wert ungleich 0 zurückge-
  818.                                  geben, wenn das Modul seine Arbeit abbrechen
  819.                                  soll. Dieses sollte so schnell wie möglich
  820.                                  geschehen!                                 */
  821.                               */
  822.     int    (*alert)           (int button, const char *astring);
  823.                               /* Die Funktion entspricht exakt form_alert().*/
  824.   } events;
  825.   struct {
  826.     void   (*reset_dialogCol) (int flag);
  827.                               /* Setzt die Desktopfarben (0 bis 15) wieder
  828.                                  auf den ursprünglichen Wert zurück, nachdem
  829.                                  die Bildfarben gesichert wurden (flag = 1).
  830.                                  Restauriert die Bildfarben wieder, wenn
  831.                                  "flag" auf 0 gesetzt ist.
  832.                                  Die Funktion erlaubt einen verschachtelten
  833.                                  Aufruf und sollte vor und nach jedem Dialog
  834.                                  aufgerufen werden. Beachten Sie auch die
  835.                                  Richtlinie von ATARI "Abschließende Worte" */
  836.     void   (*send_windOpen)   (int wind_id);
  837.                               /* Meldet das Fenster mit der Identifikation
  838.                                  "wind_id" bei GEM-View an, damit es bei
  839.                                  der "Cycle Window"-Behandlung mitbehandelt
  840.                                  wird.
  841.                                  Das Fenster ist selbst zu öffnen.          */
  842.     void   (*send_windClosed) (int wind_id);
  843.                               /* Meldet das Fenster mit der Identifikation
  844.                                  "wind_id" bei GEM-View ab, damit es bei
  845.                                  der "Cycle Window"-Behandlung nun nicht
  846.                                  mehr mitarbeitet wird.
  847.                                  Das Fenster ist selbst zu öffnen.          */
  848.     void   (*send_windTop)    (int wind_id);
  849.                               /* Meldet das Fenster mit der Identifikation
  850.                                  "wind_id" bei GEM-View als "getopped",
  851.                                  damit die "Cycle Window"-Behandlung an-
  852.                                  gepaßt werden kann.                        */
  853.     void   (*send_windBottom) (int wind_id);
  854.                               /* Meldet das Fenster mit der Identifikation
  855.                                  "wind_id" bei GEM-View als "in-den-Hinter-
  856.                                  grund-gebracht", damit die "Cycle Window"-
  857.                                  Behandlung angepaßt werden kann.           */
  858.   } diawin;
  859.   struct {
  860.     int    applicationID;     /* Enthält die appl_id von appl_init()        */
  861.     int    gemview_vers;      /* Enthält die GEM-View Version 0x0300 (3.00) */
  862.     int    tos_version;       /* Enthält die TOS Versionsnummer z.B. 0x0404 */
  863.     int    aes_version;       /* Enthält die AES Versionsnummer z.B. 0x0340 */
  864.     int    multi_task;        /* Enthält den Wert aus GemParBlk.global[1]   */
  865.   } versions;
  866.   struct {
  867.     unsigned IMG_fastload      :  1;
  868.     unsigned IMG_vdicolororder :  1;
  869.     unsigned IMG_TCalign16     :  1;
  870.     unsigned PCD_loadBase      :  3;
  871.     unsigned DSP_usingit       :  1;
  872.     unsigned DSP_greyscale     :  1;
  873.     unsigned UNUSED            :  8;
  874.     unsigned FUTUREUSED        : 16;
  875.     long     RESERVED;
  876.   } flags;
  877. } LOAD_Structure;
  878.  
  879.  
  880. SAVE-Struktur (für die externen Speicher-Module von GEM-View3 *.GVS)
  881. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  882. Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
  883. Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
  884. Turbo C / Pure C.
  885.  
  886. typedef struct SAVE_Structure {
  887.   long     identify;          /* GVWS_module  == 'GVWS' */
  888.   int      version;           /* GVWS_Version == 0x0100 */
  889.   Image   *image;             /* Zeiger auf "Image", das zu speichern ist.  */
  890.   int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
  891.   char    *out_filename;      /* Dateiname, in der das Bild gespeichert wird*/
  892.   struct {
  893.     int    (*open)            (char *file);
  894.                               /* Öffnet die angegebene Datei, eine eventuell
  895.                                  vorhandene Datei wird überschrieben. Rück-
  896.                                  gabewert ist ein positives Dateihandle.
  897.                                  Im Fehlerfall wird ein negativer Wert
  898.                                  zurückgegeben                              */
  899.     ulong  (*write)           (int handle, ulong count, void *buf);
  900.                               /* Schreibt "count" Bytes aus dem Buffer "buf"
  901.                                  in die entsprechende Datei. Ein Puffer von
  902.                                  8 Kilobyte ist zwischengeschaltet.
  903.                                  Die Funktion liefert als Ergebnis die Anzahl
  904.                                  der gespeicherten Bytes zurück oder 0 im
  905.                                  Fehlerfall                                 */
  906.     int    (*close)           (int handle);
  907.                               /* Speichert gegebenenfalls den "internen"
  908.                                  Puffer ab und schließt die Datei.
  909.                                  Die Funktion liefert als Ergebnis eine 0,
  910.                                  wenn die Datei geschlossen werden konnte,
  911.                                  ansonsten eine negative Zahl.              */
  912.     int    (*delete)          (const char *fname);
  913.                               /* Löscht die die mit fname bezeichnete Datei.
  914.                                  Die Funktion liefert als Ergebnis eine 0,
  915.                                  wenn die Datei gelöscht werden konnte, und
  916.                                  ein von 0 verschiedenes Ergebnis, wenn die
  917.                                  Datei nicht gelöscht werden konnte.        */
  918.   } output;
  919.   struct {
  920.     int    (*printout)        (const char* format, ...);
  921.                               /* Schreibt eine Meldung in das Protokollfenster
  922.                                  von GEM-View. Die Aufrufstruktur und die
  923.                                  Parameter entsprechen "printf()" aus der
  924.                                  C-Standard-Library.
  925.                                  Folgende Sonderzeichen wurden verarbeitet:
  926.                                  "\001" : Positioniere eine Zeile nach oben
  927.                                  "\002" : Positioniere eine Spalte nach links
  928.                                  "\033E": Lösche Protokollfenster (CLR-HOME)
  929.                                  "\034\001": Schalte auf Fett-Schrift
  930.                                  "\034\010": Schalte Unterstreichung ein
  931.                                  "\034\011": Fett und Unterstreichung ein
  932.                                  "\034\100": Auf Normalschrift schalten     */
  933.   } print;
  934.   struct {
  935.     void   (*printerr)        (const char* format, ...);
  936.                               /* Wie "printout" (siehe oben). Zusätzlich:
  937.                                  - Der Text wird "Fett" ausgegeben.
  938.                                  - Ist das Protokollfenster geschlossen, wird
  939.                                    eine Alert-Box geöffnet.
  940.                                  - Ist das Protokollfenster auf "klein" ge-
  941.                                    schaltet, so wird das Fenster auf "groß"
  942.                                    geschaltet und in den Vordergrund gebracht
  943.                                  - Ist das Protokollfenster auf "groß" ge-
  944.                                    schaltet, so wird das Fenster in den
  945.                                    Vordergrund gebracht                     */
  946.     void   (*userexit)        (void);
  947.                               /* Wenn in einem Modul ein fatalen Fehler auf-
  948.                                  tritt, kann die das Modul sofort verlassen
  949.                                  werden. Aller angeforderter Speicher wird
  950.                                  zurückgegeben. Allerdings sind vorher alle
  951.                                  VDI-Worstations zu schließen und alle
  952.                                  wind_updates() abzuschießen ...
  953.                                  Sollte nur im schlimmsten Fall (und nur
  954.                                  dann) verwendet werden.                    */
  955.   } error;
  956.   struct {
  957.     byte  *(*malloc)          (ulong size);
  958.                               /* Reserviert "size" Bytes dynamischen Speicher.
  959.                                  Die Funktion verwaltet selbsttätig kleine
  960.                                  Speicherblöcke in größeren "Clustern", um
  961.                                  die Speicherfragmentierunggefahr etwas zu
  962.                                  veringern. Verwenden Sie nur diese Funktion
  963.                                  um Speicher dynamisch anzufordern.         */
  964.     void   (*free)            (void *area);
  965.                               /* Gibt den reservierten Speicher wieder frei.*/
  966.   } memory;
  967.   struct {
  968.     void   (*evntHandle)      (int wait);
  969.                               /* Läßt GEM-View "wait" Millisekunden Zeit um
  970.                                  eine Nachricht entgegenzunehmen und sie dann
  971.                                  abzuarbeiten. Wird nach "wait" Millisekunden
  972.                                  keine Narchricht empfangen wird die Funktion
  973.                                  wieder verlassen. Sehr praktisch um GEM-View
  974.                                  ein paar Redraws und ähnliches machen zu
  975.                                  lassen.                                    */
  976.     void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  977.                               /* Verarbeitet ein Mausereignis, die Parameter
  978.                                  ev_mx, ev_my, keystate, keypress entsprechen
  979.                                  den Werten, die evnt_multi() liefert.
  980.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  981.                                  In exit wird ein Wert ungleich 0 zurückge-
  982.                                  geben, wenn das Modul seine Arbeit abbrechen
  983.                                  soll. Dieses sollte so schnell wie möglich
  984.                                  geschehen!                                 */
  985.     void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
  986.                               /* Verarbeitet ein Tastaturereignis, die Para-
  987.                                  meter keystate, keypress entsprechen den
  988.                                  Werten, die evnt_multi() liefert.
  989.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  990.                                  In exit wird ein Wert ungleich 0 zurückge-
  991.                                  geben, wenn das Modul seine Arbeit abbrechen
  992.                                  soll. Dieses sollte so schnell wie möglich
  993.                                  geschehen!                                 */
  994.     void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
  995.                               /* Verarbeitet ein Mausknopfereignis, die Para-
  996.                                  meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
  997.                                  keystate, keypress entsprechen den Werten,
  998.                                  die evnt_multi() liefert.
  999.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1000.                                  In exit wird ein Wert ungleich 0 zurückge-
  1001.                                  geben, wenn das Modul seine Arbeit abbrechen
  1002.                                  soll. Dieses sollte so schnell wie möglich
  1003.                                  geschehen!                                 */
  1004.     void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1005.                               /* Verarbeitet ein Messageereignis, die Para-
  1006.                                  meter msg, ev_mx, ev_my, keystate, keypress
  1007.                                  entsprechen den Werten, die evnt_multi()
  1008.                                  liefert.
  1009.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1010.                                  In exit wird ein Wert ungleich 0 zurückge-
  1011.                                  geben, wenn das Modul seine Arbeit abbrechen
  1012.                                  soll. Dieses sollte so schnell wie möglich
  1013.                                  geschehen!                                 */
  1014.     void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
  1015.                               /* Verarbeitet ein Zeitereignis, die Parameter
  1016.                                  ev_mx, ev_my, keystate, keypress, ev_mbutton
  1017.                                  entsprechen den Werten die evnt_multi()
  1018.                                  liefert.
  1019.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1020.                                  In exit wird ein Wert ungleich 0 zurückge-
  1021.                                  geben, wenn das Modul seine Arbeit abbrechen
  1022.                                  soll. Dieses sollte so schnell wie möglich
  1023.                                  geschehen!                                 */
  1024.                               */
  1025.     int    (*alert)           (int button, const char *astring);
  1026.                               /* Die Funktion entspricht exakt form_alert().*/
  1027.   } events;
  1028.   struct {
  1029.     void   (*reset_dialogCol) (int flag);
  1030.                               /* Setzt die Desktopfarben (0 bis 15) wieder
  1031.                                  auf den ursprünglichen Wert zurück, nachdem
  1032.                                  die Bildfarben gesichert wurden (flag = 1).
  1033.                                  Restauriert die Bildfarben wieder, wenn
  1034.                                  "flag" auf 0 gesetzt ist.
  1035.                                  Die Funktion erlaubt einen verschachtelten
  1036.                                  Aufruf und sollte vor und nach jedem Dialog
  1037.                                  aufgerufen werden. Beachten Sie auch die
  1038.                                  Richtlinie von ATARI "Abschließende Worte" */
  1039.     void   (*send_windOpen)   (int wind_id);
  1040.                               /* Meldet das Fenster mit der Identifikation
  1041.                                  "wind_id" bei GEM-View an, damit es bei
  1042.                                  der "Cycle Window"-Behandlung mitbehandelt
  1043.                                  wird.
  1044.                                  Das Fenster ist selbst zu öffnen.          */
  1045.     void   (*send_windClosed) (int wind_id);
  1046.                               /* Meldet das Fenster mit der Identifikation
  1047.                                  "wind_id" bei GEM-View ab, damit es bei
  1048.                                  der "Cycle Window"-Behandlung nun nicht
  1049.                                  mehr mitarbeitet wird.
  1050.                                  Das Fenster ist selbst zu öffnen.          */
  1051.     void   (*send_windTop)    (int wind_id);
  1052.                               /* Meldet das Fenster mit der Identifikation
  1053.                                  "wind_id" bei GEM-View als "getopped",
  1054.                                  damit die "Cycle Window"-Behandlung an-
  1055.                                  gepaßt werden kann.                        */
  1056.     void   (*send_windBottom) (int wind_id);
  1057.                               /* Meldet das Fenster mit der Identifikation
  1058.                                  "wind_id" bei GEM-View als "in-den-Hinter-
  1059.                                  grund-gebracht", damit die "Cycle Window"-
  1060.                                  Behandlung angepaßt werden kann.           */
  1061.   } diawin;
  1062.   struct {
  1063.     int    applicationID;     /* Enthält die appl_id von appl_init()        */
  1064.     int    gemview_vers;      /* Enthält die GEM-View Version 0x0300 (3.00) */
  1065.     int    tos_version;       /* Enthält die TOS Versionsnummer z.B. 0x0404 */
  1066.     int    aes_version;       /* Enthält die AES Versionsnummer z.B. 0x0340 */
  1067.     int    multi_task;        /* Enthält den Wert aus GemParBlk.global[1]   */
  1068.   } versions;
  1069. } SAVE_Structure;
  1070.  
  1071.  
  1072. PRINT-Struktur (für die externen Druck-Module von GEM-View3 *.GVP)
  1073. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  1074. Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
  1075. Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
  1076. Turbo C / Pure C.
  1077.  
  1078. typedef struct PRINT_Structure {
  1079.   long     identify;          /* GVWP_module  == 'GVWP' */
  1080.   int      version;           /* GVWP_Version == 0x0100 */
  1081.   Image   *image;             /* Zeiger auf "Image", das zu bearbeiten ist. */
  1082.   int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
  1083.   struct {
  1084.     int    (*open)            (char *file);
  1085.                               /* Öffnet die angegebene Datei, eine eventuell
  1086.                                  vorhandene Datei wird überschrieben.
  1087.                                  Für die paralelle Schnittstelle ist "PRN:"
  1088.                                  und für die serielle Schnittstelle ist "AUX:"
  1089.                                  zuverwenden.
  1090.                                  Rückgabewert ist ein positives Dateihandle.
  1091.                                  Im Fehlerfall wird ein negativer Wert
  1092.                                  zurückgegeben                              */
  1093.     ulong  (*write)           (int handle, ulong count, void *buf);
  1094.                               /* Schreibt "count" Bytes aus dem Buffer "buf"
  1095.                                  in die entsprechende Datei oder schickt die
  1096.                                  Daten zum Drucker. Ein Puffer von 8 Kilobyte
  1097.                                  ist zwischengeschaltet.
  1098.                                  Die Funktion liefert als Ergebnis die Anzahl
  1099.                                  der gespeicherten Bytes zurück oder 0 im
  1100.                                  Fehlerfall                                 */
  1101.     int    (*status)          (int handle);
  1102.                               /* Die Funktion überprüft, ob die Drucker-
  1103.                                  schnittstelle bereit ist, Zeichen anzunehmen.
  1104.                                  Die Funktion liefert als Ergebnis den
  1105.                                  Drucker-Status.
  1106.                                  Wenn der Drucker bereit ist, wird ein Wert
  1107.                                  ungleich 0 zurückgegeben, ansonsten eine 0.*/
  1108.     int    (*close)           (int handle);
  1109.                               /* Speichert bzw. druckt gegebenenfalls den
  1110.                                  Puffer ab und schließt die "Datei".
  1111.                                  Die Funktion liefert als Ergebnis eine 0,
  1112.                                  wenn die Datei geschlossen werden konnte,
  1113.                                  ansonsten eine negative Zahl.              */
  1114.   } output;
  1115.   struct {
  1116.     int    (*printout)        (const char* format, ...);
  1117.                               /* Schreibt eine Meldung in das Protokollfenster
  1118.                                  von GEM-View. Die Aufrufstruktur und die
  1119.                                  Parameter entsprechen "printf()" aus der
  1120.                                  C-Standard-Library.
  1121.                                  Folgende Sonderzeichen wurden verarbeitet:
  1122.                                  "\001" : Positioniere eine Zeile nach oben
  1123.                                  "\002" : Positioniere eine Spalte nach links
  1124.                                  "\033E": Lösche Protokollfenster (CLR-HOME)
  1125.                                  "\034\001": Schalte auf Fett-Schrift
  1126.                                  "\034\010": Schalte Unterstreichung ein
  1127.                                  "\034\011": Fett und Unterstreichung ein
  1128.                                  "\034\100": Auf Normalschrift schalten     */
  1129.   } print;
  1130.   struct {
  1131.     void   (*printerr)        (const char* format, ...);
  1132.                               /* Wie "printout" (siehe oben). Zusätzlich:
  1133.                                  - Der Text wird "Fett" ausgegeben.
  1134.                                  - Ist das Protokollfenster geschlossen, wird
  1135.                                    eine Alert-Box geöffnet.
  1136.                                  - Ist das Protokollfenster auf "klein" ge-
  1137.                                    schaltet, so wird das Fenster auf "groß"
  1138.                                    geschaltet und in den Vordergrund gebracht
  1139.                                  - Ist das Protokollfenster auf "groß" ge-
  1140.                                    schaltet, so wird das Fenster in den
  1141.                                    Vordergrund gebracht                     */
  1142.     void   (*userexit)        (void);
  1143.                               /* Wenn in einem Modul ein fatalen Fehler auf-
  1144.                                  tritt, kann die das Modul sofort verlassen
  1145.                                  werden. Aller angeforderter Speicher wird
  1146.                                  zurückgegeben. Allerdings sind vorher alle
  1147.                                  VDI-Worstations zu schließen und alle
  1148.                                  wind_updates() abzuschießen ...
  1149.                                  Sollte nur im schlimmsten Fall (und nur
  1150.                                  dann) verwendet werden.                    */
  1151.   } error;
  1152.   struct {
  1153.     byte  *(*malloc)          (ulong size);
  1154.                               /* Reserviert "size" Bytes dynamischen Speicher.
  1155.                                  Die Funktion verwaltet selbsttätig kleine
  1156.                                  Speicherblöcke in größeren "Clustern", um
  1157.                                  die Speicherfragmentierunggefahr etwas zu
  1158.                                  veringern. Verwenden Sie nur diese Funktion
  1159.                                  um Speicher dynamisch anzufordern.         */
  1160.     void   (*free)            (void *area);
  1161.                               /* Gibt den reservierten Speicher wieder frei.*/
  1162.   } memory;
  1163.   struct {
  1164.     void   (*evntHandle)      (int wait);
  1165.                               /* Läßt GEM-View "wait" Millisekunden Zeit um
  1166.                                  eine Nachricht entgegenzunehmen und sie dann
  1167.                                  abzuarbeiten. Wird nach "wait" Millisekunden
  1168.                                  keine Narchricht empfangen wird die Funktion
  1169.                                  wieder verlassen. Sehr praktisch um GEM-View
  1170.                                  ein paar Redraws und ähnliches machen zu
  1171.                                  lassen.                                    */
  1172.     void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1173.                               /* Verarbeitet ein Mausereignis, die Parameter
  1174.                                  ev_mx, ev_my, keystate, keypress entsprechen
  1175.                                  den Werten, die evnt_multi() liefert.
  1176.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1177.                                  In exit wird ein Wert ungleich 0 zurückge-
  1178.                                  geben, wenn das Modul seine Arbeit abbrechen
  1179.                                  soll. Dieses sollte so schnell wie möglich
  1180.                                  geschehen!                                 */
  1181.     void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
  1182.                               /* Verarbeitet ein Tastaturereignis, die Para-
  1183.                                  meter keystate, keypress entsprechen den
  1184.                                  Werten, die evnt_multi() liefert.
  1185.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1186.                                  In exit wird ein Wert ungleich 0 zurückge-
  1187.                                  geben, wenn das Modul seine Arbeit abbrechen
  1188.                                  soll. Dieses sollte so schnell wie möglich
  1189.                                  geschehen!                                 */
  1190.     void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
  1191.                               /* Verarbeitet ein Mausknopfereignis, die Para-
  1192.                                  meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
  1193.                                  keystate, keypress entsprechen den Werten,
  1194.                                  die evnt_multi() liefert.
  1195.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1196.                                  In exit wird ein Wert ungleich 0 zurückge-
  1197.                                  geben, wenn das Modul seine Arbeit abbrechen
  1198.                                  soll. Dieses sollte so schnell wie möglich
  1199.                                  geschehen!                                 */
  1200.     void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1201.                               /* Verarbeitet ein Messageereignis, die Para-
  1202.                                  meter msg, ev_mx, ev_my, keystate, keypress
  1203.                                  entsprechen den Werten, die evnt_multi()
  1204.                                  liefert.
  1205.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1206.                                  In exit wird ein Wert ungleich 0 zurückge-
  1207.                                  geben, wenn das Modul seine Arbeit abbrechen
  1208.                                  soll. Dieses sollte so schnell wie möglich
  1209.                                  geschehen!                                 */
  1210.     void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
  1211.                               /* Verarbeitet ein Zeitereignis, die Parameter
  1212.                                  ev_mx, ev_my, keystate, keypress, ev_mbutton
  1213.                                  entsprechen den Werten die evnt_multi()
  1214.                                  liefert.
  1215.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1216.                                  In exit wird ein Wert ungleich 0 zurückge-
  1217.                                  geben, wenn das Modul seine Arbeit abbrechen
  1218.                                  soll. Dieses sollte so schnell wie möglich
  1219.                                  geschehen!                                 */
  1220.                               */
  1221.     int    (*alert)           (int button, const char *astring);
  1222.                               /* Die Funktion entspricht exakt form_alert().*/
  1223.   } events;
  1224.   struct {
  1225.     void   (*reset_dialogCol) (int flag);
  1226.                               /* Setzt die Desktopfarben (0 bis 15) wieder
  1227.                                  auf den ursprünglichen Wert zurück, nachdem
  1228.                                  die Bildfarben gesichert wurden (flag = 1).
  1229.                                  Restauriert die Bildfarben wieder, wenn
  1230.                                  "flag" auf 0 gesetzt ist.
  1231.                                  Die Funktion erlaubt einen verschachtelten
  1232.                                  Aufruf und sollte vor und nach jedem Dialog
  1233.                                  aufgerufen werden. Beachten Sie auch die
  1234.                                  Richtlinie von ATARI "Abschließende Worte" */
  1235.     void   (*send_windOpen)   (int wind_id);
  1236.                               /* Meldet das Fenster mit der Identifikation
  1237.                                  "wind_id" bei GEM-View an, damit es bei
  1238.                                  der "Cycle Window"-Behandlung mitbehandelt
  1239.                                  wird.
  1240.                                  Das Fenster ist selbst zu öffnen.          */
  1241.     void   (*send_windClosed) (int wind_id);
  1242.                               /* Meldet das Fenster mit der Identifikation
  1243.                                  "wind_id" bei GEM-View ab, damit es bei
  1244.                                  der "Cycle Window"-Behandlung nun nicht
  1245.                                  mehr mitarbeitet wird.
  1246.                                  Das Fenster ist selbst zu öffnen.          */
  1247.     void   (*send_windTop)    (int wind_id);
  1248.                               /* Meldet das Fenster mit der Identifikation
  1249.                                  "wind_id" bei GEM-View als "getopped",
  1250.                                  damit die "Cycle Window"-Behandlung an-
  1251.                                  gepaßt werden kann.                        */
  1252.     void   (*send_windBottom) (int wind_id);
  1253.                               /* Meldet das Fenster mit der Identifikation
  1254.                                  "wind_id" bei GEM-View als "in-den-Hinter-
  1255.                                  grund-gebracht", damit die "Cycle Window"-
  1256.                                  Behandlung angepaßt werden kann.           */
  1257.   } diawin;
  1258.   struct {
  1259.     int    applicationID;     /* Enthält die appl_id von appl_init()        */
  1260.     int    gemview_vers;      /* Enthält die GEM-View Version 0x0300 (3.00) */
  1261.     int    tos_version;       /* Enthält die TOS Versionsnummer z.B. 0x0404 */
  1262.     int    aes_version;       /* Enthält die AES Versionsnummer z.B. 0x0340 */
  1263.     int    multi_task;        /* Enthält den Wert aus GemParBlk.global[1]   */
  1264.   } versions;
  1265. } PRINT_Structure;
  1266.  
  1267.  
  1268. PROC-Struktur (für die externen Bearbeitungs-Module von GEM-View3 *.GVR)
  1269. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  1270. Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
  1271. Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
  1272. Turbo C / Pure C.
  1273.  
  1274. typedef struct PROC_Structure {
  1275.   long     identify;          /* GVWR_module  == 'GVWR' */
  1276.   int      version;           /* GVWR_Version == 0x0100 */
  1277.   Image   *image;             /* Zeiger auf "Image",das gedruckt werden soll*/
  1278.   int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
  1279.   struct {
  1280.     int    (*printout)        (const char* format, ...);
  1281.                               /* Schreibt eine Meldung in das Protokollfenster
  1282.                                  von GEM-View. Die Aufrufstruktur und die
  1283.                                  Parameter entsprechen "printf()" aus der
  1284.                                  C-Standard-Library.
  1285.                                  Folgende Sonderzeichen wurden verarbeitet:
  1286.                                  "\001" : Positioniere eine Zeile nach oben
  1287.                                  "\002" : Positioniere eine Spalte nach links
  1288.                                  "\033E": Lösche Protokollfenster (CLR-HOME)
  1289.                                  "\034\001": Schalte auf Fett-Schrift
  1290.                                  "\034\010": Schalte Unterstreichung ein
  1291.                                  "\034\011": Fett und Unterstreichung ein
  1292.                                  "\034\100": Auf Normalschrift schalten     */
  1293.   } print;
  1294.   struct {
  1295.     void   (*printerr)        (const char* format, ...);
  1296.                               /* Wie "printout" (siehe oben). Zusätzlich:
  1297.                                  - Der Text wird "Fett" ausgegeben.
  1298.                                  - Ist das Protokollfenster geschlossen, wird
  1299.                                    eine Alert-Box geöffnet.
  1300.                                  - Ist das Protokollfenster auf "klein" ge-
  1301.                                    schaltet, so wird das Fenster auf "groß"
  1302.                                    geschaltet und in den Vordergrund gebracht
  1303.                                  - Ist das Protokollfenster auf "groß" ge-
  1304.                                    schaltet, so wird das Fenster in den
  1305.                                    Vordergrund gebracht                     */
  1306.     void   (*userexit)        (void);
  1307.                               /* Wenn in einem Modul ein fatalen Fehler auf-
  1308.                                  tritt, kann die das Modul sofort verlassen
  1309.                                  werden. Aller angeforderter Speicher wird
  1310.                                  zurückgegeben. Allerdings sind vorher alle
  1311.                                  VDI-Worstations zu schließen und alle
  1312.                                  wind_updates() abzuschießen ...
  1313.                                  Sollte nur im schlimmsten Fall (und nur
  1314.                                  dann) verwendet werden.                    */
  1315.   } error;
  1316.   struct {
  1317.     byte  *(*malloc)          (ulong size);
  1318.                               /* Reserviert "size" Bytes dynamischen Speicher.
  1319.                                  Die Funktion verwaltet selbsttätig kleine
  1320.                                  Speicherblöcke in größeren "Clustern", um
  1321.                                  die Speicherfragmentierunggefahr etwas zu
  1322.                                  veringern. Verwenden Sie nur diese Funktion
  1323.                                  um Speicher dynamisch anzufordern.         */
  1324.     void   (*free)            (void *area);
  1325.                               /* Gibt den reservierten Speicher wieder frei.*/
  1326.   } memory;
  1327.   struct {
  1328.     Image *(*newBitImage)     (char *title, unsigned int width, unsigned int height);
  1329.                               /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
  1330.                                  Erzeugt und initialisiert eine "Image"-
  1331.                                  Struktur, wobei der Pfadname oder NULL über
  1332.                                  den Parameter "title" übergeben werden kann.
  1333.                                  Für den Datenbreich wird eine Bitplane mit
  1334.                                  alignwidth (auf 16 begradigtes "width") mal
  1335.                                  "height" reserviert.
  1336.                                  In "image->unalignwidth" wird "width" ein-
  1337.                                  getragen. "alignwidth" wird in "->width"
  1338.                                  eingetragen.
  1339.                                  Das Bild ist IMMER auf Worte begradigt auf-
  1340.                                  gebaut und ist auch so wieder aufzubauen.  */
  1341.     Image *(*newRGBImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
  1342.                               /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
  1343.                                  Erzeugt und initialisiert eine "Image"-
  1344.                                  Struktur, wobei der Pfadname oder NULL über
  1345.                                  den Parameter "title" übergeben werden kann.
  1346.                                  Für den Datenbreich werden "depth" Bitplanes
  1347.                                  mit alignwidth (auf 16 begradigtes "width")
  1348.                                  mal "height" reserviert. Zur Aufnahme des
  1349.                                  GEM-Standard-Formats.
  1350.                                  In "image->unalignwidth" wird "width" ein-
  1351.                                  getragen. "alignwidth" wird in "->width"
  1352.                                  eingetragen.
  1353.                                  Das Bild ist IMMER auf Worte begradigt auf-
  1354.                                  gebaut und ist auch so wieder aufzubauen.  */
  1355.     Image *(*newTCImage)      (char *title, unsigned int width, unsigned int height);
  1356.                               /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
  1357.                                  Erzeugt und initialisiert eine "Image"-
  1358.                                  Struktur, wobei der Pfadname oder NULL über
  1359.                                  den Parameter "title" übergeben werden kann.
  1360.                                  Für den Datenbreich werden alignwidth (auf
  1361.                                  16 begradigtes "width") mal "height" viele
  1362.                                  RGB-Tripel reserviert.
  1363.                                  In "image->unalignwidth" wird "width" ein-
  1364.                                  getragen. "alignwidth" wird in "->width"
  1365.                                  eingetragen.
  1366.                                  Das Bild ist IMMER auf Worte begradigt auf-
  1367.                                  gebaut und ist auch so wieder aufzubauen.  */
  1368.     Image *(*newGEMImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
  1369.                               /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
  1370.                                  Erzeugt und initialisiert eine "Image"-
  1371.                                  Struktur, wobei der Pfadname oder NULL über
  1372.                                  den Parameter "title" übergeben werden kann.
  1373.                                  Für den Datenbreich werden "depth" Bitplanes
  1374.                                  mit alignwidth (auf 16 begradigtes "width")
  1375.                                  mal "height" reserviert. Zur Aufnahme des
  1376.                                  GEM-Standard-Formats.
  1377.                                  In "image->unalignwidth" wird "width" ein-
  1378.                                  getragen. "alignwidth" wird in "->width"
  1379.                                  eingetragen.
  1380.                                  Das Bild ist IMMER auf Worte begradigt auf-
  1381.                                  gebaut und ist auch so wieder aufzubauen.  */
  1382.     void   (*freeGVImage)     (Image *image);
  1383.                               /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
  1384.                                  Gibt die reservierten Strukturen wieder frei,
  1385.                                  wenn zum Beispiel während der Umwandlung
  1386.                                  etwas unvorhergesehenes passiert.
  1387.                                  Das Bild, welches dem Bearbeitungsmodul
  1388.                                  übergeben wird von GEM-View aus dem Speicher
  1389.                                  entfernt und darf nicht vom Modul gelöscht
  1390.                                  werden.                                    */
  1391.   } images;
  1392.   struct {
  1393.     void   (*evntHandle)      (int wait);
  1394.                               /* Läßt GEM-View "wait" Millisekunden Zeit um
  1395.                                  eine Nachricht entgegenzunehmen und sie dann
  1396.                                  abzuarbeiten. Wird nach "wait" Millisekunden
  1397.                                  keine Narchricht empfangen wird die Funktion
  1398.                                  wieder verlassen. Sehr praktisch um GEM-View
  1399.                                  ein paar Redraws und ähnliches machen zu
  1400.                                  lassen.                                    */
  1401.     void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1402.                               /* Verarbeitet ein Mausereignis, die Parameter
  1403.                                  ev_mx, ev_my, keystate, keypress entsprechen
  1404.                                  den Werten, die evnt_multi() liefert.
  1405.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1406.                                  In exit wird ein Wert ungleich 0 zurückge-
  1407.                                  geben, wenn das Modul seine Arbeit abbrechen
  1408.                                  soll. Dieses sollte so schnell wie möglich
  1409.                                  geschehen!                                 */
  1410.     void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
  1411.                               /* Verarbeitet ein Tastaturereignis, die Para-
  1412.                                  meter keystate, keypress entsprechen den
  1413.                                  Werten, die evnt_multi() liefert.
  1414.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1415.                                  In exit wird ein Wert ungleich 0 zurückge-
  1416.                                  geben, wenn das Modul seine Arbeit abbrechen
  1417.                                  soll. Dieses sollte so schnell wie möglich
  1418.                                  geschehen!                                 */
  1419.     void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
  1420.                               /* Verarbeitet ein Mausknopfereignis, die Para-
  1421.                                  meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
  1422.                                  keystate, keypress entsprechen den Werten,
  1423.                                  die evnt_multi() liefert.
  1424.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1425.                                  In exit wird ein Wert ungleich 0 zurückge-
  1426.                                  geben, wenn das Modul seine Arbeit abbrechen
  1427.                                  soll. Dieses sollte so schnell wie möglich
  1428.                                  geschehen!                                 */
  1429.     void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1430.                               /* Verarbeitet ein Messageereignis, die Para-
  1431.                                  meter msg, ev_mx, ev_my, keystate, keypress
  1432.                                  entsprechen den Werten, die evnt_multi()
  1433.                                  liefert.
  1434.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1435.                                  In exit wird ein Wert ungleich 0 zurückge-
  1436.                                  geben, wenn das Modul seine Arbeit abbrechen
  1437.                                  soll. Dieses sollte so schnell wie möglich
  1438.                                  geschehen!                                 */
  1439.     void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
  1440.                               /* Verarbeitet ein Zeitereignis, die Parameter
  1441.                                  ev_mx, ev_my, keystate, keypress, ev_mbutton
  1442.                                  entsprechen den Werten die evnt_multi()
  1443.                                  liefert.
  1444.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1445.                                  In exit wird ein Wert ungleich 0 zurückge-
  1446.                                  geben, wenn das Modul seine Arbeit abbrechen
  1447.                                  soll. Dieses sollte so schnell wie möglich
  1448.                                  geschehen!                                 */
  1449.                               */
  1450.     int    (*alert)           (int button, const char *astring);
  1451.                               /* Die Funktion entspricht exakt form_alert().*/
  1452.   } events;
  1453.   struct {
  1454.     void   (*reset_dialogCol) (int flag);
  1455.                               /* Setzt die Desktopfarben (0 bis 15) wieder
  1456.                                  auf den ursprünglichen Wert zurück, nachdem
  1457.                                  die Bildfarben gesichert wurden (flag = 1).
  1458.                                  Restauriert die Bildfarben wieder, wenn
  1459.                                  "flag" auf 0 gesetzt ist.
  1460.                                  Die Funktion erlaubt einen verschachtelten
  1461.                                  Aufruf und sollte vor und nach jedem Dialog
  1462.                                  aufgerufen werden. Beachten Sie auch die
  1463.                                  Richtlinie von ATARI "Abschließende Worte" */
  1464.     void   (*send_windOpen)   (int wind_id);
  1465.                               /* Meldet das Fenster mit der Identifikation
  1466.                                  "wind_id" bei GEM-View an, damit es bei
  1467.                                  der "Cycle Window"-Behandlung mitbehandelt
  1468.                                  wird.
  1469.                                  Das Fenster ist selbst zu öffnen.          */
  1470.     void   (*send_windClosed) (int wind_id);
  1471.                               /* Meldet das Fenster mit der Identifikation
  1472.                                  "wind_id" bei GEM-View ab, damit es bei
  1473.                                  der "Cycle Window"-Behandlung nun nicht
  1474.                                  mehr mitarbeitet wird.
  1475.                                  Das Fenster ist selbst zu öffnen.          */
  1476.     void   (*send_windTop)    (int wind_id);
  1477.                               /* Meldet das Fenster mit der Identifikation
  1478.                                  "wind_id" bei GEM-View als "getopped",
  1479.                                  damit die "Cycle Window"-Behandlung an-
  1480.                                  gepaßt werden kann.                        */
  1481.     void   (*send_windBottom) (int wind_id);
  1482.                               /* Meldet das Fenster mit der Identifikation
  1483.                                  "wind_id" bei GEM-View als "in-den-Hinter-
  1484.                                  grund-gebracht", damit die "Cycle Window"-
  1485.                                  Behandlung angepaßt werden kann.           */
  1486.   } diawin;
  1487.   struct {
  1488.     int    applicationID;     /* Enthält die appl_id von appl_init()        */
  1489.     int    gemview_vers;      /* Enthält die GEM-View Version 0x0300 (3.00) */
  1490.     int    tos_version;       /* Enthält die TOS Versionsnummer z.B. 0x0404 */
  1491.     int    aes_version;       /* Enthält die AES Versionsnummer z.B. 0x0340 */
  1492.     int    multi_task;        /* Enthält den Wert aus GemParBlk.global[1]   */
  1493.   } versions;
  1494. } PROC_Structure;
  1495.  
  1496.  
  1497. CONV-Struktur (für das externe Konvertierungs-Module von GEM-View3)
  1498. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  1499. Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
  1500. Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
  1501. Turbo C / Pure C.
  1502.  
  1503. typedef struct CONV_Structure {
  1504.   long     identify;          /* GVWC_module  == 'GVWC' */
  1505.   int      version;           /* GVWC_Version == 0x0100 */
  1506.   int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
  1507.   struct {
  1508.     byte  *(*malloc)          (ulong size);
  1509.                               /* Reserviert "size" Bytes dynamischen Speicher.
  1510.                                  Die Funktion verwaltet selbsttätig kleine
  1511.                                  Speicherblöcke in größeren "Clustern", um
  1512.                                  die Speicherfragmentierunggefahr etwas zu
  1513.                                  veringern. Verwenden Sie nur diese Funktion
  1514.                                  um Speicher dynamisch anzufordern.         */
  1515.     void   (*free)            (void *area);
  1516.                               /* Gibt den reservierten Speicher wieder frei.*/
  1517.   } memory;
  1518.   struct {
  1519.     void   (*evntHandle)      (int wait);
  1520.                               /* Läßt GEM-View "wait" Millisekunden Zeit um
  1521.                                  eine Nachricht entgegenzunehmen und sie dann
  1522.                                  abzuarbeiten. Wird nach "wait" Millisekunden
  1523.                                  keine Narchricht empfangen wird die Funktion
  1524.                                  wieder verlassen. Sehr praktisch um GEM-View
  1525.                                  ein paar Redraws und ähnliches machen zu
  1526.                                  lassen.                                    */
  1527.     void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1528.                               /* Verarbeitet ein Mausereignis, die Parameter
  1529.                                  ev_mx, ev_my, keystate, keypress entsprechen
  1530.                                  den Werten, die evnt_multi() liefert.
  1531.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1532.                                  In exit wird ein Wert ungleich 0 zurückge-
  1533.                                  geben, wenn das Modul seine Arbeit abbrechen
  1534.                                  soll. Dieses sollte so schnell wie möglich
  1535.                                  geschehen!                                 */
  1536.     void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
  1537.                               /* Verarbeitet ein Tastaturereignis, die Para-
  1538.                                  meter keystate, keypress entsprechen den
  1539.                                  Werten, die evnt_multi() liefert.
  1540.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1541.                                  In exit wird ein Wert ungleich 0 zurückge-
  1542.                                  geben, wenn das Modul seine Arbeit abbrechen
  1543.                                  soll. Dieses sollte so schnell wie möglich
  1544.                                  geschehen!                                 */
  1545.     void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
  1546.                               /* Verarbeitet ein Mausknopfereignis, die Para-
  1547.                                  meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
  1548.                                  keystate, keypress entsprechen den Werten,
  1549.                                  die evnt_multi() liefert.
  1550.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1551.                                  In exit wird ein Wert ungleich 0 zurückge-
  1552.                                  geben, wenn das Modul seine Arbeit abbrechen
  1553.                                  soll. Dieses sollte so schnell wie möglich
  1554.                                  geschehen!                                 */
  1555.     void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1556.                               /* Verarbeitet ein Messageereignis, die Para-
  1557.                                  meter msg, ev_mx, ev_my, keystate, keypress
  1558.                                  entsprechen den Werten, die evnt_multi()
  1559.                                  liefert.
  1560.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1561.                                  In exit wird ein Wert ungleich 0 zurückge-
  1562.                                  geben, wenn das Modul seine Arbeit abbrechen
  1563.                                  soll. Dieses sollte so schnell wie möglich
  1564.                                  geschehen!                                 */
  1565.     void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
  1566.                               /* Verarbeitet ein Zeitereignis, die Parameter
  1567.                                  ev_mx, ev_my, keystate, keypress, ev_mbutton
  1568.                                  entsprechen den Werten die evnt_multi()
  1569.                                  liefert.
  1570.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1571.                                  In exit wird ein Wert ungleich 0 zurückge-
  1572.                                  geben, wenn das Modul seine Arbeit abbrechen
  1573.                                  soll. Dieses sollte so schnell wie möglich
  1574.                                  geschehen!                                 */
  1575.                               */
  1576.     int    (*alert)           (int button, const char *astring);
  1577.                               /* Die Funktion entspricht exakt form_alert().*/
  1578.   } events;
  1579.   struct {
  1580.     void   (*reset_dialogCol) (int flag);
  1581.                               /* Setzt die Desktopfarben (0 bis 15) wieder
  1582.                                  auf den ursprünglichen Wert zurück, nachdem
  1583.                                  die Bildfarben gesichert wurden (flag = 1).
  1584.                                  Restauriert die Bildfarben wieder, wenn
  1585.                                  "flag" auf 0 gesetzt ist.
  1586.                                  Die Funktion erlaubt einen verschachtelten
  1587.                                  Aufruf und sollte vor und nach jedem Dialog
  1588.                                  aufgerufen werden. Beachten Sie auch die
  1589.                                  Richtlinie von ATARI "Abschließende Worte" */
  1590.     void   (*send_windOpen)   (int wind_id);
  1591.                               /* Meldet das Fenster mit der Identifikation
  1592.                                  "wind_id" bei GEM-View an, damit es bei
  1593.                                  der "Cycle Window"-Behandlung mitbehandelt
  1594.                                  wird.
  1595.                                  Das Fenster ist selbst zu öffnen.          */
  1596.     void   (*send_windClosed) (int wind_id);
  1597.                               /* Meldet das Fenster mit der Identifikation
  1598.                                  "wind_id" bei GEM-View ab, damit es bei
  1599.                                  der "Cycle Window"-Behandlung nun nicht
  1600.                                  mehr mitarbeitet wird.
  1601.                                  Das Fenster ist selbst zu öffnen.          */
  1602.     void   (*send_windTop)    (int wind_id);
  1603.                               /* Meldet das Fenster mit der Identifikation
  1604.                                  "wind_id" bei GEM-View als "getopped",
  1605.                                  damit die "Cycle Window"-Behandlung an-
  1606.                                  gepaßt werden kann.                        */
  1607.     void   (*send_windBottom) (int wind_id);
  1608.                               /* Meldet das Fenster mit der Identifikation
  1609.                                  "wind_id" bei GEM-View als "in-den-Hinter-
  1610.                                  grund-gebracht", damit die "Cycle Window"-
  1611.                                  Behandlung angepaßt werden kann.           */
  1612.     int    (*getMSaving)      (char *title, char *extention, char *name, char *filename);
  1613.                               /* Führt einen Benutzerdialog zur Auswahl eines
  1614.                                  monochromen Speicherformats.
  1615.                                  Der Text "title" wird im Dialog eingetragen.
  1616.                                  In "extention" wird die übliche Dateiendung
  1617.                                  (6 Bytes), in "name" der Name des Formates
  1618.                                  (18 Bytes) und in "filename" der Modulname
  1619.                                  (14 Bytes) zurückgebenen. Als Funktionswert
  1620.                                  erhält man einen Wert ungleich 0, wenn die
  1621.                                  Werte gültig sind, ansonsten 0.            */
  1622.     int    (*getCSaving)      (char *title, char *extention, char *name, char *filename);
  1623.                               /* Führt einen Benutzerdialog zur Auswahl eines
  1624.                                  farbigen Speicherformats.
  1625.                                  Der Text "title" wird im Dialog eingetragen.
  1626.                                  In "extention" wird die übliche Dateiendung
  1627.                                  (6 Bytes), in "name" der Name des Formates
  1628.                                  (18 Bytes) und in "filename" der Modulname
  1629.                                  (14 Bytes) zurückgebenen. Als Funktionswert
  1630.                                  erhält man einen Wert ungleich 0, wenn die
  1631.                                  Werte gültig sind, ansonsten 0.            */
  1632.     int    (*getTSaving)      (char *title, char *extention, char *name, char *filename);
  1633.                               /* Führt einen Benutzerdialog zur Auswahl eines
  1634.                                  True-Color Speicherformats.
  1635.                                  Der Text "title" wird im Dialog eingetragen.
  1636.                                  In "extention" wird die übliche Dateiendung
  1637.                                  (6 Bytes), in "name" der Name des Formates
  1638.                                  (18 Bytes) und in "filename" der Modulname
  1639.                                  (14 Bytes) zurückgebenen. Als Funktionswert
  1640.                                  erhält man einen Wert ungleich 0, wenn die
  1641.                                  Werte gültig sind, ansonsten 0.            */
  1642.   } diawin;
  1643.   struct {
  1644.     int    applicationID;     /* Enthält die appl_id von appl_init()        */
  1645.     int    gemview_vers;      /* Enthält die GEM-View Version 0x0300 (3.00) */
  1646.     int    tos_version;       /* Enthält die TOS Versionsnummer z.B. 0x0404 */
  1647.     int    aes_version;       /* Enthält die AES Versionsnummer z.B. 0x0340 */
  1648.     int    multi_task;        /* Enthält den Wert aus GemParBlk.global[1]   */
  1649.   } versions;
  1650. } CONV_Structure;
  1651.  
  1652.  
  1653. Entwickler-Support
  1654. """"""""""""""""""
  1655. Bei Fragen zur Modulprogrammierung kann ich am Samstags zwischen
  1656. 14:00 und 16:00 Uhr angerufen werden.
  1657. Dies gilt ausschließlich für Fragen zur Modulprogrammierung, quasi
  1658. ein Entwickler-Support ;-)