1
0
mirror of synced 2026-01-12 00:42:56 +00:00

Next phase of BDF to MEDLEYDISPLAYFONT - in progress.

This commit is contained in:
Matt Heffron 2025-11-17 10:48:15 -08:00
parent 0be9efd6ca
commit f048076a91
2 changed files with 165 additions and 40 deletions

View File

@ -1,19 +1,20 @@
(DEFINE-FILE-INFO PACKAGE (DEFPACKAGE "BDF" (USE "XCL" "LISP") (EXPORT "READ-BDF"
"WRITE-BDF-TO-DISPLAYFONT-FILES") (IMPORT-FROM "IL" "BITBLT" "BITMAPCREATE" "BITMAPHEIGHT"
"BITMAPWIDTH" "BLACKSHADE" "BLTSHADE" "BOLD" "COMPRESSED" "CHARSETINFO" "DISPLAY" "FONTDESCRIPTOR"
"FONTP" "FONTPROP" "INPUT" "ITALIC" "LIGHT" "LRSH" "MEDIUM" "REGULAR" "TCONC" "UTOMCODE" "UTOMCODE?"
"WRITESTRIKEFONTFILE")) READTABLE "XCL" BASE 10)
(DEFINE-FILE-INFO PACKAGE (DEFPACKAGE "BDF" (USE "XCL" "LISP") (EXPORT "READ-BDF" "BUILD-COMPOSITE"
"WRITE-BDF-TO-DISPLAYFONT-FILES" "WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE") (IMPORT-FROM "IL" "BITBLT"
"BITMAPCREATE" "BITMAPHEIGHT" "BITMAPWIDTH" "BLACKSHADE" "BLTSHADE" "BOLD" "COMPRESSED" "CHARSETINFO"
"DISPLAY" "FONTDESCRIPTOR" "FONTP" "FONTPROP" "INPUT" "ITALIC" "LIGHT" "LRSH" "MEDIUM" "REGULAR"
"TCONC" "UTOMCODE" "UTOMCODE?" "WRITESTRIKEFONTFILE" "MEDLEYFONT.FILENAME" "MEDLEYFONT.WRITE.FONT"))
READTABLE "XCL" BASE 10)
(IL:FILECREATED " 6-Nov-2025 23:10:51" IL:|{DSK}<home>matt>Interlisp>medley>lispusers>READ-BDF.;13| 49101
(IL:FILECREATED "16-Nov-2025 22:55:52" IL:|{DSK}<home>matt>Interlisp>medley>lispusers>READ-BDF.;30| 56989
:EDIT-BY "mth"
:CHANGES-TO (IL:FUNCTIONS BDF-TO-FONTDESCRIPTOR BDF-TO-CHARSETINFO READ-GLYPH
WRITE-BDF-TO-DISPLAYFONT-FILES)
(FILE-ENVIRONMENTS "READ-BDF")
:CHANGES-TO (FILE-ENVIRONMENTS "READ-BDF")
(IL:FUNCTIONS READ-BDF BUILD-COMPOSITE GET-CHARS-PRESENT
WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE)
(IL:VARS IL:READ-BDFCOMS)
:PREVIOUS-DATE " 6-Nov-2025 22:43:21" IL:|{DSK}<home>matt>Interlisp>medley>lispusers>READ-BDF.;9|
:PREVIOUS-DATE "16-Nov-2025 22:37:22" IL:|{DSK}<home>matt>Interlisp>medley>lispusers>READ-BDF.;29|
)
@ -22,9 +23,10 @@
(IL:RPAQQ IL:READ-BDFCOMS
((IL:STRUCTURES BDF-FONT GLYPH)
(IL:VARIABLES MAXCHARSET MAXTHINCHAR NOMAPPINGCHARSET)
(IL:FUNCTIONS BDF-TO-CHARSETINFO BDF-TO-FONTDESCRIPTOR GET-FAMILY-FACE-SIZE-FROM-NAME
GLYPHS-BY-CHARSET PACKFILENAME.STRING READ-BDF READ-DELIMITED-LIST-FROM-STRING
READ-GLYPH SPLIT-FONT-NAME WRITE-BDF-TO-DISPLAYFONT-FILES)
(IL:FUNCTIONS BDF-TO-CHARSETINFO BDF-TO-FONTDESCRIPTOR BUILD-COMPOSITE GET-CHARS-PRESENT
GET-FAMILY-FACE-SIZE-FROM-NAME GLYPHS-BY-CHARSET PACKFILENAME.STRING READ-BDF
READ-DELIMITED-LIST-FROM-STRING READ-GLYPH SPLIT-FONT-NAME
WRITE-BDF-TO-DISPLAYFONT-FILES WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE)
(IL:DECLARE\: IL:EVAL@COMPILE IL:DONTCOPY (IL:FILES (IL:SYSLOAD)
IL:SYSEDIT)
(IL:FILES (IL:LOADCOMP)
@ -59,6 +61,7 @@
(DEFCONSTANT NOMAPPINGCHARSET (1+ MAXCHARSET))
(DEFUN BDF-TO-CHARSETINFO (FONT CSET SLUG-OR-WIDTH &OPTIONAL MAP-UNKNOWN-TO-PRIVATE)
(IL:* IL:\; "Edited 15-Nov-2025 14:26 by mth")
(IL:* IL:\; "Edited 6-Nov-2025 17:30 by mth")
(IL:* IL:\; "Edited 23-Apr-2025 17:53 by mth")
(IL:* IL:\; "Edited 21-Apr-2025 16:23 by mth")
@ -92,6 +95,7 @@
(FIRSTCHAR MOST-POSITIVE-FIXNUM)
(LASTCHAR MOST-NEGATIVE-FIXNUM)
(CSINFO (IL:|create| CHARSETINFO))
(IMAGEWIDTHS (IL:\\CREATECSINFOELEMENT))
(DLEFT 0)
SLUG SLUGWIDTH GLYPHS-LIMITS BMAP OFFSETS HEIGHT WIDTHS)
(COND
@ -140,13 +144,17 @@
(IL:|for| I IL:|from| 0 IL:|to| (+ MAXTHINCHAR 2) IL:|do| (IL:\\FSETOFFSET OFFSETS I
TOTAL-WIDTH))
(IL:* IL:|;;| "Now WIDTHS is NOT the IMAGEWIDTHS array. BDF provides both, and MEDLEYDISPLAYFONT can persist both.")
(SETQ WIDTHS (IL:|fetch| (CHARSETINFO IL:WIDTHS) IL:|of| CSINFO))
(IL:* IL:|;;| "Initialize the widths to SLUGWIDTH")
(IL:|for| I IL:|from| 0 IL:|to| (+ MAXTHINCHAR 2) IL:|do| (IL:\\FSETWIDTH WIDTHS I
(IL:|for| I IL:|from| 0 IL:|to| (+ MAXTHINCHAR 2) IL:|do| (IL:\\FSETWIDTH
IMAGEWIDTHS I
SLUGWIDTH))
(IL:|replace| (CHARSETINFO IL:IMAGEWIDTHS) IL:|of| CSINFO IL:|with| WIDTHS)
(IL:|replace| (CHARSETINFO IL:IMAGEWIDTHS) IL:|of| CSINFO IL:|with| IMAGEWIDTHS)
(IL:* IL:|;;| "JDS 12/4/92: Apparently, these fields can be signed values, if all chars, e.g., ride above the base line. ")
@ -168,7 +176,8 @@
'INPUT
'IL:REPLACE)
(IL:\\FSETOFFSET OFFSETS MCODE DLEFT)
(IL:\\FSETOFFSET WIDTHS MCODE GLW)
(IL:\\FSETOFFSET IMAGEWIDTHS MCODE GLW)
(IL:\\FSETOFFSET WIDTHS MCODE (FIRST (GLYPH-DWIDTH GL)))
(INCF DLEFT GLW))
(IL:* IL:|;;| "Now insert the SLUG glyph into the BMAP, or make a slug (block)")
@ -292,6 +301,82 @@
:TEST
#'EQL)))))))))
(DEFUN BUILD-COMPOSITE (BASE-FONT &REST FILL-FROM) (IL:* IL:\; "Edited 16-Nov-2025 18:25 by mth")
(IL:* IL:\; "Edited 14-Nov-2025 17:04 by mth")
(LET (UCHAR-PRESENT FONT FAMILY WEIGHT SLANT EXPANSION SIZE UC-PRESENT)
(UNLESS (OR (TYPEP BASE-FONT 'BDF-FONT)
(STRINGP BASE-FONT)
(PATHNAMEP BASE-FONT))
(ERROR "BASE-FONT is not a BDF-FONT, nor string, nor pathname."))
(UNLESS (AND FILL-FROM (LISTP FILL-FROM))
(ERROR "FILL-FROM is not a list."))
(WHEN (OR (STRINGP BASE-FONT)
(PATHNAMEP BASE-FONT))
(UNLESS (IL:INFILEP BASE-FONT)
(ERROR "BASE-FONT ~S doesn't exist or is unreadable." BASE-FONT))
(MULTIPLE-VALUE-SETQ (FONT FAMILY WEIGHT SLANT EXPANSION SIZE UC-PRESENT)
(READ-BDF BASE-FONT :MCCS-ONLY T))
(SETQ BASE-FONT FONT)
(SETQ UCHAR-PRESENT UC-PRESENT))
(UNLESS UCHAR-PRESENT
(SETQ UCHAR-PRESENT (GET-CHARS-PRESENT BASE-FONT)))
(LOOP :FOR FF :IN FILL-FROM :WHEN FF :DO (COND
((TYPEP FF 'BDF-FONT)
(SETQ UC-PRESENT (GET-CHARS-PRESENT FF)))
((OR (STRINGP FF)
(PATHNAMEP FF))
(UNLESS (IL:INFILEP FF)
(ERROR
"Element of FILL-FROM (~S) doesn't exist or is unreadable."
FF))
(MULTIPLE-VALUE-SETQ (FONT FAMILY WEIGHT SLANT
EXPANSION SIZE
UC-PRESENT)
(READ-BDF FF :MCCS-ONLY T))
(SETQ FF FONT))
(T (ERROR
"Element of FILL-FROM (~S) is not a BDF-FONT, nor string, nor pathname."
FF)))
(LOOP :FOR GL :IN (BF-GLYPHS FF)
:WITH V :DO (SETQ V (GLYPH-ENCODING GL))
(WHEN (AND (LISTP V)
(EQ (FIRST V)
-1))
(SETQ V (OR (SECOND V)
-1)))
(WHEN (AND (UTOMCODE? V)
(ZEROP (BIT (AREF UCHAR-PRESENT (LRSH V 8))
(LOGAND V 255))))
(SETF (BIT (AREF UCHAR-PRESENT (LRSH V 8))
(LOGAND V 255))
1)
(IL:* IL:|;;|
 "What other bookkeping of BASE-FONT needs to be done when adding a glyph? Any?")
(PUSH GL (BF-GLYPHS BASE-FONT)))))
BASE-FONT))
(DEFUN GET-CHARS-PRESENT (BFONT) (IL:* IL:\; "Edited 16-Nov-2025 17:52 by mth")
(IL:* IL:\; "Edited 14-Nov-2025 16:40 by mth")
(UNLESS (TYPEP BFONT 'BDF-FONT)
(ERROR "BFONT is not a BDF-FONT."))
(LET ((UCHAR-PRESENT (MAKE-ARRAY 256 :INITIAL-CONTENTS (LOOP :FOR I :FROM 0 :TO 255 :COLLECT
(MAKE-ARRAY 256 :ELEMENT-TYPE
'BIT :INITIAL-ELEMENT 0)))))
(LOOP :FOR GL :IN (BF-GLYPHS BFONT)
:WITH V :DO (SETQ V (GLYPH-ENCODING GL))
(WHEN (AND (LISTP V)
(EQ (FIRST V)
-1))
(SETQ V (OR (SECOND V)
-1)))
(WHEN (UTOMCODE? V)
(SETF (BIT (AREF UCHAR-PRESENT (LRSH V 8))
(LOGAND V 255))
1)))
UCHAR-PRESENT))
(DEFUN GET-FAMILY-FACE-SIZE-FROM-NAME (BDFONT) (IL:* IL:\; "Edited 30-Apr-2025 13:18 by mth")
(IL:* IL:\; "Edited 23-Apr-2025 16:20 by mth")
(IL:* IL:\; "Edited 5-Feb-2025 12:56 by mth")
@ -509,15 +594,24 @@
X))
Y))))
(DEFUN READ-BDF (PATH &OPTIONAL VERBOSE) (IL:* IL:\; "Edited 30-Apr-2025 13:37 by mth")
(DEFUN READ-BDF (PATH &KEY VERBOSE MCCS-ONLY (EXTERNAL-FORMAT :ISO8859/1))
(IL:* IL:\; "Edited 16-Nov-2025 22:37 by mth")
(IL:* IL:\; "Edited 14-Nov-2025 16:35 by mth")
(IL:* IL:\; "Edited 30-Apr-2025 13:37 by mth")
(IL:* IL:\; "Edited 24-Apr-2025 00:44 by mth")
(IL:* IL:\; "Edited 17-Apr-2025 15:10 by mth")
(IL:* IL:\; "Edited 12-Jul-2024 23:02 by mth")
(LET
(PROPS PROPS-COMPLETE CHARS-COUNT FONT-COMPLETE FONT POS KEY V VV LINE ITEMS GL (NGLYPHS 0)
(UCHAR-PRESENT (MAKE-ARRAY 256 :INITIAL-CONTENTS (LOOP :FOR I :FROM 0 :TO 255 :COLLECT
(MAKE-ARRAY 256 :ELEMENT-TYPE
'BIT :INITIAL-ELEMENT 0))))
(*PACKAGE* (FIND-PACKAGE "BDF")))
(IL:* IL:|;;| "Note: The EXTERNAL-FORMAT *ought* to be :UTF-8 for the BDF files from otf2bdf, but I'm seeing :ISO8859/1. I don't know why! But I'm setting the default :EXTERNAL-FORMAT appropriately for this.")
(WITH-OPEN-FILE
(FILE-STREAM PATH :ELEMENT-TYPE 'CHARACTER :DIRECTION :INPUT)
(FILE-STREAM PATH :ELEMENT-TYPE 'CHARACTER :DIRECTION :INPUT :EXTERNAL-FORMAT EXTERNAL-FORMAT)
(LOOP :WHILE (STRING-EQUAL "COMMENT" (SETQ KEY (READ FILE-STREAM)))
:DO
@ -609,21 +703,29 @@
(ERROR "Invalid BDF file - CHARS count (~A) is invalid or missing."
NGLYPHS))
(SETF (BF-GLYPHS FONT)
(LOOP :REPEAT NGLYPHS :COLLECT
(PROG1 (SETQ GL (READ-GLYPH FILE-STREAM FONT))
(LOOP :REPEAT NGLYPHS :NCONC
(PROGN (SETQ GL (READ-GLYPH FILE-STREAM FONT))
(IL:* IL:|;;|
(IL:* IL:|;;|
 "Any GLYPH with ENCODING of -1 is taken as the SLUG glyph. If multiple, the last applies.")
(SETQ V (GLYPH-ENCODING GL))
(WHEN (AND (LISTP V)
(EQ (FIRST V)
-1))
(SETQ V (OR (SECOND V)
-1)))
(WHEN (EQ V -1)
(SETF (BF-SLUG FONT)
GL))))))
(SETQ V (GLYPH-ENCODING GL))
(WHEN (AND (LISTP V)
(EQ (FIRST V)
-1))
(SETQ V (OR (SECOND V)
-1)))
(COND
((EQ V -1)
(SETF (BF-SLUG FONT)
GL)
(LIST GL))
((UTOMCODE? V)
(SETF (BIT (AREF UCHAR-PRESENT (LRSH V 8))
(LOGAND V 255))
1)
(LIST GL))
(T NIL))))))
(ENDFONT (SETQ FONT-COMPLETE T))))))))
(DESTRUCTURING-BIND (FAMILY (WEIGHT SLANT EXPANSION)
SIZE)
@ -633,7 +735,7 @@
"Name: ~A~%Family: ~A~%Size: ~A~%Weight: ~A~%Slant: ~A~%Expansion: ~A~%"
(BF-NAME FONT)
FAMILY SIZE WEIGHT SLANT EXPANSION))
(VALUES FONT FAMILY WEIGHT SLANT EXPANSION SIZE)))))
(VALUES FONT FAMILY WEIGHT SLANT EXPANSION SIZE UCHAR-PRESENT)))))
(DEFUN READ-DELIMITED-LIST-FROM-STRING (INPUT-STRING &OPTIONAL (DELIMIT #\]))
(IL:* IL:\; "Edited 20-Aug-2024 16:46 by mth")
@ -822,6 +924,25 @@
 "UNMAPPEDGLYPHS are never written. (Unicode encoding is > xFFFF, or encoding low byte is FF)")
(VALUES FONTDESC CSETS UNMAPPED-FONTDESC UNICODE-CSETS UNMAPPEDGLYPHS))))
(DEFUN WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE (BDFONT DEST-DIR &KEY FAMILY SIZE FACE ROTATION DEVICE
&AUX FULLFILENAME)
(IL:* IL:\; "Edited 16-Nov-2025 17:32 by mth")
(UNLESS (TYPEP BDFONT 'BDF-FONT)
(ERROR "Not a BDF-FONT: ~S ~%" BDFONT))
(DESTRUCTURING-BIND (FN-FAMILY FN-FACE FN-SIZE)
(GET-FAMILY-FACE-SIZE-FROM-NAME BDFONT)
(SETQ FAMILY (OR FAMILY FN-FAMILY))
(SETQ FACE (OR FACE FN-FACE))
(SETQ SIZE (OR SIZE FN-SIZE))
(MULTIPLE-VALUE-BIND (FONTDESC CSETS)
(BDF-TO-FONTDESCRIPTOR BDFONT FAMILY SIZE FACE ROTATION DEVICE)
(SETQ FULLFILENAME (MEDLEYFONT.WRITE.FONT FONTDESC (MEDLEYFONT.FILENAME FONTDESC NIL
NIL DEST-DIR)))
(IL:* IL:|;;| "These correspond to the charsets ACTUALLY written.")
(VALUES FULLFILENAME FONTDESC CSETS))))
(IL:DECLARE\: IL:EVAL@COMPILE IL:DONTCOPY
(IL:FILESLOAD (IL:SYSLOAD)
@ -833,8 +954,9 @@
)
(DEFINE-FILE-ENVIRONMENT "READ-BDF" :PACKAGE (DEFPACKAGE "BDF" (:USE "XCL" "LISP")
(:EXPORT "READ-BDF"
"WRITE-BDF-TO-DISPLAYFONT-FILES")
(:EXPORT "READ-BDF" "BUILD-COMPOSITE"
"WRITE-BDF-TO-DISPLAYFONT-FILES"
"WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE")
(:IMPORT-FROM "IL" "BITBLT" "BITMAPCREATE"
"BITMAPHEIGHT" "BITMAPWIDTH" "BLACKSHADE"
"BLTSHADE" "BOLD" "COMPRESSED"
@ -842,16 +964,19 @@
"FONTP" "FONTPROP" "INPUT" "ITALIC"
"LIGHT" "LRSH" "MEDIUM" "REGULAR" "TCONC"
"UTOMCODE" "UTOMCODE?"
"WRITESTRIKEFONTFILE"))
"WRITESTRIKEFONTFILE"
"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 (2497 10576 (BDF-TO-CHARSETINFO 2497 . 10576)) (10578 16996 (BDF-TO-FONTDESCRIPTOR
10578 . 16996)) (16998 20538 (GET-FAMILY-FACE-SIZE-FROM-NAME 16998 . 20538)) (20540 27970 (
GLYPHS-BY-CHARSET 20540 . 27970)) (27972 29397 (PACKFILENAME.STRING 27972 . 29397)) (29399 36358 (
READ-BDF 29399 . 36358)) (36360 36683 (READ-DELIMITED-LIST-FROM-STRING 36360 . 36683)) (36685 43176 (
READ-GLYPH 36685 . 43176)) (43178 43919 (SPLIT-FONT-NAME 43178 . 43919)) (43921 47827 (
WRITE-BDF-TO-DISPLAYFONT-FILES 43921 . 47827)))))
(IL:FILEMAP (NIL (2686 11251 (BDF-TO-CHARSETINFO 2686 . 11251)) (11253 17671 (BDF-TO-FONTDESCRIPTOR
11253 . 17671)) (17673 21069 (BUILD-COMPOSITE 17673 . 21069)) (21071 22140 (GET-CHARS-PRESENT 21071 .
22140)) (22142 25682 (GET-FAMILY-FACE-SIZE-FROM-NAME 22142 . 25682)) (25684 33114 (GLYPHS-BY-CHARSET
25684 . 33114)) (33116 34541 (PACKFILENAME.STRING 33116 . 34541)) (34543 42891 (READ-BDF 34543 . 42891
)) (42893 43216 (READ-DELIMITED-LIST-FROM-STRING 42893 . 43216)) (43218 49709 (READ-GLYPH 43218 .
49709)) (49711 50452 (SPLIT-FONT-NAME 49711 . 50452)) (50454 54360 (WRITE-BDF-TO-DISPLAYFONT-FILES
50454 . 54360)) (54362 55433 (WRITE-BDF-TO-MEDLEYDISPLAYFONT-FILE 54362 . 55433)))))
IL:STOP

Binary file not shown.