DIRECTORY ImagerMaskCapture, ImagerBox, BitmapViewer, Commander, Imager, ImagerPixelMap, ImagerTransformation, IO, ImagerFont, FontEdit, Real, Rope, RasterFontIO, MakeRasterFont, ImagerPressFontSubst, ViewerClasses; MakeRasterFontImpl: CEDAR PROGRAM IMPORTS ImagerMaskCapture, ImagerBox, BitmapViewer, Commander, Imager, ImagerPixelMap, ImagerTransformation, IO, ImagerFont, FontEdit, Real, Rope, ImagerPressFontSubst, RasterFontIO EXPORTS MakeRasterFont ~ BEGIN ROPE: TYPE ~ Rope.ROPE; Font: TYPE ~ ImagerFont.Font; InternalFont: TYPE ~ RasterFontIO.InternalFont; Transformation: TYPE ~ ImagerTransformation.Transformation; visible: BOOLEAN _ FALSE; FromFont: PUBLIC PROC [font: Font] RETURNS [internalFont: InternalFont] ~ { bb: Imager.Box _ ImagerBox.BoxFromExtents[ImagerFont.FontBoundingBox[font]]; dbb: ImagerPixelMap.DeviceRectangle _ [Real.RoundLI[-bb.ymax], Real.RoundLI[+bb.xmin], Real.RoundLI[bb.ymax]-Real.RoundLI[bb.ymin], Real.RoundLI[bb.xmax]-Real.RoundLI[bb.xmin]]; viewer: ViewerClasses.Viewer _ IF visible THEN BitmapViewer.Create[[name: font.name], TRUE, center, center] ELSE NIL; m: Transformation ~ ImagerTransformation.Rotate[90]; pfd: ImagerPressFontSubst.PressFontDescription ~ ImagerPressFontSubst.FindSubstitute[font.name, font.charToClient, press]; internalFont _ RasterFontIO.Create[dbb, dbb.fSize]; IF pfd#NIL THEN { internalFont.family _ pfd.family; internalFont.face _ pfd.face; }; internalFont.bitsPerEmQuad _ font.charToClient.SingularValues.x; FOR c: CHAR IN CHAR DO IF font.Contains[[0,ORD[c]]] THEN { op: PROC[context: Imager.Context] ~ { Char: ImagerFont.XStringProc ~ {charAction[[0, ORD[c]]]}; Imager.SetFont[context, font]; Imager.Show[context, Char]; }; widthVector: Imager.VEC _ ImagerFont.Width[font, [0, ORD[c]]]; pixels: ImagerPixelMap.PixelMap _ ImagerMaskCapture.CaptureBitmap[op, m]; pixels _ pixels.Trim[0]; IF viewer # NIL THEN BitmapViewer.SetBitmap[viewer, pixels]; internalFont.charRep[c] _ [ fWidth: widthVector.x, sWidth: -widthVector.y, pixels: pixels ]; }; ENDLOOP; }; ConvertFile: PUBLIC PROC [outputFileName: ROPE, fontName: ROPE, size: REAL, rotation: REAL, bitsPerInch: REAL] ~ { font: Font _ ImagerFont.Find[fontName].Scale[size]; internalFont: InternalFont _ NIL; IF rotation # 0.0 THEN { font _ ImagerFont.Modify[font, ImagerTransformation.Rotate[rotation]]; }; internalFont _ FromFont[font]; internalFont.bitsPerInch _ bitsPerInch; FontEdit.WriteFormatDerivedFromName[internalFont, outputFileName]; }; Break: PROC [char: CHAR] RETURNS [IO.CharClass] = { IF char = '_ OR char = '; THEN RETURN [break]; IF char = ' OR char = ' OR char = ', OR char = '\n THEN RETURN [sepr]; RETURN [other]; }; GetToken: PROC [stream: IO.STREAM] RETURNS [rope: ROPE _ NIL] = { rope _ stream.GetTokenRope[Break ! IO.EndOfStream => CONTINUE].token; }; GetReal: PROC [stream: IO.STREAM] RETURNS [real: REAL _ 0.0] = { real _ stream.GetReal[! IO.Error, IO.EndOfStream => CONTINUE]; }; MakeRasterFontCommand: Commander.CommandProc ~ { stream: IO.STREAM _ IO.RIS[cmd.commandLine]; outputName: ROPE _ GetToken[stream]; gets: ROPE _ GetToken[stream]; inputName: ROPE _ GetToken[stream]; size: REAL _ GetReal[stream]; sizeUnits: ROPE _ GetToken[stream]; bitsPerInch: REAL _ GetReal[stream]; bpi: ROPE _ GetToken[stream]; rotation: REAL _ GetReal[stream]; IF bitsPerInch = 0.0 AND bpi = NIL THEN {bitsPerInch _ 384.0; bpi _ "bpi"}; SELECT TRUE FROM sizeUnits = NIL OR sizeUnits.Equal["pxl", FALSE] => NULL; sizeUnits.Equal["pt", FALSE] => {size _ size/72.0*bitsPerInch}; sizeUnits.Equal["mica", FALSE] => {size _ size/2540.0*bitsPerInch}; ENDCASE => gets _ NIL; IF NOT gets.Equal["_"] OR size <= 0.0 OR NOT bpi.Equal["bpi", FALSE] THEN { cmd.out.PutRope[helpRope]; cmd.out.PutChar['\n]; RETURN; }; ConvertFile[outputName, inputName, size, rotation, bitsPerInch]; }; helpRope: ROPE ~ "Convert an Imager font to raster format\n _ bpi \n is an Interpress hierarchical name\n is the desired output size\n is pt, mica, or pxl\n is in bits per inch\n is in degrees"; Commander.Register["MakeRasterFont", MakeRasterFontCommand, helpRope]; END. ˆMakeRasterFontImpl.mesa Copyright (C) 1984, Xerox Corporation. All rights reserved. Michael Plass, June 27, 1985 5:35:07 pm PDT ΚΛ– "cedar" style˜šœ™J™JšœI˜IJšœ˜Jšœ œœ(˜<šœ˜Jšœ˜Jšœ˜Jšœ˜J˜—J˜—Jšœ˜—Jšœ˜J˜—šž œœœœ œœ œœ˜rJšœ3˜3Jšœœ˜!šœœ˜JšœF˜FJšœ˜—Jšœ˜Jšœ'˜'JšœB˜BJšœ˜J˜—– "cedar" styleš žœœœœœ˜3Jšœ œ œœ ˜.Jš œ œ œ œ œœ˜HJšœ ˜Jšœ˜J˜—– "cedar" stylešžœœ œœœœœ˜AJšœ#œœ˜EJšœ˜J˜—– "cedar" styleš žœœ œœœœ ˜@Jšœœœœ˜>Jšœ˜J˜—šžœ˜0Jš œœœœœ˜,Jšœ œ˜$Jšœœ˜Jšœ œ˜#Jšœœ˜Jšœ œ˜#Jšœ œ˜$Jšœœ˜Jšœ œ˜!Jšœœœœ$˜Kšœœ˜Jš œ œœœœ˜9Jšœœ$˜?Jšœœ&˜CJšœ œ˜—šœœœ œœœœ˜KJšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ@˜@Jšœ˜J˜—šœ œ²˜ΐJ˜—šœF˜FJ˜——Jšœ˜J˜—…—vΙ