From 05b86b63753c3d5e892b733bb5c8497513616dea Mon Sep 17 00:00:00 2001 From: "Peter D. Gray" Date: Fri, 2 Jun 2023 11:25:27 -0400 Subject: [PATCH] changes and additional chars --- misc/q1font/font_iosevka.py | 12 ++++++++---- misc/q1font/render.py | 29 +++++++++++++++++++++-------- misc/q1font/sample.png | Bin 5596 -> 6044 bytes unix/variant/sim_scanner.py | 1 + 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/misc/q1font/font_iosevka.py b/misc/q1font/font_iosevka.py index 55920f58..53622170 100644 --- a/misc/q1font/font_iosevka.py +++ b/misc/q1font/font_iosevka.py @@ -19,8 +19,8 @@ CELL_W = const(9) CELL_H = const(22) BYTES_PER_CHAR = const(99) -#SPECIAL_CHARS = ['→', '←', '↳', '•', '⋯', '█', '▌', '▐', '▼', '▲', '►', '◀', '⏵', '₿', '✔', '✓', '⥎', '™', '©'] -#DOUBLE_WIDE = ['⋯', '✔︎', '✓', '→', '←'] +#SPECIAL_CHARS = ['→', '←', '↳', '•', '⋯', '█', '▌', '▐', '▼', '▲', '►', '◀', '⏵', '₿', '✔', '✓', '↦', '␣', '◉', '◯', '◌', '™', '©'] +#DOUBLE_WIDE = ['⋯', '✔︎', '✓', '→', '←', '↦', '◉', '◯', '◌'] class FontIosevka: @@ -130,7 +130,7 @@ class FontIosevka: '~': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00h \x15\x00\x9f\xfd\x17\xfc?\xfd\xfa\xdfk\xf9?\xff\xd0[0m\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '→': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x8d \x00\x00\x00\x00\x00\x00\x00\n\xd1\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x10\x0f\xff\xff\xff\xff\xff\xff\xff\xc1\x0f\xff\xff\xff\xff\xff\xff\xff\xc1\x00\x00\x00\x00\x00\x00\x00\xbd\x10\x00\x00\x00\x00\x00\x00\t\xd1\x00\x00\x00\x00\x00\x00\x00\x8d \x00\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '←': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\x02\xd8\x00\x00\x00\x00\x00\x00\x00\x1d\xa0\x00\x00\x00\x00\x00\x00\x01\xdb\x00\x00\x00\x00\x00\x00\x00\x1c\xff\xff\xff\xff\xff\xff\xff\xf0\x1c\xff\xff\xff\xff\xff\xff\xff\xf0\x01\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x90\x00\x00\x00\x00\x00\x00\x00\x02\xd8\x00\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - '↳': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdfP\x00\x00\r\xf5\x00\x00\x00\xdfP\x00\x00\r\xf5\x00\x00\x00\xdfP\x00\x00\r\xf5\x00\x00\x00\xdfP\x00\x00\r\xf5\x00\x00\x00\xdfP\x00\x00\r\xf5\x00[\x00\xdfP\x01\xdb\r\xf5\x00\x02\xda\xdf\xed\xdd\xde\xfd\xff\xff\xff\xff\x00\x00\x00\x1d\xb0\x00\x00\x1c\xb0\x00\x00\x05\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + '↳': b'\xdfP\x00\x00\r\xf5\x00\x00\x00\xdfP\x00\x00\r\xf5\x00\x00\x00\xdfP\x00\x00\r\xf5\x00\x00\x00\xdfP\x00\x00\r\xf5\x00[\x00\xdfP\x01\xdb\r\xf5\x00\x02\xda\xdf\xed\xdd\xde\xfd\xff\xff\xff\xff\x00\x00\x00\x1d\xb0\x00\x00\x1c\xb0\x00\x00\x05\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '•': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\xdf\xd4\x00\x00\xdf\xff\xd0\x00?\xff\xff0\x03\xff\xff\xf3\x00\r\xff\xfd\x00\x00M\xfd@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '⋯': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f\x00\x00f\x00\x00f\x00\t\xff\xa0\t\xff\x90\n\xff\x90\r\xff\xd0\r\xff\xd0\r\xff\xd0\n\xff\xb0\x0b\xff\xa0\x0b\xff\xa0\x01\x88\x10\x01\x88\x10\x01\x88\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '█': b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff', @@ -144,7 +144,11 @@ class FontIosevka: '₿': b'\x00\x00\x00\x00\x00\x07\xc1\xf2\x00\x00|\x1f \x00\xef\xff\xf4\x00\x0e\xff\xff\xe2\x00\xeb\x00\x7f\x90\x0e\xb0\x00\xec\x00\xeb\x00\x0e\xc0\x0e\xb0\x08\xf8\x00\xef\xff\xfc\x10\x0e\xff\xff\xd3\x00\xeb\x00M\xd0\x0e\xb0\x00\x8f0\xeb\x00\x08\xf4\x0e\xb0\x04\xef\x10\xef\xff\xff\x80\x0e\xff\xffp\x00\x07\xc1\xf2\x00\x00|\x1f \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '✔': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x03\xe0\x00\x00\x01\xdf\x00\x00\x00\xbf\xf0\x00\x00\x7f\xff\xa6\x00.\xff\xef\xf7\x0b\xff\xf6\xff\xf9\xff\xfc\x0f\xff\xff\xff _\xff\xff\x90\x00o\xff\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '✓': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07`\x00\x00\x00\x00\x00\x00\x00n0\x00\x00\x00\x00\x00\x00\x03\xe4\x00\x00\x00\x00\x00\x00\x00\x1d`\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x06\xa0\x00\x05\xd1\x00\x00\x00\x00\x01\xcc\x10\rP\x00\x00\x00\x00\x00\x0b\xb0|\x00\x00\x00\x00\x00\x00\x00\xc9\xe4\x00\x00\x00\x00\x00\x00\x00.\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - '⥎': b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\xaa\xba\xc0\n\x80\x81m\x00\xd1c8\xa0\n6\x19\x0b\x00\xa8\t\x15\xc0\r\x173j\x00\xa4a\x80\xc0\x0b\x80\x81|\x00\xc1rE\xa0\nT'\x0c\x00\xc7\x18\x08\xb0\x0c\x08\x15J\x00\xa63a\xd0\x0b\xba\xba\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + '↦': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x00\x00\x00\x00\xb4\x00\x00\xdd\x00\x00\x00\x00\x00~0\x00\xdd\x00\x00\x00\x00\x00\t\xe2\x00\xdd\x00\x00\x00\x00\x00\x00\xbd\x10\xdf\xff\xff\xff\xff\xff\xff\xff\xc1\xdf\xff\xff\xff\xff\xff\xff\xff\xc1\xdd\x00\x00\x00\x00\x00\x00\xad\x10\xdd\x00\x00\x00\x00\x00\x08\xe2\x00\xdd\x00\x00\x00\x00\x00n0\x00\xdd\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + '␣': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x10\x18\x80\x0e\xf2\x02\xfe\x00\xef\xff\xff\xe0\x0e\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + '◉': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00l\xee\xc6\x00\x00\x00\x00\x00\x1c\xd7D}\xc1\x00\x00\x00\x00\xbc\x10\x00\x01\xcb\x00\x00\x00\x06\xe2\x00\x00\x00.`\x00\x00\x0c\x90\x06\xee`\t\xc0\x00\x00\x0f@?\xff\xf3\x04\xf0\x00\x00\x1f0o\xff\xf6\x03\xf1\x00\x00\x0f@?\xff\xf3\x04\xf0\x00\x00\x0c\x90\x06\xee`\t\xc0\x00\x00\x06\xe1\x00\x00\x00\x1e`\x00\x00\x00\xcc\x10\x00\x01\xcc\x00\x00\x00\x00\x1c\xd73}\xc1\x00\x00\x00\x00\x00l\xee\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + '◯': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x8d\xff\xd8 \x00\x00\x00\x00n\xc63l\xe6\x00\x00\x00\x07\xe5\x00\x00\x00^p\x00\x00O@\x00\x00\x00\x04\xf4\x00\x00\xc9\x00\x00\x00\x00\x00\x9c\x00\x03\xf2\x00\x00\x00\x00\x00/0\x07\xd0\x00\x00\x00\x00\x00\rp\t\xb0\x00\x00\x00\x00\x00\x0b\x90\t\xb0\x00\x00\x00\x00\x00\x0b\x90\x07\xc0\x00\x00\x00\x00\x00\rp\x04\xf1\x00\x00\x00\x00\x00\x1f0\x00\xd8\x00\x00\x00\x00\x00\x8d\x00\x00^0\x00\x00\x00\x03\xe5\x00\x00\n\xd3\x00\x00\x00=\xa0\x00\x00\x00\x9f\x93\x009\xf9\x00\x00\x00\x00\x04\xbf\xff\xfb@\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + '◌': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0cf\xc0\x00\x00\x00\x00\x00\x07`\x00\x06p\x00\x00\x00\x00\xa2\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n \x00\x00\x00\x02\xa0\x00\x00H\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u\x00\x00\x00\x00\x00W\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x84\x00\x00\n \x00\x00\x00\x02\xa0\x00\x00\x00\xa2\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07lf\xc6p\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '™': b'\x00\x00\x00\x00\x05\xde\xd9\xd0\xc5\x00\xe0O?P\x0e\x04\xdc\xd5\x00\xe0K\xebP\x0e\x04\xb2\xa5\x00\xe0K\x0bP\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '©': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\xef\xe9\x10\x0c\xc3\x03\xcc\x04\xf2\x00\x02\xf4\x8c\x00\x00\x0c\x88\xb1\xbf\xb1\xb8\x9bm\x1ek\x99\xb8\xc0\x00\xb9\x9b\x8c\x00\x0b\x99\xb8\xc0\x00\xb9\x8b\x8c\x00\x0b\x88\xc6\xd1\xe6\xc8O+\xfb/@\xcc0<\xc0\x01\x9e\xfe\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', } diff --git a/misc/q1font/render.py b/misc/q1font/render.py index 04a17439..cc3a4e18 100755 --- a/misc/q1font/render.py +++ b/misc/q1font/render.py @@ -27,17 +27,22 @@ NUM_GREYS = 16 # TODO: -# - need _ but for blank space -# - need better menu arrow +# - need _ but for blank space; never found and yet may not need. CHARSET = [chr(x) for x in range(32,127)] \ + ['→', '←', '↳', '•', '⋯', '█', '▌', '▐', '▼', '▲', '►', '◀', '⏵', - '₿', '✔', '✓', '⥎', + '₿', '✔', '✓', '↦', '␣', + '◉', '◯', '◌', '™', '©', ] -DBL_WIDTH = ['⋯', '✔︎', '✓','→', '←'] # these are be better as double-wide chars + +# these are be better as double-wide chars +DBL_WIDTH = ['⋯', '✔︎', '✓','→', '←', '↦', + '◉', '◯', '◌', + ] + NUM_CHARS = len(CHARSET) # use a different glyph for these unicode values @@ -95,9 +100,9 @@ def doit(out_fname='font_iosevka.py', cls_name='FontIosevka'): left, top, right, bottom = font.getbbox("j") y_offset = CELL_H - bottom - 1 - NUM_COL = 16 + NUM_COL = 24 samples = Image.new('L', (((CELL_W + 1) * NUM_COL) + 1, - ((CELL_H+1) * (NUM_CHARS//NUM_COL + 2))), 255) + ((CELL_H+1) * (NUM_CHARS//NUM_COL + 3))), 255) cells = Image.new('L', (CELL_W*NUM_CHARS*2, CELL_H), 0) @@ -115,7 +120,7 @@ def doit(out_fname='font_iosevka.py', cls_name='FontIosevka'): left, top, right, bottom = font.getbbox(ch) if (right-left > CELL_W) and not is_dbl: # char is too wide: some will be lost - if ch in '←': + if ch in '←↦': # keep left edge of these x_shift = -left elif ch in '→': @@ -125,7 +130,13 @@ def doit(out_fname='font_iosevka.py', cls_name='FontIosevka'): # center it x_shift = (CELL_W - (right-left)) / 2.0 - draw.text((x_shift, y_offset), REMAPS.get(ch, ch), 'white', font) + # Vertical tweaks + this_y = 0 + if ch == '↳': + # this one up a little, so arrow is more mid-line-ish + this_y = -4 + + draw.text((x_shift, y_offset + this_y), REMAPS.get(ch, ch), 'white', font) # check actual = img.getcolors() @@ -133,6 +144,8 @@ def doit(out_fname='font_iosevka.py', cls_name='FontIosevka'): assert len(actual) >= 2, f'blank char? {ch}' # build sample + if is_dbl and (n % NUM_COL) == NUM_COL-1: + n += 1 samples.paste(img, box=( ((n % NUM_COL) * (CELL_W+1)) + 1, ((n // NUM_COL) * (CELL_H+1)) +1)) diff --git a/misc/q1font/sample.png b/misc/q1font/sample.png index 9ec87ee49c9c196822519b9709fff5b22db2cd99..82574978f7a8f1fef80109fe7a510559ae08061e 100644 GIT binary patch literal 6044 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