Das neue GFA-BASIC 3.0 hat nicht nur eine Anzahl neuer Befehle, sondern auch Erweiterungen bereits vorhandener. Eine dieser Befehlserweiterungen ist der Parameter Fonts im Befehl DEFTEXT. Einziger Hinweis im Handbuch lautet: Installieren zusätzlicher Zeichensätze unter GDOS mit VST_LOADFONT, VQT_NAME... . Da ich nicht über GDOS verfüge, war die Frage: Was gibt es noch für eine Möglichkeit, um diesen neuen Parameter zu nutzen? Ich erinnerte mich an einen Artikel in der ST Computer 4/88 „Schönere Programme durch Zeichensätze“. In diesem Artikel wird eine Lösung in ST-Pascal Plus zu diesem Problem vorgestellt. Nach zusätzlicher Lektüre der Seiten 274 und 275 des Buches ATARI ST Intern, auf denen der Aufbau des Fontheaders beschrieben ist, machte ich mich an die Arbeit.
Als erstes benötigt man natürlich zusätzliche Fonts. Ich wählte den gleichen Weg, wie in dem vorgenannten Artikel aufgezeigt. Das Programm STADGEM.GFA lädt STAD-Fonts, ändert sie auf GEM-Format und legt sie unter der Kennung GEM_F2 bis -8 im Ordner GEMFONTS ab. Das Format der Fontdaten muß geändert werden, da bei STAD die 16 Bytes jedes Zeichens hintereinander liegen, dann kommen 16 Bytes des nächsten Zeichens usw., und das 256mal. GEM benötigt die Daten aber folgendermaßen: Das 1. Byte des 1. Zeichens, dann das 1. Byte des 2. Zeichens usw. Folglich ist das 257. Byte das 2. Byte des 1. Zeichens (bei 256 Zeichen). Verstanden? Das klingt komplizierter, als es ist (siehe Programmzeilen 40-47). Zusätzlich muß ein Fontheader für jedes Font angelegt werden. Allerdings muß bei einem neuen Font nicht der gesamte Header geändert werden.
Dies ist nur an den fünf folgenden Stellen nötig:
Deshalb werden nur Fontnummer und -name zusammen mit den Fontdaten abgespeichert. Damit ist die Aufgabe des Programmes STADGEM.GFA erledigt. Im zweiten Programm, F_LADEN.GFA, werden nun diese Daten eingelesen.Was dann noch passiert, ist ziemlich einfach. Der Fontheader wird an den oben genannten Stellen geändert und dann zusammen mit den Fontdaten an einem vorher reservierten Speicherplatz abgelegt. Es wird also eine Fonttabelle an die nächste angehängt. In der letzen Tabelle wird bei der Adresse des nächsten Fontheaders (siehe 4.) keine neue Adresse mehr eingetragen. Alles, was sonst noch im Programm F_LADEN.GFA steht, wird nur zum Testen benutzt. Um das Programm nutzen zu können, muß man es als Unterprogramm einbauen. Siehe hier das Programm PROCFONT. GFA. Wenn man nicht alle sieben zusätzlichen Fonts im Programm braucht, muß man die Zählschleife i% nur entsprechend verändern.
Natürlich kann man nur bei GEM-Anwendungen diese Fonts nutzen (im GFA-BASIC beim Befehl TEXT, nicht bei PRINT).
Nun wünsche ich viel Spaß und auch etwas Fingerspitzengefühl beim Nutzen der Fonts in Ihren Programmen. Als gelernter Schriftsetzer stehen mir öfters die Haare zu Berge, wenn ich die Verwendung von Schriften und Schriftstilen in Computerdrucksachen und Programmen sehe. Mit Desktop-Publishing werden diesem Horror jetzt fast unbeschränkte Möglichkeiten eröffnet.
' STAD:GEM.GFA
' PROGRAMM ZUM UMWANDELN VON STAD-FONTS IN GEM-FONTS
' HEINZ KATZENMAYER, 10/88
'
' Ordner anlegen:
MKDIR "GEMFONTS"
font%=1
'
REPEAT
CLS
'
' Speicherplatz fuer Fontdaten:
font_adr$=SPACE$(4096)
help_adr$=SPACE$(4096)
font_adr%=VARPTR(font_adr$)
help_adr%=VARPTR(help_adr$)
'
' STAD-Font auswaehlen:
FILESELECT "\STADFONT\*.FNT","",fstad$
IF fstad$=""
END
ENDIF
'
' Name von Font fuer Fontheader:
n$=SPACE$(32)
LSET n$=MID$(fstad$,11,INSTR(fstad$,".")-11)+".STAD"
'
' Fontnummer:
INC font%
'
PRINT AT(20,8);"Das STAD-Font ";LEFT$(n$,INSTR(n$,".")-1)
PRINT AT(20,10);"wird neu abgespeichert im Ordner GEMFONTS"
'
' Fontheader-Eintrag Nummer und Name:
header$=MKI$(font%)+n$
'
' STAD-Fontdaten einlesen ...
OPEN "I",#1,fstad$
BGET #1,help_adr%,4096
'
' ... und auf GEM-Format aendern:
b%=-1
FOR zeichen%=0 TO 255
FOR scan%=0 TO 15
INC b%
POKE font_adr%+zeichen%+scan%*256,PEEK(help_adr%+b%)
NEXT scan%
NEXT zeichen%
'
' Fontdaten plus Header in GEMFONT abspeichern:
fgem$="\GEMFONTS\GEM_F"+STR$(font%)+".FNT"
OPEN "O",#2,fgem$
BPUT #2,VARPTR(header$),34
BPUT #2,font_adr%,4096
CLOSE
'
' Noch ein Font umwandeln?:
al1$="Das STAD-Font "+LEFT$(n$,INSTR(n$,".")-1)
al2$="|ist abgespeichert unter: "+"|"
al$=al1$+al2$+fgem$
ALERT 3,al$+"|Noch ein Font umwandeln?",1," JA |NEIN",al%
UNTIL al%=2
CLS
END
' PROCEDURE FONT
' ZUM EINBINDEN IN EIGENE PROGRAMME
' HEINZ KATZENMAYER, 10/88
'
PROCEDURE font
LOCAL i%,f$
DIM newfont_adr%(6),newheader_adr%(6)
header_adr%={L~A-906}
font_adr%=LPEEK({L~A-906}+76)
FOR i%=0 TO 6
newfont$="Font"+STR$(i%)+SPACE$(4091)
newheader$="Header"+STR$(i%)+SPACE$(81)
nr$=SPACE$(2)
fname$=SPACE$(32)
newfont_adr%(i%)=VARPTR(newfont$)
newheader_adr%(i%)=VARPTR(newheader$)
nr_adr%=VARPTR(nr$)
fname_adr%=VARPTR(fname$)
f$="\GEMFONTS\GEM_F"+STR$(i%+2)+".FNT"
OPEN "I",#1,f$
BGET #1,nr_adr%,2
BGET #1,fname_adr%,32
BGET #1,newfont_adr%(i%),4096
CLOSE #1
LPOKE header_adr%+84,newheader_adr%(i%)
BMOVE header_adr%,newheader_adr%(i%),88
DPOKE newheader_adr%(i%),DPEEK(nr_adr%)
BMOVE fname_adr%,newheader_adr%(i%)+4,32
LPOKE newheader_adr%(i%)+76,newfont_adr%(i%)
DPOKE newheader_adr%(i%)+66,12
header_adr%=newheader_adr%(i%)
NEXT i%
RETURN
' F_LADEN.GFA
' PROGRAMM ZUM INSTALLIEREN DER FONTS
' HEINZ KATZENMAYER, 10/88
' BENOETIGT WERDEN NUR DIE ZEILEN:
' 12-15, 21-62, 115-120
'
' Textzeilen fuer Procedure AUSGABE:
test1$="ABCDEFGHIJKLMNOPQRSTUVWXYZ "
test2$="abcdefghijklmnopqrstuvwxyz "
test3$="012345679 „”ž !.,:;-"
test$=test1$+test2$+test3$
'
' Neue Font- und Headeradressen:
DIM newfont_adr%(6),newheader_adr%(6)
header_adr%={L~A-906}
font_adr%=LPEEK({L~A-906}+76)
'
CLS
PRINT AT(10,7);"Fontdaten werden geladen:"
PRINT AT(10,9);"Font 1: Systemfont"
'
' Fonts 2 bis 8 installieren:
FOR i%=0 TO 6
' Speicherplatz fuer Header- und Fontdaten:
newfont$="Font"+STR$(i%)+SPACE$(4091)
newheader$="Header"+STR$(i%)+SPACE$(81)
nr$=SPACE$(2)
fname$=SPACE$(32)
newfont_adr%(i%)=VARPTR(newfont$)
newheader_adr%(i%)=VARPTR(newheader$)
nr_adr%=VARPTR(nr$)
fname_adr%=VARPTR(fname$)
'
' Font- und Headerdaten laden:
f$="\GEMFONTS\GEM_F"+STR$(i%+2)+".FNT"
OPEN "I",#1,f$
BGET #1,nr_adr%,2
BGET #1,fname_adr%,32
BGET #1,newfont_adr%(i%),4096
CLOSE #1
'
' Am Ende des Fontheaders Adresse des naechsten Headers:
LPOKE header_adr%+84,newheader_adr%(i%)
'
' Header kopieren fuer neuen Header:
BMOVE header_adr%,newheader_adr%(i%),88
'
' Header aendern (Nr., Name, Datenadr., Bit 0 im Flag)
DPOKE newheader_adr%(i%),DPEEK(nr_adr%)
BMOVE fname_adr%,newheader_adr%(i%)+4,32
LPOKE newheader_adr%(i%)+76,newfont_adr%(i%)
DPOKE newheader_adr%(i%)+66,12
'
' Aus neuer Adresse wird alte (fuer Zeile 44):
header_adr%=newheader_adr%(i%)
'
' Font ist geladen:
GOSUB name
PRINT AT(10,10+i%);"Font ";i%+2;": ";n$
NEXT i%
'
' Beim letzten Fontheader kein weiterer Header:
LPOKE header_adr%+84,0
'
' Ab hier braucht man das Programm spaeter nicht mehr:
' Das ist nur der Test:
'
PAUSE 100
CLS
GOSUB ausgabe
PAUSE 100
al$="Wollen Sie noch|ein Muster von|jedem Font sehen"
ALERT 2,al$,1," JA |NEIN",al%
'
IF al%<>1
END
ENDIF
'
DO
REPEAT
CLS
PRINT AT(2,2);"Welches Font (1-8 / 0=Ende):";
PRINT AT(32,2);
FORM INPUT 1,x$
UNTIL ASC(x$)>47 AND ASC(x$)<57
'
font%=VAL(x$)
EXIT IF font%=0
FOR attr%=0 TO 5
DEFTEXT 1,2^attr%,,13,font%
TEXT 10,40+((attr%+1)*30),test$
NEXT attr%
DEFTEXT 1,0,,32
TEXT 10,280,test1$
TEXT 10,330,test2$
TEXT 10,380,test3$
'
DEFTEXT 1,0,,6,1
TEXT 480,370,"Drcken Sie eine"
TEXT 480,380,"beliebige Taste!"
VOID INP(2)
LOOP
END
'
PROCEDURE ausgabe
FOR n%=1 TO 8
DEFTEXT ,,,13,1
y%=-25+n%*48
TEXT 10,y%,"Font Nummer "+STR$(n%)+":"
DEFTEXT ,,,13,n%
ADD y%,20
TEXT 10,y%,test$
NEXT n%
RETURN
'
PROCEDURE name
CLR n$
FOR n%=0 TO 31
n$=n$+CHR$(PEEK(fname_adr%+n%))
NEXT n%
RETURN