fatter bars

This commit is contained in:
Peter D. Gray 2023-12-11 15:17:52 -05:00
parent b91156db9b
commit c602789ac4
No known key found for this signature in database
GPG Key ID: A2DCD558C2BE5D7C
8 changed files with 148 additions and 134 deletions

View File

@ -4,116 +4,115 @@
#
# see misc/gpu for source
#
VERSION = '1.3.0'
VERSION = '1.3.1'
LENGTH = const(3524) # bytes (after decompression)
# len(BINARY) = 2602
BINARY = (b'x\x9c\x8dWkp\x1b\xd5\x15>wweK\xb2\x13\xcb\x91c\xfc\xf6J\xd7\x0e&\xb2c\xd9'
b'\x1b\x97<H\xb3hS\xc5\xd6:&$\x84I\xac\xd0\xae\x1f\x90U\x0ce\x8biFS~T'
b'M\x86\x96\xa6m\x80\x08\xf2\x90\x12\x101\x8f\xa4\xb4\x83\xeb\x19\xf5A'
b"\xe3!\x85a\x98B\x01mL\xda4\xce\x14C\xe8\xa8L'EaZ\xa4$\xd8\xdb\xb3\x8a\xc3"
b'\xd83\x99N\xe59\xba\xe7u\xcf\xf9t\xee\xb9\x0fC\x05\xf06\x02\xd66\x1bX'
b'\x05$\xf8\x1f\x9f\x8e9\xf6[\x91_\x89\xb4\x85\\\xd3\x99\xe3\x8d\xe8'
b'\xff\xb1]\x8fy#\xff\x1b\xe9\xe7br$\x0b\xbai\x18<\x85\xbaE\x06\x0f\x93'
b"\xe2:a\n^#\x94j\x8eqt\xe4M\x9f\xdf.\x00+';\x92\xe0aSl\xd75\x0f\xc7\xf8)\xbf"
b'i+F\x1f\xd3^\xdc\xf9\xa8\x1f2O]\x06\x17;e\x97\x83[\xa5\x8d\\\x9b'
b'\xad\xd3.\xfb*b\xbe/&l\x01f\n\xa8S\xe1\xda\x0b\xe5\x98\xef\xf2\x04d'
b'\xde\xbc<\x93\x86\x8a|\xfc<Ygi\x1d\x12Z \x93$\x8d?\x1e-sc\xbc\xe3\x909=]"\''
b'\x1az\x87\x98\x9b\x97J\xbd\x03\xc1\xa1O,\x1e\x91DI|-eN\xf0\x10Y\xc2D\xb9\x83'
b'\x90\xf9\xf3U\xa0_\x10\x1e\x98\x13\xcc\x01\xf6i\xee`A\x142\x7f\xba\xfab\xbf'
b'm43\x0e\x0eFt$\x99\x06^vu\xf5>\xf0\xd8\xa8]\xec\xbd\xb7w\x08\\\xee|\xbc'
b'b7\x15!\x8a\x99\xe2\x9092}\x8a\x92\xe8k\xab\xb9(9a\x11\xca;\x0b\xa2\xccS\x90'
b'9~\xb5\x06\xb1\x10\xc4\xf2\xd3\xe9E\xb2\xb3\x9b\x89\xbeMy@\x0f'
b'\xcc\xe1\x99\x8e\xd0~5\xce9\xa5\x01\xe5\x82\xba \xe0\x14/\xe0X\x9c\x1f\xa9Z'
b'\x84#\xc5\xd1\x9e\x1f\xad\xa3\x8e<\x16\xe3}\xc3\x00\x0e6:9\x07\xc0] \x92'
b'\x9ca\x18\xdfG2\xb2H\xd3F\x84\xb2\x81 S\xaa\x16INE[\x8f\xb5\xe6\x19\xd1J\xb3'
b'\xc9\x81\xee\xc1\xc0s\xa1J\x9f#\xf5Q\xa8H\x8a\xb8.\xf4\x8d\x84\xba\x98"\xb1'
b'\x12:\xeb~p{\xa9\x06\x1e\xaao\xef*\xd2Lr\x86\x9f\x0b\x91\xe86\xb9>'
b'\xbcM\xae\r\xf3\xb4\xd2\xd7\x9e\xfa8\xe4\x94.\xf4\x918x\x9a\xf5\xbbz\x04m'
b'\xa0u[\xaa\xe4l_\xeb\xbd\xa9\xfeV9uwkYj\xa3\xbc1P\xa5X\xa9o\x8a\xaawt\x15!'
b'\xe6s\xe9\x87[\xbf\x99\n\xc8\xbbZ\x85\x94\xd6\xfa/=\x10\xe8\xd0\xd0c\nZ'
b'\x82zg\xe7:\xb9B\x81\x8cm\x9ax\xbd\x1a\xa1\xc70\xfeH\x1f\xb89Z\n'
b'G\xfc\x84\xbf\xcf?\x12\x12|\xdd:\xdcBR_\x93\xeb5XJR\x1dr\xadf\xdc\x0c\x8d'
b'\xcc\x92\x93~\xa1sy\x17\x1b\xb6\xab\xe4Yh\x95uh!)V\xb3+\xd9qhi\xd1\xdb'
b'\x11G\x01\x15\xb4\x894\xb4,\xd1\x8d\xecw\x8dV\xb9)\xe0TX\xfa\xef4\xdb'
b'R\xab7\x05\x9a\xe5\xd2\xf0a\xed\xce\xf0_5\x8bk\x7f\xb8W\xab\n\xef\x95\xaa'
b'\xb4\xdf\xa3\xffB\x9d\xb8\x1b\xe4\xca\xf0=\x9a\x1d5c\xa8\xb1\xe8\x0c'
b'\xe5\x03\xa5a\xac\xa8\xf6\xf3t\xb9\\\x87\xd1m\xf4\xfd\xf4\xc0\xce\xc91h-L'
b'\x15\xb6\x1c?[\xd6\xb3\xb3fx\xcb\x991\x06\x8e\xa5\xeb\x81\xc0\xb3'
b'\xe9\x1d\xfe\x97\xfaG\xd3/\x85n\xf5\x8d\xa6\xc0\x93M-\x0e\x93\xd5/\xf4\x93v'
b"rtr\xec\xf94\xae\x0b\xae\xdd2\xec\xd9\x16\xa4\x06\xa4\xe5H^\xa4\r\xb8'"
b'\x0cc\xc6hD\xfe1\xe4\xd7!\x05\x90nC\xf9n\x1c#\xee*y\x91%\xa6D\xdc\x95\xf2'
b'&\xa8T\x11%\xf2\xa7\x91+\xf5}\x99\xeaU\xcb\xbaJE\x94\x89]\xeaU\xaa\xd4Eyi'
b'\x131\xbdbjI\x97],t\xc5\x90\xdb+\xc5\x94\x15\xee\xc3\xaa\x15\x1cb\xa9'
b'\xef\x8a\x1eSmh\x8b)6\xd9\x16\xe8U,\xeeCJ\x15v\x0f\\\xc4\x1dk\xf6\\\x04['
b'\xeb-\xa4\x0c\xd2\xe3\x86\xe1\x98\x82\xa9\x0f\x11|\x85<\x9c\xac\xbc\xbf'
b'\xa23\xd1@\xa4\xca\xc1\x1f\xb8\xc8\x92\xaa\xfb\xbb,\x8cH\xf6\x93\xd89\xdckv'
b'\xe9\xdc\xc0\xe4P\x11\xee\x10\x88\x1b\xd9\xf6\x19\xc8\x9c\xcc\x19\xd9\xad3'
b'\xc5\x81\x05]N\xb5Ht*F\xf6W3\x14\xd7\xf9\x8a\xce7\xd2\x90\xc7\xf7E\n2\xcf\\'
b"6\xb9K)#;2s9m\xe6'\x0es\xa7#\x0e\xacK\x82:\xdcV\xd7\xa4\xc5\x91\x8c"
b'\xf5\x1d\xee\x8f\xf5\x9f\xa2AR\x83%zR\xad\x14\x9f\xf3]M9\x86\x91\xf3}'
b'\xa9\x9b~\x93\x96X\x9fuU\xac/\x7f\xe6x\x89\x98\xa0\xde$\xcen0\xf5G'
b'\xfap\xae\x1b\xa8\xad{\x139\xe4+<?\xa2:\xe7\xcc\xf2\x8e\xbf\xa0.\x16\x9f'
b"\xc6x\xefn'B\xe3\xf0\xc5\xb49\x7f8\xb9\x10j\x81\xac\xda3\x16\xab \xbf\xd8?Vm"
b'\xa7\x9a\xa29\xedK\xf9\x11\xedc\r\x7f\x8b\xe1\x02\x8e7\xb2\xef\x18'
b'd\xcd\xd8\xd8\x96\xca_\x8e-\xb2\xbb5\x0f\xbf\xd4~L\xbbO\xfb;z$f=^5\x9a'
b'\xf1\xfb\xb01<\x9e\xa0\xda|L\xf4\xbd\xb1\x8fDh(\n\x04I\x02q\xcd\xff'
b'5\xda\xf8\xd3j\xadx\x14q\x95\x0f_\xe7J\x87\xc9\xf2O\xf3\xf8\xb4d\rp/\xd7=F'
b'a1\x18\xd9\xe3\x06\x0fm\xa0JF\xf6]C\x1bw$\xf7\x8e\xd6\xcc\x9e\x8a\xeb'
b'\xaf\x9e\xa2\xd5\x0cDw\xd3 \x90\xe8\x14\x9d\x04&\x1a\xc1J\x84\xfcq<T\xcd'
b'\x93)qE\xa4n\xd5)Q\x85Pn\xb6\xf7\xed\xa3\xd7\xebh\xf6b&\xf9\xe8h9\xb0Q'
b'WS\xc7y\xdb-\xc2y[\x83"=\xef_\xb0\xbc[*\xa1.Xt\xb3S|\xb3\xb6\xa4'
b'\xed\xf3\x02\xf8`\x87\x9f}\xe6\xa1\xba\x03\xb7\xd7\x05v\xf9\xcaE\xc6'
b'S\xaf\xaf\x82& \xab\xe1\x80\x91}\x11\xebA\xa8)7\xb49\x96\x9b\x9a\xa3F'
b'\x19%n\x17jL\xe9\xc0\xac\xf4\x8fJ\xb2\xc2\x94\xf7\x19\x16<\x93\x89\xc7\x92b'
b'=\x97\xf5r\xca\xb9\xe1\x80e\x8a\xc5S\x89\xd3a\x7fy>\xd2?\xd3\x80\x08 '
b'\xfaj\x9d\xa3\xcd\xea-\x13.\xa4\xa7\x15\x80l\xb2V\xde\xe4\x82W'
b'\x8e\xae\xfb\xb6\x1f\xdc\x05\rU\x9dF\x9b\x13\xa8x\x8fo\xe8\xf6\x8a\rA\x1f+'
b'\x06+\xb7\x00i\x1f\xde\xbc\xd7\xf7\xb9\xce\xd2\x84\xfb\xa2\x0b\xf8\xa0o'
b'\x13V\x925\xd8\x06\xc7\x86\x04\xefQ#\xf0\x88RB\xbf\xa7\x92\xdb\x0eWu\xc1'
b'w*\x8c\xec\x99\x19h\xce\xe8\x8f\xa8\xb6\x00\x11\x9c"w\xc6\xe1&\xab7\xf9\x9c'
b'\x12\x11\xc6\xfd\x1e<\x8f\xb6N\x1b\x06\xfb,\x9e\xcc\x88A\xc4\xba\x95'
b'\x00Dr\xc92\xd9Dr\xbf?\xc2\xbb\x01\\\x05P*\x07\xb7\xb3b-\x0c!'
b"\x9a\xa0\xcf\x19\x11\xade:ik\xba\xc5\xa1'\xdca\x9aXb\xa285\x13n\xfc5\xb8\xc0"
b'\x0bd\r\xf6\xce\x0c\xb4\xe4\xf4q\x7fn\xdc\x0bL\xfb\xdf\xd2\x11\xcc'
b'\xa3\xe0\xf9\xa0%#4\xd1\xf8\xc3\xd1\x8b\x96IR\x8c\xeb\xfdr\x9f\xb9\xe2=W'
b'\xd8%\x05\x94i\x08\xf9\xb1\xaeQ\xe6\x00\xc1\x9b)\x98\xab\xa0\x10\xbd'
b'i5\x89\x025\xf5\xcc\x01.\xcaF\xcd\xd5\xef\xc9\xb9z\x840\xf5q\xb8\x07O\x18BxD'
b'\x124!<YH\xce\x18\xd9\xa0\xf1P\x18\x96\xd6\xa5*74\xab\xd0\xec\xd0\x85'
b'\xf0\xa5p\xb0p\xb2d4ld\xff3C\xdcBx[\xe1\x1fK\xf6J\x9ck?\xfcDr\xe2LG`'
b"\xa0\xc6\xac\x0c\xffUe<J\xa2\xa1l\xf6V$W\xea\xe8'\x96\x90\x1f/s"
b'\xcc\\\x9a\x8b\xd0I2\xd2_0\xaaa\xaf\x99}\xb6\x02\xa9\x1ek6\x93\x9eI'
b'k\xeb\xcd\xbfL\xf2G\xa3E*\xf3d\xbd\x9b\xb8H\xd4\x02\xe4P\xd0\n\x9e:'
b'\xfd\t\x91\x17\xa0\x89\xc1\x13\xe4w\x97\xdf\x18c\xa3L\x9c\x8d\x05U'
b'\xbc\x8d\xe3\x13b\xb9\xce\xc5\xc9j\xe2\xb1\x9e\x1dRI\x8c\x1c\x8eJ'
b'L\xec\xb4\x1a@|C\n\xf0\x85\xd8S5\xb8:\xc5"/\x91UA\xeb_\xd2\x84\xb21r$*\x92X'
b'\x8dX\xe5\x03}b\xea>+\x0f\x02\xd4\xbb[U\xf0hsr\xed1s\xb9\x83\x10\x13y8'
b'(\x99\x1e\xe0\xd91\xc7>\x8cv.f\xda\xb9\xf8M\x12Y\xdd\xaa\x10O\xc3Y&\xceC\\'
b'\xadw[\xa2\x02\xbc\x82\x11\xb7\xcc\x99\xd1{\x83\x88\xdds\xec\x01\xb4'
b'[\xf2\x11o\x92^Q\xccH\xd5\xa1k\x91>\xc3H_\x9f\xe3\xd9q\x83H\x1ds\xec\x8d_'
b"E2\xb1}\xa60\x9eo\xe9\xb3\xbfr\x8a\xb8D\xa8\x14\xad\xf9z<\x9a\x9e+\xed\x9b'%"
b"\xe6I'\xe6I\xbf\x99'\x9d\x9a'\xe1\x9d\xa83\xf1'\xc4`\x88\x8bv \x96\x0fs\x85M"
b'm\xe7g\xb3\xef\x04O\xed\x1c\x9cz\xee\x8d\xb1\x12w\x1cq\xd6\xd3\x83\x12,+'
b'G\x94\x87D\x9e^\xb3\xbe\x9e3+\x1c\xcf\xd7\xa3\xb5\x9f\x8d\x13\x01\xe6e:\x9b'
b'&\xfc xE\x0e\xab\xbf\xcb\xfaaz\x89}\xd0\xee\x05\x8ay\x1e\xc4<\xd5s'
b'\xf2\x1c\x9d\x9f\xa7\xb9L\xf7\xce\xc9\xb3oN\x9e\x07\xfb\xdf\x9e\x97\xe3'
b'\x1c\xe6\xd8\x05\xbcX\x809\x06\xad\x1f\xe1;\x94U\x19\xd0\x92\x84\x0f'
b'\x164\x7f\xd0\xa3\x16\xa9\x9d!AzO]\xac\n\xd2\xc2P\xf1NA\xda\x17b'
b'%\xd4\x84\xa0X\x90\x1c=T\xea\x10=\xf8b\xdb\xac\xfeL]\xd8\xd3$\tb'
b'\x85\x14\xa1\x1b\x95jr\xd4\xc7\x9d\x8e\xf0\x9bU\x91\xb0\xd2f%B\x81\x8f\x93#'
b'>F\x97w\xc6\xc7\x9c}\x13!\x16_Z\x13x/\x88`\x18W3\xd7\x9e\x81\xc4\xcd\xaa\xde'
b'dTb\x95w0^5\xc3\xa9\x1e\xa9lC\xb3HQ#\xab\xcen\xb6\x8fU\x17\x84\xaa$'
b'F\xd9\xa3\xee\rQq\x0f\x8eK\xa5I\xfb$S%\xedV\xa0\x85KE\xe8n\x9c\xe7\x94\xf6'
b'(\x8cj\x95\xab\xc4"\xd5\xf4\x96\xd4\x00z;%\t\xf7\x8c\x17\xf7\xa71u\xfd'
b'\xed\xf9\xbeQ\xe3"\xb4\x9a;\xe4#\x13P\xecXYm\xcfsv\xeb\xcaj[\x9e\xb3q+'
b'\x99c\x8e\xedb\x85\xf9&\xe5X\x86!\xf8\xb9\xfe\xbf\x04\x0b\xbb+'
b'\xa2\xb8\xcb\xb4\xf5\x95\x1a\x11\xf0\xce\xa7\xaf\xe3\xad\x0bK\xaf\xea[\xeb'
b'\xf0\x15\x02\xb9\xe4)\x7f\xee\xa4\xf5\xe43~m\xfd\\\xbem\x99\xb0\xcc\x0bw\xc8'
b'\xe0\xeb\x1b\xe4\x07\x1e\x18\\\x9bg\xfa\x1e\xda1\xbc\xf6z\xe8\xb55'
b'\x0b\xa1~\x1fL\x95\xe4\x8c\xc7\xdf\xba0\xb3\xf6\xc2\xa5\x9cq)\xc7'
b'\xce\xac\xf8r\xd6!\x1f\x83\x7f8\xf4\xc0\xbdk\xda\xbd\xedB[{[\xdb2\xef'
b'\xca\xf6va9\xbf#\xf4\xf0\x9a;\xc5AA\xf0\x0exW\xf2\xeb\xbeq\xf7\x9a\xb6ks>'
b'\x05\xb0\xfe\x01\xe9\xbf\xce\xd1bf')
# len(BINARY) = 2603
BINARY = (b'x\x9c\x8dWkp\x1b\xd5\x15>wweK\xb2\x13\xcb\x91c\xfc\xf6J\xd7\x0e&\xb2c\xc9'
b'\x1bC\x1e\xa4Y\xb4\xa9bk\x1d\x13\x12\xc2$Vh\xd7\x0f\xc8*\x86\xb2\xc54'
b'\xa3)?\xaa&CK\xd36@\x04yH\t\x98\x98GR\xda\xc1\xf5\x8c\xfa\xa0\xf1\x90\xc20'
b'L\xa1\x806&m\x1ag\x8a!tT\x86\xa1(L\x8b\x94\x04{{Vq\x18{&\xd3\xa9<G\xf7\xbc'
b'\xee9\x9f\xce=\xf7a\xa8\x00\xdeF\xc0\xea\xb3\x81U@\x82\xff\xf1i\x9fc\xbf'
b'\x05\xf9\x95H[\xc8U\x9d9^\x8f\xfe\x1f\xdb\xb5\x98\xd7\xf3\xbf\x9e~.&G'
b'\xb2\xa0\x8bF\xc0S\xa8[d\xf00)\xae\x03\xa6\xe0UB\xa9\xe6\x18GG\xde'
b'\xf4\xf9\xdd\x02\xb0r\xb2#\t\x1e6\xc5v^\xf5p\x8c\x9f\n\x98\xb6b\xf41'
b'\xed\xc5\x1d\x8f\x04 \xf3\xe4%p\xb1Sv9\xb4U\xda\xc8\xf9l\x1dv\xd9_'
b'\x11\xf7\x7f9a\x0b2S@\x9d\n\xd7V(\xc7\xfd\x97& \xf3\xc6\xa5\x994'
b'T\xe4\xe3\xe7\xc9:K\xeb\x90\xd0\x02\x99$i\xfc\xc9h\x99\x1b\xe3'
b'\x1d\x87\xcc\xe9\xe9\x12y\xb8\xa1g\x90\xb9q\xa9\xd4\xd3\x1f\x1a\xfc\xd8'
b'\xe2\x11I\x8c$\xd6R\xe6\x04\x0f\xd1%L\x8c;\x08\x99\xbf\\\x01\xfa%\xe1\x81'
b'9\xc1\x1c`\x9f\xe2\x0e\x16\xc4 \xf3\xe7+/\xf4\xd9F3\xe3\xe0`DG\x92i\xe0eW'
b'g\xcf\xfd\x8f\x8e\xda\xc5\x9e{z\x06\xc1\xe5\xce\xc7+vS\x11b\x98)\x01\x99'
b'#\xd3\xa7(\x89\xbd\xba\x9a\x8b\x91\x13\x16\xa1\xbc\xa3 \xc6<\t\x99\xe3Wj\x10'
b'\x0bA,?\x9b^$;\xbb\x98\xd8[\x94\x07\xf4\xc0\x1c\x9e\xe9(\xedS\x13\x9cS\xeaW.'
b'\xa8\x0b\x82N\xf1\x02\x8e\xc5\xf9\x91\xaaE8R\x1c\xed\xf9\xd1:\xea\xc8c1\xde'
b'3\x0c\xe0`\xa3\x93s\x00\xdc\t"\xc9\x19\x86\xf1\x03$#\x8b4mD)\x1b\x0c1\xa5j'
b'\x91\xe4T\xb4\xf5Xk\x9e\x11\xad4\x9b\xec\xef\x1a\x08>\x1b\xae\xf4;R\x1f\x86'
b'\x8b\xa4\xa8\xebB\xefH\xb8\x93)\x12+\xa1\xa3\xee\x87\xb7\x95j\xe0'
b'\xa1\xfa\xf6\xce"\xcd$g\xe4\xd90\x89m\x93\xeb#\xdb\xe4\xda\x08O+\xfdm'
b'\xa9\x8f\xc2N\xe9B/I\x80\xa7Y\xbf\xb3[\xd0\xfa[\xb7\xa5J\xce\xf6\xb6\xde'
b'\x93\xeak\x95Sw\xb5\x96\xa56\xca\x1b\x83U\x8a\x95\xfa\xa7\xa8z{g\x11b'
b'>\x97~\xa8\xf5[\xa9\xa0\xbc\xabUHi\xad\xff\xd2\x83\xc1v\r=\xa6\xa0%'
b'\xa4wt\xac\x93+\x14\xc8\xd8\xa6\x89\xd7\xab\x11z\x0c\xe3\x8f\xf4\x82'
b'\x9b\xa3\xa5p$@\xf8{\x03#a\xc1\xdf\xa5\xc3M$u\xb3\\\xaf\xc1R\x92j\x97k5'
b'\xe3Fhd\x96\x9c\x0c\x08\x1d\xcb;\xd9\x88]%\xcf@\xab\xacC\x0bI\xb1\x9a'
b']\xc9\x8eCK\x8b\xde\x868\n\xa8\xa0M\xa4\xa1e\x89nd\xbfg\xb4\xcaM'
b'A\xa7\xc2\xd2\x7f\xa7\xd9\x96Z\xbd)\xd8,\x97F\x0ekwD\xfe\xa6Y\\\xfb#=ZU'
b'd\xafT\xa5\xfd\x01\xfd\x17\xea\xc4\xdd WF\xee\xd6\xec\xa8\x19C\x8dEg('
b'\x1f,\x8d`E\xb5_\xa4\xcb\xe5:\x8cn\xa3\xef\xa5\xfbwN\x8eAka\xaa'
b'\xb0\xe5\xf8\xd9\xb2\xee\x9d5C[\xce\x8c1p,]\x0f\x04\x9eI\xef\x08\xbc\xd8'
b'7\x9a~1|\x8b\x7f4\x05\x9eljq\x84\xac~\xbe\x8f\xb4\x91\xa3\x93c\xcf\xa5q]p'
b'\xed\x96a\xcf\xb6 5 -G\xf2"m\xc0=a\x183F#\xf2\x8f"\xbf\x0e)\x88t+\xcaw\xe1'
b'\x18uW\xc9\x8b,q%\xea\xae\x947A\xa5\x8a(\x91?\x8d\\\xa9\xff\xabT\x8fZ\xd6Y'
b'*\xa2L\xecR\x8fR\xa5.\xcaK\x9b\x88\xe9\x15WK:\xedb\xa1+\x8e\xdc^)\xae\xac'
b'p\x1fV\xad\xe0\x10K\xfd\x97\xf5\xb8jC[\\\xb1\xc9\xb6`\x8fbq\x1fR'
b'\xaa\xb0{\xe03\xdc\xb1f\xcfE\xb1\xb5\xdeD\xca =f\x18\x8e)\x98\xfa\x00'
b'\xc1W\xc8C\xc9\xca\xfb*:\x86\x1b\x88T9\xf0C\x17YRu_\xa7\x85\x11\xc9~\x12?'
b'\x87{\xcd.\x9d\xeb\x9f\x1c,\xc2\x1d\x02\t#\xdb6\x03\x99\x939#\xbbu\xa6'
b'8\xb8\xa0\xd3\xa9\x16\x89N\xc5\xc8\xfez\x86\xe2:_\xd6\xf9F\x1a\xf6\xf8\xbfL'
b'A\xe6\xe9K&w1edGf.\xa5\xcd\xfc\xc4a\xeet\xc4\x81u\x19\xa6\x0e\xb7\xd55'
b'iq$\xe3\xbd\x87\xfb\xe2}\xa7h\x88\xd4`\x89\x9eP+\xc5g\xfdWR\x8e!\xe4\xfc_'
b'\xe9\xa6\xdf\xa4%\xdek]\x15\xef\xcd\x9f9^"\x0eSo\x12g7\x98\xfa#\xbd8\xd7\r'
b'\xd4\xd6\xb5\x89\x1c\xf2\x17\x9e\x1fQ\x9dsfy\xc7\x9fW\x17\x8bOa\xbcw\xb6'
b'\x13\xa1q\xe8\xb3\xb49\x7f(\xb9\x10j\x81\xac\xda3\x16\xaf \xbf\xdc?Vm'
b'\xa7\x9a\xa29\xedK\xf9\x11\xed#\r\x7f\x8b\xe1\x02\x8e7\xb2o\x1bd\xcd\xd8\xd8'
b'\x96\xca_\x8d-\xb2\xbb5\x0f\xbf\xd4~L\xbbW\xfb\x07z\x0c\xcfz\xbcb4\xe3\xf7ac'
b'h|\x98j\xf31\xd1w\xc7>\x14\xa1\xa1(\x18"\xc3\x88k\xfe\xaf\xd1\xc6\x9f'
b'Rk\xc5\xa3\x88\xab|\xe8\x1aW:D\x96\x7f\x92\xc7\xa7%k\x80{\xa9\xeeQ'
b'\n\x8b\xc1\xc8\x1e7x\xf0\x81*\x19\xd9w\x0cm\xdc\x91\xdc;Z3{*\xae\xbfr\x8aV'
b'3\x10\xdbMC@bSt\x12\x98X\x14+\x11\x0e$\xf0P5O\xa6\xe1\xcb"u\xabN\x89*\x84r'
b'\xb3\xbdo\x1f\xbdVG\xb3\x173\xc9GF\xcb\x81\x8d\xb9\x9a\xda\xcf\xdbn\x12\xce'
b'\xdb\x1a\x14\xe9\xb9\xc0\x82\xe5]R\tu\xc1\xa2\x1b\x9d\xe2\x1b\xb5%'
b'\xbe/\n\xe0\xfd\x1d\x01\xf6\xe9\x07\xeb\x0e\xdcV\x17\xdc\xe5/\x17\x19'
b'O\xbd\xbe\n\x9a\x80\xac\x86\x03F\xf6\x05\xac\x07\xa1\xa6\xdc\xe0s,75G\x8d'
b'2J\xdc.\xd4\x98\xd2\x81Y\xe9\x9f\x95d\x85)\xef3,x&\x13\x8f%\xc5z.\xe9\xe5'
b'\x94s\xc3\x01\xcb\x14\x8b\xa7\x12\xa7\xc3\xfe\xf2|\xa4O\xd3\x80\x08 '
b"\xf6J\x9d\xc3g\xf5\x96\t\x17\xd2\xd3\n@6Y+or\xc1\xcbG\xd7}'\x00\xee\x82\x86"
b'\xaa\x0e\xc3\xe7\x04*\xde\xed\x1f\xbc\xadbC\xc8\xcf\x8a\xa1\xca-@'
b'\xda\x866\xef\xf5\x7f\xa1[\xe8\xb0\xfbS\x17\xf0!\xff&\xac$kX\x1a\x1c\x1b'
b'\x86y\x8f\x1a\x85\x87\x95\x12\xfa}\x95\xdcz\xb8\xaa\x13\xbe[ad\xcf\xcc@s'
b'F\x7fX\xb5\x05\x89\xe0\x14\xb93\x0e7Y\xbd\xc9\xef\x94\x880\x1e\xf0\xe0y\xb4'
b'u\xda0\xd8g\xf0dF\x0c"\xd6\xad\x04 \x9aK\x96\xc9&\x92\xfb\x02Q\xde'
b'\r\xe0*\x80R9\xb4\x9d\x15ka\x10\xd1\x84\xfc\xce\xa8h-\xd3\x89\xaf\xe9&'
b'\x87>\xec\x8e\xd0\xe1%&\x8aS3\x91\xc6\xdf\x80\x0b\xbc@\xd6`\xef\xcc@K'
b'N\x1f\x0f\xe4\xc6\xbd\xc0\xb4\xfd=\x1d\xc5<\n\x9e\x0fZ2J\x87\x1b\x7f4\xfa'
b'\x99e\x92\x14\xe3z\xbf\xd4k\xaex\xf7evI\x01e\x1a\xc2\x01\xack\x8c9@\xf0f\n'
b'\xe5*(\xc4nXMb@M=s\x80\x8b\xb11s\xf5\xbbs\xaen!B\xfd\x1c\xee\xc1'
b'\x13\x86\x10\x19\x91\x04M\x88L\x16\x923F6d<\x18\x81\xa5u\xa9\xca\r\xcd*4;t'
b'!r1\x12*\x9c,\x19\x8d\x18\xd9\xff\xcc\x10\xb7\x10\xd9V\xf8\xa7'
b'\x92\xbd\x12\xe7\xda\x0f?\x95\x9c8\xd3\x11\xec\xaf1+\xc3\x7f]\x19\x8f2\xdcP'
b'6{+\x92\xcbu\xf4cK8\x80\x979f.\xcdE\xe9$\x19\xe9+\x18\xd5\xb0\xd7\xcc>'
b'[\x81T\x8f5\x9bI\xcf\xa4\xb5\xf5\xe6_&\xf9\xe3\xd1"\x95y\xa2\xdeM\\$f\x01r'
b'(d\x05O\x9d\xfe\xb8\xc8\x0b\xd0\xc4\xe0\t\xf2\xfbK\xaf\x8f\xb11&\xc1\xc6C'
b'*\xde\xc6\x89\t\xb1\\\xe7\x12d5\xf1X\xcf\x0e\xaa$N\x0e\xc7$&~Z\r"\xbeA'
b'\x05\xf8B\xec\xa9\x1a\\\x9db\x91\x97\xc8\xaa\x90\xf5\xafiB\xd989\x12\x13I'
b'\xbcF\xac\xf2\x83>1u\xaf\x95\x07\x01\xea\xdd\xad*x\xb49\xb9\xf6\x98\xb9\xdc'
b'!\x88\x8b<\x1c\x94L\x0f\xf0\xec\x98c\x1fB;\x177\xed\\\xe2\x06\x89\xacn'
b'U\x88\xa7\xe1,\x93\xe0!\xa1\xd6\xbb-1\x01^\xc6\x88[\xe6\xcc\xe8\xb9N\xc4'
b'\xae9\xf6 \xda-\xf9\x887H/+f\xa4\xea\xf0\xd5H\x9fc\xa4o\xcc\xf1l\xbfN\xa4'
b'\xf69\xf6\xc6\xaf#\x99\xd8>W\x18\xcf\xb7\xf5\xd9_9E\\"T\x8a\xd6|=\x1eI\xcf'
b"\x95\xf6\xcd\x93\x86\xe7I'\xe6I\xbf\x9d'\x9d\x9a'\xe1\x9d\xa83\x89\xc7\xc5P"
b'\x98\x8b\xb5#\x96\x0fr\x85M\xbe\xf3\xb3\xd9w\x82\xa7v\x0eN=\xf7\xfaX\x89'
b';\x818\xeb\xe9A\t\x96\x95#\xcaC"O\xafZ_\xcb\x99\x15N\xe4\xeb\xd1'
b'\xda\xc7&\x88\x00\xf32\x9dM\x13~\x00\xbc"\x87\xd5\xdfe\xfd \xbd\xc4>`'
b"\xf7\x02\xc5<\x0f`\x9e\xea9y\x8e\xce\xcf\xd3\\\xa6{\xe7\xe4\xd97'\xcf\x03"
b'}o\xcd\xcbq\x0es\xec\x02^,\xc0\x1c\x03\xd6\x0f\xf1\x1d\xca\xaa\x0chI\xc2'
b'\x87\n\x9a\xdf\xefV\x8b\xd4\x8e\xb0 \xbd\xab.V\x05ia\xb8x\xa7 \xed\x0b'
b'\xb3\x12j\xc2P,H\x8en*\xb5\x8b\x1e|\xb1mV\x7f\xae.\xecn\x92\x04\xb1B\x8a\xd2'
b"\x8dJ59\xea\xe7NG\xf9\xcd\xaaHXi\xb3\x12\xa5\xc0'\xc8\x11?\xa3\xcb;\x13c\xce"
b'\xde\x890\x8b/\xad\t\xbc\x17D0\x8c+\x99\xab\xcf@\xe2fUo2&\xb1'
b'\xca\xdb\x18\xaf\x9a\xe1T\x8fT\xb6\xa1Y\xa4\xa8\x91Ug\x17\xdb\xcb'
b'\xaa\x0b\xc2U\x12\xa3\xecQ\xf7\x86\xa9\xb8\x07\xc7\xa5\xd2\xa4}\x92\xa9'
b'\x92v+\xd0\xc2\xa5\xa2t7\xcesJ{\x14F\xb5\xcaUb\x91jzKj\x10\xbd\x9d\x92'
b'\x84{\xc6\x8b\xfb\xd3\x98\xba\xf6\xf6|\xcf\xa8q\x11Z\xcd\x1d\xf2\x93\t(v\xac'
b'\xac\xb6\xe79\xbbue\xb5-\xcf\xd9\xb8\x95\xcc1\xc7v\xb1\xc2|\x93r,\xc3'
b'\x10\xfc\\\xfb_\x82\x85\xdd\x151\xdce\xda\xfaJ\x8d\x08x\xe7\xd3'
b'\xd7\xf0\xd6\x85\xa5W\xf4\xadu\xf8\n\x81\\\xf2T w\xd2z\xf2\xe9\x80\xb6~'
b'.\xef[&,\xf3\xc1\xed2\xf8{\x07\xf8\xfe\xfb\x07\xd6\xe6\x99\xde\x07w\x0c\xad'
b'\xbd\x16zm\xcdB\xa8\xdf\x07S%9\xe3\xb17/\xcc\xac\xbdp1g\\\xcc\xb13+\xbe'
b'\x9au\xc8\xc7\xe0\x1f\n\xdf\x7f\xcf\x9a6o\x9b\xe0k\xf3\xf9\x96\xf9'
b'\x84\xf6\x15\xde\x15\xfc\x8e\xf0Ck\xee\x10\xfbV\xfa|\xed7\x0f\xf0'
b'\xeb\xbey\xd7\x1a\xdf\xd59\x9f\x00X\xff\x88\xf4_\xdc\x9cbu')
# EOF

