<> <<>> <> <<>> <> <<>> <> <<(Written by Michael Plass, November 1, 1982 4:21 pm)>> <> <> DIRECTORY Real USING [MinusZero], Rope USING [ROPE], ImagerBasic USING [Pair, Transformation], Scaled USING [Value, unit, zero]; Font: CEDAR DEFINITIONS = BEGIN <> <<>> FONT: TYPE = REF FontRec; <<>> <> <> <> <> <> ROPE: TYPE = Rope.ROPE; RopeOrRefText: TYPE = REF; Pair: TYPE = ImagerBasic.Pair; -- RECORD[x, y: REAL] Transformation: TYPE = ImagerBasic.Transformation; Direction: TYPE = {right, up, left, down}; Box: TYPE = RECORD [xmin, ymin, xmax, ymax: REAL]; <> <<>> Create: PROC [fontName: RopeOrRefText, transformation: Transformation, deviceType: ATOM _ $Ideal] RETURNS [FONT]; <> <> CreateScaled: PROC [fontName: RopeOrRefText, scale: REAL, deviceType: ATOM _ $Ideal] RETURNS [FONT]; <> <<>> Name: PROC [font: FONT] RETURNS [fontName: ROPE]; <> <> <<>> Contains: PROC [font: FONT, char: CHAR] RETURNS [BOOLEAN]; <> NSCode: PROC [font: FONT, char: CHAR] RETURNS [nsCode: INT]; unassignedNSCode: INT = 255; nonexistentNSCode: INT = 65535; <> CharCode: PROC [font: FONT, nsCode: INT] RETURNS [char: CHAR]; <> <<>> <> <<>> <> NextCharacterDirection: PROC [font: FONT] RETURNS [Direction]; <> NextLineDirection: PROC [font: FONT] RETURNS [Direction]; <> FormattingBox: PROC [font: FONT, char: CHAR] RETURNS [Box]; <> Width: PROC [font: FONT, char: CHAR] RETURNS [REAL]; <> TextWidth: PROC [font: FONT, text: RopeOrRefText] RETURNS [REAL]; <> RoundedTextWidth: PROC [font: FONT, text: RopeOrRefText] RETURNS [INTEGER]; <> GetLigatureOrKern: PROC [font: FONT, char1, char2: CHAR] RETURNS [LigatureOrKern]; LigatureOrKern: TYPE = RECORD [ SELECT tag: * FROM neither => [], kern => [kernAmount: REAL], <> ligature => [ligatureCode: CHAR], ENDCASE]; RequestedTransformation: PROC [font: FONT] RETURNS [Transformation]; undefinedMetric: REAL = Real.MinusZero; Undefined: PROC [r: REAL] RETURNS [BOOLEAN] = INLINE {RETURN[r=undefinedMetric]}; FormattingMetric: PROC [font: FONT, metric: ATOM, char: CHAR _ '\000] RETURNS [REAL]; <> FormattingInfo: PROC [font: FONT, name: ATOM, char: CHAR _ '\000] RETURNS [REF]; <> <<>> <> <<>> <> BoundingBox: PROC [font: FONT, char: CHAR] RETURNS [Box]; <> FontBoundingBox: PROC [font: FONT] RETURNS [Box] <> = INLINE {RETURN [font.fontBoundingBox]}; WidthVector: PROC [font: FONT, char: CHAR] RETURNS [Pair]; <> ActualTransformation: PROC [font: FONT] RETURNS [Transformation]; <> <<>> <> FixedUnit: TYPE = Scaled.Value; FixedPoint: FixedUnit = Scaled.unit; <> WidthArray: TYPE = REF READONLY ARRAY CHAR OF FixedUnit; GetWidthArray: PROC [font: FONT, minimum, undefined: FixedUnit _ Scaled.zero] RETURNS [WidthArray]; <> <<>> <> BadFontFileFormat: ERROR; <<>> <> PressFontSpecification: TYPE = RECORD [ family: ROPE, face: PressFontFace, size: INTEGER, rotation: INTEGER ]; PressFontFace: TYPE = [0..256); GetPressFontSpecification: PROC [FONT] RETURNS[PressFontSpecification]; <<>> <> Key: TYPE = RECORD [index: NAT _ LAST[NAT]]; FontRec: TYPE = RECORD [ name: ROPE, requestedTransformation: Transformation, actualTransformation: Transformation, deviceType: ATOM, nsCodeTable: Key, <> fontFormattingClass: REF FontFormattingClassRec, formattingKey: Key, cachedWidthsMinimum, cachedWidthsUndefined: FixedUnit _ Scaled.zero, cachedWidths: REF ARRAY CHAR OF FixedUnit, <> fontGraphicsClass: REF FontGraphicsClassRec, graphicsKey: Key, bc, ec: CHAR, contains: REF PACKED ARRAY CHAR OF BOOLEAN, fontBoundingBox: Box, propertyList: REF, link: REF FontRec ]; PutProp: PROC [font: FONT, name: ATOM, value: REF ANY]; GetProp: PROC [font: FONT, name: ATOM] RETURNS [value: REF ANY]; RegisterFontFormattingClass: PROC [flavor: ATOM, init: PROC [font: FONT]]; RegisterFontGraphicsClass: PROC [flavor: ATOM, init: PROC [font: FONT]]; FontFormattingClassRec: TYPE = RECORD [ formattingBoxProc: PROC [font: FONT, char: CHAR] RETURNS [box: Box], ligKernProc: PROC [font: FONT, char1, char2: CHAR] RETURNS [ligatureOrKern: LigatureOrKern], formattingMetricProc: PROC [font: FONT, metric: ATOM, char: CHAR] RETURNS [REAL] ]; FontGraphicsClassRec: TYPE = RECORD [ maskProc: PROC [font: FONT, transformation: Transformation, char: CHAR, run: PROC [sMin, fMin: INTEGER, fSize: NAT]], <> boundingBoxProc: PROC [font: FONT, char: CHAR] RETURNS [Box], widthVectorProc: PROC [font: FONT, char: CHAR] RETURNS [Pair], containsProc: PROC [font: FONT, char: CHAR] RETURNS [BOOLEAN] ]; END.