NVDI 3 Programmer's Guide ========================= Stand: 22.1.95 (vorläufige 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 vorläufige Funktionsbeschreibung zu NVDI 3 ist ist in die Teile - Datentypen und Strukturen - Versionsabfragen - Funktionsumfang - Gerätetreiber und Offscreen-Bitmaps - Farbeinstellungen - Verknüpfung und Zeichenbereich - Linien und nicht gefüllte Grafikprimitive - Gefüllte Grafikprimitive - Marker - Textausgaben mit Bitmap- und Vektorfonts - Rasterfunktionen - Eingabefunktionen - Textmodus und VT52 - Beispiele für Bindings gegliedert. Für die Vollständigkeit und Richtigkeit der gemachten Angaben wird keinerlei Gewähr ü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 gehören folgende Dateien: - NVDIGUID.TXT (to be continued ...) Das Archiv darf nur komplett mit diesen Dateien weitergegeben werden! Es ist erlaubt, die Dateien für die eigenen Anforderungen zu verändern. Es ist jedoch NICHT erlaubt, diese veränderten Dateien weiterzugeben. Für Wünsche, Anregungen und Fehlerkorrekturen habe ich natürlich 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 erwähnten Produkte sind in der Regel durch Warenzeichen geschützt. 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 für die Übergabe von Zeichenketten benutzt. Für die meisten VDI-Funktionen werden die BYTE-Werte erweitert (und zwar so, als ob sie vorzeichenlos wären), 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 hängt 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 repräsentieren 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 anschlie×end die Pixelposition für Cursorpositionierung berechnen möchte sollte wie folgt vorgehen: WORD fix31_to_pixel( fix31 a ) { WORD b; b = (WORD) (( a + 32768L ) >> 16 ); /* runden !! */ return( b ); /* Pixelwert zurückgeben */ } Man darf nie, nie, niemals den Nachkommateil einfach abschneiden! ¨ Strukturen und Felder für VDI-Aufrufe Die folgenden Felder und Strukturen werden für VDI-Aufrufe benötigt: WORD contrl[12]; In contrl werden die Funktionsnummer, die Anzahl der Eingaben, das Handle der Workstation und einige Funktionsabhängige Paramter übergeben. Die Eingaben werden grundsätzlich 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]: abhängig von der Funktion Die Ausgaben werden in den folgenden Elementen zurückgegeben: 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 Ma×e in Pixeln (z.B. die Breite einer Linie oder die Höhe eines Zeichens) zu übergeben. Die Grö×e der Felder hängt von den aufgerufenen Funktionen ab. Eine sinnvolle Deklaration könnte wie folgt aussehen: WORD ptsin[1024]; /* Platz für 512 Eingabe-Koordinatenpaare */ WORD ptsout[256]; /* Platz für 128 Ausgabe-Koordinatenpaare */ Worte wie der Index eines Zeichens oder der Index einer Farbe werden in intin und intout übergeben. Auch hier hängt letztendlich die Grö×e der Felder von den aufgerufenen Funktionen ab. Eine sinnvolle Deklaration könnte wie folgt aussehen: WORD intin[1024]; /* Platz für 1024 Eingabe-Worte */ WORD intout[512]; /* Platz für 512 Ausgabe-Worte */ Um das VDI aufzurufen, mu× der folgende Paramterblock mit den Adressen der oben beschriebenen Felder bestückt werden. Die Adresse des Parameterblocks wird in Register d1 eingetragen und Register d0.w enthält 115. Anschlie×end wird ein Systemaufruf mit dem Befehl trap #2 ausgelöst. 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-Intensitäten in Promille übergeben, wofür am zweckmä×igsten die RGB-Struktur benutzt wird: typedef struct { WORD red; /* Rot-Intensität in Promille (0-1000) */ WORD green; /* Grün-Intensität in Promille (0-1000) */ WORD blue; /* Blau-Intensität in Promille (0-1000) */ } RGB1000; Rasterfunktionen: VDI-Funktionen, die Raster verknüpfen, erwarten als Rasterbeschreibung einen oder mehrere sogenannte MFDBs, "Memory Form Definition Block". typedef struct { void *fd_addr; /* Adresse des Rasters oder 0 für Bildschirm/Bitmap */ WORD fd_w; /* Breite des Rasters in Pixeln */ WORD fd_h; /* Höhe des Rasters in Zeilen */ WORD fd_wdwidth; /* Breite einer Rasterzeile in Worten */ WORD fd_stand; /* Format 0: gerätespezifisch, 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 enthält, mu× der Rest des MFDBs nicht ausgefüllt 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 zukünftiger Erweiterungen auf 0 gesetzt werden! Metafiles: Metafiles beginnen mit dem folgenden Header: typedef struct { WORD mf_header; /* -1, Metafile-Kennung */ WORD mf_length; /* Länge des Headers in Worten (normalerweise 24) */ WORD mf_version; /* Versionsnummer des Formats, hier 101 für 1.01 */ WORD mf_ndcrcfl; /* NDC/RC-Flag, normalerweise 2 (Rasterkoordinaten) */ WORD mf_extents[4]; /* optional - maximale Ausma×e der Grafik */ WORD mf_pagesz[2]; /* optional - Seitengrö×e in 1/10 mm */ WORD mf_coords[4]; /* optional - Koordinatensystem */ WORD mf_imgflag; /* Flag für 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 benötigt, in oft benötigt Angaben über einen Font eingetragen werden: typedef struct { LONG size; /* Länge der Struktur, mu× vor vqt_xfntinfo() gesetzt werden */ WORD format; /* Fontformat, z.B. 4 für TrueType */ WORD id; /* Font-ID, z.B. 6059 */ WORD index; /* Index */ BYTE font_name[50]; /* vollständiger 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 Punkthöhen für vst_point(), z.B. 10 */ WORD pt_sizes[64]; /* verfügbare Punkthöhen, z.B. { 8, 9, 10, 11, 12, 14, 18, 24, 36, 48 } */ } XFNT_INFO; ¨ Zeichenketten Grundsätzlich 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 können. Die C-Bindings für Funktionen wie v_ftext(),vqt_name(), vqt_extent() usw. arbeiten mit normalen C-Strings und wandeln sie fürs VDI um. Die Länge eines derartigen Strings wird dabei in contrl[3] bzw. contrl[4] eingetragen, wobei kein abschlie×endes Null-Byte oder -Wort vorhanden ist! Wer z.B eine in intout ausgegebene Zeichenkette in einen C-String wandeln möchte, mu× contrl[4] Elemente kopieren, dabei die oberen 8 Bit abschneiden und anschlie×end ein Null-Byte anhängen. 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 ); /* Länge des Strings ohne Null-Byte */ } Wenn es sich bei einem Funktionsparameter um einen C-String handelt, wird das in der Regel explizit erwähnt. 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 enthält (z.B. 0x0301 für Version 3.01). Wer die Offscreen-Bitmaps nutzen möchte, 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. Für den Aufruf gelten die Pure C-Konventionen, d.h. Register d0-d2/a0-a1 und der Stack werden zur Parameterübergabe benutzt, d0-d2/a0-a1 können verändert werden). Die Funktion 0 liefert die EdDI-Versionsnummer im BDC-Format (0x0110 für Version 1.10). typedef struct { BYTE id[4]; /* enthält hier 0x4e564449 = 'NVDI' */ LONG value; /* zeigt auf die NVDI-Struktur */ } COOKIE; typedef struct { UWORD nvdi_version; /* z.B. 0x0301 für Version 3.01 */ ULONG nvdi_datum; /* z.B. 0x18061990L für 18.06.1990 */ } NVDI_STRUC; Funktionsumfang =============== Hier folgt eine kurze Auflistung der unterstützten Funktionen mit Angabe, ab welcher Version diese Funktion zur Verfügung steht. contrl[0] contrl[5] Funktionsname Verfügbarkeit 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(); Verknüpfung und Zeichenbereich: 32 0 vswr_mode(); 129 0 vs_clip(); Linien und nicht gefüllte 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(); Gefüllte 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(); Gerätetreiber und Offscreen-Bitmaps =================================== ¨ OPEN WORKSTATION (VDI 1) Mit dieser Funktion öffnen Sie eine physikalische Workstation. Dazu wird ein in der ASSIGN.SYS-Datei eingetragener Gerätetreiber geladen und den Eingaben entsprechend initialisiert. Wenn die Initialisierung erfolgreich verlaufen ist, wird in contrl[6] eine Kennung (im weiteren Verlauf Handle genannt) zurückgegeben, andernfalls eine Null. Wichtig: Der Bildschirmtreiber wird nach Abarbeitung des AUTO-Ordners vom AES geöffnet. Anwenderprogramme müssen 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 Einträge in ptsin contrl[3] 11 Einträge in intin contrl[6] 0 oder 1 intin[0..10] work_in[0..10] Ausgaben: contrl[2] 6 Einträge in ptsout contrl[4] 45 Einträge 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]: Geräteidentifikationsnummer. Mit ihr wählen Sie den zu ladenden Gerätetreiber. 1-10 : Bildschirmtreiber 1: aktuelle Auflösung 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]: Fülltyp work_in[8]: Füllmuster-Index work_in[9]: Füllmuster-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 Rasterhöhe (Wertebereich 0 - ymax) work_out[2]: Gerätekoordinatenflag 0: genaue Skalierung möglich (z.B. Bildschirm) 1: keine genaue Skalierung möglich (Film-Recorder) work_out[3]: Breite eines Pixels in Mikrometern work_out[4]: Höhe eines Pixels in Mikrometern work_out[5]: Anzahl der Zeichenhöhen (0: beliebig veränderbar) work_out[6]: Anzahl der Linientypen work_out[7]: Anzahl der Linienbreiten (0: beliebig veränderbar) work_out[8]: Anzahl der Markertypen work_out[9]: Anzahl der Markergrö×en (0: beliebig veränderbar) work_out[10]: Anzahl der verfügbaren Zeichensätze 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: ausgefüllter Bereich 4: keine Attribute work_out[35]: Farbdarstellungsflag work_out[36]: Textrotationsflag work_out[37]: Flächenfüllung 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 Gerät) work_out[41]: Gerät für variierende Eingaben 1: Tastatur 2: anderes Gerät work_out[42]: Auswahltasten 1: Funktionstasten 2: anderes Tastenfeld work_out[43]: String-Eingabe 1: Tastatur work_out[44]: Geräte-Typ 0: nur Ausgabe 1: Eingabe 2: Ein- u. Ausgabe 4: Metafile-Ausgabe work_out[45]: geringste Zeichenbreite work_out[46]: geringste Zeichenhöhe work_out[47]: grö×te Zeichenbreite work_out[48]: grö×te Zeichenhöhe work_out[49]: geringste Linienbreite work_out[50]: 0 work_out[51]: grö×te Linienbreite work_out[52]: 0 work_out[53]: geringste Markerbreite work_out[54]: geringste Markerhöhe work_out[55]: grö×te Markerbreite work_out[56]: grö×te Markerhöhe Bei NVDI-Drucker- und IMG-Treibern kann au×erdem 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 für den Metafile übernommen. Variable Belegung Bedeutung Eingaben: contrl[0] 1 v_opnwk contrl[1] 0 Einträge in ptsin contrl[3] 16 Einträge 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" schlie×t eine physikalische Workstation. Vorher sollten alle virtuellen Workstations geschlossen werden. Bei Druckertreibern werden vor dem Schlie×en ggf. die noch gepufferten Kommandos ausgeführt, bei Metafiletreibern wird der Metafile geschlo×en. Man beachte, da× das Schlie×en der Workstation bei Druckertreibern keinen Seitenvorschub auslöst. Dekl.: void v_clswk( WORD handle ); Aufruf: v_clswk( handle ); Variable Belegung Bedeutung Eingaben: contrl[0] 2 v_clswk contrl[1] 0 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ OPEN VIRTUAL SCREEN WORKSTATION (VDI 100) "OPEN VIRTUAL SCREEN WORKSTATION" öffnet eine virtuelle Bildschirm-Workstation auf einer bereits geöffneten physikalischen Workstation. Dadurch können die Zugriffe verschiedener Programme mit ihren unterschiedlichen Einstellungen koordiniert werden. Für Bildschirmtreiber müssen 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 Einträge in ptsin contrl[3] 11 Einträge in intin contrl[6] handle Handle der physikalischen Workstation intin[0..10] work_in[0..10] Ausgaben: contrl[2] 6 Einträge in ptsout contrl[4] 45 Einträge 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 geöffnete 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ CLEAR WORKSTATION (VDI 3) Diese Funktion löscht den Bildschirm. Bei Plottern oder Druckern wird ein Seitenvorschub durchgeführt und der Druckpuffer gelöscht. Deklaration: void v_clrwk( WORD handle ); Aufruf: v_clrwk( handle); Variable Belegung Bedeutung Eingaben: contrl[0] 3 v_clrwk contrl[1] 0 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ CLEAR DISPLAY LIST (VDI 5, Escape 22) Diese Funktion löscht bei Plottern oder Druckern den Druckerpuffer. Im Gegensatz zu CLEAR WORKSTATION wird jedoch kein Seitenvorschub durchgeführt. Diese Funktion sollte z.B. dann aufgerufen werden, wenn der Benutzer die Grafikausgaben vor dem Ausdruck (also vor dem UPDATE WORKSTATION) abbrechen möchte. 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 22 Unterfunktionsnummer v_clear_disp_list contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ UPDATE WORKSTATION (VDI 4) Diese Funktion wird auf Geräten wie z.B. Druckern aufgerufen, die VDI-Kommandos in einer Liste puffern. "UPDATE WORKSTATION" veranla×t die Ausführung 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 dafür nötigen Speicher. Die zu übergebenden Pixelgrö×en werden bei den Vektorfonts beachtet, so da× die Ma×haltigkeit gewährt ist. Die Benutzung von Offscreen-Bitmaps bietet sich auch dann an, wenn man Effekte wie starkes Flackern vermeiden möchte. In diesem Fall baut man Teile der Grafik in der Bitmap auf und überträgt 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 Einträge in ptsin contrl[3] 20 Einträge in intin contrl[5] 1 Unterfunktionsnummer für 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 Einträge in ptsout contrl[4] 45 Einträge 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]: Höhe -1 (z.B. 959) work_in[13]: Breite eines Pixels in Mikrometern work_in[14]: Höhe eines Pixels in Mikrometern work_in[15..19]: mu× 0 sein, wenn das gerätespezifische Format benutzt wird Bedeutung von bitmap: Bitmap ist ein Zeiger auf einen MFDB. Falls bitmap->fd_addr gleich NULL ist, so wird anhand der Grö×enangaben in work_in Speicher für die Bitmap angefordert (die Bitmap wird im Gegensatz zu v_opnvwk() gelöscht). Um eine Bitmap im gerätespezifischen 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 Einträge des MFDB (fd_addr, fd_w, fd_h, fd_wdwidth, fd_stand, fd_nplanes) werden vom VDI-Treiber gesetzt und an die aufrufende Applikation zurückgegeben. Wenn nicht nicht genügend Speicher vorhanden ist, wird der Inhalt des MFDBs nicht verändert; ein Null-Handle wird zurückgegeben. 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 gerätespezifische Format umgewandelt. Liegt sie schon im gerätespezifischen Format vor, so wird sie nicht umgewandelt. Falls die Auflösung der Bitmap (d.h. die Anzahl der Farben und Planes) nicht unterstützt wird, gibt v_opnbm() ein Null-Handle zurück. Ab EdDI 1.1 kann v_opnbm() mit zusätzlichen Parametern in work_in[15..19] aufgerufen werden. Es wird dann versucht, eine Bitmap in dem durch diese Parameter beschriebenen Format zu öffnen. Sollte für 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() schlie×t 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 1 Unterfunktionsnummer für v_clsbm() contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ EXTENDED INQUIRE FUNCTION (VDI 102) Von dieser Funktion werden entweder die Parameter von v_opnwk()/v_opnvwk() oder erweiterte Auskünfte zum Gerätetreiber und zum Gerät zurückgeliefert. 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] flag Informationstyp Ausgaben: contrl[2] 6 Einträge in ptsout contrl[4] 45 Einträge 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 für Vergrö×erung des Rasters 0: Vergrö×erung nicht möglich 1: Vergrö×erung möglich work_out[4]: Anzahl der Bildebenen work_out[5]: "Color lookup table"-Unterstützung 0: nicht möglich 1: möglich work_out[6]: Anzahl der 16*16-Pixel-Raster-Operationen pro Sekunde work_out[7]: Verfügbarkeit der Flächenfüllung (v_contourfill) 0: nicht verfügbar 1: verfügbar work_out[8]: Textrotation 0: nicht möglich 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 verfügbar 1: verfügbar work_out[12]: Farbstiftwechsel 0: nicht möglich 1: möglich work_out[13]: Farbbandwechsel 0: nicht möglich 1: farbige Zeilen 2: farbige Zeilen und Rechtecke work_out[14]: maximale Anzahl der Koordinatenpaare für Polyline, Polymarker, und Filled Area oder -1 (unbegrenzt) work_out[15]: maximale Länge des intin-Array oder -1 (unbegrenzt) work_out[16]: Anzahl der Maustasten work_out[17]: Verfügbarkeit von Linientypen für breite Linien 0: nicht verfügbar 1: verfügbar work_out[18]: Anzahl der Schreibmodi für breite Linien work_out[19]: Clipping-Flag 0: Clipping aus 1: Clipping an work_out[20]: 0: keine genaueren Pixelgrö×en in den folgenden Feldern 1: Pixelausma×e werden in 1/10 Mikrometern zurückgeliefert 2: Pixelausma×e werden in 1/100 Mikrometern zurückgeliefert 3: Pixelausma×e werden in 1/1000 Mikrometern zurückgeliefert work_out[21]: Pixelbreite in 1/10, 1/100 oder 1/1000 Mikrometern work_out[22]: Pixelhöhe in 1/10, 1/100 oder 1/1000 Mikrometern work_out[23]: horizontale Auflösung in dpi work_out[24]: vertikale Auflösung in dpi work_out[28]: Bezier-Flag. Bit 1 gibt Auskunft über die Bezierfähigkeiten 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 enthält, werden in den Elementen 21-24 und 40-43 zusätzliche Informationen über Pixelgrö×e und nicht bedruckbare Ränder übergeben. Die nicht bedruckbaren Ränder werden normalerweise nur bei Druckertreibern zurückgeliefert. Sie ermöglichen Applikationen, Dokumente zu zentrieren oder dem Benutzer ein zutreffendes Bild der ausgedruckten Seite zu liefern, indem die Ränder im Dokument angezeigt werden (der bei v_opnwk() in work_in[0/1] zurückgelieferte Bereich ist der bedruckbare Bereich). Wenn genauere Pixelgrö×en zurückgeliefert 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 führen. Die Rückgabe 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 zurückgegeben, wohl aber das Clipping-Rechteck (obwohl das nicht dokumentiert ist) - Benutzung also auf eigene Gefahr! Die Rückgabe des Bezier-Flag (work_out[28], Bit 1) ist GEM/3-kompatibel. Im ATARI-VDI ist work_out[28] reserviert und enthält eine Null. ¨ INQUIRE SCREEN INFORMATION (VDI 102, 1) "INQUIRE SCREEN INFORMATION" liefert genauere Angaben über Bildschirmformat (auch gerätespezifisches Format genannt). Diese Informationen sind in erster Linie interessant für Programme, die - schnell Raster aufbauen (dithern) und diese mit vro_cpyfm() kopieren möchten. - 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[5] 1 Unterfunktionsnummer von vq_scrninfo() contrl[6] handle intin[0] 2 erweiterte Informationen ausgeben Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 272 Einträge 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]: Verfügbarkeit 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 für die Rot-Intensität work_out[9]: Anzahl der Bits für die Grün-Intensität work_out[10]: Anzahl der Bits für die Blau-Intensität work_out[11]: Anzahl der Bits für den Alpha-Channel oder ähnliches work_out[12]: Anzahl der Bits für 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 Grün-Bits, 5 Blau-Bits | 1 | Falcon-Format, d.h. 5 Rot-Bits, 5 Grün-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 Grün-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 Grün-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 Grün-Bits, 8 Blau-Bits | 7 | Bytes vertauscht: Intel-Modell Falls eine Hardware-CLUT (intout[1] == 1) vorhanden ist: work_out[16-271]: Pixelwert des zugehörigen VDI-Farbindexes Falls HiColor, TrueColor oder ähnliches vorhanden ist: work_out[16..31]: Zuordnung von Bitnummer im Pixel zum Bit der Rotintensität work_out[32..47]: Zuordnung von Bitnummer im Pixel zum Bit der Grünintens. work_out[48..63]: Zuordnung von Bitnummer im Pixel zum Bit der Blauintensität work_out[64..79]: Zuordnung der Bitnummer für Alpha-Channel work_out[80..95]: Zuordnung der Bitnummer für Genlock work_out[96..127]: unbenutzte Bits work_out[128..271]: reserviert (0) Beispiele: ---------- In 256 Farben auf dem Falcon würden 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 möglich 5 | xxxx | Bitmapbreite in Bytes (erst ab EdDI 1.1) 6/7 | xxxxL | Bitmapadresse (erst ab EdDI 1.1) 8 | 6 | 6 Bits für die Rot-Intensität 9 | 6 | 6 Bits für die Grün-Intensität 10 | 6 | 6 Bits für die Blau-Intensität 11 | 0 | kein Bit für Alpha-Channel 12 | 0 | kein Bit für Genlock 13 | 0 | kein unbenutzes Bit 14 | 1 | normale Bitreihenfolge (erst ab EdDI 1.1) | | 16 | 0 | Pixelwert für VDI-Farbindex 0 17 | 255 | Pixelwert für VDI-Farbindex 1 18 | 2 | Pixelwert für VDI-Farbindex 2 ... | ... | 271 | 15 | Pixelwert für VDI-Farbindex 255 In HiColor auf dem Falcon würden 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 möglich 5 | xxxx | Bitmapbreite in Bytes (erst ab EdDI 1.1) 6/7 | xxxxL | Bitmapadresse (erst ab EdDI 1.1) 8 | 5 | 5 Bits für die Rot-Intensität 9 | 5 | 5 Bits für die Grün-Intensität 10 | 5 | 5 Bits für die Blau-Intensität 11 | 0 | kein Bit für Alpha-Channel 12 | 1 | ein Bit für 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-Intensität (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-Intensität (höchstwertigstes Bit) | | befindet sich in Bit 15 des Pixels 21..31 | -1 | Bits werden nicht für Rot-Intensität benutzt | | | | 32 | 6 | Bit 0 der Grün-Intensität (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 Grün-Intensität (höchstwertigstes Bit) | | befindet sich in Bit 10 des Pixels 37..37 | -1 | Bits werden nicht für Grün-Intensität benutzt | | | | 48 | 0 | Bit 0 der Blau-Intensität (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-Intensität (höchstwertigstes Bit) | | befindet sich in Bit 4 des Pixels 53..63 | -1 | Bits werden nicht für Blau-Intensität benutzt | | | | 64..79 | -1 | kein Alpha-Channel | | | | 80 | 5 | Bit für Genlock 81..95 | -1 | nicht für Genlock benutzt | | | | 96..127| -1 | keine unbenutzten Bits | | In HiColor auf einer VGA-Grafikkarte würden 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 möglich 5 | xxxx | Bitmapbreite in Bytes (erst ab EdDI 1.1) 6/7 | xxxxL | Bitmapadresse (erst ab EdDI 1.1) 8 | 5 | 5 Bits für die Rot-Intensität 9 | 5 | 5 Bits für die Grün-Intensität 10 | 5 | 5 Bits für die Blau-Intensität 11 | 0 | kein Bit für Alpha-Channel 12 | 0 | kein Bit für Genlock 13 | 1 | ein unbenutzes Bit 14 | 129 | 15 Bit in Intel-Darstellung (erst ab EdDI 1.1) | | 16 | 2 | Bit 0 der Rot-Intensität (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-Intensität (höchstwertigstes Bit) | | befindet sich in Bit 15 des Pixels 21..31 | -1 | Bits werden nicht für Rot-Intensität benutzt | | | | 32 | 13 | Bit 0 der Grün-Intensität (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 Grün-Intensität (höchstwertigstes Bit) | | befindet sich in Bit 10 des Pixels 37..37 | -1 | Bits werden nicht für Grün-Intensität benutzt | | | | 48 | 8 | Bit 0 der Blau-Intensität (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-Intensität (höchstwertigstes Bit) | | befindet sich in Bit 4 des Pixels 53..63 | -1 | Bits werden nicht für Blau-Intensität benutzt | | | | 64..79 | -1 | kein Alpha-Channel | | | | 80..95 | -1 | nicht für 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 zurück, ob ein Treiber ein Treiber vorhanden ist und ob er schon geöffnet wurde. Au×erdem wird der Dateiname (z.B. XVGA256.SYS) und der Klartextname (VGA 256 Farben) des Treibers zurückgeliefert. 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] device VDI-Gerätenummer (0-99) Ausgaben: contrl[2] p Anzahl der WÖRTER in ptsout contrl[4] i Anzahl der Wörter in intout ptsout[0] dev_open 0: Treiber ist noch nicht geöffenet 1: Treiber ist bereits geöffnet 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 zurückgeliefert, d.h. 1 Wort pro Buchstabe, wobei contrl[4] die Länge angibt. Der Klartextname wird als nullterminierter C-String zurückgeliefert - contrl[2] enthält die Anzahl der _WÖRTER_ in ptsout. ¨ INQUIRE EXTENDED DEVICE STATUS INFORMATION (VDI 248, 4242) Ähnlich wie vq_devinfo() liefert vq_ext_devinfo() Treibernamen und Informationen über den Treiber zurück. 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 Einträge in ptsin contrl[3] 7 Einträge in intin contrl[5] 4242 Unterfunktionsnummer contrl[6] handle intin[0] device VDI-Gerätenummer (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 Einträge in ptsout contrl[4] 2 Einträge in intout intout[0] dev_exists 0: kein Treiber unter dieser Gerätekennung != 0: Treiber vorhanden intout[1]: dev_open 0: Treiber wurde noch nicht geöffnet != 0: Treiber wurde bereits geöffnet Alle zurückgelieferten Zeichenketten sind C-Strings. Besonderheiten einzelner Treiber                                  ¨ Druckertreiber - Gerätekennungen 21 bis 30 Bei NVDI-Druckertreibern kann bei v_opnwk() das Seitenformat und das GEMDOS-Ausgabegerät gesetzt werden. Zusätzlich zu den normalen Eingaben bei v_opnwk() müssen 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 Höhe der vom Druckertreiber zu erzeugenden Bitmap setzen, indem man in ptsin[0/1] Breite - 1, Höhe - 1 und in contrl[1] eine 1 einträgt und anschlie×end v_opnwk() oder vq_extnd() aufruft. Dieses Verfahren ist NICHT ZU EMPFEHLEN, da eine Applikation nie genau abschätzen kann, wie gro× die Bitmap tatsächlich sein darf, damit der Drucker sie vernünftig ausgeben kann. ¨ META.SYS - Gerätekennung 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. Möchte man den Namen ändern, sollte man direkt nach v_opnwk() die Funktion vm_filename() aufrufen, der man einen kompletten Dateinamen mit dem gewünschten Pfad und Namen übergeben sollte. Damit andere Programme den Metafile vernünftig darstellen können, sollten die Funktionen v_meta_extents(), vm_pagesize() und vm_coords() aufgerufen werden. ¨ MEMORY.SYS - Gerätekennung 61 Der Treiber MEMORY.SYS stellt eine monochrome Bitmap zur Verfügung, auf die mit allen VDI-Befehlen zugegriffen werden kann. Die Auflösung dieser Bitmap wird bei v_opnwk() gesetzt. Hierzu wird in ptsin[0/1] Breite - 1 und Höhe - 1 übergeben, contrl[1] mu× eine 1 enthalten. Nach v_opnwk() wird die Adresse der Bitmap in contrl[0/1] zurückgeliefert. Bei vq_extnd() kann man ebenfalls die Auflösung setzen. Au×erdem besteht hier die Möglichkeit, einen eigenen Buffer zu Übergeben. In diesem Fall enthält contrl[3] eine 3 und intin[1/2] ist ein Zeiger auf den Buffer. Aufgrund der grö×erern Flexiblität empfehlen wir OffScreenbitmaps anstelle des MEMORY.SYS-Treibers zu verwenden. ¨ IMG.SYS - Gerätekennung 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 Möglichkeit 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 Gerätekennung 81 bis 90 Faxtreiber verhalten sich ähnlich wie Druckertreiber. Man kann bei Ihnen aber weder Seitenformat noch das GEMDOS-Gerät angeben. Man sollte auch nicht versuchen, die Grö×e der Bitmap zu verändern. Farbeinstellungen ================= ¨ SET COLOR REPRESENTATION (VDI 14) Mit dieser Funktion kann man die Farbabstufung einer Farbnummer festlegen. Die Intensität von Rot, Grün und Blau wird jeweils in Promille (0-1000) angegeben. Bei Geräten 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 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 für 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 Verfügung, für 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 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 Einträge in ptsin contrl[3] 4 Einträge in intin contrl[6] handle intin[0] index Farbnummer intin[1..3] rgb_in Farbintensitäten von Rot, Grün, Blau Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ INQUIRE COLOR REPRESENTATION (VDI 26) "INQUIRE COLOR REPRESENTATION" gibt Auskunft über die eingestellten Farbintensitäten, wobei die Möglichkeit besteht, zwischen der übergebenen und der tatsächlich eingestellten Intensität 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0] color_index Farbnummer intin[1] flag Flag für Art der Intensität Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 4 Einträge in intout intout[0] valid Farbindex au×erhalb der Grenzen intout[1..3] rgb_out Intensität von Rot, Grün und Blau Bedeutung von flag: 0: es wird die vom Anwender bei vs_color übergebene Farbintensität zurückgegeben. 1: es wird die tatsächlich eingestellte Farbintensität zurückgegeben Bemerkung: Die an vs_color übergebene und die eingestellte Farbintensität können bei Systemen mit einer CLUT voneinander abweichen, wenn die Anzahl der möglichen Farbabstufungen zu klein ist. Bei Direct-RGB (keine CLUT) wird meistens die tatsächlich eingestellte Intensität auch als die vom Anwender übergebene Intensität zurückgeliefert, 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-Einträgen, die für 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 Einträge in ptsin contrl[3] 3 Einträge 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 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] cal_flag Kalibration aus (0) oder ein (1) Bemerkung: Die Farbkalibration ist im gesamten System für den mit bezeichneten Treiber gültig. 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 zurück, ob Funktionen zur Kalibrierung vorhanden sind und ob die Kalibrierung eingeschaltet ist. Wenn contrl[4] einen 0 enthält, wird Kalibrierung nicht unterstützt. 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 77 Unterfunktionsnummer vq_calibrate() contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] exists Einträge in intout (0 oder 1) intout[0] flag Kalibration aus (0) oder ein (1) Verknüpfung und Zeichenbereich ============================== ¨ SET WRITING MODE (VDI 32) Diese Funktion wählt die Verknüpfung der Grafikoperationen aus. Bei Übergabe eines nicht vorhandenen Modus wird Modus 1 (REPLACE) angewählt. 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] mode gewünschter Verknüpfungsmodus Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_mode ausgewählter Verknüpfungsmodus 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 verknüpft. 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 Einträge in ptsin contrl[3] 1 Einträge 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 Einträge in ptsout contrl[4] 0 Einträge in intout Bemerkung: Das Clipping sollte aus Sicherheitsgründen immer eingeschaltet werden, da die Ausgaberoutinen beim Überschreiten der Bildschirmgrenzen sehr schnell gro×e Speicherbereiche überschreiben, was zu unerfreulichen Abtürzen und Datenmüll führen kann. Wenn der Arbeitsbereich den ganzen Bildschirm einbeziehen soll, ist es ratsam, bei vs_clip() die bei v_opnvwk() erhaltenen Bildschirmausma×e einzustellen. Linien und nicht gefüllte Grafikprimitive ========================================= ¨ POLYLINE (VDI 6) "POLYLINE" zeichnet einen Linienzug. Alle angegebenen Punkte werden nacheinander mit Linien verbunden. Es müssen 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle ptsin[0..2n-1] xyarr[0..2n-1] Koordinaten Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ OUTPUT BEZIER (VDI 6, 13) Diese Funktion zeichnet eine ungefüllte 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 Einträge in ptsin contrl[3] (n+1)/2 Einträge 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 Einträge in ptsout contrl[4] 6 Einträge 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 umschlie×enden 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 nächsten Beziers sein - er kann aber kein "jump point" sein. Bit 1: "jump point". Dieser Punkt und der vorhergehende werden nicht verbunden. Nützlich um Enklaven oder Exklaven zu zeichnen. Bit 2-7 sind undefiniert. Ist im Punkttyp Bit 0 gelöscht, verhält sich die Bezierfunktion wie "POLYLINE" mit der Erweiterung, über den "jump point" Enklaven oder Exklaven zeichnen zu können. Bemerkung: Die im Byte-Array bezarr übergebenen Punkttypen müssen vom C-Binding vertauscht werden, da diese Funktion leider diesbezüglich 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 Einträge in ptsin contrl[3] 2 Einträge 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 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 2 Einträge 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 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 8 v_rbox contrl[6] handle ptsin[0..3] rect[0..3] Koordinaten Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ ENABLE BEZIER CAPABILITIES (VDI 11, GDP 13) Diese Funktion ist aus Kompatibilitätsgründen vorhanden. Sie sorgt dafür, 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() aufgefa×t 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 Einträge in ptsin - signalisiert v_bez_on contrl[3] 0 Einträge in intin contrl[5] 13 v_bez_on contrl[6] handle Ausgaben: intout[0] retval Beziertiefe Bedeutung von retval: kann einen Wert von 0 (keine Beziers) bis 7 (maximale Qualität) annehmen, der ein ungefähres Ma× für die Kurvenqualität darstellt - normalerweise kann man von diesem Wert nur ableiten, ob Beziers vorhanden sind. ¨ DISABLE BEZIER CAPABILITIES (VDI 11, GDP 13) Diese Funktion ist aus Kompatibilitätsgründen vorhanden. Sie schaltet die Sonderbehandlung für 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 Einträge in ptsin - signalisiert v_bez_off contrl[3] 0 Einträge in intin contrl[5] 13 v_bez_off contrl[6] handle Ausgaben: - ¨ SET BEZIER QUALITY (VDI 5, ESCAPE 99) Mit dieser Funktion wird die Qualität der Bezierfunktionen eingestellt. Die Qualität 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 Einträge in ptsin contrl[3] 3 Einträge in intin contrl[5] 99 contrl[6] handle intin[0] 32 intin[0..1] signaliseren v_bez_qual() intin[1] 1 intin[2] qual gewünschte Bezierqualität in Prozent Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_qual eingestellte Bezierqualität in Prozent ¨ SET POLYLINE LINE TYPE (VDI 15) Mit "SET POLYLINE LINE TYPE" kann man den Linientyp festlegen. Wenn der gewünschte 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] type gewünschter Linientyp Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_type ausgewählter 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 nächstkleineren 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle ptsin[0] width gewünschte Linienbreite Ausgaben: contrl[2] 1 Einträge in ptsout contrl[4] 0 Einträge in intout ptsout[0] set_width ausgewählte Linienbreite Bemerkung: Die Linienbreite orientiert sich immer an der horizontalen Pixelgrö×e. ¨ SET POLYLINE COLOR INDEX (VDI 17) Der Farbindex für Linien wird gesetzt. Bei ungültigem 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] color_index gewünschte Linienfarbe Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_color ausgewählte Linienfarbe ¨ INQUIRE CURRENT POLYLINE ATTRIBUTES (VDI 35) Diese Funktion gibt die aktuellen Linienattribute zurück. 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 1 Einträge in ptsout contrl[4] 5 Einträge 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 ungültigen 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0] beg_style Aussehen des Linienanfangs intin[1] end_style Aussehen des Linienendes Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] pattern benutzerdefiniertes Linienmuster Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout Gefüllte Grafikprimitive ======================== ¨ FILLED AREA (VDI 9) Durch "FILLED AREA" wird eine beliebige, gefüllte Fläche 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle ptsin[0..2n-1] xyarr[0..2n-1] Koordinaten Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ OUTPUT FILLED BEZIER (VDI 9, 13) Diese Funktion zeichnet eine gefüllte 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 Einträge in ptsin contrl[3] (n+1)/2 Einträge 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 Einträge in ptsout contrl[4] 6 Einträge 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 umschlie×enden 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 nächsten Beziers sein - er kann aber kein "jump point" sein. Bit 1: "jump point". Dieser Punkt und der vorhergehende werden nicht verbunden. Nützlich um Enklaven oder Exklaven zu zeichnen. Bit 2-7 sind undefiniert. Ist im Punkttyp Bit 0 gelöscht, verhält sich die Bezierfunktion wie "FILLED AREA" mit der Erweiterung, über den "jump point" Enklaven oder Exklaven zeichnen zu können. Bemerkung: Die im Byte-Array bezarr übergebenen Punkttypen müssen vom C-Binding vertauscht werden, da diese Funktion leider diesbezüglich 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 ausgefülltes 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 1 v_bar contrl[6] handle ptsin[0..3] rect[0..3] Koordinaten des Rechtecks Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ PIE (VDI 11, GDP 3) Diese Funktion zeichnet einen Kreisflächenausschnitt. 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 Einträge in ptsin contrl[3] 2 Einträge 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 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ CIRCLE (VDI 11, GDP 4) Die Funktion "CIRCLE" zeichnet eine Kreisfläche. 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 Einträge in ptsin contrl[3] 2 Einträge 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 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ ELLIPSE (VDI 11, GDP 5) Diese Funktion zeichnet eine Ellipsenfläche. 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 Einträge in ptsin contrl[3] 0 Einträge 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 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ ELLIPTICAL PIE (VDI 11, GDP 7) Die Funktion "ELLIPTICAL PIE" zeichnet einen Ellipsenflächenausschnitt. 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 Einträge in ptsin contrl[3] 2 Einträge 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 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ FILLED ROUNDED RECTANGLE (VDI 11, GDP 9) Diese Funktion zeichnet ein ausgefülltes, 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 9 v_rfbox contrl[6] handle ptsin[0..3] rect[0..3] Koordinaten Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ SET FILL INTERIOR INDEX (VDI 23) Der Fülltyp kann mit dieser Funktion ausgewählt werden. Bei Übergabe eines ungültigem Fülltyps 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] interior gewünschter Fülltyp Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_interior ausgewählter Fülltyp 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 Fülltyp gehörende Füllindex 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] style_index gewünschter Füllindex Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_sytle ausgewählter Füllindex ¨ SET FILL COLOR INDEX (VDI 25) Der Farbindex für Füllmuster wird mit dieser Funktion ausgewählt. Bei einem ungültigen 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] color_index gewünschter Farbindex Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_color ausgewählter Farbindex ¨ INQUIRE CURRENT FILL AREA ATTRIBUTES (VDI 37) Diese Funktion gibt Auskunft über die aktuellen Füllattribute. 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 5 Einträge in intout intout[0] attrib[0] Fülltyp intout[1] attrib[1] Füllfarbe intout[2] attrib[2] Füllmusterindex intout[3] attrib[3] Schreibmodus intout[4] attrib[4] Umrahmungs-Flag ¨ CONTOUR FILL (VDI 103) Diese Funktion füllt vom Startpunkt aus eine Fläche, wobei diese Fläche durch den Bildrand oder eine andere Farbe begrenzt wird. Gerätetreiber, die mit einer Display-List arbeiten (Druckertreiber, IMG-Treiber,...) unterstützen v_contourfill() nicht oder können sie nur dann ausführen, wenn genügend 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] color_index Farbindex ptsin[0] x ptsin[1] y Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ SET FILL PERIMETER VISIBILITY (VDI 104) Die Umrahmung einer gefüllten Fläche (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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] flag gewünschtes Umrahmungs-Flag Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_perimeter ausgewähltes 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 Füllmuster von 16*16 Pixel (16 Worte pro Musterebene) festgelegt werden. Mehrfarbige Muster werden im Standardformat übergeben und müssen 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 Einträge in ptsin contrl[3] 16n Einträge in intin (Musterebenen*16) contrl[6] handle intin[0..16n-1] pattern[0..16n-1] Musterebenen Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout Bemerkung: Bei Mehrfarbmustern sollte man die Füllfarbe auf 1 setzen und als Schreibmodus REPLACE anwählen. ¨ FILLED RECTANGLE (VDI 114) "FILLED RECTANGLE" zeichnet ein ausgefülltes 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle ptsin[0..3] rect[0..3] Koordinaten Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle ptsin[0..2n-1] xyarr[0..2n-1] Koordinaten Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ SET POLYMARKER TYPE (VDI 18) Mit dieser Funktion wird der gewünschte Marker ausgewählt. 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] type gewünschter Markertyp Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_type ausgewählter Markertyp Bedeutung von type: 1: Punkt 2: Plus 3: Sternchen 4: Quadrat 5: Kreuz 6: Raute ¨ SET POLYMARKER HEIGHT (VDI 19) Die Markergrö×e kann mittels "SET POLYMARKER HEIGHT" eingestellt werden. Falls die eingestellte Höhe nicht existiert, wird die nächstkleinere Höhe eingestellt. Der Markertyp 1 (Punkt) hat immer die Höhe 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle ptsin[1] height gewünschte Markerhöhe Ausgaben: contrl[2] 1 Einträge in ptsout contrl[4] 0 Einträge in intout ptsout[0] set_width ausgewählte Markerbreite ptsout[1] set_height ausgewählte Markerhöhe ¨ SET POLYMARKER COLOR INDEX (VDI 20) Diese Funktion setzt den Farbindex der Marker. Bei ungültigem 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] color_index gewünschte Markerfarbe Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_color ausgewählte 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 1 Einträge in ptsout contrl[4] 3 Einträge 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] Markerhöhe Textausgaben mit Bitmap- und Vektorfonts ======================================== Zunächst ein paar generelle Erklärungen und Anmerkungen zum Thema Text... Font-ID und Index: Der Index eines Fonts ist eine Zahl zwischen 1 und der verfügbaren 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 grundsätzlich für einen Font unabhängig vom System immer gleich ist - für "Swiss 721" z.B. 5003. Ausnahmen von dieser Regel sind aber bei Fonts möglich, die keine verwendbare Font-ID haben. In diesem Fall wird versucht, eine eindeutige ID zu erzeugen. Da es aber möglich ist, da× eine derart erzeugte ID für einen Font nicht auf allen Systemen identisch ist, sollten Programme für eine eindeutige Zuordnung des Fonts au×er 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 Einträge in intout zurück und intout[33] enthält einen Wert ungleich 0. Ist intout[33] 0 oder werden nur 33 Einträge zurückgeliefert, handelt es sich um einen Bitmap-Font. Äquidistante Fonts (monospaced): Für manche Applikationen ist es zweckmä×ig, bei der Ausgabe nur äquidistante Fonts zu benutzen. Das sinnvollste Vorgehen dafür sieht wie folgt aus: a) Wenn vqt_name() in erweiterter Form (35 Einträge 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 Einträge in intout, intout[33] != 0), sollte für Vektorfonts vqt_fontheader() aufgerufen und Bit 1 von FH_CLFGS geprüft werden. c) Wenn es sich nicht um einen Vektorfont handelt und a) und b) nicht zutreffen, müssen 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 Rückgaben von vqt_width() zutreffend. Höhe und Breite von Vektorfonts: Die Höhe 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 Höhe 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 Auflösung gerechnet, um unabhängig vom verwendeten Ausgabegerät und dessen tatsächlicher Auflösung eine gleichbleibende Zeichenpositionierung zu gewährleisten. Um die Bitmaps für die einzelnen Zeichen auszugeben, werden diese Festkommawerte in Pixel umgerechnet, indem 32768 hinzuaddiert und anschlie×end 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() zurückgelieferte 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. Grö×e von Vektorfonts/Pixelgrö×en: Die meisten Bildschirmtreiber liefern eine Auflösung von ¸ 91 dpi zurück, nach der sich auch die Grö×e 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 können bei abweichenden Pixelgrö×en Darstellungsfehler auftreten. Beim Ausdruck sollten die genaueren Pixelgrö×en bei vq_extnd() beachtet werden, damit die Textpositionierung möglichst 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 au×erdem pixelweise, d.h. vqt_width() liefert hierfür die passenden Schrittgrö×en. 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 Einträge in ptsin contrl[3] n Einträge in intin contrl[6] handle intin[0..n-1] string[0..n-1] Zeichenkette ptsin[0] x ptsin[1] y Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ JUSTIFIED GRAPHICS TEXT (VDI 11, GDP 10) "JUSTIFIED GRAPHICS TEXT" ermöglicht die Ausgabe einer Zeichenkette mit Attributen und Dehnung oder Stauchung auf die gewünschte Länge, wobei entweder Wort- oder Zeichenzwischenräume gedehnt werden können. Bei Vektorfonts bezieht sich die Längenangabe auf die Summation der Zeichenbreiten - Überhänge nach links und rechts werden nicht berücksichtigt. 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 Einträge in ptsin contrl[3] n+2 Einträge in intin contrl[5] 10 v_justified contrl[6] handle intin[0] word_space <> 0: Wortzwischenräume dehnen intin[1] char_space <> 0: Zeichenzwischenräume dehnen intin[2..n+1] string[0..n-1] Zeichenkette ptsin[0] x ptsin[1] y ptsin[2] length horizontale Textlänge in Pixeln Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ SET CHARACTER HEIGHT, ABSOLUTE MODE (VDI 12) Die Zeichenhöhe von der Basislinie bis zur Zeichenzellenobergrenze wird mit dieser Funktion gesetzt. Bei Bitmapfonts wird, wenn die gewünschte Höhe nicht als Bitmap vorliegt, vergrö×ert 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle ptsin[1] height gewünschte Zeichenhöhe Ausgaben: contrl[2] 2 Einträge in ptsout contrl[4] 0 Einträge in intout ptsout[0] char_width ausgewählte Zeichenbreite ptsout[1] char_height ausgewählte Zeichenhöhe ptsout[2] cell_width ausgewählte Zeichenzellenbreite ptsout[3] cell_height ausgewählte Zeichenzellenhöhe ¨ SET CHARACTER BASELINE VECTOR (VDI 13) Mit dieser Funktion kann man die Textdrehung in 1/10 Grad einstellen. Für Bitmapfonts ist die Rotation nur in 90-Grad-Schritten möglich; 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] angle gewünschter Rotationswinkel Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_angle ausgewählter Rotationswinkel ¨ SET TEXT FACE (VDI 21) Diese Funktion wählt den Zeichensatz 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] font gewünschter Zeichensatz Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_font ausgewählter Zeichensatz ¨ SET GRAPHIC TEXT COLOR INDEX (VDI 22) Diese Funktion setzt die Farbe des Textes. Bei ungültigem 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] color_index gewünschte Textfarbe Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_color ausgewählte 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 2 Einträge in ptsout contrl[4] 6 Einträge 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] Zeichenhöhe ptsout[2] attrib[8] Zeichenzellenbreite ptsout[3] attrib[9] Zeichenzellenhöhe Bemerkung: Das ATARI-VDI gibt fehlerhafterweise in intout[5] den Schreibmodus-1 zurück. Mit NVDI geschieht das nur bei eingeschalteter Fehlerkompatibilität. ¨ SET GRAPHIC TEXT ALIGNMENT (VDI 39) Die horizontale und vertikale Ausrichtung eines Textes kann mit dieser Funktion beeinflu×t werden. Bei falscher Eingabe für 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0] hor_in gewünschte horizontale Ausrichtung intin[1] vert_in gewünschte vertikale Ausrichtung Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 2 Einträge in intout intout[0] hor_out ausgewählte horizontale Ausrichtung intout[1] vert_out ausgewählte 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] effect gewünschter Texteffekt Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_effect ausgewählter 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 Zeichenzellengrö×e in Punkten (1 pt = 1/72") festgelegt werden. Bei Bitmapfonts sucht diese Funktion den Font heraus, der in einfacher oder doppelter Vergrö×erung kleiner oder gleich der gewünschten Höhe ist. Bei Vektorfonts kann man mit vst_point() nur die vordefinierten Höhen anwählen (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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] point gewünschte Zeichenzellenhöhe (1/72") Ausgaben: contrl[2] 2 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_point ausgewählte Zeichenzellenhöhe (1/72") ptsout[0] char_width ausgewählte Zeichenbreite ptsout[1] char_height ausgewählte Zeichenhöhe ptsout[2] cell_width ausgewählte Zeichenzellenbreite ptsout[3] cell_height ausgewählte Zeichenzellenhöhe ¨ INQUIRE TEXT EXTENT (VDI 116) Bei Bitmapfonts ermittelt "INQUIRE TEXT EXTENT" die minimalen Ausma×e eines Rechtecks, das die übergebene Zeichenkette umrahmt. Bei Vektorfonts addiert diese Funktion nur die Schrittweiten ohne Pair- oder Track-Kerning und Zeichenüberhänge 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 Einträge in ptsin contrl[3] n Einträge in intin contrl[6] handle intin[0..n-1] string[0..n-1] Zeichenkette Ausgaben: contrl[2] 4 Einträge in ptsout contrl[4] 0 Einträge in intout ptsout[0..7] extent[0..7] Koordinaten des Textrechtecks ¨ INQUIRE CHARACTER CELL WIDTH (VDI 117) Bei Bitmapfonts lieferte diese Funktion die horizontalen Textausma×e zurück. Wendet man sie auf einen Vektorfont an, wird für das Zeichen die gerundete Schrittweite zurückgegeben. 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] character Zeichennummer Ausgaben: contrl[2] 3 Einträge in ptsout contrl[4] 1 Einträge 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 möchte, ob ein Font äquidistant (monospaced) oder proportional ist, sollte nicht alle Zeichenpaare über vqt_width() vergleichen, sondern zuerst prüfen ob, vqt_name() hierüber Informationen zurückgibt. ¨ LOAD FONTS (VDI 119) Diese Funktion lädt die in ASSIGN.SYS für das mit bezeichnete Gerät eingetragenen Bitmapfonts und sorgt dafür, da× auch auf die Vektorfonts zugegriffen werden kann. Zurückgegeben wird die Anzahl der zusätzlich verfügbaren Zeichensätze. Bevor man vst_load_fonts() aufruft, sollte man mit vq_gdos() überprüfen, ob das VDI Zeichensätze 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] select 0 (reserviert) Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] additional Anzahl der geladenen Zeichensätze ¨ 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle intin[0] select 0 (reserviert) Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 2 Einträge in intin, kein Tippfehler! contrl[5] 1 mehr Informationen liefern! contrl[6] handle intin[0] index Nummer (1 bis Maximalanzahl) Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 35 Einträge 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 zurückgeliefert: 0: Proportionalfont 1: äquidistanter Font Im Low-Byte von intout[34] wird zurückgeliefert: 1: Bitmap-Font 2: Speedo-Font 4: TrueType-Font 8: Type 1-Font Bemerkungen: Um festzustellen, was für einen Font man vor sich hat, mu× man die Anzahl der Einträge in intout (contrl[4]) beachten. Ist contrl[4] 33, so sind keine zusätzlichen Informationen vorhanden und demzufolge mu× es sich um einen Bitmapfont handeln. Ist contrl[4] == 34, wird nur zusätzlich 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 zurückgeliefert, 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 Vergrö×erung/Verkleinerung berücksichtigt 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 5 Einträge in ptsout contrl[4] 2 Einträge in intout intout[0] minADE niedrigste Zeichennummer intout[1] maxADE höchste 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 Unterlänge 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 angeforderten Informationen über einen Font. Wenn ein von 0 verschiedener Index übergeben wird, sucht vqt_xfntinfo() den entsprechenden Font und liefert die durch bezeichneten Einträge. Wenn 0 ist, wird der Font mit der ID gesucht. Sollte ebenfalls 0 sein, werden Informationen über den bereits eingestellten Font zurückgegeben. Damit die Informationen in die XFNT_INFO-Struktur eingetragen werden, mu× die Grö×e der Struktur mu× in das Strukturelement 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 Einträge in ptsin contrl[3] 5 Einträge in intin contrl[5] 0 contrl[6] handle intin[0] flag Bitvektor für auszugebende Informationen intin[1] id ID des Fonts oder 0 für 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 Einträge in ptsout contrl[4] 3 Einträge 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: vollständigen Fontnamen zurückgeben (font_name) 1: Name der Fontfamilie zurückgeben (family_name) 2: Stil des Fonts zurückgeben (style_name) 3: Dateinamen des Fonts zurückgeben (file_name1) 4: 2. optionalen Dateinamen zurückgeben (file_name2) 5: 3. optionalen Dateinamen zurückgeben (file_name3) 8: Höhen in pt ohne Vergrö×erung zurückliefern (pt_cnt, pt_sizes) 9: Höhen in pt für doppelte Vergrö×erung zurückliefern (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 Höhen geliefert, die ohne Vergrö×erung vorhanden sind. Wenn Bit 9 gesetzt ist, werden die Höhen geliefert, bei denen vergrö×ert wird. Beschreibung der XFNT_INFO-Struktur: typedef struct { LONG size; /* Länge der Struktur, mu× vor vqt_xfntinfo() gesetzt werden */ WORD format; /* Fontformat, z.B. 4 für TrueType */ WORD id; /* Font-ID, z.B. 6059 */ WORD index; /* Index */ BYTE font_name[50]; /* vollständiger 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 Punkthöhen für vst_point(), z.B. 10 */ WORD pt_sizes[64]; /* verfügbare Punkthöhen, 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 angefordert wurden, haben keinen definierten Inhalt. ¨ SET TEXT FACE BY NAME (VDI 230, 0) Diese Funktion sucht einen Font mit Namen in einem der durch den Bitvektor angegebenen Fontformate und stellt ihn ein. Fehlende oder überschüssige 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 Einträge in ptsin contrl[3] n Einträge in intin contrl[5] 0 Unterfunktionsnummer: Font einstellen contrl[6] handle intin[0] font_format zu berücksichtigende Fontformate intin[1..n] font_name[0..n-1] einzustellender Fontname Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] m Einträge 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 in einem der durch den Bitvektor angegebenen Fontformate, wobei fehlende oder überschüssige Leerzeichen ignoriert werden. Wenn der Font gefunden wird, werden Font-ID und Name in intout zurückgeliefert. Falls kein Font auffindbar ist, wird eine 0 in intout[0] zurückgeliefert, 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 Einträge in ptsin contrl[3] n Einträge in intin contrl[5] 100 Unterfunktionsnummer: Font suchen contrl[6] handle intin[0] font_format zu berücksichtigende Fontformate intin[1..n] font_name[0..n-1] einzustellender Fontname Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] m Einträge 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 nächste Aufruf von vst_height(), vst_point() oder vst_arbpt() erfolgt, wird die Breite wieder zurückgesetzt. 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle ptsin[0] width gewünschte Zeichenbreite Ausgaben: contrl[2] 2 Einträge in ptsout contrl[4] 0 Einträge in intout ptsout[0] char_width ausgewählte Zeichenbreite ptsout[1] char_height ausgewählte Zeichenhöhe ptsout[2] cell_width ausgewählte Zeichenzellenbreite ptsout[3] cell_height ausgewählte Zeichenzellenhöhe Bemerkungen: Zum Einstellen des Breiten-Höhen-Verhältnisses 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 dazugehörige TDF-Datei. Der übergebene Buffer sollte sicherheitshalber 1 Kb gro× sein, da die Länge des Speedo-Fontheader vom jeweiligen Font und möglichen Formaterweiterungen abhängt. Für andere Fontformate (TrueType, ...) wird versucht, den Header nachzubilden. Man sollte daran denken, da× für jeden Aufruf von vqt_fontheader() eventuell mehrfach auf die Festplatte zugegriffen werden mu× - bei 300 oder mehr Fonts kann das immerhin einige wenige Sekündchen dauern. Man sollte daher den häufigen 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0..1] buffer Buffer für den Fontheader Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] n Länge des TDF-Pfads intout[0..n-1] tdf_name[0..n-1] absoluter Pfad und Name des TDFs Bemerkung: Für Programmierer dürften die folgenden Einträge des Fontheaders am interessantesten sein: Name Offset Länge 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 Schrägstellung 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 zurück. 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 4 Einträge 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 zurück. 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0] index1 erstes Zeichen intin[1] index2 darauf folgendes Zeichen Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 4 Einträge 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 erhält z.B. für 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 au×erdem die Anzahl der vorhandenen Zeichen pro Font (minADE und maxADE bei vqt_fontinfo) von 256 auf die Zahl der tatsächlich 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] mode Zeichen-Mapping Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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× demnächst noch weitere Mappings (z.B. Unicode) vorhanden sind. ¨ SET KERNING MODE (VDI 237) Mit dieser Funktion kann man das gewünschte Track-Kerning und Pair-Kerning ein- oder ausschalten. Informationen für 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 für 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 Einträge in ptsin contrl[3] 2 Einträge 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 Einträge in ptsout contrl[4] 2 Einträge 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 dafür auf 255 gesetzt, der gewünschte zusätzliche 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 Einträge in ptsin contrl[3] 4 Einträge 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 Einträge in ptsout contrl[4] 2 Einträge 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 gehörende Bitmap und deren Ma×e zurück. Die zurückgelieferten Offsets sind auch im Zusammenhang mit v_getoutline() gültig. 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] index Zeichen-Index Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 12 Einträge in intout intout[0] width Breite der Bitmap intout[1] height Höhe 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 nächsten 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 nötig, da die Bitmap meistens kleiner als die Zeichenzelle ist (z.B. bei Zeichen ohne Unterlängen). Bemerkungen: Um auch ohne NVDI 3 nachvollziehbare Ausgaben zu bekommen, sollten die Texteffekte (vst_effects()) ausgeschaltet sein (einige Versionen eines Zusatzprogrammes für 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 könnte der Zeiger schon wieder ungültig sein. Au×erdem sollte man v_getbitmap_info() nicht für enorm gro×e Zeichen (z.B. 300 pt und mehr) aufrufen, da diese je nach Cache-Grö×e evtl. nicht mehr komplett aufgebaut werden können. Die Bitmap enthält in diesem Fall nur einen Teil des Zeichens. Man sollte diese Funktion nicht mi×brauchen, um eine eigene Textausgabe zu bauen - es lohnt sich nicht und Pair-Kerning wäre auch nicht möglich. ¨ 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 Überhänge 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 Einträge in ptsin contrl[3] n Einträge in intin contrl[6] handle intin[0..n-1] string[0..n-1] Zeichenkette Ausgaben: contrl[2] 4 Einträge in ptsout contrl[4] 0 Einträge in intout ptsout[0..7] extent[0..7] Koordinaten des Textrechtecks Fallen: Aus Kompatibilitätsgründen verhält sich diese Funktion bei 90, 180 und 270 Grad genauso unsinnig wie das alte vqt_extent() - der Bezugspunkt wird geändert! Bemerkungen: Diese Funktion liefert nicht das den Text umgebende Rechteck. Sie addiert nur die Schrittweiten und beachtet auch nicht linke oder rechte Zeichenüberhänge. Sie ist im Prinzip nur zur Cursor-Positionierung gedacht. Wer aber mit dieser Funktion die Grö×e eines neuzuzeichenenden Bildbereichs ermitteln möchte, mu× links und rechts sicherheitshalber die Breite des grö×ten 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) für Textausgabe an der Stelle x,y zurückgeliefert. Dabei werden sämtliche Texteffekte, Rotation, Schrägstellung, Pair-Kerning, Track-Kerning, Zeichenüberhänge, horizontale und vertikale Ausrichtung berücksichtigt. 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 Einträge in ptsin contrl[3] n Einträge 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 Einträge in ptsout contrl[4] 0 Einträge 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 gewährleistet 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 Einträge in ptsin contrl[3] n Einträge in intin contrl[6] handle intin[0..n-1] string[0..n-1] Zeichenkette ptsin[0] x ptsin[1] y Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout Es gibt für v_ftext() noch eine weitere Variante, bei der man für jedes Zeichen den Abstand zum Vorgänger 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 Einträge in ptsin contrl[3] n Einträge 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 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 6 Einträge in intin contrl[6] handle intin[0] index Zeichen-Index intin[1] max_pts Maximale auszugebende Punktanzahl intin[2..3] xyarray Buffer für die Koordinaten intin[4..5] bezarray Buffer für Punktinformationen (jump, bez) Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout intout[0] count Anzahl der ausgegebenen Punkte Bemerkungen: Wenn man die Informationen von v_getoutline() z.B. als Vektorgrafik benutzen möchte, so empfiehlt es sich, vor dem Aufruf eine gro×e Texthöhe einzustellen. Andernfalls ist die Qualität des zurückgelieferten 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 Zeichenhöhe in Punkten setzen. Man ist aber nicht an die Standard-Grö×en gebunden, sondern kann die Höhe in 1/65536 Punkten (pt) anwählen. Wenn man negative Grö×en 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0..1] height Höhe in 1/65536 Punkten Ausgaben: contrl[2] 2 Einträge in ptsout contrl[4] 2 Einträge in intout intout[0..1] set_point eingestellte Höhe in 1/65536 Punkten ptsout[0] char_width ausgewählte Zeichenbreite ptsout[1] char_height ausgewählte Zeichenhöhe ptsout[2] cell_width ausgewählte Zeichenzellenbreite ptsout[3] cell_height ausgewählte Zeichenzellenhöhe Bemerkungen: Bei den zurückgelieferten 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 für ein Zeichen x- und y-Komponente für 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0] index Zeichen-Index Ausgaben: contrl[2] 4 Einträge in ptsout contrl[4] 0 Einträge 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 Kompatibilitätsgründen zurückgliefert. 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 für die Positionierung des nächsten Zeichens benutzt wird, d.h. x_advance beinhaltet keine Zeichenüberhänge. ¨ FLUSH OUTLINE FONT CACHE (VDI 251) Diese Funktion löscht die Fontcaches - Prädikat 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 nächsten Aufruf von vst_height(), vst_point oder vst_arbpt() wieder zurückgesetzt. 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0..1] width Zeichenbreite in 1/65536 Punkten Ausgaben: contrl[2] 2 Einträge in ptsout contrl[4] 2 Einträge in intout intout[0..1] set_width eingestellte Breite in 1/65536 Punkten ptsout[0] char_width ausgewählte Zeichenbreite ptsout[1] char_height ausgewählte Zeichenhöhe ptsout[2] cell_width ausgewählte Zeichenzellenbreite ptsout[3] cell_height ausgewählte Zeichenzellenhöhe ¨ SET OUTLINE FONT SKEW (VDI 253) Mit dieser Funktion können Zeichen unabhängig 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 führen 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] skew Neigung in 1/10-Grad Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge 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 grundsätzlich 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 Verknüpfungen beachtet. Beide Raster müssen entweder im gerätespezifischen Format vorliegen oder dürfen nur 1 Ebene haben. Immer dann, wenn der Bildschirm (oder das Gerät, das durch 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 Einträge in ptsin contrl[3] 1 Einträge 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 Verknüpfung ptsin[0..7] xyarr[0..7] Koordinaten Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout Bedeutung von wr_mode (logische Verknüpfungen): 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 Berücksichtigung 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 Einträge in ptsin contrl[3] 3 Einträge 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 gelöschten Punkte ptsin[0..7] xyarr[0..7] Koordinaten Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 gerätespezifische 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 gro×er Blöcke 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 Einträge in ptsin contrl[2] 0 Einträge in ptsout contrl[3] 0 Einträge in intin contrl[4] 0 Einträge 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) Für bis zu 8 Farbebenen (256 gleichzeitig darstellbare Farben) ermittelt "GET PIXEL" den Zustand (gelöscht/gesetzt) und die Farbe eines Pixels. Bei HiColor (15- oder 16-Bit) enthält pel den Pixelwert und index ist (meistens) -1, da er nicht einwandfrei zuzuordnen ist. Bei TrueColor enthält 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle ptsin[0] x ptsin[1] y Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 2 Einträge 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 grundsätzlich im gerätespezifischen Format erfolgen. Wenn als Ziel einer Rasteroperation eine Off-Screen-Bitmap mit ihrem MFDB angegeben wird und wenn das zu dieser Bitmap gehörende Handle benutzt wird, so wird beim Transfer anhand der über vs_clip() auf dieser Workstation eingestellten Koordinaten geclippt. Für 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() zurückgelieferte Handle einer Bitmap benutzt und in fd_addr in einem MFDB 0 enthält, so werden die Daten der Bitmap statt dessen benutzt. Eingabefunktionen ================= Die Eingabefunktionen ermöglichen einem Programm, unter Berücksichtigung der Eingabemodi Tastatur und Maus abzufragen. Au×erdem bieten sie Routinen zum einenklinken in Timer- und Maus- Interrupts. Diese Funktionen sind primär für den Eigner der physikalischen Workstation, d.h. für das AES gedacht. Applikationen sollten, sofern es keine zwingenden Gründe für ein anderes Vorgehen gibt, Maus- und Tastaturereignisse immer durch die Event-Funktionen des AES abfragen, da andernfalls für andere Applikationen bestimmte Eingaben abgefangen werden. ¨ SET INPUT MODE (VDI 33) Mit "SET INPUT MODE" kann man für ein bestimmtes Eingabegerät 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0] dev_type Eingabeeinheit intin[1] mode gewünschter Eingabemodus Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] set_mode ausgewählter 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 zurückgeben. SAMPLE MODE 2: Warten bis eine Eingabe erfolgt und dann den Eingabewert zurückgeben. ¨ 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 Einträge in ptsin contrl[3] 0 Einträge 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 Einträge in ptsout contrl[4] 1 Einträge 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. Tastenbetätigungen 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 Einträge in ptsin contrl[3] 0 Einträge 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 Einträge in ptsout contrl[4] 0 oder 1 Einträge 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: Positionsveränderung 1: Tastendruck ¨ INPUT CHOICE, REQUEST MODE (VDI 30) Mit dieser Funktion wird die Betätigung einer Funktionstaste abgewartet und die Tastennummer (1-10) zurückgegeben. 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] ch_in initialisierende Taste (0) Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] ch_out ausgewählte Funktionstaste ¨ INPUT CHOICE, SAMPLE MODE (VDI 30) Sofern eine Funktionstaste betätigt wurde, gibt dieser Funktion die Tastennummer (1-10) zurück. 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 oder 1 Einträge 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 zurück, wenn RETURN gedrückt oder die maximale Länge 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0] max_length maximale Länge 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 Einträge in ptsout contrl[4] n Einträge in intout intout[0..n-1] string[0..n-1] Eingabepuffer Bedeutung von max_length: max_length gibt die maximale Länge der Zeichenkette an. Ist max_length negativ, so wird der Absolutbetrag als Länge betrachtet, und statt der ASCII-Codes werden Scan-Codes übergeben. ¨ INPUT STRING,SAMPLE MODE (VDI 31) Diese Funktion gibt eine Zeichenkette von der Tastatur zurück, wenn RETURN gedrückt oder die maximale Länge 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[6] handle intin[0] max_length maximale Länge 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 Einträge in ptsout contrl[4] n Einträge in intout intout[0..n-1] string[0..n-1] Eingabepuffer Bedeutung von max_length: max_length gibt die maximale Länge der Zeichenkette an. Ist max_length negativ, so wird der Absolut-Betrag als Länge benutzt und statt der ASCII- Codes werden Scan-Codes übergeben. Bedeutung von status (contrl[4]): 0: keine Eingabe <> 0: Länge 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 Einträge in ptsin contrl[3] 37 Einträge in intin contrl[6] handle intin[0..36] cursor[0..36] Mauszeigerdefinition Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 möglich, die aktuelle Mausform zurückgeliefert zu bekommen. Variable Belegung Bedeutung Eingaben: contrl[0] 111 vgc_form contrl[1] 0 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 37 Einträge in intout intout[0..36] cursor[0..36] Mauszeigerdefinition ¨ INQUIRE INPUT MODE (VDI 115) Diese Funktion ermittelt den Eingabemodus eines Gerätes. 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] dev_type Gerätenummer (siehe vsin_mode) Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge 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 veränderten 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle contrl[7..8] tim_addr Adresse der neuen Interruptroutine Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge 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 möchte, mu× der Parameter 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 Einträge in ptsin contrl[3] 1 Einträge in intin contrl[6] handle intin[0] reset Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 zurück. 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 1 Einträge in ptsout contrl[4] 1 Einträge in intout intout[0] status Maustastenstatus ptsout[0] x ptsout[1] y Bedeutung von status: 0: keine Maustaste gedrückt 1: linke Maustaste gedrückt 2: rechte Maustaste gedrückt 3: beide Maustasten gedrückt Bemerkung: In GEM-Programmen sollte die AES-Funktion graf_mkstate() verwendet werden, um nur die für 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 erthält. Diese Routine mu× alle veränderten 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle contrl[7..8] pusrcode Adresse der neuen Routine Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 veränderten Register müssen von dieser Routine restauriert werden. Anschlie×end 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle contrl[7..8] pusrcode Adresse der neuen Routine Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 erhält, geclippt wurden. Alle veränderten Register müssen wiederhergestellt werden. Anschlie×end 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle contrl[7..8] pusrcode Adresse der neuen Routine Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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) zurück. 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 1 Einträge 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 für 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 und 0 sind, gibt es auf dem Gerät 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 1 vq_chcells contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 2 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 2 v_exit_cur contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ ENTER ALPHA MODE (VDI 5, ESCAPE 3) Mit dieser Funktion gelangt man in den Textmodus. Der Bildschirm wird gelöscht 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 3 v_enter_cur contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 4 v_curup contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 5 v_curdown contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 6 v_curright contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 7 v_curleft contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 8 v_curhome contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ ERASE TO END OF ALPHA SRCEEN (VDI 5, ESCAPE 9) Der Bildschirm wird von der aktuellen Cursor-Position ab gelöscht. Dekl.: void v_eeos( WORD handle ); Aufruf: v_eeos( handle ); Variable Belegung Bedeutung Eingaben: contrl[0] 5 ESCAPE contrl[1] 0 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 9 v_eeos contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ ERASE TO END OF ALPHA TEXT LINE (VDI 5, ESCAPE 10) Diese Funktion löscht 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 10 v_eeol contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 2 Einträge in intin contrl[5] 11 v_curaddress contrl[6] handle intin[0] row Zeile intin[1] column Spalte Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] n Einträge in intin contrl[5] 12 v_curtext contrl[6] handle intin[0..n-1] string[0..n-1] Zeichenkette Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 13 v_rvon contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 14 v_rvoff contrl[6] handle Ausgaben: contrl[2] 0 Einträge in ptsout contrl[4] 0 Einträge in intout ¨ INQUIRE CURRENT ALPHA CURCOR ADDRESS (VDI 5, ESCAPE 15) Von dieser Funktion wird die Position des Text-Cursors zurückgegeben. 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 Einträge in ptsin contrl[3] 0 Einträge in intin contrl[5] 15 vq_curaddress contrl[6] handle Augaben: contrl[2] 0 Einträge in ptsout contrl[4] 2 Einträge in intout intout[0] row Zeile intout[1] column Spalte Beispiele für Bindings ====================== Diese Beispiel-Bindings gehen davon aus, da× , , , , und 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 für Bildschirm/Bitmap */ WORD fd_w; /* Breite des Rasters in Pixeln */ WORD fd_h; /* Höhe des Rasters in Zeilen */ WORD fd_wdwidth; /* Breite einer Rasterzeile in Worten */ WORD fd_stand; /* Format 0: gerätespezifisch, 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-Intensität in Promille (0-1000) */ WORD green; /* Grün-Intensität in Promille (0-1000) */ WORD blue; /* Blau-Intensität in Promille (0-1000) */ } RGB1000; typedef struct { LONG size; /* Länge der Struktur, mu× vor vqt_xfntinfo() gesetzt werden */ WORD format; /* Fontformat, z.B. 4 für TrueType */ WORD id; /* Font-ID, z.B. 6059 */ WORD index; /* Index */ BYTE font_name[50]; /* vollständiger 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 Punkthöhen für vst_point(), z.B. 10 */ WORD pt_sizes[64]; /* verfügbare Punkthöhen, 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 ); /* Länge 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 zurückgeben */ } 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 gerätespezifischen Format oder mit nur 1 Ebene erzeugt (hängt vom MFDB ab). Anderfalls wird versucht eine Bitmap mit der Farbanzahl , Ebenen, dem Pixelformat und der Bitreihenfolge anzulegen. Falls kein passender Offscreen-Treiber vorhanden ist, kann die Bitmap nicht geöffnet 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; /* Gerät */ 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 geöffnet 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] ); }