NVDI 3 Programmer's Guide
=========================

Stand: 22.1.95 (vorlufige Fassung)

(c) 1995 by Wilfried Behne

Intentionen, Konditionen, Ovationen
-----------------------------------

"Neue Version - neue Fragen" - mit dem Erscheinen von NVDI 3 ist die
Anzahl der Anfragen zu NVDI bei mir rapide gestiegen. Zum Teil waren es
NVDI-Besitzer, die an weitergehenden Informationen interessiert waren, zum
Teil aber auch Programmierer, die NVDI nicht besitzen und ihre Programme
an NVDI anpassen wollten.

Diese vorlufige Funktionsbeschreibung zu NVDI 3 ist ist in die Teile

-  Datentypen und Strukturen
-  Versionsabfragen
-  Funktionsumfang
-  Gertetreiber und Offscreen-Bitmaps
-  Farbeinstellungen
-  Verknpfung und Zeichenbereich
-  Linien und nicht gefllte Grafikprimitive
-  Gefllte Grafikprimitive
-  Marker
-  Textausgaben mit Bitmap- und Vektorfonts
-  Rasterfunktionen
-  Eingabefunktionen
-  Textmodus und VT52
-  Beispiele fr Bindings

gegliedert. Fr die Vollstndigkeit und Richtigkeit der gemachten Angaben wird
keinerlei Gewhr bernommen.

Konditionen
-----------

Diese Dokumentation ist Public Domain, d.h. sie darf frei kopiert und benutzt
werden. Der entgeldliche Vertrieb ist untersagt. Zuwiderhandlungen werden
strafrechtlich verfolgt.

Zu NVDIGUID.LZH gehren folgende Dateien:

   - NVDIGUID.TXT

   (to be continued ...)

Das Archiv darf nur komplett mit diesen Dateien weitergegeben werden!
Es ist erlaubt, die Dateien fr die eigenen Anforderungen zu verndern. Es ist
jedoch NICHT erlaubt, diese vernderten Dateien weiterzugeben.

Fr Wnsche, Anregungen und Fehlerkorrekturen habe ich natrlich immer ein
offenes Ohr ( wilfried_behne@maush.han.de ).

Disclaimer
----------
Speedo ist ein eingetragenes Warenzeichen von Bitstream Inc., TrueType und
TrueType GX sind eingetragene Warenzeichen von Apple Computer, Inc, PostScript
ist ein eingetragenes Warenzeichen von Adobe Systems Inc. Die meisten hier
erwhnten Produkte sind in der Regel durch Warenzeichen geschtzt. Das Fehlen
gesonderter Hinweise bedeutet nicht, da diese Produkte frei von Rechten Dritter
sind.




Datentypen und Strukturen
=========================

 Benutzte Datentypen

Die Deklarationen und Beschreibungen arbeiten mit den folgenden Datentypen:

BYTE     8 Bit, vorzeichenbehaftet, -128 bis 127
UBYTE    8 Bit, kein Vorzeichen, 0 bis 255
WORD     16 Bit, vorzeichenbehaftet, -32768 bis 32767
UWORD    16 Bit, kein Vorzeichen, 0 bis 65535
LONG     32 Bit, vorzeichenbehaftet, -2147483648 bis 2147483647
ULONG    32 Bit, kein Vorzeichen, 0 bis 4294967295
fix31    32 Bit, vorzeichenbehaftet, -2147483648 bis 2147483647

BYTE wird normalerweise in den C-Bindings fr die bergabe von Zeichenketten
benutzt. Fr die meisten VDI-Funktionen werden die BYTE-Werte erweitert (und
zwar so, als ob sie vorzeichenlos wren), da z.B. der Index eines Zeichens im
Bereich 0-65535 liegen kann.

Der Standard-Typ des VDIs ist WORD. Die Felder contrl, intin, ptsin, intout und
ptsout sind als WORD deklariert. Die Interpretation der Werte hngt aber vom
jeweiliegen VDI-Aufruf ab. Koordinaten in ptsin werden als vorzeichenbehaftet
betrachtet (-32768 bis +32768), Werte in intin oftmals als vorzeichenlos.

Der Typ fix31 wird im Zusammenhang mit Vektorfonts gebraucht, wo mit Positonen
und Schrittweiten in 1/65536 gerechnet wird (1 Pixel Weite entspricht 65536).
Die oberen 16 Bit reprsentieren den Vorkommaanteil und die unteren 16 Bit die
Nachkommastellen. Beispiele:

hex.        dez.
$00010000   65536    1.0 Pixel
$0001c000  114688    1.75 Pixel
$fffec000  -81920   -1.25 Pixel
$fffe4000 -114688   -1.75 Pixel

Wer Schrittbreiten (beispielsweise von vqt_advance()) aufsummiert und
anschlieend die Pixelposition fr Cursorpositionierung berechnen mchte sollte
wie folgt vorgehen:

WORD  fix31_to_pixel( fix31 a )
{
   WORD  b;

   b = (WORD) (( a + 32768L ) >> 16 ); /* runden !! */
   return( b );                        /* Pixelwert zurckgeben */
}

Man darf nie, nie, niemals den Nachkommateil einfach abschneiden!


 Strukturen und Felder fr VDI-Aufrufe

Die folgenden Felder und Strukturen werden fr VDI-Aufrufe bentigt:

WORD  contrl[12];

In contrl werden die Funktionsnummer, die Anzahl der Eingaben, das Handle der
Workstation und einige Funktionsabhngige Paramter bergeben. Die Eingaben
werden grundstzlich wie folgt eingetragen:

contrl[0]:     Funktionsnummer
contrl[1]:     Anzahl der Eingabe-Koordinatenpaare (in ptsin)
contrl[3]:     Anzahl der Eingabe-Integers (in intin)
contrl[5]:     Unterfunktionsnummer
contrl[6]:     Workstation-Handle
contrl[7..n]:  abhngig von der Funktion

Die Ausgaben werden in den folgenden Elementen zurckgegeben:

contrl[2]:     Anzahl der Ausgabekoordinatenpaare (in ptsout)
contrl[4]:     Anzahl der Ausgabe-Integers (in intout)
contrl[6]:     Workstation-Handle (nur bei v_opnwk()/v_opnvwk()/v_opnbm())

Die Felder ptsin und ptsout werden benutzt, um Koordinatenpaare oder Mae in
Pixeln (z.B. die Breite einer Linie oder die Hhe eines Zeichens) zu
bergeben. Die Gre der Felder hngt von den aufgerufenen Funktionen ab.
Eine sinnvolle Deklaration knnte wie folgt aussehen:

WORD  ptsin[1024];   /* Platz fr 512 Eingabe-Koordinatenpaare */
WORD  ptsout[256];   /* Platz fr 128 Ausgabe-Koordinatenpaare */

Worte wie der Index eines Zeichens oder der Index einer Farbe werden in intin
und intout bergeben. Auch hier hngt letztendlich die Gre der Felder von
den aufgerufenen Funktionen ab. Eine sinnvolle Deklaration knnte wie folgt
aussehen:

WORD  intin[1024];   /* Platz fr 1024 Eingabe-Worte */
WORD  intout[512];   /* Platz fr 512 Ausgabe-Worte */

Um das VDI aufzurufen, mu der folgende Paramterblock mit den Adressen der
oben beschriebenen Felder bestckt werden. Die Adresse des Parameterblocks
wird in Register d1 eingetragen und Register d0.w enthlt 115. Anschlieend
wird ein Systemaufruf mit dem Befehl trap #2 ausgelst.

typedef struct
{
   WORD  *contrl;    /* Zeiger auf contrl */
   WORD  *intin;     /* Zeiger auf intin */
   WORD  *ptsin;     /* Zeiger auf ptsin */
   WORD  *intout;    /* Zeiger auf intout */
   WORD  *ptsout;    /* Zeiger auf ptsout */
} VDIPB;

Farbeinstellungen:

Bei vs_color(), vq_color() und vs_calibrate() werden RGB-Intensitten in
Promille bergeben, wofr am zweckmigsten die RGB-Struktur benutzt wird:

typedef struct
{
   WORD  red;        /* Rot-Intensitt in Promille (0-1000) */
   WORD  green;      /* Grn-Intensitt in Promille (0-1000) */
   WORD  blue;       /* Blau-Intensitt in Promille (0-1000) */
} RGB1000;

Rasterfunktionen:

VDI-Funktionen, die Raster verknpfen, erwarten als Rasterbeschreibung einen
oder mehrere sogenannte MFDBs, "Memory Form Definition Block".

typedef struct
{
   void  *fd_addr;   /* Adresse des Rasters oder 0 fr Bildschirm/Bitmap */
   WORD  fd_w;       /* Breite des Rasters in Pixeln */
   WORD  fd_h;       /* Hhe des Rasters in Zeilen */
   WORD  fd_wdwidth; /* Breite einer Rasterzeile in Worten */
   WORD  fd_stand;   /* Format 0: gertespezifisch, 1: Standardformat */
   WORD  fd_nplanes; /* Anzahl der Ebenen */
   WORD  fd_r1;      /* reserviert, sollte 0 sein */
   WORD  fd_r2;      /* reserviert, sollte 0 sein */
   WORD  fd_r3;      /* reserviert, sollte 0 sein */
} MFDB;

Wenn fd_addr eine 0 enthlt, mu der Rest des MFDBs nicht ausgefllt werden. Die
Rasteroperationen vrt_cpyfm() und vro_cpyfm() beziehen sich dann automatisch auf
den Bildschirm (oder im Fall eines Druckertreibers auf die Druckerbitmap). Die
reservierten Worte fd_r1, fd_r2 und fd_r3 sollten hinsichtlich zuknftiger
Erweiterungen auf 0 gesetzt werden!

Metafiles:

Metafiles beginnen mit dem folgenden Header:

typedef struct
{
   WORD  mf_header;     /* -1, Metafile-Kennung */
   WORD  mf_length;     /* Lnge des Headers in Worten (normalerweise 24) */
   WORD  mf_version;    /* Versionsnummer des Formats, hier 101 fr 1.01 */
   WORD  mf_ndcrcfl;    /* NDC/RC-Flag, normalerweise 2 (Rasterkoordinaten) */
   WORD  mf_extents[4]; /* optional - maximale Ausmae der Grafik */
   WORD  mf_pagesz[2];  /* optional - Seitengre in 1/10 mm */
   WORD  mf_coords[4];  /* optional - Koordinatensystem */
   WORD  mf_imgflag;    /* Flag fr durch v_bit_image() eingebundene IMGs */
   WORD  mf_resvd[9];
} METAHDR;

Die Angaben in mf_extents, mf_pagesz und mf_coords sind optional. Falls ein
Programm sie nicht gesetzt hat, enthalten diese Felder Nullen. Das IMG-Flag
zeigt an, ob Aufrufe von v_bit_image() im Metafile gespeichert sind.

Bei vqt_xfntinfo() wird die XFNT_INFO-Struktur bentigt, in oft bentigt Angaben
ber einen Font eingetragen werden:

typedef struct
{
   LONG  size;             /* Lnge der Struktur, mu vor vqt_xfntinfo() gesetzt werden */
   WORD  format;           /* Fontformat, z.B. 4 fr TrueType */
   WORD  id;               /* Font-ID, z.B. 6059 */
   WORD  index;            /* Index */
   BYTE  font_name[50];    /* vollstndiger Fontname, z.B. "Century 725 Italic BT" */
   BYTE  family_name[50];  /* Name der Fontfamilie, z.B. "Century725 BT" */
   BYTE  style_name[50];   /* Name des Fontstils, z.B. "Italic" */
   BYTE  file_name1[200];  /* Name der 1. Fontdatei, z.B. "C:\FONTS\TT1059M_.TTF" */
   BYTE  file_name2[200];  /* Name der optionalen 2. Fontdatei */
   BYTE  file_name3[200];  /* Name der optionalen 3. Fontdatei */
   WORD  pt_cnt;           /* Anzahl der Punkthhen fr vst_point(), z.B. 10 */
   WORD  pt_sizes[64];     /* verfgbare Punkthhen,
                              z.B. { 8, 9, 10, 11, 12, 14, 18, 24, 36, 48 } */
} XFNT_INFO;


 Zeichenketten

Grundstzlich werden Strings beim VDI in intin und intout bergeben, wobei pro
Zeichen ein Wort benutzt wird. Diese bergabe hat den Vorteil, da auch andere
Kodierungen als ASCII benutzbar sind und da auch mehr als 256 Zeichen eines
Fonts benutzt werden knnen.

Die C-Bindings fr Funktionen wie v_ftext(),vqt_name(), vqt_extent() usw.
arbeiten mit normalen C-Strings und wandeln sie frs VDI um. Die Lnge eines
derartigen Strings wird dabei in contrl[3] bzw. contrl[4] eingetragen, wobei kein
abschlieendes Null-Byte oder -Wort vorhanden ist!
Wer z.B eine in intout ausgegebene  Zeichenkette in einen C-String wandeln
mchte, mu contrl[4]  Elemente kopieren, dabei die oberen 8 Bit abschneiden und
anschlieend ein Null-Byte anhngen.

void  vdi_str_to_c( UWORD *src, UBYTE *des, WORD len )
{
   while ( len > 0 )
   {
      *des++ = (UBYTE) *src++;   /* nur das Low-Byte kopieren */
      len--;
   }
   *des++ = 0;                   /* Ende des Strings */
}

WORD c_str_to_vdi( UBYTE *src, UWORD *des )
{
   WORD  len;

   while (( *des++ = *src++ ) != 0 )
      len++;

   return( len );                /* Lnge des Strings ohne Null-Byte */
}

Wenn es sich bei einem Funktionsparameter um einen C-String handelt, wird das in
der Regel explizit erwhnt.




Versionsabfragen
================

Um herauszufinden, welche NVDI-Version man vor sich hat und welchen
Funktionsumfang sie hat, mu der "NVDI"-Cookie gesucht werden, der die
Versionsnummer im BCD-Format enthlt (z.B. 0x0301 fr Version 3.01).

Wer die Offscreen-Bitmaps nutzen mchte, sollte nach dem "EdDI"-Cookie suchen.
Das auf die Kennung folgende Langwort ist die Adresse eines Dispatchers, der mit
der Funktionsnummer in Register d0.w aufgerufen wird. Fr den Aufruf gelten die
Pure C-Konventionen, d.h. Register d0-d2/a0-a1 und der Stack werden zur
Parameterbergabe benutzt, d0-d2/a0-a1 knnen verndert werden). Die Funktion 0
liefert die EdDI-Versionsnummer im BDC-Format (0x0110 fr Version 1.10).

typedef struct
{
  BYTE   id[4];         /* enthlt hier 0x4e564449 = 'NVDI' */
  LONG   value;         /* zeigt auf die NVDI-Struktur */
} COOKIE;

typedef struct
{
   UWORD nvdi_version;  /*  z.B. 0x0301 fr Version 3.01 */
   ULONG nvdi_datum;    /*  z.B. 0x18061990L fr 18.06.1990 */
} NVDI_STRUC;




Funktionsumfang
===============

Hier folgt eine kurze Auflistung der untersttzten Funktionen mit Angabe, ab
welcher Version diese Funktion zur Verfgung steht.

contrl[0]   contrl[5]   Funktionsname           Verfgbarkeit

Treiber und Verwaltung:

   1           0        v_opnwk();
   2           0        v_clswk();
   100         0        v_opnvwk();
   101         0        v_clsvwk();
   3           0        v_clrwk();
   4           0        v_updwk();
   5           22       v_clear_disp_list();
   100         1        v_opnbm();              ab EdDI 1.00
   101         1        v_clsbm();              ab EdDI 1.00
   102         0        vq_extnd();
   102         1        vq_scrninfo();          ab EdDI 1.00
   248         0        vq_devinfo();           ab NVDI 3.00
   248         4242     vq_ext_devinfo();       ab NVDI 3.00

Farbeinstellungen:

   5           76       vs_calibrate();         je nach Treiber
   5           77       vq_calibrate();         je nach Treiber
   14          0        vs_color();
   26          0        vq_color();

Verknpfung und Zeichenbereich:

   32          0        vswr_mode();
   129         0        vs_clip();

Linien und nicht gefllte Grafikprimitive:

   5           99       v_bez_qual();           ab NVDI 2.10
   6           0        v_pline();
   6           13       v_bez();                ab NVDI 2.10
   11          2        v_arc();
   11          6        v_ellarc();
   11          8        v_rbox();
   11          13       v_bez_on();             ab NVDI 2.10
   11          13       v_bez_off();            ab NVDI 2.10
   15          0        vsl_type();
   16          0        vsl_width();
   17          0        vsl_color();
   35          0        vql_attributes();
   108         0        vsl_ends();
   113         0        vsl_udsty();

Gefllte Grafikprimitive:

   9           0        v_fillarea();
   9           13       v_bez_fill();           ab NVDI 2.10
   11          1        v_bar();
   11          3        v_pieslice();
   11          4        v_circle();
   11          5        v_ellipse();
   11          7        v_ellpie();
   11          9        v_rfbox();
   23          0        vsf_interior();
   24          0        vsf_style();
   25          0        vsf_color();
   37          0        vqf_attributes();
   103         0        v_contourfill();
   104         0        vsf_perimeter();
   112         0        vsf_udpat();
   114         0        vr_recfl();

Marker:

   7           0        v_pmarker();
   18          0        vsm_type();
   19          0        vsm_height();
   20          0        vsm_color();
   36          0        vqm_attributes();

Textausgabe:

   8           0        v_gtext();
   11          10       v_justified();
   12          0        vst_height();
   13          0        vst_rotation();
   21          0        vst_font();
   22          0        vst_color();
   38          0        vqt_attributes();
   39          0        vst_alignment();
   106         0        vst_effects();
   107         0        vst_point();
   116         0        vqt_extent();
   117         0        vqt_width();
   119         0        vst_load_fonts();
   120         0        vst_unload_fonts();
   130         0        vqt_name();             ab NVDI 3.00 erweitert
   131         0        vqt_fontinfo();
   229         0        vqt_xfntinfo();         ab NVDI 3.02
   230         0        vst_name();             ab NVDI 3.02
   230         100      vqt_name_and_id();      ab NVDI 3.02
   231         0        vst_width();            ab NVDI 3.00
   232         0        vqt_fontheader();       ab NVDI 3.00
   234         0        vqt_trackkern();        ab NVDI 3.00
   235         0        vqt_pairkern();         ab NVDI 3.00
   236         0        vst_charmap();          ab NVDI 3.00
   237         0        vst_kern();             ab NVDI 3.00
   237         0        vst_track_offset();     ab NVDI 3.00
   239         0        v_getbitmap_info();     ab NVDI 3.00
   240         0        vqt_f_extent();         ab NVDI 3.00
   240         4200     vqt_real_extent()       ab NVDI 3.00
   241         0        v_ftext();              ab NVDI 3.00
   241         0        v_ftext_offset();       ab NVDI 3.00
   243         0        v_getoutline();         ab NVDI 3.00
   246         0        vst_arbpt();            ab NVDI 3.00
   247         0        vqt_advance();          ab NVDI 3.00
   252         0        vst_setsize();          ab NVDI 3.00
   253         0        vst_skew();             ab NVDI 3.00

Rasterfunktionen:

   105         0        v_get_pixel();
   109         0        vro_cpyfm();
   110         0        vr_trnfm();
   121         0        vrt_cpyfm();

Eingabefunktionen:

   33          0        vsin_mode();
   28          0        vrq_locator();
   28          0        vsm_locator();
   30          0        vrq_choice();
   30          0        vsm_choice();
   31          0        vrq_string();
   31          0        vsm_string();
   111         0        vsc_form();
   115         0        vqin_mode();
   128         0        vex_timv();
   122         0        v_show_c();
   123         0        v_hide_c();
   124         0        vq_mouse();
   125         0        vex_butv();
   126         0        vex_motv();
   127         0        vex_curv();
   128         0        vq_key_s();

Textmodus und VT52:

   5           1        vq_chcells();
   5           2        v_exit_cur();
   5           3        v_enter_cur();
   5           4        v_curup();
   5           5        v_curdown();
   5           6        v_curright();
   5           7        v_curleft();
   5           8        v_curhome();
   5           9        v_eeos();
   5           10       v_eeol();
   5           11       v_curaddress();
   5           12       v_curtext();
   5           13       v_rvon();
   5           14       v_rvoff();
   5           15       vq_curaddress();




Gertetreiber und Offscreen-Bitmaps
===================================

 OPEN WORKSTATION (VDI 1)

Mit dieser Funktion ffnen Sie eine physikalische Workstation. Dazu wird ein in
der ASSIGN.SYS-Datei eingetragener Gertetreiber geladen und den Eingaben
entsprechend initialisiert.

Wenn die Initialisierung erfolgreich verlaufen ist, wird in contrl[6] eine
Kennung (im weiteren Verlauf Handle genannt) zurckgegeben, andernfalls eine
Null.

Wichtig: Der Bildschirmtreiber wird nach Abarbeitung des AUTO-Ordners vom AES
         geffnet. Anwenderprogramme mssen daher zur  Bildschirmausgabe eine
         virtuelle  Workstation  (VDI  100) ffnen.

Dekl.:  void v_opnwk( WORD *work_in, WORD *handle, WORD *work_out );
Aufruf: v_opnwk( work_in, &handle, work_out );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        1                   v_opnwk
contrl[1]        0                   Eintrge in ptsin
contrl[3]        11                  Eintrge in intin
contrl[6]        0 oder 1
intin[0..10]     work_in[0..10]

Ausgaben:

contrl[2]        6                   Eintrge in ptsout
contrl[4]        45                  Eintrge in intout
contrl[6]        handle
intout[0..44]    work_out[0..44]
ptsout[0..11]    work_out[45..56]

Bedeutung von work_in[0..10]:
work_in[0]: Gerteidentifikationsnummer.  Mit  ihr whlen Sie den zu  ladenden
            Gertetreiber.

            1-10 : Bildschirmtreiber
            1:    aktuelle Auflsung
            2:    320*200,  16 Farben
            3:    640*200,  4 Farben
            4:    640*400,  monochrom
            6:    640*480,  16 Farben  (TT)
            8:    1280*960, monochrom  (TT)
            9:    320*480,  256 Farben (TT)

            ab 11:Plottertreiber
            ab 21:Druckertreiber
            ab 31:Metafiletreiber
            ab 41:Kamera
            ab 51:Grafiktablett
            ab 61:Memory-Treiber

work_in[1]: Linientyp
work_in[2]: Linienfarbe
work_in[3]: Markertyp
work_in[4]: Markerfarbe
work_in[5]: Zeichensatznummer
work_in[6]: Textfarbe
work_in[7]: Flltyp
work_in[8]: Fllmuster-Index
work_in[9]: Fllmuster-Farbe
work_in[10]:Koordinatenflag 0: NDC , 2: RC

Bedeutung von work_out[0..56]:
work_out[0]:  Adressierbare Rasterbreite (Wertebereich 0 - xmax)
work_out[1]:  Adressierbare Rasterhhe   (Wertebereich 0 - ymax)
work_out[2]:  Gertekoordinatenflag
              0: genaue Skalierung mglich (z.B. Bildschirm)
              1: keine genaue Skalierung mglich (Film-Recorder)
