<> <> <<>> DIRECTORY Graphics USING [FontRef], Rope USING [ROPE]; VFonts: CEDAR DEFINITIONS = BEGIN <> Font: TYPE = REF FontObject; defaultFont: Font; defaultGFont: Graphics.FontRef; GraphicsFont: PROC [vFont: Font] RETURNS [Graphics.FontRef] = INLINE {RETURN[vFont.gFont]} ; <> EstablishFont: PUBLIC PROC [family: Rope.ROPE, size: CARDINAL, bold: BOOL _ FALSE, italic: BOOL _ FALSE, defaultOnFailure: BOOL _ TRUE] RETURNS [Font] ; <> CharWidth: PROC [char: CHAR, font: Font _ defaultFont] RETURNS [[0..LAST[INTEGER]]] = INLINE {RETURN[font.width[char]]}; StringWidth: PROC [string: Rope.ROPE, font: Font _ defaultFont] RETURNS [[0..LAST[INTEGER]]] ; FontHeight: PROC [font: Font _ defaultFont] RETURNS [[0..LAST[INTEGER]]] = INLINE {RETURN [font.height]} ; FontAscent: PROC [font: Font _ defaultFont] RETURNS [[0..LAST[INTEGER]]] = INLINE {RETURN [font.ascent]} ; XInSegment: PROC [char: CHAR, font: Font] RETURNS [CARDINAL] = TRUSTED INLINE {RETURN[font.xInSegment[char]]} ; <> Error: ERROR [code: ErrorCode] ; ErrorCode: TYPE = {illegalFormat, fontNotFound} ; FontObject: TYPE = PRIVATE RECORD [ height: CARDINAL _ NULL, ascent: CARDINAL _ NULL, kerned: BOOL _ NULL, width: PACKED ARRAY CHAR[0C..177C] OF [0..256) _ NULL, raster: CARDINAL _ NULL, maxWidth: CARDINAL _ NULL, min, max: CHAR _ NULL, address: LONG POINTER _ NIL, bitmap: LONG POINTER TO ARRAY [0..0) OF WORD _ NULL, xInSegment: LONG POINTER TO ARRAY CHAR[0C..0C) OF CARDINAL _ NULL, family: Rope.ROPE _ NIL, size: CARDINAL _ NULL, -- in points gFont: Graphics.FontRef _ NIL, bold: BOOL _ FALSE, italic: BOOL _ FALSE, synthBold: BOOL _ FALSE, synthItalic: BOOL _ FALSE, next: Font _ NIL ]; END.