DIRECTORY Basics USING [BYTE, CARD, SwapHalves], RealConvert USING [BcplReal]; PrePressFontFormat: CEDAR DEFINITIONS IMPORTS Basics ~ BEGIN BYTE: TYPE ~ Basics.BYTE; CARD: TYPE ~ Basics.CARD; BcplCard: TYPE ~ MACHINE DEPENDENT RECORD[highbits: CARDINAL, lowbits: CARDINAL]; BcplInt: TYPE ~ MACHINE DEPENDENT RECORD[highbits: INTEGER, lowbits: CARDINAL]; CardFromBcpl: PROC[x: BcplCard] RETURNS[CARD] ~ TRUSTED INLINE { RETURN[Basics.SwapHalves[LOOPHOLE[x]].lc] }; BcplFromCard: PROC[x: CARD] RETURNS[BcplCard] ~ TRUSTED INLINE { RETURN[LOOPHOLE[Basics.SwapHalves[[lc[x]]]]] }; IntFromBcpl: PROC[x: BcplInt] RETURNS[INT] ~ TRUSTED INLINE { RETURN[Basics.SwapHalves[LOOPHOLE[x]].li] }; BcplFromInt: PROC[x: INT] RETURNS[BcplInt] ~ TRUSTED INLINE { RETURN[LOOPHOLE[Basics.SwapHalves[[li[x]]]]] }; BcplReal: TYPE ~ RealConvert.BcplReal; IXType: TYPE ~ MACHINE DEPENDENT { end(0), -- end of index part name(1), -- NameIndexEntry follows spline(2), -- StdIndexEntry follows character(3), -- CharacterIndexEntry follows width(4), -- StdIndexEntry follows orbit(5), -- CharacterIndexEntry follows multipleCharacter(6), -- MultipleCharacterIndexEntry follows (17B) }; IXHeader: TYPE ~ MACHINE DEPENDENT RECORD[ type(0:0..3): IXType, -- type of entry length(0:4..15): [0..7777B] -- length of entry, including this header ]; NameIndexEntry: TYPE ~ MACHINE DEPENDENT RECORD[ -- ix.type = name code(0:0..15): CARDINAL, -- numeric code for this name chars(1): PACKED ARRAY[0..20) OF BYTE -- name as a BCPL string: first byte is length ]; StdIndexEntry: TYPE ~ MACHINE DEPENDENT RECORD[ -- ix.type = spline, width family(0:0..7): BYTE, -- family name, using a name code face(0:8..15): BYTE, -- face encoding bc(1:0..7): BYTE, -- beginning character ec(1:8..15): BYTE, -- ending character size(2:0..15): CARDINAL, -- size in micas rotation(3:0..15): CARDINAL, -- rotation in minutes of arc anticlockwise segmentSA(4:0..31): BcplCard, -- starting address in file of the segment (in words!) segmentLength(6:0..31): BcplCard -- length of the segment (in words!) ]; CharacterIndexEntry: TYPE ~ MACHINE DEPENDENT RECORD[ -- ix.type = character, orbit family(0:0..7): BYTE, -- family name, using a name code face(0:8..15): BYTE, -- face encoding bc(1:0..7): BYTE, -- beginning character ec(1:8..15): BYTE, -- ending character size(2:0..15): CARDINAL, -- size in micas rotation(3:0..15): CARDINAL, -- rotation in minutes of arc anticlockwise segmentSA(4:0..31): BcplCard, -- starting address in file of the segment (in words!) segmentLength(6:0..31): BcplCard, -- length of the segment (in words!) resolutionX(8:0..15): CARDINAL, -- 10 * resolution in scan lines per inch resolutionY(9:0..15): CARDINAL -- 10 * resolution in bits per inch ]; MultipleCharacterIndexEntry: TYPE ~ MACHINE DEPENDENT RECORD[ -- ix.type=multipleCharacter family(0:0..7): BYTE, -- family name, using a name code face(0:8..15): BYTE, -- face encoding bc(1:0..7): BYTE, -- beginning character ec(1:8..15): BYTE, -- ending character size(2:0..15): CARDINAL, -- size in micas rotation(3:0..15): CARDINAL, -- rotation in minutes of arc anticlockwise resolutionX(4:0..15): CARDINAL, -- 10 * resolution in scan lines per inch resolutionY(5:0..15): CARDINAL, -- 10 * resolution in bits per inch numSegs(6:0..15): CARDINAL -- number of segments ]; DatedSegmentEntry: TYPE ~ MACHINE DEPENDENT RECORD[ segmentSA(0:0..31): BcplCard, segmentLength(2:0..31): BcplCard, expirationDate(4:0..31): BcplCard ]; CharacterData: TYPE ~ MACHINE DEPENDENT RECORD[ wx(0:0..31): BcplInt, -- x width (signed fraction) wy(2:0..31): BcplInt, -- y width (signed fraction) bbox(4:0..15): INTEGER, -- x offset for bounding box bboy(5:0..15): INTEGER, -- y offset for bounding box bbdx(6:0..15): INTEGER, -- width of bounding box (scan lines) bbdy(7:0..15): INTEGER -- height of bounding box (bits) or missingCharacter ]; missingCharacter: INTEGER ~ -1; CharDataArray: TYPE ~ RECORD[SEQUENCE COMPUTED CARDINAL OF CharacterData]; RelFilePos: TYPE ~ BcplInt; missingFilePos: RelFilePos ~ LOOPHOLE[INT.LAST]; DirectoryArray: TYPE ~ RECORD[SEQUENCE COMPUTED CARDINAL OF RelFilePos]; RasterDefn: TYPE ~ MACHINE DEPENDENT RECORD[ raster(0:0..5): [0..77B], -- words per scan line lines(0:6..15): [0..1777B] -- number of scan lines ]; WidthSegment: TYPE ~ MACHINE DEPENDENT RECORD[ fbbox(0:0..15): INTEGER, -- x offset for font bounding box fbboy(1:0..15): INTEGER, -- y offset for font bounding box fbbdx(2:0..15): INTEGER, -- x width for font bounding box fbbdy(3:0..15): INTEGER, -- y height for font bounding box xWidthFixed(4:0..0): [0..1], -- 1 if all x widths equal yWidthFixed(4:1..1): [0..1], -- 1 if all y widths equal spare(4:2..15): [0..37777B] -- unused ]; WidthArray: TYPE ~ RECORD[SEQUENCE COMPUTED CARDINAL OF INTEGER]; missingWidth: INTEGER ~ LOOPHOLE[100000B]; SplineData: TYPE ~ MACHINE DEPENDENT RECORD[ wx(0:0..31): BcplReal, -- width in x direction or missingSpline wy(2:0..31): BcplReal, -- width in y direction xmin(4:0..31): BcplReal, -- left edge of bounding box ymin(6:0..31): BcplReal, -- bottom edge of bounding box xmax(8:0..31): BcplReal, -- right edge of bounding box ymax(10:0..31): BcplReal -- top edge of bounding box ]; missingSpline: BcplReal ~ LOOPHOLE[BcplCard[0, CARDINAL.LAST]]; SplineDataArray: TYPE ~ RECORD[SEQUENCE COMPUTED CARDINAL OF SplineData]; SplineCode: TYPE ~ MACHINE DEPENDENT { moveTo(1), drawTo(2), drawCurve(3), endDefinition(177776B), newObject(177777B) }; SplineCommand: TYPE ~ MACHINE DEPENDENT RECORD[code: SplineCode]; SplineCoords: TYPE ~ MACHINE DEPENDENT RECORD[ x(0:0..31): BcplReal, y(2:0..31): BcplReal ]; END. DPrePressFontFormat.mesa Copyright c 1984, 1985 by Xerox Corporation. All rights reserved. Doug Wyatt, March 7, 1985 2:32:05 pm PST A BCPL doubleword (unsigned); order of the halves is the reverse of the Mesa convention. A BCPL doubleword (signed); order of the halves is the reverse of the Mesa convention. A BCPL floating point number; use RealConvert to convert to Mesa REAL. -- segs: ARRAY[0..numSegs) OF DatedSegmentEntry CharacterSegment: TYPE ~ RECORD[ charData: CharacterDataArray[ec-bc+1], directory: DirectoryArray[ec-bc+1] -- followed by rasters, pointed to by the directory ]; value of bbdx in CharacterData for a missing character -- bits: ARRAY[0..lines) OF ARRAY[0..raster) OF WORD -- xwidths: WidthArray[IF xWidthFixed THEN 1 ELSE ec-bc+1] -- ywidths: WidthArray[IF yWidthFixed THEN 1 ELSE ec-bc+1] value of WidthArray entry for a missing character SplineSegment: TYPE ~ RECORD[ splineData: SplineDataArray[ec-bc+1], directory: DirectoryArray[ec-bc+1] -- followed by spline codes, pointed to by the directory ]; value of wx in SplineData for a missing character Κ ˜codešœ™Kšœ Οmœ7™BKšœ(™(—K˜šΟk ˜ Kšœžœžœžœ˜&Kšœ žœ ˜—K˜KšΠblœžœž ˜%Kšžœ˜Kšœž˜K˜Kšžœžœ žœ˜Kšžœžœ žœ˜K˜š œ žœžœž œžœ žœ žœ˜QK™XK˜—š œ žœžœž œžœ žœ žœ˜OK™VK˜—šΟn œžœžœžœ˜-Kš œžœžœžœžœ ˜?K˜—š  œžœžœžœ ˜-Kš œžœžœžœžœ ˜BK˜—š  œžœ žœžœ˜*Kš œžœžœžœžœ ˜?K˜—š  œžœžœžœ ˜*Kš œžœžœžœžœ ˜BK˜—šœ žœ˜&KšœAžœ™FK™—K˜šœžœžœž œ˜"KšœΟc˜Kšœ ‘˜"Kšœ ‘˜#Kšœ‘˜,Kšœ ‘˜"Kšœ ‘˜(Kšœ‘&˜