From 4706af1a134a389ac94233978bd337bc1e51f82c Mon Sep 17 00:00:00 2001 From: Matt Heffron Date: Mon, 8 Dec 2025 22:36:02 -0800 Subject: [PATCH 1/2] Make the layout orientation, ColumnMajor or not, be selectable. Fix the row/column labels to correspond to ColumnMajor selection. --- lispusers/FONTSAMPLER | 96 ++++++++++++++++++++++-------------- lispusers/FONTSAMPLER.LCOM | Bin 7069 -> 7427 bytes lispusers/fontsampler.tedit | Bin 7106 -> 7375 bytes 3 files changed, 58 insertions(+), 38 deletions(-) diff --git a/lispusers/FONTSAMPLER b/lispusers/FONTSAMPLER index 4841901dd..f83435cd7 100644 --- a/lispusers/FONTSAMPLER +++ b/lispusers/FONTSAMPLER @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 5-Dec-2025 11:09:30" {DSK}matt>Interlisp>medley>lispusers>FONTSAMPLER.;6 12333 +(FILECREATED " 8-Dec-2025 22:17:11" {DSK}matt>Interlisp>medley>lispusers>FONTSAMPLER.;7 13846 :EDIT-BY "mth" - :CHANGES-TO (FNS FontSample FontTable) + :CHANGES-TO (FNS FontSample FontTable FontSampleFaked) - :PREVIOUS-DATE " 4-Dec-2025 23:56:07" {DSK}matt>Interlisp>medley>lispusers>FONTSAMPLER.;5 + :PREVIOUS-DATE " 5-Dec-2025 11:09:30" {DSK}matt>Interlisp>medley>lispusers>FONTSAMPLER.;1 ) @@ -20,7 +20,8 @@ (DEFINEQ (FontSample - [LAMBDA (Fonts CharacterSets Printer StreamType Hexadecimal) + [LAMBDA (Fonts CharacterSets Printer StreamType Hexadecimal ColumnMajor) + (* ; "Edited 8-Dec-2025 22:15 by mth") (* ; "Edited 5-Dec-2025 11:06 by mth") (* ; "Edited 5-Feb-2025 17:02 by mth") (* ; "Edited 29-Apr-87 22:03") @@ -72,11 +73,12 @@ do (FontTable Font CharacterSet Stream (OR (NEQ Font LastFont) (NEQ CharacterSet LastCharacterSet)) - TitleFont InchesToPrinterUnits Hexadecimal))) - finally (CLOSEF Stream]) + TitleFont InchesToPrinterUnits Hexadecimal + ColumnMajor))) finally (CLOSEF Stream]) (FontSampleFaked - [LAMBDA (FontAsList Printer StreamType) (* N.H.Briggs "27-Apr-87 18:12") + [LAMBDA (FontAsList Printer StreamType ColumnMajor) (* ; "Edited 8-Dec-2025 21:19 by mth") + (* ; "Edited 27-Apr-87 18:12 by N.H.Briggs ") (LET* [[TitleFont (FONTCREATE NIL 12 'MRR 0 (OR StreamType (PRINTERTYPE Printer] (Font) [Stream (OPENIMAGESTREAM Printer StreamType (LIST 'FONTS (LIST TitleFont] @@ -86,11 +88,12 @@ (replace FONTSIZE of Font with (CADR FontAsList)) (replace FONTFACE of Font with (\FONTFACE (CADDR FontAsList))) (FontTable Font '(0) - Stream NIL TitleFont InchesToPrinterUnits) + Stream NIL TitleFont InchesToPrinterUnits NIL ColumnMajor) (CLOSEF Stream]) (FontTable - [LAMBDA (Font CharacterSet Stream FormFeed TitleFont InchesToPrinterUnits Hexadecimal) + [LAMBDA (Font CharacterSet Stream FormFeed TitleFont InchesToPrinterUnits Hexadecimal ColumnMajor) + (* ; "Edited 8-Dec-2025 22:05 by mth") (* ; "Edited 5-Dec-2025 11:09 by mth") (* ; "Edited 5-Feb-2025 17:03 by mth") (* ; "Edited 3-Feb-2025 20:07 by mth") @@ -110,7 +113,8 @@ [RelativeDescent (FQUOTIENT (FONTPROP Font 'DESCENT) (FONTPROP Font 'HEIGHT] (XCellSpacing (TIMES 0.45 InchesToPrinterUnits)) - (YCellSpacing (TIMES 0.5 InchesToPrinterUnits))) + (YCellSpacing (TIMES 0.5 InchesToPrinterUnits)) + ColLabelStep RowLabelStep) (printout T Title .I0.8 CharacterSet "Q" T) (RESETLST (RESETSAVE (RADIX (if Hexadecimal @@ -129,15 +133,31 @@ (printout Stream (if Hexadecimal then "16" else "8")) + (if ColumnMajor + then (SETQ ColLabelStep 16) + (SETQ RowLabelStep 1) + else (SETQ ColLabelStep 1) + (SETQ RowLabelStep 16)) (for XPosition from (TIMES 0.75 InchesToPrinterUnits) by XCellSpacing as Counter - from 0 to 15 bind (YPosition _ (TIMES 9.5 InchesToPrinterUnits)) + from 0 to (ITIMES ColLabelStep 15) by ColLabelStep bind (YPosition _ (TIMES 9.5 + InchesToPrinterUnits + )) do (MOVETO XPosition YPosition Stream) - (PRIN1 Counter Stream)) + (PRINTNUM (if Hexadecimal + then '(FIX 2 16 T) + elseif ColumnMajor + then '(FIX 1 8 NIL T) + else '(FIX 2 8)) + Counter Stream)) (for YPosition from (TIMES 9 InchesToPrinterUnits) by (MINUS YCellSpacing) as Counter - from 0 to 240 by 16 bind (XPosition _ (TIMES 0.25 InchesToPrinterUnits)) + from 0 to (ITIMES RowLabelStep 15) by RowLabelStep bind (XPosition _ (TIMES 0.25 + InchesToPrinterUnits + )) do (MOVETO XPosition YPosition Stream) (PRINTNUM (if Hexadecimal then '(FIX 2 16 T) + elseif ColumnMajor + then '(FIX 2 8) else '(FIX 3 8)) Counter Stream))) (DRAWLINE (TIMES 0.25 InchesToPrinterUnits) @@ -154,33 +174,33 @@ 'PAINT Stream) (CL:UNLESS UseDisplayFontBitmaps (DSPFONT Font Stream)) (for XPosition from (TIMES 0.75 InchesToPrinterUnits) by XCellSpacing as XCounter from 0 - to 15 bind (CharacterCode _ 0) - [RangedCodesStreamType _ (MEMB (IMAGESTREAMTYPE Stream) + to 15 bind [RangedCodesStreamType _ (MEMB (IMAGESTREAMTYPE Stream) '(DISPLAY INTERPRESS] do - (for YPosition from (TIMES 9 InchesToPrinterUnits) by (MINUS YCellSpacing) as YCounter + [for YPosition from (TIMES 9 InchesToPrinterUnits) by (MINUS YCellSpacing) as YCounter from 0 to 15 - do [LET ((CCode (IPLUS (ITIMES CharacterSet 256) - CharacterCode))) - (MOVETO XPosition YPosition Stream) - (if UseDisplayFontBitmaps - then (LET* ((Glyph (GETCHARBITMAP CCode Font)) - (ImSize (BITMAPIMAGESIZE Glyph NIL Stream)) - (ImWidth (CAR ImSize)) - (ImHeight (CDR ImSize))) - (BITBLT Glyph 0 0 Stream XPosition (FDIFFERENCE YPosition - (FTIMES ImHeight - RelativeDescent)) - ImWidth ImHeight 'INPUT 'REPLACE)) - else (if (AND (NEQ CharacterCode (CHARCODE FF)) - (if RangedCodesStreamType - then (OR (AND (IGREATERP CharacterCode 31) - (ILESSP CharacterCode 127)) - (AND (IGREATERP CharacterCode 160) - (ILESSP CharacterCode 255))) - else T)) - then (PRINTCCODE CCode Stream] - (SETQ CharacterCode (ADD1 CharacterCode))) + do (LET* ((CharacterCode (IPLUS (ITIMES YCounter RowLabelStep) + (ITIMES XCounter ColLabelStep))) + (CCode (IPLUS (ITIMES CharacterSet 256) + CharacterCode))) + (MOVETO XPosition YPosition Stream) + (if UseDisplayFontBitmaps + then (LET* ((Glyph (GETCHARBITMAP CCode Font)) + (ImSize (BITMAPIMAGESIZE Glyph NIL Stream)) + (ImWidth (CAR ImSize)) + (ImHeight (CDR ImSize))) + (BITBLT Glyph 0 0 Stream XPosition (FDIFFERENCE YPosition + (FTIMES ImHeight + RelativeDescent)) + ImWidth ImHeight 'INPUT 'REPLACE)) + else (if (AND (NEQ CharacterCode (CHARCODE FF)) + (if RangedCodesStreamType + then (OR (AND (IGREATERP CharacterCode 31) + (ILESSP CharacterCode 127)) + (AND (IGREATERP CharacterCode 160) + (ILESSP CharacterCode 255))) + else T)) + then (PRINTCCODE CCode Stream] (printout T ".")) (MOVETO (FTIMES 0.75 InchesToPrinterUnits) (FTIMES 0.75 InchesToPrinterUnits) @@ -220,6 +240,6 @@ FONT) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (655 12170 (FontSample 665 . 4700) (FontSampleFaked 4702 . 5524) (FontTable 5526 . 12168 + (FILEMAP (NIL (671 13683 (FontSample 681 . 4890) (FontSampleFaked 4892 . 5850) (FontTable 5852 . 13681 ))))) STOP diff --git a/lispusers/FONTSAMPLER.LCOM b/lispusers/FONTSAMPLER.LCOM index d6fe873ea10db682d2e6871625bdf96cc3e04d7c..82afa9103085afefa837a890310672c10cc102b2 100644 GIT binary patch delta 2403 zcmZ`*No*Ts6t=TK;xw%tr=_(*`f8Qbt{Qjt8CycCmvJ)b*uUkOcG6NQxbd{MGl{F< zisgW*ph$oyPzxFkh;re;0k!doO5iI(;+9sZ;sgSTo?7LM%9|OxNm}89^_K4~|IGW| zKVOOOCO(}HO4Av0ahjnR9vCJ;iwT4qMX#_%u}Fl2VpOK_O|rA2sA5kLhFWC z2t&5M($Gp++RT=g%yJYGg`#{~A*ZzI3}ymfE9oU(x^=v7bCid4-MYNIk}K8ftF43m z7Y0v7yq@RUANFVZ_R6C}9{hF4T;Ian?Z+295ndA7e+(WU9A$UJ?H-vP{BpqK8EBmt z`QTtB?Z(Xw+tGecgytzot3;EtKyzIC?~zZuqjAt0t7d5#&_=bcj2>vxc1pE$-n6ua zdC9gjFl)Y1Dw~Vd<&tF^SSZ$C-vQya_hCbL(3C{tXi?T=Jxhu??Wk=PK(96|(-uWn zv>%eKN|3IUR!fVGrn#z_jwudj(xzo;mr9G(m5T^sD45@7iGugL;awi@Mf-Th{_B?i ziZ$e%wGs+dLdIlhakB3C#vfQdWBh?JHsYvZW6bBqd~HBi?l{P61~hjVjKkfaPNi#i zGlrcyKl|=&JjwOB<9W~ZcMD8>Vfh#Lb(XF!;XjI@jdb6!1#c=9#v}( z+pjd$!TuYnlfF%A>gL*<6Y}ro`>wFrjw>g7O&R;$svjE@+sn`O{E89T_yOb2ZQQx_ zP0$EoZEM)rQFw^>*QbdeOP?qH!Tz--@w>(K8u4$g<((j`?h2djm&xv2Fa7_N&-eVf znlW{E<3|i#@NfKdYpsGq$Wc5Lib`J3pUMF%vXCREWt{-aN^mZFRz6ZB1z^PZ7Kq`* z9*Chi2ZWf`t9!0C*|-Qu&Us)#iUJ#_U5#-xiRo$f+@YJMfQs2`L)?yI1m4BbAVFSH zZ79PFJ7Rr6$0>-%cpOw3lZYsAJhZ}ostGLPSfW0Ami5wkobNLli*V#?)3Zurw-eUk9x_f#smEl`;zb)sWXS)Jlxq>^n5v`h6@izy%KNY7GTH zYNnjwb9mu!G%(;NlO(ix{kG>XYmYT7->U`sgJh~q!kg=pK?hiMkR39S-&mOFkjbTu zg~?mLlCk?3>A(M5z&oB?@p|r)2#R~j1UZ~?_CQBnKS_?BaLai2kzKK2pl>< zV%`O&Lt=dkREHd^l~Z;Yp>hxYAq=5ff$_a^#M~ZS$;dnAvq(1#IZdGE5eL(fk-%CHkA;JE4eFCBB;~pq=q3B4fe&APv+#TBC8n? zks$W{XIns&*siCUyqA9vU@*p5_ zvLvs&*C+^h=AOUl0tCj1bryrbxeI^>f$beqz}gsMCjkMe&|Mt7==Q0n(*?8K(RINgj;DLsILhsU23DXTC+AYY@>Ki8 z3!E3ryAMv3AcGfq8lNFcgIdr*WN4Tr$QB++S(FQE5}iEFw!Yn8Z%X*dP_D0-_?aQ$ zu87$0&b|_pI^;=ASMXhE1q{%l_#WdBK8AP^i-!SejUp%De&MlJ+}%7P#X(pKgAm8e zG=69ZBJYD~D#n4pcXt_OZ$N>w_uLe&M+%n%>PUBIcL|um5!ko@VeE_L`SzUye|rA| D(#vfG delta 1997 zcmZ8iO>EnA6p!1L(zM%}q$^eEy0>T>Y1IaQ+X)BAhts-C@(;1MbUP4biD}ZhN!4W% zj6*>f*6|jh9}Z$MoAWwxUQtY z`kf-9A}}n+an?0TJU0)qd_lRWk_*~W3SIu6hvhIyjFxVG@(v|fCx`Ye7_N-yVahYo z`D!>dG<9^;gHM;N4wY7S57s?lK^8iXN8TQ>V0>ZZha(=(utmmioILuP?YBB+zb8Fm zhL<6kA)1l~hG#p^$G@c}WYAhWMtKX;5Ve@Vv>!1VR*a9zRijehDw~kD-uItqqnQQ0 z-ZBmQoY0%$T-6qNNY=_b}P7dwtA9t=mg0 zPTevmKQmFsrxpy>g2m}zWxDBL{wJol=x;wMPL4bJOmWid2va{6gMGQ{xPJ4BUYza6 zbZdP-H{*;`=QrEH7m8D3r4?|^!Kka=~m0<}2T z`(<^rclrK50rROjhTe8uKWsFY+3&FASauLsoH|@GH!x>6itw=aYtEePeQ^Je8r~Tz zN{}z8XLEY)LKaw_hb+0M=meOk1LPQBWVvs&a+6 zMu2~5n}^{KXDH98bvJNth#IxtoeCeJeW$(F=G52iYQo`)bCC|~d?Uw6kWBC2+Vwm( zkDFu4-iB}3PtFjqO}p_1<@t-uKJrlkGDAWMhqB$wgY)Fvdu}{6MZz`L?mPVkS)fXh zE?F2VEp|zGqnfaz$YS=%za&By*O7G|kJBPYo#;T|K1XKFiKm@KGWXylnXQ_qp55u1 zZ8H1pX9Vs&dk`=WQ2Dfehn!0|G2H-}-F#G)5oXkfdrR8%T3o3LUZoj}KG`+w@uAfs9 zm_biS$kSJH;+T3FLl0U;#8SBYOL?NHx=L~&N?4oZba!HdhWPdFJSPE)*?3;f;(2Q7 zWpuzET~_qu>6LiF#em1%^z(9f6uaAYlit z5Dm-Vp%#>UCXOI43D!igc}&26Pqo=F@RugDQR_zVR9l45B3dOu!Z&s)io88E1duq< z84)1S420wmh*6AZL=+^}3rlo_2T@?%i9_4-N5ow_(}>1_gDNe%2}Dd_4;v697D8B@ R6GRB7uv0Ugx8D4l`VZZY^z8ru diff --git a/lispusers/fontsampler.tedit b/lispusers/fontsampler.tedit index 7d4bb12d4728749130526b0144de691011987b3e..c50b991e77e19baa4cf00405fc708b7e86b98667 100644 GIT binary patch delta 413 zcmX?Pe%^AzN=A!`t3LB6IOpe-=H~e(X5|-cp369aiBV^>E=wd6e{x1*QDSmQYLP;E zPGv#H{QWTQGnu-&4`!4OP(ewCLUCzwa%ypLW?3psLZKudY)4UM zdPa$!f`+SJx}J`Lx}!SW#Kfe0pmKF5bv;ckxBMc7)QZI1f}B(xkj~_y%^TR&8Bx7? zoui*o1KFJlnLuw9E2IH6yXEJV1VicMy8tTP BdQJcU delta 155 zcmX?adB}XiN=DO(t3GdD$vA;&vlUAu6PH4AMq*K7a!G2@L$p Date: Tue, 9 Dec 2025 14:06:38 -0800 Subject: [PATCH 2/2] Fixed unloaded charset didn't display. Checking for charset *known* to be EQ to the SLUG charset, didn't verify that the font *had* a SLUG charset, so was comparing to NIL, which excluded *all* unloaded charsets. --- lispusers/FONTSAMPLER | 50 ++++++++++++++++++++++--------------- lispusers/FONTSAMPLER.LCOM | Bin 7427 -> 7520 bytes 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/lispusers/FONTSAMPLER b/lispusers/FONTSAMPLER index f83435cd7..cc932f12d 100644 --- a/lispusers/FONTSAMPLER +++ b/lispusers/FONTSAMPLER @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 8-Dec-2025 22:17:11" {DSK}matt>Interlisp>medley>lispusers>FONTSAMPLER.;7 13846 +(FILECREATED " 9-Dec-2025 14:00:20" {DSK}matt>Interlisp>medley>lispusers>FONTSAMPLER.;2 14236 :EDIT-BY "mth" - :CHANGES-TO (FNS FontSample FontTable FontSampleFaked) + :CHANGES-TO (FNS FontTable FontSample) - :PREVIOUS-DATE " 5-Dec-2025 11:09:30" {DSK}matt>Interlisp>medley>lispusers>FONTSAMPLER.;1 + :PREVIOUS-DATE " 8-Dec-2025 22:17:11" {DSK}matt>Interlisp>medley>lispusers>FONTSAMPLER.;1 ) @@ -21,7 +21,7 @@ (FontSample [LAMBDA (Fonts CharacterSets Printer StreamType Hexadecimal ColumnMajor) - (* ; "Edited 8-Dec-2025 22:15 by mth") + (* ; "Edited 9-Dec-2025 13:48 by mth") (* ; "Edited 5-Dec-2025 11:06 by mth") (* ; "Edited 5-Feb-2025 17:02 by mth") (* ; "Edited 29-Apr-87 22:03") @@ -31,12 +31,10 @@ [Stream (OPENIMAGESTREAM Printer StreamType (LIST 'FONTS (CONS TitleFont FontList] (InchesToPrinterUnits (FTIMES 72.0 (DSPSCALE NIL Stream))) (LastFont (CAR (LAST FontList))) - [CharacterSets (if (LISTP CharacterSets) - then CharacterSets - elseif (MEMB CharacterSets '(T :INCORE :ALL :INTERESTING)) - then CharacterSets - else (LIST (OR CharacterSets 0] (AllCharacterSets (CONSTANT (for CS from 0 to 255 collect CS] + (CL:UNLESS [OR (LISTP CharacterSets) + (MEMB CharacterSets '(T :INCORE :ALL :INTERESTING] + (SETQ CharacterSets (LIST (OR CharacterSets 0)))) (DSPRIGHTMARGIN (fetch (REGION WIDTH) of (DSPCLIPPINGREGION NIL Stream)) Stream) (for Font in FontList do @@ -63,11 +61,24 @@ (* ;;  "Exclude any CharacterSet known to reference the SlugCharsetInfo") - (SETQ FontCharacterSets (for CS in FontCharacterSets - unless (EQ SlugCharsetInfo - (\GETCHARSETINFO Font - CS)) - collect CS)) + (CL:WHEN SlugCharsetInfo + + (* ;; + "Only if SlugCharsetInfo is non-NIL, else it won't load a requested charset") + + (SETQ FontCharacterSets + (for CS in FontCharacterSets + unless (EQ SlugCharsetInfo (\GETCHARSETINFO Font CS)) + collect CS))) + + (* ;; + "Probably ought to report charsets eliminated by the above.") + + (* ;; " At least report if NO charsets remain for this font.") + + (CL:UNLESS FontCharacterSets (printout T + "All requested character sets are empty for this font: " + Font T)) (for CharacterSet in FontCharacterSets bind (LastCharacterSet _ (CAR (LAST FontCharacterSets))) do (FontTable Font CharacterSet Stream @@ -93,7 +104,7 @@ (FontTable [LAMBDA (Font CharacterSet Stream FormFeed TitleFont InchesToPrinterUnits Hexadecimal ColumnMajor) - (* ; "Edited 8-Dec-2025 22:05 by mth") + (* ; "Edited 9-Dec-2025 13:23 by mth") (* ; "Edited 5-Dec-2025 11:09 by mth") (* ; "Edited 5-Feb-2025 17:03 by mth") (* ; "Edited 3-Feb-2025 20:07 by mth") @@ -106,10 +117,10 @@ " " (L-CASE Face T) " Character set ")) + (StreamType (IMAGESTREAMTYPE Stream)) [UseDisplayFontBitmaps (AND (EQ (FONTPROP Font 'DEVICE) 'DISPLAY) - (NOT (EQ (IMAGESTREAMTYPE Stream) - 'DISPLAY] + (NOT (EQ StreamType 'DISPLAY] [RelativeDescent (FQUOTIENT (FONTPROP Font 'DESCENT) (FONTPROP Font 'HEIGHT] (XCellSpacing (TIMES 0.45 InchesToPrinterUnits)) @@ -174,8 +185,7 @@ 'PAINT Stream) (CL:UNLESS UseDisplayFontBitmaps (DSPFONT Font Stream)) (for XPosition from (TIMES 0.75 InchesToPrinterUnits) by XCellSpacing as XCounter from 0 - to 15 bind [RangedCodesStreamType _ (MEMB (IMAGESTREAMTYPE Stream) - '(DISPLAY INTERPRESS] + to 15 bind [RangedCodesStreamType _ (MEMB StreamType '(DISPLAY INTERPRESS] do [for YPosition from (TIMES 9 InchesToPrinterUnits) by (MINUS YCellSpacing) as YCounter from 0 to 15 @@ -240,6 +250,6 @@ FONT) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (671 13683 (FontSample 681 . 4890) (FontSampleFaked 4892 . 5850) (FontTable 5852 . 13681 + (FILEMAP (NIL (655 14073 (FontSample 665 . 5357) (FontSampleFaked 5359 . 6317) (FontTable 6319 . 14071 ))))) STOP diff --git a/lispusers/FONTSAMPLER.LCOM b/lispusers/FONTSAMPLER.LCOM index 82afa9103085afefa837a890310672c10cc102b2..06eb6cb526aa01255366663b1062cb3d791e0362 100644 GIT binary patch delta 2314 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 c4FMMyf&QUb02UHs^iJE$QB;)HhhKF64