<<>> <> <> <> <<>> DIRECTORY BasicTime USING [GMT], ImagerBox USING [Extents], ImagerFont USING [CorrectionType], ImagerTransformation USING [Transformation], ImagerTypeface USING [Typeface], IO USING [STREAM], Prop USING [PropList], RefTab USING [Ref], Rope USING [ROPE], Vector2 USING [VEC]; ImagerFDTypeface: CEDAR DEFINITIONS = BEGIN password: CARD32 = 19FD6A03H; -- the first four bytes of the file (big endian); low order byte is a version number. ROPE: TYPE = Rope.ROPE; VEC: TYPE = Vector2.VEC; Transformation: TYPE = ImagerTransformation.Transformation; Data: TYPE = REF DataRep; DataRep: TYPE = RECORD [ fontExtents: ImagerBox.Extents, commonLeftExtents: RealSeq, commonRightExtents: RealSeq, commonDescents: RealSeq, commonAscents: RealSeq, commonEscapements: RealSeq, charToDeviceTransformations: TransformationSeq, <> typefaceCellSeq: TypefaceCellSeq, placementTransformations: TransformationSeq, overflowCharInfoSeq: OverflowCharInfoSeq, charInfoRunSeq: CharInfoRunSeq, propList: Prop.PropList, transformationCache: RefTab.Ref, setTable: ARRAY CharSet OF CharRuns ¬ ALL[NIL] ]; RealCode: TYPE = BYTE; RealSeq: TYPE = REF RealSeqRep; RealSeqRep: TYPE = RECORD[SEQUENCE size: NAT OF REAL]; TransformationSeq: TYPE = REF TransformationSeqRep; TransformationSeqRep: TYPE = RECORD[SEQUENCE size: NAT OF Transformation]; CharSet: TYPE = BYTE; CharRuns: TYPE = REF CharRunsRep; -- non-overlapping runs, sorted by bc CharRunsRep: TYPE = RECORD [ link: CharRuns, -- self.link.bc > self.ec bc, ec: BYTE, s: SEQUENCE nt: NAT OF CharRunEntry -- indexed by easy Transformation code ]; CharRunEntry: TYPE = RECORD [ typefaceIndex: TypefaceIndex, charInfoRunIndex: CharInfoRunIndex ]; CharInfoRunIndex: TYPE = NAT; CharInfoRunSeq: TYPE = REF CharInfoRunSeqRep; CharInfoRunSeqRep: TYPE = RECORD [SEQUENCE size: NAT OF CharInfoRun]; CharInfoRun: TYPE = REF CharInfoRunRep; CharInfoRunRep: TYPE = RECORD [ xcCodeDelta: INT, -- Add to get translated code bits: AmplCorr, placementCode: CARDINAL, -- index into data.placementTransformations s: SEQUENCE size: NAT OF CharInfo <> ]; AmplCorr: TYPE = PACKED RECORD [ amplified: BOOL ¬ FALSE, correction: ImagerFont.CorrectionType ¬ mask ]; TypefaceIndex: TYPE = NAT; TypefaceCellSeq: TYPE = REF TypefaceCellSeqRep; TypefaceCellSeqRep: TYPE = RECORD [SEQUENCE size: NAT OF TypefaceCell]; TypefaceCell: TYPE = REF TypefaceCellRep; TypefaceCellRep: TYPE = RECORD [ fontName: ROPE, typeface: ImagerTypeface.Typeface ¬ NIL, createDate: BasicTime.GMT, -- for version checking against typeface.created type: ATOM -- for version checking against typeface.class.type ]; InfoRepTag: TYPE = MACHINE DEPENDENT {short(0), verbose(1), (255)}; CharInfo: TYPE = PACKED RECORD [ SELECT tag: InfoRepTag FROM short => [leftExtent, rightExtent, descent, ascent, escapementX, escapementY: RealCode], verbose => [overflowIndex: OverflowIndex], ENDCASE ]; OverflowIndex: TYPE = NAT; OverflowCharInfoSeq: TYPE = REF OverflowCharInfoSeqRep; OverflowCharInfoSeqRep: TYPE = RECORD [SEQUENCE size: NAT OF VerboseCharInfo]; VerboseCharInfo: TYPE = REF VerboseCharInfoRep; VerboseCharInfoRep: TYPE = RECORD [extents: ImagerBox.Extents, escapement: VEC, propList: Prop.PropList ¬ NIL]; FromStream: PROC [stream: IO.STREAM] RETURNS [Data]; FormatError: ERROR [diagnosis: ATOM, byteIndex: INT]; END.