DIRECTORY Basics USING [UnsafeBlock], ImagerBox USING [Box], ImagerPath USING [CurveToProc, LineToProc, MoveToProc], ImagerTransformation USING [Transformation], IO USING [STREAM], Prop USING [PropList], RefTab USING [Ref], Rope USING [ROPE], Vector2 USING [VEC]; Type1Font: CEDAR DEFINITIONS ~ BEGIN ROPE: TYPE ~ Rope.ROPE; VEC: TYPE ~ Vector2.VEC; Key: TYPE ~ REF KeyRep; KeyRep: TYPE ~ RECORD [r: CARD16]; Decrypt1: PROC [key: Key, char: CHAR] RETURNS [CHAR]; Source: TYPE ~ REF SourceRep; SourceRep: TYPE ~ RECORD [ stream: IO.STREAM, -- input stream buffer: REF TEXT, cipher: {plain, binary, hex} ¬ plain, key: Key ¬ NIL, putBack: BOOL ¬ FALSE, putBackChar: CHAR ¬ 0C ]; GetChar: PROC [s: Source] RETURNS [CHAR]; PutBack: PROC [s: Source, c: CHAR]; TokenType: TYPE ~ {null, int, radix, real, string, name, special}; Token: TYPE ~ RECORD [type: TokenType, text: REF TEXT, literal: BOOL ¬ FALSE]; GetToken: PROC [s: Source] RETURNS [Token]; GetKeyword: PROC [s: Source] RETURNS [ATOM]; BeginEExec: PROC [s: Source]; CharString: TYPE ~ RECORD [data: REF, getBlock: PROC [REF] RETURNS [Basics.UnsafeBlock]]; BlockFromCharString: PROC [cs: CharString] RETURNS [Basics.UnsafeBlock] ~ INLINE { RETURN cs.getBlock[cs.data] }; Cmd1: TYPE ~ MACHINE DEPENDENT { hstem(1), vstem(3), vmoveto(4), rlineto(5), hlineto(6), vlineto(7), rrcurveto(8), closepath(9), callsubr(10), return(11), escape(12), hsbw(13), endchar(14), rmoveto(21), hmoveto(22), vhcurveto(30), hvcurveto(31) }; Cmd2: TYPE ~ MACHINE DEPENDENT { dotsection(0), vstem3(1), hstem3(2), seac(6), sbw(7), div(12), callothersubr(16), pop(17), setcurrentpoint(33), (255) }; DecodeCharString: PROC [block: Basics.UnsafeBlock, lenIV: NAT, int: PROC [INT], cmd1: PROC [Cmd1], cmd2: PROC [Cmd2]]; EncodingArray: TYPE ~ REF EncodingArrayRep; EncodingArrayRep: TYPE ~ ARRAY CHAR OF ATOM; theStandardEncoding: READONLY EncodingArray; RealArray: TYPE ~ REF RealArrayRep; RealArrayRep: TYPE ~ RECORD [PACKED SEQUENCE length: NAT OF REAL]; Metrics2Dict: TYPE ~ RefTab.Ref; -- TABLE ATOM OF Metrics2Entry Metrics2Entry: TYPE ~ REF Metrics2EntryRep; Metrics2EntryRep: TYPE ~ RECORD [w, v: VEC]; -- c.f. section 5.6.2 of redbook Type1Data: TYPE ~ REF Type1DataRep; Type1DataRep: TYPE ~ RECORD [ data: REF ¬, CharStringsLength: PROC [self: Type1Data] RETURNS [NAT] ¬, CharStringsForAll: PROC [self: Type1Data, action: PROC [ATOM, CharString]] ¬, CharStringsKnown: PROC [self: Type1Data, name: ATOM] RETURNS [BOOL] ¬, CharStringsGet: PROC [self: Type1Data, name: ATOM] RETURNS [CharString] ¬, SubrsGet: PROC [self: Type1Data, n: NAT] RETURNS [CharString] ¬, FontName: ATOM ¬ NIL, version: ROPE ¬ NIL, Notice: ROPE ¬ NIL, FullName: ROPE ¬ NIL, FamilyName: ROPE ¬ NIL, Weight: ROPE ¬ NIL, ItalicAngle: REAL ¬ 0, isFixedPitch: BOOL ¬ FALSE, UnderlinePosition: REAL ¬ 0, UnderlineThickness: REAL ¬ 0, Encoding: EncodingArray ¬ NIL, FontMatrix: ImagerTransformation.Transformation ¬ NIL, FontBBox: ImagerBox.Box ¬ [0, 0, 0, 0], WeightVector: RealArray ¬ NIL, PaintType: INT ¬ 0, FontType: INT ¬ 0, UniqueID: INT ¬ 0, StrokeWidth: REAL ¬ 0, Metrics2: Metrics2Dict ¬ NIL, BlueValues: RealArray ¬ NIL, OtherBlues: RealArray ¬ NIL, FamilyBlues: RealArray ¬ NIL, FamilyOtherBlues: RealArray ¬ NIL, BlueScale: REAL ¬ defaultBlueScale, BlueShift: REAL ¬ defaultBlueShift, BlueFuzz: REAL ¬ defaultBlueFuzz, StdHW: REAL ¬ 0, StdVW: REAL ¬ 0, StemSnapH: RealArray ¬ NIL, StemSnapV: RealArray ¬ NIL, ForceBold: BOOL ¬ FALSE, LanguageGroup: INT ¬ 0, password: INT ¬ 0, lenIV: INT ¬ defaultLenIV, RndStemUp: BOOL ¬ FALSE, propList: Prop.PropList ¬ NIL ]; defaultBlueScale: REAL ~ 0.039625; defaultBlueShift: REAL ~ 7.0; defaultBlueFuzz: REAL ~ 1.0; defaultLenIV: INT ~ 4; InvalidFont: ERROR; ParseFont: PROC [IO.STREAM] RETURNS [Type1Data]; MoveToProc: TYPE ~ ImagerPath.MoveToProc; LineToProc: TYPE ~ ImagerPath.LineToProc; CurveToProc: TYPE ~ ImagerPath.CurveToProc; FlexArray: TYPE ~ ARRAY [0..7) OF VEC; FlexProc: TYPE ~ PROC [f: FlexArray, min: REAL]; CloseProc: TYPE ~ PROC; HStemProc: TYPE ~ PROC [y, dy: REAL]; HStem3Proc: TYPE ~ PROC [y0, dy0, y1, dy1, y2, dy2: REAL]; VStemProc: TYPE ~ PROC [x, dx: REAL]; VStem3Proc: TYPE ~ PROC [x0, dx0, x1, dx1, x2, dx2: REAL]; DiscardProc: TYPE ~ PROC; CharInfo: TYPE ~ RECORD [sb, w: VEC]; -- sidebearing and width ExecuteChar: PROC [self: Type1Data, name: ATOM, moveTo: MoveToProc, lineTo: LineToProc, curveTo: CurveToProc, flex: FlexProc ¬ NIL, close: CloseProc ¬ NIL, hstem: HStemProc ¬ NIL, hstem3: HStem3Proc ¬ NIL, vstem: VStemProc ¬ NIL, vstem3: VStem3Proc ¬ NIL, discard: DiscardProc ¬ NIL, origin: VEC ¬ [0, 0]] RETURNS [CharInfo]; END. * Type1Font.mesa Copyright Σ 1990, 1991, 1992, 1993 by Xerox Corporation. All rights reserved. Michael Plass, January 15, 1992 12:09 pm PST Doug Wyatt, April 30, 1993 1:41 pm PDT Decryption and Scanning CharString Interpretation Type1Data ExecuteChar See section 8.3 of the Type 1 Font Format book: f contains seven coordinate pairs: f[0] is the reference point (not the starting point!) f[1], f[2] are the middle control points of the first curve f[3] is the joining point f[4], f[5] are the middle control points of the second curve f[6] is the end point min is the flex height control parameter, in device units (not hundredths!) At small sizes, { curveTo[f[1],f[2],f[3]]; curveTo[f[4],f[5],f[6]] } becomes { lineTo[f[6]] } If flex is omitted, each flex section produces two calls on curveTo. Κ*–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ ΟeœB™MK™,K™&K˜—šΟk ˜ Kšœžœ˜Kšœ žœ˜Kšœ žœ'˜7Kšœžœ˜,Kšžœžœžœ˜Kšœžœ ˜Kšœžœ˜Kšœžœžœ˜Kšœžœžœ˜K˜—šΟn œžœž œž˜$K˜Kšžœžœžœ˜Kšžœžœ žœ˜—headšœ™Kšœžœžœ˜šœžœžœžœ˜"K˜—š Ÿœžœžœžœžœ˜5K˜—Kšœžœžœ ˜šœ žœžœ˜KšœžœžœΟc˜"Kšœžœžœ˜K˜%Kšœ žœ˜Kšœ žœžœ˜Kšœ žœ˜K˜K˜—šŸœžœ žœžœ˜)K˜—šŸœžœžœ˜#K˜—Kšœ žœ3˜Bš œžœžœžœžœ žœžœ˜NK˜—šŸœžœ žœ ˜+K˜—šŸ œžœ žœžœ˜,K˜—šŸ œžœ ˜K˜——šœ™š œ žœžœžœ žœžœžœ˜YK™—šŸœžœžœ˜GKšœžœžœ˜)K™—šœžœžœž œ˜ K˜ K˜ K˜ K˜ K˜ K˜ K˜ K˜ K˜ K˜ K˜ K˜ K˜ K˜ K˜ K˜K˜ K˜K˜—šœžœžœž œ˜ K˜K˜ K˜ K˜K˜K˜K˜K˜K˜K˜K˜K˜—šŸœžœ$žœžœžœ žœžœ ˜wK˜——šœ ™ Kšœžœžœ˜+š œžœžœžœžœžœ˜,K˜—šœžœ˜,K˜—Kšœ žœžœ˜#šœžœžœžœžœ žœžœžœ˜BK˜—Kš œžœ Πck ‘ ‘ ˜?Kšœžœžœ˜+šœžœžœžœ  ˜MK™—Kšœ žœžœ˜#šœžœžœ˜Kšœžœ˜ Kšœžœžœžœ˜:Kšœžœžœžœ˜MKš œžœžœžœžœ˜FKšœžœžœžœ˜JKšœ žœžœžœ˜@Kšœ žœžœ˜Kšœ žœžœ˜Kšœžœžœ˜Kšœ žœžœ˜Kšœ žœžœ˜Kšœžœžœ˜Kšœ žœ˜Kšœžœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœ2žœ˜6K˜'Kšœžœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜"Kšœ žœ˜#Kšœ žœ˜#Kšœ žœ˜!Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœ žœžœ˜Kšœžœ˜Kšœ žœ˜Kšœžœ˜Kšœ žœžœ˜Kšœž˜K˜K˜—Kšœžœ ˜"Kšœžœ˜Kšœžœ˜šœžœ˜K™—šŸ œžœ˜K˜—š Ÿ œžœžœžœžœ ˜0K˜——šœ ™ šœ žœ˜)K˜—šœ žœ˜)K˜—šœ žœ˜+K˜—š œ žœžœžœžœ˜&K˜—šœ žœžœžœ˜0™/™"K™5K™;K™K™K˜—šŸ œžœžœSžœžœžœžœžœžœžœ žœ žœ ˜ΚK™D—K˜—Kšžœ˜—…—.‚