@ -70,316 +70,334 @@ except:
__version = " 0.12 "
font_11x44 = (
# 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
0x00 , 0x38 , 0x6c , 0xc6 , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x00 , 0xfc , 0x66 , 0x66 , 0x66 , 0x7c , 0x66 , 0x66 , 0x66 , 0xfc , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc0 , 0xc0 , 0xc0 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xfc , 0x66 , 0x66 , 0x66 , 0x66 , 0x66 , 0x66 , 0x66 , 0xfc , 0x00 ,
0x00 , 0xfe , 0x66 , 0x62 , 0x68 , 0x78 , 0x68 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x00 , 0xfe , 0x66 , 0x62 , 0x68 , 0x78 , 0x68 , 0x60 , 0x60 , 0xf0 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc0 , 0xc0 , 0xce , 0xc6 , 0xc6 , 0x7e , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x00 , 0x3c , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0x1e , 0x0c , 0x0c , 0x0c , 0x0c , 0x0c , 0xcc , 0xcc , 0x78 , 0x00 ,
0x00 , 0xe6 , 0x66 , 0x6c , 0x6c , 0x78 , 0x6c , 0x6c , 0x66 , 0xe6 , 0x00 ,
0x00 , 0xf0 , 0x60 , 0x60 , 0x60 , 0x60 , 0x60 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x00 , 0x82 , 0xc6 , 0xee , 0xfe , 0xd6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x00 , 0x86 , 0xc6 , 0xe6 , 0xf6 , 0xde , 0xce , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xfc , 0x66 , 0x66 , 0x66 , 0x7c , 0x60 , 0x60 , 0x60 , 0xf0 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xd6 , 0xde , 0x7c , 0x06 ,
0x00 , 0xfc , 0x66 , 0x66 , 0x66 , 0x7c , 0x6c , 0x66 , 0x66 , 0xe6 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0x60 , 0x38 , 0x0c , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x7e , 0x7e , 0x5a , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x6c , 0x38 , 0x10 , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xd6 , 0xfe , 0xee , 0xc6 , 0x82 , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0x6c , 0x7c , 0x38 , 0x7c , 0x6c , 0xc6 , 0xc6 , 0x00 ,
0x00 , 0x66 , 0x66 , 0x66 , 0x66 , 0x3c , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0xfe , 0xc6 , 0x86 , 0x0c , 0x18 , 0x30 , 0x62 , 0xc6 , 0xfe , 0x00 ,
# 'abcdefghijklmnopqrstuvwxyz'
0x00 , 0x00 , 0x00 , 0x00 , 0x78 , 0x0c , 0x7c , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0xe0 , 0x60 , 0x60 , 0x7c , 0x66 , 0x66 , 0x66 , 0x66 , 0x7c , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0xc6 , 0xc0 , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x1c , 0x0c , 0x0c , 0x7c , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0xc6 , 0xfe , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x1c , 0x36 , 0x30 , 0x78 , 0x30 , 0x30 , 0x30 , 0x30 , 0x78 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x76 , 0xcc , 0xcc , 0x7c , 0x0c , 0xcc , 0x78 ,
0x00 , 0xe0 , 0x60 , 0x60 , 0x6c , 0x76 , 0x66 , 0x66 , 0x66 , 0xe6 , 0x00 ,
0x00 , 0x18 , 0x18 , 0x00 , 0x38 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x0c , 0x0c , 0x00 , 0x1c , 0x0c , 0x0c , 0x0c , 0x0c , 0xcc , 0xcc , 0x78 ,
0x00 , 0xe0 , 0x60 , 0x60 , 0x66 , 0x6c , 0x78 , 0x78 , 0x6c , 0xe6 , 0x00 ,
0x00 , 0x38 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xec , 0xfe , 0xd6 , 0xd6 , 0xd6 , 0xc6 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xdc , 0x66 , 0x66 , 0x66 , 0x66 , 0x66 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xdc , 0x66 , 0x66 , 0x7c , 0x60 , 0x60 , 0xf0 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0xcc , 0xcc , 0x7c , 0x0c , 0x0c , 0x1e ,
0x00 , 0x00 , 0x00 , 0x00 , 0xde , 0x76 , 0x60 , 0x60 , 0x60 , 0xf0 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0xc6 , 0x70 , 0x1c , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x10 , 0x30 , 0x30 , 0xfc , 0x30 , 0x30 , 0x30 , 0x34 , 0x18 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xcc , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0x6c , 0x38 , 0x10 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xc6 , 0xd6 , 0xd6 , 0xd6 , 0xfe , 0x6c , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xc6 , 0x6c , 0x38 , 0x38 , 0x6c , 0xc6 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0x7e , 0x06 , 0x0c , 0xf8 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xfe , 0x8c , 0x18 , 0x30 , 0x62 , 0xfe , 0x00 ,
# '0987654321^ !"\0$%&/()=?` °\\}][{'
0x00 , 0x7c , 0xc6 , 0xce , 0xde , 0xf6 , 0xe6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0x7e , 0x06 , 0x06 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xfe , 0xc6 , 0x06 , 0x0c , 0x18 , 0x30 , 0x30 , 0x30 , 0x30 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc0 , 0xc0 , 0xfc , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xfe , 0xc0 , 0xc0 , 0xfc , 0x06 , 0x06 , 0x06 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x0c , 0x1c , 0x3c , 0x6c , 0xcc , 0xfe , 0x0c , 0x0c , 0x1e , 0x00 ,
0x00 , 0x7c , 0xc6 , 0x06 , 0x06 , 0x3c , 0x06 , 0x06 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x7c , 0xc6 , 0x06 , 0x0c , 0x18 , 0x30 , 0x60 , 0xc6 , 0xfe , 0x00 ,
0x00 , 0x18 , 0x38 , 0x78 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x7e , 0x00 ,
0x38 , 0x6c , 0xc6 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x40 , 0x3c , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x18 , 0x3c , 0x3c , 0x3c , 0x18 , 0x18 , 0x00 , 0x18 , 0x18 , 0x00 ,
0x66 , 0x66 , 0x22 , 0x22 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0x04 , 0x14 , 0x18 , 0x10 , 0x10 , 0x20 ,
0x10 , 0x7c , 0xd6 , 0xd6 , 0x70 , 0x1c , 0xd6 , 0xd6 , 0x7c , 0x10 , 0x10 ,
0x00 , 0x60 , 0x92 , 0x96 , 0x6c , 0x10 , 0x6c , 0xd2 , 0x92 , 0x0c , 0x00 ,
0x00 , 0x38 , 0x6c , 0x6c , 0x38 , 0x76 , 0xdc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x00 , 0x02 , 0x06 , 0x0c , 0x18 , 0x30 , 0x60 , 0xc0 , 0x80 , 0x00 ,
0x00 , 0x0c , 0x18 , 0x30 , 0x30 , 0x30 , 0x30 , 0x30 , 0x18 , 0x0c , 0x00 ,
0x00 , 0x30 , 0x18 , 0x0c , 0x0c , 0x0c , 0x0c , 0x0c , 0x18 , 0x30 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x7e , 0x00 , 0x00 , 0x7e , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0x0c , 0x18 , 0x18 , 0x00 , 0x18 , 0x18 , 0x00 ,
0x18 , 0x18 , 0x10 , 0x08 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x7c , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x7c ,
0x00 , 0x10 , 0x28 , 0x28 , 0x10 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x80 , 0xc0 , 0x60 , 0x30 , 0x18 , 0x0c , 0x06 , 0x02 , 0x00 , 0x00 ,
0x00 , 0x70 , 0x18 , 0x18 , 0x18 , 0x0e , 0x18 , 0x18 , 0x18 , 0x70 , 0x00 ,
0x00 , 0x3c , 0x0c , 0x0c , 0x0c , 0x0c , 0x0c , 0x0c , 0x0c , 0x3c , 0x00 ,
0x00 , 0x3c , 0x30 , 0x30 , 0x30 , 0x30 , 0x30 , 0x30 , 0x30 , 0x3c , 0x00 ,
0x00 , 0x0e , 0x18 , 0x18 , 0x18 , 0x70 , 0x18 , 0x18 , 0x18 , 0x0e , 0x00 ,
# "@ ~ |<>,;.:-_#'+* "
0x00 , 0x00 , 0x3c , 0x42 , 0x9d , 0xa5 , 0xad , 0xb6 , 0x40 , 0x3c , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xc0 , 0xc0 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x76 , 0xdc , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x08 , 0x08 , 0x7c , 0x08 , 0x08 , 0x18 , 0x18 , 0x28 , 0x28 , 0x48 , 0x18 ,
0x00 , 0x18 , 0x18 , 0x18 , 0x18 , 0x00 , 0x18 , 0x18 , 0x18 , 0x18 , 0x00 ,
0x00 , 0x06 , 0x0c , 0x18 , 0x30 , 0x60 , 0x30 , 0x18 , 0x0c , 0x06 , 0x00 ,
0x00 , 0x60 , 0x30 , 0x18 , 0x0c , 0x06 , 0x0c , 0x18 , 0x30 , 0x60 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x30 , 0x30 , 0x10 , 0x20 ,
0x00 , 0x00 , 0x00 , 0x18 , 0x18 , 0x00 , 0x00 , 0x18 , 0x18 , 0x08 , 0x10 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x30 , 0x30 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x18 , 0x18 , 0x00 , 0x00 , 0x18 , 0x18 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xfe , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xff ,
0x00 , 0x6c , 0x6c , 0xfe , 0x6c , 0x6c , 0xfe , 0x6c , 0x6c , 0x00 , 0x00 ,
0x18 , 0x18 , 0x08 , 0x10 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x18 , 0x18 , 0x7e , 0x18 , 0x18 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x66 , 0x3c , 0xff , 0x3c , 0x66 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
# "äöüÄÖÜß"
0x00 , 0xcc , 0xcc , 0x00 , 0x78 , 0x0c , 0x7c , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xcc , 0xcc , 0x00 , 0xcc , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0xc6 , 0xc6 , 0x38 , 0x6c , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0xc6 , 0xc6 , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0xc6 , 0xc6 , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x3c , 0x66 , 0x66 , 0x66 , 0x7c , 0x66 , 0x66 , 0x66 , 0x6c , 0x60 ,
# "àäòöùüèéêëôöûîïÿç"
0x00 , 0x60 , 0x18 , 0x00 , 0x78 , 0x0c , 0x7c , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0x78 , 0x0c , 0x7c , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x60 , 0x18 , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x60 , 0x18 , 0x00 , 0xcc , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0xcc , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x60 , 0x18 , 0x00 , 0x7c , 0xc6 , 0xfe , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x18 , 0x60 , 0x00 , 0x7c , 0xc6 , 0xfe , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x10 , 0x6c , 0x00 , 0x7c , 0xc6 , 0xfe , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0x7c , 0xc6 , 0xfe , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x10 , 0x6c , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x10 , 0x6c , 0x00 , 0xcc , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x10 , 0x6c , 0x00 , 0x38 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0x38 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0x7e , 0x06 , 0x0c , 0xf8 ,
0x00 , 0x00 , 0x00 , 0x7c , 0xc6 , 0xc0 , 0xc0 , 0xc6 , 0x7c , 0x10 , 0x30 ,
# "ÀÅÄÉÈÊËÖÔÜÛÙŸ"
0x60 , 0x18 , 0x38 , 0x6c , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x10 , 0x6c , 0x38 , 0x6c , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x6c , 0x6c , 0x38 , 0x6c , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x18 , 0x60 , 0xfe , 0x62 , 0x68 , 0x78 , 0x68 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x60 , 0x18 , 0xfe , 0x62 , 0x68 , 0x78 , 0x68 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x10 , 0x6c , 0xfe , 0x62 , 0x68 , 0x78 , 0x68 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x6c , 0x6c , 0xfe , 0x62 , 0x68 , 0x78 , 0x68 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x6c , 0x6c , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 , # Ö
0x10 , 0x6c , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 , # Ô
0x6c , 0x6c , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 , # Ü
0x10 , 0x6c , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 , # Û
0x60 , 0x18 , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 , # Ù
0x66 , 0x66 , 0x00 , 0x66 , 0x66 , 0x66 , 0x3c , 0x18 , 0x18 , 0x3c , 0x00 , # Ÿ
)
charmap = u ' ABCDEFGHIJKLMNOPQRSTUVWXYZ ' + \
u ' abcdefghijklmnopqrstuvwxyz ' + \
u ' 0987654321^ ! " \0 $ % &/()=?` ° \\ }][ { ' + \
u " @ ~ |<>,;.:-_# ' +* " + \
u " äöüÄÖÜß " + \
u " àäòöùüèéêëôöûîïÿç " + \
u " ÀÅÄÉÈÊËÖÔÜÛÙŸ "
char_offsets = { }
for i in range ( len ( charmap ) ) :
char_offsets [ charmap [ i ] ] = 11 * i
# print(i, charmap[i], char_offset[charmap[i]])
bitmap_preloaded = [ ( [ ] , 0 ) ]
bitmaps_preloaded_unused = False
bitmap_named = {
' ball ' : ( array ( ' B ' , (
0b00000000 ,
0b00000000 ,
0b00111100 ,
0b01111110 ,
0b11111111 ,
0b11111111 ,
0b11111111 ,
0b11111111 ,
0b01111110 ,
0b00111100 ,
0b00000000
) ) , 1 , ' \x1e ' ) ,
' happy ' : ( array ( ' B ' , (
0b00000000 , # 0x00
0b00000000 , # 0x00
0b00111100 , # 0x3c
0b01000010 , # 0x42
0b10100101 , # 0xa5
0b10000001 , # 0x81
0b10100101 , # 0xa5
0b10011001 , # 0x99
0b01000010 , # 0x42
0b00111100 , # 0x3c
0b00000000 # 0x00
) ) , 1 , ' \x1d ' ) ,
' happy2 ' : ( array ( ' B ' , ( 0x00 , 0x08 , 0x14 , 0x08 , 0x01 , 0x00 , 0x00 , 0x61 , 0x30 , 0x1c , 0x07 ,
0x00 , 0x20 , 0x50 , 0x20 , 0x00 , 0x80 , 0x80 , 0x86 , 0x0c , 0x38 , 0xe0 ) ) , 2 , ' \x1c ' ) ,
' heart ' : ( array ( ' B ' , ( 0x00 , 0x00 , 0x6c , 0x92 , 0x82 , 0x82 , 0x44 , 0x28 , 0x10 , 0x00 , 0x00 ) ) , 1 , ' \x1b ' ) ,
' HEART ' : ( array ( ' B ' , ( 0x00 , 0x00 , 0x6c , 0xfe , 0xfe , 0xfe , 0x7c , 0x38 , 0x10 , 0x00 , 0x00 ) ) , 1 , ' \x1a ' ) ,
' heart2 ' : ( array ( ' B ' , ( 0x00 , 0x0c , 0x12 , 0x21 , 0x20 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 ,
0x00 , 0x60 , 0x90 , 0x08 , 0x08 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 , 0x00 ) ) , 2 , ' \x19 ' ) ,
' HEART2 ' : ( array ( ' B ' , ( 0x00 , 0x0c , 0x1e , 0x3f , 0x3f , 0x3f , 0x1f , 0x0f , 0x07 , 0x03 , 0x01 ,
0x00 , 0x60 , 0xf0 , 0xf8 , 0xf8 , 0xf8 , 0xf0 , 0xe0 , 0xc0 , 0x80 , 0x00 ) ) , 2 , ' \x18 ' ) ,
' fablab ' : ( array ( ' B ' , ( 0x07 , 0x0e , 0x1b , 0x03 , 0x21 , 0x2c , 0x2e , 0x26 , 0x14 , 0x1c , 0x06 ,
0x80 , 0x60 , 0x30 , 0x80 , 0x88 , 0x38 , 0xe8 , 0xc8 , 0x10 , 0x30 , 0xc0 ) ) , 2 , ' \x17 ' ) ,
' bicycle ' : ( array ( ' B ' , ( 0x01 , 0x02 , 0x00 , 0x01 , 0x07 , 0x09 , 0x12 , 0x12 , 0x10 , 0x08 , 0x07 ,
0x00 , 0x87 , 0x81 , 0x5f , 0x22 , 0x94 , 0x49 , 0x5f , 0x49 , 0x80 , 0x00 ,
0x00 , 0x80 , 0x00 , 0x80 , 0x70 , 0xc8 , 0x24 , 0xe4 , 0x04 , 0x88 , 0x70 ) ) , 3 , ' \x16 ' ) ,
' bicycle_r ' : ( array ( ' B ' , ( 0x00 , 0x00 , 0x00 , 0x00 , 0x07 , 0x09 , 0x12 , 0x13 , 0x10 , 0x08 , 0x07 ,
0x00 , 0xf0 , 0x40 , 0xfd , 0x22 , 0x94 , 0x49 , 0xfd , 0x49 , 0x80 , 0x00 ,
0x40 , 0xa0 , 0x80 , 0x40 , 0x70 , 0xc8 , 0x24 , 0x24 , 0x04 , 0x88 , 0x70 ) ) , 3 , ' \x15 ' ) ,
' owncloud ' : ( array ( ' B ' , ( 0x00 , 0x01 , 0x02 , 0x03 , 0x06 , 0x0c , 0x1a , 0x13 , 0x11 , 0x19 , 0x0f ,
0x78 , 0xcc , 0x87 , 0xfc , 0x42 , 0x81 , 0x81 , 0x81 , 0x81 , 0x43 , 0xbd ,
0x00 , 0x00 , 0x00 , 0x80 , 0x80 , 0xe0 , 0x30 , 0x10 , 0x28 , 0x28 , 0xd0 ) ) , 3 , ' \x14 ' ) ,
}
bitmap_builtin = { }
for i in bitmap_named :
bitmap_builtin [ bitmap_named [ i ] [ 2 ] ] = bitmap_named [ i ]
def bitmap_char ( ch ) :
""" Returns a tuple of 11 bytes,
ch = ' _ ' returns ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 255 )
The bits in each byte are horizontal , highest bit is left .
"""
if ord ( ch ) < 32 :
if ch in bitmap_builtin :
return bitmap_builtin [ ch ] [ : 2 ]
global bitmaps_preloaded_unused
bitmaps_preloaded_unused = False
return bitmap_preloaded [ ord ( ch ) ]
o = char_offsets [ ch ]
return ( font_11x44 [ o : o + 11 ] , 1 )
def bitmap_text ( text ) :
""" returns a tuple of (buffer, length_in_byte_columns_aka_chars)
We preprocess the text string for substitution patterns
" :: " is replaced with a single " : "
" :1: is replaced with CTRL-A referencing the first preloaded or loaded image.
" :happy: " is replaced with a reference to a builtin smiley glyph
" :heart: " is replaced with a reference to a builtin heart glyph
" :gfx/logo.png: " preloads the file gfx / logo . png and is replaced the corresponding control char .
"""
def replace_symbolic ( m ) :
name = m . group ( 1 )
if name == ' ' :
return ' : '
if re . match ( ' ^[0-9]*$ ' , name ) : # py3 name.isdecimal()
return chr ( int ( name ) )
if ' . ' in name :
bitmap_preloaded . append ( bitmap_img ( name ) )
return chr ( len ( bitmap_preloaded ) - 1 )
return bitmap_named [ name ] [ 2 ]
text = re . sub ( r ' :([^:]*): ' , replace_symbolic , text )
buf = array ( ' B ' )
cols = 0
for c in text :
( b , n ) = bitmap_char ( c )
buf . extend ( b )
cols + = n
return ( buf , cols )
def bitmap_img ( file ) :
""" returns a tuple of (buffer, length_in_byte_columns)
"""
from PIL import Image
im = Image . open ( file )
print ( " fetching bitmap from file %s -> ( %d x %d ) " % ( file , im . width , im . height ) )
if im . height != 11 :
sys . exit ( " %s : image height must be 11px. Seen %d " % ( file , im . height ) )
buf = array ( ' B ' )
cols = int ( ( im . width + 7 ) / 8 )
for col in range ( cols ) :
for row in range ( 11 ) : # [0..10]
byte_val = 0
for bit in range ( 8 ) : # [0..7]
bit_val = 0
x = 8 * col + bit
if x < im . width and row < im . height :
pixel_color = im . getpixel ( ( x , row ) )
if isinstance ( pixel_color , tuple ) :
monochrome_color = sum ( pixel_color [ : 3 ] ) / len ( pixel_color [ : 3 ] )
elif isinstance ( pixel_color , int ) :
monochrome_color = pixel_color
else :
sys . exit ( " %s : Unknown pixel format detected ( %s )! " % ( file , pixel_color ) )
if monochrome_color > 127 :
bit_val = 1 << ( 7 - bit )
byte_val + = bit_val
buf . append ( byte_val )
im . close ( )
return ( buf , cols )
def bitmap ( arg ) :
""" if arg is a valid and existing path name, we load it as an image.
Otherwise , we take it as a string .
"""
if os . path . exists ( arg ) :
return bitmap_img ( arg )
return bitmap_text ( arg )
class SimpleTextAndIcons :
font_11x44 = (
# 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
0x00 , 0x38 , 0x6c , 0xc6 , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x00 , 0xfc , 0x66 , 0x66 , 0x66 , 0x7c , 0x66 , 0x66 , 0x66 , 0xfc , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc0 , 0xc0 , 0xc0 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xfc , 0x66 , 0x66 , 0x66 , 0x66 , 0x66 , 0x66 , 0x66 , 0xfc , 0x00 ,
0x00 , 0xfe , 0x66 , 0x62 , 0x68 , 0x78 , 0x68 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x00 , 0xfe , 0x66 , 0x62 , 0x68 , 0x78 , 0x68 , 0x60 , 0x60 , 0xf0 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc0 , 0xc0 , 0xce , 0xc6 , 0xc6 , 0x7e , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x00 , 0x3c , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0x1e , 0x0c , 0x0c , 0x0c , 0x0c , 0x0c , 0xcc , 0xcc , 0x78 , 0x00 ,
0x00 , 0xe6 , 0x66 , 0x6c , 0x6c , 0x78 , 0x6c , 0x6c , 0x66 , 0xe6 , 0x00 ,
0x00 , 0xf0 , 0x60 , 0x60 , 0x60 , 0x60 , 0x60 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x00 , 0x82 , 0xc6 , 0xee , 0xfe , 0xd6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x00 , 0x86 , 0xc6 , 0xe6 , 0xf6 , 0xde , 0xce , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xfc , 0x66 , 0x66 , 0x66 , 0x7c , 0x60 , 0x60 , 0x60 , 0xf0 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xd6 , 0xde , 0x7c , 0x06 ,
0x00 , 0xfc , 0x66 , 0x66 , 0x66 , 0x7c , 0x6c , 0x66 , 0x66 , 0xe6 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0x60 , 0x38 , 0x0c , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x7e , 0x7e , 0x5a , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x6c , 0x38 , 0x10 , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xd6 , 0xfe , 0xee , 0xc6 , 0x82 , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0x6c , 0x7c , 0x38 , 0x7c , 0x6c , 0xc6 , 0xc6 , 0x00 ,
0x00 , 0x66 , 0x66 , 0x66 , 0x66 , 0x3c , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0xfe , 0xc6 , 0x86 , 0x0c , 0x18 , 0x30 , 0x62 , 0xc6 , 0xfe , 0x00 ,
# 'abcdefghijklmnopqrstuvwxyz'
0x00 , 0x00 , 0x00 , 0x00 , 0x78 , 0x0c , 0x7c , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0xe0 , 0x60 , 0x60 , 0x7c , 0x66 , 0x66 , 0x66 , 0x66 , 0x7c , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0xc6 , 0xc0 , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x1c , 0x0c , 0x0c , 0x7c , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0xc6 , 0xfe , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x1c , 0x36 , 0x30 , 0x78 , 0x30 , 0x30 , 0x30 , 0x30 , 0x78 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x76 , 0xcc , 0xcc , 0x7c , 0x0c , 0xcc , 0x78 ,
0x00 , 0xe0 , 0x60 , 0x60 , 0x6c , 0x76 , 0x66 , 0x66 , 0x66 , 0xe6 , 0x00 ,
0x00 , 0x18 , 0x18 , 0x00 , 0x38 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x0c , 0x0c , 0x00 , 0x1c , 0x0c , 0x0c , 0x0c , 0x0c , 0xcc , 0xcc , 0x78 ,
0x00 , 0xe0 , 0x60 , 0x60 , 0x66 , 0x6c , 0x78 , 0x78 , 0x6c , 0xe6 , 0x00 ,
0x00 , 0x38 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xec , 0xfe , 0xd6 , 0xd6 , 0xd6 , 0xc6 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xdc , 0x66 , 0x66 , 0x66 , 0x66 , 0x66 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xdc , 0x66 , 0x66 , 0x7c , 0x60 , 0x60 , 0xf0 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0xcc , 0xcc , 0x7c , 0x0c , 0x0c , 0x1e ,
0x00 , 0x00 , 0x00 , 0x00 , 0xde , 0x76 , 0x60 , 0x60 , 0x60 , 0xf0 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0xc6 , 0x70 , 0x1c , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x10 , 0x30 , 0x30 , 0xfc , 0x30 , 0x30 , 0x30 , 0x34 , 0x18 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xcc , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0x6c , 0x38 , 0x10 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xc6 , 0xd6 , 0xd6 , 0xd6 , 0xfe , 0x6c , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xc6 , 0x6c , 0x38 , 0x38 , 0x6c , 0xc6 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0x7e , 0x06 , 0x0c , 0xf8 ,
0x00 , 0x00 , 0x00 , 0x00 , 0xfe , 0x8c , 0x18 , 0x30 , 0x62 , 0xfe , 0x00 ,
# '0987654321^ !"\0$%&/()=?` °\\}][{'
0x00 , 0x7c , 0xc6 , 0xce , 0xde , 0xf6 , 0xe6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0x7e , 0x06 , 0x06 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xfe , 0xc6 , 0x06 , 0x0c , 0x18 , 0x30 , 0x30 , 0x30 , 0x30 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc0 , 0xc0 , 0xfc , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xfe , 0xc0 , 0xc0 , 0xfc , 0x06 , 0x06 , 0x06 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x0c , 0x1c , 0x3c , 0x6c , 0xcc , 0xfe , 0x0c , 0x0c , 0x1e , 0x00 ,
0x00 , 0x7c , 0xc6 , 0x06 , 0x06 , 0x3c , 0x06 , 0x06 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x7c , 0xc6 , 0x06 , 0x0c , 0x18 , 0x30 , 0x60 , 0xc6 , 0xfe , 0x00 ,
0x00 , 0x18 , 0x38 , 0x78 , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x7e , 0x00 ,
0x38 , 0x6c , 0xc6 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x40 , 0x3c , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x18 , 0x3c , 0x3c , 0x3c , 0x18 , 0x18 , 0x00 , 0x18 , 0x18 , 0x00 ,
0x66 , 0x66 , 0x22 , 0x22 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x7c , 0x04 , 0x14 , 0x18 , 0x10 , 0x10 , 0x20 ,
0x10 , 0x7c , 0xd6 , 0xd6 , 0x70 , 0x1c , 0xd6 , 0xd6 , 0x7c , 0x10 , 0x10 ,
0x00 , 0x60 , 0x92 , 0x96 , 0x6c , 0x10 , 0x6c , 0xd2 , 0x92 , 0x0c , 0x00 ,
0x00 , 0x38 , 0x6c , 0x6c , 0x38 , 0x76 , 0xdc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x00 , 0x02 , 0x06 , 0x0c , 0x18 , 0x30 , 0x60 , 0xc0 , 0x80 , 0x00 ,
0x00 , 0x0c , 0x18 , 0x30 , 0x30 , 0x30 , 0x30 , 0x30 , 0x18 , 0x0c , 0x00 ,
0x00 , 0x30 , 0x18 , 0x0c , 0x0c , 0x0c , 0x0c , 0x0c , 0x18 , 0x30 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x7e , 0x00 , 0x00 , 0x7e , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x7c , 0xc6 , 0xc6 , 0x0c , 0x18 , 0x18 , 0x00 , 0x18 , 0x18 , 0x00 ,
0x18 , 0x18 , 0x10 , 0x08 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x7c , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x7c ,
0x00 , 0x10 , 0x28 , 0x28 , 0x10 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x80 , 0xc0 , 0x60 , 0x30 , 0x18 , 0x0c , 0x06 , 0x02 , 0x00 , 0x00 ,
0x00 , 0x70 , 0x18 , 0x18 , 0x18 , 0x0e , 0x18 , 0x18 , 0x18 , 0x70 , 0x00 ,
0x00 , 0x3c , 0x0c , 0x0c , 0x0c , 0x0c , 0x0c , 0x0c , 0x0c , 0x3c , 0x00 ,
0x00 , 0x3c , 0x30 , 0x30 , 0x30 , 0x30 , 0x30 , 0x30 , 0x30 , 0x3c , 0x00 ,
0x00 , 0x0e , 0x18 , 0x18 , 0x18 , 0x70 , 0x18 , 0x18 , 0x18 , 0x0e , 0x00 ,
# "@ ~ |<>,;.:-_#'+* "
0x00 , 0x00 , 0x3c , 0x42 , 0x9d , 0xa5 , 0xad , 0xb6 , 0x40 , 0x3c , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xc0 , 0xc0 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x76 , 0xdc , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x08 , 0x08 , 0x7c , 0x08 , 0x08 , 0x18 , 0x18 , 0x28 , 0x28 , 0x48 , 0x18 ,
0x00 , 0x18 , 0x18 , 0x18 , 0x18 , 0x00 , 0x18 , 0x18 , 0x18 , 0x18 , 0x00 ,
0x00 , 0x06 , 0x0c , 0x18 , 0x30 , 0x60 , 0x30 , 0x18 , 0x0c , 0x06 , 0x00 ,
0x00 , 0x60 , 0x30 , 0x18 , 0x0c , 0x06 , 0x0c , 0x18 , 0x30 , 0x60 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x30 , 0x30 , 0x10 , 0x20 ,
0x00 , 0x00 , 0x00 , 0x18 , 0x18 , 0x00 , 0x00 , 0x18 , 0x18 , 0x08 , 0x10 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x30 , 0x30 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x18 , 0x18 , 0x00 , 0x00 , 0x18 , 0x18 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xfe , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xff ,
0x00 , 0x6c , 0x6c , 0xfe , 0x6c , 0x6c , 0xfe , 0x6c , 0x6c , 0x00 , 0x00 ,
0x18 , 0x18 , 0x08 , 0x10 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x18 , 0x18 , 0x7e , 0x18 , 0x18 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x66 , 0x3c , 0xff , 0x3c , 0x66 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
# "äöüÄÖÜß"
0x00 , 0xcc , 0xcc , 0x00 , 0x78 , 0x0c , 0x7c , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0xc6 , 0xc6 , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0xcc , 0xcc , 0x00 , 0xcc , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0xc6 , 0xc6 , 0x38 , 0x6c , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0xc6 , 0xc6 , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0xc6 , 0xc6 , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x3c , 0x66 , 0x66 , 0x66 , 0x7c , 0x66 , 0x66 , 0x66 , 0x6c , 0x60 ,
# "àäòöùüèéêëôöûîïÿç"
0x00 , 0x60 , 0x18 , 0x00 , 0x78 , 0x0c , 0x7c , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0x78 , 0x0c , 0x7c , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x60 , 0x18 , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x60 , 0x18 , 0x00 , 0xcc , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0xcc , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x60 , 0x18 , 0x00 , 0x7c , 0xc6 , 0xfe , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x18 , 0x60 , 0x00 , 0x7c , 0xc6 , 0xfe , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x10 , 0x6c , 0x00 , 0x7c , 0xc6 , 0xfe , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0x7c , 0xc6 , 0xfe , 0xc0 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x10 , 0x6c , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 ,
0x00 , 0x10 , 0x6c , 0x00 , 0xcc , 0xcc , 0xcc , 0xcc , 0xcc , 0x76 , 0x00 ,
0x00 , 0x10 , 0x6c , 0x00 , 0x38 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0x38 , 0x18 , 0x18 , 0x18 , 0x18 , 0x3c , 0x00 ,
0x00 , 0x6c , 0x6c , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0x7e , 0x06 , 0x0c , 0xf8 ,
0x00 , 0x00 , 0x00 , 0x7c , 0xc6 , 0xc0 , 0xc0 , 0xc6 , 0x7c , 0x10 , 0x30 ,
# "ÀÅÄÉÈÊËÖÔÜÛÙŸ"
0x60 , 0x18 , 0x38 , 0x6c , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x10 , 0x6c , 0x38 , 0x6c , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x6c , 0x6c , 0x38 , 0x6c , 0xc6 , 0xfe , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x00 ,
0x18 , 0x60 , 0xfe , 0x62 , 0x68 , 0x78 , 0x68 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x60 , 0x18 , 0xfe , 0x62 , 0x68 , 0x78 , 0x68 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x10 , 0x6c , 0xfe , 0x62 , 0x68 , 0x78 , 0x68 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x6c , 0x6c , 0xfe , 0x62 , 0x68 , 0x78 , 0x68 , 0x62 , 0x66 , 0xfe , 0x00 ,
0x6c , 0x6c , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 , # Ö
0x10 , 0x6c , 0x00 , 0x7c , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 , # Ô
0x6c , 0x6c , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 , # Ü
0x10 , 0x6c , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 , # Û
0x60 , 0x18 , 0x00 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0xc6 , 0x7c , 0x00 , # Ù
0x66 , 0x66 , 0x00 , 0x66 , 0x66 , 0x66 , 0x3c , 0x18 , 0x18 , 0x3c , 0x00 , # Ÿ
)
charmap = u ' ABCDEFGHIJKLMNOPQRSTUVWXYZ ' + \
u ' abcdefghijklmnopqrstuvwxyz ' + \
u ' 0987654321^ ! " \0 $ % &/()=?` ° \\ }][ { ' + \
u " @ ~ |<>,;.:-_# ' +* " + \
u " äöüÄÖÜß " + \
u " àäòöùüèéêëôöûîïÿç " + \
u " ÀÅÄÉÈÊËÖÔÜÛÙŸ "
char_offsets = { }
for i in range ( len ( charmap ) ) :
char_offsets [ charmap [ i ] ] = 11 * i
# print(i, charmap[i], char_offset[charmap[i]])
bitmap_named = {
' ball ' : ( array ( ' B ' , (
0b00000000 ,
0b00000000 ,
0b00111100 ,
0b01111110 ,
0b11111111 ,
0b11111111 ,
0b11111111 ,
0b11111111 ,
0b01111110 ,
0b00111100 ,
0b00000000
) ) , 1 , ' \x1e ' ) ,
' happy ' : ( array ( ' B ' , (
0b00000000 , # 0x00
0b00000000 , # 0x00
0b00111100 , # 0x3c
0b01000010 , # 0x42
0b10100101 , # 0xa5
0b10000001 , # 0x81
0b10100101 , # 0xa5
0b10011001 , # 0x99
0b01000010 , # 0x42
0b00111100 , # 0x3c
0b00000000 # 0x00
) ) , 1 , ' \x1d ' ) ,
' happy2 ' : ( array ( ' B ' , ( 0x00 , 0x08 , 0x14 , 0x08 , 0x01 , 0x00 , 0x00 , 0x61 , 0x30 , 0x1c , 0x07 ,
0x00 , 0x20 , 0x50 , 0x20 , 0x00 , 0x80 , 0x80 , 0x86 , 0x0c , 0x38 , 0xe0 ) ) , 2 , ' \x1c ' ) ,
' heart ' : ( array ( ' B ' , ( 0x00 , 0x00 , 0x6c , 0x92 , 0x82 , 0x82 , 0x44 , 0x28 , 0x10 , 0x00 , 0x00 ) ) , 1 , ' \x1b ' ) ,
' HEART ' : ( array ( ' B ' , ( 0x00 , 0x00 , 0x6c , 0xfe , 0xfe , 0xfe , 0x7c , 0x38 , 0x10 , 0x00 , 0x00 ) ) , 1 , ' \x1a ' ) ,
' heart2 ' : ( array ( ' B ' , ( 0x00 , 0x0c , 0x12 , 0x21 , 0x20 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 ,
0x00 , 0x60 , 0x90 , 0x08 , 0x08 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 , 0x00 ) ) , 2 , ' \x19 ' ) ,
' HEART2 ' : ( array ( ' B ' , ( 0x00 , 0x0c , 0x1e , 0x3f , 0x3f , 0x3f , 0x1f , 0x0f , 0x07 , 0x03 , 0x01 ,
0x00 , 0x60 , 0xf0 , 0xf8 , 0xf8 , 0xf8 , 0xf0 , 0xe0 , 0xc0 , 0x80 , 0x00 ) ) , 2 , ' \x18 ' ) ,
' fablab ' : ( array ( ' B ' , ( 0x07 , 0x0e , 0x1b , 0x03 , 0x21 , 0x2c , 0x2e , 0x26 , 0x14 , 0x1c , 0x06 ,
0x80 , 0x60 , 0x30 , 0x80 , 0x88 , 0x38 , 0xe8 , 0xc8 , 0x10 , 0x30 , 0xc0 ) ) , 2 , ' \x17 ' ) ,
' bicycle ' : ( array ( ' B ' , ( 0x01 , 0x02 , 0x00 , 0x01 , 0x07 , 0x09 , 0x12 , 0x12 , 0x10 , 0x08 , 0x07 ,
0x00 , 0x87 , 0x81 , 0x5f , 0x22 , 0x94 , 0x49 , 0x5f , 0x49 , 0x80 , 0x00 ,
0x00 , 0x80 , 0x00 , 0x80 , 0x70 , 0xc8 , 0x24 , 0xe4 , 0x04 , 0x88 , 0x70 ) ) , 3 , ' \x16 ' ) ,
' bicycle_r ' : ( array ( ' B ' , ( 0x00 , 0x00 , 0x00 , 0x00 , 0x07 , 0x09 , 0x12 , 0x13 , 0x10 , 0x08 , 0x07 ,
0x00 , 0xf0 , 0x40 , 0xfd , 0x22 , 0x94 , 0x49 , 0xfd , 0x49 , 0x80 , 0x00 ,
0x40 , 0xa0 , 0x80 , 0x40 , 0x70 , 0xc8 , 0x24 , 0x24 , 0x04 , 0x88 , 0x70 ) ) , 3 , ' \x15 ' ) ,
' owncloud ' : ( array ( ' B ' , ( 0x00 , 0x01 , 0x02 , 0x03 , 0x06 , 0x0c , 0x1a , 0x13 , 0x11 , 0x19 , 0x0f ,
0x78 , 0xcc , 0x87 , 0xfc , 0x42 , 0x81 , 0x81 , 0x81 , 0x81 , 0x43 , 0xbd ,
0x00 , 0x00 , 0x00 , 0x80 , 0x80 , 0xe0 , 0x30 , 0x10 , 0x28 , 0x28 , 0xd0 ) ) , 3 , ' \x14 ' ) ,
}
bitmap_builtin = { }
for i in bitmap_named :
bitmap_builtin [ bitmap_named [ i ] [ 2 ] ] = bitmap_named [ i ]
def __init__ ( self ) :
self . bitmap_preloaded = [ ( [ ] , 0 ) ]
self . bitmaps_preloaded_unused = False
def add_preload_img ( self , filename ) :
self . bitmap_preloaded . append ( SimpleTextAndIcons . bitmap_img ( filename ) )
self . bitmaps_preloaded_unused = True
def are_preloaded_unused ( self ) :
return self . bitmaps_preloaded_unused == True
@staticmethod
def get_named_bitmaps_keys ( ) :
return SimpleTextAndIcons . bitmap_named . keys ( )
def bitmap_char ( self , ch ) :
""" Returns a tuple of 11 bytes,
ch = ' _ ' returns ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 255 )
The bits in each byte are horizontal , highest bit is left .
"""
if ord ( ch ) < 32 :
if ch in SimpleTextAndIcons . bitmap_builtin :
return SimpleTextAndIcons . bitmap_builtin [ ch ] [ : 2 ]
self . bitmaps_preloaded_unused = False
return self . bitmap_preloaded [ ord ( ch ) ]
o = SimpleTextAndIcons . char_offsets [ ch ]
return ( SimpleTextAndIcons . font_11x44 [ o : o + 11 ] , 1 )
def bitmap_text ( self , text ) :
""" returns a tuple of (buffer, length_in_byte_columns_aka_chars)
We preprocess the text string for substitution patterns
" :: " is replaced with a single " : "
" :1: is replaced with CTRL-A referencing the first preloaded or loaded image.
" :happy: " is replaced with a reference to a builtin smiley glyph
" :heart: " is replaced with a reference to a builtin heart glyph
" :gfx/logo.png: " preloads the file gfx / logo . png and is replaced the corresponding control char .
"""
def replace_symbolic ( m ) :
name = m . group ( 1 )
if name == ' ' :
return ' : '
if re . match ( ' ^[0-9]*$ ' , name ) : # py3 name.isdecimal()
return chr ( int ( name ) )
if ' . ' in name :
self . bitmap_preloaded . append ( SimpleTextAndIcons . bitmap_img ( name ) )
return chr ( len ( self . bitmap_preloaded ) - 1 )
return SimpleTextAndIcons . bitmap_named [ name ] [ 2 ]
text = re . sub ( r ' :([^:]*): ' , replace_symbolic , text )
buf = array ( ' B ' )
cols = 0
for c in text :
( b , n ) = self . bitmap_char ( c )
buf . extend ( b )
cols + = n
return ( buf , cols )
@staticmethod
def bitmap_img ( file ) :
""" returns a tuple of (buffer, length_in_byte_columns)
"""
from PIL import Image
im = Image . open ( file )
print ( " fetching bitmap from file %s -> ( %d x %d ) " % ( file , im . width , im . height ) )
if im . height != 11 :
sys . exit ( " %s : image height must be 11px. Seen %d " % ( file , im . height ) )
buf = array ( ' B ' )
cols = int ( ( im . width + 7 ) / 8 )
for col in range ( cols ) :
for row in range ( 11 ) : # [0..10]
byte_val = 0
for bit in range ( 8 ) : # [0..7]
bit_val = 0
x = 8 * col + bit
if x < im . width and row < im . height :
pixel_color = im . getpixel ( ( x , row ) )
if isinstance ( pixel_color , tuple ) :
monochrome_color = sum ( pixel_color [ : 3 ] ) / len ( pixel_color [ : 3 ] )
elif isinstance ( pixel_color , int ) :
monochrome_color = pixel_color
else :
sys . exit ( " %s : Unknown pixel format detected ( %s )! " % ( file , pixel_color ) )
if monochrome_color > 127 :
bit_val = 1 << ( 7 - bit )
byte_val + = bit_val
buf . append ( byte_val )
im . close ( )
return ( buf , cols )
def bitmap ( self , arg ) :
""" if arg is a valid and existing path name, we load it as an image.
Otherwise , we take it as a string .
"""
if os . path . exists ( arg ) :
return SimpleTextAndIcons . bitmap_img ( arg )
return self . bitmap_text ( arg )
class LedNameBadge :
@ -391,6 +409,7 @@ class LedNameBadge:
)
_have_pyhidapi = False
@staticmethod
def init_class ( ) :
try :
@ -429,11 +448,13 @@ or
print ( """ Please with Linux or MacOS or help us implement support for """ + sys . platform )
sys . exit ( 1 )
@staticmethod
def _expand_tuple ( l ) :
l = l + ( l [ - 1 ] , ) * ( 8 - len ( l ) ) # repeat last element
return l
@staticmethod
def header ( lengths , speeds , modes , blinks , ants , brightness = 100 , date = datetime . now ( ) ) :
""" lengths[0] is the number of chars of the first text
@ -476,6 +497,7 @@ or
return h
@staticmethod
def write ( buf ) :
if len ( buf ) > 8192 :
@ -536,7 +558,7 @@ if __name__ == '__main__':
parser . add_argument ( ' -p ' , ' --preload ' , metavar = ' FILE ' , action = ' append ' ,
help = argparse . SUPPRESS ) # "Load bitmap images. Use ^A, ^B, ^C, ... in text messages to make them visible. Deprecated, embed within ':' instead")
parser . add_argument ( ' -l ' , ' --list-names ' , action = ' version ' , help = " list named icons to be embedded in messages and exit " ,
version = ' : ' + ' : : ' . join ( bitmap_named . keys ( ) ) + ' : :: or e.g. :path/to/some_icon.png: ' )
version = ' : ' + ' : : ' . join ( SimpleTextAndIcons . get_named_bitmaps_ keys( ) ) + ' : :: or e.g. :path/to/some_icon.png: ' )
parser . add_argument ( ' message ' , metavar = ' MESSAGE ' , nargs = ' + ' ,
help = " Up to 8 message texts with embedded builtin icons or loaded images within colons(:) -- See -l for a list of builtins " )
parser . add_argument ( ' --mode-help ' , action = ' version ' , help = argparse . SUPPRESS , version = """
@ -562,16 +584,17 @@ if __name__ == '__main__':
""" % s ys.argv[0])
args = parser . parse_args ( )
creator = SimpleTextAndIcons ( )
if args . preload :
for file in args . preload :
bitmap_preloaded . append ( bitmap_img ( file ) )
bitmaps_preloaded_unused = True
for filename in args . preload :
creator . add_preload_img ( filename )
msg_bitmaps = [ ]
for msg_arg in args . message :
msg_bitmaps . append ( bitmap ( msg_arg ) )
msg_bitmaps . append ( creator . bitmap ( msg_arg ) )
if bitmaps_preloaded_unused == True :
if creator . are_preloaded_unused ( ) :
print (
" \n WARNING: \n Your preloaded images are not used. \n Try without ' -p ' or embed the control character ' ^A ' in your message. \n " )
@ -580,8 +603,8 @@ if __name__ == '__main__':
for msg_bitmap in msg_bitmaps :
# trivial hack to support 12x48 badges:
# patch extra empty lines into the message stream.
for o in reversed ( range ( 1 , int ( len ( msg_bitmap [ 0 ] ) / 11 ) + 1 ) ) :
msg_bitmap [ 0 ] [ o * 11 : o * 11 ] = array ( ' B ' , [ 0 ] )
for i in reversed ( range ( 1 , int ( len ( msg_bitmap [ 0 ] ) / 11 ) + 1 ) ) :
msg_bitmap [ 0 ] [ i * 11 : i * 11 ] = array ( ' B ' , [ 0 ] )
else :
print ( " Type: 11x44 " )