work_out[3]:  Breite eines Pixels in Mikrometern
work_out[4]:  Hhe eines Pixels in Mikrometern
work_out[5]:  Anzahl der Zeichenhhen (0: beliebig vernderbar)
work_out[6]:  Anzahl der Linientypen
work_out[7]:  Anzahl der Linienbreiten (0: beliebig vernderbar)
work_out[8]:  Anzahl der Markertypen
work_out[9]:  Anzahl der Markergren (0: beliebig vernderbar)
work_out[10]: Anzahl der verfgbaren Zeichenstze
work_out[11]: Anzahl der Muster
work_out[12]: Anzahl der Schraffuren
work_out[13]: Anzahl der Farben
work_out[14]: Anzahl der GDPs
work_out[15] bis work_out[24]:
              Liste der GDPs, deren Ende durch -1 gekennzeichnet ist.
work_out[25] bis work_out[34]:
              Liste der Attribute der GDPs:
              0: Linie
              1: Marker
              2: Text
              3: ausgefllter Bereich
              4: keine Attribute
work_out[35]: Farbdarstellungsflag
work_out[36]: Textrotationsflag
work_out[37]: Flchenfllung
work_out[38]: CELLARRAY-Flag
work_out[39]: Anzahl der Farbabstufungen (0: mehr als 32767)
work_out[40]: Kontrolle des Mauszeigers
              1: Tastatur
              2: Tastatur und Maus (oder anderes Gert)
work_out[41]: Gert fr variierende Eingaben
              1: Tastatur
              2: anderes Gert
work_out[42]: Auswahltasten
              1: Funktionstasten
              2: anderes Tastenfeld
work_out[43]: String-Eingabe
              1: Tastatur
work_out[44]: Gerte-Typ
              0: nur Ausgabe
              1: Eingabe
              2: Ein- u. Ausgabe
              4: Metafile-Ausgabe
work_out[45]: geringste Zeichenbreite
work_out[46]: geringste Zeichenhhe
work_out[47]: grte Zeichenbreite
work_out[48]: grte Zeichenhhe
work_out[49]: geringste Linienbreite
work_out[50]: 0
work_out[51]: grte Linienbreite
work_out[52]: 0
work_out[53]: geringste Markerbreite
work_out[54]: geringste Markerhhe
work_out[55]: grte Markerbreite
work_out[56]: grte Markerhhe

Bei NVDI-Drucker- und IMG-Treibern kann auerdem das Seitenformat und der
Ausgabekanal gesetzt werden. Bei META.SYS wirkt sich die Einstellung des
Seitenformats nicht aus (sollte auf 0 gesetzt werden), der Dateiname wird aber
fr den Metafile bernommen.

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        1                   v_opnwk
contrl[1]        0                   Eintrge in ptsin
contrl[3]        16                  Eintrge in intin
contrl[6]        0 oder 1
intin[0..15]     work_in[0..15]

Ausgaben:
wie oben beschrieben

Bedeutung von work_in[11..15]:
work_in[11]:   Seitenformat
               #define  PAGE_DEFAULT   0     /* Voreinstellung benutzen */
               #define  PAGE_A3        1     /* DIN A3 */
               #define  PAGE_A4        2     /* DIN A4 */
               #define  PAGE_A5        3     /* DIN A5 */
               #define  PAGE_B5        4     /* DIN B5 */

               #define  PAGE_LETTER    16    /* Letter size */
               #define  PAGE_HALF      17    /* Half size */
               #define  PAGE_LEGAL     18    /* Legal size */
               #define  PAGE_DOUBLE    19    /* Double size */
               #define  PAGE_BROAD     20    /* Broad sheet size */

work_in[12/13]: Zeiger auf einen GEMDOS-Dateinamen (C-String) oder Null
work_in[14]:    0, reserviert
work_in[15]:    0, reserviert


 CLOSE WORKSTATION (VDI 2)

"CLOSE WORKSTATION" schliet eine physikalische Workstation. Vorher sollten alle
virtuellen Workstations geschlossen werden.
Bei Druckertreibern werden vor dem Schlieen ggf. die noch gepufferten Kommandos
ausgefhrt, bei Metafiletreibern wird der Metafile geschloen. Man beachte, da
das Schlieen der Workstation bei Druckertreibern keinen Seitenvorschub auslst.

