DIRECTORY Char USING [Make], Convert USING [AppendInt], Imager USING [Error], ImagerFont USING [Escapement, Extents, Find, FontBoundingBox, RopeEscapement, VEC], Real USING [Round], RefText USING [AppendChar, AppendRope, ObtainScratch, ReleaseScratch, TrustTextAsRope], Rope USING [ROPE], SimpleFeedback USING [Append, PutFL], UserProfile USING [Number, Token], VFonts USING [DefaultFont, defaultFont, ErrorCode, Font]; VFontsImpl: CEDAR PROGRAM IMPORTS Char, Convert, Imager, ImagerFont, Real, RefText, SimpleFeedback, UserProfile, VFonts EXPORTS VFonts ~ BEGIN OPEN VFonts; VEC: TYPE ~ ImagerFont.VEC; ROPE: TYPE = Rope.ROPE; Error: PUBLIC ERROR [code: VFonts.ErrorCode] ~ CODE; defaultFont: PUBLIC VFonts.Font ¬ NIL; EstablishFont: PUBLIC PROC [family: ROPE, size: CARDINAL, bold: BOOL ¬ FALSE, italic: BOOL ¬ FALSE, defaultOnFailure: BOOL ¬ TRUE ] RETURNS [font: Font ¬ NIL] ~ { scratch: REF TEXT ~ RefText.ObtainScratch[100]; text: REF TEXT ¬ scratch; text ¬ RefText.AppendRope[text, "Xerox/TiogaFonts/"]; text ¬ RefText.AppendRope[text, family]; text ¬ Convert.AppendInt[text, size]; IF bold THEN text ¬ RefText.AppendChar[text, 'B]; IF italic THEN text ¬ RefText.AppendChar[text, 'I]; font ¬ ImagerFont.Find[RefText.TrustTextAsRope[text], substituteQuietly ! Imager.Error => IF defaultOnFailure THEN CONTINUE]; IF font=NIL THEN font ¬ defaultFont; RefText.ReleaseScratch[scratch]; }; CharWidth: PUBLIC PROC [char: CHAR, font: Font ¬ NIL] RETURNS [NAT] ~ { width: VEC ~ ImagerFont.Escapement[DefaultFont[font], Char.Make[set: 0, code: ORD[char]]]; RETURN[Real.Round[width.x]]; }; StringWidth: PUBLIC PROC [string: ROPE, font: Font ¬ NIL] RETURNS [NAT] ~ { width: VEC ~ ImagerFont.RopeEscapement[DefaultFont[font], string]; RETURN[Real.Round[width.x]]; }; FontHeight: PUBLIC PROC [font: Font ¬ NIL] RETURNS [NAT] ~ { extents: ImagerFont.Extents ~ ImagerFont.FontBoundingBox[DefaultFont[font]]; RETURN[Real.Round[extents.descent+extents.ascent]]; }; FontAscent: PUBLIC PROC [font: Font ¬ NIL] RETURNS [NAT] ~ { extents: ImagerFont.Extents ~ ImagerFont.FontBoundingBox[DefaultFont[font]]; RETURN[Real.Round[extents.ascent]]; }; CreateDefaultFont: PROC ~ { family: ROPE ~ UserProfile.Token["Viewers.DefaultFontFamily", "Tioga"]; size: INT ~ UserProfile.Number["Viewers.DefaultFontSize", 10]; err: BOOL ¬ FALSE; defaultFont ¬ EstablishFont[family: family, size: size, defaultOnFailure: FALSE ! Imager.Error => { err ¬ TRUE; CONTINUE }]; IF err THEN { err ¬ FALSE; SimpleFeedback.PutFL[$Viewers, begin, $Error, "VFonts: unable to establish %g %g as default font. Trying to substitute Tioga 10 ... ", LIST[[rope[family]], [integer[size]]] ]; defaultFont ¬ EstablishFont[family: "Tioga", size: 10, defaultOnFailure: FALSE ! Imager.Error => { err ¬ TRUE; CONTINUE }]; IF err THEN { SimpleFeedback.Append[$Viewers, end, $Error, "failed. Raising ERROR."]; ERROR; } ELSE SimpleFeedback.Append[$Viewers, end, $Error, "ok."]; }; }; CreateDefaultFont[]; END. n VFontsImpl.mesa Copyright Σ 1984, 1985, 1986, 1987, 1991 by Xerox Corporation. All rights reserved. Russ Atkinson (RRA) June 19, 1985 2:03:52 pm PDT Doug Wyatt, January 23, 1987 1:41:07 pm PST Bier, August 9, 1990 11:32 am PDT Michael Plass, September 27, 1991 1:31 pm PDT Willie-s, October 14, 1991 12:55 pm PDT substitute Tioga10 for user's failed choice Κώ–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ ΟeœI™TK™0K™+K™!K™-K™'—K˜šΟk ˜ Kšœžœ˜Kšœžœ ˜Kšœžœ ˜Kšœ žœ>žœ˜SKšœžœ ˜KšœžœJ˜WKšœžœžœ˜Kšœžœ˜%Kšœ žœ˜"Kšœžœ-˜9—K˜šΠbl œžœž˜KšžœV˜]Kšžœ˜Kšœžœžœ˜—K˜Kšžœžœžœ˜Kšžœžœžœ˜K˜Kšœžœžœžœ˜4K˜Kšœ žœžœ˜&K˜šΟn œžœžœ žœžœ žœžœ žœžœžœžœžœžœ˜£Kšœ žœžœ˜/Kšœžœžœ ˜Kšœ5˜5Kšœ(˜(Kšœ%˜%Kšžœžœ%˜1Kšžœžœ%˜3šœI˜IKšœžœžœžœ˜3—Kšžœžœžœ˜$Kšœ ˜ K˜K˜—K˜š  œžœžœžœžœžœžœ˜GKšœžœDžœ ˜ZKšžœ˜Kšœ˜K˜—š  œžœžœ žœžœžœžœ˜KKšœžœ8˜BKšžœ˜Kšœ˜K˜—š   œžœžœžœžœžœ˜Kšœžœžœ˜šœJžœ˜QKšœžœžœ˜*—šžœžœ˜ Kšœ+™+Kšœžœ˜ Kšœˆžœ$˜°šœIžœ˜PKšœžœžœ˜*—šžœžœ˜ KšœH˜HKšžœ˜K˜—Kšžœ5˜9K˜—Kšœ˜K˜—K˜K˜Kšžœ˜—…— ˜