ða;Syntax10.Scn.Fnt ;üÿÿÐûÐûInfoElemsAllocVSyntax10.Scn.FntèõÿÿÿzÀÔStampElemsAlloc23 Jan 98†o"Title": Postscript driver "Author": JT 11.5.90 "Abstract": Taken from HP-Oberon, this is the Postscript printer driver. Supports Linz V4 Pictures. "Keywords": Printing, Driver, Postscript "Version": 2.0 "From": 11 May 90 "Until":  "Changes": JT 11.5.90, RC 2.7.93, JS 13.10.94 14 Oct 95 W.Skulski: HP version modified for ETH Intel compiler by simlifying expressions 19 Mar 97 RLI: defaultHeaderFileName changed 08 Oct 97 RLI: Support for V4 Linz Pictures integrated. Needs enlarged Oberon.Header.ps 23 Oct 97 RLI: Support for standard-postscript fonts without need of .Pr3.Fnt - Files integrated. 26 Oct 97 RLI: Code revision & cleanup 04 Nov 97 RLI: Support for special characters integrated (German umlauts, etc.) HeaderFile cleaned 11 Dec 97 RLI: FontMap exported for use in TextPrinter.Mod "Hints": Oberon for Linux uses Edit.Print PS.Print to print a File. (Syntax10b.Scn.Fnt    Syntax10i.Scn.Fnt+ã /»ÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt## BEGIN Files.Write(R, ch) END Ch; ÿÿÿÿ€8ÀÔ8ˆÿÿÿ€8ÀÔ#Syntax10.Scn.FntVV VAR i: INTEGER; BEGIN i := 0; WHILE s[i] # 0X DO Ch(R, s[i]); INC(i) END END Str; ÿÿÿÿ€8ÀÔ2ùþÿÿ€8ÀÔ#Syntax10.Scn.Fntåå VAR j: LONGINT; BEGIN IF i = 0 THEN Ch(R, "0") ELSIF i < 0 THEN i := - i; Ch(R, "-") END; j := 1; WHILE (i DIV j) # 0 DO j := j * 10 END; WHILE j >= 10 DO j := j DIV 10; Ch(R, CHR(ORD("0") + (i DIV j) MOD 10)) END END Int; ÿÿÿÿ€8ÀÔ2zÿÿÿ€8ÀÔ#Syntax10.Scn.Fntdd BEGIN IF i < 10 THEN Ch(R, CHR(i + ORD("0"))) ELSE Ch(R, CHR(i + (ORD("a") - 10))) END END Hex; ÿÿÿÿ€8ÀÔ1Šÿÿÿ€8ÀÔ#Syntax10.Scn.FntTT BEGIN Ch(R, hexArray[ORD(ch) DIV 16]); Ch(R, hexArray[ORD(ch) MOD 16]) END Hex2; ÿÿÿÿ€8ÀÔ%Ãÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt BEGIN Ch(R, 0AX) END Ln; ÿÿÿÿ€8ÀÔ/iþÿÿ€8ÀÔ#Syntax10.Scn.Fntuu BEGIN curR := 0; curG := 0; curB := 0; actFont := ""; PrinterDriver.res := 1; COPY(tmpFileName, printFileName); headerF := Files.Old(headerFileName); IF headerF # NIL THEN bodyF := Files.New(""); Files.Set(bodyR, bodyF, 0); listFont := ""; ppos := 0; pno := 1; PrinterDriver.res := 0 ELSE PrinterDriver.Error("file not found", headerFileName) END END Open; ÿÿÿÿ€8ÀÔ3¡ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt== BEGIN COPY(name, listFont); actFont := "" END UseListFont; ÿÿÿÿ€8ÀÔ- ÿÿÿ€8ÀÔ#Syntax10.Scn.FntÓÓ BEGIN IF (w > 0) & (h > 0) THEN Int(bodyR, x + 1); Ch(bodyR, " "); Int(bodyR, y); Ch(bodyR, " "); Int(bodyR, w - 1); Ch(bodyR, " "); Int(bodyR, h - 1); Str(bodyR, " l"); Ln(bodyR) END END ReplConst; ÿÿÿÿ€8ÀÔPÿÿÿÿ€8ÀÔ®98ÿÿÿÿ€8ÀÔ6ÿÿÿÿ€8ÀÔ0ªÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt44fontName[Strings.Pos(".Scn.Fnt", fontName, 0)] := 0Xÿÿÿÿ€8ÀÔ5Lÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt’’IF (fontName[i] < '0') OR (fontName[i] > '9') THEN variant := fontName[i]; fontName[i] := 0X; DEC(i); DEC(len) ELSE variant := ' ' END; 9ÿÿÿÿ€8ÀÔÿÿÿ€8ÀÔ#Syntax10.Scn.FntÙÙfontSize := 0; WHILE (fontName[i] >= '0') & (fontName[i] <= '9') DO DEC(i) END; INC(i); j := i; WHILE i < len DO fontSize := fontSize * 10 + ORD(fontName[i]) - ORD('0'); INC(i) END; fontName[j] := 0X; 4ÿÿÿÿ€8ÀÔ=Òÿÿÿÿ€8ÀÔAsÿÿÿ€8ÀÔ#Syntax10.Scn.Fntkk BEGIN Int(bodyR, x); Ch(bodyR, " "); Int(bodyR, y); Str(bodyR, " m "); ContString(s, fname) END String; ÿÿÿÿ€8ÀÔ4 ÿÿÿ€8ÀÔ#Syntax10.Scn.FntÒÒ BEGIN Int(bodyR, x + 1); Ch(bodyR, " "); Int(bodyR, y); Ch(bodyR, " "); Int(bodyR, w - 1); Ch(bodyR, " "); Int(bodyR, h - 1); Ch(bodyR, " "); Int(bodyR, col); Str(bodyR, " b"); Ln(bodyR) END ReplPattern; ÿÿÿÿ€8ÀÔ??úÿÿ€8ÀÔQSyntax10.Scn.FntSyntax10i.Scn.Fnt2¬*gq (** written for Linz pictures, RLI, 08 Oct 1997 *) VAR xx, yy, r, g, b: INTEGER; p: Pictures.Picture; ch: CHAR; BEGIN p := SYSTEM.VAL(Pictures.Picture, adr); Str(bodyR, "/origstate save def"); Ln(bodyR); Str(bodyR, "20 dict begin"); Ln(bodyR); Int(bodyR, x); Ch(bodyR, " "); Int(bodyR, y); Str(bodyR, " translate"); Ln(bodyR); Str(bodyR, "/grays "); Int(bodyR, p.width); Str(bodyR, " string def"); Ln(bodyR); Str(bodyR, "/npixls 0 def"); Ln(bodyR); Str(bodyR, "/rgbindx 0 def"); Ln(bodyR); Str(bodyR, "/pix "); Int(bodyR, p.width * 3); Str(bodyR, " string def"); Ln(bodyR); Int(bodyR, w); Ch(bodyR, " "); Int(bodyR, h); Str(bodyR, " scale"); Ln(bodyR); Int(bodyR, p.width); Ch(bodyR, " "); Int(bodyR, p.height); Str(bodyR, " 8"); Ln(bodyR); Ch(bodyR, "["); Int(bodyR, p.width); Str(bodyR, " 0 0 "); Int(bodyR, - p.height); Str(bodyR, " 0 "); Int(bodyR, p.height); Ch(bodyR, "]"); Ln(bodyR); Str(bodyR, "{currentfile pix readhexstring pop}"); Ln(bodyR); Str(bodyR, "false 3 colorimage"); Ln(bodyR); FOR yy := p.height - 1 TO 0 BY - 1 DO FOR xx := 0 TO p.width - 1 DO p.GetPixelRGB(xx, yy, r, g, b); ch := CHR(r); Hex2(bodyR, ch); ch := CHR(g); Hex2(bodyR, ch); ch := CHR(b); Hex2(bodyR, ch) END; Ln(bodyR) END; (* Str(bodyR, "showpage"); Ln(bodyR); *) Str(bodyR, "end"); Ln(bodyR); Str(bodyR, "origstate restore"); Ln(bodyR); Ln(bodyR) END Picture; ÿÿÿÿ€8ÀÔ)<ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt¢¢ BEGIN Int(bodyR, x0); Ch(bodyR, " "); Int(bodyR, y0); Ch(bodyR, " "); Int(bodyR, r); Ch(bodyR, " "); Int(bodyR, r); Str(bodyR, " c"); Ln(bodyR) END Circle; ÿÿÿÿ€8ÀÔ-;ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt££ BEGIN Int(bodyR, x0); Ch(bodyR, " "); Int(bodyR, y0); Ch(bodyR, " "); Int(bodyR, a); Ch(bodyR, " "); Int(bodyR, b); Str(bodyR, " c"); Ln(bodyR) END Ellipse; ÿÿÿÿ€8ÀÔ,2ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt¬¬ BEGIN Int(bodyR, x0); Ch(bodyR, " "); Int(bodyR, y0); Ch(bodyR, " "); Int(bodyR, x1 - x0); Ch(bodyR, " "); Int(bodyR, y1 - y0); Str(bodyR, " x"); Ln(bodyR) END Line; ÿÿÿÿ€8ÀÔ2Ëþÿÿ€8ÀÔ#Syntax10.Scn.Fnt BEGIN IF (red # curR) OR (green # curG) OR (blue # curB) THEN curR := red; curG := green; curB := blue; Int(bodyR, curR); Str(bodyR, " 255 div "); Int(bodyR, curG); Str(bodyR, " 255 div "); Int(bodyR, curB); Str(bodyR, " 255 div u"); Ln(bodyR) END END UseColor; ÿÿÿÿ€8ÀÔC«üÿÿ€8ÀÔ?Syntax10.Scn.Fnt#Syntax10i.Scn.FntF` #d*  VAR i: INTEGER; dum: REAL; BEGIN (*a, b, c of tri-diag matrix T; solve Ty' = y for y', assign y' to y*) i := 1; dum := 0; (* WHILE i < n DO y[i] := y[i] - c[i-1]*y[i-1]; INC(i) END ; too complex for Intel compiler WS*) WHILE i < n DO y[i] := dum - c[i - 1] * y[i - 1]; y[i] := dum; INC(i) END ; i := n - 1; y[i] := y[i] / a[i]; (* WHILE i > 0 DO DEC(i); y[i] := (y[i] - b[i]*y[i+1])/a[i] END; too complex for Intel compiler WS*) WHILE i > 0 DO DEC(i); dum := (y[i] - b[i] * y[i + 1]) / a[i]; y[i] := dum END END SolveTriDiag; ÿÿÿÿ€8ÀÔ>oýÿÿ€8ÀÔCSyntax10.Scn.Fnt<Syntax10i.Scn.Fnt÷O VAR i: INTEGER; d1, d2: REAL; a, b, c: RealVector; BEGIN (*from x, y compute d = y'*) b[0] := 1.0 / (x[1] - x[0]); a[0] := 2.0 * b[0]; c[0] := b[0]; d1 := (y[1] - y[0]) * 3.0 * b[0] * b[0]; d[0] := d1; i := 1; WHILE i < n - 1 DO b[i] := 1.0 / (x[i + 1] - x[i]); a[i] := 2.0 * (c[i - 1] + b[i]); c[i] := b[i]; d2 := (y[i + 1] - y[i]) * 3.0 * b[i] * b[i]; d[i] := d1 + d2; d1 := d2; INC(i) END ; a[i] := 2.0 * b[i - 1]; d[i] := d1; i := 0; WHILE i < n - 1 DO c[i] := c[i] / a[i]; a[i + 1] := a[i + 1] - c[i] * b[i]; INC(i) END ; SolveTriDiag(a, b, c, d, n) END OpenSpline; ÿÿÿÿ€8ÀÔ@$üÿÿ€8ÀÔCSyntax10.Scn.FntGSyntax10i.Scn.Fnt7š VAR i: INTEGER; d1, d2, hn, dn: REAL; a, b, c, w: RealVector; BEGIN (*from x, y compute d = y'*) hn := 1.0 / (x[n - 1] - x[n - 2]); dn := (y[n - 1] - y[n - 2]) * 3.0 * hn * hn; b[0] := 1.0 / (x[1] - x[0]); a[0] := 2.0 * b[0] + hn; c[0] := b[0]; d1 := (y[1] - y[0]) * 3.0 * b[0] * b[0]; d[0] := dn + d1; w[0] := 1.0; i := 1; WHILE i < n - 2 DO b[i] := 1.0 / (x[i + 1] - x[i]); a[i] := 2.0 * (c[i - 1] + b[i]); c[i] := b[i]; d2 := (y[i + 1] - y[i]) * 3.0 * b[i] * b[i]; d[i] := d1 + d2; d1 := d2; w[i] := 0; INC(i) END ; a[i] := 2.0 * b[i - 1] + hn; d[i] := d1 + dn; w[i] := 1.0; i := 0; WHILE i < n - 2 DO c[i] := c[i] / a[i]; a[i + 1] := a[i + 1] - c[i] * b[i]; INC(i) END ; SolveTriDiag(a, b, c, d, n - 1); SolveTriDiag(a, b, c, w, n - 1); d1 := (d[0] + d[i]) / (w[0] + w[i] + x[i + 1] - x[i]); i := 0; WHILE i < n - 1 DO d[i] := d[i] - d1 * w[i]; INC(i) END ; d[i] := d[0] END ClosedSpline; ÿÿÿÿ€8ÀÔ3:ýÿÿ€8ÀÔ#Syntax10.Scn.Fnt¤¤ VAR x0, y0, x1, y1, x2, y2, x3, y3: REAL; BEGIN x0 := p.d; y0 := q.d; x1 := x0 + p.c * lim / 3.0; y1 := y0 + q.c * lim / 3.0; x2 := x1 + (p.c + p.b * lim) * lim / 3.0; y2 := y1 + (q.c + q.b * lim) * lim / 3.0; x3 := x0 + (p.c + (p.b + p.a * lim) * lim) * lim; y3 := y0 + (q.c + (q.b + q.a * lim) * lim) * lim; Int(bodyR, ENTIER(x1)); Ch(bodyR, " "); Int(bodyR, ENTIER(y1)); Ch(bodyR, " "); Int(bodyR, ENTIER(x2)); Ch(bodyR, " "); Int(bodyR, ENTIER(y2)); Ch(bodyR, " "); Int(bodyR, ENTIER(x3)); Ch(bodyR, " "); Int(bodyR, ENTIER(y3)); Ch(bodyR, " "); Int(bodyR, ENTIER(x0)); Ch(bodyR, " "); Int(bodyR, ENTIER(y0)); Str(bodyR, " z"); Ln(bodyR) END PrintPoly; ÿÿÿÿ€8ÀÔK1ûÿÿ€8ÀÔ_Syntax10.Scn.Fnt[Syntax10i.Scn.Fnt_-÷aq VAR i: INTEGER; dx, dy, ds: REAL; x, xd, y, yd, s: RealVector; p, q: PolyVector; BEGIN (*from u, v compute x, y, s*) x[0] := X[0] + x0; y[0] := Y[0] + y0; s[0] := 0; i := 1; WHILE i < n DO x[i] := X[i] + x0; dx := x[i] - x[i - 1]; y[i] := Y[i] + y0; dy := y[i] - y[i - 1]; s[i] := ABS(dx) + ABS(dy) + s[i - 1]; INC(i) END ; IF open = 1 THEN OpenSpline(s, x, xd, n); OpenSpline(s, y, yd, n) ELSE ClosedSpline(s, x, xd, n); ClosedSpline(s, y, yd, n) END ; (*compute coefficients from x, y, xd, yd, s*) i := 0; WHILE i < n - 1 DO ds := 1.0 / (s[i + 1] - s[i]); dx := (x[i + 1] - x[i]) * ds; p[i].a := ds * ds * (xd[i] + xd[i + 1] - 2.0 * dx); p[i].b := ds * (3.0 * dx - 2.0 * xd[i] - xd[i + 1]); p[i].c := xd[i]; p[i].d := x[i]; p[i].t := s[i]; dy := ds * (y[i + 1] - y[i]); q[i].a := ds * ds * (yd[i] + yd[i + 1] - 2.0 * dy); q[i].b := ds * (3.0 * dy - 2.0 * yd[i] - yd[i + 1]); q[i].c := yd[i]; q[i].d := y[i]; q[i].t := s[i]; INC(i) END ; p[i].t := s[i]; q[i].t := s[i]; (*print polynomials*) i := 0; WHILE i < n - 1 DO PrintPoly(p[i], q[i], p[i + 1].t - p[i].t); INC(i) END END Spline; ÿÿÿÿ€8ÀÔ'êþÿÿ€8ÀÔ#Syntax10.Scn.Fntôô BEGIN curR := 0; curG := 0; curB := 0; Int(bodyR, nofcopies); Str(bodyR, " p"); Ln(bodyR); INC(pno); ppos := Files.Pos(bodyR); actFont := ""; Str(bodyR, "%%Page: 0 "); Int(bodyR, pno); plen := Files.Pos(bodyR) - ppos; Ln(bodyR) END Page; ÿÿÿÿ€8ÀÔ:Íøÿÿ€8ÀÔ_Syntax10.Scn.Fnt6Syntax10i.Scn.Fnt å b 7Õ VAR printFont: ARRAY 64 OF CHAR; j: INTEGER; BEGIN (* Plain *) COPY(fm.printFont, printFont); Ch(r, "/"); Str(r, printFont); Str(r, " findfont"); Ln(r); Str(r, "dup length dict begin"); Ln(r); Str(r, "{1 index /FID ne {def} {pop pop} ifelse} forall"); Ln(r); Str(r, "/Encoding OEncoding def"); Ln(r); Str(r, "currentdict"); Ln(r); Str(r, "end"); Ln(r); IF printFont[0] = "(" THEN Strings.Insert("O", 1, printFont) ELSE Strings.Insert("O", 0, printFont) END; Str(r, "/"); Str(r, printFont); Str(r, " exch definefont pop"); Ln(r); Ln(r); (* italic *) COPY(fm.printFont, printFont); IF printFont[0] = '(' THEN j := - 1 ELSE j := 0 END; Strings.Insert("-Oblique", Strings.Length(printFont) - j, printFont); Ch(r, "/"); Str(r, printFont); Str(r, " findfont"); Ln(r); Str(r, "dup length dict begin"); Ln(r); Str(r, "{1 index /FID ne {def} {pop pop} ifelse} forall"); Ln(r); Str(r, "/Encoding OEncoding def"); Ln(r); Str(r, "currentdict"); Ln(r); Str(r, "end"); Ln(r); IF printFont[0] = "(" THEN Strings.Insert("O", 1, printFont) ELSE Strings.Insert("O", 0, printFont) END; Str(r, "/"); Str(r, printFont); Str(r, " exch definefont pop"); Ln(r); Ln(r); (* bold *) COPY(fm.printFont, printFont); Strings.Insert("-Bold", Strings.Length(printFont) - j, printFont); Ch(r, "/"); Str(r, printFont); Str(r, " findfont"); Ln(r); Str(r, "dup length dict begin"); Ln(r); Str(r, "{1 index /FID ne {def} {pop pop} ifelse} forall"); Ln(r); Str(r, "/Encoding OEncoding def"); Ln(r); Str(r, "currentdict"); Ln(r); Str(r, "end"); Ln(r); IF printFont[0] = "(" THEN Strings.Insert("O", 1, printFont) ELSE Strings.Insert("O", 0, printFont) END; Str(r, "/"); Str(r, printFont); Str(r, " exch definefont pop"); Ln(r); Ln(r) END DefineFont; ÿÿÿÿ€8ÀÔÿÿÿÿ€8ÀÔÍ:ÿÿÿÿ€8ÀÔ äýÿÿ€8ÀÔ#Syntax10.Scn.Fntúú BEGIN PrinterDriver.Open := Open; PrinterDriver.UseListFont := UseListFont; PrinterDriver.ReplConst := ReplConst; PrinterDriver.ContString := ContString; PrinterDriver.String := String; PrinterDriver.ReplPattern := ReplPattern; PrinterDriver.Picture := Picture; PrinterDriver.Circle := Circle; PrinterDriver.Ellipse := Ellipse; PrinterDriver.Line := Line; PrinterDriver.UseColor := UseColor; PrinterDriver.Spline := Spline; PrinterDriver.Page := Page; PrinterDriver.Close := Close END Init; ÿÿÿÿ€8ÀÔ  kÿÿÿ€8ÀÔ#Syntax10.Scn.Fntss VAR name: Name; BEGIN In.Open; In.Name(name); IF In.Done THEN COPY(name, headerFileName) END END SetHeader; ÿÿÿÿ€8ÀÔÿÿÿÿ€8ÀÔƒ=ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt¡¡REPEAT REPEAT Texts.Scan(s) UNTIL s.eot OR (s.class = Texts.Char) & (s.c = '['); Texts.Scan(s) UNTIL s.eot OR ((s.class = Texts.Name) & (s.s = "PSFonts")); ÿÿÿÿ€8ÀÔ"µ<aÿÿÿÿ€8ÀÔ„ÿÿÿ€8ÀÔ#Syntax10.Scn.FntZZ headerFileName := defaultHeaderFileName; hexArray := "0123456789ABCDEF"; LoadFontMap; ÿÿÿÿ€8ÀÔ ¹MODULE PS;  IMPORT SYSTEM, PrinterDriver, Files, In, Pictures, Strings, Fonts, Texts, Console; CONST N = 20; maxFonts = 64; defaultHeaderFileName = "Oberon.Header.ps"; TYPE Name = ARRAY 32 OF CHAR; RealVector = ARRAY N OF REAL; Poly = RECORD a, b, c, d, t: REAL END ; PolyVector = ARRAY N OF Poly; FontMap* = RECORD fontName-: ARRAY 32 OF CHAR; printFont-: ARRAY 64 OF CHAR; afmFileName-: ARRAY 3, 256 OF CHAR (* plain ... 0, italic ... 1, bold ... 2 *) END; VAR headerFileName, printFileName: Name; listFont: Name; headerF, bodyF: Files.File; bodyR: Files.Rider; pno, ppos, plen: LONGINT; hexArray: ARRAY 17 OF CHAR; curR, curG, curB: INTEGER; actFont: ARRAY 32 OF CHAR; fontMap-: ARRAY maxFonts OF FontMap; fontMapEntries-: INTEGER; (* -- Output procedures -- *) PROCEDURE Ch (VAR R: Files.Rider; ch: CHAR);  PROCEDURE Str (VAR R: Files.Rider; s: ARRAY OF CHAR);  PROCEDURE Int (VAR R: Files.Rider; i: LONGINT);  PROCEDURE Hex (VAR R: Files.Rider; i: INTEGER);  PROCEDURE Hex2 (VAR R: Files.Rider; ch: CHAR);  PROCEDURE Ln (VAR R: Files.Rider);  (* -- Printing Procedures -- *) PROCEDURE Open (tmpFileName: ARRAY OF CHAR);  PROCEDURE UseListFont (VAR name: ARRAY OF CHAR);  PROCEDURE ReplConst (x, y, w, h: INTEGER);  PROCEDURE GetMapFont (fontName: ARRAY OF CHAR; VAR printFont: ARRAY OF CHAR);  VAR i: INTEGER; BEGIN i := 0; COPY("", printFont); WHILE (i < fontMapEntries) & (fontMap[i].fontName # fontName) DO INC(i) END; ASSERT(fontMap[i].fontName = fontName); (* if this assertion fails the font mapping is missing *) COPY(fontMap[i].printFont, printFont) END GetMapFont;  PROCEDURE ContString (VAR s, fname: ARRAY OF CHAR);  VAR i, j, n: INTEGER; ch: CHAR; fontName: ARRAY 32 OF CHAR; fontSize, len: INTEGER; variant: CHAR; printFont: ARRAY 256 OF CHAR; BEGIN IF fname = listFont THEN fontName := "Courier8.Scn.Fnt" ELSE COPY (fname, fontName) END; IF actFont # fname THEN COPY(fname, actFont); COPY(fname, fontName); Remove .Scn.Fnt from fontName; len := Strings.Length(fontName); i := len - 1; Get font variant m, b, i or ' ', and cut it from fontName Get fontSize from fontName, and cut it from fontName GetMapFont(fontName, printFont); IF variant # ' ' THEN IF printFont[0] = '(' THEN j := - 1 ELSE j := 0 END; IF variant = 'b' THEN Strings.Insert("-Bold", Strings.Length(printFont) - j, printFont) ELSIF variant = 'i' THEN Strings.Insert("-Oblique", Strings.Length(printFont) - j, printFont) ELSE Console.Str("Warning unknown font variant: "); Console.Ch(variant) END END; IF printFont[0] = "(" THEN Strings.Insert("O", 1, printFont) ELSE Strings.Insert("O", 0, printFont) END; Ch(bodyR, "/"); Str(bodyR, printFont); Str(bodyR, " findfont "); Int(bodyR, fontSize * 36 DIV 10); Str(bodyR, " scalefont "); Str(bodyR, "setfont"); Ln(bodyR) END; Ch(bodyR, "("); i := 0; ch := s[0]; WHILE ch # 0X DO CASE ch OF | "(", ")", "\": Ch(bodyR, "\"); Ch(bodyR, ch); | 9X: Str(bodyR, " "); (* or Str("\tab") *) | 80X..95X, 0ABX: Str(bodyR, "\2"); n := ORD(ch) - 128; Ch(bodyR, CHR(n DIV 8 + 48)); Ch(bodyR, CHR(n MOD 8 + 48)) ELSE IF (ORD(ch) >= 32) & (ORD(ch) < 127) THEN Ch(bodyR, ch) ELSE Ch(bodyR, "\"); Ch(bodyR, CHR((ORD(ch) DIV 64) MOD 8 + ORD("0"))); Ch(bodyR, CHR((ORD(ch) DIV 8) MOD 8 + ORD("0"))); Ch(bodyR, CHR(ORD(ch) MOD 8 + ORD("0"))) END END ; INC(i); ch := s[i] END; Str(bodyR, ") s"); Ln(bodyR) END ContString;  PROCEDURE String (x, y: INTEGER; VAR s, fname: ARRAY OF CHAR);  PROCEDURE ReplPattern (x, y, w, h, col: INTEGER);  PROCEDURE Picture (x, y, w, h, mode: INTEGER; adr: LONGINT);  PROCEDURE Circle (x0, y0, r: INTEGER);  PROCEDURE Ellipse (x0, y0, a, b: INTEGER);  PROCEDURE Line (x0, y0, x1, y1: INTEGER);  PROCEDURE UseColor (red, green, blue: INTEGER);  (* -- Spline computation -- *) PROCEDURE SolveTriDiag (VAR a, b, c, y: RealVector; n: INTEGER);  PROCEDURE OpenSpline (VAR x, y, d: RealVector; n: INTEGER);  PROCEDURE ClosedSpline (VAR x, y, d: RealVector; n: INTEGER);  PROCEDURE PrintPoly (VAR p, q: Poly; lim: REAL);  PROCEDURE Spline (x0, y0, n, open: INTEGER; VAR X, Y: ARRAY OF INTEGER);  PROCEDURE Page (nofcopies: INTEGER);  PROCEDURE DefineFont (fm: FontMap; VAR r: Files.Rider);  PROCEDURE Close;  CONST bufSize = 4*1024; VAR printF: Files.File; printR, srcR: Files.Rider; buffer: ARRAY bufSize OF SYSTEM.BYTE; i: INTEGER; BEGIN Str(bodyR, "OberonClose"); Ln(bodyR); Files.Set(bodyR, bodyF, ppos); (*overwrite last %%Page line*) Str(bodyR, "%%Trailer"); DEC(plen, 9); WHILE plen > 0 DO Ch(bodyR, " "); DEC(plen) END; printF := Files.New(printFileName); Files.Set(printR, printF, 0); Str(printR, "%!PS-Adobe- minimal conforming"); Ln(printR); Str(printR, "%%Creator: Linux-Oberon"); Ln(printR); Str(printR, "%"); Ln(printR); Str(printR, "% J. Templ, 1990, 1991, 1992"); Ln(printR); Str(printR, "% J. Supcik, 1994"); Ln(printR); Str(printR, "%"); Ln(printR); Files.Set(srcR, headerF, 0); Files.ReadBytes(srcR, buffer, bufSize); WHILE ~srcR.eof DO Files.WriteBytes(printR, buffer, bufSize); Files.ReadBytes(srcR, buffer, bufSize) END; IF srcR.res # bufSize THEN Files.WriteBytes(printR, buffer, bufSize - srcR.res) END; FOR i := 0 TO fontMapEntries - 1 DO DefineFont(fontMap[i], printR) END; Ln(printR); Str(printR, "OberonInit"); Ln(printR); Str(printR, "save"); Ln(printR); Ln(printR); Str(printR, "%%EndProlog"); Ln(printR); Ln(printR); Str(printR, "%%Page: 0 1"); Ln(printR); Files.Set(srcR, bodyF, 0); Files.ReadBytes(srcR, buffer, bufSize); WHILE ~srcR.eof DO Files.WriteBytes(printR, buffer, bufSize); Files.ReadBytes(srcR, buffer, bufSize) END; IF srcR.res # bufSize THEN Files.WriteBytes(printR, buffer, bufSize - srcR.res) END; Files.Register(printF); Files.Set(bodyR, NIL, 0); headerF := NIL; bodyF := NIL; printF := NIL END Close;  PROCEDURE Init*;  PROCEDURE SetHeader*;  PROCEDURE LoadFontMap;  VAR t: Texts.Text; s: Texts.Scanner; i: INTEGER; BEGIN NEW(t); Texts.Open(t, Fonts.mapFileName); Texts.OpenScanner(s, t, 0); Search for [PSFonts] IF ~s.eot THEN Texts.Scan(s); (* read ']' *) i := 0; WHILE ~s.eot & (i < maxFonts) DO Texts.Scan(s); COPY(s.s, fontMap[i].fontName); Texts.Scan(s); COPY(s.s, fontMap[i].printFont); IF s.class = Texts.String THEN (* put (...) around in case there are blanks in font-name *) Strings.Insert("(", 0, fontMap[i].printFont); Strings.Append(")", fontMap[i].printFont) END; Texts.Scan(s); COPY(s.s, fontMap[i].afmFileName[0]); Texts.Scan(s); COPY(s.s, fontMap[i].afmFileName[1]); Texts.Scan(s); COPY(s.s, fontMap[i].afmFileName[2]); IF ~s.eot THEN INC(i) END END; fontMapEntries := i END END LoadFontMap;  BEGIN END PS.