UFPressFontFormat.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
DIRECTORY
PrincOps USING [zEXCH];
UFPressFontFormat: DEFINITIONS =
BEGIN
Byte: TYPE = [0..377B];
the IndexHeader corresponds to Structure IX pp5 Font Formats Manual.
IndexHeader: TYPE = MACHINE DEPENDENT RECORD[
type: IndexType,
length: [0..4096)
];
length in words, counting this one
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
body[0] is the length of the string
];
The RawIndex corresponds to the five kinds of index entries.
EndSegment, NameSegment, SplineSegment, CharacterSegment, and WidthSegment.
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];
BCPL data structures for spline definitions
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;
BCPL data structures for width definitions
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
];
converting from the doubleword world of Mesa to BCPL and conversely
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]];
The private record structure for the font reader, for those who want to dig into the bits for themselves.
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.
Michael Plass on August 5, 1982 8:41 am. Extracted from BcplFontFileDefs.