ðoOberon10.Scn.FntOberon10i.Scn.FntEÛÿÿÿÿ€8ÀÔFoldElemsNew&ÿÿÿÿ€8ÀÔ?ÿÿÿÿ€8ÀÔgÿÿÿÿ€8ÀÔ7ÿÿÿÿ€8ÀÔ2ÿÿÿÿ€8ÀÔ5ÿÿÿÿ€8ÀÔ`ÿÿÿÿ€8ÀÔ*ÿÿÿÿ€8ÀÔ&ÿÿÿÿ€8ÀÔHÿÿÿÿ€8ÀÔƒ  ¹ |!rÿÿÿÿ€8ÀÔ Oberon10b.Scn.Fntÿÿÿÿ€8ÀÔôÿÿÿÿ€8ÀÔÿÿÿÿ€8ÀÔDÿÿÿÿ€8ÀÔ(MODULE FontToBDF; (* RC 19.12.91 *) (* converts Oberon fonts to Bitmap Distribution Format (BDF) fonts *) IMPORT Oberon, Texts, Files; CONST FontFileId = 0DBX; VAR W: Texts.Writer; fontname: ARRAY 128 OF CHAR; prefix, suffix: ARRAY 32 OF CHAR; hex: ARRAY 16 OF CHAR; PROCEDURE Write (VAR r: Files.Rider; ch: CHAR);  BEGIN Files.Write(r, ch) END Write;  PROCEDURE WriteStr (VAR r: Files.Rider; str: ARRAY OF CHAR);  VAR i: INTEGER; BEGIN i := 0; WHILE str[i] # 0X DO Files.Write(r, str[i]); INC(i) END END WriteStr;  PROCEDURE WriteInt (VAR r: Files.Rider; n: LONGINT);  VAR str: ARRAY 32 OF CHAR; i: INTEGER; BEGIN IF n = 0 THEN Files.Write(r, "0") ELSE IF n < 0 THEN Files.Write(r, "-"); n := - n END ; i := 0; REPEAT str[i] := CHR(ORD("0") + n MOD 10); INC(i); n := n DIV 10 UNTIL n = 0; WHILE i > 0 DO DEC(i); Files.Write(r, str[i]) END END END WriteInt;  PROCEDURE WriteHex (VAR r: Files.Rider; ch: CHAR);  BEGIN Files.Write(r, hex[ORD(ch) MOD 16]); Files.Write(r, hex[ORD(ch) DIV 16]) END WriteHex;  PROCEDURE WriteLn (VAR r: Files.Rider);  BEGIN (*Files.Write(r, CHR(13));*) Files.Write(r, CHR(10)) END WriteLn;  PROCEDURE Do (VAR R, r: Files.Rider; size: INTEGER; screen: BOOLEAN);  (*screen not used*) TYPE RunRec = RECORD beg, end: INTEGER END; BoxRec = RECORD dx, x, y, w, h: INTEGER END; VAR ch: CHAR; height, minX, maxX, minY, maxY: INTEGER; NofRuns, NofBoxes: INTEGER; i, j, k, l, m, n, dx, x, y, w, h: INTEGER; run: ARRAY 16 OF RunRec; box: ARRAY 256 OF BoxRec; raster: ARRAY 256, 32 OF CHAR; BEGIN WriteStr(r, "STARTFONT 2.1"); WriteLn(r); WriteStr(r, "COMMENT converted Oberon font (using FontToBDF by R.Crelier 10.1.91)"); WriteLn(r); WriteStr(r, "FONT "); WriteStr(r, fontname); WriteLn(r); IF size <= 0 THEN size := 1 END ; WriteStr(r, "SIZE "); WriteInt(r, size); WriteStr(r, " 75 75"); WriteLn(r); Files.Read(R, ch); (*abstraction*) Files.Read(R, ch); (*family*) Files.Read(R, ch); (*variant*) Files.ReadInt(R, height); (*line spacing*) Files.ReadInt(R, minX); Files.ReadInt(R, maxX); Files.ReadInt(R, minY); Files.ReadInt(R, maxY); WriteStr(r, "FONTBOUNDINGBOX "); WriteInt(r, maxX - minX); Write(r, " "); WriteInt(r, maxY - minY); Write(r, " "); WriteInt(r, minX); Write(r, " "); WriteInt(r, minY); WriteLn(r); WriteStr(r, "STARTPROPERTIES 3"); WriteLn(r); WriteStr(r, "FONT_ASCENT "); WriteInt(r, maxY); WriteLn(r); WriteStr(r, "FONT_DESCENT "); WriteInt(r, - minY); WriteLn(r); WriteStr(r, "DEFAULT_CHAR 0"); WriteLn(r); WriteStr(r, "ENDPROPERTIES"); WriteLn(r); Files.ReadInt(R, NofRuns); NofBoxes := 0; k := 0; WHILE k # NofRuns DO Files.ReadInt(R, run[k].beg); Files.ReadInt(R, run[k].end); NofBoxes := NofBoxes + run[k].end - run[k].beg; INC(k) END ; l := 0; WHILE l # NofBoxes DO Files.ReadInt(R, box[l].dx); Files.ReadInt(R, box[l].x); Files.ReadInt(R, box[l].y); Files.ReadInt(R, box[l].w); Files.ReadInt(R, box[l].h); INC(l) END ; WriteStr(r, "CHARS "); IF run[0].beg = 0 THEN WriteInt(r, NofBoxes); WriteLn(r) ELSE WriteInt(r, NofBoxes + 1); WriteLn(r); WriteStr(r, "STARTCHAR c0"); WriteLn(r); WriteStr(r, "ENCODING -1 0"); WriteLn(r); WriteStr(r, "SWIDTH 0 0"); WriteLn(r); WriteStr(r, "DWIDTH 0 0"); WriteLn(r); WriteStr(r, "BBX 0 0 0 0"); WriteLn(r); WriteStr(r, "BITMAP"); WriteLn(r); WriteStr(r, "ENDCHAR"); WriteLn(r) END ; k := 0; l := 0; m := 0; WHILE k < NofRuns DO m := run[k].beg; WHILE m < run[k].end DO WriteStr(r, "STARTCHAR c"); WriteInt(r, m); WriteLn(r); WriteStr(r, "ENCODING -1 "); WriteInt(r, m); WriteLn(r); dx := box[l].dx; x := box[l].x; y := box[l].y; w := box[l].w; h := box[l].h; WriteStr(r, "SWIDTH "); WriteInt(r, dx * 129 DIV 4); (*not exact*) WriteStr(r, " 0"); WriteLn(r); WriteStr(r, "DWIDTH "); WriteInt(r, dx); WriteStr(r, " 0"); WriteLn(r); IF h = 0 THEN (* inconsistency in some fonts *) WriteStr(r, "BBX 0 0 0 0") ELSE WriteStr(r, "BBX "); WriteInt(r, w); Write(r, " "); WriteInt(r, h); Write(r, " "); WriteInt(r, x); Write(r, " "); WriteInt(r, y) END ; WriteLn(r); WriteStr(r, "BITMAP"); WriteLn(r); n := (w + 7) DIV 8; i := 0; WHILE i < h DO j := 0; WHILE j < n DO Files.Read(R, raster[i, j]); INC(j) END ; INC(i) END ; WHILE h > 0 DO DEC(h); w := 0; WHILE w < n DO WriteHex(r, raster[h, w]); INC(w) END ; WriteLn(r) END ; WriteStr(r, "ENDCHAR"); WriteLn(r); INC(l); INC(m) END; INC(k) END ; WriteStr(r, "ENDFONT"); WriteLn(r) END Do;  PROCEDURE Convert*;  VAR F, f: Files.File; R, r: Files.Rider; i, j, size: INTEGER; ch: CHAR; screen: BOOLEAN; filename, bdfname: ARRAY 128 OF CHAR; s: Texts.Scanner; BEGIN Texts.OpenScanner(s, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(s); LOOP IF s.class # Texts.Name THEN EXIT END ; COPY(s.s, filename); i := 0; j := 0; WHILE s.s[i] # 0X DO IF s.s[i] = "/" THEN j := 0 ELSE fontname[j] := s.s[i]; INC(j) END ; INC(i) END ; fontname[j] := 0X; Texts.WriteString(W, fontname); F := Files.Old(filename); IF F # NIL THEN Files.Set(R, F, 0); Files.Read(R, ch); IF ch = FontFileId THEN COPY(prefix, bdfname); j := 0; WHILE bdfname[j] # 0X DO INC(j) END ; i := 0; WHILE fontname[i] # 0X DO bdfname[j] := fontname[i]; INC(i); INC(j) END ; DEC(j, 4); screen := bdfname[j - 3] = "S"; i := 0; WHILE suffix[i] # 0X DO bdfname[j] := suffix[i]; INC(i); INC(j) END ; bdfname[j] := 0X; i := 0; size := 0; LOOP ch := fontname[i]; IF (ch >= "0") & (ch <= "9") OR (ch = 0X) THEN EXIT END ; INC(i) END ; IF ch # 0X THEN size := ORD(ch) - ORD("0"); ch := fontname[i + 1]; IF (ch >= "0") & (ch <= "9") THEN size := 10 * size + ORD(ch) - ORD("0") END END ; f := Files.New(bdfname); IF f # NIL THEN Files.Set(r, f, 0); Texts.WriteString(W, " converting to "); Texts.WriteString(W, bdfname); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); Do(R, r, size, screen); Files.Register(f) END ELSE Texts.WriteString(W, " not a font"); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END ; Files.Close(F) ELSE Texts.WriteString(W, " not found"); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END ; Texts.Scan(s) END END Convert;  BEGIN Texts.OpenWriter(W); prefix := "Oberon."; suffix := ".bdf"; hex[0] := "0"; hex[1] := "8"; hex[2] := "4"; hex[3] := "C"; hex[4] := "2"; hex[5] := "A"; hex[6] := "6"; hex[7] := "E"; hex[8] := "1"; hex[9] := "9"; hex[10] := "5"; hex[11] := "D"; hex[12] := "3"; hex[13] := "B"; hex[14] := "7"; hex[15] := "F";  END FontToBDF.