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 9ec87ee4..82574978 100644 Binary files a/misc/q1font/sample.png and b/misc/q1font/sample.png differ diff --git a/unix/variant/sim_scanner.py b/unix/variant/sim_scanner.py index d0a2474b..4c4a53ef 100644 --- a/unix/variant/sim_scanner.py +++ b/unix/variant/sim_scanner.py @@ -11,6 +11,7 @@ DATA_FILE = 'qrdata.txt' class SimulatedQRScanner(QRScanner): def __init__(self): self.q = None + self.version = '4.20' def hw_scan(self): # trigger a scan