View File

@ -25,7 +25,7 @@ const uint16_t COL_RED = 0x00f8; //SWAP16(0xf800);
const uint16_t COL_FOREGROUND = 0x60fd; //SWAB16(0xfd60); // brand orange
// progress bar specs
const uint16_t PROG_HEIGHT = 3;
const uint16_t PROG_HEIGHT = 5;
const uint16_t PROG_Y = LCD_HEIGHT - PROG_HEIGHT;
static const int NUM_PHASES = 16;

View File

@ -5,7 +5,7 @@
#include <stdint.h>
// Public version number for humans. Lots more version data added by Makefile.
#define RELEASE_VERSION "1.3.0"
#define RELEASE_VERSION "1.3.1"
extern const char version_string[];

View File

@ -19,6 +19,7 @@ TEXT_PALETTES = [
#TEXT_PALETTE = [0x0000, 0x0840, 0x18a0, 0x2900, 0x3940, 0x49a0, 0x5a00, 0x6a60, 0x7aa0, 0x8b00, 0x9b60, 0xabc0, 0xbc00, 0xdcc0, 0xed00, 0xfd60]
COL_TEXT = const(0xfd60) # text foreground colour
COL_DARK_TEXT = const(0xa380) # "dark" pallette text foreground colour
COL_SCROLL_DARK = const(0x51c0) # "dark" colour for scrollbar
CELL_W = const(9)
CELL_H = const(22)

View File

@ -7,6 +7,7 @@
import os, sys, pdb, math, zlib
from PIL import Image, ImageDraw, ImageFont, ImageColor
from collections import Counter
from struct import pack, unpack
FONT = 'iosevka-extrabold.ttf'
FONT_SIZE = 18
@ -75,9 +76,22 @@ print(f"Total font memory: {NUM_CHARS * MEM_PER_CHAR // 1024} KiBytes")
# plus lots of overhead, so don't do that.
def remap_colour(c, amt):
# take colour (RGB tuple) and give it intensity (amt) and then return RGB565
amt /= 255.0
r = int(c[0] * amt * 0x1f)
g = int(c[1] * amt * 0x3f)
b = int(c[2] * amt * 0x1f)
return (r<<11) | (g << 5) | b
def device_endian(col):
# take a RGB565 value and swap endian for real device
# XXX unneeded?
return unpack('<H', pack('>H', col))[0]
def make_palette(shades, col, darken=1.0):
# make bytes representing a NUM_GREYS palette to map back to a RGB565 colour
from struct import pack
assert len(col) == 3, 'want RGB'
assert col[0] > 20, 'expect 8-bit RGB values'
@ -85,16 +99,8 @@ def make_palette(shades, col, darken=1.0):
assert max(col) <= 1.0
assert 0 <= min(col)
def remap(c, amt):
amt /= 255.0
r = int(c[0] * amt * 0x1f)
g = int(c[1] * amt * 0x3f)
b = int(c[2] * amt * 0x1f)
return (r<<11) | (g << 5) | b
assert len(shades) == NUM_GREYS
vals = [remap(col, s*darken) for s in shades]
vals = [remap_colour(col, s*darken) for s in shades]
txt = ', '.join('0x%04x'% i for i in vals)
return vals, txt, pack('>%dH' % NUM_GREYS, *vals)
@ -212,6 +218,7 @@ def doit(out_fname='font_iosevka.py', cls_name='FontIosevka'):
shades = shades[0:3*NUM_GREYS]
assert shades[0::3] == shades[1::3] == shades[2::3], 'not all greyscale?'
# remap palette so it's in order by luma
by_luma = sorted([(n, gl) for n, gl in enumerate(shades[0::3])], key=lambda x:x[1])
mapping = list(n for n,gl in by_luma)
@ -219,7 +226,7 @@ def doit(out_fname='font_iosevka.py', cls_name='FontIosevka'):
# apply new palette
cells = cells.remap_palette(mapping)
nsh = cells.getpalette('RGB')[0::3]
assert sorted(nsh) == nsh
assert sorted(nsh) == nsh # error here means wrong/no virtual env
print(f'Shades: {nsh}')
shades = nsh
@ -251,6 +258,9 @@ def doit(out_fname='font_iosevka.py', cls_name='FontIosevka'):
_, pal_vals_inv, text_pal_inv = make_palette([255-i for i in shades], BRAND_TEXT_COLOUR)
pal_dark_nums, _, text_pal_dark = make_palette(shades, BRAND_TEXT_COLOUR, 0.66)
# the "background" colour for the scroll bar
scroll_dark = remap_colour(BRAND_TEXT_COLOUR, 0.33)
with open(out_fname, 'w') as fp:
tmpl = open('template.py').read()
fp.write(tmpl)
@ -267,6 +277,7 @@ TEXT_PALETTES = [
#TEXT_PALETTE = [{pal_vals}]
COL_TEXT = const(0x{pal_nums[15]:04x}) # text foreground colour
COL_DARK_TEXT = const(0x{pal_dark_nums[15]:04x}) # "dark" pallette text foreground colour
COL_SCROLL_DARK = const(0x{scroll_dark:04x}) # "dark" colour for scrollbar
CELL_W = const({CELL_W})
CELL_H = const({CELL_H})

View File

@ -10,13 +10,13 @@ from utils import xfp2str
from ucollections import namedtuple
# the one font: fixed-width (except for a few double-width chars)
from font_iosevka import CELL_W, CELL_H, TEXT_PALETTES, COL_TEXT, COL_DARK_TEXT
from font_iosevka import CELL_W, CELL_H, TEXT_PALETTES, COL_TEXT, COL_DARK_TEXT, COL_SCROLL_DARK
from font_iosevka import FontIosevka
#WIDTH = const(320)
#HEIGHT = const(240)
LEFT_MARGIN = const(7)
LEFT_MARGIN = const(7) # equal on right side, but used for scroll bar
TOP_MARGIN = const(15)
ACTIVE_H = const(240 - TOP_MARGIN)
CHARS_W = const(34)
@ -362,10 +362,11 @@ class Display:
if self.next_prog_x != self.last_prog_x:
# NOTE: misc/gpu/lcd.c must be updated to match any changes here
x = self.next_prog_x
h = 5
if x:
self.dis.fill_rect(0, HEIGHT-3, x, 3, COL_PROGRESS)
self.dis.fill_rect(0, HEIGHT-h, x, h, COL_PROGRESS)
if x != WIDTH:
self.dis.fill_rect(x, HEIGHT-3, WIDTH-x, 3, COL_BLACK)
self.dis.fill_rect(x, HEIGHT-h, WIDTH-x, h, COL_BLACK)
self.last_prog_x = x
if self.next_scroll != self.last_scroll:
@ -428,15 +429,15 @@ class Display:
def _draw_scroll_bar(self, fraction):
# Immediately draw bar along right edge.
# - length means nothing, just vert position
bw = 2 # bar width, height
bw = 5 # bar width
bh = ACTIVE_H // 4
if fraction is None:
self.dis.fill_rect(WIDTH-bw, TOP_MARGIN, bw, ACTIVE_H, COL_BLACK)
return
self.dis.fill_rect(WIDTH-bw, TOP_MARGIN, bw, ACTIVE_H, COL_DARK_TEXT)
self.dis.fill_rect(WIDTH-bw, TOP_MARGIN, bw, ACTIVE_H, COL_SCROLL_DARK)
pos = int((ACTIVE_H-bh)*fraction)
if pos+bh > ACTIVE_H:
if (pos+bh > ACTIVE_H) or (fraction > .8):
pos = ACTIVE_H - bh
self.dis.fill_rect(WIDTH-bw, TOP_MARGIN+pos, bw, bh, COL_TEXT)

View File

@ -39,7 +39,8 @@ const int LCD_WIDTH = 320;
const int LCD_HEIGHT = 240;
const int NUM_PIXELS = (LCD_WIDTH*LCD_HEIGHT);
const int PROGRESS_BAR_Y = (LCD_HEIGHT - 3);
const int PROGRESS_BAR_H = 5;
const int PROGRESS_BAR_Y = (LCD_HEIGHT - PROGRESS_BAR_H);
// doing RGB565, but swab16
const uint16_t COL_BLACK = 0;
@ -474,9 +475,9 @@ oled_show_progress(const uint8_t *pixels, int progress)
wait_vsync();
lcd_write_rows(PROGRESS_BAR_Y+0, 1, row);
lcd_write_rows(PROGRESS_BAR_Y+1, 1, row);
lcd_write_rows(PROGRESS_BAR_Y+2, 1, row);
for(int i=0; i<PROGRESS_BAR_H; i++) {
lcd_write_rows(PROGRESS_BAR_Y+i, 1, row);
}
rng_delay();
}

View File

@ -99,7 +99,8 @@ class LCDSimulator(SimulatedScreen):
background_img = 'q1-images/background.png'
# where the simulated screen is, relative to fixed background
TOPLEFT = (90, 91)
#TOPLEFT = (90, 91)
TOPLEFT = (95, 96)
@dataclass
class CursorSpec:
@ -173,7 +174,7 @@ class LCDSimulator(SimulatedScreen):
def gpu_draw_busy(self):
# infinite progress bar
PROG_HEIGHT = 3
PROG_HEIGHT = 5
PROG_Y = 240 - PROG_HEIGHT
NUM_PHASES = 16
LCD_WIDTH = 320