Dekl.:  void v_clswk( WORD handle );
Aufruf: v_clswk( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        2                   v_clswk
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 OPEN VIRTUAL SCREEN WORKSTATION (VDI 100)

"OPEN VIRTUAL SCREEN WORKSTATION" ffnet eine virtuelle Bildschirm-Workstation
auf einer bereits geffneten physikalischen Workstation. Dadurch knnen die
Zugriffe verschiedener Programme mit ihren unterschiedlichen Einstellungen
koordiniert werden. Fr Bildschirmtreiber mssen Sie das Handle der
AES-Bildschirm-Workstation nach der Anmeldung Ihres Programmes beim AES mit.

  aes_handle = graf_handle(&gr_hwchar,&gr_hhchar,&gr_hwbox,&gr_hhbox);
  handle = aes_handle;

ermitteln.

Dekl.:  void v_opnvwk( WORD *work_in, WORD *handle, WORD *work_out );
Aufruf: v_opnvwk( work_in, &handle, work_out );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        100                 v_opnvwk
contrl[1]        0                   Eintrge in ptsin
contrl[3]        11                  Eintrge in intin
contrl[6]        handle              Handle der physikalischen Workstation
intin[0..10]     work_in[0..10]

Ausgaben:

contrl[2]        6                   Eintrge in ptsout
contrl[4]        45                  Eintrge in intout
contrl[6]        handle              Handle der virtuellen Workstation
intout[0..44]    work_out[0..44]
ptsout[0..11]    work_out[45..56]

Die Bedeutung der Ein- und Ausgaben ist mit denen von "OPEN WORKSTATION"
identisch.


 CLOSE VIRTUAL SCREEN WORKSTATION (VDI 101)

Mit dieser Funktion wird eine geffnete virtuelle Workstation geschlossen.

Dekl.:  void v_clsvwk( WORD handle );
Aufruf: v_clsvwk( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        101                 v_clsvwk
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:
contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 CLEAR WORKSTATION (VDI 3)

Diese Funktion lscht den Bildschirm. Bei Plottern oder Druckern wird ein
Seitenvorschub durchgefhrt und der Druckpuffer gelscht.

Deklaration: void v_clrwk( WORD handle );
Aufruf:      v_clrwk( handle);

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        3                   v_clrwk
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 CLEAR DISPLAY LIST (VDI 5, Escape 22)

Diese Funktion lscht bei Plottern oder Druckern den Druckerpuffer. Im Gegensatz
zu CLEAR WORKSTATION wird jedoch kein Seitenvorschub durchgefhrt.
Diese Funktion sollte z.B. dann aufgerufen werden, wenn der Benutzer die
Grafikausgaben vor dem Ausdruck (also vor dem UPDATE WORKSTATION) abbrechen
mchte.

Deklaration: void v_clear_disp_list( WORD handle );
Aufruf:      v_clear_disp_list( handle);

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   v_escape
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        22                  Unterfunktionsnummer v_clear_disp_list
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 UPDATE WORKSTATION (VDI 4)

Diese Funktion wird auf Gerten wie z.B. Druckern aufgerufen, die VDI-Kommandos
in einer Liste puffern. "UPDATE WORKSTATION" veranlat die Ausfhrung dieser
gepufferten Kommandos. Bei Bildschirm-Workstations oder Offscreen-Bitmaps mu
diese Funktion nicht aufgerufen werden, da Grafikkommandos sofort abgearbeitet
werden.

Dekl.:  void v_updwk( WORD handle );
Aufruf: v_updwk( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        4                   v_updwk
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 OPEN BITMAP (VDI 100, 1)

Der Aufruf von "OPEN BITMAP" erzeugt eine Off-Screen-Bitmap auf der mit
VDI-Funktionen gezeichnet werden kann. Die Bitmap kann entweder bergeben werden
oder das VDI alloziert selber den dafr ntigen Speicher. Die zu bergebenden
Pixelgren werden bei den Vektorfonts beachtet, so da die Mahaltigkeit
gewhrt ist.
Die Benutzung von Offscreen-Bitmaps bietet sich auch dann an, wenn man Effekte
wie starkes Flackern vermeiden mchte. In diesem Fall baut man Teile der Grafik
in der Bitmap auf und bertrgt die Bitmap mit vrt_cpyfm() oder vro_cpyfm() auf den
Bildschirm.

Dekl.:  void v_opnbm( WORD *work_in, MFDB *bitmap, WORD *handle, WORD *work_out );
Aufruf: v_opnbm( work_in, &bitmap, &handle, work_out );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        100                 v_opnbm
contrl[1]        0                   Eintrge in ptsin
contrl[3]        20                  Eintrge in intin
contrl[5]        1                   Unterfunktionsnummer fr v_opnbm
contrl[6]        handle              Handle der physikalischen Workstation
contrl[7..8]     bitmap              Zeiger auf einen MFDB der Bitmap
intin[0..19]     work_in[0..19]

Ausgaben:

contrl[2]        6                   Eintrge in ptsout
contrl[4]        45                  Eintrge in intout
contrl[6]        handle              Handle der Bitmap
intout[0..44]    work_out[0..44]
ptsout[0..11]    work_out[45..56]

Bedeutung von work_in:
work_in[0..10]:   wie bei v_opnwk()/v_opnvwk() definiert
work_in[11]:      Breite -1 (z.B. 1279)
work_in[12]:      Hhe -1 (z.B. 959)
work_in[13]:      Breite eines Pixels in Mikrometern
work_in[14]:      Hhe eines Pixels in Mikrometern
work_in[15..19]:  mu 0 sein, wenn das gertespezifische Format benutzt wird

Bedeutung von bitmap:
Bitmap ist ein Zeiger auf einen MFDB. Falls bitmap->fd_addr gleich NULL ist, so
wird anhand der Grenangaben in work_in Speicher fr die Bitmap angefordert
(die Bitmap wird im Gegensatz zu v_opnvwk() gelscht).

Um eine Bitmap im gertespezifischen Format zu ffnen, mu bitmap->fd_nplanes
eine Null oder die Ebenenanzahl des Schirms enthalten (work_out[4] bei
vq_extnd()). Ist bitmap->fd_nplanes 1, wird eine monochrome Bitmap angelegt.

Die Eintrge des MFDB (fd_addr, fd_w, fd_h, fd_wdwidth, fd_stand, fd_nplanes)
werden vom VDI-Treiber gesetzt und an die aufrufende Applikation zurckgegeben.
Wenn nicht nicht gengend Speicher vorhanden ist, wird der Inhalt des MFDBs
nicht verndert; ein Null-Handle wird zurckgegeben.

Wenn bitmap->fd_addr ungleich NULL ist, wird dieser Eintrag als Zeiger auf eine
Bitmap interpretiert. Wenn die Bitmap im Standardformat vorliegt, wird sie ins
gertespezifische Format umgewandelt. Liegt sie schon im gertespezifischen
Format vor, so wird sie nicht umgewandelt. Falls die Auflsung der Bitmap (d.h.
die Anzahl der Farben und Planes) nicht untersttzt wird, gibt v_opnbm() ein
Null-Handle zurck.

Ab EdDI 1.1 kann v_opnbm() mit zustzlichen Parametern in work_in[15..19]
aufgerufen werden. Es wird dann versucht, eine Bitmap in dem durch diese
Parameter beschriebenen Format zu ffnen. Sollte fr das angegebene Format kein
Treiber vorhanden sein, kann die Bitmap nicht erzeugt werden.

work_in[15..16]:  Anzahl der gleichzeitig darstellbaren Farben
work_in[17]:      Anzahl der Planes
work_in[18]:      Pixelformat
work_in[19]:      Bitreihenfolge

Pixelformat und Bitreihenfolge werden bei vq_scrninfo() genauer beschrieben. Mit
den folgenden Parametern kann z.B. eine Offscreen-Bitmap mit 256 Farben und
Interleaved Planes erzeugt werden:

work_in[15..16] = 256;  /* 256 gleichzeitig darstellbare Farben */
work_in[17] = 8;        /* 8 Farbebenen */
work_in[18] = 0;        /* Interleaved Planes */
work_in[19] = 1;        /* normale Bitreihenfolge (Motorola-Format) */


 CLOSE BITMAP (VDI 101, 1)

Die Funktion v_clsbm() schliet die mit handle bezeichnete Bitmap. Wenn der
Speicher bei v_opnbm() vom VDI alloziert wurde, gibt sie diesen Speicher wieder
frei.

Dekl.:  void v_clsbm( WORD handle );
Aufruf: v_clsbm( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        101                 v_clsbm
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        1                   Unterfunktionsnummer fr v_clsbm()
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 EXTENDED INQUIRE FUNCTION (VDI 102)

Von dieser Funktion werden entweder die Parameter von v_opnwk()/v_opnvwk() oder
erweiterte Ausknfte zum Gertetreiber und zum Gert zurckgeliefert.

Dekl.:  void vq_extnd( WORD handle, WORD flag, WORD *work_out );
Aufruf: vq_extnd( handle, owflag, work_out );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        102                 vq_extnd
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         flag                Informationstyp

Ausgaben:

contrl[2]        6                   Eintrge in ptsout
contrl[4]        45                  Eintrge in intout
intout[0..44]    work_out[0..44]
ptsout[0..11]    work_out[45..56]

Bedeutung von flag:
0: Parameter von v_opnwk()/v_opnvwk()
1: erweiterte Parameter

Bedeutung von work_out:
work_out[0]:  Bildschirmtyp
              0: kein Bildschirm
              1: getrennter Text- und Grafikmodus und getrennter
                 Bildspeicher
              2: getrennter Text- und Grafikmodus mit gemeinsamem
                 Bildspeicher
              3: gemeinsamer Text- und Grafikmodus mit getrenntem
                 Bildspeicher
              4: gemeinsamer Text- und Grafikmodus mit gemeinsamem
                 Bildspeicher
work_out[1]:  Anzahl der Farbabstufungen
work_out[2]:  Anzahl der Texteffekte
work_out[3]:  Flag fr Vergrerung des Rasters
              0: Vergrerung nicht mglich
              1: Vergrerung mglich
work_out[4]:  Anzahl der Bildebenen
work_out[5]:  "Color lookup table"-Untersttzung
              0: nicht mglich
              1: mglich
work_out[6]:  Anzahl der 16*16-Pixel-Raster-Operationen pro Sekunde
work_out[7]:  Verfgbarkeit der Flchenfllung (v_contourfill)
              0: nicht verfgbar
              1: verfgbar
work_out[8]:  Textrotation
              0: nicht mglich
              1: in 90-Grad-Schritten
              2: in 1/10-Grad-Schritten
work_out[9]:  Anzahl der Schreibmodi
work_out[10]: Eingabemodi
              0: keine
              1: Request
              2: Request und Sample
work_out[11]: Textausrichtung:
              0: nicht verfgbar
              1: verfgbar
work_out[12]: Farbstiftwechsel
              0: nicht mglich
              1: mglich
work_out[13]: Farbbandwechsel
              0: nicht mglich
              1: farbige Zeilen
              2: farbige Zeilen und Rechtecke
work_out[14]: maximale   Anzahl   der   Koordinatenpaare   fr   Polyline,
              Polymarker, und Filled Area oder -1 (unbegrenzt)
work_out[15]: maximale Lnge des intin-Array oder -1 (unbegrenzt)
work_out[16]: Anzahl der Maustasten
work_out[17]: Verfgbarkeit von Linientypen fr breite Linien
              0: nicht verfgbar
              1: verfgbar
work_out[18]: Anzahl der Schreibmodi fr breite Linien
work_out[19]: Clipping-Flag
              0: Clipping aus
              1: Clipping an
work_out[20]: 0: keine genaueren Pixelgren in den folgenden Feldern
              1: Pixelausmae werden in 1/10 Mikrometern zurckgeliefert
              2: Pixelausmae werden in 1/100 Mikrometern zurckgeliefert
              3: Pixelausmae werden in 1/1000 Mikrometern zurckgeliefert

work_out[21]: Pixelbreite in 1/10, 1/100 oder 1/1000 Mikrometern
work_out[22]: Pixelhhe in 1/10, 1/100 oder 1/1000 Mikrometern
work_out[23]: horizontale Auflsung in dpi
work_out[24]: vertikale Auflsung in dpi
work_out[28]: Bezier-Flag. Bit 1 gibt Auskunft ber die Bezierfhigkeiten
              0: Keine Beziers
              1: Beziers

work_out[40]: nicht bedruckbarer linker Rand in Pixeln (nur Drucker usw.)
work_out[41]: nicht bedruckbarer oberer Rand in Pixeln (nur Drucker usw.)
work_out[42]: nicht bedruckbarer rechter Rand in Pixeln (nur Drucker usw.)
work_out[43]: nicht bedruckbarer unterer Rand in Pixeln (nur Drucker usw.)

work_out[45..48]: Clipping-Rechteck

Bemerkungen:
Wenn work_out[20] einen Wert ungleich 0 enthlt, werden in den Elementen 21-24
und 40-43 zustzliche Informationen ber Pixelgre und nicht bedruckbare
Rnder bergeben. Die nicht bedruckbaren Rnder werden normalerweise nur bei
Druckertreibern zurckgeliefert. Sie ermglichen Applikationen, Dokumente zu
zentrieren oder dem Benutzer ein zutreffendes Bild der ausgedruckten Seite zu
liefern, indem die Rnder im Dokument angezeigt werden (der bei v_opnwk() in
work_in[0/1] zurckgelieferte Bereich ist der bedruckbare Bereich).

Wenn genauere Pixelgren zurckgeliefert werden, sollte man diese besonders
beim Drucken zur Positionsberechnung der einzelnen Grafikobjekte benutzen, denn
die Benutzung der Werte in work_out[3..4] kann im schlimmsten Fall auf einem
DIN A4 Blatt zu einer Ungenauigkeit von insgesamt 2 bis 3 mm fhren.

Die Rckgabe des Clipping-Flags (work_out[19]) und des Clipping-Rechtecks
(work_out[45..48]) ist GEM 2.x-kompatibel. Unter dem ATARI-VDI wird das
Clipping-Flag nicht zurckgegeben, wohl aber das Clipping-Rechteck (obwohl das
nicht dokumentiert ist) - Benutzung also auf eigene Gefahr!

Die  Rckgabe  des  Bezier-Flag (work_out[28], Bit 1) ist GEM/3-kompatibel. Im
ATARI-VDI ist work_out[28] reserviert und enthlt eine Null.


 INQUIRE SCREEN INFORMATION (VDI 102, 1)

"INQUIRE SCREEN INFORMATION" liefert genauere Angaben ber Bildschirmformat
(auch gertespezifisches Format genannt).
Diese Informationen sind in erster Linie interessant fr Programme, die
-  schnell Raster aufbauen (dithern) und diese mit vro_cpyfm() kopieren mchten.
-  farbige Raster speichern (XIMGs, TIFFs, JPEGs).

Dekl.:  void vq_scrninfo( WORD handle, WORD *work_out );
Aufruf: vq_scrninfo( handle, work_out );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        102                 vq_scrninfo
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[5]        1                   Unterfunktionsnummer von vq_scrninfo()
contrl[6]        handle
intin[0]         2                   erweiterte Informationen ausgeben

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        272                 Eintrge in intout
intout[0..272]   work_out[0..272]    erweiterte Informationen

Bedeutung von work_out:
work_out[0]:   Formatangabe:
               0: Interleaved Planes, wortweise (ATARI Grafik)
               1: Standardformat (komplette Planes)
               2: Packed Pixels
               -1: unbekanntes Format; nicht direkt beschreibbar
work_out[1]:   Verfgbarkeit einer CLUT:
               0: keine CLUT (z.B. TTM 194)
               1: Hardware-CLUT
               2: Software-CLUT (HiColor oder TrueColor)
work_out[2]:   Anzahl der Ebenen (Bits) pro Pixel
work_out[3/4]: Farbanzahl oder 0L (mehr als 2*10^31 Farben)
work_out[5]:   Breite einer Zeile in Bytes (erst ab EdDI 1.1)
work_out[6/7]: Adresse der Bitmap (erst ab EdDI 1.1)
work_out[8]:   Anzahl der Bits fr die Rot-Intensitt
work_out[9]:   Anzahl der Bits fr die Grn-Intensitt
work_out[10]:  Anzahl der Bits fr die Blau-Intensitt
work_out[11]:  Anzahl der Bits fr den Alpha-Channel oder hnliches
work_out[12]:  Anzahl der Bits fr Genlock
work_out[13]:  Anzahl der nicht benutzen Bits
work_out[14]:  Bitorganisation (erst ab EdDI 1.1)

               Bei 2-256 Farben:

               Bitnummer | Bedeutung des Bits
               ----------|--------------------------------------------------
                  0      | normale Bitreihenfolge

               Bei 32768 Farben (16 Planes):

               Bitnummer | Bedeutung des Bits
               ----------|--------------------------------------------------
                  0      | normale Bitreihenfolge, d.h. 1 Overlay-Bit,
                         | 5 Rot-Bits, 5 Grn-Bits, 5 Blau-Bits
                         |
                  1      | Falcon-Format, d.h.  5 Rot-Bits, 5 Grn-Bits,
                         | 1 Overlay-Bit, 5 Blau-Bits
                         |
                  7      | Bytes vertauscht: Intel-Modell

               Bei 65536 Farben (16 Planes):

               Bitnummer | Bedeutung des Bits
               ----------|--------------------------------------------------
                  0      | normale Bitreihenfolge, d.h. 5 Rot-Bits,
                         | 6 Grn-Bits, 5 Blau-Bits
                         |
                  7      | Bytes vertauscht: Intel-Modell

               Bei 16777216 Farben (24 Planes):

               Bitnummer | Bedeutung des Bits
               ----------|--------------------------------------------------
                  0      | normale Bitreihenfolge, d.h. 8 Rot-Bits,
                         | 8 Grn-Bits, 8 Blau-Bits
                         |
                  7      | Bytes vertauscht: Intel-Modell

               Bei 16777216 Farben (32 Planes):

               Bitnummer | Bedeutung des Bits
               ----------|--------------------------------------------------
                  0      | normale Bitreihenfolge, d.h. 8 Overlay-Bits,
                         | 8 Rot-Bits, 8 Grn-Bits, 8 Blau-Bits
                         |
                  7      | Bytes vertauscht: Intel-Modell

Falls eine Hardware-CLUT (intout[1] == 1) vorhanden ist:
work_out[16-271]: Pixelwert des zugehrigen VDI-Farbindexes

Falls HiColor, TrueColor oder hnliches vorhanden ist:
work_out[16..31]:    Zuordnung von Bitnummer im Pixel zum Bit der Rotintensitt
work_out[32..47]:    Zuordnung von Bitnummer im Pixel zum Bit der Grnintens.
work_out[48..63]:    Zuordnung von Bitnummer im Pixel zum Bit der Blauintensitt
work_out[64..79]:    Zuordnung der Bitnummer fr Alpha-Channel
work_out[80..95]:    Zuordnung der Bitnummer fr Genlock
work_out[96..127]:   unbenutzte Bits
work_out[128..271]:  reserviert (0)

   Beispiele:
   ----------

   In 256 Farben auf dem Falcon wrden folgende Ausgaben erfolgen:

   work_out | Wert   | Bedeutung
   ---------|--------|-----------------------------------------------------
      0     |   0    | Interleaved Planes, wortweise
      1     |   1    | Hardware-CLUT vorhanden
      2     |   8    | 8 Bit pro Pixel
      3/4   | 256    | 256 verschiedene Farben gleichzeitig mglich
      5     | xxxx   | Bitmapbreite in Bytes (erst ab EdDI 1.1)
      6/7   | xxxxL  | Bitmapadresse (erst ab EdDI 1.1)
      8     |   6    | 6 Bits fr die Rot-Intensitt
      9     |   6    | 6 Bits fr die Grn-Intensitt
     10     |   6    | 6 Bits fr die Blau-Intensitt
     11     |   0    | kein Bit fr Alpha-Channel
     12     |   0    | kein Bit fr Genlock
     13     |   0    | kein unbenutzes Bit
     14     |   1    | normale Bitreihenfolge (erst ab EdDI 1.1)
            |        |
     16     |   0    | Pixelwert fr VDI-Farbindex 0
     17     | 255    | Pixelwert fr VDI-Farbindex 1
     18     |   2    | Pixelwert fr VDI-Farbindex 2
     ...    | ...    |
    271     |  15    | Pixelwert fr VDI-Farbindex 255

   In HiColor auf dem Falcon wrden folgende Ausgaben erfolgen:

   work_out | Wert   | Bedeutung
   ---------|--------|-----------------------------------------------------
      0     |   2    | Packed Pixels
      1     |   2    | HiColor bzw. TrueColor
      2     |  16    | 16 Bit pro Pixel
      3/4   | 32768  | 32768 verschiedene Farben gleichzeitig mglich
      5     | xxxx   | Bitmapbreite in Bytes (erst ab EdDI 1.1)
      6/7   | xxxxL  | Bitmapadresse (erst ab EdDI 1.1)
      8     |   5    | 5 Bits fr die Rot-Intensitt
      9     |   5    | 5 Bits fr die Grn-Intensitt
     10     |   5    | 5 Bits fr die Blau-Intensitt
     11     |   0    | kein Bit fr Alpha-Channel
     12     |   1    | ein Bit fr Genlock
     13     |   0    | kein unbenutzes Bit
     14     |   2    | Falcon 15-Bit-Format mit 1 Overlay-Bit (erst ab EdDI 1.1)
            |        |
     16     |  11    | Bit 0 der Rot-Intensitt (niederwertigstes Bit)
            |        | befindet sich in Bit 11 des Pixels
     17     |  12    | Bit 1 befindet sich in Bit 12 des Pixels
     18     |  13    | ...
     19     |  14    | ...
     20     |  15    | Bit 4 der Rot-Intensitt (hchstwertigstes Bit)
            |        | befindet sich in Bit 15 des Pixels
     21..31 |  -1    | Bits werden nicht fr Rot-Intensitt benutzt
            |        |
            |        |
     32     |   6    | Bit 0 der Grn-Intensitt (niederwertigstes Bit)
            |        | befindet sich in Bit 6 des Pixels
     33     |   7    | Bit 1 befindet sich in Bit 7 des Pixels
     34     |   8    | ...
     35     |   9    | ...
     36     |  10    | Bit 4 der Grn-Intensitt (hchstwertigstes Bit)
            |        | befindet sich in Bit 10 des Pixels
     37..37 |  -1    | Bits werden nicht fr Grn-Intensitt benutzt
            |        |
            |        |
     48     |   0    | Bit 0 der Blau-Intensitt (niederwertigstes Bit)
            |        | befindet sich in Bit 0 des Pixels
     49     |   1    | Bit 1 befindet sich in Bit 1 des Pixels
     50     |   2    | ...
     51     |   3    | ...
     52     |   4    | Bit 4 der Blau-Intensitt (hchstwertigstes Bit)
            |        | befindet sich in Bit 4 des Pixels
     53..63 |  -1    | Bits werden nicht fr Blau-Intensitt benutzt
            |        |
            |        |
     64..79 |  -1    | kein Alpha-Channel
            |        |
            |        |
     80     |   5    | Bit fr Genlock
     81..95 |  -1    | nicht fr Genlock benutzt
            |        |
            |        |
     96..127|  -1    | keine unbenutzten Bits
            |        |

   In HiColor auf einer VGA-Grafikkarte wrden folgende Ausgaben erfolgen:

   work_out | Wert   | Bedeutung
   ---------|--------|-----------------------------------------------------
      0     |   2    | Packed Pixels
      1     |   2    | HiColor bzw. TrueColor
      2     |  16    | 16 Bit pro Pixel
      3/4   | 32768  | 32768 verschiedene Farben gleichzeitig mglich
      5     | xxxx   | Bitmapbreite in Bytes (erst ab EdDI 1.1)
      6/7   | xxxxL  | Bitmapadresse (erst ab EdDI 1.1)
      8     |   5    | 5 Bits fr die Rot-Intensitt
      9     |   5    | 5 Bits fr die Grn-Intensitt
     10     |   5    | 5 Bits fr die Blau-Intensitt
     11     |   0    | kein Bit fr Alpha-Channel
     12     |   0    | kein Bit fr Genlock
     13     |   1    | ein unbenutzes Bit
     14     |  129   | 15 Bit in Intel-Darstellung (erst ab EdDI 1.1)
            |        |
     16     |   2    | Bit 0 der Rot-Intensitt (niederwertigstes Bit)
            |        | befindet sich in Bit 11 des Pixels
     17     |   3    | Bit 1 befindet sich in Bit 12 des Pixels
     18     |   4    | ...
     19     |   5    | ...
     20     |   6    | Bit 4 der Rot-Intensitt (hchstwertigstes Bit)
            |        | befindet sich in Bit 15 des Pixels
     21..31 |  -1    | Bits werden nicht fr Rot-Intensitt benutzt
            |        |
            |        |
     32     |  13    | Bit 0 der Grn-Intensitt (niederwertigstes Bit)
            |        | befindet sich in Bit 6 des Pixels
     33     |  14    | Bit 1 befindet sich in Bit 7 des Pixels
     34     |  15    | ...
     35     |   0    | ...
     36     |   1    | Bit 4 der Grn-Intensitt (hchstwertigstes Bit)
            |        | befindet sich in Bit 10 des Pixels
     37..37 |  -1    | Bits werden nicht fr Grn-Intensitt benutzt
            |        |
            |        |
     48     |   8    | Bit 0 der Blau-Intensitt (niederwertigstes Bit)
            |        | befindet sich in Bit 0 des Pixels
     49     |   9    | Bit 1 befindet sich in Bit 1 des Pixels
     50     |  10    | ...
     51     |  11    | ...
     52     |  12    | Bit 4 der Blau-Intensitt (hchstwertigstes Bit)
            |        | befindet sich in Bit 4 des Pixels
     53..63 |  -1    | Bits werden nicht fr Blau-Intensitt benutzt
            |        |
            |        |
     64..79 |  -1    | kein Alpha-Channel
            |        |
            |        |
     80..95 |  -1    | nicht fr Genlock benutzt
            |        |
            |        |
     96     |   7    | unbenutztes Bit
     97..127|  -1    | keine unbenutzten Bits
            |        |

Bemerkungen:
Die Ausgaben in work_out[5..7/14] sind erst ab EdDI-Version 1.1 vorhanden und
sollen die Erkennung des Formats erleichtern. Bevor man auf sie zugreift, sollte
man noch die Version des EdDI-Cookies getestet haben.


 INQUIRE DEVICE STATUS INFORMATION (VDI 248)

Vq_devinfo() liefert zurck, ob ein Treiber ein Treiber vorhanden ist und ob er
schon geffnet wurde. Auerdem wird der Dateiname (z.B. XVGA256.SYS) und der
Klartextname (VGA 256 Farben) des Treibers zurckgeliefert. Wenn der Dateiname
leer ist, ist der Treiber nicht vorhanden.


Dekl.:  void  vq_devinfo( WORD handle, WORD device, WORD *dev_open,
                          BYTE *file_name, BYTE *device_name );
Aufruf: vq_devinfo( handle, device, &dev_open, file_name, device_name );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        248                 vq_devinfo
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         device              VDI-Gertenummer (0-99)

Ausgaben:

contrl[2]        p                   Anzahl der WRTER in ptsout
contrl[4]        i                   Anzahl der Wrter in intout

ptsout[0]        dev_open            0: Treiber ist noch nicht geffenet
                                     1: Treiber ist bereits geffnet
ptsout[1..p-1]   device_name         Klartextname des Treibers als C-String
intout[0..i-1]   file_name           Dateiname des Treibers

Bemerkungen:
Der Dateiname wird wortweise zurckgeliefert, d.h. 1 Wort pro Buchstabe, wobei
contrl[4] die Lnge angibt. Der Klartextname wird als nullterminierter C-String
zurckgeliefert - contrl[2] enthlt die Anzahl der _WRTER_ in ptsout.


 INQUIRE EXTENDED DEVICE STATUS INFORMATION (VDI 248, 4242)

hnlich wie vq_devinfo() liefert vq_ext_devinfo() Treibernamen und
Informationen ber den Treiber zurck. Das Format ist aber etwas sinnvoller.

Dekl.:  WORD  vq_ext_devinfo( WORD handle, WORD device, WORD *dev_exists,
                              BYTE *file_path, BYTE *file_name, BYTE *name );

Aufruf: dev_open = vq_ext_devinfo( handle, device, &dev_exists, file_path,
                                   file_name, name );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        248                 vq_devinfo
contrl[1]        0                   Eintrge in ptsin
contrl[3]        7                   Eintrge in intin
contrl[5]        4242                Unterfunktionsnummer
contrl[6]        handle
intin[0]         device              VDI-Gertenummer (0-99)
intin[1/2]       file_path           Zeiger auf den Datei-Pfad
intin[3/4]       file_name           Zeiger auf den Dateinamen
intin[5/6]       name                Zeiger auf den Klartextnamen

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        2                   Eintrge in intout
intout[0]        dev_exists          0: kein Treiber unter dieser Gertekennung
                                     != 0: Treiber vorhanden
intout[1]:       dev_open            0: Treiber wurde noch nicht geffnet
                                     != 0: Treiber wurde bereits geffnet

Alle zurckgelieferten Zeichenketten sind C-Strings.


Besonderheiten einzelner Treiber

 Druckertreiber - Gertekennungen 21 bis 30

   Bei NVDI-Druckertreibern kann bei v_opnwk() das Seitenformat und das
   GEMDOS-Ausgabegert gesetzt werden. Zustzlich zu den normalen Eingaben bei
   v_opnwk() mssen die folgenden Parameter bergeben werden:

   contrl[3]   16

   intin[11]         Seitenformat
                     #define  PAGE_DEFAULT   0     /* Voreinstellung benutzen */
                     #define  PAGE_A3        1     /* DIN A3 */
                     #define  PAGE_A4        2     /* DIN A4 */
                     #define  PAGE_A5        3     /* DIN A5 */
                     #define  PAGE_B5        4     /* DIN B5 */

                     #define  PAGE_LETTER    16    /* Letter size */
                     #define  PAGE_HALF      17    /* Half size */
                     #define  PAGE_LEGAL     18    /* Legal size */
                     #define  PAGE_DOUBLE    19    /* Double size */
                     #define  PAGE_BROAD     20    /* Broad sheet size */

   intin[12/13]      Zeiger auf einen GEMDOS-Dateinamen (C-String) oder Null
   intin[14]   0     reserviert
   intin[15]   0     reserviert

   NICHT ZU EMPFEHLEN:
   Man kann Breite und Hhe der vom Druckertreiber zu erzeugenden Bitmap setzen,
   indem man in ptsin[0/1] Breite - 1, Hhe - 1 und in contrl[1] eine 1 eintrgt
   und anschlieend v_opnwk() oder vq_extnd() aufruft. Dieses Verfahren ist
   NICHT ZU EMPFEHLEN, da eine Applikation nie genau abschtzen kann, wie gro
   die Bitmap tatschlich sein darf, damit der Drucker sie vernnftig ausgeben
   kann.

 META.SYS - Gertekennung 31

   Der Metafile-Treiber speichert alle an ihn gerichteten Aufrufe in einem
   GEM-Metafile, der sich im aktuellen Verzeichnis der Applikation befindet und
   als Voreinstellung den Namen GEMFILE.GEM hat. Mchte man den Namen ndern,
   sollte man direkt nach v_opnwk() die Funktion vm_filename() aufrufen, der man
   einen kompletten Dateinamen mit dem gewnschten Pfad und Namen bergeben
   sollte.
   Damit andere Programme den Metafile vernnftig darstellen knnen, sollten die
   Funktionen v_meta_extents(), vm_pagesize() und vm_coords() aufgerufen werden.

 MEMORY.SYS - Gertekennung 61

   Der Treiber MEMORY.SYS stellt eine monochrome Bitmap zur Verfgung, auf die
   mit allen VDI-Befehlen zugegriffen werden kann. Die Auflsung dieser Bitmap
   wird bei v_opnwk() gesetzt. Hierzu wird in ptsin[0/1] Breite - 1 und Hhe - 1
   bergeben, contrl[1] mu eine 1 enthalten. Nach v_opnwk() wird die Adresse
   der Bitmap in contrl[0/1] zurckgeliefert.
   Bei vq_extnd() kann man ebenfalls die Auflsung setzen. Auerdem besteht hier
   die Mglichkeit, einen eigenen Buffer zu bergeben. In diesem Fall enthlt
   contrl[3] eine 3 und intin[1/2] ist ein Zeiger auf den Buffer.
   Aufgrund der grerern Flexiblitt empfehlen wir OffScreenbitmaps anstelle
   des MEMORY.SYS-Treibers zu verwenden.

 IMG.SYS - Gertekennung 91 bis 99

   Genauso wie bei den NVDI-Druckertreibern kann man hier das Seitenformat und
   den Namen der IMG-Datei setzen - s.o.

   Eine weitere Mglichkeit den Dateinamen zu bergeben gibt es bei vq_extnd():

   contrl[1] = 4;
   ptsin[2] = 1157;
   ptsin[3/4] = Zeiger auf Dateinamen (BYTE *);
   ptsin[5/6] = Zeiger auf Fehlervariable (WORD *);
   ptsin[7] = 0;

 Faxtreiber - meist Gertekennung 81 bis 90

   Faxtreiber verhalten sich hnlich wie Druckertreiber. Man kann bei Ihnen aber
   weder Seitenformat noch das GEMDOS-Gert angeben. Man sollte auch nicht
   versuchen, die Gre der Bitmap zu verndern.




Farbeinstellungen
=================

 SET COLOR REPRESENTATION (VDI 14)

Mit dieser Funktion kann man die Farbabstufung einer Farbnummer  festlegen. Die
Intensitt von Rot, Grn und Blau wird jeweils in Promille (0-1000) angegeben.
Bei Gerten mit einer CLUT (Grafiksysteme bis 8 Planes/ 256 Farben) wirken sich
die Einstellungen sofort auf alle Punkte aus, die bisher auf dem Bildschirm mit
dem Farbindex <index> gezeichnet wurden.

Bei mehr als 256 gleichzeitig darstellbaren Farben benutzen Grafiksysteme in der
Regel keine CLUT sondern eine direkte RGB-Zuordnung pro Pixel (siehe hierzu auch
vq_scrninfo()). Die einzelnen Pixel enthalten dann statt eines Farbindex einen
direkten RGB-Wert (z.B. je 8 Bit fr R,G und B und 8 Bit Overlay). Bei einer
solchen Organisation stellt das VDI pro Workstation 256 lokale Farbstifte und
eine Pseudo-Palette zur Verfgung, fr die man  mit vs_color() die Farbwerte
setzen kann. Eine nderung  wirkt sich also erst dann aus, wenn man wieder mit
dem Farbstift zeichnet und wirkt sich immer nur auf die mit <handle> bezeichnete
Workstation aus.

Dekl.:  void vs_color( WORD handle, WORD index, RGB1000 *rgb_in );
Aufruf: vs_color( handle, index, &rgb_in );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        14                  vs_color
contrl[1]        0                   Eintrge in ptsin
contrl[3]        4                   Eintrge in intin
contrl[6]        handle
intin[0]         index               Farbnummer
intin[1..3]      rgb_in              Farbintensitten von Rot, Grn, Blau

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 INQUIRE COLOR REPRESENTATION (VDI 26)

"INQUIRE COLOR REPRESENTATION" gibt Auskunft ber die eingestellten
Farbintensitten, wobei die Mglichkeit besteht, zwischen der bergebenen und
der tatschlich eingestellten Intensitt zu unterscheiden.

Dekl.:  WORD vq_color( WORD handle, WORD color_index, WORD flag,
                       RGB1000 *rgb_out );
Aufruf: valid = vq_color( handle, color_index, set_flag, &rgb_out );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        26                  vq_color
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0]         color_index         Farbnummer
intin[1]         flag                Flag fr Art der Intensitt

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        4                   Eintrge in intout
intout[0]        valid               Farbindex auerhalb der Grenzen
intout[1..3]     rgb_out             Intensitt von Rot, Grn und Blau

Bedeutung von flag:
0: es wird die vom  Anwender bei vs_color bergebene Farbintensitt
   zurckgegeben.
1: es wird die tatschlich eingestellte Farbintensitt zurckgegeben

Bemerkung:
Die an vs_color bergebene und die eingestellte Farbintensitt knnen bei
Systemen mit einer CLUT voneinander abweichen, wenn die Anzahl der mglichen
Farbabstufungen zu klein ist. Bei Direct-RGB (keine CLUT) wird meistens die
tatschlich eingestellte Intensitt auch als die vom Anwender bergebene
Intensitt zurckgeliefert, da die Anzahl der Abstufungen ausreichend gro ist.


 SET CALIBRATION (VDI 5, ESCAPE 76)

Mit SET CALIBRATION kann man die Farbkalibration ein- oder ausschalten und kann
eine Kalibrationstabelle bergeben. Eine Kalibrationstabelle besteht aus 1001
RGB-Eintrgen, die fr den Wertebereich 0 bis 1000 Promille jedem Eingabewert
einen korrigierten Promille-Wert zuordnet. Bevor man diese Funktion aufruft,
sollte man mit vq_clibrate() feststellen, ob sie berhaupt vorhanden ist.

Dekl.:  WORD vs_calibrate( WORD handle, WORD flag, RGB1000 *table );
Aufruf: cal_flag = vs_calibrate( handle, flag, &table );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   v_escape()
contrl[1]        0                   Eintrge in ptsin
contrl[3]        3                   Eintrge in intin
contrl[5]        76                  Unterfunktionsnummer vs_calibrate()
contrl[6]        handle
intin[0..1]      table               Zeiger auf Kalibrationstabelle oder 0L
intin[2]         flag                Kalibration aus (0) oder ein (1)
Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        cal_flag            Kalibration aus (0) oder ein (1)

Bemerkung:
Die Farbkalibration ist im gesamten System fr den mit <handle> bezeichneten
Treiber gltig. Daher sollte sie nicht von einzelnen Anwendungen, sondern nur
durch ein CPX-Modul oder Accessory eingestellt werden.


 INQUIRE CALIBRATION (VDI 5, ESCAPE 77)

Diese Funktion liefert zurck, ob Funktionen zur Kalibrierung vorhanden sind und
ob die Kalibrierung eingeschaltet ist. Wenn contrl[4] einen 0 enthlt, wird
Kalibrierung nicht untersttzt.

Dekl.:  WORD vq_calibrate( WORD handle, WORD *flag );
Aufruf: exists = vq_calibrate( handle, &flag );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   v_escape()
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        77                  Unterfunktionsnummer vq_calibrate()
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        exists              Eintrge in intout (0 oder 1)
intout[0]        flag                Kalibration aus (0) oder ein (1)





Verknpfung und Zeichenbereich
==============================

 SET WRITING MODE (VDI 32)

Diese Funktion whlt die Verknpfung der Grafikoperationen aus.  Bei  bergabe
eines nicht vorhandenen Modus wird Modus 1 (REPLACE) angewhlt.

Dekl.:  WORD vswr_mode( WORD handle, WORD mode );
Aufruf: set_mode = vswr_mode( handle, mode );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        32                  vswr_mode
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         mode                gewnschter Verknpfungsmodus

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_mode            ausgewhlter Verknpfungsmodus

Bedeutung von mode:
1, REPLACE:          Alles, was sich unter dem Grafik-Element befindet, wird
                     berdeckt.
2, TRANSPARENT:      Nur die gesetzen Pixel des Grafik-Elementes berdecken den
                     Hintergrund.
3, XOR:              Pixel des Grafik-Elementes darunterliegende Pixel werden
                     mit einer XOR-Funktion verknpft.
4, REV. TRANSPARENT: Die nicht gesetzten Pixel des Grafik-Elements berdecken
                     den Hintergrund.


 SET CLIPPING RECTANGLE (VDI 129)

Mit  dieser  Funktion  kann  man  den  Arbeitsbereich  der   Grafikoperationen
begrenzen oder freigeben.  Ist der Arbeitsbereich begrenzt worden,  so  werden
berstehende Teile nicht ausgegeben.

Dekl.:  void vs_clip( WORD handle, WORD clip_flag, WORD *area );
Aufruf: vs_clip( handle, clip_flag, area );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        129                 vs_clip
contrl[1]        2                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         clip_flag           0: Clipping aus, 1: Clipping an
ptsin[0..3]      area[0..3]          Arbeitsbereich

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout

Bemerkung:
Das Clipping sollte aus Sicherheitsgrnden immer eingeschaltet werden, da die
Ausgaberoutinen beim berschreiten der Bildschirmgrenzen sehr schnell groe
Speicherbereiche berschreiben, was zu unerfreulichen Abtrzen und Datenmll
fhren kann.

Wenn der Arbeitsbereich den ganzen Bildschirm einbeziehen soll, ist es  ratsam,
bei vs_clip() die bei v_opnvwk() erhaltenen Bildschirmausmae einzustellen.




Linien und nicht gefllte Grafikprimitive
=========================================

 POLYLINE (VDI 6)

"POLYLINE" zeichnet einen Linienzug. Alle angegebenen Punkte werden nacheinander
mit Linien verbunden. Es mssen mindestens zwei Koordinatenpaare bergeben
werden.

Dekl.:  void v_pline( WORD handle, WORD count, WORD *xyarr );
Aufruf: v_pline( handle, count, xyarr );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        6                   v_pline
contrl[1]        n                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[0..2n-1]   xyarr[0..2n-1]      Koordinaten

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 OUTPUT BEZIER (VDI 6, 13)

Diese Funktion zeichnet eine ungefllte Bezierkurve.

Dekl.:  void v_bez( WORD handle, WORD count, WORD *xyarr, char *bezarr,
                    WORD *extent,int *totpts, WORD *totmoves );

Aufruf: v_bez( handle, count, xyarr, bezarr, extent, totpts, totmoves );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        6                   v_bez
contrl[1]        n                   Eintrge in ptsin
contrl[3]        (n+1)/2             Eintrge in intin
contrl[5]        13                  signalisiert v_bez
contrl[6]        handle
ptsin[0..2n-1]   xyarr[0..2n-1]      Koordinaten
intin[0..(n+1)/2-1] bezarr[0..n-1]   Punkttypen

Ausgaben:

contrl[2]        2                   Eintrge in ptsout
contrl[4]        6                   Eintrge in intout

intout[0]        totpts              Anzahl der berechneten Punkte
intout[1]        totmoves            Anzahl der Unterbrechungen im Linienzug
intout[2..5]                         reserviert
ptsout[0..3]     extent[0..3]        Koordinaten des umschlieenden Rechtecks

Bedeutung der Punkttypen:
Bit 0:   Startpunkt eines 4-Punkte Beziersegments (2 Ankerpunkte und zwei
         Richtungspunkte). Der Endpunkt eines Beziersegments kann auch der
         Startpunkt des nchsten Beziers sein - er kann aber kein "jump point"
         sein.

Bit 1:   "jump point". Dieser Punkt und der vorhergehende werden nicht
         verbunden. Ntzlich um Enklaven oder Exklaven zu zeichnen.

Bit 2-7 sind undefiniert. Ist im Punkttyp Bit 0 gelscht, verhlt sich die
Bezierfunktion wie "POLYLINE" mit der Erweiterung, ber den "jump point"
Enklaven oder Exklaven zeichnen zu knnen.

Bemerkung:
Die im Byte-Array bezarr bergebenen Punkttypen mssen vom C-Binding vertauscht
werden, da diese Funktion leider diesbezglich kompatibel zum PC-GEM ist.
bezarr[0] wird ins Low-Byte von intin[0] und bezarr[1] ins High-Byte von
intin[0] geschrieben.


 ARC (VDI 11, GDP 2)

"ARC" zeichnet einen Kreisbogen, dessen Start- und Endwinkel in 1/10 Grad von 0
bis 3600 angegeben werden.

Dekl.:  void v_arc( WORD handle, WORD x, WORD y, WORD radius,
                    WORD begang, WORD endang );
Aufruf: v_arc( handle, x, y, radius, begang, endang );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        11                  GDP
contrl[1]        4                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[5]        2                   v_arc
contrl[6]        handle
intin[0]         begang              Startwinkel
intin[1]         endang              Endwinkel
ptsin[0]         x
ptsin[1]         y
ptsin[6]         radius              Radius

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ELLIPTICAL ARC (VDI 11, GDP 6)

"ELLIPTICAL ARC" zeichnet einen Ellipsenbogenausschnitt. Die Winkelangabe
erfolgt in 1/10 Grad von 0 bis 3600.

Dekl.:  void v_ellarc( WORD handle, WORD x, WORD y, WORD x_radius,
                       WORD y_radius, WORD begang, WORD endang );
Aufruf: v_ellarc( handle, x, y, x_radius, y_radius, begang, endang );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        11                  GDP
contrl[1]        2                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[5]        6                   v_ellarc
contrl[6]        handle
intin[0]         begang              Startwinkel
intin[1]         endang              Endwinkel
ptsin[0]         x
ptsin[1]         y
ptsin[2]         xradius             Radius in horizontaler Richtung
ptsin[3]         yradius             Radius in vertikaler Richtung

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ROUNDED RECTANGLE (VDI 11, GDP 8)

Ein Rechteck mit gerundeten Ecken wird gezeichnet.

Dekl.:  void v_rbox( WORD handle, WORD *rect );
Aufruf: v_rbox( handle, rect );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        11                  GDP
contrl[1]        2                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        8                   v_rbox
contrl[6]        handle
ptsin[0..3]      rect[0..3]          Koordinaten

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ENABLE BEZIER CAPABILITIES (VDI 11, GDP 13)

Diese Funktion ist aus Kompatibilittsgrnden vorhanden. Sie sorgt dafr, da
Aufrufe von v_pline() ohne die Unterfunktionsnummer 13 als Aufrufe von v_bez()
und Aufrufe von v_fillarea() ohne die Unterfunktiosnummer als Aufrufe von
v_bez_fill() aufgefat werden. v_bez_on() wird normalerweise nur verwendet, um
festzustellen, ob Beziers vorhanden sind - in diesem Fall ist retval ungleich 0
(vorher sollte man intout[0] auf 0 setzen!).

Dekl.:  WORD v_bez_on( WORD handle );
Aufruf: retval = v_bez_on( handle );

Variable         Belegung         Bedeutung
Eingaben:

contrl[0]        11               GDP
contrl[1]        1                Eintrge in ptsin - signalisiert v_bez_on
contrl[3]        0                Eintrge in intin
contrl[5]        13               v_bez_on
contrl[6]        handle

Ausgaben:

intout[0]        retval           Beziertiefe

Bedeutung von retval:
<retval> kann einen Wert von 0 (keine Beziers) bis 7 (maximale Qualitt)
annehmen, der ein ungefhres Ma fr die Kurvenqualitt darstellt -
normalerweise kann man von diesem Wert nur ableiten, ob Beziers vorhanden sind.


 DISABLE BEZIER CAPABILITIES (VDI 11, GDP 13)

Diese Funktion ist aus Kompatibilittsgrnden vorhanden. Sie schaltet die
Sonderbehandlung fr v_bez() und v_bez_fill() aus.

Dekl.:  void v_bez_off( WORD handle );
Aufruf: v_bez_off( handle );

Variable         Belegung         Bedeutung
Eingaben:

contrl[0]        11               GDP
contrl[1]        0                Eintrge in ptsin - signalisiert v_bez_off
contrl[3]        0                Eintrge in intin
contrl[5]        13               v_bez_off
contrl[6]        handle

Ausgaben:

-


 SET BEZIER QUALITY (VDI 5, ESCAPE 99)

Mit dieser Funktion wird die Qualitt der Bezierfunktionen eingestellt. Die
Qualitt kann in Prozent von 0 - 100 eingestellt werden.

Dekl.:  WORD v_bez_qual( WORD handle, WORD qual, WORD *set_qual );
Aufruf: v_bez_qual( handle, qual, &set_qual );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        3                   Eintrge in intin
contrl[5]        99
contrl[6]        handle
intin[0]         32                  intin[0..1] signaliseren v_bez_qual()
intin[1]         1
intin[2]         qual                gewnschte Bezierqualitt in Prozent

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_qual            eingestellte Bezierqualitt in Prozent


 SET POLYLINE LINE TYPE (VDI 15)

Mit "SET POLYLINE LINE TYPE" kann man den Linientyp festlegen. Wenn der
gewnschte Linientyp nicht einstellbar ist, wird der Linientyp 1 (durchgehende
Linie) eingestellt.

Dekl.:  WORD vsl_type( WORD handle, WORD type );
Aufruf: set_type = vsl_type( handle, type );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        15                  vsl_type
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         type                gewnschter Linientyp

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_type            ausgewhlter Linientyp

Bedeutung von type:
1: %1111111111111111  (durchgehende Linie)
2: %1111111111110000  (langer Strich)
3: %1110000011100000  (Punkte)
4: %1111111100011000  (Strich, Punkt)
5: %1111111100000000  (Strich)
6: %1111000110011000  (Strich, Punkt, Punkt)
7: benutzerdefiniert ber vsl_udsty()


 SET POLYLINE LINE WIDTH (VDI 16)

Diese Funktion setzt die Linienbreite, wobei nur ungerade Werte eingestellt
werden (ggf. wird auf den nchstkleineren Wert gerundet). Linien die breiter als
1 Pixel sind werden von den meisten Treibern nur ohne Muster gezeichnet.

Dekl.:  WORD vsl_width( WORD handle, WORD width );
Aufruf: set_width = vsl_width( handle, width );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        16                  vsl_width
contrl[1]        1                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[0]         width               gewnschte Linienbreite

Ausgaben:

contrl[2]        1                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
ptsout[0]        set_width           ausgewhlte Linienbreite

Bemerkung:
Die Linienbreite orientiert sich immer an der horizontalen Pixelgre.


 SET POLYLINE COLOR INDEX (VDI 17)

Der Farbindex fr Linien wird gesetzt. Bei ungltigem Index wird der Farbindex 1
gesetzt.

Dekl.:  WORD vsl_color( WORD handle, WORD color_index );
Aufruf: set_color = vsl_color( handle, color_index );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        17                  vsl_color
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         color_index         gewnschte Linienfarbe

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_color           ausgewhlte Linienfarbe


 INQUIRE CURRENT POLYLINE ATTRIBUTES (VDI 35)

Diese Funktion gibt die aktuellen Linienattribute zurck.

Dekl.:  void vql_attributes( WORD handle, WORD *attrib );
Aufruf: vql_attributes( handle, attrib );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        35                  vql_attributes
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        1                   Eintrge in ptsout
contrl[4]        5                   Eintrge in intout
intout[0]        attrib[0]           Linientyp
intout[1]        attrib[1]           Linienfarbe
intout[2]        attrib[2]           Schreibmodus
intout[3]        attrib[4]           Linienanfangsform
intout[4]        attrib[5]           Linienendform
ptsout[0]        attrib[3]           Linienbreite


 SET POLYLINE END STYLES (VDI 108)

Das Aussehen der Linienenden wird mit "SET POLYLINE END STYLES" bestimmt. Bei
ungltigen Angaben wird das betreffende Linienende eckig.

Dekl.:  void vsl_ends( WORD handle, WORD beg_style, WORD end_style );
Aufruf: vsl_ends( handle, beg_style, end_style );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        108                 vsl_ends
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0]         beg_style           Aussehen des Linienanfangs
intin[1]         end_style           Aussehen des Linienendes

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout

Bedeutung von beg_style und end_style:
0: eckig
1: Pfeil
2: abgerundet


 SET USER-DEFINED LINE STYLE PATTERN (VDI 113)

Mit dieser Funktion legt man den benutzerdefinierten Linientyp von "SET POLYLINE
LINE TYPE" fest.

Dekl.:  void vsl_udsty( WORD handle, WORD pattern );
Aufruf: vsl_udsty( handle, pattern );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        113                 vsl_udsty
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         pattern             benutzerdefiniertes Linienmuster

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout




Gefllte Grafikprimitive
========================

 FILLED AREA (VDI 9)

Durch "FILLED AREA" wird eine beliebige, gefllte Flche gezeichnet.

Dekl.:  void v_fillarea( WORD handle, WORD count, WORD *xyarr );
Aufruf: v_fillarea( handle, count, xyarr );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        9                   v_fillarea
contrl[1]        n                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[0..2n-1]   xyarr[0..2n-1]      Koordinaten

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 OUTPUT FILLED BEZIER (VDI 9, 13)

Diese Funktion zeichnet eine gefllte Bezierkurve.

Dekl.:  void v_bez_fill( WORD handle, WORD count, WORD *xyarr, char *bezarr,
                         WORD *extent,int *totpts, WORD *totmoves );
Aufruf: v_bez_fill( handle, count, xyarr, bezarr, extent, totpts, totmoves );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        9                   v_bez_fill
contrl[1]        n                   Eintrge in ptsin
contrl[3]        (n+1)/2             Eintrge in intin
contrl[5]        13                  signalisiert v_bez_fill
contrl[6]        handle
ptsin[0..2n-1]   xyarr[0..2n-1]      Koordinaten
intin[0..(n+1)/2-1] bezarr[0..n-1]   Punkttypen

Ausgaben:

contrl[2]        2                   Eintrge in ptsout
contrl[4]        6                   Eintrge in intout
intout[0]        totpts              Anzahl der berechneten Punkte
intout[1]        totmoves            Anzahl der Unterbrechungen im Linienzug
intout[2..5]                         reserviert
ptsout[0..3]     extent[0..3]        Koordinaten des umschlieenden Rechtecks

Bedeutung der Punkttypen:
Bit 0:   Startpunkt eines 4-Punkte Beziersegments (2 Ankerpunkte und zwei
         Richtungspunkte). Der Endpunkt eines Beziersegments kann auch der
         Startpunkt des nchsten Beziers sein - er kann aber kein "jump point"
         sein.

Bit 1:   "jump point". Dieser Punkt und der vorhergehende werden nicht
         verbunden. Ntzlich um Enklaven oder Exklaven zu zeichnen.

Bit 2-7 sind undefiniert. Ist im Punkttyp Bit 0 gelscht, verhlt sich die
Bezierfunktion wie "FILLED AREA" mit der Erweiterung, ber den "jump point"
Enklaven oder Exklaven zeichnen zu knnen.

Bemerkung:
Die im Byte-Array bezarr bergebenen Punkttypen mssen vom C-Binding vertauscht
werden, da diese Funktion leider diesbezglich kompatibel zum PC-GEM ist.
bezarr[0] wird ins Low-Byte von intin[0] und bezarr[1] ins High-Byte von
intin[0] geschrieben.


 BAR (VDI 11, GDP 1)

Von dieser Funktion wird ein ausgeflltes Rechteck gezeichnet. Im Gegensatz zu
"FILLED RECTANGLE" wird eine Umrahmung ausgegeben.

Dekl.:  void v_bar( WORD handle, WORD *rect );
Aufruf: v_bar( handle, rect );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        11                  GDP
contrl[1]        2                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        1                   v_bar
contrl[6]        handle
ptsin[0..3]      rect[0..3]          Koordinaten des Rechtecks

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 PIE (VDI 11, GDP 3)

Diese Funktion zeichnet einen Kreisflchenausschnitt. Die Winkel werden in
1/10 Grad von 0 bis 3600 angegeben.

Dekl.:  void v_pieslice( WORD handle, WORD x, WORD y, WORD radius,
                         WORD begang, WORD endang );
Aufruf: v_pieslice( handle, x, y, radius, begang, endang );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        11                  GDP
contrl[1]        4                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[5]        3                   v_pieslice
contrl[6]        handle
intin[0]         begang              Startwinkel
intin[1]         endang              Endwinkel
ptsin[0]         x
ptsin[1]         y
ptsin[6]         radius              Radius

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 CIRCLE (VDI 11, GDP 4)

Die Funktion "CIRCLE" zeichnet eine Kreisflche.

Dekl.:  void v_circle( WORD handle, WORD x, WORD y, WORD radius );
Aufruf: v_circle( handle, x, y, radius );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        11                  GDP
contrl[1]        3                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[5]        4                   v_circle
contrl[6]        handle
intin[0]         begang              Startwinkel
intin[1]         endang              Endwinkel
ptsin[0]         x
ptsin[1]         y
ptsin[4]         radius              Radius

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ELLIPSE (VDI 11, GDP 5)

Diese Funktion zeichnet eine Ellipsenflche.

Dekl.:  void v_ellipse( WORD handle, WORD x, WORD y,
                        WORD x_radius, WORD y_radius  );
Aufruf: v_ellipse( handle, x, y, x_radius, y_radius );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        11                  GDP
contrl[1]        2                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        5                   v_ellipse
contrl[6]        handle
ptsin[0]         x
ptsin[1]         y
ptsin[2]         x_radius            Radius in horizontaler Richtung
ptsin[3]         y_radius            Radius in vertikaler Richtung

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ELLIPTICAL PIE (VDI 11, GDP 7)

Die Funktion "ELLIPTICAL PIE" zeichnet einen Ellipsenflchenausschnitt. Die
Angabe der Winkel geschieht in Zehntelgrad von 0 bis 3600.

Dekl.:  void v_ellpie( WORD handle, WORD x, WORD y, WORD x_radius,
                       WORD y_radius, WORD begang, WORD endang );
Aufruf: v_ellpie( handle, x, y, x_radius, y_radius, begang, endang );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        11                  GDP
contrl[1]        2                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[5]        7                   v_ellpie
contrl[6]        handle
intin[0]         begang              Startwinkel
intin[1]         endang              Endwinkel
ptsin[0]         x
ptsin[1]         y
ptsin[2]         x_radius            Radius in horizontaler Richtung
ptsin[3]         y_radius            Radius in vertikaler Richtung

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 FILLED ROUNDED RECTANGLE (VDI 11, GDP 9)

Diese Funktion zeichnet ein ausgeflltes, abgerundetes Reckteck.

Dekl.:  void v_rfbox( WORD handle, WORD *rect );
Aufruf: v_rfbox( handle, rect );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        11                  GDP
contrl[1]        2                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        9                   v_rfbox
contrl[6]        handle
ptsin[0..3]      rect[0..3]          Koordinaten

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 SET FILL INTERIOR INDEX (VDI 23)

Der  Flltyp  kann  mit  dieser Funktion ausgewhlt werden. Bei bergabe eines
ungltigem Flltyps wird der Typ 0 (leer) eingestellt.

Dekl.:  WORD vsf_interior( WORD handle, WORD interior );
Aufruf: set_interior = vsf_interior( handle, interior );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        23                  vsf_interior
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         interior             gewnschter Flltyp

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_interior        ausgewhlter Flltyp

Bedeutung von interior:
0: leer
1: voll
2: gemustert
3: schraffiert
4: benutzerdefiniert


 SET FILL STYLE INDEX (VDI 24)

Mit dieser Funktion wird der zum Flltyp gehrende Fllindex gesetzt.

Dekl.:  WORD vsf_style( WORD handle, WORD style_index );
Aufruf: set_style = vsf_style( handle, style_index );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        24                  vsf_style
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         style_index         gewnschter Fllindex

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_sytle           ausgewhlter Fllindex


 SET FILL COLOR INDEX (VDI 25)

Der Farbindex fr Fllmuster wird mit dieser Funktion ausgewhlt. Bei einem
ungltigen Index wird Farbindex 1 eingestellt. Der Farbindex hat keine
Auswirkung auf mehrfarbige Muster (siehe auf vsf_udpat); er sollte hier auf 1
gesetzt werden.

Dekl.:  WORD vsf_color( WORD handle, WORD color_index );
Aufruf: set_color = vsf_color( handle, color_index );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        25                  vsf_color
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         color_index         gewnschter Farbindex

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_color           ausgewhlter Farbindex


 INQUIRE CURRENT FILL AREA ATTRIBUTES (VDI 37)

Diese Funktion gibt Auskunft ber die aktuellen Fllattribute.

Dekl.:  void vqf_attributes( WORD handle, WORD *attrib );
Aufruf: vqf_attributes( handle, attrib );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        37                  vqm_attributes
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        5                   Eintrge in intout
intout[0]        attrib[0]           Flltyp
intout[1]        attrib[1]           Fllfarbe
intout[2]        attrib[2]           Fllmusterindex
intout[3]        attrib[3]           Schreibmodus
intout[4]        attrib[4]           Umrahmungs-Flag


 CONTOUR FILL (VDI 103)

Diese Funktion fllt vom Startpunkt aus eine Flche, wobei diese Flche durch
den Bildrand oder eine andere Farbe begrenzt wird. Gertetreiber, die mit einer
Display-List arbeiten (Druckertreiber, IMG-Treiber,...) untersttzen
v_contourfill() nicht oder knnen sie nur dann ausfhren, wenn gengend Speicher
vorhanden ist.

Dekl.:  void v_contourfill( WORD handle, WORD x, WORD y, WORD color_index );
Aufruf: v_contourfill( handle, x, y, color_index );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        103                 v_contourfill
contrl[1]        1                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         color_index         Farbindex
ptsin[0]         x
ptsin[1]         y

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 SET FILL PERIMETER VISIBILITY (VDI 104)

Die  Umrahmung einer gefllten Flche (Rechteck, Polygon, Ellipse, ...) kann mit
dieser Funktion ein- oder ausgeschaltet werden.

Dekl.:  WORD vsf_perimeter( WORD handle, WORD flag );
Aufruf: set_perimeter = vsf_perimter( handle, flag );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        104                 vsf_perimeter
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         flag                gewnschtes Umrahmungs-Flag

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_perimeter       ausgewhltes Umrahmungs-Flag

Bedeutung von flag:
0: keine Umrahmung
1: Umrahmung

 SET USER-DEFINED FILL PATTERN (VDI 112)

Mit  "SET USER-DEFINED FILL PATTERN" kann ein  benutzerdefiniertes  Fllmuster
von 16*16 Pixel (16 Worte pro Musterebene) festgelegt werden. Mehrfarbige Muster
werden im Standardformat bergeben und mssen die gleiche Ebenenanzahl haben wie
der Bildschirm. Die Ausnahme von dieser Regel sind die Direct-RGB-Modi (mehr als
8 Ebenen mit direkter RGB-Zuordnung) wie True-Color. Hier wird das Muster immer
als True-Color-Muster mit 32-Bit-Pixeln (xRGB) bergeben.

Dekl.:  void vsf_udpat( WORD handle, WORD *pattern, WORD planes );
Aufruf: vsf_udpat( handle, pattern, planes );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        112                 vsf_udpat
contrl[1]        0                   Eintrge in ptsin
contrl[3]        16n                 Eintrge in intin (Musterebenen*16)
contrl[6]        handle
intin[0..16n-1]  pattern[0..16n-1]   Musterebenen

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout

Bemerkung:
Bei Mehrfarbmustern sollte man die Fllfarbe auf 1 setzen und als Schreibmodus
REPLACE anwhlen.


 FILLED RECTANGLE (VDI 114)

"FILLED RECTANGLE" zeichnet ein ausgeflltes Rechteck ohne Umrahmung.

Dekl.:  void vr_recfl( WORD handle, WORD *rect );
Aufruf: vr_recfl( handle, rect );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        114                 vr_recfl
contrl[1]        2                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[0..3]      rect[0..3]          Koordinaten

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout




Marker
======

 POLYMARKER (VDI 7)

Diese Funktion zeichnet Marker an den angegebenen Stellen.

Dekl.:  void v_pmarker( WORD handle, WORD count, WORD *xyarr );
Aufruf: v_pmarker( handle, count, xyarr );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        7                   v_pmarker
contrl[1]        n                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[0..2n-1]   xyarr[0..2n-1]      Koordinaten

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 SET POLYMARKER TYPE (VDI 18)

Mit  dieser  Funktion  wird der gewnschte Marker  ausgewhlt.  Im  Fall  einer
fehlerhaften Markernummer wird Markertyp 3 benutzt.

Dekl.:  WORD vsm_type( WORD handle, WORD type );
Aufruf: set_type = vsm_type( handle, type );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        18                  vsm_type
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         type                gewnschter Markertyp

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_type            ausgewhlter Markertyp

Bedeutung von type:
1: Punkt
2: Plus
3: Sternchen
4: Quadrat
5: Kreuz
6: Raute


 SET POLYMARKER HEIGHT (VDI 19)

Die Markergre kann mittels "SET POLYMARKER HEIGHT" eingestellt werden. Falls
die eingestellte Hhe nicht existiert, wird die nchstkleinere Hhe eingestellt.
Der Markertyp 1 (Punkt) hat immer die Hhe 1.

Dekl.:  WORD vsm_height( WORD handle, WORD height );
Aufruf: set_height = vsm_height( handle, height );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        19                  vsm_height
contrl[1]        1                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[1]         height              gewnschte Markerhhe

Ausgaben:

contrl[2]        1                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
ptsout[0]        set_width           ausgewhlte Markerbreite
ptsout[1]        set_height          ausgewhlte Markerhhe


 SET POLYMARKER COLOR INDEX (VDI 20)

Diese Funktion setzt den Farbindex der Marker. Bei ungltigem Index wird der
Farbindex 1 gesetzt.

Dekl.:  WORD vsm_color( WORD handle, WORD color_index );
Aufruf: set_color = vsm_color( handle, color_index );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        20                  vsm_color
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         color_index         gewnschte Markerfarbe

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_color           ausgewhlte Markerfarbe


 INQUIRE CURRENT POLYMARKER ATTRIBUTES (VDI 36)

"INQUIRE CURRENT POLYMARKER ATTRIBUTES" gibt Auskunft ber die eingestellten
Markerattribute.

Dekl.:  void vqm_attributes( WORD handle, WORD *attrib );
Aufruf: vqm_attributes( handle, attrib );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        36                  vqm_attributes
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        1                   Eintrge in ptsout
contrl[4]        3                   Eintrge in intout
intout[0]        attrib[0]           Markertyp
intout[1]        attrib[1]           Markerfarbe
intout[2]        attrib[2]           Schreibmodus
ptsout[0]        attrib[4]           Markerbreite
ptsout[1]        attrib[3]           Markerhhe




Textausgaben mit Bitmap- und Vektorfonts
========================================

Zunchst ein paar generelle Erklrungen und Anmerkungen zum Thema Text...

Font-ID und Index:

Der Index eines Fonts ist eine Zahl zwischen 1 und der verfgbaren Fontanzahl.
Je nach Anzahl der auf dem jeweiligen Rechner installierten Fonts hat ein Font
wie z.B. "Swiss 721" einen unterschiedlichen Index.
Die Font-ID ist dagegen eine Kennung, die grundstzlich fr einen Font
unabhngig vom System immer gleich ist - fr "Swiss 721" z.B. 5003. Ausnahmen
von dieser Regel sind aber bei Fonts mglich, die keine verwendbare Font-ID
haben. In diesem Fall wird versucht, eine eindeutige ID zu erzeugen. Da es aber
mglich ist, da eine derart erzeugte ID fr einen Font nicht auf allen Systemen
identisch ist, sollten Programme fr eine eindeutige Zuordnung des Fonts auer
der ID auch den Namen abspeichern.

Vektorfont oder Bitmap-Font?

Wenn es sich bei einem eingstellten Font um einen Vektorfont handelt, liefert
vqt_name() 34 Eintrge in intout zurck und intout[33] enthlt einen Wert
ungleich 0. Ist intout[33] 0 oder werden nur 33 Eintrge zurckgeliefert,
handelt es sich um einen Bitmap-Font.

quidistante Fonts (monospaced):

Fr manche Applikationen ist es zweckmig, bei der Ausgabe nur quidistante
Fonts zu benutzen. Das sinnvollste Vorgehen dafr sieht wie folgt aus:

a) Wenn vqt_name() in erweiterter Form (35 Eintrge in intout) vorhanden ist,
   sollte einfach das entsprechende Bit in intout[34] abgetestet werden.
b) Wenn vqt_name() nur die Information bietet, da es sich um einen Vektorfont
   handelt (34 Eintrge in intout, intout[33] != 0), sollte fr Vektorfonts
   vqt_fontheader() aufgerufen und Bit 1 von FH_CLFGS geprft werden.
