(FILECREATED " 7-Feb-86 11:05:47" {ERIS}<LISPUSERS>KOTO>EDITFONT.;3 42118 previous date: "28-Oct-85 09:40:16" {ERIS}<LISPUSERS>KOTO>EDITFONT.;2) (* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT EDITFONTCOMS) (RPAQQ EDITFONTCOMS ((* EDITFONT -- By Kelly Roach. Need to LOAD EXPORTS.ALL and LOADFROM FONT in order to compile this file. *) (CONSTANTS (BITSPERWORD 16) (BYTESPERWORD 2) (MAXCODE 255) (DUMMYINDEX 256)) (INITVARS (EF.MENU NIL) (EF.TITLEMENU NIL)) (RECORDS CHARITEM) (FNS EF.INIT EF.EDIT EF.PROMPT EF.MESSAGE EF.CLOSEFN EF.CHARITEMS EF.BUTTONEVENTFN EF.WHENSELECTEDFN EF.EDITBM EF.MIDDLEBUTTONFN EF.CHANGESIZE EF.DELETE EF.ENTER EF.REPLACE EF.SAVE EF.BLANK COPYFONT READSTRIKEFONTFILE WRITESTRIKEFONTFILE) (FNS BLANKFONTCREATE EDITFONT) (P (EF.INIT)))) (* EDITFONT -- By Kelly Roach. Need to LOAD EXPORTS.ALL and LOADFROM FONT in order to compile this file. *) (DECLARE: EVAL@COMPILE (RPAQQ BITSPERWORD 16) (RPAQQ BYTESPERWORD 2) (RPAQQ MAXCODE 255) (RPAQQ DUMMYINDEX 256) (CONSTANTS (BITSPERWORD 16) (BYTESPERWORD 2) (MAXCODE 255) (DUMMYINDEX 256)) ) (RPAQ? EF.MENU NIL) (RPAQ? EF.TITLEMENU NIL) [DECLARE: EVAL@COMPILE (RECORD CHARITEM (BITMAP (CHARCODE DUMMYFLG))) ] (DEFINEQ (EF.INIT (LAMBDA NIL (* kbr: "21-Oct-85 15:50") (PROG NIL (SETQ EF.MENU (create MENU ITEMS ←(QUOTE ((CHANGESIZE (QUOTE EF.CHANGESIZE) "Change size of character.") (DELETE (QUOTE (QUOTE EF.DELETE)) "Delete character.") (EDITBM (QUOTE (QUOTE EF.EDITBM)) "Edit character.") (REPLACE (QUOTE (QUOTE EF.REPLACE)) "Prompt for bitmap to replace character."))))) (SETQ EF.TITLEMENU (create MENU ITEMS ←(QUOTE ((SAVE (QUOTE EF.SAVE) "Save EDITFONT's work back into font.")))))) )) (EF.EDIT (LAMBDA (FONT FROMCHAR8CODE TOCHAR8CODE CHARSET) (* kbr: "21-Oct-85 15:35") (* Edit FONT. *) (COND ((NULL FROMCHAR8CODE) (SETQ FROMCHAR8CODE 0))) (COND ((NULL TOCHAR8CODE) (SETQ TOCHAR8CODE 255))) (COND ((NULL CHARSET) (SETQ CHARSET 0))) (PROG (CHARITEMS MENU TITLE HEIGHT WIDTH REGION POS WINDOW) (COND ((FONTP FONT) (SETQ CHARITEMS (EF.CHARITEMS FONT FROMCHAR8CODE TOCHAR8CODE CHARSET)) (SETQ MENU (create MENU MENUFONT ← FONT CENTERFLG ← T MENUCOLUMNS ← 16 ITEMS ← CHARITEMS WHENSELECTEDFN ←(FUNCTION EF.WHENSELECTEDFN))) (SETQ TITLE (PACK* (FONTPROP FONT (QUOTE FAMILY)) (FONTPROP FONT (QUOTE SIZE)) (PACKC (for ATOM in (FONTPROP FONT (QUOTE FACE)) collect (CHCON1 ATOM))))) (SETQ HEIGHT (HEIGHTIFWINDOW (fetch (MENU IMAGEHEIGHT) of MENU) T)) (SETQ WIDTH (WIDTHIFWINDOW (fetch (MENU IMAGEWIDTH) of MENU))) (SETQ POS (GETBOXPOSITION WIDTH HEIGHT)) (SETQ REGION (create REGION LEFT ←(fetch (POSITION XCOORD) of POS) BOTTOM ←(fetch (POSITION YCOORD) of POS) WIDTH ← WIDTH HEIGHT ← HEIGHT)) (SETQ WINDOW (CREATEW REGION TITLE)) (WINDOWPROP WINDOW (QUOTE CHARITEMS) CHARITEMS) (ADDMENU MENU WINDOW (create POSITION XCOORD ← 0 YCOORD ← 0)) (WINDOWPROP WINDOW (QUOTE BUTTONEVENTFN) (QUOTE EF.BUTTONEVENTFN))) (T (ERROR "Can't edit " FONT)))))) (EF.PROMPT (LAMBDA (STRING WINDOW) (* kbr: "16-Oct-85 22:48") (PROG (PROMPTW ANSWER) (SETQ PROMPTW (GETPROMPTWINDOW WINDOW)) (CLEARW PROMPTW) (PRIN1 STRING PROMPTW) (PRIN1 " " PROMPTW) (SETQ ANSWER (RESETLST (RESETSAVE (TTYDISPLAYSTREAM PROMPTW)) (RESETSAVE (TTY.PROCESS (THIS.PROCESS))) (TTYINREAD PROMPTW))) (TERPRI PROMPTW) (SETQ ANSWER (EVAL ANSWER)) (RETURN ANSWER)))) (EF.MESSAGE (LAMBDA (STRING WINDOW) (* kbr: "16-Oct-85 22:50") (PROG (PROMPTW) (SETQ PROMPTW (GETPROMPTWINDOW WINDOW)) (PRIN1 STRING PROMPTW)))) (EF.CLOSEFN (LAMBDA (WINDOW) (* kbr: "15-Dec-84 15:20") (* Close EF Window. *) (PROG NIL (COND ((EQ (ASKUSER "Close Editfont Window?") (QUOTE N)) (RETURN (QUOTE DON'T)))) (CLOSEW WINDOW) (* Break circularity. *) (WINDOWPROP WINDOW (QUOTE MENU) NIL)))) (EF.CHARITEMS (LAMBDA (FONT FROMCHAR8CODE TOCHAR8CODE CHARSET) (* kbr: "16-Oct-85 23:11") (* Get CHARITEMS for FONT. *) (PROG (FROMCHARCODE TOCHARCODE OFFSETS DUMMYOFFSET DUMMYBITMAP OFFSET BITMAP CHARITEM CHARITEMS) (* Get DUMMY CHARITEM *) (* Interlisp assuming 256 is dummy is dumb now because of NS chars. Maybe Kaplan and Nuyens will fix. *) (SETQ DUMMYBITMAP (GETCHARBITMAP 256 FONT)) (SETQ CHARITEM (create CHARITEM BITMAP ← DUMMYBITMAP CHARCODE ← DUMMYINDEX DUMMYFLG ← T)) (push CHARITEMS CHARITEM) (* Get ordinairy CHARITEMs. *) (SETQ FROMCHARCODE (IPLUS (ITIMES 256 CHARSET) FROMCHAR8CODE)) (SETQ TOCHARCODE (IPLUS (ITIMES 256 CHARSET) TOCHAR8CODE)) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of (\GETCHARSETINFO CHARSET FONT))) (SETQ DUMMYOFFSET (\FGETOFFSET OFFSETS DUMMYINDEX)) (for I from TOCHARCODE to FROMCHARCODE by -1 do (SETQ OFFSET (\FGETOFFSET OFFSETS I)) (COND ((EQ OFFSET DUMMYOFFSET) (SETQ CHARITEM (create CHARITEM BITMAP ← DUMMYBITMAP CHARCODE ← I DUMMYFLG ← T))) (T (SETQ BITMAP (GETCHARBITMAP I FONT)) (SETQ CHARITEM (create CHARITEM BITMAP ← BITMAP CHARCODE ← I DUMMYFLG ← NIL)))) (push CHARITEMS CHARITEM)) (* OKEY DOKEY *) (RETURN CHARITEMS)))) (EF.BUTTONEVENTFN (LAMBDA (WINDOW) (* kbr: "16-Oct-85 22:19") (PROG (COMMAND) (COND ((INSIDEP (DSPCLIPPINGREGION NIL WINDOW) (LASTMOUSEX WINDOW) (LASTMOUSEY WINDOW)) (MENUBUTTONFN WINDOW)) ((SETQ COMMAND (MENU EF.TITLEMENU)) (APPLY* COMMAND WINDOW)))))) (EF.WHENSELECTEDFN (LAMBDA (CHARITEM MENU KEY) (* kbr: "16-Oct-85 22:26") (PROG NIL (COND (CHARITEM (SELECTQ KEY (LEFT (EF.EDITBM CHARITEM MENU)) (MIDDLE (EF.MIDDLEBUTTONFN CHARITEM MENU)) (* Do nothing. *))))))) (EF.EDITBM (LAMBDA (CHARITEM MENU) (* kbr: "15-Dec-84 15:20") (PROG (BITMAP CHARCODE DUMMYFLG) (RESETLST (RESETSAVE (SHADEITEM CHARITEM MENU BLACKSHADE) (BQUOTE (SHADEITEM (\, CHARITEM) (\, MENU) (\, WHITESHADE)))) (SETQ BITMAP (fetch (CHARITEM BITMAP) of CHARITEM)) (COND ((AND (NOT (IEQP (fetch (CHARITEM CHARCODE) of CHARITEM) DUMMYINDEX)) (fetch (CHARITEM DUMMYFLG) of CHARITEM)) (* Undummify this CHARITEM. *) (SETQ BITMAP (COPYALL BITMAP)) (UNINTERRUPTABLY (replace (CHARITEM BITMAP) of CHARITEM with BITMAP) (replace (CHARITEM DUMMYFLG) of CHARITEM with NIL)))) (EDITBM BITMAP)) (* Update MENU image. SHADEITEM's side effects above suffice if we only changed one menu item. (I.e. we edited an ordinairy CHARITEM.) *) (COND ((IEQP (fetch (CHARITEM CHARCODE) of CHARITEM) DUMMYINDEX) (UPDATE/MENU/IMAGE MENU) (REDISPLAYW (WFROMMENU MENU))))))) (EF.MIDDLEBUTTONFN (LAMBDA (CHARITEM MENU) (* kbr: "15-Dec-84 15:20") (PROG (COMMAND) (SETQ COMMAND (MENU EF.MENU)) (COND (COMMAND (APPLY* COMMAND CHARITEM MENU)))))) (EF.CHANGESIZE (LAMBDA (CHARITEM MENU) (* kbr: "16-Oct-85 23:03") (* Change height & width of CHARITEM's BITMAP *) (PROG (HEIGHT WIDTH NEWBITMAP WINDOW) (SETQ WINDOW (WFROMMENU MENU)) (SETQ HEIGHT (EF.PROMPT "New height?" WINDOW)) (COND ((NULL HEIGHT) (EF.MESSAGE "Aborted." WINDOW) (RETURN))) (SETQ HEIGHT (EVAL HEIGHT)) (SETQ WIDTH (EF.PROMPT "New width?" WINDOW)) (COND ((NULL WIDTH) (EF.MESSAGE "Aborted." WINDOW) (RETURN))) (SETQ WIDTH (EVAL WIDTH)) (SETQ NEWBITMAP (BITMAPCREATE WIDTH HEIGHT)) (BITBLT (fetch (CHARITEM BITMAP) of CHARITEM) NIL NIL NEWBITMAP) (UNINTERRUPTABLY (replace (CHARITEM BITMAP) of CHARITEM with NEWBITMAP) (replace (CHARITEM DUMMYFLG) of CHARITEM with NIL)) (UPDATE/MENU/IMAGE MENU) (REDISPLAYW (WFROMMENU MENU))))) (EF.DELETE (LAMBDA (CHARITEM MENU) (* kbr: "15-Dec-84 15:20") (* Turn CHARITEM into dummy charitem. *) (PROG (WINDOW CHARITEMS DUMMYBITMAP) (SETQ WINDOW (WFROMMENU MENU)) (SETQ CHARITEMS (WINDOWPROP WINDOW (QUOTE CHARITEMS))) (SETQ DUMMYBITMAP (fetch (CHARITEM BITMAP) of (CAR (LAST CHARITEMS)))) (UNINTERRUPTABLY (replace (CHARITEM BITMAP) of CHARITEM with DUMMYBITMAP) (replace (CHARITEM DUMMYFLG) of CHARITEM with T)) (UPDATE/MENU/IMAGE MENU) (REDISPLAYW (WFROMMENU MENU))))) (EF.ENTER (LAMBDA (CHARITEM MENU) (* kbr: "15-Dec-84 15:20") (* Enter BITMAP of CHARITEM. *) (PROG (NEWBITMAP) (SETQ NEWBITMAP (EF.PROMPT "Enter new bitmap (evaluated):")) (COND ((NULL NEWBITMAP) (printout T "Aborted." T)) ((type? BITMAP NEWBITMAP) (UNINTERRUPTABLY (replace (CHARITEM BITMAP) of CHARITEM with NEWBITMAP) (replace (CHARITEM DUMMYFLG) of CHARITEM with NIL)) (UPDATE/MENU/IMAGE MENU) (REDISPLAYW (WFROMMENU MENU))) (T (LISPERROR "ILLEGAL ARG" NEWBITMAP)))))) (EF.REPLACE (LAMBDA (CHARITEM MENU) (* kbr: "16-Oct-85 23:04") (* Replace BITMAP of CHARITEM. *) (PROG (BITMAP WINDOW) (SETQ WINDOW (WFROMMENU MENU)) (SETQ BITMAP (EF.PROMPT "New bitmap?" WINDOW)) (COND ((NULL BITMAP) (EF.MESSAGE "Aborted." WINDOW)) ((type? BITMAP BITMAP) (UNINTERRUPTABLY (replace (CHARITEM BITMAP) of CHARITEM with BITMAP) (replace (CHARITEM DUMMYFLG) of CHARITEM with NIL)) (UPDATE/MENU/IMAGE MENU) (REDISPLAYW (WFROMMENU MENU))) (T (LISPERROR "ILLEGAL ARG" BITMAP)))))) (EF.SAVE (LAMBDA (WINDOW) (* kbr: "21-Oct-85 15:39") (* Save EDITFONT changes to FONT. *) (PROG (CHARITEMS FONT CB CBWIDTH CBHEIGHT WIDTHS OFFSETS HEIGHT WIDTH DUMMYOFFSET OFFSET BITMAP FIRSTCHAR LASTCHAR CHARSET CSINFO) (SETQ CHARITEMS (WINDOWPROP WINDOW (QUOTE CHARITEMS))) (SETQ FONT (WINDOWPROP WINDOW (QUOTE FONT))) (* New allocations. *) (SETQ CBWIDTH 0) (SETQ CBHEIGHT 0) (for I from 0 to DUMMYINDEX as CHARITEM in CHARITEMS when (OR (NOT (fetch (CHARITEM DUMMYFLG) of CHARITEM)) (IEQP I DUMMYINDEX)) do (SETQ BITMAP (fetch (CHARITEM BITMAP) of CHARITEM)) (SETQ CBWIDTH (IPLUS CBWIDTH (fetch (BITMAP BITMAPWIDTH ) of BITMAP))) (SETQ CBHEIGHT (IMAX CBHEIGHT (fetch (BITMAP BITMAPHEIGHT ) of BITMAP)))) (SETQ CSINFO (create CHARSETINFO CHARSETASCENT ←(fetch (FONTDESCRIPTOR \SFAscent) of FONT) CHARSETDESCENT ←(fetch (FONTDESCRIPTOR \SFDescent) of FONT))) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) (* Store new info in allocations. *) (SETQ OFFSET 0) (SETQ DUMMYOFFSET (IDIFFERENCE CBWIDTH (fetch (BITMAP BITMAPWIDTH) of (fetch (CHARITEM BITMAP) of (CAR (LAST CHARITEMS)))))) (SETQ CB (BITMAPCREATE CBWIDTH CBHEIGHT)) (for I from 0 to DUMMYINDEX as CHARITEM in CHARITEMS do (SETQ BITMAP (fetch (CHARITEM BITMAP) of CHARITEM)) (SETQ WIDTH (fetch (BITMAP BITMAPWIDTH) of BITMAP)) (SETQ HEIGHT (fetch (BITMAP BITMAPHEIGHT) of BITMAP)) (\FSETWIDTH WIDTHS I WIDTH) (COND ((AND (fetch (CHARITEM DUMMYFLG) of CHARITEM) (NOT (IEQP I DUMMYINDEX))) (\FSETOFFSET OFFSETS I DUMMYOFFSET)) (T (\FSETOFFSET OFFSETS I OFFSET) (BITBLT BITMAP 0 0 CB OFFSET 0 WIDTH HEIGHT (QUOTE INPUT) (QUOTE REPLACE)) (SETQ OFFSET (IPLUS OFFSET WIDTH))))) (* FIRSTCHAR & LASTCHAR. (I wonder what you're suppose to do if there aren't any chars?) *) (SETQ FIRSTCHAR (\CHAR8CODE (fetch (CHARITEM CHARCODE) of (for CHARITEM in CHARITEMS thereis (NOT (fetch (CHARITEM DUMMYFLG) of CHARITEM))) ))) (SETQ LASTCHAR (\CHAR8CODE (fetch (CHARITEM CHARCODE) of (for CHARITEM in (REVERSE CHARITEMS) thereis (NOT (fetch (CHARITEM DUMMYFLG) of CHARITEM)))) )) (SETQ CHARSET (\CHARSET (fetch (CHARITEM CHARCODE) of (CAR CHARITEMS)))) (* Store new info. *) (UNINTERRUPTABLY (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with CB) (replace (CHARSETINFO WIDTHS) of CSINFO with WIDTHS) (replace (CHARSETINFO OFFSETS) of CSINFO with OFFSETS) (\FONTRESETCHARWIDTHS CSINFO FIRSTCHAR LASTCHAR) (replace (CHARSETINFO IMAGEWIDTHS) of CSINFO with WIDTHS)) (* OKEY DOKEY. *) ))) (EF.BLANK (LAMBDA (FAMILY SIZE FACE FIRSTCHAR LASTCHAR ASCENT DESCENT WIDTH) (* kbr: "21-Oct-85 15:25") (PROG (FONT CSINFO WIDTHS DUMMYWIDTH OFFSETS DUMMYOFFSET CB CBWIDTH CBHEIGHT) (SETQ FAMILY (U-CASE FAMILY)) (COND ((NOT (FIXP SIZE)) (LISPERROR "ILLEGAL ARG" SIZE))) (SETQ FACE (\FONTFACE FACE)) (COND ((NOT (SMALLP FIRSTCHAR)) (LISPERROR "ILLEGAL ARG" FIRSTCHAR))) (COND ((NOT (SMALLP LASTCHAR)) (LISPERROR "ILLEGAL ARG" LASTCHAR))) (COND ((NOT (SMALLP ASCENT)) (LISPERROR "ILLEGAL ARG" ASCENT))) (COND ((NOT (SMALLP DESCENT)) (LISPERROR "ILLEGAL ARG" DESCENT))) (COND ((NOT (OR (FIXP WIDTH) (AND (LISTP WIDTH) (NOT (for W in WIDTH thereis (NOT (FIXP W)))) (IEQP (LENGTH WIDTH) (IPLUS LASTCHAR (IMINUS FIRSTCHAR) 1 1))))) (LISPERROR "ILLEGAL ARG" WIDTH))) (* WIDTHS. *) (SETQ CSINFO (create CHARSETINFO CHARSETASCENT ← ASCENT CHARSETDESCENT ← DESCENT)) (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) (COND ((LISTP WIDTH) (SETQ DUMMYWIDTH (CAR (LAST WIDTH))) (for I from 0 to (SUB1 FIRSTCHAR) do (\FSETWIDTH WIDTHS I DUMMYWIDTH)) (for I from FIRSTCHAR to LASTCHAR as W in WIDTH do (\FSETWIDTH WIDTHS I W)) (for I from (ADD1 LASTCHAR) to DUMMYINDEX do (\FSETWIDTH WIDTHS I DUMMYWIDTH))) (T (for I from 0 to DUMMYINDEX do (\FSETWIDTH WIDTHS I WIDTH)))) (* OFFSETS. *) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) (for I from FIRSTCHAR to (ADD1 LASTCHAR) do (\FSETOFFSET OFFSETS (ADD1 I) (IPLUS (\FGETOFFSET OFFSETS I) (\FGETWIDTH WIDTHS I)))) (SETQ DUMMYOFFSET (\FGETOFFSET OFFSETS (ADD1 LASTCHAR))) (for I from 0 to (SUB1 FIRSTCHAR) do (\FSETOFFSET OFFSETS I DUMMYOFFSET)) (for I from (ADD1 LASTCHAR) to DUMMYINDEX do (\FSETOFFSET OFFSETS I DUMMYOFFSET)) (* Characterbitmap CB. *) (SETQ CBHEIGHT (IPLUS ASCENT DESCENT)) (SETQ CBWIDTH (IPLUS (\FGETOFFSET OFFSETS DUMMYINDEX) (\FGETWIDTH WIDTHS DUMMYINDEX))) (SETQ CB (BITMAPCREATE CBWIDTH CBHEIGHT)) (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with CB) (* FONT. *) (\FONTRESETCHARWIDTHS CSINFO FIRSTCHAR LASTCHAR) (replace (CHARSETINFO IMAGEWIDTHS) of CSINFO with (fetch (CHARSETINFO WIDTHS) of CSINFO)) (SETQ FONT (create FONTDESCRIPTOR FONTDEVICE ←(QUOTE DISPLAY) FONTFAMILY ← FAMILY FONTSIZE ← SIZE FONTFACE ← FACE \SFAscent ← 0 \SFDescent ← 0 \SFHeight ← 0 ROTATION ← 0 FONTDEVICESPEC ←(LIST FAMILY SIZE FACE 0 (QUOTE DISPLAY)))) (replace (FONTDESCRIPTOR \SFAscent) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFAscent) of FONT) (fetch (CHARSETINFO CHARSETASCENT) of CSINFO))) (replace (FONTDESCRIPTOR \SFDescent) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFDescent) of FONT) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO))) (replace (FONTDESCRIPTOR \SFHeight) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFHeight) of FONT) (IPLUS (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)))) (\SETCHARSETINFO (fetch (FONTDESCRIPTOR FONTCHARSETVECTOR) of FONT) 0 CSINFO) (replace (FONTDESCRIPTOR FONTAVGCHARWIDTH) of FONT with (\AVGCHARWIDTH FONT)) (RETURN FONT)))) (COPYFONT (LAMBDA (FONT) (* kbr: "21-Oct-85 14:55") (PROG (NEWFONT NEWCHARSETVECTOR OLDCHARSETVECTOR NEWCSINFO OLDCSINFO) (SETQ NEWFONT (create FONTDESCRIPTOR using FONT)) (SETQ NEWCHARSETVECTOR (\ALLOCBLOCK (ADD1 \MAXCHARSET) T)) (SETQ OLDCHARSETVECTOR (fetch (FONTDESCRIPTOR FONTCHARSETVECTOR) of FONT)) (for CHARSET from 0 to \MAXCHARSET do (SETQ OLDCSINFO (\GETBASEPTR OLDCHARSETVECTOR (UNFOLD CHARSET 2))) (COND (OLDCSINFO (SETQ NEWCSINFO (create CHARSETINFO CHARSETASCENT ←(fetch (CHARSETINFO CHARSETASCENT ) of OLDCSINFO) CHARSETDESCENT ←(fetch (CHARSETINFO CHARSETDESCENT) of OLDCSINFO) CHARSETBITMAP ←(COPYALL (fetch (CHARSETINFO CHARSETBITMAP) of OLDCSINFO)))) (\BLT (fetch (CHARSETINFO WIDTHS) of NEWCSINFO) (fetch (CHARSETINFO WIDTHS) of OLDCSINFO) (ADD1 DUMMYINDEX)) (\BLT (fetch (CHARSETINFO OFFSETS) of NEWCSINFO) (fetch (CHARSETINFO OFFSETS) of OLDCSINFO) (ADD1 DUMMYINDEX)) (replace (CHARSETINFO IMAGEWIDTHS) of NEWCSINFO with (fetch (CHARSETINFO WIDTHS) of NEWCSINFO)) (\PUTBASEPTR NEWCHARSETVECTOR (UNFOLD CHARSET 2) NEWCSINFO)))) (RETURN NEWFONT)))) (READSTRIKEFONTFILE (LAMBDA (FAMILY SIZE FACE FILE FONT CHARSET) (* kbr: "14-Oct-85 11:16") (* Very similar to \READSTRIKEFONTFILE of <LISPCORE>SOURCES>FONT. Returns fontdescriptor FONT. *) (PROG (STRM CSINFO NUMBCODES RW BITMAP OFFSETS FIRSTCHAR LASTCHAR HEIGHT WIDTHS) (* This part imitates \READSTRIKEFONTFILE *) (SETQ STRM (OPENSTREAM FILE (QUOTE INPUT) (QUOTE OLD))) (SETQ CSINFO (create CHARSETINFO)) (\WIN STRM) (SETQ FIRSTCHAR (\WIN STRM)) (* minimum ascii code) (SETQ LASTCHAR (\WIN STRM)) (* maximum ascii code) (\WIN STRM) (* MaxWidth which isn't used by anyone.) (\WIN STRM) (* number of words in this StrikeBody) (replace (CHARSETINFO CHARSETASCENT) of CSINFO with (\WIN STRM))(* ascent in scan lines (=FBBdy+FBBoy)) (replace (CHARSETINFO CHARSETDESCENT) of CSINFO with (\WIN STRM)) (* descent in scan-lines (=FBBoy)) (\WIN STRM) (* offset in bits (<0 for kerning, else 0, =FBBox)) (SETQ RW (\WIN STRM)) (* raster width of bitmap) (* height of bitmap) (SETQ HEIGHT (IPLUS (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO))) (SETQ BITMAP (BITMAPCREATE (UNFOLD RW BITSPERWORD) HEIGHT)) (\BINS STRM (fetch (BITMAP BITMAPBASE) of BITMAP) 0 (UNFOLD (ITIMES RW HEIGHT) BYTESPERWORD)) (* read bits into bitmap) (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with BITMAP) (SETQ NUMBCODES (IPLUS (IDIFFERENCE LASTCHAR FIRSTCHAR) 3)) (* SETQ OFFSETS (ARRAY (IPLUS \MAXCHAR 3) (QUOTE SMALLPOSP) 0 0)) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) (* initialise the offsets to 0) (for I from 0 to (IPLUS \MAXTHINCHAR 2) do (\FSETOFFSET OFFSETS I 0)) (* AIN OFFSETS FIRSTCHAR NUMBCODES STRM) (for I from FIRSTCHAR as J from 1 to NUMBCODES do (\FSETOFFSET OFFSETS I (\WIN STRM))) (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) (for I from 0 to (IPLUS \MAXTHINCHAR 2) do (\FSETWIDTH WIDTHS I 0)) (* replace WIDTHS of CSINFO with (ARRAY (IPLUS \MAXCHAR 3) (QUOTE SMALLPOSP) 0 0)) (\FONTRESETCHARWIDTHS CSINFO FIRSTCHAR LASTCHAR) (replace (CHARSETINFO IMAGEWIDTHS) of CSINFO with (fetch (CHARSETINFO WIDTHS) of CSINFO)) (CLOSEF STRM) (* This part imitates \CREATEDISPLAYFONT *) (COND ((NULL CHARSET) (SETQ CHARSET 0))) (COND ((NULL FONT) (SETQ FONT (create FONTDESCRIPTOR FONTDEVICE ←(QUOTE DISPLAY) FONTFAMILY ← FAMILY FONTSIZE ← SIZE FONTFACE ← FACE \SFAscent ← 0 \SFDescent ← 0 \SFHeight ← 0 ROTATION ← 0 FONTDEVICESPEC ←(LIST FAMILY SIZE FACE 0 (QUOTE DISPLAY)))))) (* This part imitates \CREATECHARSET. *) (replace (FONTDESCRIPTOR \SFAscent) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFAscent) of FONT) (fetch (CHARSETINFO CHARSETASCENT) of CSINFO))) (replace (FONTDESCRIPTOR \SFDescent) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFDescent) of FONT) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO))) (replace (FONTDESCRIPTOR \SFHeight) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFHeight) of FONT) (IPLUS (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)))) (\SETCHARSETINFO (fetch (FONTDESCRIPTOR FONTCHARSETVECTOR) of FONT) CHARSET CSINFO) (replace (FONTDESCRIPTOR FONTAVGCHARWIDTH) of FONT with (\AVGCHARWIDTH FONT)) (RETURN FONT)))) (WRITESTRIKEFONTFILE (LAMBDA (FONT CHARSET FILE) (* kbr: "21-Oct-85 15:08") (* Write strike FILE using info in FONT. *) (PROG (STREAM CSINFO FIRSTCHAR LASTCHAR WIDTH MAXWIDTH LENGTH RASTERWIDTH DUMMYCHAR DUMMYOFFSET OFFSET PREVIOUSOFFSET WIDTH CODE) (COND ((NOT (FONTP FONT)) (LISPERROR "ILLEGAL ARG" FONT))) (COND ((NULL CHARSET) (SETQ CHARSET 0)) ((NOT (AND (IGEQ CHARSET 0) (ILESSP CHARSET \MAXCHARSET))) (LISPERROR "ILLEGAL ARG" CHARSET))) (SETQ CSINFO (\GETCHARSETINFO CHARSET FONT T)) (COND ((NULL CSINFO) (ERROR "Couldn't find charset " CHARSET))) (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) (SETQ DUMMYOFFSET (\FGETOFFSET OFFSETS DUMMYINDEX)) (SETQ FIRSTCHAR (for I from 0 to MAXCODE thereis (NOT (EQ (\FGETOFFSET OFFSETS I) DUMMYOFFSET)))) (SETQ LASTCHAR (for I from MAXCODE to 0 by -1 thereis (NOT (EQ (\FGETOFFSET OFFSETS I) DUMMYOFFSET)))) (SETQ DUMMYCHAR (ADD1 LASTCHAR)) (SETQ STREAM (OPENSTREAM FILE (QUOTE OUTPUT) (QUOTE NEW) (QUOTE ((TYPE BINARY))))) (* STRIKE HEADER. *) (\WOUT STREAM 32768) (\WOUT STREAM FIRSTCHAR) (\WOUT STREAM LASTCHAR) (SETQ MAXWIDTH 0) (for I from 0 to DUMMYINDEX do (SETQ MAXWIDTH (IMAX MAXWIDTH (\FGETWIDTH WIDTHS I)))) (\WOUT STREAM MAXWIDTH) (* STRIKE BODY. *) (* Length. *) (SETQ RASTERWIDTH (fetch (BITMAP BITMAPRASTERWIDTH) of (fetch (CHARSETINFO CHARSETBITMAP) of CSINFO))) (SETQ LENGTH (IPLUS 8 (IDIFFERENCE LASTCHAR FIRSTCHAR) (ITIMES (fetch (FONTDESCRIPTOR \SFHeight) of FONT) RASTERWIDTH))) (\WOUT STREAM LENGTH) (* Ascent, Descent, Xoffset (no longer used) and Rasterwidth. *) (\WOUT STREAM (fetch (CHARSETINFO CHARSETASCENT) of CSINFO)) (\WOUT STREAM (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)) (\WOUT STREAM 0) (\WOUT STREAM RASTERWIDTH) (* Bitmap. *) (\BOUTS STREAM (fetch (BITMAP BITMAPBASE) of (fetch (CHARSETINFO CHARSETBITMAP) of CSINFO)) 0 (ITIMES 2 RASTERWIDTH (IPLUS (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)))) (* Offsets. *) (SETQ CODE 0) (\WOUT STREAM CODE) (for I from FIRSTCHAR to DUMMYCHAR do (SETQ OFFSET (\FGETOFFSET OFFSETS I)) (SETQ WIDTH (\FGETWIDTH WIDTHS I)) (COND ((AND (IEQP OFFSET DUMMYOFFSET) (NOT (IEQP I DUMMYCHAR))) (* CODE stays the same. *) ) (T (SETQ CODE (IPLUS CODE WIDTH)))) (\WOUT STREAM CODE)) (CLOSEF STREAM)))) ) (DEFINEQ (BLANKFONTCREATE (LAMBDA (FAMILY SIZE FACE FIRSTCHAR LASTCHAR ASCENT DESCENT WIDTH) (* mjs "27-Mar-85 14:48") (EF.BLANK FAMILY SIZE FACE FIRSTCHAR LASTCHAR ASCENT DESCENT WIDTH))) (EDITFONT (LAMBDA (FONT FROMCHARCODE TOCHARCODE) (* mjs "27-Mar-85 14:48") (EF.EDIT FONT FROMCHARCODE TOCHARCODE))) ) (EF.INIT) (PUTPROPS EDITFONT COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (1611 41511 (EF.INIT 1621 . 2730) (EF.EDIT 2732 . 5010) (EF.PROMPT 5012 . 5654) ( EF.MESSAGE 5656 . 5949) (EF.CLOSEFN 5951 . 6700) (EF.CHARITEMS 6702 . 9360) (EF.BUTTONEVENTFN 9362 . 9857) (EF.WHENSELECTEDFN 9859 . 10421) (EF.EDITBM 10423 . 12313) (EF.MIDDLEBUTTONFN 12315 . 12643) ( EF.CHANGESIZE 12645 . 13916) (EF.DELETE 13918 . 14836) (EF.ENTER 14838 . 15739) (EF.REPLACE 15741 . 16670) (EF.SAVE 16672 . 21546) (EF.BLANK 21548 . 26894) (COPYFONT 26896 . 29237) (READSTRIKEFONTFILE 29239 . 36762) (WRITESTRIKEFONTFILE 36764 . 41509)) (41512 42024 (BLANKFONTCREATE 41522 . 41789) ( EDITFONT 41791 . 42022))))) STOP