← ST-Computer 01 / 1989

Installieren von STAD-Fonts (GFA)

Programmierpraxis

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:

  1. Bytes 0+1, Font-Identifkations-Nummer (hier 2 bis 8, 1 ist Systemfont).
  2. Bytes 4-35, Name des Fonts (Fontname von STAD plus Zusatz “.STAD”
  3. Bytes 76-79, Adresse der Fontdaten.
  4. Bytes 84-87, Adresse des nÀchsten Fontheaders.
  5. Bytes 66+67, Flag zur Kennung, ob Font Systemfont ist.

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,"Drcken 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
Heinz Katzenmayer