DIRECTORY PrincOps USING [zEXCH]; UFPressFontFormat: DEFINITIONS = BEGIN Byte: TYPE = [0..377B]; IndexHeader: TYPE = MACHINE DEPENDENT RECORD[ type: IndexType, length: [0..4096) ]; IndexType: TYPE = MACHINE DEPENDENT { end,name,splines,chars,widths, unassigned1,unassigned2,unassigned3,unassigned4, unassigned5,unassigned6,unassigned7,unassigned8, unassigned9,unassigned10,unassigned11}; bcplMaxLength: CARDINAL = 255; BcplSTRING: TYPE = MACHINE DEPENDENT RECORD[ body: PACKED ARRAY[0..bcplMaxLength] OF CHARACTER ]; RawIndex: TYPE = MACHINE DEPENDENT RECORD [hdr: IndexHeader, variantPart: SELECT COMPUTED IndexType FROM end => NULL, name => [ fill: Byte, code: FontCode, -- local, unique name for font fontname: BcplSTRING ], splines, widths => [ family: FontCode, face: FaceType, bc, ec: CHARACTER, -- first and last character size: CARDINAL, -- Font size (10 micron units) rotation: CARDINAL, -- Rotation (anti clockwise) startaddress: bcplLONGPOINTER, -- Starting address of data part length: bcplLONGCARDINAL -- Length of data part ], chars => [ family: FontCode, face: FaceType, bc, ec: CHARACTER, -- first and last character size: CARDINAL, -- Font size (10 micron units) rotation: CARDINAL, -- Rotation (anti clockwise) startaddress: bcplLONGPOINTER, -- Starting address of data part length: bcplLONGCARDINAL, -- Length of data part resolutionx: CARDINAL, -- 10*(number of bits/inch) resolutiony: CARDINAL -- ditto ], ENDCASE ]; FontCode: TYPE = Byte; FaceType: TYPE = Byte; FaceWeight: TYPE = {L,M,B}; FaceSlant: TYPE = {I,R}; FaceWidth: TYPE = {C,R,E}; CharBboxDesc: TYPE = LONG DESCRIPTOR FOR ARRAY OF BoundingBox; CharDirDesc: TYPE = LONG DESCRIPTOR FOR ARRAY OF bcplLONGPOINTER; BoundingBox: TYPE = MACHINE DEPENDENT RECORD[ xwidth, ywidth: bcplFraction, BBox, BBoy: INTEGER, BBdx, BBdy: CARDINAL]; SplineDataDesc: TYPE = LONG DESCRIPTOR FOR ARRAY OF BcplSplineData; SplineDirDesc: TYPE = CharDirDesc; BcplSplineData: TYPE = MACHINE DEPENDENT RECORD[ xwidth, ywidth, bbox, bboy, rightx, topy: BcplREAL]; missingCharValueBits: bcplLONGCARDINAL = [highhalf: 0, lowhalf: 177777B]; missingCharValue: BcplREAL = LOOPHOLE[missingCharValueBits]; SplineCommandCode: TYPE = MACHINE DEPENDENT { MoveTo, DrawTo, DrawCurve, NewObject, EndDefinition }; BcplSplineCommand: TYPE = MACHINE DEPENDENT RECORD [type: BcplCommandCode, variantPart: SELECT OVERLAID SplineCommandCode FROM MoveTo, DrawTo => [x,y: BcplREAL], DrawCurve => [x0,y0, x1,y1, x2,y2: BcplREAL], NewObject, EndDefinition => NULL, ENDCASE ]; BcplREAL: TYPE = MACHINE DEPENDENT RECORD[ sign: [0..1], exp: [0..377B], sigbit: [0..1], topmantissa: [0..77B], restofmantissa: [0..177777B]]; BcplCommandCode: TYPE = INTEGER; moveToCode: BcplCommandCode = 1; drawToCode: BcplCommandCode = 2; drawCurveCode: BcplCommandCode = 3; newObjectCode: BcplCommandCode = -1; endSplineCode: BcplCommandCode = -2; BcplWidthSegment: TYPE = MACHINE DEPENDENT RECORD[ FBBox, FBBoy, FBBdx, FBBdy: CARDINAL, XWidthFixed, YWidthFixed: BOOLEAN, fill: PACKED ARRAY [0..14) OF BOOLEAN, widthData: ARRAY [0..0) OF CARDINAL ]; LongCardinalFromBcplLongPointer: PROCEDURE [bp: bcplLONGPOINTER] RETURNS [p: LONG CARDINAL] = MACHINE CODE BEGIN PrincOps.zEXCH; END; MesaToBcplLongCardinal: PROCEDURE [c: LONG CARDINAL] RETURNS [bc: bcplLONGCARDINAL] = MACHINE CODE BEGIN PrincOps.zEXCH; END; BcplToMesaLongCardinal: PROCEDURE [bc: bcplLONGCARDINAL] RETURNS [c: LONG CARDINAL] = MACHINE CODE BEGIN PrincOps.zEXCH; END; MesaToBcplFraction: PROCEDURE [f: Fraction] RETURNS [bf: bcplFraction] = MACHINE CODE BEGIN PrincOps.zEXCH; END; BcplToMesaFraction: PROCEDURE [bf: bcplFraction] RETURNS [f: Fraction] = MACHINE CODE BEGIN PrincOps.zEXCH; END; bcplLONGPOINTER: TYPE = MACHINE DEPENDENT RECORD[ highhalf, lowhalf: WORD]; bcplLONGCARDINAL: TYPE = MACHINE DEPENDENT RECORD[ highhalf, lowhalf: WORD]; bcplFraction: TYPE = MACHINE DEPENDENT RECORD[ integerpart, fractionpart: WORD]; Fraction: TYPE = LONG INTEGER; RasterPointer: TYPE = LONG POINTER TO RasterDimension; RasterDimension: TYPE = MACHINE DEPENDENT RECORD[height: [0..77B], width: [0..1777B]]; CharRepresentation: TYPE = {raster, outline, widthsOnly}; FontPrivateRec: PUBLIC TYPE = RECORD [ base: LONG POINTER, -- For checking against handle.base descriptors: SELECT rep: CharRepresentation FROM raster => [ indexEntry: LONG POINTER TO chars RawIndex, dataDesc: CharBboxDesc, dirDesc: CharDirDesc, rasterStart, rasterEnd: LONG CARDINAL ], outline => [ indexEntry: LONG POINTER TO splines RawIndex, dataDesc: SplineDataDesc, dirDesc: SplineDirDesc, commandStart, commandEnd: LONG CARDINAL ], widthsOnly => [ indexEntry: LONG POINTER TO widths RawIndex, widthSeg: LONG POINTER TO BcplWidthSegment, xWidthDesc: LONG DESCRIPTOR FOR ARRAY OF CARDINAL, yWidthDesc: LONG DESCRIPTOR FOR ARRAY OF CARDINAL ], ENDCASE ]; END. LUFPressFontFormat.mesa modified by Wyatt on November 30, 1983 7:07 pm modified by Michael Plass on February 15, 1984 8:52:43 am PST modified by Maureen Stone 30-Dec-81 17:14:31 modified by Geschke on November 5, 1979 4:42 PM the IndexHeader corresponds to Structure IX pp5 Font Formats Manual. length in words, counting this one body[0] is the length of the string The RawIndex corresponds to the five kinds of index entries. EndSegment, NameSegment, SplineSegment, CharacterSegment, and WidthSegment. BCPL data structures for spline definitions BCPL data structures for width definitions converting from the doubleword world of Mesa to BCPL and conversely The private record structure for the font reader, for those who want to dig into the bits for themselves. Michael Plass on August 5, 1982 8:41 am. Extracted from BcplFontFileDefs. ÊO˜Jšœ™Jšœ.™.Jšœ=™=Jšœ,™,Jšœ0™0J˜šÏk ˜ Jšœ œ ˜J˜J˜—Jšœ œ˜ Jš˜J˜Jšœœ ˜J˜JšœD™DJ˜š œ œœ œœ˜-J˜J˜J˜Jšœ"™"J˜—šœ œœ œ˜%J˜˜0J˜0J˜'J˜——Jšœœ˜š œ œœ œœ˜,šœœœœ ˜1Jšœ#™#—J˜J˜—Jšœ<™Jš œ œœ œœœœ˜AJ˜š œ œœ œœ˜-J˜Jšœ œœ˜+J˜J˜—Jšœ+™+J˜Jš œœœ œœœœ˜CJšœœ˜"J˜š œœœ œœ˜0J˜4J˜—J˜JJšœœ˜