Topic : TOS - das Betriebssystem Author : Version : tos.hyp (5. März 2013) Subject : Programmieren/Atari Nodes : 3001 Index Size : 93602 HCP-Version : 5 Compiled on : Atari @charset : atarist @lang : @default : Titel @help : @options : +g -i -s +x +zz -t4 @width : 70 View Ref-File7.13.5 FONT_HDR TOS Die folgende Struktur beschreibt den Datei-Header für einen Bitmap Zeichensatz im Digital Research Standardformat. In diesem Format wird der Font als breites, monochromes Rasterbild organisiert; die Breite des Rasters ist die Summe aller Zeichenbreiten, die Rasterhöhe entspricht der Höhe eines einzelnen Zeichens. Daraus folgt: Der linke Rand eines Zeichens muss nicht unbedingt auf eine Bytegrenze fallen; nur am Ende jeder Rasterzeile wird soweit mit Null-Bits aufgefüllt, bis der nächste Zeilenbeginn wieder auf eine Wortgrenze fällt. typedef struct font_hdr { int16_t font_id; /* Zeichensatz-Nummer */ int16_t point; /* Größe in Punkten */ int8_t name[32]; /* Name des Zeichensatzes */ uint16_t first_ade; /* erstes Zeichen im Zeichensatz */ uint16_t last_ade; /* letztes Zeichen im Zeichensatz */ uint16_t top; /* Abstand: Topline <-> Baseline */ uint16_t ascent; /* Abstand: Ascentline <-> Baseline */ uint16_t half; /* Abstand: Halfline <-> Baseline */ uint16_t descent; /* Abstand: Descentline <-> Baseline */ uint16_t bottom; /* Abstand: Bottomline <-> Baseline */ uint16_t max_char_width; /* größte Zeichenbreite */ uint16_t max_cell_width; /* größte Zeichenzellenbreite */ uint16_t left_offset; /* linker Offset für Kursivschrift */ uint16_t right_offset; /* rechter Offset für Kursivschrift */ uint16_t thicken; /* Verbreiterungsfaktor für Fettschrift */ uint16_t ul_size; /* Dicke der Unterstreichung */ uint16_t lighten; /* Maske für helle Schrift (0x5555) */ uint16_t skew; /* Maske für Kursivschrift (0x5555) */ uint16_t flags; /* verschiedene Flags: gesetzt falls System-Font Bit-1: gesetzt falls Horizontal Offset-Table benutzt wird Bit-2: gesetzt falls Motorola-Format Bit-3: gesetzt falls nicht proport. */ uint8_t *hor_table; /* Zeiger auf Horizontal-Offset-Table */ uint16_t *off_table; /* Zeiger auf Character-Offset-Table */ uint16_t *dat_table; /* Zeiger auf Fontimage */ uint16_t form_width; /* Breite des Zeichensatz-Image */ uint16_t form_height; /* Höhe des Zeichensatz-Image */ font_hdr *next_font; /* Zeiger auf nächsten Font-Header */ } FONT_HDR; Hinweis: Da das GEM ursprünglich auf dem PC entwickelt wurde, liegen alle Daten normalerweise im Intel-Format vor, so daß auf Maschinen mit Motorola-Prozessoren bei allen Wörtern oberes und unteres Byte vertauscht werden müssen. Achtung: Um das Motorola/Intel-Flag (Bit-2 der Komponente flags) abfragen zu können, muss eigentlich schon bekannt sein, in welchem Format der Zeichensatz vorliegt. Die Lösung des Problems: Davon ausgehen, dass Bit-10 der Flags niemals benutzt sein wird, und testen, ob Bit-2 im 67-ten Byte des Headers gesetzt ist (denn dann liegt der Zeichensatz im Motorola-Format vor). Die Character-Offset-Table besitzt Einträge von 16-Bit-Werten, die den horizontalen Pixeloffset für jedes Zeichen innerhalb des Fontrasters angibt. Als Index muss man also den ASCII-Code abzüglich des ASCII- Codes des ersten Zeichens im Zeichensatz benutzen (Komponente first_ade). Die Breite eines Zeichens ergibt sich aus der Differenz zum Offsetwert des nächsthöheren Zeichens; damit diese Formel auch für das letzte Zeichen funktioniert, enthält die Tabelle übrigens stets einen Eintrag mehr, als Zeichen verfügbar sind. Die Horizontal-Offset-Table enthält positive oder negative Offsetwerte die vor der Ausgabe eines Zeichens auf die x-Position addiert werden; sie wird allerdings nur bei wenigen Zeichensätzen unterstützt. Last but not least sei darauf hingewiesen, daß sich eine normale Anwendung niemals mit diesem Format befassen muß; lediglich für Entwickler von Zeichensatzeditoren oder GDOS-Versionen sind diese Informationen wichtig. Querverweis: GDOS NVDI SpeedoGDOS Vektorfonts vst_alignment vst_load_fonts vst_unload_fonts vqt_fontheader