c) Wenn es sich nicht um einen Vektorfont handelt und a) und b) nicht zutreffen,
   mssen die Zeichenbreiten einzeln mit vqt_width() erfragt und miteinander
   verglichen werden.

Wer quidistante Vektorfonts mit v_ftext() ausgibt, darf als Breite nicht mit
den Ausgaben von vst_height() oder vqt_width() rechnen, sondern mu sie bei
vqt_advance() erfragen, da bei v_ftext() immer mit Breiten in 1/65536 Pixeln
positioniert wird. Bei Ausgabe ber v_gtext() sind die Rckgaben von vqt_width()
zutreffend.

Hhe und Breite von Vektorfonts:

Die Hhe und Breite eines Vektorfonts kann mit den Funktionen vst_arbpt() und
und vst_setsize() in 1/65536 pt eingestellt werden (1 pt  1/72 Zoll  353 m).
Bei negativer Hhe oder Breite wird der Text an der jeweiligen Achse gespiegelt.

Pair- und Track-Kerning:

Sowohl Pair- als auch Track-Kerning sind nach dem ffnen einer Workstation
ausgestellt. Um eine bessere Textdarstellung zu haben, sollte das Pair-Kerning
daher mit vst_kern() eingeschaltet werden.

Positionierung von Vektortext:

