1
0
mirror of synced 2026-05-06 08:02:36 +00:00

Compare commits

..

1 Commits

Author SHA1 Message Date
rmkaplan
05920d8165 Previous version was smashed 2026-04-18 14:22:38 -07:00
3 changed files with 186 additions and 296 deletions

View File

@@ -1,17 +1,18 @@
(DEFINE-FILE-INFO PACKAGE (DEFPACKAGE "BDF" (USE "XCL" "LISP") (EXPORT "READ-BDF" "BUILD-COMPOSITE"
"WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE") (IMPORT-FROM "IL" "BITBLT" "BITMAPBIT" "BITMAPCREATE"
"BITMAPHEIGHT" "BITMAPWIDTH" "BLACKSHADE" "BLTSHADE" "BOLD" "COMPRESSED" "CHARSETINFO" "DISPLAY"
"FONTDESCRIPTOR" "FONTP" "FONTPROP" "INPUT" "ITALIC" "LIGHT" "LRSH" "MCCS" "MEDIUM" "REGULAR" "TCONC"
"UTOMCODE?" "MEDLEYFONT.FILENAME" "MEDLEYFONT.WRITE.FONT")) READTABLE "XCL" BASE 10)
"BITMAPHEIGHT" "BITMAPWIDTH" "BLACKSHADE" "BLTSHADE" "BOLD" "COMPRESSED" "CHARSETINFO" "CHARSETPROP"
"DISPLAY" "FONTDESCRIPTOR" "FONTP" "FONTPROP" "INPUT" "ITALIC" "LIGHT" "LRSH" "MCCS" "MEDIUM"
"REGULAR" "TCONC" "UTOMCODE?" "MEDLEYFONT.FILENAME" "MEDLEYFONT.WRITE.FONT")) READTABLE "XCL" BASE
10)
(IL:FILECREATED "16-Mar-2026 16:37:31" IL:|{DSK}<home>matt>Interlisp>medley>lispusers>READ-BDF.;22| 58094
(IL:FILECREATED " 8-Dec-2025 12:13:40" IL:|{DSK}<home>matt>Interlisp>medley>lispusers>READ-BDF.;9| 51309
:EDIT-BY "mth"
:CHANGES-TO (IL:FUNCTIONS READ-GLYPH READ-BDF BDF-TO-FONTDESCRIPTOR GLYPHS-BY-CHARSET
WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE BDF-TO-CHARSETINFO)
:CHANGES-TO (IL:FUNCTIONS BDF-TO-CHARSETINFO BDF-TO-FONTDESCRIPTOR)
(FILE-ENVIRONMENTS "READ-BDF")
:PREVIOUS-DATE "23-Feb-2026 20:11:48" IL:|{DSK}<home>matt>Interlisp>medley>lispusers>READ-BDF.;21|
:PREVIOUS-DATE " 8-Dec-2025 12:12:47" IL:|{DSK}<home>matt>Interlisp>medley>lispusers>READ-BDF.;8|
)
@@ -19,7 +20,7 @@
(IL:RPAQQ IL:READ-BDFCOMS
((IL:STRUCTURES BDF-FONT GLYPH XLFD)
(IL:VARIABLES GLYPH-PROCESSING-HOOK MAXCHARSET MAXTHINCHAR NOMAPPINGCHARSET)
(IL:VARIABLES MAXCHARSET MAXTHINCHAR NOMAPPINGCHARSET)
(IL:FUNCTIONS BDF-TO-CHARSETINFO BDF-TO-FONTDESCRIPTOR BUILD-COMPOSITE CHAR-PRESENT-BIT
COUNT-MCHARS GLYPHS-BY-CHARSET PACKFILENAME.STRING READ-BDF
READ-DELIMITED-LIST-FROM-STRING READ-GLYPH WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE
@@ -70,17 +71,13 @@
(CHARSET昱EGISTRY NIL :TYPE STRING)
(CHARSET挂NCODING NIL :TYPE STRING))
(DEFVAR GLYPH-PROCESSING-HOOK NIL)
(DEFCONSTANT MAXCHARSET 255)
(DEFCONSTANT MAXTHINCHAR 255)
(DEFCONSTANT NOMAPPINGCHARSET (1+ MAXCHARSET))
(DEFUN BDF-TO-CHARSETINFO (FONT CSET SLUGWIDTH &KEY AS-UNICODE)
(IL:* IL:\; "Edited 16-Mar-2026 16:35 by mth")
(IL:* IL:\; "Edited 8-Dec-2025 12:13 by mth")
(DEFUN BDF-TO-CHARSETINFO (FONT CSET SLUGWIDTH) (IL:* IL:\; "Edited 8-Dec-2025 12:13 by mth")
(IL:* IL:\; "Edited 30-Nov-2025 00:12 by mth")
(IL:* IL:\; "Edited 28-Nov-2025 16:37 by mth")
(IL:* IL:\; "Edited 26-Nov-2025 21:18 by mth")
@@ -110,7 +107,7 @@
(IL:* IL:|;;| "If passed a BDF-FONT, look only at glyphs in the mapped charsets")
(DESTRUCTURING-SETQ (GBCS SW)
(GLYPHS-BY-CHARSET FONT :AS-UNICODE AS-UNICODE)))
(GLYPHS-BY-CHARSET FONT)))
(T (ERROR "Invalid FONT: ~S" FONT)))
(UNLESS (AND (INTEGERP SLUGWIDTH)
(PLUSP SLUGWIDTH))
@@ -129,9 +126,7 @@
(IMAGEWIDTHS (IL:\\CREATECSINFOELEMENT))
(DLEFT 0)
GLYPHS-LIMITS BMAP OFFSETS HEIGHT WIDTHS)
(IL:CHARSETPROP CSINFO 'IL:CSCHARENCODING (IF AS-UNICODE
'IL:UNICODE
'MCCS))
(CHARSETPROP CSINFO 'IL:CSCHARENCODING 'MCCS)
(LOOP :FOR XGL :IN CSGLYPHS :DO (LET* ((MCODE (CAR XGL))
(GL (CDR XGL))
(GWIDTH (GLYPH-WIDTH GL))
@@ -206,8 +201,7 @@
'IL:REPLACE)
CSINFO))))
(DEFUN BDF-TO-FONTDESCRIPTOR (BDFONT FAMILY SIZE FACE ROTATION DEVICE &KEY AS-UNICODE)
(IL:* IL:\; "Edited 16-Mar-2026 16:16 by mth")
(DEFUN BDF-TO-FONTDESCRIPTOR (BDFONT FAMILY SIZE FACE ROTATION DEVICE)
(IL:* IL:\; "Edited 8-Dec-2025 12:11 by mth")
(IL:* IL:\; "Edited 2-Dec-2025 16:10 by mth")
(IL:* IL:\; "Edited 30-Nov-2025 15:59 by mth")
@@ -226,8 +220,7 @@
(OR SIZE (FONTPROP FAMILY 'IL:SIZE))
(OR FACE (FONTPROP FAMILY 'IL:FACE))
(OR ROTATION (FONTPROP FAMILY 'IL:ROTATION))
(OR DEVICE (FONTPROP FAMILY 'IL:DEVICE))
:AS-UNICODE AS-UNICODE)))
(OR DEVICE (FONTPROP FAMILY 'IL:DEVICE)))))
(WHEN (CONSP FAMILY) (IL:* IL:\;
 "Because (LISTP NIL) == T !!!")
@@ -247,8 +240,7 @@
0)
(OR DEVICE (IL:|fetch| (IL:FONTSPEC IL:FSDEVICE)
IL:|of| FAMILY)
'DISPLAY)
:AS-UNICODE AS-UNICODE)))
'DISPLAY))))
(LET ((XLFD (BF-XLFD BDFONT))
FONTDESC GBCSL CHARSETS SLUGWIDTH)
(SETQ FAMILY (IL:\\FONTSYMBOL (OR FAMILY (XLFD-FAMILY XLFD))))
@@ -288,7 +280,7 @@
'IL:MRR)
NIL DEVICE))
(DESTRUCTURING-SETQ (GBCSL SLUGWIDTH)
(GLYPHS-BY-CHARSET BDFONT :AS-UNICODE AS-UNICODE))
(GLYPHS-BY-CHARSET BDFONT))
(UNLESS SLUGWIDTH
(IL:* IL:|;;|
@@ -308,21 +300,16 @@
IL:ROTATION IL:_ ROTATION
IL:FONTDEVICESPEC IL:_ (LIST FAMILY SIZE FACE ROTATION DEVICE)
IL:FONTSLUGWIDTH IL:_ SLUGWIDTH
IL:FONTCHARENCODING IL:_ (IF AS-UNICODE
'IL:UNICODE
'MCCS)))
IL:FONTCHARENCODING IL:_ 'MCCS))
(SETQ CHARSETS (LOOP :FOR CS :IN GBCSL :WITH CSET :WITH CSINFO :NCONC
(WHEN (<= 0 (SETQ CSET (FIRST CS))
MAXCHARSET)
(SETQ CSINFO (BDF-TO-CHARSETINFO GBCSL CSET (1+ SLUGWIDTH)
:AS-UNICODE AS-UNICODE))
(SETQ CSINFO (BDF-TO-CHARSETINFO GBCSL CSET (1+ SLUGWIDTH)))
(IL:\\INSTALLCHARSETINFO FONTDESC CSINFO CSET)
(LIST CSET)))))
(LIST FONTDESC CHARSETS))))
(DEFUN BUILD-COMPOSITE (FONTS &KEY VERBOSE (BLOCKING T))
(IL:* IL:\; "Edited 19-Feb-2026 21:45 by mth")
(IL:* IL:\; "Edited 1-Dec-2025 23:07 by mth")
(DEFUN BUILD-COMPOSITE (FONTS &KEY VERBOSE) (IL:* IL:\; "Edited 1-Dec-2025 23:07 by mth")
(IL:* IL:\; "Edited 30-Nov-2025 12:32 by mth")
(IL:* IL:\; "Edited 26-Nov-2025 21:23 by mth")
(IL:* IL:\; "Edited 18-Nov-2025 21:22 by mth")
@@ -340,61 +327,53 @@
(WHEN VERBOSE
(FORMAT *STANDARD-OUTPUT* "~&Loading initial font file: ~A~%" (NAMESTRING BASE-FONT)
))
(SETQ BASE-FONT (READ-BDF BASE-FONT :MCCS-ONLY T :VERBOSE VERBOSE))
(WHEN BLOCKING (IL:BLOCK)))
(SETQ BASE-FONT (READ-BDF BASE-FONT :MCCS-ONLY T :VERBOSE VERBOSE)))
((NOT (BDF-FONT-P BASE-FONT))
(ERROR "Initial font (~S) is not a BDF-FONT, nor string, nor pathname." BASE-FONT)))
(WHEN VERBOSE
(FORMAT *STANDARD-OUTPUT* "~&Initial font contains ~D MCCS characters.~%"
(SETQ CHAR-COUNT (COUNT-MCHARS BASE-FONT))))
(SETQ MCHAR-PRESENT (BF-MCHAR-PRESENT BASE-FONT))
(LOOP :FOR FILL-FONT :IN FILL-FROM :WITH PREV-CC :WITH FF-NAME :WHEN FILL-FONT :DO
(FLET ((MERGE-GLYPH (GL &AUX V)
(SETQ V (GLYPH-ENCODING GL))
(WHEN (AND (LISTP V)
(EQ (FIRST V)
-1))
(SETQ V (OR (SECOND V)
-1)))
(LOOP :FOR FILL-FONT :IN FILL-FROM :WITH PREV-CC :WHEN FILL-FONT :DO
(COND
((OR (STRINGP FILL-FONT)
(PATHNAMEP FILL-FONT))
(UNLESS (IL:INFILEP FILL-FONT)
(ERROR "Subsequent font ~S doesn't exist or is unreadable." (NAMESTRING
FILL-FONT)))
(WHEN VERBOSE
(FORMAT *STANDARD-OUTPUT* "~&Loading subsequent font file: ~A~%" (NAMESTRING
FILL-FONT)))
(SETQ FILL-FONT (READ-BDF FILL-FONT :MCCS-ONLY T :VERBOSE VERBOSE)))
((NOT (BDF-FONT-P FILL-FONT))
(ERROR "Subsequent font (~S) is not a BDF-FONT, nor string, nor pathname."
FILL-FONT)))
(SETQ PREV-CC CHAR-COUNT)
(LOOP :FOR GL :IN (BF-GLYPHS FILL-FONT)
:WITH V :DO (SETQ V (GLYPH-ENCODING GL))
(WHEN (AND (LISTP V)
(EQ (FIRST V)
-1))
(SETQ V (OR (SECOND V)
-1)))
(IL:* IL:|;;|
(IL:* IL:|;;|
 "Need to change this use of UTOMCODE? based on the CHARSET昱EGISTRY of the XLFD of FILL-FONT")
(WHEN (AND (UTOMCODE? V)
(ZEROP (CHAR-PRESENT-BIT MCHAR-PRESENT V)))
(CHAR-PRESENT-BIT MCHAR-PRESENT V 1)
(WHEN (AND (UTOMCODE? V)
(ZEROP (CHAR-PRESENT-BIT MCHAR-PRESENT V)))
(CHAR-PRESENT-BIT MCHAR-PRESENT V 1)
(IL:* IL:|;;|
(IL:* IL:|;;|
 "What other bookkeping of BASE-FONT needs to be done when adding a glyph? Any?")
(PUSH GL (BF-GLYPHS BASE-FONT)))
NIL))
(COND
((OR (STRINGP FILL-FONT)
(PATHNAMEP FILL-FONT))
(SETQ FF-NAME (NAMESTRING FILL-FONT))
(UNLESS (IL:INFILEP FILL-FONT)
(ERROR "Subsequent font ~S doesn't exist or is unreadable." FF-NAME))
(WHEN VERBOSE (FORMAT *STANDARD-OUTPUT*
"~&Loading subsequent font file: ~A~%" FF-NAME))
(LET ((GLYPH-PROCESSING-HOOK #'MERGE-GLYPH))
(READ-BDF FILL-FONT :MCCS-ONLY T :VERBOSE VERBOSE)
(SETQ FILL-FONT NIL))
(WHEN BLOCKING (IL:BLOCK)))
((NOT (BDF-FONT-P FILL-FONT))
(ERROR "Subsequent font (~S) is not a BDF-FONT, nor string, nor pathname."
FF-NAME)))
(SETQ PREV-CC CHAR-COUNT)
(WHEN FILL-FONT
(LOOP :FOR GL :IN (BF-GLYPHS FILL-FONT)
:DO
(MERGE-GLYPH GL)))
(SETQ CHAR-COUNT (COUNT-MCHARS BASE-FONT))
(WHEN VERBOSE
(FORMAT *STANDARD-OUTPUT*
"~&Font ~A supplied ~D additional MCCS characters.~%" FF-NAME
(- (SETQ CHAR-COUNT (COUNT-MCHARS BASE-FONT))
PREV-CC)))))
(PUSH GL (BF-GLYPHS BASE-FONT))))
(SETQ CHAR-COUNT (COUNT-MCHARS BASE-FONT))
(WHEN VERBOSE
(FORMAT *STANDARD-OUTPUT* "~&Font ~A supplied ~D additional MCCS characters.~%"
(NAMESTRING FILL-FONT)
(- (SETQ CHAR-COUNT (COUNT-MCHARS BASE-FONT))
PREV-CC))))
BASE-FONT))
(DEFUN CHAR-PRESENT-BIT (BM MCODE &OPTIONAL (NEWBIT -1 SBIT)
@@ -422,8 +401,7 @@
(LET ((MCPBM (BF-MCHAR-PRESENT BDFONT)))
(LOOP :FOR MC :FROM 0 :TO 65535 :COUNT (PLUSP (CHAR-PRESENT-BIT MCPBM MC))))))
(DEFUN GLYPHS-BY-CHARSET (FONT &KEY AS-UNICODE) (IL:* IL:\; "Edited 16-Mar-2026 16:06 by mth")
(IL:* IL:\; "Edited 30-Nov-2025 17:36 by mth")
(DEFUN GLYPHS-BY-CHARSET (FONT) (IL:* IL:\; "Edited 30-Nov-2025 17:36 by mth")
(IL:* IL:\; "Edited 28-Nov-2025 17:24 by mth")
(IL:* IL:\; "Edited 26-Nov-2025 20:50 by mth")
(IL:* IL:\; "Edited 20-Nov-2025 12:01 by mth")
@@ -493,9 +471,7 @@
X))
Y))))
(DEFUN READ-BDF (PATH &KEY VERBOSE MCCS-ONLY AS-UNICODE (EXTERNAL-FORMAT :ISO8859/1))
(IL:* IL:\; "Edited 16-Mar-2026 16:11 by mth")
(IL:* IL:\; "Edited 19-Feb-2026 21:42 by mth")
(DEFUN READ-BDF (PATH &KEY VERBOSE MCCS-ONLY (EXTERNAL-FORMAT :ISO8859/1))
(IL:* IL:\; "Edited 1-Dec-2025 22:40 by mth")
(IL:* IL:\; "Edited 30-Nov-2025 11:59 by mth")
(IL:* IL:\; "Edited 28-Nov-2025 17:39 by mth")
@@ -610,43 +586,16 @@
(PLUSP NGLYPHS))
(ERROR "Invalid BDF file - CHARS count (~A) is invalid or missing."
NGLYPHS))
(LOOP :REPEAT NGLYPHS :WITH ENC :WITH MC :DO
(SETQ GL (READ-GLYPH FILE-STREAM FONT :MCCS-ONLY MCCS-ONLY :AS-UNICODE
AS-UNICODE))
(LOOP :REPEAT NGLYPHS :WITH ENC :WITH MC :DO (SETQ GL (READ-GLYPH
FILE-STREAM
FONT))
(SETQ ENC (GLYPH-ENCODING GL))
(WHEN (AND (LISTP ENC)
(EQL (FIRST ENC)
-1))
(EQ (FIRST ENC)
-1))
(SETQ ENC (OR (SECOND ENC)
-1)))
(COND
(AS-UNICODE
(IL:* IL:|;;|
 "IS THIS TRUE IF REMAINING IN UNICODE ENCODING?")
(IL:* IL:|;;| "This glyph must have either a non-zero-width \"image\" or a non-zero-width \"escapement\", otherwise it cannot be mapped, no matter the UTOMCODE? value.")
(IL:* IL:|;;| "For now, assuming NOT TRUE")
(WHEN (AND GLYPH-PROCESSING-HOOK (FUNCTIONP
GLYPH-PROCESSING-HOOK
))
(SETQ GL (FUNCALL GLYPH-PROCESSING-HOOK GL)))
(WHEN GL
(IL:* IL:|;;|
 "Everything is mappable if in 0000-FFFF range")
(IF (<= 0 ENC 65535)
(PROGN (SETF (GLYPH-MCODE GL)
ENC)
(TCONC MAPPED-GLYPHS GL))
(TCONC UNMAPPED-GLYPHS GL)))
(IL:* IL:|;;| "Don't bother with MCHAR-PRESENT bits")
)
((AND (OR (PLUSP (GLYPH-BBW GL))
(PLUSP (FIRST (GLYPH-DWIDTH GL))))
(SETQ MC (UTOMCODE? ENC)))
@@ -666,200 +615,143 @@
(IL:* IL:|;;| "It ought to be safe to share the bitmap")
(WHEN (AND GLYPH-PROCESSING-HOOK (FUNCTIONP
GLYPH-PROCESSING-HOOK
))
(SETQ CGL (FUNCALL GLYPH-PROCESSING-HOOK CGL)))
(WHEN CGL (TCONC MAPPED-GLYPHS CGL))
(TCONC MAPPED-GLYPHS CGL)
(CHAR-PRESENT-BIT MCHAR-PRESENT CC 1)))
((NOT MCCS-ONLY)
(WHEN (AND GLYPH-PROCESSING-HOOK (FUNCTIONP GLYPH-PROCESSING-HOOK)
)
(SETQ GL (FUNCALL GLYPH-PROCESSING-HOOK GL)))
(WHEN GL (TCONC UNMAPPED-GLYPHS GL)))))
(T (TCONC UNMAPPED-GLYPHS GL))))
(SETF (BF-GLYPHS FONT)
(CAR MAPPED-GLYPHS))
(SETF (BF-UNMAPPED故LYPHS FONT)
(CAR UNMAPPED-GLYPHS)))
(ENDFONT (SETQ FONT-COMPLETE T)))))))))
(WHEN VERBOSE
(ENDFONT (SETQ FONT-COMPLETE T))))))))
(WHEN VERBOSE
(IL:* IL:|;;| "The SIZE reported needs clarification:")
(IL:* IL:|;;| "The SIZE reported needs clarification:")
(FORMAT *STANDARD-OUTPUT* "Name: ~A~%Family: ~A~%Sizes: Font: ~A Pixel: ~A Point: ~A (decipoints)~%Weight: ~A~%Slant: ~A~%Expansion: ~A~%Glyphs: ~D~%Unmapped glyphs: ~D~%"
(BF-NAME FONT)
(XLFD-FAMILY XLFD)
(FIRST (BF-SIZE FONT))
(XLFD-PIXEL昤IZE XLFD)
(XLFD-POINT昤IZE XLFD)
(XLFD-WEIGHT XLFD)
(XLFD-SLANT XLFD)
(XLFD-SETWIDTH昧AME XLFD)
(LENGTH (BF-GLYPHS FONT))
(LENGTH (BF-UNMAPPED故LYPHS FONT))))
FONT))
(FORMAT *STANDARD-OUTPUT* "Name: ~A~%Family: ~A~%Sizes: Font: ~A Pixel: ~A Point: ~A (decipoints)~%Weight: ~A~%Slant: ~A~%Expansion: ~A~%"
(BF-NAME FONT)
(XLFD-FAMILY XLFD)
(FIRST (BF-SIZE FONT))
(XLFD-PIXEL昤IZE XLFD)
(XLFD-POINT昤IZE XLFD)
(XLFD-WEIGHT XLFD)
(XLFD-SLANT XLFD)
(XLFD-SETWIDTH昧AME XLFD)))
FONT)))
(DEFUN READ-DELIMITED-LIST-FROM-STRING (INPUT-STRING &OPTIONAL (DELIMIT #\]))
(IL:* IL:\; "Edited 20-Aug-2024 16:46 by mth")
(WITH-INPUT-FROM-STRING (SI (CONCATENATE 'STRING INPUT-STRING " " (STRING DELIMIT)))
(READ-DELIMITED-LIST DELIMIT SI)))
(DEFUN READ-GLYPH (FILE-STREAM FONT &KEY MCCS-ONLY AS-UNICODE)
(IL:* IL:\; "Edited 16-Mar-2026 15:32 by mth")
(IL:* IL:\; "Edited 23-Feb-2026 20:11 by mth")
(IL:* IL:\; "Edited 19-Feb-2026 15:46 by mth")
(IL:* IL:\; "Edited 26-Nov-2025 23:32 by mth")
(DEFUN READ-GLYPH (FILE-STREAM FONT) (IL:* IL:\; "Edited 26-Nov-2025 23:32 by mth")
(IL:* IL:\; "Edited 17-Nov-2025 20:03 by mth")
(IL:* IL:\; "Edited 23-Apr-2025 17:53 by mth")
(IL:* IL:\; "Edited 21-Apr-2025 13:37 by mth")
(IL:* IL:\; "Edited 19-Apr-2025 09:32 by mth")
(IL:* IL:\; "Edited 17-Apr-2025 18:14 by mth")
(IL:* IL:\; "Edited 21-Aug-2024 01:10 by mth")
(LET
((GLYPH (MAKE-GLYPH :SWIDTH (COPY-LIST (BF-SWIDTH FONT))
:DWIDTH
(COPY-LIST (BF-DWIDTH FONT))
:SWIDTH1
(COPY-LIST (BF-SWIDTH1 FONT))
:DWIDTH1
(COPY-LIST (BF-DWIDTH1 FONT))
:VVECTOR
(COPY-LIST (BF-VVECTOR FONT))))
CHAR-COMPLETE ENC LINE ITEMS V KEY POS STARTED BBW BBH)
(LOOP
:UNTIL CHAR-COMPLETE :DO (SETQ LINE (READ-LINE FILE-STREAM))
(WHEN LINE (IL:* IL:\; "Ignore blank lines")
(MULTIPLE-VALUE-SETQ (KEY POS)
(READ-FROM-STRING LINE))
(WHEN (<= POS (LENGTH LINE))
(SETQ LINE (SUBSEQ LINE POS)))
(COND
((EQ KEY 'COMMENT) (IL:* IL:\; "Ignore COMMENT lines")
(LET ((GLYPH (MAKE-GLYPH :SWIDTH (COPY-LIST (BF-SWIDTH FONT))
:DWIDTH
(COPY-LIST (BF-DWIDTH FONT))
:SWIDTH1
(COPY-LIST (BF-SWIDTH1 FONT))
:DWIDTH1
(COPY-LIST (BF-DWIDTH1 FONT))
:VVECTOR
(COPY-LIST (BF-VVECTOR FONT))))
CHAR-COMPLETE LINE ITEMS V KEY POS STARTED BBW BBH)
(LOOP :UNTIL CHAR-COMPLETE :DO (SETQ LINE (READ-LINE FILE-STREAM))
(WHEN LINE (IL:* IL:\; "Ignore blank lines")
(MULTIPLE-VALUE-SETQ (KEY POS)
(READ-FROM-STRING LINE))
(WHEN (<= POS (LENGTH LINE))
(SETQ LINE (SUBSEQ LINE POS)))
(COND
((EQ KEY 'COMMENT) (IL:* IL:\; "Ignore COMMENT lines")
(IL:* IL:\;
 "Probably aren't \"legal\" here, anyway.")
)
((EQ KEY 'STARTCHAR)
(WHEN STARTED (ERROR "Invalid BDF file - STARTCHAR inside glyph."))
(SETF STARTED T)
(SETF (GLYPH-NAME GLYPH)
(STRING LINE)))
(T
(UNLESS STARTED (ERROR
)
((EQ KEY 'STARTCHAR)
(WHEN STARTED (ERROR "Invalid BDF file - STARTCHAR inside glyph."))
(SETF STARTED T)
(SETF (GLYPH-NAME GLYPH)
(STRING LINE)))
(T (UNLESS STARTED (ERROR
"Invalid BDF file - glyph has not been started. STARTCHAR missing."
))
(SETQ ITEMS (READ-DELIMITED-LIST-FROM-STRING LINE))
(CASE KEY
(ENCODING (SETF (GLYPH-ENCODING GLYPH)
(SETQ ENC (IF (EQL -1 (FIRST ITEMS))
ITEMS
(FIRST ITEMS)))))
(SWIDTH (SETF (GLYPH-SWIDTH GLYPH)
ITEMS))
(DWIDTH (SETF (GLYPH-DWIDTH GLYPH)
ITEMS))
(SWIDTH1 (SETF (GLYPH-SWIDTH1 GLYPH)
ITEMS))
(DWIDTH1 (SETF (GLYPH-DWIDTH1 GLYPH)
ITEMS))
(VVECTOR (SETF (GLYPH-VVECTOR GLYPH)
ITEMS))
(BBX (SETF (GLYPH-BBW GLYPH)
(SETQ BBW (FIRST ITEMS))
(GLYPH-BBH GLYPH)
(SETQ BBH (SECOND ITEMS))
(GLYPH-BBXOFF0 GLYPH)
(THIRD ITEMS)
(GLYPH-BBYOFF0 GLYPH)
(FOURTH ITEMS)))
(BITMAP
(UNLESS (ZEROP (* BBW BBH)) (IL:* IL:\;
 "Don't bother creating a BITMAP with no area")
(IF (AND (NOT AS-UNICODE)
MCCS-ONLY
(NOT (UTOMCODE? ENC)))
(PROGN
(IL:* IL:|;;|
 "This is the case of skipping over non-MCCS encoded glyph when MCCS-ONLY")
))
(SETQ ITEMS (READ-DELIMITED-LIST-FROM-STRING LINE))
(CASE KEY
(ENCODING (SETF (GLYPH-ENCODING GLYPH)
(IF (EQL -1 (FIRST ITEMS))
ITEMS
(FIRST ITEMS))))
(SWIDTH (SETF (GLYPH-SWIDTH GLYPH)
ITEMS))
(DWIDTH (SETF (GLYPH-DWIDTH GLYPH)
ITEMS))
(SWIDTH1 (SETF (GLYPH-SWIDTH1 GLYPH)
ITEMS))
(DWIDTH1 (SETF (GLYPH-DWIDTH1 GLYPH)
ITEMS))
(VVECTOR (SETF (GLYPH-VVECTOR GLYPH)
ITEMS))
(BBX (SETF (GLYPH-BBW GLYPH)
(SETQ BBW (FIRST ITEMS))
(GLYPH-BBH GLYPH)
(SETQ BBH (SECOND ITEMS))
(GLYPH-BBXOFF0 GLYPH)
(THIRD ITEMS)
(GLYPH-BBYOFF0 GLYPH)
(FOURTH ITEMS)))
(BITMAP (UNLESS (ZEROP (* BBW BBH))
(LOOP :REPEAT BBH :DO (READ-LINE FILE-STREAM)))
(LET*
((BM (BITMAPCREATE BBW BBH 1))
(BM.BASE (IL:|fetch| IL:BITMAPBASE IL:|of| BM))
(BM.RASTERWIDTH (IL:|fetch| IL:BITMAPRASTERWIDTH IL:|of| BM))
(NBYTES (CEILING BBW 8))
(NCHARS (* 2 NBYTES))
(NWORDS (CEILING BBW 16))
BITS WORDINDEX)
(LABELS ((CHAR-HEX-VALUE (C)
(IF (CHARACTERP C)
(COND
((CHAR<= #\0 C #\9)
(- (CHAR-CODE C)
(IL:CONSTANT (CHAR-CODE #\0))))
((CHAR<= #\A C #\F)
(IL:* IL:|;;| "Don't bother creating a BITMAP with no area")
(IL:* IL:|;;|
 "The (- (CHAR-CODE #\\A) 10) accomplishes adding 10 after the outer subtraction")
(- (CHAR-CODE C)
(IL:CONSTANT (- (CHAR-CODE #\A)
10))))
((CHAR<= #\a C #\f)
(IL:* IL:|;;|
 "The (- (CHAR-CODE #\\a) 10) accomplishes adding 10 after the outer subtraction")
(- (CHAR-CODE C)
(IL:CONSTANT (- (CHAR-CODE #\a)
10))))
(T 0))
0))
(PARSE-WORDS
NIL
(LOOP :FOR I :FROM 0 :TO (1- NCHARS)
:BY 4 :WITH C3LIMIT = (- NCHARS 3)
:WITH C4LIMIT = (- NCHARS 4)
:COLLECT
(+ (ASH (CHAR-HEX-VALUE (CHAR LINE I))
12)
(ASH (CHAR-HEX-VALUE (CHAR LINE (+ 1 I)))
8)
(ASH (CHAR-HEX-VALUE (AND (<= I C3LIMIT)
(CHAR LINE (+ 2 I))))
4)
(CHAR-HEX-VALUE (AND (<= I C4LIMIT)
(CHAR LINE (+ 3 I))))))))
(LOOP :WITH BITROW = 0 :REPEAT BBH :DO
(SETQ LINE (STRING-TRIM '(#\Space #\Tab)
(READ-LINE FILE-STREAM)))
(UNLESS (EQUAL NCHARS (LENGTH LINE))
(ERROR "Invalid BDF file - bad line in BITMAP: ~A"
LINE))
(SETQ BITS (PARSE-WORDS))
(SETQ WORDINDEX (* BITROW BM.RASTERWIDTH))
(LOOP :REPEAT NWORDS :DO (IL:\\PUTBASE BM.BASE WORDINDEX
(POP BITS))
(INCF WORDINDEX))
(INCF BITROW)))
(SETF (GLYPH-BITMAP GLYPH)
BM)))))
(ENDCHAR (SETQ CHAR-COMPLETE T)))))))
(SETF (GLYPH-ASCENT GLYPH)
(+ (GLYPH-BBH GLYPH)
(GLYPH-BBYOFF0 GLYPH)))
(SETF (GLYPH-DESCENT GLYPH)
(ABS (MIN 0 (GLYPH-BBYOFF0 GLYPH))))
(SETF (GLYPH-WIDTH GLYPH)
(MAX (+ (MAX 0 (GLYPH-BBXOFF0 GLYPH))
(GLYPH-BBW GLYPH))
(FIRST (GLYPH-DWIDTH GLYPH))))
GLYPH))
(LET* ((BM (BITMAPCREATE BBW BBH 1))
(BM.BASE (IL:|fetch| IL:BITMAPBASE IL:|of| BM))
(BM.RASTERWIDTH (IL:|fetch| IL:BITMAPRASTERWIDTH
IL:|of| BM))
(NBYTES (CEILING BBW 8))
(NCHARS (* 2 NBYTES))
(NWORDS (CEILING BBW 16))
BITS BYTEPOS WORDINDEX)
(LOOP :WITH BITROW = 0 :REPEAT BBH :DO
(SETQ LINE (STRING-TRIM '(#\Space #\Tab)
(READ-LINE FILE-STREAM)))
(UNLESS (AND (EQUAL NCHARS (LENGTH LINE))
(SETQ BITS
(PARSE-INTEGER LINE :RADIX 16
:JUNK-ALLOWED T)))
(ERROR
"Invalid BDF file - bad line in BITMAP: ~A"
LINE))
(WHEN (ODDP NBYTES)
(SETQ BITS (ASH BITS 8)))
(SETQ WORDINDEX (* BITROW BM.RASTERWIDTH))
(SETQ BYTEPOS (* 16 (1- NWORDS)))
(LOOP :REPEAT NWORDS :DO
(IL:\\PUTBASE BM.BASE WORDINDEX
(LDB (BYTE 16 BYTEPOS)
BITS))
(INCF WORDINDEX)
(DECF BYTEPOS 16))
(INCF BITROW))
(SETF (GLYPH-BITMAP GLYPH)
BM))))
(ENDCHAR (SETQ CHAR-COMPLETE T)))))))
(SETF (GLYPH-ASCENT GLYPH)
(+ (GLYPH-BBH GLYPH)
(GLYPH-BBYOFF0 GLYPH)))
(SETF (GLYPH-DESCENT GLYPH)
(ABS (MIN 0 (GLYPH-BBYOFF0 GLYPH))))
(SETF (GLYPH-WIDTH GLYPH)
(MAX (+ (MAX 0 (GLYPH-BBXOFF0 GLYPH))
(GLYPH-BBW GLYPH))
(FIRST (GLYPH-DWIDTH GLYPH))))
GLYPH))
(DEFUN WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE (BDFONT DEST-DIR &KEY FAMILY SIZE FACE ROTATION DEVICE
AS-UNICODE TEST &AUX FULLFILENAME)
(IL:* IL:\; "Edited 16-Mar-2026 16:12 by mth")
(IL:* IL:\; "Edited 23-Feb-2026 15:57 by mth")
(IL:* IL:\; "Edited 17-Feb-2026 14:17 by mth")
&AUX FULLFILENAME)
(IL:* IL:\; "Edited 2-Dec-2025 14:47 by mth")
(IL:* IL:\; "Edited 30-Nov-2025 16:03 by mth")
(IL:* IL:\; "Edited 28-Nov-2025 17:56 by mth")
@@ -868,7 +760,7 @@
(UNLESS (BDF-FONT-P BDFONT)
(ERROR "Not a BDF-FONT: ~S ~%" BDFONT))
(DESTRUCTURING-BIND (FONTDESC CSETS)
(BDF-TO-FONTDESCRIPTOR BDFONT FAMILY SIZE FACE ROTATION DEVICE :AS-UNICODE AS-UNICODE)
(BDF-TO-FONTDESCRIPTOR BDFONT FAMILY SIZE FACE ROTATION DEVICE)
(UNLESS FONTDESC
(IL:* IL:|;;| "Creation of the FONTDESCRIPTOR failed!")
@@ -877,10 +769,8 @@
(IL:* IL:|;;| "CSETS correspond to the charsets actually present in the FONTDESC.")
(SETQ FULLFILENAME (IF TEST
"WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE TEST"
(MEDLEYFONT.WRITE.FONT FONTDESC (MEDLEYFONT.FILENAME NIL FONTDESC
NIL NIL DEST-DIR))))
(SETQ FULLFILENAME (MEDLEYFONT.WRITE.FONT FONTDESC (MEDLEYFONT.FILENAME FONTDESC NIL NIL
DEST-DIR)))
(LIST FULLFILENAME FONTDESC CSETS)))
(DEFUN XLFD-SPLIT-FONT-NAME (NAME) (IL:* IL:\; "Edited 26-Nov-2025 09:43 by mth")
@@ -990,21 +880,21 @@
"BITMAPCREATE" "BITMAPHEIGHT"
"BITMAPWIDTH" "BLACKSHADE" "BLTSHADE"
"BOLD" "COMPRESSED" "CHARSETINFO"
"DISPLAY" "FONTDESCRIPTOR" "FONTP"
"FONTPROP" "INPUT" "ITALIC" "LIGHT" "LRSH"
"MCCS" "MEDIUM" "REGULAR" "TCONC"
"UTOMCODE?" "MEDLEYFONT.FILENAME"
"CHARSETPROP" "DISPLAY" "FONTDESCRIPTOR"
"FONTP" "FONTPROP" "INPUT" "ITALIC"
"LIGHT" "LRSH" "MCCS" "MEDIUM" "REGULAR"
"TCONC" "UTOMCODE?" "MEDLEYFONT.FILENAME"
"MEDLEYFONT.WRITE.FONT"))
:READTABLE "XCL"
:COMPILER :COMPILE-FILE)
(IL:PUTPROPS IL:READ-BDF IL:DATABASE IL:NO)
(IL:DECLARE\: IL:DONTCOPY
(IL:FILEMAP (NIL (3216 10679 (BDF-TO-CHARSETINFO 3216 . 10679)) (10681 17828 (BDF-TO-FONTDESCRIPTOR
10681 . 17828)) (17830 22409 (BUILD-COMPOSITE 17830 . 22409)) (22411 23160 (CHAR-PRESENT-BIT 22411 .
23160)) (23162 23446 (COUNT-MCHARS 23162 . 23446)) (23448 26592 (GLYPHS-BY-CHARSET 23448 . 26592)) (
26594 28019 (PACKFILENAME.STRING 26594 . 28019)) (28021 40051 (READ-BDF 28021 . 40051)) (40053 40376 (
READ-DELIMITED-LIST-FROM-STRING 40053 . 40376)) (40378 49390 (READ-GLYPH 40378 . 49390)) (49392 51271
(WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE 49392 . 51271)) (51273 53690 (XLFD-SPLIT-FONT-NAME 51273 . 53690)
) (53692 56704 (XLFD-TO-FACE 53692 . 56704)))))
(IL:FILEMAP (NIL (3116 10226 (BDF-TO-CHARSETINFO 3116 . 10226)) (10228 16847 (BDF-TO-FONTDESCRIPTOR
10228 . 16847)) (16849 20782 (BUILD-COMPOSITE 16849 . 20782)) (20784 21533 (CHAR-PRESENT-BIT 20784 .
21533)) (21535 21819 (COUNT-MCHARS 21535 . 21819)) (21821 24856 (GLYPHS-BY-CHARSET 21821 . 24856)) (
24858 26283 (PACKFILENAME.STRING 24858 . 26283)) (26285 35760 (READ-BDF 26285 . 35760)) (35762 36085 (
READ-DELIMITED-LIST-FROM-STRING 35762 . 36085)) (36087 43085 (READ-GLYPH 36087 . 43085)) (43087 44472
(WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE 43087 . 44472)) (44474 46891 (XLFD-SPLIT-FONT-NAME 44474 . 46891)
) (46893 49905 (XLFD-TO-FACE 46893 . 49905)))))
IL:STOP

Binary file not shown.

Binary file not shown.