&d2D Entwicklerinformationen zu MegaPaint Professional Version 3.00 &d@

&d1D Externe Module &d@

MegaPaint Professional untersttzt ab der Version 3.00 externe Module. Dieses
sind eigenstndige Programme, die aus MegaPaint aufgerufen werden und
direkten Zugriff auf die wichtigsten Variablen und smtliche Datenbereiche
von MegaPaint haben. Der Aufbau der hierzu notwendigen Informations- und
Programmdateien wird beispielhaft anhand der mitgelieferten Sourcecodes
(MAKE_MOD.C, MEGA_01.C) erlutert.

Um zu ermglichen, da MegaPaint ein Modul aufrufen kann, mssen die dazu-
gehrige Informations- und Programmdatei vor dem Start des Programms in den
Ordner MODUL im MEGPAINT-Ordner kopiert werden.

Ein Modul besteht aus zwei Dateien:

&d1D MEGA_??.MOD - Die Informationsdatei &d@

In dieser Datei befinden sich alle Informationen, die das Hauptprogramm ber
das Modul besitzen mu. Die Datei hat folgende C-Struktur:
(s3B
  typedef struct {
    char        kennung[8];           // $07 4d 4f 44 20 33 2e 30 = 'MOD 3.0'
    long        memory;               // Fr das Modul bentigter Speicher
    char        name[32];             // Namenseintrag im Men
    short       anz;                  // Anzahl bentigter Dateinamen
    char        files[8][8];          // Endungen fr die Dateinamen
    short       types[8];             // Typen fr die Dateinamen
    char        texts[8][128];        // berschriften fr GET_FILENAME
    short       num;                  // $0000 = Reserviert
  } MOD_FORMAT;
(s0B
(s1S- Memory(s0S

MEMORY gibt die Gre des fr das Modul bentigten Arbeitsspeichers an. Sind
mehrere Module vorhanden, hlt MegaPaint das Maximum der verschiedenen Memory-
Werte frei.

(s1S- Name(s0S

NAME ist die Bezeichnung des Moduls, die in MegaPaint im Untermen zur Funktion
EXTERNES MODUL erscheint (z.B. 'Konverter VEK <-> HPGL').

(s1S- Anz(s0S

ANZ gibt die Anzahl an Dateinamen an, die MegaPaint vor dem Aufruf des Moduls
abfragen und an dieses bergeben soll. Dies wurde ermglicht, damit nicht jedes
Modul die Dateiauswahlbox selbst implementieren mu. Es knnen maximal 8 Datei-
namen angefordert werden.

(s1S- Files(s0S

FILES gibt fr jeden der Dateinamen die Endung an, die in der Dateiauswahlbox
benutzt werden soll (z.B. '.VEK' oder '.GEM', siehe TYPES).

(s1S- Types(s0S

TYPES gibt fr jeden der Dateinamen den Dateityp an. Es gibt dabei drei Mglich-
keiten:

  0 - Beliebige Endung
  1 - Gegebene Endung vorgeschrieben, wird wenn ntig angehngt
  2 - Endung *.BLD oder *.BL1 vorgeschrieben

(s1S- Texts(s0S

TEXTS gibt fr jeden der Dateinamen die berschrift an, die in der Dateiaus-
wahlbox verwendet werden soll (z.B. 'HGPL-Datei speichern').

&d1D MEGA_??.PRG - Die Programmdatei &d@

Diese Datei ist das eigentliche Modul. Es mu sich hierbei immer um eine GEM-
Programmdatei mit der Endung *.PRG handeln. Sollte dieses Modul eine eigene
GEM-Menzeile benutzen, so ist diese vor der Rckkehr ins Hauptprogramm unbe-
dingt abzumelden!

Beim Aufruf des Moduls bleibt der Bildschirm unverndert, d.h. er zeigt den
MegaPaint-Schreibtisch, entweder den des Vektorteils oder den des Rasterteils.
Der Bildschirm kann vom Modul beliebig verndert werden, jedoch darf in keinem
Fall der Inhalt der zur Verfgung gestellten Maus- und Konstantenblcke vern-
dert werden! 
Die Maus ist eingeschaltet und als Diskette dargestellt. Nach der Rckkehr aus
dem Modul wird der Bildschirm komplett neu aufgebaut, der Mauszeiger wird neu
initialisiert.

Das Modul sollte als Rckgabewert (per PTERM) eine Null zurckgeben, wenn es
korrekt ausgefhrt werden konnte, oder eine der Standard-GEMDOS-Meldungen
(z.B. -39 = Nicht gengend Speicher).

Das Programm wird von MegaPaint aus mit einer Kommandozeile aufgerufen, die
wie folgt aussieht: 'MP 0000000000'. Die zehn Nullen stehen fr eine zehn-
stellige OCTAL-Zahl, die die Adresse eines Datenblockes angibt, in dem nhere
Informationen zum Status von MegaPaint, sowie die Adressen einiger wichtiger
Routinen abgefragt werden knnen. Dieser Datenblock hat folgende C-Struktur:
(s3B
  typedef struct {
    char        kennung[8];     // $07 50 52 47 20 33 2e 30 = 'PRG 3.0'
    void        *maus1,         // Startadresse des Mausdatenblockes 1
                *maus2,         // Startadresse des Mausdatenblockes 2
                *maus3;         // Startadresse des Mausdatenblockes 3
    BLOCK1      *block1;        // Startadresse des Konstantenblockes 1 
    BLOCK2      *block2;        // Startadresse des Konstantenblockes 2 
    BLOCK3      *block3;        // Startadresse des Konstantenblockes 3 
    void        *pat,           // Adresse der Fll- und Linienmuster  
                *names;         // Adresse der bergebenen Dateinamen   
  } DATENBLOCK;
(s0B
(s1S- Maus 1 ... Maus 3(s0S

Diese Zeiger zeigen auf drei Mausbeschreibungsblcke, die direkt an GRAF_MOUSE
(AES 78) bergeben werden knnen. Es sind folgende Formen vorhanden:

  Maus 1 - Sanduhr
  Maus 2 - Diskette
  Maus 3 - Drucker

Diese Mausformen sollten nach Mglichkeit quivalent zu MegaPaint weiterver-
wendet werden.

(s1S- Block 1(s0S
(s3B
  typedef struct {
    short       window_x1,      // Obere linke Ecke des Arbeitsfensters
                window_y1,
                window_x2,      // Untere rechte Ecke des Arbeitsfensters
                window_y2,          
                window_xb,      // Breite des Fensters in Bytes
                window_xl,      // Breite des Fensters in Langworten
                window_xs,      // Breite des Fensters in Pixeln
                window_ys,      // Hhe des Fensters in Pixeln
                        
                scr_dx,         // Bildschirmbreite in Pixeln
                scr_dy,         // Bildschirmhhe in Pixeln
                scr_byte;       // Bildschirmbreite in Bytes
                        
    void        *line_a;        // Zeiger auf LINE A Parameterblock
  } BLOCK1;
(s0B
(s1S- Block 2(s0S
(s3B
  typedef struct {
    void        *sv,            // Zeiger auf ersten 32K-Puffer
                *sv2,           // Zeiger auf zweiten 32K-Puffer
                *scr,           // Zeiger auf Bildschirm (LOGBASE)
                *scr2,          // Zeiger auf obere linke Ecke des Arbeitsfensters
                *scr3,          // Zeiger auf Minilupe
                *zp,            // Zeiger auf Zeichensatzdaten

                *pp,            // Zeiger auf aktuelles Bild
                (*pics)[4],     // Zeiger auf maximal vier Bilder
                *bp,            // Zeiger auf den Puffer

                *vekanf,        // Zeiger auf Vektordatenfeld
                *vekakt,        // Zeiger aktuelles Vektordatenende
                *vekend,        // Zeiger absolutes Vektordatenende

                (*zchs)[8],     // Zeiger auf maximal acht Zeichenstze
                *zchakt,        // Zeiger aktuelles Zeichensatzende
                *zchend,        // Zeiger absolutes Zeichensatzende

                (*syms)[8],     // Zeiger auf maximal acht Symboltabellen
                *symakt,        // Zeiger aktuelles Rastersymbolende
                *symend,        // Zeiger absolutes Rastersymbolende

                (*v_syms)[8],   // Zeiger auf maximal acht Symboltabellen
                *v_symakt,      // Zeiger aktuelles Vektorsymbolende
                *v_symend,      // Zeiger absolutes Vektorsymbolende
  } BLOCK2;
(s0B
Die Speicherblcke SV und SV2 werden in MegaPaint z.B. als Bildschirmspeicher
bei der Fensterverwaltung oder als Cache verwendet. Sie knnen vom Modul be-
nutzt und beliebig verndert werden.

SCR zeigt auf das oberste linke Byte des Bildschirms, SCR2 zeigt auf das oberste
linke Byte des Bildausschnittes.

ZP zeigt auf die Zeichensatzdaten. Es liegen drei Zeichenstze a 256 Zeichen
vor. Jeweils 16 aufeinanderfolgende Bytes ergeben ein Zeichen. Der erste Satz
ist Normal, der zweite (s3BFett(s0B und der dritte (s1SKursiv(s0S.

Bei den Zeigern auf Bilder (PICS) und auf Vektorsymbole (V_SYMS) knnen einzelne
Zeiger nicht initialisiert sein, sie haben dann den Wert $00000000.

Das speicherinterne Format von Zeichenstzen und beiden Symboldateien ist iden-
tisch mit dem Dateiformat (inklusive des Headers!). Die Vektorobjekte besitzen
keinen Header, sondern fangen sofort mit dem ersten Objekt an.

(s1S- Block 3(s0S
(s3B
  typedef struct {
    long        total8;         // Bentigter Speicher fr ein Bild

    long        len8,           // Bildgre  in Bytes
                len32;          // Bildgre  in Langworten
    short       xmax,           // Bildbreite in Pixeln-1
                xsize,          // Bildbreite in Pixeln
                xsize8,         // Bildbreite in Bytes-1
                xsize16,        // Bildbreite in Worten-1
                xsize32,        // Bildbreite in Langworten-1
                xbyte,          // Bildbreite in Bytes
                xbyte2,         // Bildbreite in Bytes*2
                xword           // Bildbreite in Worten
                xlong           // Bildbreite in Langworten
                ymax            // Bildhhe   in Pixeln-1
                ysize;          // Bildhhe   in Pixeln

    long        blen32;         // Puffergre in Langworten
    short       blkmax,         // Pufferhhe  in Pixeln-1
                blklen;         // Pufferhhe  in Pixeln
  } BLOCK3;
(s0B

(s1S- Pat(s0S

PAT zeigt auf eine Datenfeld mit den Fll- und Linienmustern von MegaPaint. Das
Datenfeld hat das gleiche Format wie das zugehrige Dateiformat (inklusive
Header!).

(s1S- Names(s0S

NAMES zeigt auf ein Feld von maximal 8 Strings, jeder String ist 128 Bytes
lang. Diese Strings sind die angeforderten Dateinamen, die in MegaPaint mit
Hilfe der dortigen Dateiauswahlbox eingegeben wurden. Die Anzahl der Strings
hngt von der angeforderten Anzahl ab (siehe MEGA_??.MOD).


(s3B&d1DAchtung !!!&d@ 
Die hier verwendeten Zeichenketten sind keine C-Strings (durch \0 beendet),
sondern PASCAL-Strings. Diese enthalten im ersten Byte die Stringlnge, danach
die gltigen Zeichen (siehe z.B. DATENBLOCK.kennung).
(s0B

(s1SStand November 1990(s0S