Bei der Ausgabe von Vektorfonts wird innerhalb des VDIs mit Schrittweiten von
1/65536 Pixel Auflsung gerechnet, um unabhngig vom verwendeten Ausgabegert
und dessen tatschlicher Auflsung eine gleichbleibende Zeichenpositionierung zu
gewhrleisten. Um die Bitmaps fr die einzelnen Zeichen auszugeben, werden diese
Festkommawerte in Pixel umgerechnet, indem 32768 hinzuaddiert und anschlieend
durch 65536 geteilt wird.

Wenn das Track-Kerning eingeschaltet ist, wird zu jeder Zeichenposition der bei
vqt_trackkern() zu erfragende Offset addiert.

Bei eingeschaltetem Pair-Kerning wird zu jeder Zeichenposition der von
vqt_pairkern() zurckgelieferte Offset addiert.

Pair- und Track-Kerning und die Positionierung in 1/65536 Pixeln werden nur
eingesetzt, wenn v_ftext() aufgerufen wird! Bei v_gtext() verhalten sich
Vektorfonts weitgehend wie Bitmap-Fonts und weder Kerning noch genaue
Positionierung werden benutzt.

Gre von Vektorfonts/Pixelgren:

Die meisten Bildschirmtreiber liefern eine Auflsung von  91 dpi zurck, nach
der sich auch die Gre der Vektorfonts richtet. Da nicht bei jedem Schirm 91
dpi vorhanden sind, sollten Programme bei Textdarstellung auf dem Bildschirm
nicht fest mit diesem Wert rechnen, sondern die Ausgaben von v_opnwk(),
v_opnvwk(), vq_extnd() und v_opnbm() beachten. Andernfalls knnen bei
abweichenden Pixelgren Darstellungsfehler auftreten.
Beim Ausdruck sollten die genaueren Pixelgren bei vq_extnd() beachtet werden,
damit die Textpositionierung mglichst genau ist.


 TEXT (VDI 8)

"TEXT" gibt eine Zeichenkette mit Attributen aus. Ist ein Vektorfont
eingestellt, so wird weder Pair- noch Track-Kerning beachtet. Die
Zeichenpositionierung erfolgt auerdem pixelweise, d.h. vqt_width() liefert
hierfr die passenden Schrittgren.

Dekl.:  void v_gtext( WORD handle, WORD x, WORD y, BYTE *string );
Aufruf: v_gtext( handle, x, y, string );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        8                   v_gtext
contrl[1]        1                   Eintrge in ptsin
contrl[3]        n                   Eintrge in intin
contrl[6]        handle
intin[0..n-1]    string[0..n-1]      Zeichenkette
ptsin[0]         x
ptsin[1]         y

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 JUSTIFIED GRAPHICS TEXT (VDI 11, GDP 10)

"JUSTIFIED GRAPHICS TEXT" ermglicht die  Ausgabe einer Zeichenkette mit
Attributen und Dehnung oder Stauchung auf die gewnschte Lnge, wobei entweder
Wort- oder Zeichenzwischenrume gedehnt werden knnen. Bei Vektorfonts bezieht
sich die Lngenangabe auf die Summation der Zeichenbreiten - berhnge nach
links und rechts werden nicht bercksichtigt.

Dekl.:  void v_justified( WORD handle,int x, WORD y, BYTE *string, WORD length,
                          WORD word_space, WORD char_space );
Aufruf: v_justified( handle, x, y, string, length, word_space, char_space );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        11                  GDP
contrl[1]        2                   Eintrge in ptsin
contrl[3]        n+2                 Eintrge in intin
contrl[5]        10                  v_justified
contrl[6]        handle
intin[0]         word_space          <> 0: Wortzwischenrume dehnen
intin[1]         char_space          <> 0: Zeichenzwischenrume dehnen
intin[2..n+1]    string[0..n-1]      Zeichenkette
ptsin[0]         x
ptsin[1]         y
ptsin[2]         length              horizontale Textlnge in Pixeln

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 SET CHARACTER HEIGHT, ABSOLUTE MODE (VDI 12)

Die Zeichenhhe von der Basislinie bis zur Zeichenzellenobergrenze wird mit
dieser Funktion gesetzt. Bei Bitmapfonts wird, wenn die gewnschte Hhe nicht
als Bitmap vorliegt, vergrert oder verkleinert. Bei Vektorfonts stellen die
ausgegebenen Breiten char_width und cell_width gerundete Werte dar.

Dekl.:  void vst_height( WORD handle, WORD height, WORD *char_width,
                         WORD *char_height, WORD *cell_width, WORD *cell_height );
Aufruf: vst_height( handle, height, &char_width, &char_height, &cell_width,
                    &cell_height );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        12                  vst_height
contrl[1]        1                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[1]         height              gewnschte Zeichenhhe

Ausgaben:

contrl[2]        2                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
ptsout[0]        char_width          ausgewhlte Zeichenbreite
ptsout[1]        char_height         ausgewhlte Zeichenhhe
ptsout[2]        cell_width          ausgewhlte Zeichenzellenbreite
ptsout[3]        cell_height         ausgewhlte Zeichenzellenhhe


 SET CHARACTER BASELINE VECTOR (VDI 13)

Mit  dieser  Funktion kann man die Textdrehung in 1/10  Grad  einstellen.  Fr
Bitmapfonts ist die Rotation nur in 90-Grad-Schritten mglich; bei Vektorfonts
stufenlos.

Dekl.:  WORD vst_rotation( WORD handle, WORD angle );
Aufruf: set_angle = vst_rotation( handle, angle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        13                  vst_rotation
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         angle               gewnschter Rotationswinkel

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_angle           ausgewhlter Rotationswinkel


 SET TEXT FACE (VDI 21)

Diese Funktion whlt den Zeichensatz <font> aus. Sollte kein Zeichensatz mit
dieser ID vorhanden sein, wird auf den Systemzeichensatz umgeschaltet.

Dekl.:  WORD vst_font( WORD handle, WORD font );
Aufruf: set_font = vst_font( handle, font);

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        21                  vst_font
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         font                gewnschter Zeichensatz

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_font            ausgewhlter Zeichensatz


 SET GRAPHIC TEXT COLOR INDEX (VDI 22)

Diese  Funktion  setzt die Farbe des Textes. Bei ungltigem Farbindex wird der
Farbindex 1 gesetzt.

Dekl.:  WORD vst_color( WORD handle, WORD color_index );
Aufruf: set_color = vst_color( handle, color_index );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        22                  vst_color
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         color_index         gewnschte Textfarbe

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_color           ausgewhlte Textfarbe


 INQUIRE CURRENT GRAPHIC TEXT ATTRIBUTES (VDI 38)

Die gesetzten Textattribute werden von dieser Funktion geliefert.

Dekl.:  void vqt_attributes( WORD handle, WORD *attrib );
Aufruf: vqt_attributes( handle, attrib );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        38                  vqt_attributes
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        2                   Eintrge in ptsout
contrl[4]        6                   Eintrge in intout
intout[0]        attrib[0]           Zeichensatznummer
intout[1]        attrib[1]           Textfarbe
intout[2]        attrib[2]           Textrotation in 1/10 Grad
intout[3]        attrib[3]           horizontale Ausrichtung
intout[4]        attrib[4]           vertikale Ausrichtung
intout[5]        attrib[5]           Schreibmodus
ptsout[0]        attrib[6]           Zeichenbreite
ptsout[1]        attrib[7]           Zeichenhhe
ptsout[2]        attrib[8]           Zeichenzellenbreite
ptsout[3]        attrib[9]           Zeichenzellenhhe

Bemerkung:
Das ATARI-VDI gibt fehlerhafterweise in intout[5] den Schreibmodus-1 zurck. Mit
NVDI geschieht das nur bei eingeschalteter Fehlerkompatibilitt.


 SET GRAPHIC TEXT ALIGNMENT (VDI 39)

Die horizontale und vertikale Ausrichtung eines Textes kann mit dieser Funktion
beeinflut werden. Bei falscher Eingabe fr horizontale Ausrichtung wird der
Text linksjustiert. Die  fehlerhafte Angabe der vertikalen Ausrichtung bewirkt
Ausrichtung an der Basislinie.

Dekl.:  void vst_alignment( WORD handle, WORD hor_in, WORD vert_in,
                            WORD *hor_out, WORD *vert_out );
Aufruf: vst_alignment( handle, hor_in, vert_in, &hor_out, &vert_out );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        39                  vst_alignment
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0]         hor_in              gewnschte horizontale Ausrichtung
intin[1]         vert_in             gewnschte vertikale Ausrichtung

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        2                   Eintrge in intout
intout[0]        hor_out             ausgewhlte horizontale Ausrichtung
intout[1]        vert_out            ausgewhlte vertikale Ausrichtung

Bedeutung von hor_in:
0: linksjustiert
1: zentriert
2: rechtsjustiert

Bedeutung von vert_in:
0: Basislinie
1: Halblinie
2: Zeichenoberkante
3: Zeichenzellenunterkante
4: Zeichenunterkante
5: Zeichenzellenoberkante


 SET GRAPHIC TEXT SPECIAL EFFECTS (VDI 106)

Mit  "SET  GRAPHIC  TEXT SPECIAL EFFECTS" kann man,  wie  es  der  Name  schon
andeutet, spezielle Texteffekte einstellen.

Dekl.:  WORD vst_effects( WORD handle, WORD effect );
Aufruf: set_effect = vst_effects( handle, effect );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        106                 vst_effects
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         effect              gewnschter Texteffekt

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_effect          ausgewhlter Texteffekt

Bedeutung von effect (Bitnummer):
0: fett
1: hell
2: kursiv
3: unterstrichen
4: umrandet


 SET CHARACTER HEIGHT, POINTS MODE (VDI 107)

