<> <> <> DIRECTORY Rope, ImagerBasic, Scaled; UnifiedFonts: CEDAR DEFINITIONS = BEGIN ROPE: TYPE = Rope.ROPE; RopeOrRefText: TYPE = REF; <> FONT: TYPE = REF FontRec; <> <> <> <> <> Create: PROCEDURE [fontName: RopeOrRefText, transformation: Transformation, deviceType: DeviceType _ $Ideal] RETURNS [FONT]; <> Transformation: TYPE = ImagerBasic.Transformation; DeviceType: TYPE = ATOM; <> Name: PROCEDURE [font: FONT] RETURNS [fontName: ROPE]; <> Contains: PROCEDURE [font: FONT, char: CHAR] RETURNS [BOOLEAN]; <> NSCode: PROCEDURE [font: FONT, char: CHAR] RETURNS [nsCode: INT]; unassignedNSCode: INT = 255; nonexistentNSCode: INT = 65535; <> CharCode: PROCEDURE [font: FONT, nsCode: INT] RETURNS [char: CHAR]; <> <> <> Direction: TYPE = {right, up, left, down}; Box: TYPE = RECORD [xmin, ymin, xmax, ymax: REAL]; NextCharacterDirection: PROCEDURE [font: FONT] RETURNS [Direction]; <> NextLineDirection: PROCEDURE [font: FONT] RETURNS [Direction]; <> FormattingBox: PROCEDURE [font: FONT, char: CHAR] RETURNS [Box]; <> Width: PROCEDURE [font: FONT, char: CHAR] RETURNS [REAL]; <> TextWidth: PROCEDURE [font: FONT, text: RopeOrRefText] RETURNS [REAL]; <> RoundedTextWidth: PROCEDURE [font: FONT, text: RopeOrRefText] RETURNS [INTEGER]; <> GetLigatureOrKern: PROCEDURE [font: FONT, char1, char2: CHAR] RETURNS [LigatureOrKern]; LigatureOrKern: TYPE = RECORD [ SELECT tag: * FROM neither => [], kern => [kernAmount: REAL], <> ligature => [ligatureCode: CHAR], ENDCASE]; RequestedTransformation: PROCEDURE [font: FONT] RETURNS [Transformation]; FormattingMetric: PROCEDURE [font: FONT, metric: ATOM, char: CHAR _ '\000] RETURNS [REAL]; <> Undefined: PROCEDURE [r: REAL] RETURNS [BOOLEAN] = TRUSTED INLINE {RETURN[LOOPHOLE[r, LONG CARDINAL]=20000000000B]}; FormattingInfo: PROCEDURE [font: FONT, name: ATOM, char: CHAR _ '\000] RETURNS [REF]; <> <> <> Pair: TYPE = ImagerBasic.Pair; <<= RECORD [x, y: REAL]>> BoundingBox: PROCEDURE [font: FONT, char: CHAR] RETURNS [Box]; <> FontBoundingBox: PROCEDURE [font: FONT] RETURNS [Box] <> ~ INLINE {RETURN [font.fontBoundingBox]}; WidthVector: PROCEDURE [font: FONT, char: CHAR] RETURNS [Pair]; <> ActualTransformation: PROCEDURE [font: FONT] RETURNS [Transformation]; <> <> FixedUnit: TYPE = Scaled.Value; FixedPoint: FixedUnit = Scaled.unit; <> WidthArray: TYPE = REF READONLY ARRAY CHAR OF FixedUnit; GetWidthArray: PROCEDURE [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: PROCEDURE [FONT] RETURNS[PressFontSpecification]; <> Key: TYPE = RECORD [index: NAT _ LAST[NAT]]; FontRec: TYPE = RECORD [ name: ROPE, requestedTransformation: Transformation, actualTransformation: Transformation, deviceType: DeviceType, 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: PROCEDURE [font: FONT, name: ATOM, value: REF ANY]; GetProp: PROCEDURE [font: FONT, name: ATOM] RETURNS [value: REF ANY]; RegisterFontFormattingClass: PROCEDURE [flavor: ATOM, init: PROC [font: FONT]]; RegisterFontGraphicsClass: PROCEDURE [flavor: ATOM, init: PROC [font: FONT]]; FontFormattingClassRec: TYPE = RECORD [ formattingBoxProc: PROCEDURE [font: FONT, char: CHAR] RETURNS [box: Box], ligKernProc: PROCEDURE [font: FONT, char1, char2: CHAR] RETURNS [ligatureOrKern: LigatureOrKern], formattingMetricProc: PROCEDURE [font: FONT, metric: ATOM, char: CHAR] RETURNS [REAL] ]; FontGraphicsClassRec: TYPE = RECORD [ maskProc: PROCEDURE [font: FONT, transformation: Transformation, char: CHAR, run: PROC [s, fMin: INTEGER, fSize: NAT]], <> boundingBoxProc: PROCEDURE [font: FONT, char: CHAR] RETURNS [Box], widthVectorProc: PROCEDURE [font: FONT, char: CHAR] RETURNS [Pair], containsProc: PROCEDURE [font: FONT, char: CHAR] RETURNS [BOOLEAN] ]; END.