diff --git a/misc/gpu/gpu_binary.py b/misc/gpu/gpu_binary.py index c0c36306..27e865e9 100644 --- a/misc/gpu/gpu_binary.py +++ b/misc/gpu/gpu_binary.py @@ -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\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+\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!+\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\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 diff --git a/misc/gpu/lcd.c b/misc/gpu/lcd.c index e63b042d..f0cff642 100644 --- a/misc/gpu/lcd.c +++ b/misc/gpu/lcd.c @@ -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; diff --git a/misc/gpu/version.h b/misc/gpu/version.h index 1ec4c412..2d5a29db 100644 --- a/misc/gpu/version.h +++ b/misc/gpu/version.h @@ -5,7 +5,7 @@ #include // 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[]; diff --git a/misc/q1font/font_iosevka.py b/misc/q1font/font_iosevka.py index e5ec4c2e..7226daf3 100644 --- a/misc/q1font/font_iosevka.py +++ b/misc/q1font/font_iosevka.py @@ -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) diff --git a/misc/q1font/render.py b/misc/q1font/render.py index 7e220e28..8241d55b 100755 --- a/misc/q1font/render.py +++ b/misc/q1font/render.py @@ -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', 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}) diff --git a/shared/lcd_display.py b/shared/lcd_display.py index 2b1fc7e6..1de37596 100644 --- a/shared/lcd_display.py +++ b/shared/lcd_display.py @@ -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) diff --git a/stm32/q1-bootloader/lcd.c b/stm32/q1-bootloader/lcd.c index dc4ba2fc..ea75386f 100644 --- a/stm32/q1-bootloader/lcd.c +++ b/stm32/q1-bootloader/lcd.c @@ -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