Mit "SET CHARACTER HEIGHT, POINTS MODE" kann die Zeichenzellengre in Punkten
(1 pt  = 1/72") festgelegt werden.
Bei Bitmapfonts sucht diese Funktion den Font heraus, der in einfacher oder
doppelter Vergrerung kleiner oder gleich der gewnschten Hhe ist. Bei
Vektorfonts kann man mit vst_point() nur die vordefinierten Hhen anwhlen (in
der Regel sind das 8, 9, 10, 11, 12, 14, 18, 24, 36, und 48 pt).

Dekl.:  WORD vst_point( WORD handle, WORD point,
                        WORD *char_width, WORD *char_height,
                        WORD *cell_width, WORD *cell_height );
Aufruf: set_point = vst_point( handle, point, &char_width, &char_height,
                               &cell_width, &cell_height );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        107                 vst_point
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         point               gewnschte Zeichenzellenhhe (1/72")

Ausgaben:

contrl[2]        2                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_point           ausgewhlte Zeichenzellenhhe (1/72")
ptsout[0]        char_width          ausgewhlte Zeichenbreite
ptsout[1]        char_height         ausgewhlte Zeichenhhe
ptsout[2]        cell_width          ausgewhlte Zeichenzellenbreite
ptsout[3]        cell_height         ausgewhlte Zeichenzellenhhe


 INQUIRE TEXT EXTENT (VDI 116)

Bei Bitmapfonts ermittelt "INQUIRE  TEXT  EXTENT" die minimalen Ausmae eines
Rechtecks, das die bergebene Zeichenkette umrahmt. Bei Vektorfonts addiert
diese Funktion nur die Schrittweiten ohne Pair- oder Track-Kerning und
Zeichenberhnge zu beachten.
Die Koordinaten der vier Eckpunkte werden relativ zu einem Koordinatensystem
ausgegeben, wobei die Punkte gegen den Uhrzeigersinn durchnummeriert sind. Der
erste Punkt liegt ohne Textdrehung in der linken unteren Ecke des Textrechtecks.

Dekl.:  void vqt_extent( WORD handle, BYTE *string, WORD *extent );
Aufruf: vqt_extent( handle, string, extent );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        116                 vqt_extent
contrl[1]        0                   Eintrge in ptsin
contrl[3]        n                   Eintrge in intin
contrl[6]        handle
intin[0..n-1]    string[0..n-1]      Zeichenkette

Ausgaben:

contrl[2]        4                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
ptsout[0..7]     extent[0..7]        Koordinaten des Textrechtecks


 INQUIRE CHARACTER CELL WIDTH (VDI 117)

Bei Bitmapfonts lieferte diese Funktion die horizontalen Textausmae zurck.
Wendet man sie auf einen Vektorfont an, wird fr das Zeichen <index> die
gerundete Schrittweite zurckgegeben. Diese Schrittweite kann nur im
Zusammenhang mit v_gtext() benutzt werden. Versucht man die Schrittweiten auf
v_ftext() anzuwenden wird man falsche Zeichenpositionen berechnen.

Dekl.:  WORD vqt_width( WORD handle, WORD index,
                        WORD *cell_width, WORD *left_delta, WORD *right_delta );
Aufruf: status = vqt_width( handle, index,
                            &cell_width, &left_delta, &right_delta );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        117                 vqt_width
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         character           Zeichennummer

Ausgaben:

contrl[2]        3                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        status              Zeichennummer oder -1 (Fehler)
ptsout[0]        cell_width          Zeichenzellenbreite
ptsout[2]        left_delta          linker Abstand zur Zeichenzelle
ptsout[4]        right_delta         rechter Abstand zur Zeichenzelle

Bemerkung:
Um die Breite einer Zeichenkette zu ermitteln, ist der Aufruf von vqt_extent(),
vqt_f_extent() oder vqt_real_extent() zu  empfehlen.
Wer feststellen mchte, ob ein Font quidistant (monospaced) oder proportional
ist, sollte nicht alle Zeichenpaare ber vqt_width() vergleichen, sondern zuerst
prfen ob, vqt_name() hierber Informationen zurckgibt.


 LOAD FONTS (VDI 119)

Diese Funktion ldt die in ASSIGN.SYS fr das mit <handle> bezeichnete Gert
eingetragenen Bitmapfonts und sorgt dafr, da auch auf die Vektorfonts
zugegriffen werden kann. Zurckgegeben wird die Anzahl der zustzlich
verfgbaren Zeichenstze.

Bevor man vst_load_fonts() aufruft, sollte man mit vq_gdos() berprfen, ob das
VDI Zeichenstze nachladen kann.

Dekl.:  WORD vst_load_fonts( WORD handle, WORD select );
Aufruf: additional = vst_load_fonts( handle, 0 );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        119                 vst_load_fonts
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         select              0 (reserviert)

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        additional          Anzahl der geladenen Zeichenstze


 UNLOAD FONTS (VDI 120)

Der durch die Bitmapfonts belegte Speicher wird von "UNLOAD FONTS" freigegeben.

Dekl.:  void vst_unload_fonts( WORD handle, WORD select );
Aufruf: vst_unload_fonts( handle, 0);

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        120                 vst_unload_fonts
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
intin[0]         select              0 (reserviert)

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 INQUIRE FACE NAME AND INDEX (VDI 130)

In NVDI 3 gibt es eine erweiterte Form von vqt_name():

Dekl.:  WORD vqt_name( WORD handle, WORD index, BYTE *name, UWORD *font_format,
                       UWORD *flags );
Aufruf: id = vqt_name( handle, index, name, &font_format, &flags );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        130                 vqt_name
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin, kein Tippfehler!
contrl[5]        1                   mehr Informationen liefern!
contrl[6]        handle
intin[0]         index               Nummer (1 bis Maximalanzahl)

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        35                  Eintrge in intout
intout[0]        id                  Zeichensatznummer
intout[1..16]    name[0..15]         Zeichensatzname
intout[17..32]   name[16..31]        Zeichensatz-Attribute
intout[33]       name[32]            0: Bitmapfont, 1: Vektorfont
intout[34]       flags/font_format

Im High-Byte von intout[34] wird <flags> zurckgeliefert:
0: Proportionalfont
1: quidistanter Font

Im Low-Byte von intout[34] wird <font_format> zurckgeliefert:
1: Bitmap-Font
2: Speedo-Font
4: TrueType-Font
8: Type 1-Font

Bemerkungen:
Um festzustellen, was fr einen Font man vor sich hat, mu man die Anzahl der
Eintrge in intout (contrl[4]) beachten. Ist contrl[4] 33, so sind keine
zustzlichen Informationen vorhanden und demzufolge mu es sich um einen
Bitmapfont handeln. Ist contrl[4] == 34, wird nur zustzlich in intout[33]
(name[32]) mitgeteilt, ob es sich um einen Vektorfont handelt. Nur wenn
contrl[4] == 35 ist, kann man mit intout[34] (flags) den Fonttyp genauer
feststellen und sofort erkennen, ob der Font quidistant (monospaced) ist.

intout[34] wird nur zurckgeliefert, wenn contrl[3] > 1 und contrl[5] = 1!


 INQUIRE CURRENT FACE INFORMATION (VDI 131)

Es wird Auskunft ber den aktuellen Zeichensatz gegeben, wobei die Attribute und
Vergrerung/Verkleinerung bercksichtigt werden.

Dekl.:  void vqt_fontinfo( WORD handle, WORD *minADE, WORD *maxADE,
                           WORD *distances, WORD *maxwidth, WORD *effects );
Aufruf: vqt_fontinfo( handle, &minADE, &maxADE, distances, &max_width, effects );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        131                 vqt_fontinfo
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        5                   Eintrge in ptsout
contrl[4]        2                   Eintrge in intout
intout[0]        minADE              niedrigste Zeichennummer
intout[1]        maxADE              hchste Zeichennummer
ptsout[0]        maxwidth            Maximale Zeichenzellenbreite
ptsout[1]        distances[0]
ptsout[2]        effects[0]
ptsout[3]        distances[1]
ptsout[4]        effects[1]
ptsout[5]        distances[2]
ptsout[6]        effects[2]
ptsout[7]        distances[3]
ptsout[9]        distances[4]

Bedeutung von distances:
distances[0]: Abstand von der Untergrenze der Zeichenzelle zur Basislinie
distances[1]: Abstand der Unterlnge zur Basislinie
distances[2]: Abstand der Halblinie zur Basislinie
distances[3]: Abstand der Zeichenobergrenzze zur Basislinie
distances[4]: Abstand der Zeichenzellenobergrenze zur Basislinei

Bedeutung von effects:
effects[0]: Verbreiterung bei Texteffekten
effects[1]: linker Abstand bei Kursivschrift
effects[2]: rechter Abstand bei Kursivschrift


 INQUIRE EXTENDED FONT INFORMATION (VDI 229)

Die Funktion vqt_xfntinfo() liefert in einer XFNT_INFO-Struktur die mit <flags>
angeforderten Informationen ber einen Font. Wenn ein von 0 verschiedener Index
bergeben wird, sucht vqt_xfntinfo() den entsprechenden Font und liefert die durch
<flags> bezeichneten Eintrge. Wenn <index> 0 ist, wird der Font mit der ID <id>
gesucht. Sollte <id> ebenfalls 0 sein, werden Informationen ber den bereits
eingestellten Font zurckgegeben.

Damit die Informationen in die XFNT_INFO-Struktur eingetragen werden, mu die
Gre der Struktur mu in das Strukturelement <size> eingetragen werden.

Dekl.:  WORD vqt_xfntinfo( WORD handle, WORD flags, WORD id, WORD index,
                           XFNT_INFO *info );
Aufruf: id = vqt_xfntinfo( handle, flags, id, index, &info );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        229                 vqt_xfntinfo
contrl[1]        0                   Eintrge in ptsin
contrl[3]        5                   Eintrge in intin
contrl[5]        0
contrl[6]        handle
intin[0]         flag                Bitvektor fr auszugebende Informationen
intin[1]         id                  ID des Fonts oder 0 fr eingestellten Font
intin[2]         index               Index des Fonts oder 0, wenn die ID benutzt
                                     werden soll
intin[3..4]      info                Zeiger auf die XFNT_INFO-Struktur

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        3                   Eintrge in intout
intout[0]        font_format         Fontformat
intout[1]        font_id             ID des eingestellten Fonts
intout[2]        index               Index des eingestellten Fonts

Bedeutung von flags (Bitnummer):
0:    vollstndigen Fontnamen zurckgeben (font_name)
1:    Name der Fontfamilie zurckgeben (family_name)
2:    Stil des Fonts zurckgeben (style_name)
3:    Dateinamen des Fonts zurckgeben (file_name1)
4:    2. optionalen Dateinamen zurckgeben (file_name2)
5:    3. optionalen Dateinamen zurckgeben (file_name3)
8:    Hhen in pt ohne Vergrerung zurckliefern (pt_cnt, pt_sizes)
9:    Hhen in pt fr doppelte Vergrerung zurckliefern (pt_cnt, pt_sizes)

Bedeutung von font_format:
1: Bitmap-Font
2: Speedo-Font
4: TrueType-Font
8: Type 1-Font

Bit 8 und 9 von flags unterscheiden sich in der Funktion nur bei Bitmap-Fonts.
Ist Bit 8 gesetzt, werden die Hhen geliefert, die ohne Vergrerung vorhanden
sind. Wenn Bit 9 gesetzt ist, werden die Hhen geliefert, bei denen vergrert
wird.

Beschreibung der XFNT_INFO-Struktur:

typedef struct
{
   LONG  size;             /* Lnge der Struktur, mu vor vqt_xfntinfo() gesetzt werden */
   WORD  format;           /* Fontformat, z.B. 4 fr TrueType */
   WORD  id;               /* Font-ID, z.B. 6059 */
   WORD  index;            /* Index */
   BYTE  font_name[50];    /* vollstndiger Fontname, z.B. "Century 725 Italic BT" */
   BYTE  family_name[50];  /* Name der Fontfamilie, z.B. "Century725 BT" */
   BYTE  style_name[50];   /* Name des Fontstils, z.B. "Italic" */
   BYTE  file_name1[200];  /* Name der 1. Fontdatei, z.B. "C:\FONTS\TT1059M_.TTF" */
   BYTE  file_name2[200];  /* Name der optionalen 2. Fontdatei */
   BYTE  file_name3[200];  /* Name der optionalen 3. Fontdatei */
   WORD  pt_cnt;           /* Anzahl der Punkthhen fr vst_point(), z.B. 10 */
   WORD  pt_sizes[64];     /* verfgbare Punkthhen,
                              z.B. { 8, 9, 10, 11, 12, 14, 18, 24, 36, 48 } */
} XFNT_INFO;

Bei allen Zeichenketten in der XFNT_INFO-Struktur handelt es sich um C-Strings,
die mit einem 0-Byte abgeschlossen sind. Strukturelemente, die nicht mit <flags>
angefordert wurden, haben keinen definierten Inhalt.


 SET TEXT FACE BY NAME (VDI 230, 0)

Diese Funktion sucht einen Font mit Namen <font_name> in einem der durch den
Bitvektor <font_format> angegebenen Fontformate und stellt ihn ein. Fehlende
oder berschssige Leerzeichen werden bei der Suche ignoriert. Wenn in den
angegebenen Fontformaten kein Font des gesuchten Namens vorhanden ist, wird der
Systemfont gesetzt.

Dekl.:  WORD vst_name( WORD handle, WORD font_format,
                       BYTE *font_name, BYTE *ret_name );
Aufruf: id = vst_name( handle, font_format, font_name, ret_name );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        230                 vst_name
contrl[1]        0                   Eintrge in ptsin
contrl[3]        n                   Eintrge in intin
contrl[5]        0                   Unterfunktionsnummer: Font einstellen
contrl[6]        handle
intin[0]         font_format         zu bercksichtigende Fontformate
intin[1..n]      font_name[0..n-1]   einzustellender Fontname

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        m                   Eintrge in intout
intout[0]        id                  ID des eingestellten Fonts
intout[1..m]     ret_name[0..m-1]    Name des eingestellten Fonts

Bedeutung von font_format:
1: Bitmap-Font
2: Speedo-Font
4: TrueType-Font
8: Type 1-Font


 INQUIRE FACE NAME AND ID BY NAME (VDI 230, 100)

Diese Funktion sucht einen Font mit Namen <font_name> in einem der durch den
Bitvektor <font_format> angegebenen Fontformate, wobei fehlende oder
berschssige Leerzeichen ignoriert werden. Wenn der Font gefunden wird, werden
Font-ID und Name in intout zurckgeliefert.
Falls kein Font auffindbar ist, wird eine 0 in intout[0] zurckgeliefert, um
einen Fehler zu signalisieren.

Dekl.:  WORD vqt_name_and_id( WORD handle, WORD font_format,
                              BYTE *font_name, BYTE *ret_name );
Aufruf: id = vqt_name_and_id( handle, font_format, font_name, ret_name );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        230                 vst_name
contrl[1]        0                   Eintrge in ptsin
contrl[3]        n                   Eintrge in intin
contrl[5]        100                 Unterfunktionsnummer: Font suchen
contrl[6]        handle
intin[0]         font_format         zu bercksichtigende Fontformate
intin[1..n]      font_name[0..n-1]   einzustellender Fontname

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        m                   Eintrge in intout
intout[0]        id                  ID des gefundenen Fonts oder 0
intout[1..m]     ret_name[0..m-1]    Name des gefundenen Fonts

Bedeutung von font_format:
1: Bitmap-Font
2: Speedo-Font
4: TrueType-Font
8: Type 1-Font


 SET CHARACTER WIDTH, ABSOLUTE MODE (VDI 231)

Mit dieser Funktion kann man die Zeichenbreite in Pixeln setzen. Sobald der der
nchste Aufruf von vst_height(), vst_point() oder vst_arbpt() erfolgt, wird die
Breite wieder zurckgesetzt.

Dekl.:  void vst_width( WORD handle, WORD width, WORD *char_width,
                        WORD *char_height, WORD *cell_width, WORD *cell_height );
Aufruf: vst_width( handle, width, &char_width, &char_height,
                   &cell_width, &cell_height );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        231                 vst_width
contrl[1]        1                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[0]         width               gewnschte Zeichenbreite

Ausgaben:

contrl[2]        2                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
ptsout[0]        char_width          ausgewhlte Zeichenbreite
ptsout[1]        char_height         ausgewhlte Zeichenhhe
ptsout[2]        cell_width          ausgewhlte Zeichenzellenbreite
ptsout[3]        cell_height         ausgewhlte Zeichenzellenhhe

Bemerkungen:
Zum Einstellen des Breiten-Hhen-Verhltnisses ist es sinnvoller, vst_setsize()
aufzurufen, da diese Funktion feinere Einstellungen erlaubt.


 INQUIRE SPEEDO HEADER INFORMATION (VDI 232)

Die Funktion vqt_fontheader() kopiert den Header des eingestellten Speedo-Fonts
in einen Buffer und liefert, wenn vorhanden, einen Zeiger auf die dazugehrige
TDF-Datei. Der bergebene Buffer sollte sicherheitshalber 1 Kb gro sein, da die
Lnge des Speedo-Fontheader vom jeweiligen Font und mglichen
Formaterweiterungen abhngt.
Fr andere Fontformate (TrueType, ...) wird versucht, den Header nachzubilden.

Man sollte daran denken, da fr jeden Aufruf von vqt_fontheader() eventuell
mehrfach auf die Festplatte zugegriffen werden mu - bei 300 oder mehr Fonts
kann das immerhin einige wenige Sekndchen dauern. Man sollte daher den hufigen
Aufruf dieser Funktion vermeiden oder wichtige Angaben selbst speichern und beim
Programmstart laden.


Dekl.:  void vqt_fontheader( WORD handle, void *buffer, BYTE *tdf_name );
Aufruf: vqt_fontheader( handle, buffer, tdf_name );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        232                 vqt_fontheader
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0..1]      buffer              Buffer fr den Fontheader

Ausgaben:
contrl[2]        0                   Eintrge in ptsout
contrl[4]        n                   Lnge des TDF-Pfads
intout[0..n-1]   tdf_name[0..n-1]    absoluter Pfad und Name des TDFs

Bemerkung:

Fr Programmierer drften die folgenden Eintrge des Fontheaders am
interessantesten sein:

Name      Offset  Lnge   Beschreibung
FH_FNTNM    24     70     Name des Fonts (siehe auch vqt_name()),
                          z.B. "Century 725 Italic BT"
FH_NKTKS   258      2     Anzahl der Track-Kerning-Informationen
FH_NKPRS   260      2     Anzahl der Kerning-Paare, (siehe auch vst_kern())
FH_CLFGS   263      1     Klassifizierung, u.a. Italic und Monospace
FH_SFNTN   266     32     Name des korrespondierenden Postscript-Fonts,
                          z.B. "Century725BT-Italic"
FH_SFACN   298     16     Kurzname der Fontfamilie, z.B. "Century725 BT"
FH_FNTFM   314     14     Stil/Form, z.B. "Italic"
FH_ITANG   328      2     Schrgstellung in 1/256-Grad (bei italic-Schnitten),
                          z.B 4480 (17,5 Grad)


 INQUIRE TRACK KERNING INFORMATION (VDI 234)

Diese Funktion liefert getrennt in x- und y- Richtung die pro Zeichen durch
Track-Kerning entstehende Verschiebung zurck.

Dekl.:  void vqt_trackkern( WORD handle, fix31 *x_offset, fix31 *y_offset );
Aufruf: vqt_trackkern( handle, &x_offset, &y_offset );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        234                 vqt_trackkern
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:
contrl[2]        0                   Eintrge in ptsout
contrl[4]        4                   Eintrge in intout
intout[0..1]     x_offset            x-Verschiebung in 1/65536 Pixeln
intout[2..3]     y_offset            y-Verschiebung in 1/65536 Pixeln


 INQUIRE PAIR KERNING INFORMATION (VDI 235)

Die Funktion vqt_pairkern() liefert die zwischen zwei Zeichen durch Pair-Kerning
entstehende Verschiebung zurck.

Dekl.:  void vqt_pairkern( WORD handle, WORD index1, WORD index2,
                           fix31 *x_offset, fix31 *y_offset );
Aufruf: vqt_pairkern( handle, index1, index2, &x_offset, &y_offset );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        235                 vqt_pairkern
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0]         index1              erstes Zeichen
intin[1]         index2              darauf folgendes Zeichen

Ausgaben:
contrl[2]        0                   Eintrge in ptsout
contrl[4]        4                   Eintrge in intout
intout[0..1]     x_offset            x-Verschiebung in 1/65536 Pixeln
intout[2..3]     y_offset            y-Verschiebung in 1/65536 Pixeln


 SET CHARACTER MAPPING MODE (VDI 236)

Mit dieser Funktion kann man vom ASCII-Mapping auf direktes Mapping umschalten,
d.h. man erhlt z.B. fr eine 65 nicht mehr das Zeichen A, sondern je nach
verwendetem Font das Zeichen, das sich unter diesem Index verbirgt. Wenn man auf
direktes Mapping umschaltet, ndert sich auerdem die Anzahl der vorhandenen
Zeichen pro Font (minADE und maxADE bei vqt_fontinfo) von 256 auf die Zahl der
tatschlich vorhandenen Zeichen.

Dekl.:  void vst_charmap( WORD handle, WORD mode );
Aufruf: void vst_charmap( handle, mode );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        236                 vst_charmap
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         mode                Zeichen-Mapping

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout

Bedeutung von mode:
0: direktes Mapping, keine Umsetzung des Zeichen-Index
1: Zeichen-Index wird als ASCII-Wert interpretiert

Bemerkungen:
Man sollte, wenn man ASCII-Mapping einschalten will, nicht irgendeinen von 0
verschiedenen Wert, sondern 1 bergeben, da es durchaus denkbar ist, da
demnchst noch weitere Mappings (z.B. Unicode) vorhanden sind.


 SET KERNING MODE (VDI 237)

Mit dieser Funktion kann man das gewnschte Track-Kerning und Pair-Kerning ein-
oder ausschalten. Informationen fr Track-Kerning sind in den meisten
Speedo-Fonts enhalten. Normale TrueType-Fonts bieten kein Track-Kerning. Die
neuen TrueType-GX-Fonts enthalten dagegen oftmals Daten fr Track-Kerning.

Dekl.:  void vst_kern( WORD handle, WORD track_mode, WORD pair_mode,
                       WORD *tracks, WORD *pairs );
Aufruf: vst_kern( handle, track_mode, pair_mode, &track, &pairs );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        237                 vst_kern
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0]         track_mode          Track-Kerning-Modus
intin[1]         pair_mode           Pair-Kerning aus oder ein

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        2                   Eintrge in intout
intout[0]        track               das gesetzte Track-Kerning
intout[1]        pairs               Anzahl der Kerning-Paare

Bedeutung von track_mode:
0: kein Track-Kerning
1: normal
2: tight
3: very tight

Bedeutung von pair_mode:
0: kein Pair-Kerning
1: Pair-Kerning benutzen

Bemerkungen:
Mit NVDI kann man ein selbstdefiniertes Track-Kerning einstellen. Der
Track-Modus (track_mode) wird dafr auf 255 gesetzt, der gewnschte zustzliche
Abstand in 1/65536 Pixeln wird in intin[2..3] eingetragen und contrl[3] mu eine
4 enthalten.

Dekl.:  void vst_track_offset( WORD handle, fix31 offset, WORD pair_mode,
                               WORD *tracks, WORD *pairs );
Aufruf: vst_track_offset( handle, offset, pair_mode, &tracks, &pairs );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        237                 vst_kern
contrl[1]        0                   Eintrge in ptsin
contrl[3]        4                   Eintrge in intin
contrl[6]        handle
intin[0]         255                 benutzerdefiniert
intin[1]         pair_mode           Pair-Kerning aus oder ein
intin[2..3]      offset              Abstand

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        2                   Eintrge in intout
intout[0]        track               das gesetzte Track-Kerning
intout[1]        pairs               Anzahl der Kerning-Paare


 GET CHARACTER BITMAP INFORMATION (VDI 239)

Diese Funktion liefert den Zeiger auf die zu einem Zeichen gehrende Bitmap und
deren Mae zurck. Die zurckgelieferten Offsets sind auch im Zusammenhang mit
v_getoutline() gltig.

Dekl.:  void v_getbitmap_info( WORD handle, WORD index,
                               fix31 *x_advance, fix31 *y_advance,
                               fix31 *x_offset, fix31 *y_offset,
                               WORD *width, WORD *height,  WORD *bitmap );
Aufruf: v_getbitmap_info( handle, index, &x_advance, &y_advance,
                          &x_offset, &y_offset, &width, &height, bitmap );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        239                 v_getbitmap_info
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         index               Zeichen-Index

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        12                  Eintrge in intout
intout[0]        width               Breite der Bitmap
intout[1]        height              Hhe der Bitmap
intout[2..3]     x_advance           x-Abstand in 1/65536 Pixeln
intout[4..5]     y_advance           y-Abstand in 1/65536 Pixeln
intout[6..7]     x_offset            x-Verschiebung in 1/65536 Pixeln
intout[8..9]     y_offset            y-Verschiebung in 1/65536 Pixeln
intout[10..11]   bitmap              Zeiger auf die Bitmap

Bedeutung von x_advance, y_advance:
Dieser Advance-Vektor gibt den Abstand des nchsten Zeichens in 1/65536 Pixeln an.

Bedeutung von x_offset, y_offset:
x_offset und y_offset geben den Abstand der Bitmap zur Position der Zeichenzelle
an. Das ist ntig, da die Bitmap meistens kleiner als die Zeichenzelle ist (z.B.
bei Zeichen ohne Unterlngen).

Bemerkungen:
Um auch ohne NVDI 3 nachvollziehbare Ausgaben zu bekommen, sollten die
Texteffekte (vst_effects()) ausgeschaltet sein (einige Versionen eines
Zusatzprogrammes fr Vektorfonts zeigen sonst sehr unterschiedlich Ergebnisse).
Da der Zeiger auf die Bitmap in der Regel in den Zeichen-Cache verweist, sollte
man sich die Bitmap direkt nach dem Aufruf kopieren (AES-Kontextswitch durch
wind_update() verhindern!!) - andernfalls knnte der Zeiger schon wieder
ungltig sein.
Auerdem sollte man v_getbitmap_info() nicht fr enorm groe Zeichen (z.B. 300
pt und mehr) aufrufen, da diese je nach Cache-Gre evtl. nicht mehr komplett
aufgebaut werden knnen. Die Bitmap enthlt in diesem Fall nur einen Teil des
Zeichens.

Man sollte diese Funktion nicht mibrauchen, um eine eigene Textausgabe zu
bauen - es lohnt sich nicht und Pair-Kerning wre auch nicht mglich.


 INQUIRE OUTLINE FONT TEXT EXTENT (VDI 240)

Ebenso wie bei vqt_extent() werden hier die Zeichenweiten addiert. Diese
Funktion beachtet aber Track- und Pair-Kerning und arbeitet intern mit 1/65536
Pixeln, d.h. erst bei der Umrechnung in Koordinaten wird gerundet. Texteffekte
wie z.B. Neigung ber vst_skew() werden ebenso wie linke und rechte berhnge
nicht beachtet.

Dekl.:  void vqt_f_extent( WORD handle, BYTE *string, WORD *extent );
Aufruf: vqt_f_extent( handle, string, extent );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        240                 vqt_fextent
contrl[1]        0                   Eintrge in ptsin
contrl[3]        n                   Eintrge in intin
contrl[6]        handle
intin[0..n-1]    string[0..n-1]      Zeichenkette

Ausgaben:

contrl[2]        4                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
ptsout[0..7]     extent[0..7]        Koordinaten des Textrechtecks

Fallen:
Aus Kompatibilittsgrnden verhlt sich diese Funktion bei 90, 180 und 270 Grad
genauso unsinnig wie das alte vqt_extent() - der Bezugspunkt wird gendert!

Bemerkungen:
Diese Funktion liefert nicht das den Text umgebende Rechteck. Sie addiert nur
die Schrittweiten und beachtet auch nicht linke oder rechte Zeichenberhnge.
Sie ist im Prinzip nur zur Cursor-Positionierung gedacht. Wer aber mit dieser
Funktion die Gre eines neuzuzeichenenden Bildbereichs ermitteln mchte, mu
links und rechts sicherheitshalber die Breite des grten Zeichens hinzuaddieren
(und die Neigung beachten). Unter NVDI 3 empfiehlt sich stattdessen die
Verwendung von vqt_real_extent().


 INQUIRE REAL OUTLINE FONT TEXT EXTENT (VDI 240, 4200)

Diese Funktion wird z.Zt. nur von NVDI bereitgestellt.
Es wird das umgebende Viereck (es mu sich nicht immer um ein Rechteck handeln)
fr Textausgabe an der Stelle x,y zurckgeliefert. Dabei werden smtliche
Texteffekte, Rotation, Schrgstellung, Pair-Kerning, Track-Kerning,
Zeichenberhnge, horizontale und vertikale Ausrichtung bercksichtigt.

Dekl.:  void vqt_real_extent( WORD handle, WORD x, WORD y, BYTE *string,
                              WORD *extent );
Aufruf: vqt_real_extent( handle, x, y, string, extent )

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        240                 vqt_fextent
contrl[1]        1                   Eintrge in ptsin
contrl[3]        n                   Eintrge in intin
contrl[5]        4200                Unterfunktionsnummer
contrl[6]        handle
ptsin[0]         x                   x-Koordinate
ptsin[1]         y                   y-Koordinate
intin[0..n-1]    string[0..n-1]      Zeichenkette

Ausgaben:

contrl[2]        4                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
ptsout[0..7]     extent[0..7]        Koordinaten des umgebenden Textrechtecks


 OUTLINE  FONT TEXT (VDI 241)

Diese Textausgabefunktion beachtet im Gegensatz zu v_gtext() Pair- und
Track-Kerning und berechnet intern die Zeichenpositionen in 1/65536 Pixeln,
wodurch eine bessere Zeichenpositionierung gewhrleistet wird.

Dekl.:  void v_ftext( WORD handle, WORD x, WORD y, BYTE *string );
Aufruf: v_ftext( handle, x, y, string );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        241                 v_ftext
contrl[1]        1                   Eintrge in ptsin
contrl[3]        n                   Eintrge in intin
contrl[6]        handle
intin[0..n-1]    string[0..n-1]      Zeichenkette
ptsin[0]         x
ptsin[1]         y

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout

Es gibt fr v_ftext() noch eine weitere Variante, bei der man fr jedes Zeichen
den Abstand zum Vorgnger selbst bestimmen kann:

Dekl.:  void v_ftext_offset( WORD handle, WORD x, WORD y, BYTE *string, WORD *offset );
Aufruf: v_ftext_offset( handle, x, y, string, offset );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        241                 v_ftext
contrl[1]        1+n                 Eintrge in ptsin
contrl[3]        n                   Eintrge in intin
contrl[6]        handle
intin[0..n-1]    string[0..n-1]      Zeichenkette
ptsin[0]         x
ptsin[1]         y
ptsin[2]         offset[0]           x-Offset des ersten Zeichens
ptsin[3]         offset[1]           y-Offset des ersten Zeichens
ptsin[4..2*n+1]  xyoff[2..(2*n)-1]   x-Offset, y-Offset der folgenden Zeichen

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 Get Character outline (VDI 243)

Die Funktion v_getoutline() generiert aus einem Zeichen einen Bezierzug, mit dem
man v_bez() oder v_bezfill() aufrufen kann.

Dekl.:  void v_getoutline( WORD handle, WORD index, WORD *xyarr, BYTE *bezarr,
                           WORD max_pts, WORD *count );
Aufruf: v_getoutline( handle, index, xyarr, bezarr, max_pts, &count );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        243                 v_getoutline
contrl[1]        0                   Eintrge in ptsin
contrl[3]        6                   Eintrge in intin
contrl[6]        handle
intin[0]         index               Zeichen-Index
intin[1]         max_pts             Maximale auszugebende Punktanzahl
intin[2..3]      xyarray             Buffer fr die Koordinaten
intin[4..5]      bezarray            Buffer fr Punktinformationen (jump, bez)

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
intout[0]        count               Anzahl der ausgegebenen Punkte

Bemerkungen:
Wenn man die Informationen von v_getoutline() z.B. als Vektorgrafik benutzen
mchte, so empfiehlt es sich, vor dem Aufruf eine groe Texthhe einzustellen.
Andernfalls ist die Qualitt des zurckgelieferten Beziers recht mager, da von
der internen Darstellung in 1/65536 Pixeln auf Pixel gerundet wird, d.h. 16 Bit
fallen weg.


 SET CHARACTER HEIGHT BY ARBITRARY POINTS (VDI 246)

hnlich wie vst_point() kann man mit dieser Funktion die Zeichenhhe in Punkten
setzen. Man ist aber nicht an die Standard-Gren gebunden, sondern kann die
Hhe in 1/65536 Punkten (pt) anwhlen. Wenn man negative Gren einstellt,
werden die Zeichen and der x-Achse gespiegelt.

Dekl.:  fix31 vst_arbpt( WORD handle, fix31 height,
                         WORD *char_width, WORD *char_height,
                         WORD *cell_width, WORD *cell_height );
Aufruf: set_point = vst_arbpt( handle, height, &char_width, &char_height,
                               &cell_width, &cell_height );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        246                 vst_arbpt
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0..1]      height              Hhe in 1/65536 Punkten

Ausgaben:

