From 846a00137ff84ca2dea93f2235f4e2109c7e8911 Mon Sep 17 00:00:00 2001 From: "Peter D. Gray" Date: Tue, 30 Jan 2024 11:27:07 -0500 Subject: [PATCH] tighter boxes vertically --- misc/q1font/font_iosevka.py | 17 +++++++++-------- misc/q1font/render.py | 28 ++++++++++++++++------------ misc/q1font/sample.png | Bin 7169 -> 7186 bytes 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/misc/q1font/font_iosevka.py b/misc/q1font/font_iosevka.py index 472cee2c..e7b683d3 100644 --- a/misc/q1font/font_iosevka.py +++ b/misc/q1font/font_iosevka.py @@ -25,10 +25,10 @@ CELL_W = const(9) CELL_H = const(22) BYTES_PER_CHAR = const(99) -#SPECIAL_CHARS = ['→', '←', '↳', '•', '⋯', '█', '▌', '▐', '▼', '▲', '▶', '◀', '⏵', '₿', '✔', '✓', '↦', '␣', '◉', '◯', '◌', '⬚', '░', '™', '©', '⬧', '※', '─', '—', '━', '┃', '┇', '┓', '┏', '┛', '┗'] +#SPECIAL_CHARS = ['→', '←', '↳', '•', '⋯', '█', '▌', '▐', '▼', '▲', '▶', '◀', '⏵', '₿', '✔', '✓', '↦', '␣', '◉', '◯', '◌', '⬚', '░', '™', '©', '⬧', '※', '─', '—', '━', '┅', '┃', '┇', '┓', '┏', '┛', '┗'] class FontIosevka: - DOUBLE_WIDE = ['⋯', '✔', '✓', '→', '←', '↦', '◉', '◯', '◌', '※', '•', '—', '\x0e', '\x11', '\t', '\x0f', '\x12', '\x13', '\x14', '\x16', '\x17'] + DOUBLE_WIDE = ['⋯', '✔', '✓', '→', '←', '↦', '◉', '◯', '◌', '※', '—', '\x0e', '\x11', '\t', '\x0f', '\x12', '\x13', '\x14', '\x16', '\x17'] @classmethod def lookup(cls, cp): @@ -137,7 +137,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\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'\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\r\xff\xfd\x00\x00\x00\x00\x00\x00?\xff\xff0\x00\x00\x00\x00\x00?\xff\xff0\x00\x00\x00\x00\x00\r\xff\xfd\x00\x00\x00\x00\x00\x00\x04\xdf\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00M\xfd@\x00\r\xff\xfd\x00\x03\xff\xff\xf3\x00?\xff\xff0\x00\xdf\xff\xd0\x00\x04\xdf\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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', '▌': b'\xff\xff\x80\x00\x0f\xff\xf8\x00\x00\xff\xff\x80\x00\x0f\xff\xf8\x00\x00\xff\xff\x80\x00\x0f\xff\xf8\x00\x00\xff\xff\x80\x00\x0f\xff\xf8\x00\x00\xff\xff\x80\x00\x0f\xff\xf8\x00\x00\xff\xff\x80\x00\x0f\xff\xf8\x00\x00\xff\xff\x80\x00\x0f\xff\xf8\x00\x00\xff\xff\x80\x00\x0f\xff\xf8\x00\x00\xff\xff\x80\x00\x0f\xff\xf8\x00\x00\xff\xff\x80\x00\x0f\xff\xf8\x00\x00\xff\xff\x80\x00\x0f\xff\xf8\x00\x00', @@ -172,11 +172,12 @@ class FontIosevka: '\x14': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x01\xff\xfd\x00\x06\xe1\x00\x0f\xf0\x01\xf73\x00\r\x90\x00\x0f\xf0\x01\xf5\x00\x00_ \x00\x0f\xf0\x01\xff\xf4\x00\xcb\xf5\x00\x0f\xf0\x01\xf71\x04\xf4\xf5\x00\x0f\xf0\x01\xf5\x00\x07\xff\xfd\x00\x0f\xf0\x01\xf5\x00\x014\xf7\x00\x0f\xf0\x01\xf5\x00\x00\x01\xf5\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', '\x16': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x01\xff\xfd\x05\xff\xfb\x00\x0f\xf0\x01\xf73\x05\xf42\x00\x0f\xf0\x01\xf5\x00\x05\xff\xd3\x00\x0f\xf0\x01\xff\xf4\x05\xf7\xcc\x00\x0f\xf0\x01\xf71\x01@~\x00\x0f\xf0\x01\xf5\x00\x01@~\x00\x0f\xf0\x01\xf5\x00\x03\xf6\xcc\x00\x0f\xf0\x01\xf5\x00\x00\x9f\xd3\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', '\x17': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x01\xff\xfd\x00\x0c\xc0\x00\x0f\xf0\x01\xf73\x00O@\x00\x0f\xf0\x01\xf5\x00\x00\xcc\x00\x00\x0f\xf0\x01\xff\xf4\x02\xff\xd4\x00\x0f\xf0\x01\xf71\x06\xf5\xbc\x00\x0f\xf0\x01\xf5\x00\x07\xe0~\x00\x0f\xf0\x01\xf5\x00\x04\xf5\xbc\x00\x0f\xf0\x01\xf5\x00\x00\x9f\xd4\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\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\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00', '┇': b'\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\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\x0f\xff\xff\xff\x00\xff\xff\xff\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\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\x0f\xff\xff\xff\x00\xff\xff\xff\xf0\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00', - '┛': b'\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x0f\xff\xff\xff\x00\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xff\xff\xff\x00\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xf0\x0f\xff\xff\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\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\x00\xff\xff\xff\xf0\x0f\xff\xff\xff\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00', + '┛': b'\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\xff\xff\xff\xf0\x0f\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\x00\x00\x00\x0f\xf0\x00\x00\x00\xff\xff\xff\xf0\x0f\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 0fdb874c..fe60155b 100755 --- a/misc/q1font/render.py +++ b/misc/q1font/render.py @@ -41,7 +41,8 @@ KEYS_FUNCTION = KEY_F1 + KEY_F2 + KEY_F3 + KEY_F4 + KEY_F5 + KEY_F6 KEYCAP_SYMBOLS = [ KEY_NFC, KEY_QR, KEY_TAB ] + list(KEYS_FUNCTION) # we override these w/ our own art, but the chars involved are still these -LINEDRAW_SYMBOLS = [ '━', '┃', '┇', '┓', '┏', '┛','┗' ] # 'heavy' versions +# - dashed version for bottom/right sides of things +LINEDRAW_SYMBOLS = [ '━', '┅', '┃', '┇', '┓', '┏', '┛','┗' ] # 'heavy' versions CHARSET = [chr(x) for x in range(32,127)] \ + ['→', '←', '↳', '•', '⋯', @@ -55,7 +56,7 @@ CHARSET = [chr(x) for x in range(32,127)] \ # these are be better as double-wide chars DBL_WIDTH = ['⋯', '✔', '✓','→', '←', '↦', - '◉', '◯', '◌', '※', '•', '—', + '◉', '◯', '◌', '※', '—', ] + KEYCAP_SYMBOLS NUM_CHARS = len(CHARSET) @@ -117,9 +118,10 @@ def draw_linedrawing(ch, img, draw): lw = 2 # line width w, h = CELL_W, CELL_H mw = (w // 2) - (lw//2) - mh = (h // 2) - lw + mh1 = (h // 2) - lw + 3+4 # top + mh2 = (h // 2) - lw - 5 # bot if ch == '┃': - print(f"{mw=} {mh=} CELL={CELL_W}x{CELL_H}") + print(f"{mw=} {mh1=} {mh2=} CELL={CELL_W}x{CELL_H}") # erase old attempt from font draw.rectangle( (0,0, w, h), fill=0) @@ -130,16 +132,18 @@ def draw_linedrawing(ch, img, draw): draw.line( (mw-1, 0, mw-1, h), width=lw, fill=255) elif ch == '┇': # for right side of box draw.line( (mw+2, 0, mw+2, h), width=lw, fill=255) - elif ch == '━': - draw.line( (0, mh, w, mh), width=lw, fill=255) + elif ch == '━': # top lines + draw.line( (0, mh1, w, mh1), width=lw, fill=255) + elif ch == '┅': # bottom lines + draw.line( (0, mh2, w, mh2), width=lw, fill=255) elif ch == '┓': - draw.line( [(0, mh), (mw+2, mh), (mw+2, h)], width=lw, fill=255, joint='curve') + draw.line( [(0, mh1), (mw+2, mh1), (mw+2, h)], width=lw, fill=255, joint='curve') elif ch == '┏': - draw.line( [(mw, h), (mw, mh), (w, mh)], width=lw, fill=255, joint='curve') + draw.line( [(mw, h), (mw, mh1), (w, mh1)], width=lw, fill=255, joint='curve') elif ch == '┛': - draw.line( [(mw+2, 0), (mw+2, mh+1), (0, mh+1)], width=lw, fill=255, joint='curve') + draw.line( [(mw+2, 0), (mw+2, mh2+1), (0, mh2+1)], width=lw, fill=255, joint='curve') elif ch == '┗': - draw.line( [(mw-1, 0), (mw-1, mh), (w, mh)], width=lw, fill=255, joint='curve') + draw.line( [(mw-1, 0), (mw-1, mh2), (w, mh2)], width=lw, fill=255, joint='curve') else: raise ValueError(ch) @@ -198,8 +202,8 @@ def doit(out_fname='font_iosevka.py', cls_name='FontIosevka'): # - looks awesome for random keyboard PIN entry mode this_y = -4 if ch == '•': - # double-wide bullet; needs perfect alignment inside full-cell box cursor - x_shift += 4.6 # right side of perfect + # bullet; needs perfect alignment inside full-cell box cursor + #x_shift += 4.6 # right side of perfect (FOR DOUBLE WIDE) this_y = 1 # perfect if ch in KEYCAP_SYMBOLS: diff --git a/misc/q1font/sample.png b/misc/q1font/sample.png index 269226e3dee883ed838b562d019b547a645c06fe..ee205079a6f7519f626767189ea38566adc7b479 100644 GIT binary patch literal 7186 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 literal 7169 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