-- PressFontReader.mesa -- Written by Michael Plass on August 5, 1982 11:01 am -- Last edit by Michael Plass on August 11, 1982 10:30 am DIRECTORY Graphics, PressFontFormat, Rope; PressFontReader: DEFINITIONS = BEGIN ROPE: TYPE = Rope.ROPE; Handle: TYPE = REF PressFontFileRec; PressFontFileRec: TYPE; Font: TYPE = REF READONLY FontRec; FontRec: TYPE = RECORD [ info: FontInfoRec, pressFontFile: Handle, private: REF FontPrivateRec ]; FontInfoRec: TYPE = RECORD [ family: ROPE, face: [0..256), bc, ec: CHAR, size: REAL, -- in meters, or 0 for a scalable font rotation: REAL, -- in degrees representation: CharShapeRepresentation, xRes, yRes: REAL -- in bits per inch; only useful for raster fonts ]; CharShapeRepresentation: TYPE = {raster, outline, widthsOnly}; FontPrivateRec: TYPE = PressFontFormat.FontPrivateRec; -- Dig into this at your own risk. Error: SIGNAL[errorCode: ErrorCode, fontFileWordOffset: INT]; ErrorCode: TYPE = {fileNotFound, fontIndexTooLong, cantHappen, dataSegmentTooLong, invalidPointerInFile, consistencyCheck, fileHasBeenClosed, wrongFontFormatForThisOperation, invalidCodeInFile}; FromFile: PROCEDURE [fileName: ROPE] RETURNS [handle: Handle]; Close: PUBLIC PROCEDURE [handle: Handle]; FirstFont: PROCEDURE [handle: Handle] RETURNS [font: Font]; -- Use this for .ac and .sd files, where there is typically only one font in the file. ListFonts: PROCEDURE [handle: Handle] RETURNS [fonts: LIST OF Font]; -- Use this when you are interested in many fonts in the file. EnumerateDirectory: PROCEDURE [handle: Handle, visitFontProc: VisitFontProc] RETURNS [font: Font]; -- EnumerateDirectory will enumerate all the fonts that appear in the directory. Use this for finding a particular font, since it does no allocations. VisitFontProc: TYPE = PROCEDURE [fontRec: FontInfoRec] RETURNS [quit: BOOLEAN _ FALSE]; -- Quitting the enumeration will cause EnumerateDirectory to return that font. -- ========== Getting information about characters ========== GetCharInfo: PROCEDURE [font: Font, char: CHAR] RETURNS [info: CharInfo]; CharInfo: TYPE = RECORD [ widthX, widthY: REAL, -- the width vector minX, minY: REAL, -- the lower left corner of the bounding box maxX, maxY: REAL -- the upper right corner of the bounding box ]; -- All of the above dimensions are relative to the point size of the character, and are measured from the reference point of the character, with y increasing upwards and x increasing to the right. DrawChar: PROCEDURE [context: Graphics.Context, font: Font, char: CHAR]; -- The character, which may be in any supported format, is drawn at the scale of one em per unit. Thus to draw a 10 point font, scale by a factor of 10 before drawing. The current position is updated by the width after the character is drawn. DrawCharRaster: PROCEDURE [context: Graphics.Context, font: Font, char: CHAR]; -- The character is drawn at the scale of one pixel per unit. The current position is updated by the width after the character is drawn. MoveToProc: TYPE = PROCEDURE [x, y: REAL]; LineToProc: TYPE = PROCEDURE [x, y: REAL]; CurveToProc: TYPE = PROCEDURE [x1, y1, x2, y2, x3, y3: REAL]; DrawAreaProc: TYPE = PROCEDURE; GetCharOutline: PROCEDURE [ font: Font, char: CHAR, moveToProc: MoveToProc, lineToProc: LineToProc, curveToProc: CurveToProc, drawAreaProc: DrawAreaProc ]; GetCharPath: PROCEDURE [ font: Font, char: CHAR ] RETURNS [path: Graphics.Path]; END. Κη– "Mesa" style˜Iprocš@Οc‰œΟk œ7ž œžœžœžœžœ žœžœ%žœ žœžœžœžœžœ9žœ"žœžœ žœžœ žœ'œ žœœ7žœ2œžœ3žœ##œžœ+žœžœ³˜οKš’œΟnœž œ žœžœŸœžœž œŸ œž œžœWœŸ œž œžœ žœžœ ?œŸœž œ1žœ—œŸ œžœž œžœžœžœOœ>œŸ œž œžœžœžœžœžœœ žœ.œ žœ.œΕœŸœž œ/žœυœŸœž œ/žœ‹Ÿ œžœž œžœŸ œžœž œžœŸ œžœž œžœŸ œžœž œŸœž œžœoŸ œž œžœžœžœ˜˜—…— Šw