contrl[2]        2                   Eintrge in ptsout
contrl[4]        2                   Eintrge in intout
intout[0..1]     set_point           eingestellte Hhe in 1/65536 Punkten
ptsout[0]        char_width          ausgewhlte Zeichenbreite
ptsout[1]        char_height         ausgewhlte Zeichenhhe
ptsout[2]        cell_width          ausgewhlte Zeichenzellenbreite
ptsout[3]        cell_height         ausgewhlte Zeichenzellenhhe

Bemerkungen:
Bei den zurckgelieferten Zeichenbreiten handelt es sich um gerundete Werte, die
man nicht ohne weiteres zur Breitenberechnung benutzen kann.


 INQUIRE OUTLINE FONT TEXT ADVANCE PLACEMENT VECTOR (VDI 247)

Diese Funktion liefert fr ein Zeichen x- und y-Komponente fr die
Positionierung des folgenden Zeichens (es handelt sich nicht um die Breite des
Zeichens!).

Dekl.:  void  vqt_advance( WORD handle, WORD index,
                            fix31 *x_advance, fix31 *y_advance );
Aufruf: vqt_advance( handle, index, &x_advance, &y_advance );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        247                 vqt_advance
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0]         index               Zeichen-Index

Ausgaben:

contrl[2]        4                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
ptsout[0]        x_adv_old           x-Abstand in Pixeln
ptsout[1]        y_adv_old           y-Abstand in Pixeln
ptsout[2]        x_rem_old           x-Nachkommarest (mod 16384)
ptsout[3]        y_rem_old           y-Nachkommarest (mod 16384)
ptsout[4..5]     x_advance           x-Abstand in 1/65536 Pixeln
ptsout[6..7]     y_advance           y-Abstand in 1/65536 Pixeln

Bemerkungen:
Die Werte in ptsout[0..3] werden nur noch aus Kompatibilittsgrnden
zurckgliefert. Stattdessen sollten x_advance und y_advance im genaueren
fix31-Format benutzt werden.
Es handelt sich bei x_advance und y_advance nur um den Abstand, der fr die
Positionierung des nchsten Zeichens benutzt wird, d.h. x_advance beinhaltet
keine Zeichenberhnge.


 FLUSH OUTLINE FONT CACHE (VDI 251)

Diese Funktion lscht die Fontcaches - Prdikat besonders wertvoll :-)


 SET CHARACTER CELL WIDTH BY ARBITRARY POINTS (VDI 252)

Vst_setsize() setzt die Zeichenbreite in 1/65536 Punkten (pt). Die Zeichenbreite
wird beim nchsten Aufruf von vst_height(), vst_point oder vst_arbpt() wieder
zurckgesetzt. Bei negativen Breiten werden die Zeichen an der y-Achse gespiegelt.

Dekl.:  fix31 vst_setsize( WORD handle, fix31 width,
                           WORD *char_width, WORD *char_height,
                           WORD *cell_width, WORD *cell_height );
Aufruf: set_width = vst_setsize( handle, width, &char_width, &char_height,
                                 &cell_width, &cell_height );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        252                 vst_setsize
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0..1]      width               Zeichenbreite in 1/65536 Punkten

Ausgaben:

contrl[2]        2                   Eintrge in ptsout
contrl[4]        2                   Eintrge in intout
intout[0..1]     set_width           eingestellte Breite in 1/65536 Punkten
ptsout[0]        char_width          ausgewhlte Zeichenbreite
ptsout[1]        char_height         ausgewhlte Zeichenhhe
ptsout[2]        cell_width          ausgewhlte Zeichenzellenbreite
ptsout[3]        cell_height         ausgewhlte Zeichenzellenhhe


 SET OUTLINE FONT SKEW (VDI 253)

Mit dieser Funktion knnen Zeichen unabhngig von vst_effects() in
1/10-Grad-Schritten zwischen -90 und +90 Grad geneigt werden. Wie berall im VDI
sind auch hier die Winkel entgegen dem Uhrzeigersinn gerichtet. Positive Winkel
fhren zu einer Neigung nach links, wogegen negative Winkel Zeichen nach rechts
neigen.

Dekl.:  WORD  vst_skew( WORD handle, WORD skew );
Aufruf: set_skew = vst_skew( handle, skew );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        253                 vst_skew
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         skew                Neigung in 1/10-Grad

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_skew            eingestellte Neigung in 1/10-Grad

Bemerkungen:
Diese Funktion ist zwar eine ganz nette Spielerei, aber die erzeugten Zeichen
sehen grundstzlich schlechter aus als ein richtiger italic-Font.




Rasterfunktionen
================

 COPY RASTER, OPAQUE (VDI 109)

"COPY RASTER, OPAQUE" kopiert pixelweise ein rechteckiges Raster auf ein anderes
rechteckiges Raster. Hierbei werden die angegebenen logischen Verknpfungen
beachtet. Beide Raster mssen entweder im gertespezifischen Format vorliegen
oder drfen nur 1 Ebene haben.

Immer dann, wenn der Bildschirm (oder das Gert, das durch <handle> angesprochen
wird), Quelle oder Ziel einer Rasteroperation ist, sollte fd_addr des MFDB auf
NULL gesetzt sein!

Im Zielraster wird nur geclippt, wenn fd_addr des Ziel-MFDBs NULL ist!

Das Quellraster wird (bisher) nicht geclippt!

Dekl.:  void vro_cpyfm( WORD handle, WORD vr_mode, WORD *xyarr,
                        MFDB *src_MFDB, MFDB *des_MFDB );
Aufruf: vro_cpyfm( handle, wr_mode, xyarr, &src_MFDB, &des_MFDB );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        109                 vro_cpyfm
contrl[1]        4                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
contrl[7..8]     src_MFDB            Zeiger auf den MFDB des Quellrasters
contrl[9..10]    des_MFDB            Zeiger auf den MFDB des Zielrasters
intin[0]         wr_mode             logische Verknpfung
ptsin[0..7]      xyarr[0..7]         Koordinaten

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout

Bedeutung von wr_mode (logische Verknpfungen):
0:  Ergebnis=0
1:  Ergebnis=Quelle and Ziel
2:  Ergebnis=Quelle and (not Ziel)
3:  Ergebnis=Quelle
4:  Ergebnis=(not Quelle) and Ziel
5:  Ergebnis=Ziel (sinnlos!)
6:  Ergebnis=Quelle xor Ziel
7:  Ergebnis=Quelle or Ziel
8:  Ergebnis=not (Quelle or Ziel)
9:  Ergebnis=not (Quelle xor Ziel)
10: Ergebnis=not Ziel
11: Ergebnis=Quelle or (not Ziel)
12: Ergebnis=not Quelle
13: Ergebnis=(not Quelle) or Ziel
14: Ergebnis=not (Quelle and Ziel)
15: Ergebnis=1

Bedeutung von xyarr:
xyarr[0..3]: Koordinaten des Quellrechtecks
xyarr[4..7]: Koordinaten des Zielrechtecks


 COPY RASTER, TRANSPARENT (VDI 121)

Diese Funktion expandiert unter Bercksichtigung von Vorder -und
Hintergrundfarbe sowie des Schreibmodus ein zweifarbiges (aus einer Ebene
bestehendes) Quellraster zu einem mehrfarbigen Zielraster.

Ebenso wie bei vro_cpyfm() sollte auch bei vrt_cpyfm() fd_addr 0 sein, wenn der
Bildschirm Ziel einer Rasteroperation ist!

Dekl.:  void vrt_cpyfm( WORD handle, WORD wr_mode, WORD *xyarr,
                        MFDB *src_MFDB, MFDB *des_MFDB, WORD *color_index );
Aufruf: vrt_cpyfm( handle, wr_mode, xyarr, &src_MFDB, &des_MFDB, color_index );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        121                 vrt_cpyfm
contrl[1]        4                   Eintrge in ptsin
contrl[3]        3                   Eintrge in intin
contrl[6]        handle
contrl[7..8]     src_MFDB            Zeiger auf den MFDB des Quellrasters
contrl[9..10]    des_MFDB            Zeiger auf den MFDB des Zielrasters
intin[0]         wr_mode             Schreibmodus
intin[1]         color_index[0]      Farbindex der gesetzten Punkte
intin[2]         color_index[1]      Farbindex der gelschten Punkte
ptsin[0..7]      xyarr[0..7]         Koordinaten

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout

Bedeutung von xyarr:
xyarr[0..3]: Koordinaten des Quellrechtecks
xyarr[4..7]: Koordinaten des Zielrechtecks


 TRANSFORM FORM (VDI 110)

Diese Funktion transformiert ein Raster vom Standardformat ins gertespezifische
Format und umgekehrt. Die Transformation kann "in place" geschehen, d.h. beide
MFDBs zeigen auf den gleichen Speicherbereich - in diesem Fall dauert aber
gerade das Transformieren groer Blcke ewig.

Dekl.:  void vr_trnfm( WORD handle, MFDB *src_MFDB, MFDB *des_MFDB );
Aufruf: vr_trnfm( handle, &src_MFDB, &des_MFDB );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        110                 vr_trnfm
contrl[1]        0                   Eintrge in ptsin
contrl[2]        0                   Eintrge in ptsout
contrl[3]        0                   Eintrge in intin
contrl[4]        0                   Eintrge in intout
contrl[6]        handle
contrl[7...8]    psrcMFDB            Zeiger auf den MFDB des Quellrasters
contrl[9...10]   pdesMFDB            Zeiger auf den MFDB des Zielrasters


 GET PIXEL (VDI 105)

Fr bis zu 8 Farbebenen (256 gleichzeitig darstellbare Farben) ermittelt "GET
PIXEL" den Zustand (gelscht/gesetzt) und die Farbe eines Pixels.

Bei HiColor (15- oder 16-Bit) enthlt pel den Pixelwert und index ist (meistens)
-1, da er nicht einwandfrei zuzuordnen ist.

Bei TrueColor enthlt pel das Low-Word des Pixelwerts und index das High-Word.

Dekl.:  void v_get_pixel( WORD handle, WORD x, WORD y, WORD *pel, WORD *index );
Aufruf: v_get_pixel( handle, x, y, &pel, & index );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        105                 v_get_pixel
contrl[1]        1                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[0]         x
ptsin[1]         y

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        2                   Eintrge in intout
intout[0]        pel                 Pixelwert
intout[1]        index               Farbindex des Pixels


Rasteroperationen bei Off-Screen-Bitmaps:

Rasteroperationen zwischen Bildschirm und Off-Screen-Bitmap sollten
grundstzlich im gertespezifischen Format erfolgen.
Wenn als Ziel einer Rasteroperation eine Off-Screen-Bitmap mit ihrem MFDB
angegeben wird und wenn das zu dieser Bitmap gehrende Handle benutzt wird, so
wird beim Transfer anhand der ber vs_clip() auf dieser Workstation
eingestellten Koordinaten geclippt. Fr das Kopieren eines Rasters vom
Bildschirm in eine Off-Screen-Bitmap sollte man also das VDI-Handle dieser
Bitmap benutzen.
Ist die Bitmap dagegen Quelle und der Bildschirm Ziel, so sollte man das Handle
der Bildschirm-Workstaion benutzen, da dann das Raster anhand der
Bildschirm-Koordinaten abgeclippt wird. Wenn man das von v_opnbm()
zurckgelieferte Handle einer Bitmap benutzt und in fd_addr in einem MFDB 0
enthlt, so werden die Daten der Bitmap statt dessen benutzt.




Eingabefunktionen
=================

Die Eingabefunktionen ermglichen einem Programm, unter Bercksichtigung der
Eingabemodi Tastatur und Maus abzufragen. Auerdem bieten sie Routinen zum
einenklinken in Timer- und Maus- Interrupts.

Diese Funktionen sind primr fr den Eigner der physikalischen Workstation, d.h.
fr das AES gedacht. Applikationen sollten, sofern es keine zwingenden Grnde
fr ein anderes Vorgehen gibt, Maus- und Tastaturereignisse immer durch die
Event-Funktionen des AES abfragen, da andernfalls fr andere Applikationen
bestimmte Eingaben abgefangen werden.


 SET INPUT MODE (VDI 33)

Mit "SET INPUT MODE" kann man fr ein bestimmtes Eingabegert den Eingabemodus
festlegen.

Dekl.:  void vsin_mode( WORD handle, WORD dev_type, WORD mode );
Aufruf: vsin_mode( handle, dev_type, mode );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        33                  vsin_mode
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0]         dev_type            Eingabeeinheit
intin[1]         mode                gewnschter Eingabemodus

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        set_mode            ausgewhlter Eingabemodus

Bedeutung von dev_type:
1: Maus
2: Cursor
3: Funktionstasten
4: Tastatur

Bedeutung von mode:
REQUEST MODE   1: Eingabeeinheit abfragen und sofort den Eingabewert und den
                  Status zurckgeben.
SAMPLE MODE    2: Warten bis eine Eingabe erfolgt und dann den Eingabewert
                  zurckgeben.


 INPUT LOCATOR, REQUEST MODE (VDI 28)

Mit dieser Funktion wird die Position des Mauszeigers ermittelt und eine neue
Position bergeben. Der Mauszeiger wird erst nach Druck einer Maustaste neu
positioniert.

Dekl.:  void vrq_locator( WORD handle, WORD x, WORD y, WORD *xout,
                               WORD *yout, WORD *term );
Aufruf: vrq_locator( handle, x, y, &xout, &yout, &term );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        28                  vrq_locator
contrl[1]        1                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[0]         x                   neue x-Koordinate des Mauszeigers
ptsin[1]         y                   neue y-Koordinate des Mauszeigers

Ausgaben:

contrl[2]        1                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        term                Maustastenstatus+31
ptsout[0]        xout                alte x-Koordinate des Mauszeigers
ptsout[1]        yout                alte y-Koordinate des Mauszeigers


 INPUT LOCATOR, SAMPLE MODE (VDI 28)

Mit dieser Funktion wird die Position des Mauszeigers ermittelt und eine  neue
Position  bergeben.  Tastenbettigungen  oder Mausposition  werden  nur  dann
gemeldet, wenn sie wirklich erfolgt sind.

Dekl.:  WORD vsm_locator( WORD handle,  WORD x,  WORD y,  WORD *xout,
                          WORD *yout, WORD *term );
Aufruf: status = vsm_locator( handle, x, y, &xout, &yout, &term );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        28                  vsm_locator
contrl[1]        1                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
ptsin[0]         x                   neue x-Koordinate des Mauszeigers
ptsin[1]         y                   neue y-Koordinate des Mauszeigers

Ausgaben:

contrl[2]        0 oder 1            Eintrge in ptsout
contrl[4]        0 oder 1            Eintrge in intout
intout[0]        term                Maustastenstatus+31
ptsout[0]        xout                alte x-Koordinate des Mauszeigers
ptsout[1]        yout                alte y-Koordinate des Mauszeigers

Bedeutung von status (gebildet aus (contrl[4]<<1)|contrl[2]) (Bitnummer):
0: Positionsvernderung
1: Tastendruck


 INPUT CHOICE, REQUEST MODE (VDI 30)

Mit  dieser Funktion wird die Bettigung einer Funktionstaste  abgewartet  und
die Tastennummer (1-10) zurckgegeben.

Dekl.:  void vrq_choice( WORD handle, WORD ch_in, WORD *ch_out );
Aufruf: vrq_choice( handle, ch_in, &ch_out );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        30                  vrq_choice
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         ch_in               initialisierende Taste (0)

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        ch_out              ausgewhlte Funktionstaste


 INPUT CHOICE, SAMPLE MODE (VDI 30)

Sofern   eine  Funktionstaste  bettigt  wurde,   gibt  dieser  Funktion   die
Tastennummer (1-10) zurck.

Dekl.:  WORD vsm_choice( WORD handle, WORD *choice );
Aufruf: status = vsm_choice( handle, &choice );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        30                  vsm_choice
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0 oder 1            Eintrge in intout
intout[0]        choice              Tastennummer

Bedeutung von status (contrl[4]):
0: kein Tastendruck
1: Tastendruck erfolgt


 INPUT STRING,REQUEST MODE (VDI 31)

Diese Funktion gibt eine Zeichenkette von der Tastatur zurck, wenn RETURN
gedrckt oder die maximale Lnge erreicht wird.

Dekl.:  void vrq_string( WORD handle, WORD max_length, WORD echo_mode,
                              WORD *echo_xy, BYTE *string );
Aufruf: vrq_string( handle, max_length, echo_mode, echo_xy, string );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        31                  vrq_string
contrl[1]        1                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0]         max_length          maximale Lnge der Zeichenkette
intin[1]         echo_mode           0: keine Ausgabe, 1: Ausgabe
ptsin[0]         echo_xy[0]
ptsin[1]         echo_xy[1]

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        n                   Eintrge in intout
intout[0..n-1]   string[0..n-1]      Eingabepuffer

Bedeutung von max_length:
max_length gibt die maximale Lnge der Zeichenkette an. Ist max_length negativ,
so wird der Absolutbetrag als Lnge betrachtet, und statt der ASCII-Codes werden
Scan-Codes bergeben.


 INPUT STRING,SAMPLE MODE (VDI 31)

Diese Funktion gibt eine Zeichenkette von der Tastatur  zurck, wenn RETURN
gedrckt oder die maximale Lnge erreicht wird. Sofern keine Eingaben gemacht
werden, bricht die Funktion ab.

Dekl.:  WORD vsm_string( WORD handle, WORD max_length, WORD echo_mode,
                             WORD *echo_xy, BYTE *string );
Aufruf: status = vsm_string( handle,  max_length, echo_mode, echo_xy, string );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        31                  vsm_string
contrl[1]        1                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[6]        handle
intin[0]         max_length          maximale Lnge der Zeichenkette
intin[1]         echo_mode           0: keine Ausgabe, 1: Ausgabe
ptsin[0]         echo_xy[0]
ptsin[1]         echo_xy[1]

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        n                   Eintrge in intout
intout[0..n-1]   string[0..n-1]      Eingabepuffer

Bedeutung von max_length:
max_length  gibt  die  maximale Lnge  der  Zeichenkette  an.  Ist  max_length
negativ,  so  wird der Absolut-Betrag als Lnge benutzt und statt  der  ASCII-
Codes werden Scan-Codes bergeben.

Bedeutung von status (contrl[4]):
0:    keine Eingabe
<> 0: Lnge der Zeichenkette


 SET MOUSE FORM (VDI 111)

Das Aussehen des Mauszeigers kann mit "SET MOUSE FORM" frei definiert werden.

Dekl.:  void vsc_form( WORD handle, WORD *cursor );
Aufruf: vsc_form( handle, cursor );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        111                 vsc_form
contrl[1]        0                   Eintrge in ptsin
contrl[3]        37                  Eintrge in intin
contrl[6]        handle
intin[0..36]     cursor[0..36]       Mauszeigerdefinition

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout

Bedeutung von cursor:
pcur_form[0]:       relative Koordinate des horizontalen Aktionspunktes
pcur_form[1]:       relative Koordinate des vertikalen Aktionspunktes
pcur_form[2]:       mu 1 sein (REPLACE)
pcur_form[3]:       Farbindex der Hintergrundmaske
pcur_form[4]:       Farbindex der Vordergrundmaske
pcur_form[5..20]:   Hintergrundmaske
pcur_form[21..36]:  Vordergrundmaske

Bemerkung:
Zum Setzen der Mausform sollte in GEM-Programmen unbedingt die AES-Funktion
graf_mouse() verwendet werden.  Andernfalls wird die Mausform-Verwaltung des AES
nachhaltig verwirrt.

Mit NVDI ist es mglich, die aktuelle Mausform zurckgeliefert zu bekommen.

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        111                 vgc_form
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        37                  Eintrge in intout
intout[0..36]    cursor[0..36]       Mauszeigerdefinition


 INQUIRE INPUT MODE (VDI 115)

Diese Funktion ermittelt den Eingabemodus eines Gertes.

Dekl.:  void vqin_mode( WORD handle, WORD dev_type, WORD *input_mode );
Aufruf: vqin_mode( handle, dev_type, &input_mode );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        115                 vqin_mode
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         dev_type            Gertenummer (siehe vsin_mode)

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[1]        input_mode          Eingabe-Modus


 EXCHANGE TIMER INTERRUPT VECTOR (VDI 118)

Mit dieser Funktion kann man eine eigene Routine im Timerinterrupt (etv_timer)
aufrufen lassen. Diese Routine mu an ihrem Ende alle vernderten Register
restaurieren und die alte Timerinterruptroutine anspringen.

Dekl.:  void vex_timv( WORD handle, void *tim_addr, void **otim_addr,
                       WORD *tim_conv );
Aufruf: vex_timv( handle, tim_addr, &otim_addr, &tim_conv );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        118                 vex_timv
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
contrl[7..8]     tim_addr            Adresse der neuen Interruptroutine

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
contrl[9..10]    otim_addr           Adresse der alten Interruptroutine
intout[0]        tim_conv            Interruptintervall in ms


 SHOW CURSOR (VDI 122)

Mit "SHOW CURSOR" wird ein vorhergehender "HIDE CURSOR"-Aufruf aufgehoben. Wenn
man den Mauszeiger sofort erscheinen lassen mchte, mu der Parameter <reset>
Null sein.

Dekl.:  void v_show_c( WORD handle, WORD reset );
Aufruf: v_show_c( handle, reset );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        122                 v_show_c
contrl[1]        0                   Eintrge in ptsin
contrl[3]        1                   Eintrge in intin
contrl[6]        handle
intin[0]         reset

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout

Bedeutung von reset:
0:    Mauszeiger sofort anzeigen
<> 0: Hide-Counter dekrementieren und gegebenenfalls Mauszeiger zeichnen

Bemerkung:
Zum  Ein-/Ausschalten der Maus sollte in GEM-Programmen unbedingt die
AES-Funktion graf_mouse() verwendet werden.


 HIDE CURSOR (VDI 123)

Diese Funktion schaltet den Mauszeiger aus.

