<> <> DIRECTORY UFFileManager, CGFont, Graphics, GraphicsOps, UnifiedFonts, UFStrikeReader; UFStrikeReaderImpl: CEDAR PROGRAM IMPORTS UFFileManager, Graphics, GraphicsOps, UnifiedFonts EXPORTS UFStrikeReader = BEGIN OPEN UFStrikeReader; FONT: TYPE = UnifiedFonts.FONT; OpenInitialization: UFFileManager.InitProc = TRUSTED { <> fontRef: Graphics.FontRef _ GraphicsOps.UnsafeNewFont[fontFile.Pointer[]]; RETURN[fontRef]; }; DrawChar: PUBLIC PROCEDURE [context: Graphics.Context, key: Key, char: CHAR] = TRUSTED { file: UFFileManager.FontFile _ UFFileManager.Open[key, OpenInitialization]; fRef: CGFont.Ref _ NARROW[file.GetData[]]; fontRef: Graphics.FontRef _ LOOPHOLE[fRef]; Graphics.DrawChar[context, char, fontRef]; }; BoundingBox: PUBLIC PROCEDURE [key: Key, char: CHAR] RETURNS [box: UnifiedFonts.Box] = TRUSTED { file: UFFileManager.FontFile _ UFFileManager.Open[key, OpenInitialization]; fRef: CGFont.Ref _ NARROW[file.GetData[]]; fontRef: Graphics.FontRef _ LOOPHOLE[fRef]; [box.xmin, box.ymin, box.xmax, box.ymax] _ Graphics.CharBox[fontRef, char]; }; WidthVector: PUBLIC PROCEDURE [key: Key, char: CHAR] RETURNS [vec: UnifiedFonts.Vec] = TRUSTED { file: UFFileManager.FontFile _ UFFileManager.Open[key, OpenInitialization]; fRef: CGFont.Ref _ NARROW[file.GetData[]]; fontRef: Graphics.FontRef _ LOOPHOLE[fRef]; [vec.x, vec.y] _ Graphics.CharWidth[fontRef, char]; }; <> SKDrawChar: PROCEDURE [font: FONT, char: CHAR, context: Graphics.Context] = { DrawChar[context, font.graphicsKey, char]; }; SKBoundingBox: PROCEDURE [font: FONT, char: CHAR] RETURNS [box: UnifiedFonts.Box] = { box _ BoundingBox[font.graphicsKey, char]; }; SKWidthVector: PROCEDURE [font: FONT, char: CHAR] RETURNS [vec: UnifiedFonts.Vec] = { vec _ WidthVector[font.graphicsKey, char]; }; SKContains: PROCEDURE [font: FONT, char: CHAR] RETURNS [BOOLEAN] = { RETURN[WidthVector[font.graphicsKey, char]#[0,0]]; }; SKGraphicsObjectInit: PROCEDURE [font: FONT] = { file: UFFileManager.FontFile _ UFFileManager.Open[font.graphicsKey, OpenInitialization]; fRef: CGFont.Ref _ NARROW[file.GetData[]]; font.fontGraphicsClass _ SKGraphicsClass; font.bc _ fRef.min; font.ec _ fRef.max; }; SKGraphicsClass: REF UnifiedFonts.FontGraphicsClassRec_NEW[UnifiedFonts.FontGraphicsClassRec_[ drawCharProc: SKDrawChar, boundingBoxProc: SKBoundingBox, widthVectorProc: SKWidthVector, containsProc: SKContains ]]; <> LigatureOrKern: TYPE = UnifiedFonts.LigatureOrKern; Box: TYPE = UnifiedFonts.Box; SKLigKern: PROCEDURE [font: FONT, char1, char2: CHAR] RETURNS [ligatureOrKern: LigatureOrKern] = {RETURN[[neither[]]]}; SKFormattingBox: PROCEDURE [font: FONT, char: CHAR] RETURNS [box: Box] = { box _ BoundingBox[font.graphicsKey, char]; box.xmin _ 0; box.xmax _ WidthVector[font.graphicsKey, char].x; }; SKFormattingMetric: PROCEDURE [font: FONT, metric: ATOM, char: CHAR] RETURNS [REAL] = { RETURN[0.0]; }; SKFormattingObjectInit: PROCEDURE [font: FONT] = { font.fontFormattingClass _ SKFormattingClass; }; SKFormattingClass: REF UnifiedFonts.FontFormattingClassRec _ NEW[UnifiedFonts.FontFormattingClassRec_[ formattingBoxProc: SKFormattingBox, ligKernProc: SKLigKern, formattingMetricProc: SKFormattingMetric ]]; UnifiedFonts.RegisterFontGraphicsClass[$Strike, SKGraphicsObjectInit]; UnifiedFonts.RegisterFontFormattingClass[$Strike, SKFormattingObjectInit]; END.