Dekl.:  void v_hide_c( WORD handle );
Aufruf: v_hide_c( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        123                 v_hide_c
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout

Bemerkung:
Zum  Ein-/Ausschalten der Maus sollte in GEM-Programmen unbedingt die
AES-Funktion graf_mouse() verwendet werden.


 SAMPLE MOUSE BUTTON STATE (VDI 124)

Diese Funktion gibt Informationen ber die Mauszeiger-Position und den  Status
der Maustasten zurck.

Dekl.:  void vq_mouse( WORD handle, WORD *status, WORD *x, WORD *y );
Aufruf: vq_mouse( handle, &status, &x, &y );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        124                 vq_mouse
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        1                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        status              Maustastenstatus
ptsout[0]        x
ptsout[1]        y

Bedeutung von status:
0: keine Maustaste gedrckt
1: linke Maustaste gedrckt
2: rechte Maustaste gedrckt
3: beide Maustasten gedrckt

Bemerkung:
In GEM-Programmen sollte die AES-Funktion graf_mkstate() verwendet werden, um
nur die fr die eigene Applikation bestimmten Informationen ber Position und
Status der Maustastenstatus zu erhalten.


 EXCHANGE BUTTON CHANGE VECTOR (VDI 125)

Mit "EXCHANGE BUTTON CHANGE VECTOR" kann man eine Routine installieren, die beim
Druck einer Maustaste aufgerufen wird und in Register d0.w den Status der
Maustasten erthlt. Diese Routine mu alle vernderten Register wiederherstellen
und die alte Maustasten-Status-Routine aufrufen.

Dekl.:  void vex_butv( WORD handle, void *pusrcode, void **psavcode );
Aufruf: vex_butv( handle, pusrcode, &psavcode );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        125                 vex_butv
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
contrl[7..8]     pusrcode            Adresse der neuen Routine

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
contrl[9..10]    psavcode            Adresse der alten Routine


 EXCHANGE MOUSE MOVEMENT VECTOR (VDI 126)

Diese Funktion erlaubt im Fall von Mausbewegungen den Aufruf einer Anwender-
Routine, der in d0.w und d1.w die Koordinaten des Mauszeigers bergeben werden.
Alle vernderten Register mssen von dieser Routine restauriert werden.
Anschlieend sollte die alte Mausbewegungsroutine aufgerufen werden.

Dekl.:  void vex_motv( WORD handle, void *pusrcode, void **psavcode );
Aufruf: vex_motv( handle, pusrcode, &psavcode );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        126                 vex_motv
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
contrl[7..8]     pusrcode            Adresse der neuen Routine

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
contrl[9..10]    psavcode            Adresse der alten Routine


 EXCHANGE CURCOR CHANGE VECTOR (VDI 127)

Mit "EXCHANGE CURSOR CHANGE VECTOR" kann man eine Routine installieren, die bei
Mausbewegungen aufgerufen wird. Der Aufruf dieser Routine erfolgt, nachdem die
ber vex_motv() eingetragene Routine aufgerufen und die Mauszeiger-Koordinaten,
die man in d0.w und d1.w erhlt, geclippt wurden. Alle  vernderten  Register
mssen wiederhergestellt werden. Anschlieend sollte die alte Routine aufgerufen
werden.

Dekl.:  void vex_curv( WORD handle, void *pusrcode, void **psavcode );
Aufruf: vex_curv( handle, pusrcode, &psavcode );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        127                 vex_curv
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle
contrl[7..8]     pusrcode            Adresse der neuen Routine

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout
contrl[9..10]    psavcode            Adresse der alten Routine


 SAMPLE KEYBOARD STATE INFORMATION (VDI 128)

Diese Funktion gibt den Status der CONTROL-, ALTERNATE- sowie der SHIFT-
Taste(n) zurck.

Dekl.:  void vq_key_s( WORD handle, WORD *status );
Aufruf: vq_key_s( handle, &status );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        128                 vq_key_s
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        1                   Eintrge in intout
intout[0]        pstatus             Tastenstatus

Bedeutung von pstatus (Bitnummer):
0: rechte Shift-Taste
1: linke Shift-Taste
2: Control-Taste
3: Alternate-Taste

Bemerkung:
In GEM-Programmen sollten die AES Event-Funktionen verwendet werden, um nur die
fr die eigene Applikation bestimmten Informationen ber den Tastaturstatus zu
erhalten.




Textmodus und VT52
==================

 INQUIRE ADDRESSABLE ALPHA CHARACTER CELLS (VDI 5, ESCAPE 1)

Diese Funktion gibt ber die Anzahl der Zeilen und Spalten des Textbildschirmes
Auskunft. Wenn <rows> und <colums> 0 sind, gibt es auf dem Gert keinen
Textmodus.

Dekl.:  void vq_chcells( WORD handle, WORD *rows, WORD *columns );
Aufruf: vq_chcells( handle, &rows, &columns );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        1                   vq_chcells
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        2                   Eintrge in intout
intout[0]        rows                Zeilenanzahl
intout[1]        columns             Spaltenanzahl


 EXIT ALPHA MODE (VDI 5, ESCAPE 2)

"EXIT ALPHA MODE" schaltet den Textmodus aus.

Dekl.:  void v_exit_cur( WORD handle );
Aufruf: v_exit_cur( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        2                   v_exit_cur
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ENTER ALPHA MODE (VDI 5, ESCAPE 3)

Mit dieser Funktion gelangt man in den Textmodus. Der Bildschirm wird gelscht
und der Text-Cursor in die linke obere Ecke gesetzt.

Dekl.:  void v_enter_cur( WORD handle );
Aufruf: v_enter_cur( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        3                   v_enter_cur
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ALPHA CURSOR UP (VDI 5, ESCAPE 4)

Der Text-Cursor wird von dieser Funktion eine Zeile nach oben bewegt. Sofern er
sich in der obersten Zeile befindet, geschieht nichts.

Dekl.:  void v_curup( WORD handle );
Aufruf: v_curup( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        4                   v_curup
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ALPHA CURSOR DOWN (VDI 5, ESCAPE 5)

Der Text-Cursor wird um eine Zeile nach unten bewegt. Befindet sich der Cursor
in der untersten Zeile, so passiert nichts.

Dekl.:  void v_curdown( WORD handle );
Aufruf: v_curdown( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        5                   v_curdown
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ALPHA CURSOR RIGHT (VDI 5, ESCAPE 6)

"ALPHA CURSOR RIGHT" bewegt den Text-Cursor nach rechts, wobei am Zeilenende
nichts geschieht.

Dekl.:  void v_curright( WORD handle );
Aufruf: v_curright( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        6                   v_curright
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ALPHA CURSOR LEFT (VDI 5, ESCAPE 7)

Der Text-Cursor wird von dieser Funktion nach links bewegt. Es passiert nichts,
wenn er sich bereits am Zeilenanfang befinden sollte.

Dekl.:  void v_curleft( WORD handle );
Aufruf: v_curleft( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        7                   v_curleft
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 HOME ALPHA CURSOR (VDI 5, ESCAPE 8)

Von dieser Funktion wird der Text-Cursor in die linke obere Ecke gesetzt.

Dekl.:  void v_curhome( WORD handle );
Aufruf: v_curhome( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        8                   v_curhome
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ERASE TO END OF ALPHA SRCEEN (VDI 5, ESCAPE 9)

Der Bildschirm wird von der aktuellen Cursor-Position ab gelscht.

Dekl.:  void v_eeos( WORD handle );
Aufruf: v_eeos( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        9                   v_eeos
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 ERASE TO END OF ALPHA TEXT LINE (VDI 5, ESCAPE 10)

Diese Funktion lscht ab der Cursor-Position die aktuelle Zeile.

Dekl.:  void v_eeol( WORD handle );
Aufruf: v_eeol( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        10                  v_eeol
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 DIRECT ALPHA CURSOR ADDRESS (VDI 5, ESCAPE 11)

Mit "DIRECT ALPHA CURSOR ADDRESS" kann der Text-Cursor direkt positioniert
werden.

Dekl.:  void v_curaddress( WORD handle, WORD row, WORD column );
Aufruf: v_curadress( handle, row, column );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        2                   Eintrge in intin
contrl[5]        11                  v_curaddress
contrl[6]        handle
intin[0]         row                 Zeile
intin[1]         column              Spalte

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 OUTPUT CURSOR ADDRESSABLE ALPHA TEXT (VDI 5, ESCAPE 12)

Diese Funktion gibt an der aktuellen Cursor-Position eine Zeichenkette aus.

Dekl.:  void v_curtext( WORD handle, BYTE *string );
Aufruf: v_curtext( handle, string );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        n                   Eintrge in intin
contrl[5]        12                  v_curtext
contrl[6]        handle
intin[0..n-1]    string[0..n-1]      Zeichenkette

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 REVERSE VIDEO ON (VDI 5, ESCAPE 13)

Diese Funktion schaltet auf inverse Textausgabe um.

Dekl.:  void v_rvon( WORD handle );
Aufruf: v_rvon( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        13                  v_rvon
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 REVERSE VIDEO OFF (VDI 5, ESCAPE 14)

Die inverse Textausgabe wird ausgeschaltet.

Dekl.:  void v_rvoff( WORD handle );
Aufruf: v_rvoff( handle );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        14                  v_rvoff
contrl[6]        handle

Ausgaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        0                   Eintrge in intout


 INQUIRE CURRENT ALPHA CURCOR ADDRESS (VDI 5, ESCAPE 15)

Von dieser Funktion wird die Position des Text-Cursors zurckgegeben.

Dekl.:  void vq_curaddress( WORD handle, WORD *row, WORD *column );
Aufruf: vq_curaddress( handle, &row, &column );

Variable         Belegung            Bedeutung
Eingaben:

contrl[0]        5                   ESCAPE
contrl[1]        0                   Eintrge in ptsin
contrl[3]        0                   Eintrge in intin
contrl[5]        15                  vq_curaddress
contrl[6]        handle

Augaben:

contrl[2]        0                   Eintrge in ptsout
contrl[4]        2                   Eintrge in intout
intout[0]        row                 Zeile
intout[1]        column              Spalte




Beispiele fr Bindings
======================

Diese Beispiel-Bindings gehen davon aus, da <pb>, <contrl>, <intin>, <ptsin>,
<intout> und <ptsout> global definiert sind. Die Funktion vdi() ist als
void vdi( VDIPB *pb ) definiert. WORD, UWORD usw. sind normalerweise in PORTAB.H
definiert, fix31 sollte als LONG definiert werden.

/* Strukturdefinitionen */

typedef struct
{
   void  *fd_addr;         /* Adresse des Rasters oder 0 fr Bildschirm/Bitmap */
   WORD  fd_w;             /* Breite des Rasters in Pixeln */
   WORD  fd_h;             /* Hhe des Rasters in Zeilen */
   WORD  fd_wdwidth;       /* Breite einer Rasterzeile in Worten */
   WORD  fd_stand;         /* Format 0: gertespezifisch, 1: Standardformat */
   WORD  fd_nplanes;       /* Anzahl der Ebenen */
   WORD  fd_r1;            /* reserviert, sollte 0 sein */
   WORD  fd_r2;            /* reserviert, sollte 0 sein */
   WORD  fd_r3;            /* reserviert, sollte 0 sein */
} MFDB;

typedef struct
{
   WORD  red;              /* Rot-Intensitt in Promille (0-1000) */
   WORD  green;            /* Grn-Intensitt in Promille (0-1000) */
   WORD  blue;             /* Blau-Intensitt in Promille (0-1000) */
} RGB1000;

typedef struct
{
   LONG  size;             /* Lnge der Struktur, mu vor vqt_xfntinfo() gesetzt werden */
   WORD  format;           /* Fontformat, z.B. 4 fr TrueType */
   WORD  id;               /* Font-ID, z.B. 6059 */
   WORD  index;            /* Index */
   BYTE  font_name[50];    /* vollstndiger Fontname, z.B. "Century 725 Italic BT" */
   BYTE  family_name[50];  /* Name der Fontfamilie, z.B. "Century725 BT" */
   BYTE  style_name[50];   /* Name des Fontstils, z.B. "Italic" */
   BYTE  file_name1[200];  /* Name der 1. Fontdatei, z.B. "C:\FONTS\TT1059M_.TTF" */
   BYTE  file_name2[200];  /* Name der optionalen 2. Fontdatei */
   BYTE  file_name3[200];  /* Name der optionalen 3. Fontdatei */
   WORD  pt_cnt;           /* Anzahl der Punkthhen fr vst_point(), z.B. 10 */
   WORD  pt_sizes[64];     /* verfgbare Punkthhen,
                              z.B. { 8, 9, 10, 11, 12, 14, 18, 24, 36, 48 } */
} XFNT_INFO;

/* Funktionsprototypen */
void  vdi_str_to_c( UWORD *src, UBYTE *des, WORD len );
WORD  c_str_to_vdi( UBYTE *src, UWORD *des );
WORD  fix31_to_pixel( fix31 a );
void  vs_color( WORD handle, WORD index, RGB1000 *rgb_in );
WORD  vq_color( WORD handle, WORD color_index, WORD flag, RGB1000 *rgb_out );
WORD  vs_calibrate( WORD handle, WORD flag, RGB1000 *table );
WORD  vq_calibrate( WORD handle, WORD *flag );
void  v_opnbm( WORD *work_in, MFDB *bitmap, WORD *handle, WORD *work_out );
void  v_clsbm( WORD handle );
void  vq_scrninfo( WORD handle, WORD *work_out );
WORD  vq_devinfo2( WORD handle, WORD device, WORD *dev_exists, BYTE *file_name, BYTE *real_name );
WORD  vq_ext_devinfo( WORD handle, WORD device, WORD *dev_exists,
                      BYTE *file_path, BYTE *file_name, BYTE *name );
WORD  vqt_name( WORD handle, WORD index, BYTE *name, UWORD *font_format, UWORD *flags );
void  vst_width( WORD handle, WORD width, WORD *char_width, WORD *char_height,
                 WORD *cell_width, WORD *cell_height );
void  vst_track_offset( WORD handle, fix31 offset, WORD pair_mode, WORD *tracks, WORD *pairs );
void  vqt_real_extent( WORD handle, WORD x, WORD y, BYTE *string, WORD *extent );
WORD  vqt_xfntinfo( WORD handle, WORD flags, WORD id, WORD index, XFNT_INFO *info );
WORD vst_name( WORD handle, WORD font_format, BYTE *font_name, BYTE *ret_name );
WORD  vqt_name_and_id( WORD handle, WORD font_format, BYTE *font_name, BYTE *ret_name );

/* VDI-String in einen C-String umwandeln */
void  vdi_str_to_c( UWORD *src, UBYTE *des, WORD len )
{
   while ( len > 0 )
   {
      *des++ = (UBYTE) *src++;   /* nur das Low-Byte kopieren */
      len--;
   }
   *des++ = 0;                   /* Ende des Strings */
}

/* C-String in einen VDI-String umwandeln */
WORD  c_str_to_vdi( UBYTE *src, UWORD *des )
{
   WORD  len;

   while (( *des++ = *src++ ) != 0 )
      len++;

   return( len );                /* Lnge des Strings ohne Null-Byte */
}

/* Positionsangabe in fix31-Darstellung in Pixel-Koordinate umrechnen */
WORD  fix31_to_pixel( fix31 a )
{
   WORD  b;

   b = (WORD) (( a + 32768L ) >> 16 ); /* runden !! */
   return( b );                        /* Pixelwert zurckgeben */
}

void  vs_color( WORD handle, WORD index, RGB1000 *rgb_in )
{
   intin[0] = index;
   intin[1] = rgb_in->red;
   intin[2] = rgb_in->green;
   intin[3] = rgb_in->blue;

   contrl[0] = 14;
   contrl[1] = 0;
   contrl[3] = 4;
   contrl[5] = 0;
   contrl[6] = handle;

   vdi( &pb );
}

WORD  vq_color( WORD handle, WORD color_index, WORD flag, RGB1000 *rgb_out )
{
   intin[0] = color_index;
   intin[1] = flag;

   contrl[0] = 26;
   contrl[1] = 0;
   contrl[3] = 2;
   contrl[5] = 0;
   contrl[6] = handle;

   vdi( &pb );

   *rgb_out = *(RGB1000 *) (intout + 1);
   return( intout[0] );
}

WORD  vs_calibrate( WORD handle, WORD flag, RGB1000 *table )
{
   *(RGB1000 **)intin = table;
   intin[2] = flag;

   contrl[0] = 5;
   contrl[1] = 0;
   contrl[3] = 3;
   contrl[5] = 76;
   contrl[6] = handle;

   vdi( &pb );

   return( intout[0] );
}

WORD  vq_calibrate( WORD handle, WORD *flag )
{
   contrl[0] = 5;
   contrl[1] = 0;
   contrl[3] = 0;
   contrl[5] = 77;
   contrl[6] = handle;

   vdi( &pb );

   if ( contrl[4] > 0 )
   {
      *flag = intout[0];
      return( 1 );
   }
   else
   {
      *flag = 0
      return( 0 );
   }
}

void  v_opnbm( WORD *work_in, MFDB *bitmap, WORD *handle, WORD *work_out )
{
   /* Wenn work_in[15..19] 0 enthalten, wird eine Bitmap im gertespezifischen
      Format oder mit nur 1 Ebene erzeugt (hngt vom MFDB ab). Anderfalls wird
      versucht eine Bitmap mit der Farbanzahl <work_in[15..16]>, <work_in[17]>
      Ebenen, dem Pixelformat <work_in[18]> und der Bitreihenfolge <work_in[19]>
      anzulegen. Falls kein passender Offscreen-Treiber vorhanden ist, kann die
      Bitmap nicht geffnet werden.
   */

   pb[1] = work_in;
   pb[3] = work_out;
   pb[4] = work_out + 45;

   contrl[0] = 100;
   contrl[1] = 0;
   contrl[3] = 20;
   contrl[5] = 1;
   *(MFDB *)&contrl[7] = bitmap;

   vdi( &pb );

   *handle = contrl[6];
   pb[1] = intin;
   pb[3] = intout;
   pb[4] = ptsout;
}

void  v_clsbm( WORD handle )
{
   contrl[0] = 101;
   contrl[1] = 0;
   contrl[3] = 0;
   contrl[5] = 1;
   contrl[6] = handle;
   vdi( &pb );
}

void  vq_scrninfo( WORD handle, WORD *work_out )
{
   pb[3] = work_out;

   intin[0] = 2;
   contrl[0] = 102;
   contrl[1] = 0;
   contrl[3] = 1;
   contrl[5] = 1;
   contrl[6] = handle;

   vdi( &pb );

   pb[3] = intout;
}

WORD  vq_devinfo2( WORD handle, WORD device, WORD *dev_exists, BYTE *file_name, BYTE *real_name )
{
   contrl[0] = 248;                 /* Funktionsnummer */
   contrl[1] = 0;
   contrl[3] = 1;                   /* ID wird bergeben */
   contrl[5] = 0;
   contrl[6] = handle;
   intin[0] = device;               /* Gert */

   vdi( &pb );

   *dev_exists = 0;                 /* Treiber ist nicht vorhanden */
   *file_name = 0;
   *real_name = 0;

   if ( contrl[4] && intout[0] )    /* Treiber vorhanden? */
   {
      WORD  i;
      WORD  len;

      *dev_exists = 1;              /* Treiber ist vorhanden */

      for ( i = 0; i < contrl[4]; i++ )
      {
         *file_name = (BYTE) intout[i];
         if ( *file_name == ' ' )    /* Trennung durch Leerzeichen? */
         {
            /* letztes Leerzeichen? */
            if (( i < contrl[4] ) && ( intout[i+1] != ' ' ))
            {
               *file_name = '.';    /* Leerzeichen ersetzen */
               file_name++;
            }
         }
         else
            file_name++;
      }
      *file_name++ = 0;             /* Endeeeee */

      if (( contrl[2] == 1 ) && ( contrl[1] > 0 )) /* !?+*~")%&#/(^= */
         len = contrl[1];
      else
         len = contrl[2] - 1;

      for ( i = 1; i <= len; i++ )  /* Klartextnamen kopieren */
         *((WORD *)real_name)++ = ptsout[i];
      *real_name++ = 0;             /* sicherheitshalber */
   }

   return( ptsout[0] );             /* Treiber geffnet oder nicht */
}

WORD  vq_ext_devinfo( WORD handle, WORD device, WORD *dev_exists,
                      BYTE *file_path, BYTE *file_name, BYTE *name )
{
   intin[0] = device;
   *(BYTE **)&intin[1] = file_path;
   *(BYTE **)&intin[3] = file_name;
   *(BYTE **)&intin[5] = name;

   contrl[0] = 248;
   contrl[1] = 0;
   contrl[3] = 7;
   contrl[5] = 4242;
   contrl[6] = handle;

   vdi( &pb );

   *dev_exists = intout[0];
   return( intout[1] );
}

WORD  vqt_name( WORD handle, WORD index, BYTE *name, UWORD *font_format, UWORD *flags )
{
   intin[0] = index;
   intin[1] = 0;

   contrl[0] = 130;
   contrl[1] = 0;
   contrl[3] = 2;
   contrl[5] = 1;
   contrl[6] = handle;

   vdi( &pb );

   vdi_str_to_c( (UWORD *)&intout[1], (UBYTE *) name, 31 );

   if ( contrl[4] <= 34 )
   {
      *flags = 0;
      *font_format = 0;
      if ( contrl[4] == 33 )
         name[32] = 0;
      else
         name[32] = (BYTE) intout[33];
   }
   else
   {
      name[32] = intout[33];
      *flags = (intout[34] >> 8) & 0xff;
      *font_format = intout[34] & 0xff;
   }

   return( intout[0] );
}

void  vst_width( WORD handle, WORD width, WORD *char_width, WORD *char_height,
                 WORD *cell_width, WORD *cell_height );
{
   ptsin[0] = width;

   contrl[0] = 231;
   contrl[1] = 1;
   contrl[3] = 0;
   contrl[5] = 0;
   contrl[6] = handle;

   vdi( &pb );

   *char_width = ptsout[0];
   *char_height = ptsout[1];
   *cell_width = ptsout[2];
   *cell_height = ptsout[3];
}

void  vst_track_offset( WORD handle, fix31 offset, WORD pair_mode, WORD *tracks, WORD *pairs )
{
   contrl[0] = 237;
   contrl[1] = 0;
   contrl[3] = 4;
   contrl[6] = handle;

   intin[0] = 255;
   intin[1] = pair_mode;
   *(fix31 *)&intin[2] = offset;

   vdi( &pb );

   *tracks = intout[0];
   *pairs = intout[1];
}

void  vqt_real_extent( WORD handle, WORD x, WORD y, BYTE *string, WORD *extent )
{
   WORD  len;
   WORD  i;

   ptsin[0] = x;
   ptsin[1] = y;

   len = c_str_to_vdi( (UBYTE *) string, (UWORD *) intin );

   contrl[0] = 240;
   contrl[1] = 1;
   contrl[3] = len;
   contrl[5] = 4200;
   contrl[6] = handle;

   vdi( &pb );

   for ( i = 0; i < 8; i++ )
      *extent++ = ptsout[i];
}

WORD  vqt_xfntinfo( WORD handle, WORD flags, WORD id, WORD index, XFNT_INFO *info )
{
   info->size = (LONG) sizeof( XFNT_INFO );

   intin[0] = flag;
   intin[1] = id;
   intin[2] = index;
   *(XFNT_INFO **)&intin[3] = info;

   contrl[0] = 229;
   contrl[1] = 0;
   contrl[3] = 5;
   contrl[5] = 0;
   contrl[6] = handle;

   vdi( &pb );

   return( intout[1] );
}

WORD  vst_name( WORD handle, WORD font_format, BYTE *font_name, BYTE *ret_name )
{
   WORD  len;

   intin[0] = font_format;
   len = c_str_to_vdi( (UBYTE *) font_name, (UWORD *)&intin[1] );

   contrl[0] = 230;
   contrl[1] = 0;
   contrl[3] = 1 + len;
   contrl[5] = 0;
   contrl[6] = handle;

   vdi( &pb );

   if ( ret_name )
      vdi_str_to_c( (UWORD *)&intout[1], ret_name, contrl[4] );

   return( intout[0] );
}

WORD  vqt_name_and_id( WORD handle, WORD font_format, BYTE *font_name, BYTE *ret_name )
{
   WORD  len;

   intin[0] = font_format;
   len = c_str_to_vdi( (UBYTE *) font_name, (UWORD *) intin + 1 );

   contrl[0] = 230;
   contrl[1] = 0;
   contrl[3] = 1 + len;
   contrl[5] = 100;
   contrl[6] = handle;

   vdi( &pb );

   if ( ret_name )
      vdi_str_to_c( (UWORD *)&intout[1], ret_name, contrl[4] );

   return( intout[0] );
}


