1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-22 22:38:08 +00:00

import modTrezorUi source

This commit is contained in:
Pavol Rusnak 2016-03-27 23:10:31 +02:00
parent 711adbeea4
commit 0069b72f26
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D
5 changed files with 1059 additions and 0 deletions

View File

@ -0,0 +1,197 @@
// first two bytes are width and height of the glyph
// third, fourth and fifth bytes are advance, bearingX and bearingY of the horizontal metrics of the glyph
// rest is packed 4-bit glyph data
/* */ static const uint8_t glyph_32[] = { 0, 0, 4, 0, 0, };
/* ! */ static const uint8_t glyph_33[] = { 3, 13, 5, 1, 13, 143, 40, 242, 143, 39, 241, 127, 23, 241, 127, 23, 241, 111, 1, 64, 0, 4, 194, 111, 48 };
/* " */ static const uint8_t glyph_34[] = { 4, 4, 6, 1, 14, 199, 109, 198, 108, 196, 106, 195, 121 };
/* # */ static const uint8_t glyph_35[] = { 10, 13, 11, 1, 13, 0, 2, 241, 9, 176, 0, 5, 224, 12, 128, 0, 8, 176, 14, 80, 0, 11, 128, 31, 32, 79, 255, 255, 255, 253, 3, 79, 83, 172, 51, 0, 79, 0, 184, 0, 0, 139, 0, 229, 0, 255, 255, 255, 255, 243, 51, 247, 55, 227, 48, 1, 242, 8, 176, 0, 4, 240, 11, 128, 0, 7, 192, 14, 80, 0 };
/* $ */ static const uint8_t glyph_36[] = { 10, 17, 10, 0, 15, 0, 0, 93, 0, 0, 0, 0, 110, 0, 0, 0, 26, 255, 197, 0, 0, 238, 135, 223, 64, 6, 244, 0, 14, 192, 8, 241, 0, 10, 240, 5, 247, 0, 0, 16, 0, 207, 164, 0, 0, 0, 25, 255, 213, 0, 0, 0, 22, 223, 112, 0, 0, 0, 13, 240, 14, 144, 0, 8, 241, 12, 224, 0, 11, 240, 4, 253, 118, 191, 128, 0, 76, 255, 214, 0, 0, 0, 140, 0, 0, 0, 0, 88, 0, 0 };
/* % */ static const uint8_t glyph_37[] = { 13, 13, 13, 0, 13, 2, 207, 194, 0, 0, 0, 0, 201, 24, 208, 1, 192, 0, 15, 32, 31, 16, 170, 0, 0, 242, 1, 241, 79, 16, 0, 12, 145, 141, 13, 96, 0, 0, 43, 252, 55, 208, 0, 0, 0, 0, 1, 243, 0, 0, 0, 0, 0, 170, 10, 253, 80, 0, 0, 78, 24, 194, 95, 32, 0, 13, 96, 198, 0, 213, 0, 7, 192, 12, 96, 13, 80, 0, 163, 0, 140, 37, 242, 0, 0, 0, 0, 175, 213, 0 };
/* & */ static const uint8_t glyph_38[] = { 12, 13, 11, 0, 13, 0, 9, 239, 177, 0, 0, 0, 175, 134, 237, 0, 0, 0, 250, 0, 111, 16, 0, 0, 250, 0, 159, 0, 0, 0, 175, 56, 247, 0, 0, 0, 30, 255, 80, 0, 0, 0, 95, 252, 0, 0, 0, 5, 250, 95, 160, 47, 80, 14, 192, 7, 247, 79, 48, 31, 128, 0, 175, 222, 0, 14, 192, 0, 13, 247, 0, 6, 252, 102, 191, 254, 16, 0, 76, 239, 198, 63, 176 };
/* ' */ static const uint8_t glyph_39[] = { 3, 4, 3, 0, 14, 31, 49, 242, 31, 33, 241 };
/* ( */ static const uint8_t glyph_40[] = { 5, 18, 6, 1, 14, 0, 4, 128, 4, 246, 1, 232, 0, 158, 0, 15, 128, 5, 243, 0, 159, 0, 11, 224, 0, 204, 0, 12, 208, 0, 189, 0, 9, 240, 0, 95, 48, 0, 248, 0, 9, 224, 0, 30, 112, 0, 79, 64, 0, 73 };
/* ) */ static const uint8_t glyph_41[] = { 5, 18, 6, 0, 14, 118, 0, 3, 230, 0, 5, 242, 0, 12, 176, 0, 111, 32, 1, 247, 0, 14, 176, 0, 190, 0, 10, 240, 0, 175, 0, 12, 224, 0, 219, 0, 31, 128, 6, 242, 0, 203, 0, 79, 32, 46, 96, 7, 96, 0 };
/* * */ static const uint8_t glyph_42[] = { 8, 8, 8, 0, 13, 0, 12, 128, 0, 0, 11, 128, 0, 87, 27, 130, 130, 143, 254, 239, 244, 1, 143, 244, 0, 0, 218, 232, 0, 9, 225, 95, 64, 2, 64, 6, 0 };
/* + */ static const uint8_t glyph_43[] = { 10, 10, 10, 0, 11, 0, 0, 138, 0, 0, 0, 0, 206, 0, 0, 0, 0, 206, 0, 0, 0, 0, 206, 0, 0, 95, 255, 255, 255, 247, 40, 136, 239, 136, 131, 0, 0, 206, 0, 0, 0, 0, 206, 0, 0, 0, 0, 206, 0, 0, 0, 0, 104, 0, 0 };
/* , */ static const uint8_t glyph_44[] = { 3, 5, 4, 0, 2, 13, 160, 235, 15, 133, 243, 105, 0 };
/* - */ static const uint8_t glyph_45[] = { 5, 2, 5, 0, 6, 175, 255, 147, 85, 83 };
/* . */ static const uint8_t glyph_46[] = { 3, 2, 5, 1, 2, 125, 24, 226 };
/* / */ static const uint8_t glyph_47[] = { 7, 14, 7, 0, 13, 0, 0, 11, 176, 0, 1, 245, 0, 0, 126, 0, 0, 13, 128, 0, 3, 242, 0, 0, 156, 0, 0, 15, 96, 0, 5, 241, 0, 0, 186, 0, 0, 47, 64, 0, 8, 224, 0, 0, 232, 0, 0, 79, 32, 0, 10, 192, 0, 0 };
/* 0 */ static const uint8_t glyph_48[] = { 9, 13, 10, 1, 13, 3, 191, 252, 64, 1, 254, 119, 223, 48, 143, 32, 1, 250, 12, 208, 0, 11, 224, 251, 0, 0, 159, 15, 160, 0, 8, 241, 250, 0, 0, 143, 31, 160, 0, 8, 241, 234, 0, 0, 159, 12, 192, 0, 11, 224, 143, 32, 1, 250, 1, 238, 118, 223, 32, 2, 191, 252, 48, 0 };
/* 1 */ static const uint8_t glyph_49[] = { 6, 13, 10, 1, 13, 0, 4, 182, 6, 223, 246, 143, 183, 246, 49, 3, 246, 0, 3, 246, 0, 3, 246, 0, 3, 246, 0, 3, 246, 0, 3, 246, 0, 3, 246, 0, 3, 246, 0, 3, 246, 0, 3, 246 };
/* 2 */ static const uint8_t glyph_50[] = { 10, 13, 10, 0, 13, 0, 76, 254, 179, 0, 6, 252, 102, 223, 64, 14, 208, 0, 31, 176, 47, 112, 0, 13, 208, 0, 0, 0, 14, 160, 0, 0, 0, 111, 48, 0, 0, 3, 249, 0, 0, 0, 46, 192, 0, 0, 1, 221, 16, 0, 0, 12, 226, 0, 0, 0, 190, 32, 0, 0, 10, 248, 85, 85, 82, 15, 255, 255, 255, 247 };
/* 3 */ static const uint8_t glyph_51[] = { 9, 13, 10, 0, 13, 0, 76, 254, 178, 0, 95, 198, 125, 242, 14, 208, 0, 47, 144, 133, 0, 0, 235, 0, 0, 0, 31, 144, 0, 0, 43, 242, 0, 9, 255, 243, 0, 0, 53, 125, 227, 0, 0, 0, 14, 177, 132, 0, 0, 190, 15, 192, 0, 14, 192, 127, 182, 108, 244, 0, 92, 254, 179, 0 };
/* 4 */ static const uint8_t glyph_52[] = { 10, 13, 10, 0, 13, 0, 0, 2, 254, 0, 0, 0, 11, 254, 0, 0, 0, 95, 222, 0, 0, 0, 233, 190, 0, 0, 8, 225, 190, 0, 0, 47, 96, 190, 0, 0, 204, 0, 190, 0, 6, 243, 0, 190, 0, 30, 144, 0, 190, 0, 127, 255, 255, 255, 251, 37, 85, 85, 207, 83, 0, 0, 0, 190, 0, 0, 0, 0, 190, 0 };
/* 5 */ static const uint8_t glyph_53[] = { 9, 13, 10, 1, 13, 9, 255, 255, 255, 0, 190, 136, 136, 128, 12, 176, 0, 0, 0, 233, 0, 0, 0, 15, 205, 254, 112, 2, 254, 136, 223, 128, 2, 16, 0, 223, 16, 0, 0, 6, 244, 0, 0, 0, 79, 85, 128, 0, 5, 244, 111, 64, 0, 191, 16, 222, 118, 175, 128, 1, 157, 253, 112, 0 };
/* 6 */ static const uint8_t glyph_54[] = { 9, 13, 10, 1, 13, 0, 7, 206, 96, 0, 29, 250, 114, 0, 11, 226, 0, 0, 3, 245, 0, 0, 0, 143, 109, 253, 96, 11, 255, 134, 207, 96, 207, 48, 0, 222, 13, 208, 0, 7, 241, 205, 0, 0, 111, 58, 240, 0, 7, 242, 95, 112, 0, 222, 0, 191, 134, 207, 80, 0, 142, 252, 80, 0 };
/* 7 */ static const uint8_t glyph_55[] = { 10, 13, 10, 0, 13, 95, 255, 255, 255, 245, 21, 85, 85, 91, 241, 0, 0, 0, 14, 160, 0, 0, 0, 95, 48, 0, 0, 0, 220, 0, 0, 0, 4, 245, 0, 0, 0, 11, 208, 0, 0, 0, 47, 112, 0, 0, 0, 175, 0, 0, 0, 1, 249, 0, 0, 0, 8, 242, 0, 0, 0, 15, 176, 0, 0, 0, 127, 64, 0, 0 };
/* 8 */ static const uint8_t glyph_56[] = { 10, 13, 10, 0, 13, 0, 42, 238, 179, 0, 2, 254, 118, 223, 48, 8, 243, 0, 47, 160, 11, 240, 0, 13, 192, 9, 241, 0, 14, 176, 2, 250, 17, 159, 48, 0, 79, 255, 246, 0, 2, 236, 102, 206, 48, 12, 208, 0, 12, 208, 15, 160, 0, 8, 241, 14, 208, 0, 12, 240, 6, 252, 102, 191, 128, 0, 76, 238, 197, 0 };
/* 9 */ static const uint8_t glyph_57[] = { 9, 13, 10, 0, 13, 0, 60, 254, 145, 0, 63, 215, 143, 208, 11, 225, 0, 111, 96, 249, 0, 0, 235, 31, 128, 0, 12, 224, 249, 0, 0, 190, 12, 225, 0, 47, 224, 79, 214, 126, 237, 0, 93, 253, 77, 160, 0, 0, 2, 246, 0, 0, 1, 190, 0, 1, 121, 254, 48, 0, 95, 216, 16, 0 };
/* : */ static const uint8_t glyph_58[] = { 3, 10, 4, 1, 10, 142, 40, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 24, 226 };
/* ; */ static const uint8_t glyph_59[] = { 4, 13, 4, 0, 10, 8, 226, 8, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 160, 14, 176, 15, 128, 95, 48, 105, 0 };
/* < */ static const uint8_t glyph_60[] = { 8, 8, 9, 0, 10, 0, 0, 0, 106, 0, 0, 126, 251, 1, 142, 251, 64, 79, 232, 32, 0, 79, 232, 16, 0, 1, 142, 250, 64, 0, 0, 126, 251, 0, 0, 0, 106 };
/* = */ static const uint8_t glyph_61[] = { 8, 6, 10, 1, 9, 175, 255, 255, 250, 70, 102, 102, 100, 0, 0, 0, 0, 0, 0, 0, 0, 175, 255, 255, 250, 70, 102, 102, 100 };
/* > */ static const uint8_t glyph_62[] = { 8, 8, 9, 1, 10, 166, 0, 0, 0, 191, 232, 16, 0, 3, 159, 250, 32, 0, 0, 108, 248, 0, 1, 109, 248, 3, 175, 249, 32, 191, 232, 16, 0, 166, 0, 0, 0 };
/* ? */ static const uint8_t glyph_63[] = { 8, 13, 9, 0, 13, 1, 158, 252, 80, 12, 249, 124, 244, 63, 112, 1, 250, 2, 0, 0, 235, 0, 0, 2, 248, 0, 0, 29, 225, 0, 0, 223, 48, 0, 8, 244, 0, 0, 12, 224, 0, 0, 4, 48, 0, 0, 0, 0, 0, 0, 9, 160, 0, 0, 11, 208, 0 };
/* @ */ static const uint8_t glyph_64[] = { 16, 17, 16, 0, 13, 0, 0, 4, 190, 254, 181, 0, 0, 0, 0, 175, 132, 35, 125, 193, 0, 0, 12, 193, 0, 0, 0, 156, 0, 0, 126, 0, 0, 0, 0, 12, 96, 0, 244, 0, 26, 253, 128, 5, 192, 6, 224, 0, 219, 37, 242, 0, 240, 10, 144, 7, 224, 3, 240, 0, 226, 13, 112, 13, 144, 5, 240, 0, 211, 15, 80, 15, 80, 6, 208, 0, 227, 14, 80, 47, 64, 8, 192, 0, 241, 13, 96, 31, 80, 12, 176, 5, 208, 11, 144, 13, 213, 173, 242, 62, 80, 6, 208, 3, 223, 144, 175, 230, 0, 1, 246, 0, 0, 0, 0, 0, 0, 0, 111, 64, 0, 0, 0, 0, 0, 0, 7, 250, 66, 36, 144, 0, 0, 0, 0, 58, 239, 236, 128, 0, 0 };
/* A */ static const uint8_t glyph_65[] = { 12, 13, 12, 0, 13, 0, 0, 14, 224, 0, 0, 0, 0, 79, 244, 0, 0, 0, 0, 173, 218, 0, 0, 0, 1, 247, 127, 16, 0, 0, 6, 241, 47, 96, 0, 0, 12, 176, 12, 192, 0, 0, 47, 96, 6, 242, 0, 0, 143, 0, 0, 248, 0, 0, 239, 255, 255, 254, 0, 4, 248, 102, 102, 143, 64, 11, 224, 0, 0, 14, 160, 31, 144, 0, 0, 9, 241, 127, 64, 0, 0, 4, 246 };
/* B */ static const uint8_t glyph_66[] = { 10, 13, 11, 1, 13, 143, 255, 255, 180, 0, 143, 118, 104, 239, 64, 143, 32, 0, 47, 176, 143, 32, 0, 14, 208, 143, 32, 0, 15, 176, 143, 32, 2, 191, 64, 143, 255, 255, 246, 0, 143, 117, 86, 191, 96, 143, 32, 0, 12, 240, 143, 32, 0, 8, 242, 143, 32, 0, 12, 241, 143, 118, 103, 207, 128, 143, 255, 254, 197, 0 };
/* C */ static const uint8_t glyph_67[] = { 10, 13, 12, 1, 13, 0, 59, 239, 215, 0, 6, 253, 119, 175, 192, 47, 192, 0, 7, 246, 143, 48, 0, 0, 252, 222, 0, 0, 0, 52, 236, 0, 0, 0, 0, 252, 0, 0, 0, 0, 236, 0, 0, 0, 0, 222, 0, 0, 0, 51, 159, 48, 0, 0, 252, 47, 176, 0, 7, 246, 7, 252, 118, 175, 176, 0, 76, 255, 215, 0 };
/* D */ static const uint8_t glyph_68[] = { 10, 13, 12, 1, 13, 143, 255, 253, 112, 0, 143, 118, 106, 253, 16, 143, 32, 0, 63, 192, 143, 32, 0, 7, 243, 143, 32, 0, 1, 248, 143, 32, 0, 0, 250, 143, 32, 0, 0, 235, 143, 32, 0, 0, 250, 143, 32, 0, 1, 248, 143, 32, 0, 7, 243, 143, 32, 0, 63, 192, 143, 118, 106, 253, 16, 143, 255, 252, 112, 0 };
/* E */ static const uint8_t glyph_69[] = { 9, 13, 10, 1, 13, 143, 255, 255, 255, 136, 247, 102, 102, 99, 143, 32, 0, 0, 8, 242, 0, 0, 0, 143, 32, 0, 0, 8, 242, 0, 0, 0, 143, 255, 255, 251, 8, 247, 102, 102, 64, 143, 32, 0, 0, 8, 242, 0, 0, 0, 143, 32, 0, 0, 8, 247, 102, 102, 99, 143, 255, 255, 255, 144 };
/* F */ static const uint8_t glyph_70[] = { 9, 13, 10, 1, 13, 143, 255, 255, 255, 104, 247, 102, 102, 98, 143, 32, 0, 0, 8, 242, 0, 0, 0, 143, 32, 0, 0, 8, 242, 0, 0, 0, 143, 255, 255, 248, 8, 247, 102, 102, 48, 143, 32, 0, 0, 8, 242, 0, 0, 0, 143, 32, 0, 0, 8, 242, 0, 0, 0, 143, 32, 0, 0, 0 };
/* G */ static const uint8_t glyph_71[] = { 10, 13, 12, 1, 13, 0, 75, 239, 216, 0, 7, 253, 118, 175, 192, 47, 176, 0, 6, 247, 159, 32, 0, 0, 219, 206, 0, 0, 0, 0, 236, 0, 0, 0, 0, 236, 0, 0, 0, 0, 237, 0, 11, 255, 255, 207, 0, 4, 102, 223, 127, 64, 0, 0, 207, 31, 209, 0, 0, 207, 5, 254, 134, 123, 250, 0, 42, 239, 235, 96 };
/* H */ static const uint8_t glyph_72[] = { 11, 13, 13, 1, 13, 143, 32, 0, 0, 111, 88, 242, 0, 0, 6, 245, 143, 32, 0, 0, 111, 88, 242, 0, 0, 6, 245, 143, 32, 0, 0, 111, 88, 242, 0, 0, 6, 245, 143, 255, 255, 255, 255, 88, 247, 102, 102, 105, 245, 143, 32, 0, 0, 111, 88, 242, 0, 0, 6, 245, 143, 32, 0, 0, 111, 88, 242, 0, 0, 6, 245, 143, 32, 0, 0, 111, 80 };
/* I */ static const uint8_t glyph_73[] = { 3, 13, 5, 1, 13, 111, 70, 244, 111, 70, 244, 111, 70, 244, 111, 70, 244, 111, 70, 244, 111, 70, 244, 111, 64 };
/* J */ static const uint8_t glyph_74[] = { 9, 13, 10, 0, 13, 0, 0, 0, 47, 128, 0, 0, 2, 248, 0, 0, 0, 47, 128, 0, 0, 2, 248, 0, 0, 0, 47, 128, 0, 0, 2, 248, 0, 0, 0, 47, 128, 0, 0, 2, 248, 0, 0, 0, 47, 133, 178, 0, 3, 248, 95, 112, 0, 143, 80, 223, 150, 159, 192, 1, 157, 254, 144, 0 };
/* K */ static const uint8_t glyph_75[] = { 11, 13, 11, 1, 13, 143, 32, 0, 9, 247, 8, 242, 0, 6, 249, 0, 143, 32, 4, 251, 0, 8, 242, 2, 252, 0, 0, 143, 33, 237, 16, 0, 8, 243, 207, 32, 0, 0, 143, 205, 246, 0, 0, 8, 253, 25, 243, 0, 0, 143, 48, 13, 208, 0, 8, 242, 0, 63, 160, 0, 143, 32, 0, 143, 96, 8, 242, 0, 0, 207, 48, 143, 32, 0, 2, 253, 0 };
/* L */ static const uint8_t glyph_76[] = { 9, 13, 10, 1, 13, 143, 48, 0, 0, 8, 243, 0, 0, 0, 143, 48, 0, 0, 8, 243, 0, 0, 0, 143, 48, 0, 0, 8, 243, 0, 0, 0, 143, 48, 0, 0, 8, 243, 0, 0, 0, 143, 48, 0, 0, 8, 243, 0, 0, 0, 143, 48, 0, 0, 8, 247, 102, 102, 97, 143, 255, 255, 255, 64 };
/* M */ static const uint8_t glyph_77[] = { 14, 13, 16, 1, 13, 143, 208, 0, 0, 0, 47, 243, 143, 244, 0, 0, 0, 159, 243, 143, 250, 0, 0, 0, 239, 243, 143, 175, 16, 0, 5, 249, 243, 143, 79, 112, 0, 11, 214, 243, 143, 28, 208, 0, 47, 118, 243, 143, 38, 243, 0, 143, 22, 243, 143, 32, 249, 0, 234, 7, 243, 143, 32, 159, 5, 244, 7, 243, 143, 32, 63, 107, 208, 7, 243, 143, 32, 12, 223, 112, 7, 243, 143, 32, 6, 255, 16, 7, 243, 143, 32, 0, 250, 0, 7, 243 };
/* N */ static const uint8_t glyph_78[] = { 11, 13, 13, 1, 13, 111, 160, 0, 0, 63, 118, 255, 64, 0, 3, 247, 111, 253, 0, 0, 63, 118, 250, 248, 0, 3, 247, 111, 91, 243, 0, 63, 118, 245, 31, 208, 3, 247, 111, 80, 111, 112, 63, 118, 245, 0, 207, 35, 247, 111, 80, 2, 252, 63, 118, 245, 0, 8, 250, 247, 111, 80, 0, 13, 255, 118, 245, 0, 0, 63, 247, 111, 80, 0, 0, 159, 112 };
/* O */ static const uint8_t glyph_79[] = { 11, 13, 12, 1, 13, 0, 59, 239, 198, 0, 0, 95, 232, 123, 251, 0, 31, 192, 0, 7, 247, 8, 243, 0, 0, 12, 224, 206, 0, 0, 0, 143, 46, 192, 0, 0, 6, 244, 251, 0, 0, 0, 95, 94, 192, 0, 0, 6, 244, 206, 0, 0, 0, 143, 40, 244, 0, 0, 12, 224, 47, 192, 0, 6, 247, 0, 95, 232, 123, 251, 0, 0, 59, 239, 215, 0, 0 };
/* P */ static const uint8_t glyph_80[] = { 10, 13, 11, 1, 13, 191, 255, 255, 198, 0, 191, 102, 103, 207, 144, 191, 0, 0, 11, 242, 191, 0, 0, 4, 246, 191, 0, 0, 3, 247, 191, 0, 0, 7, 245, 191, 0, 1, 95, 224, 191, 255, 255, 253, 32, 191, 102, 101, 48, 0, 191, 0, 0, 0, 0, 191, 0, 0, 0, 0, 191, 0, 0, 0, 0, 191, 0, 0, 0, 0 };
/* Q */ static const uint8_t glyph_81[] = { 12, 15, 12, 0, 13, 0, 5, 207, 235, 64, 0, 0, 159, 200, 141, 247, 0, 5, 249, 0, 0, 175, 48, 12, 241, 0, 0, 31, 160, 31, 160, 0, 0, 12, 224, 47, 128, 0, 0, 10, 240, 63, 112, 0, 0, 9, 241, 47, 128, 0, 0, 10, 240, 31, 160, 0, 0, 12, 224, 12, 241, 0, 0, 31, 160, 5, 249, 0, 0, 175, 48, 0, 159, 199, 124, 247, 0, 0, 5, 207, 255, 245, 0, 0, 0, 0, 1, 207, 128, 0, 0, 0, 0, 9, 112 };
/* R */ static const uint8_t glyph_82[] = { 10, 13, 11, 1, 13, 159, 255, 254, 180, 0, 159, 118, 103, 223, 112, 159, 32, 0, 13, 240, 159, 32, 0, 9, 242, 159, 32, 0, 11, 240, 159, 32, 1, 143, 144, 159, 255, 255, 249, 0, 159, 118, 109, 224, 0, 159, 32, 5, 247, 0, 159, 32, 0, 222, 0, 159, 32, 0, 95, 112, 159, 32, 0, 13, 241, 159, 32, 0, 5, 248 };
/* S */ static const uint8_t glyph_83[] = { 11, 13, 11, 0, 13, 0, 24, 223, 234, 32, 0, 30, 249, 104, 239, 48, 9, 244, 0, 1, 237, 0, 191, 0, 0, 8, 224, 7, 247, 0, 0, 0, 0, 13, 252, 97, 0, 0, 0, 7, 239, 251, 48, 0, 0, 0, 56, 255, 80, 0, 0, 0, 1, 238, 1, 233, 0, 0, 9, 242, 13, 225, 0, 0, 207, 0, 63, 232, 103, 207, 112, 0, 25, 223, 235, 64, 0 };
/* T */ static const uint8_t glyph_84[] = { 11, 13, 11, 0, 13, 159, 255, 255, 255, 255, 83, 102, 106, 248, 102, 98, 0, 0, 127, 48, 0, 0, 0, 7, 243, 0, 0, 0, 0, 127, 48, 0, 0, 0, 7, 243, 0, 0, 0, 0, 127, 48, 0, 0, 0, 7, 243, 0, 0, 0, 0, 127, 48, 0, 0, 0, 7, 243, 0, 0, 0, 0, 127, 48, 0, 0, 0, 7, 243, 0, 0, 0, 0, 127, 48, 0, 0 };
/* U */ static const uint8_t glyph_85[] = { 10, 13, 12, 1, 13, 159, 16, 0, 0, 250, 159, 16, 0, 0, 250, 159, 16, 0, 0, 250, 159, 16, 0, 0, 250, 159, 16, 0, 0, 250, 159, 16, 0, 0, 250, 159, 16, 0, 0, 250, 159, 16, 0, 0, 250, 159, 16, 0, 0, 250, 143, 48, 0, 2, 249, 63, 160, 0, 9, 244, 10, 251, 119, 191, 160, 0, 108, 255, 198, 0 };
/* V */ static const uint8_t glyph_86[] = { 11, 13, 11, 0, 13, 207, 0, 0, 0, 15, 214, 245, 0, 0, 5, 247, 31, 176, 0, 0, 191, 16, 191, 16, 0, 31, 176, 5, 246, 0, 6, 245, 0, 14, 176, 0, 191, 0, 0, 159, 16, 31, 160, 0, 3, 246, 6, 244, 0, 0, 13, 176, 190, 0, 0, 0, 143, 63, 128, 0, 0, 2, 253, 242, 0, 0, 0, 12, 252, 0, 0, 0, 0, 111, 112, 0, 0 };
/* W */ static const uint8_t glyph_87[] = { 16, 13, 16, 0, 13, 95, 80, 0, 12, 224, 0, 3, 247, 31, 128, 0, 15, 243, 0, 7, 243, 14, 192, 0, 79, 247, 0, 10, 240, 10, 240, 0, 158, 172, 0, 14, 176, 6, 243, 0, 217, 111, 0, 31, 128, 2, 247, 2, 245, 47, 64, 95, 64, 0, 235, 6, 240, 13, 144, 143, 0, 0, 174, 11, 192, 9, 208, 204, 0, 0, 127, 47, 112, 4, 242, 248, 0, 0, 63, 159, 32, 0, 249, 245, 0, 0, 15, 238, 0, 0, 206, 241, 0, 0, 11, 249, 0, 0, 127, 208, 0, 0, 7, 245, 0, 0, 63, 144, 0 };
/* X */ static const uint8_t glyph_88[] = { 11, 13, 11, 0, 13, 47, 208, 0, 0, 159, 96, 127, 112, 0, 47, 192, 0, 223, 16, 11, 242, 0, 3, 250, 5, 248, 0, 0, 9, 244, 237, 0, 0, 0, 14, 255, 64, 0, 0, 0, 143, 208, 0, 0, 0, 30, 239, 80, 0, 0, 10, 243, 222, 16, 0, 4, 249, 4, 249, 0, 0, 222, 16, 10, 243, 0, 143, 96, 0, 31, 208, 63, 192, 0, 0, 127, 112 };
/* Y */ static const uint8_t glyph_89[] = { 11, 13, 11, 0, 13, 159, 80, 0, 0, 143, 81, 253, 0, 0, 31, 208, 8, 245, 0, 8, 244, 0, 14, 208, 1, 251, 0, 0, 127, 80, 159, 48, 0, 0, 221, 47, 160, 0, 0, 5, 253, 242, 0, 0, 0, 12, 249, 0, 0, 0, 0, 127, 48, 0, 0, 0, 7, 243, 0, 0, 0, 0, 127, 48, 0, 0, 0, 7, 243, 0, 0, 0, 0, 127, 48, 0, 0 };
/* Z */ static const uint8_t glyph_90[] = { 11, 13, 11, 0, 13, 47, 255, 255, 255, 252, 0, 102, 102, 102, 175, 144, 0, 0, 0, 30, 224, 0, 0, 0, 10, 244, 0, 0, 0, 5, 249, 0, 0, 0, 1, 237, 0, 0, 0, 0, 191, 48, 0, 0, 0, 111, 128, 0, 0, 0, 31, 208, 0, 0, 0, 11, 243, 0, 0, 0, 6, 248, 0, 0, 0, 1, 255, 102, 102, 102, 96, 79, 255, 255, 255, 255, 16 };
/* [ */ static const uint8_t glyph_91[] = { 4, 18, 5, 1, 15, 191, 249, 191, 83, 190, 0, 190, 0, 190, 0, 190, 0, 190, 0, 190, 0, 190, 0, 190, 0, 190, 0, 190, 0, 190, 0, 190, 0, 190, 0, 190, 0, 191, 83, 191, 249 };
/* \ */ static const uint8_t glyph_92[] = { 8, 14, 7, 0, 13, 127, 16, 0, 0, 31, 112, 0, 0, 11, 208, 0, 0, 4, 243, 0, 0, 0, 233, 0, 0, 0, 143, 0, 0, 0, 47, 96, 0, 0, 12, 192, 0, 0, 6, 242, 0, 0, 0, 248, 0, 0, 0, 174, 0, 0, 0, 79, 64, 0, 0, 13, 160, 0, 0, 7, 241 };
/* ] */ static const uint8_t glyph_93[] = { 4, 18, 5, 0, 15, 239, 246, 87, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 87, 246, 239, 246 };
/* ^ */ static const uint8_t glyph_94[] = { 8, 6, 8, 0, 13, 0, 12, 192, 0, 0, 63, 243, 0, 0, 173, 218, 0, 1, 246, 111, 16, 8, 224, 15, 128, 15, 128, 9, 224 };
/* _ */ static const uint8_t glyph_95[] = { 9, 2, 8, 0, 0, 255, 255, 255, 255, 21, 85, 85, 85, 80 };
/* ` */ static const uint8_t glyph_96[] = { 5, 3, 6, 0, 14, 47, 192, 0, 95, 112, 0, 155, 0 };
/* a */ static const uint8_t glyph_97[] = { 8, 10, 10, 1, 10, 3, 191, 235, 48, 63, 198, 109, 225, 157, 0, 3, 246, 0, 0, 1, 248, 5, 190, 255, 249, 127, 164, 35, 249, 220, 0, 1, 249, 237, 0, 5, 249, 143, 183, 175, 249, 8, 239, 195, 236 };
/* b */ static const uint8_t glyph_98[] = { 9, 14, 10, 1, 14, 221, 0, 0, 0, 13, 208, 0, 0, 0, 221, 0, 0, 0, 13, 208, 0, 0, 0, 221, 109, 253, 80, 13, 254, 119, 223, 64, 223, 16, 0, 236, 13, 208, 0, 9, 240, 221, 0, 0, 127, 45, 208, 0, 7, 242, 221, 0, 0, 159, 13, 242, 0, 30, 192, 223, 231, 125, 244, 13, 182, 223, 213, 0 };
/* c */ static const uint8_t glyph_99[] = { 9, 10, 9, 0, 10, 0, 76, 254, 145, 0, 95, 198, 126, 208, 14, 192, 0, 79, 100, 246, 0, 0, 116, 111, 64, 0, 0, 6, 244, 0, 0, 0, 79, 96, 0, 2, 16, 236, 0, 2, 247, 6, 251, 103, 237, 0, 5, 207, 233, 16 };
/* d */ static const uint8_t glyph_100[] = { 9, 14, 10, 0, 14, 0, 0, 0, 13, 192, 0, 0, 0, 220, 0, 0, 0, 13, 192, 0, 0, 0, 220, 0, 93, 253, 109, 192, 79, 215, 126, 252, 13, 225, 0, 31, 193, 249, 0, 0, 220, 63, 112, 0, 13, 195, 246, 0, 0, 220, 31, 144, 0, 13, 192, 206, 16, 1, 252, 4, 253, 119, 239, 192, 4, 223, 214, 204 };
/* e */ static const uint8_t glyph_101[] = { 9, 10, 10, 1, 10, 0, 142, 252, 64, 0, 207, 134, 207, 64, 111, 64, 0, 220, 11, 224, 0, 8, 240, 239, 255, 255, 255, 46, 213, 85, 85, 80, 206, 0, 0, 0, 7, 246, 0, 3, 64, 13, 249, 88, 251, 0, 25, 239, 216, 0 };
/* f */ static const uint8_t glyph_102[] = { 7, 14, 6, 0, 14, 0, 26, 238, 16, 11, 248, 96, 0, 250, 0, 0, 31, 128, 0, 159, 255, 248, 2, 95, 164, 32, 1, 248, 0, 0, 31, 128, 0, 1, 248, 0, 0, 31, 128, 0, 1, 248, 0, 0, 31, 128, 0, 1, 248, 0, 0, 31, 128, 0 };
/* g */ static const uint8_t glyph_103[] = { 9, 14, 10, 0, 10, 0, 77, 253, 107, 208, 79, 215, 125, 253, 12, 241, 0, 30, 209, 250, 0, 0, 205, 47, 112, 0, 12, 210, 247, 0, 0, 205, 15, 144, 0, 12, 208, 207, 16, 1, 237, 4, 253, 119, 223, 208, 4, 223, 214, 205, 0, 0, 0, 14, 192, 55, 0, 3, 248, 6, 250, 87, 238, 16, 5, 207, 234, 32 };
/* h */ static const uint8_t glyph_104[] = { 8, 14, 10, 1, 14, 190, 0, 0, 0, 190, 0, 0, 0, 190, 0, 0, 0, 190, 0, 0, 0, 190, 60, 253, 112, 191, 232, 108, 244, 191, 48, 1, 249, 190, 0, 0, 235, 190, 0, 0, 236, 190, 0, 0, 236, 190, 0, 0, 236, 190, 0, 0, 236, 190, 0, 0, 236, 190, 0, 0, 236 };
/* i */ static const uint8_t glyph_105[] = { 3, 14, 4, 1, 14, 155, 11, 208, 0, 0, 0, 205, 12, 208, 205, 12, 208, 205, 12, 208, 205, 12, 208, 205, 12, 208 };
/* j */ static const uint8_t glyph_106[] = { 4, 18, 4, -1, 14, 0, 169, 0, 219, 0, 0, 0, 0, 0, 220, 0, 220, 0, 220, 0, 220, 0, 220, 0, 220, 0, 220, 0, 220, 0, 220, 0, 220, 0, 220, 0, 235, 72, 248, 175, 177 };
/* k */ static const uint8_t glyph_107[] = { 9, 14, 9, 1, 14, 205, 0, 0, 0, 12, 208, 0, 0, 0, 205, 0, 0, 0, 12, 208, 0, 0, 0, 205, 0, 11, 244, 12, 208, 9, 245, 0, 205, 6, 247, 0, 12, 212, 249, 0, 0, 206, 239, 48, 0, 12, 247, 205, 0, 0, 206, 2, 249, 0, 12, 208, 7, 245, 0, 205, 0, 12, 225, 12, 208, 0, 47, 176 };
/* l */ static const uint8_t glyph_108[] = { 2, 14, 4, 1, 14, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175 };
/* m */ static const uint8_t glyph_109[] = { 14, 10, 16, 1, 10, 174, 76, 254, 112, 109, 253, 80, 175, 231, 108, 251, 231, 125, 243, 175, 32, 1, 255, 32, 2, 248, 175, 0, 0, 221, 0, 0, 250, 175, 0, 0, 221, 0, 0, 250, 175, 0, 0, 221, 0, 0, 250, 175, 0, 0, 221, 0, 0, 250, 175, 0, 0, 221, 0, 0, 250, 175, 0, 0, 221, 0, 0, 250, 175, 0, 0, 221, 0, 0, 250 };
/* n */ static const uint8_t glyph_110[] = { 8, 10, 10, 1, 10, 189, 60, 253, 112, 191, 232, 108, 244, 191, 48, 1, 249, 190, 0, 0, 235, 190, 0, 0, 236, 190, 0, 0, 236, 190, 0, 0, 236, 190, 0, 0, 236, 190, 0, 0, 236, 190, 0, 0, 236 };
/* o */ static const uint8_t glyph_111[] = { 10, 10, 10, 0, 10, 0, 59, 255, 179, 0, 3, 253, 119, 223, 48, 13, 225, 0, 30, 192, 47, 128, 0, 8, 242, 79, 80, 0, 5, 244, 79, 80, 0, 6, 244, 47, 128, 0, 8, 242, 13, 224, 0, 30, 192, 3, 253, 103, 223, 48, 0, 59, 254, 179, 0 };
/* p */ static const uint8_t glyph_112[] = { 9, 14, 10, 1, 10, 218, 109, 253, 80, 13, 253, 119, 239, 64, 222, 16, 1, 252, 13, 192, 0, 9, 241, 220, 0, 0, 127, 45, 192, 0, 7, 242, 220, 0, 0, 159, 13, 224, 0, 31, 192, 223, 214, 109, 244, 13, 199, 223, 213, 0, 220, 0, 0, 0, 13, 192, 0, 0, 0, 220, 0, 0, 0, 13, 192, 0, 0, 0 };
/* q */ static const uint8_t glyph_113[] = { 9, 14, 10, 0, 10, 0, 93, 253, 108, 176, 95, 215, 125, 251, 13, 225, 0, 31, 178, 249, 0, 0, 235, 79, 96, 0, 14, 180, 246, 0, 0, 235, 47, 128, 0, 14, 176, 222, 0, 1, 251, 5, 253, 102, 223, 176, 5, 223, 214, 235, 0, 0, 0, 14, 176, 0, 0, 0, 235, 0, 0, 0, 14, 176, 0, 0, 0, 235 };
/* r */ static const uint8_t glyph_114[] = { 5, 10, 6, 1, 10, 220, 126, 189, 255, 167, 223, 32, 13, 208, 0, 221, 0, 13, 208, 0, 221, 0, 13, 208, 0, 221, 0, 13, 208, 0 };
/* s */ static const uint8_t glyph_115[] = { 9, 10, 9, 0, 10, 0, 125, 253, 128, 0, 143, 150, 159, 176, 14, 176, 0, 159, 16, 222, 32, 0, 0, 4, 239, 200, 32, 0, 0, 89, 239, 128, 1, 0, 0, 191, 35, 248, 0, 7, 243, 11, 248, 87, 253, 0, 8, 223, 233, 16 };
/* t */ static const uint8_t glyph_116[] = { 6, 12, 6, 0, 12, 2, 248, 0, 2, 248, 0, 223, 255, 244, 53, 250, 65, 2, 248, 0, 2, 248, 0, 2, 248, 0, 2, 248, 0, 2, 248, 0, 1, 248, 0, 0, 237, 98, 0, 94, 244 };
/* u */ static const uint8_t glyph_117[] = { 8, 10, 10, 1, 10, 205, 0, 0, 235, 205, 0, 0, 235, 205, 0, 0, 235, 205, 0, 0, 235, 205, 0, 0, 235, 205, 0, 0, 235, 190, 0, 0, 235, 175, 16, 2, 251, 79, 198, 142, 251, 6, 223, 214, 219 };
/* v */ static const uint8_t glyph_118[] = { 9, 10, 9, 0, 10, 111, 48, 0, 79, 81, 249, 0, 9, 240, 11, 224, 0, 234, 0, 95, 48, 63, 80, 0, 248, 8, 240, 0, 10, 208, 218, 0, 0, 95, 79, 64, 0, 0, 253, 240, 0, 0, 10, 249, 0, 0, 0, 79, 64, 0 };
/* w */ static const uint8_t glyph_119[] = { 14, 10, 14, 0, 10, 79, 80, 0, 220, 0, 6, 243, 15, 144, 2, 255, 16, 10, 224, 11, 208, 6, 239, 80, 14, 160, 6, 241, 11, 155, 160, 31, 80, 2, 245, 15, 86, 240, 95, 16, 0, 217, 79, 2, 244, 157, 0, 0, 157, 155, 0, 216, 216, 0, 0, 95, 230, 0, 142, 244, 0, 0, 15, 242, 0, 63, 240, 0, 0, 12, 208, 0, 14, 176, 0 };
/* x */ static const uint8_t glyph_120[] = { 9, 10, 9, 0, 10, 63, 160, 0, 207, 32, 159, 48, 95, 112, 1, 236, 14, 208, 0, 5, 252, 243, 0, 0, 11, 249, 0, 0, 0, 207, 160, 0, 0, 111, 175, 64, 0, 31, 176, 206, 0, 11, 242, 3, 249, 5, 248, 0, 10, 243 };
/* y */ static const uint8_t glyph_121[] = { 9, 14, 9, 0, 10, 111, 96, 0, 95, 97, 251, 0, 10, 241, 11, 240, 0, 235, 0, 95, 80, 63, 96, 0, 250, 8, 241, 0, 10, 240, 219, 0, 0, 79, 111, 96, 0, 0, 238, 241, 0, 0, 9, 251, 0, 0, 0, 79, 96, 0, 0, 6, 241, 0, 0, 0, 203, 0, 0, 7, 191, 48, 0, 0, 254, 96, 0, 0 };
/* z */ static const uint8_t glyph_122[] = { 9, 10, 9, 0, 10, 47, 255, 255, 255, 16, 85, 85, 127, 192, 0, 0, 12, 242, 0, 0, 8, 246, 0, 0, 3, 251, 0, 0, 0, 222, 16, 0, 0, 159, 64, 0, 0, 79, 144, 0, 0, 30, 245, 85, 85, 19, 255, 255, 255, 245 };
/* { */ static const uint8_t glyph_123[] = { 6, 17, 6, 0, 14, 0, 0, 138, 0, 12, 227, 0, 95, 64, 0, 143, 16, 0, 159, 0, 0, 159, 0, 0, 191, 0, 4, 250, 0, 127, 208, 0, 40, 247, 0, 0, 206, 0, 0, 159, 0, 0, 159, 0, 0, 143, 0, 0, 95, 64, 0, 13, 210, 0, 0, 154 };
/* | */ static const uint8_t glyph_124[] = { 2, 15, 4, 1, 13, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125 };
/* } */ static const uint8_t glyph_125[] = { 6, 17, 6, 0, 14, 168, 0, 0, 62, 176, 0, 5, 244, 0, 1, 248, 0, 0, 249, 0, 0, 249, 0, 0, 250, 0, 0, 175, 64, 0, 12, 247, 0, 127, 130, 0, 235, 0, 0, 249, 0, 0, 249, 0, 1, 248, 0, 5, 245, 0, 45, 192, 0, 168, 0, 0 };
/* ~ */ static const uint8_t glyph_126[] = { 10, 4, 12, 1, 7, 9, 238, 128, 0, 91, 143, 137, 252, 33, 203, 216, 0, 78, 255, 226, 32, 0, 0, 85, 16 };
const uint8_t * const Font_Roboto_Regular_18[126 + 1 - 32] = {
glyph_32,
glyph_33,
glyph_34,
glyph_35,
glyph_36,
glyph_37,
glyph_38,
glyph_39,
glyph_40,
glyph_41,
glyph_42,
glyph_43,
glyph_44,
glyph_45,
glyph_46,
glyph_47,
glyph_48,
glyph_49,
glyph_50,
glyph_51,
glyph_52,
glyph_53,
glyph_54,
glyph_55,
glyph_56,
glyph_57,
glyph_58,
glyph_59,
glyph_60,
glyph_61,
glyph_62,
glyph_63,
glyph_64,
glyph_65,
glyph_66,
glyph_67,
glyph_68,
glyph_69,
glyph_70,
glyph_71,
glyph_72,
glyph_73,
glyph_74,
glyph_75,
glyph_76,
glyph_77,
glyph_78,
glyph_79,
glyph_80,
glyph_81,
glyph_82,
glyph_83,
glyph_84,
glyph_85,
glyph_86,
glyph_87,
glyph_88,
glyph_89,
glyph_90,
glyph_91,
glyph_92,
glyph_93,
glyph_94,
glyph_95,
glyph_96,
glyph_97,
glyph_98,
glyph_99,
glyph_100,
glyph_101,
glyph_102,
glyph_103,
glyph_104,
glyph_105,
glyph_106,
glyph_107,
glyph_108,
glyph_109,
glyph_110,
glyph_111,
glyph_112,
glyph_113,
glyph_114,
glyph_115,
glyph_116,
glyph_117,
glyph_118,
glyph_119,
glyph_120,
glyph_121,
glyph_122,
glyph_123,
glyph_124,
glyph_125,
glyph_126,
};

View File

@ -0,0 +1,442 @@
/*
* stream_inflate - tiny inflate library with output streaming
*
* Copyright (c) 2003 by Joergen Ibsen / Jibz
* All Rights Reserved
* http://www.ibsensoftware.com/
*
* Copyright (c) 2014 by Paul Sokolovsky
*
* Copyright (c) 2016 by Pavol Rusnak
*
* This software is provided 'as-is', without any express
* or implied warranty. In no event will the authors be
* held liable for any damages arising from the use of
* this software.
*
* Permission is granted to anyone to use this software
* for any purpose, including commercial applications,
* and to alter it and redistribute it freely, subject to
* the following restrictions:
*
* 1. The origin of this software must not be
* misrepresented; you must not claim that you
* wrote the original software. If you use this
* software in a product, an acknowledgment in
* the product documentation would be appreciated
* but is not required.
*
* 2. Altered source versions must be plainly marked
* as such, and must not be misrepresented as
* being the original software.
*
* 3. This notice may not be removed or altered from
* any source distribution.
*/
#include <stdint.h>
#ifndef SINF_WRITE
#error Must define SINF_WRITE(byte) macro
#endif
// maximum possible window size (in bits) used during compression/deflate
#define SINF_WBITS 10
#define SINF_OK 0
#define SINF_ERROR (-3)
typedef struct {
uint16_t table[16]; /* table of code length counts */
uint16_t trans[288]; /* code -> symbol translation table */
} SINF_TREE;
typedef struct {
const uint8_t *source;
uint32_t tag;
uint32_t bitcount;
uint8_t cbuf[1 << SINF_WBITS];
int cbufi;
SINF_TREE ltree; /* dynamic length/symbol tree */
SINF_TREE dtree; /* dynamic distance tree */
} SINF_DATA;
/* --------------------------------------------------- *
* -- uninitialized global data (static structures) -- *
* --------------------------------------------------- */
const uint8_t SINF_LENGTH_BITS[30] = {
0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 2, 2, 2, 2,
3, 3, 3, 3, 4, 4, 4, 4,
5, 5, 5, 5
};
const uint16_t SINF_LENGTH_BASE[30] = {
3, 4, 5, 6, 7, 8, 9, 10,
11, 13, 15, 17, 19, 23, 27, 31,
35, 43, 51, 59, 67, 83, 99, 115,
131, 163, 195, 227, 258
};
const uint8_t SINF_DIST_BITS[30] = {
0, 0, 0, 0, 1, 1, 2, 2,
3, 3, 4, 4, 5, 5, 6, 6,
7, 7, 8, 8, 9, 9, 10, 10,
11, 11, 12, 12, 13, 13
};
const uint16_t SINF_DIST_BASE[30] = {
1, 2, 3, 4, 5, 7, 9, 13,
17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073,
4097, 6145, 8193, 12289, 16385, 24577
};
/* special ordering of code length codes */
const uint8_t SINF_CLCIDX[] = {
16, 17, 18, 0, 8, 7, 9, 6,
10, 5, 11, 4, 12, 3, 13, 2,
14, 1, 15
};
/* ----------------------- *
* -- utility functions -- *
* ----------------------- */
static void sinf_write(SINF_DATA *d, uint8_t byte)
{
d->cbuf[d->cbufi] = byte;
d->cbufi = (d->cbufi + 1) % (1 << SINF_WBITS);
SINF_WRITE(byte);
}
/* build the fixed huffman trees */
static void sinf_build_fixed_trees(SINF_TREE *lt, SINF_TREE *dt)
{
int i;
/* build fixed length tree */
for (i = 0; i < 7; ++i) lt->table[i] = 0;
lt->table[7] = 24;
lt->table[8] = 152;
lt->table[9] = 112;
for (i = 0; i < 24; ++i) lt->trans[i] = 256 + i;
for (i = 0; i < 144; ++i) lt->trans[24 + i] = i;
for (i = 0; i < 8; ++i) lt->trans[24 + 144 + i] = 280 + i;
for (i = 0; i < 112; ++i) lt->trans[24 + 144 + 8 + i] = 144 + i;
/* build fixed distance tree */
for (i = 0; i < 5; ++i) dt->table[i] = 0;
dt->table[5] = 32;
for (i = 0; i < 32; ++i) dt->trans[i] = i;
}
/* given an array of code lengths, build a tree */
static void sinf_build_tree(SINF_TREE *t, const uint8_t *lengths, uint32_t num)
{
uint16_t offs[16];
uint32_t i, sum;
/* clear code length count table */
for (i = 0; i < 16; ++i) t->table[i] = 0;
/* scan symbol lengths, and sum code length counts */
for (i = 0; i < num; ++i) t->table[lengths[i]]++;
t->table[0] = 0;
/* compute offset table for distribution sort */
for (sum = 0, i = 0; i < 16; ++i)
{
offs[i] = sum;
sum += t->table[i];
}
/* create code->symbol translation table (symbols sorted by code) */
for (i = 0; i < num; ++i)
{
if (lengths[i]) t->trans[offs[lengths[i]]++] = i;
}
}
/* ---------------------- *
* -- decode functions -- *
* ---------------------- */
/* get one bit from source stream */
static int sinf_getbit(SINF_DATA *d)
{
uint32_t bit;
/* check if tag is empty */
if (!d->bitcount--)
{
/* load next tag */
d->tag = *d->source++;
d->bitcount = 7;
}
/* shift bit out of tag */
bit = d->tag & 0x01;
d->tag >>= 1;
return bit;
}
/* read a num bit value from a stream and add base */
static uint32_t sinf_read_bits(SINF_DATA *d, int num, int base)
{
uint32_t val = 0;
/* read num bits */
if (num)
{
uint32_t limit = 1 << (num);
uint32_t mask;
for (mask = 1; mask < limit; mask *= 2)
if (sinf_getbit(d)) val += mask;
}
return val + base;
}
/* given a data stream and a tree, decode a symbol */
static int sinf_decode_symbol(SINF_DATA *d, SINF_TREE *t)
{
int sum = 0, cur = 0, len = 0;
/* get more bits while code value is above sum */
do {
cur = 2*cur + sinf_getbit(d);
++len;
sum += t->table[len];
cur -= t->table[len];
} while (cur >= 0);
return t->trans[sum + cur];
}
/* given a data stream, decode dynamic trees from it */
static void sinf_decode_trees(SINF_DATA *d, SINF_TREE *lt, SINF_TREE *dt)
{
uint8_t lengths[288+32];
uint32_t hlit, hdist, hclen;
uint32_t i, num, length;
/* get 5 bits HLIT (257-286) */
hlit = sinf_read_bits(d, 5, 257);
/* get 5 bits HDIST (1-32) */
hdist = sinf_read_bits(d, 5, 1);
/* get 4 bits HCLEN (4-19) */
hclen = sinf_read_bits(d, 4, 4);
for (i = 0; i < 19; ++i) lengths[i] = 0;
/* read code lengths for code length alphabet */
for (i = 0; i < hclen; ++i)
{
/* get 3 bits code length (0-7) */
uint32_t clen = sinf_read_bits(d, 3, 0);
lengths[SINF_CLCIDX[i]] = clen;
}
/* build code length tree, temporarily use length tree */
sinf_build_tree(lt, lengths, 19);
/* decode code lengths for the dynamic trees */
for (num = 0; num < hlit + hdist; )
{
int sym = sinf_decode_symbol(d, lt);
switch (sym)
{
case 16:
/* copy previous code length 3-6 times (read 2 bits) */
{
uint8_t prev = lengths[num - 1];
for (length = sinf_read_bits(d, 2, 3); length; --length)
{
lengths[num++] = prev;
}
}
break;
case 17:
/* repeat code length 0 for 3-10 times (read 3 bits) */
for (length = sinf_read_bits(d, 3, 3); length; --length)
{
lengths[num++] = 0;
}
break;
case 18:
/* repeat code length 0 for 11-138 times (read 7 bits) */
for (length = sinf_read_bits(d, 7, 11); length; --length)
{
lengths[num++] = 0;
}
break;
default:
/* values 0-15 represent the actual code lengths */
lengths[num++] = sym;
break;
}
}
/* build dynamic trees */
sinf_build_tree(lt, lengths, hlit);
sinf_build_tree(dt, lengths + hlit, hdist);
}
/* ----------------------------- *
* -- block inflate functions -- *
* ----------------------------- */
/* given a stream and two trees, inflate a block of data */
static int sinf_inflate_block_data(SINF_DATA *d, SINF_TREE *lt, SINF_TREE *dt)
{
while (1)
{
int sym = sinf_decode_symbol(d, lt);
/* check for end of block */
if (sym == 256)
{
return SINF_OK;
}
if (sym < 256)
{
sinf_write(d, sym);
} else {
uint32_t length, offs, i;
int dist;
sym -= 257;
/* possibly get more bits from length code */
length = sinf_read_bits(d, SINF_LENGTH_BITS[sym], SINF_LENGTH_BASE[sym]);
dist = sinf_decode_symbol(d, dt);
/* possibly get more bits from distance code */
offs = sinf_read_bits(d, SINF_DIST_BITS[dist], SINF_DIST_BASE[dist]);
/* copy match */
for (i = 0; i < length; ++i)
{
sinf_write(d, d->cbuf[(d->cbufi + (1 << SINF_WBITS) - offs) % (1 << SINF_WBITS)]);
}
}
}
}
/* inflate an uncompressed block of data */
static int sinf_inflate_uncompressed_block(SINF_DATA *d)
{
uint32_t length, invlength;
uint32_t i;
/* get length */
length = d->source[1];
length = 256*length + d->source[0];
/* get one's complement of length */
invlength = d->source[3];
invlength = 256*invlength + d->source[2];
/* check length */
if (length != (~invlength & 0x0000ffff)) return SINF_ERROR;
d->source += 4;
/* copy block */
for (i = length; i; --i) sinf_write(d, *d->source++);
/* make sure we start next block on a byte boundary */
d->bitcount = 0;
return SINF_OK;
}
/* inflate a block of data compressed with fixed huffman trees */
static int sinf_inflate_fixed_block(SINF_DATA *d)
{
/* build fixed huffman trees */
sinf_build_fixed_trees(&d->ltree, &d->dtree);
/* decode block using fixed trees */
return sinf_inflate_block_data(d, &d->ltree, &d->dtree);
}
/* inflate a block of data compressed with dynamic huffman trees */
static int sinf_inflate_dynamic_block(SINF_DATA *d)
{
/* decode trees from stream */
sinf_decode_trees(d, &d->ltree, &d->dtree);
/* decode block using decoded trees */
return sinf_inflate_block_data(d, &d->ltree, &d->dtree);
}
/* ---------------------- *
* -- public functions -- *
* ---------------------- */
/* inflate stream from source */
static int sinf_inflate(uint8_t *data)
{
SINF_DATA d;
int bfinal;
/* initialise data */
d.bitcount = 0;
d.cbufi = 0;
d.source = data;
do {
uint32_t btype;
int res;
/* read final block flag */
bfinal = sinf_getbit(&d);
/* read block type (2 bits) */
btype = sinf_read_bits(&d, 2, 0);
/* decompress block */
switch (btype)
{
case 0:
/* decompress uncompressed block */
res = sinf_inflate_uncompressed_block(&d);
break;
case 1:
/* decompress block with fixed huffman trees */
res = sinf_inflate_fixed_block(&d);
break;
case 2:
/* decompress block with dynamic huffman trees */
res = sinf_inflate_dynamic_block(&d);
break;
default:
return SINF_ERROR;
}
if (res != SINF_OK) return SINF_ERROR;
} while (!bfinal);
return SINF_OK;
}

View File

@ -0,0 +1,129 @@
/*
* Copyright (c) Pavol Rusnak, SatoshiLabs
*
* Licensed under Microsoft Reference Source License (Ms-RSL)
* see LICENSE.md file for details
*/
#include STM32_HAL_H
#define CMD(X) (*((__IO uint8_t *)((uint32_t)(0x60000000))) = (X))
#define DATA(X) (*((__IO uint8_t *)((uint32_t)(0x60000000 | 0x10000))) = (X))
static void DATAS(void *bytes, int len);
void sram_init(void) {
__GPIOE_CLK_ENABLE();
__FSMC_CLK_ENABLE();
/*
// LCD_RST/PA3
GPIO_InitStructure.Pin = GPIO_PIN_3;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_InitStructure.Alternate = GPIO_AF12_FSMC;
// LCD_CS/PD7 LCD_RS/PD11 LCD_RD/PD4 LCD_WR/PD5
GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_11 | GPIO_PIN_4 | GPIO_PIN_5;
HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
// LCD_D0/PD14 LCD_D1/PD15 LCD_D2/PD0 LCD_D3/PD1
GPIO_InitStructure.Pin = GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_0 | GPIO_PIN_1;
HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
// LCD_D4/PE7 LCD_D5/PE8 LCD_D6/PE9 LCD_D7/PE10
GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
// timing values from:
// http://ele-tech.com/html/it-is-developed-that-embedded-stm32-fsmc-interface-drives-tft-lcd-to-be-designed.html
FSMC_NORSRAM_InitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAM_TimingTypeDef FSMC_NORSRAMTimingStructure;
FSMC_NORSRAMTimingStructure.AddressSetupTime = 2;
FSMC_NORSRAMTimingStructure.AddressHoldTime = 0;
FSMC_NORSRAMTimingStructure.DataSetupTime = 5;
FSMC_NORSRAMTimingStructure.BusTurnAroundDuration = 0;
FSMC_NORSRAMTimingStructure.CLKDivision = 0;
FSMC_NORSRAMTimingStructure.DataLatency = 0;
FSMC_NORSRAMTimingStructure.AccessMode = FSMC_ACCESS_MODE_B;
FSMC_NORSRAMInitStructure.NSBank = FSMC_NORSRAM_BANK1;
FSMC_NORSRAMInitStructure.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
FSMC_NORSRAMInitStructure.MemoryType = FSMC_MEMORY_TYPE_NOR;
FSMC_NORSRAMInitStructure.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_8;
FSMC_NORSRAMInitStructure.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
FSMC_NORSRAMInitStructure.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
FSMC_NORSRAMInitStructure.WrapMode = FSMC_WRAP_MODE_DISABLE;
FSMC_NORSRAMInitStructure.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
FSMC_NORSRAMInitStructure.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
FSMC_NORSRAMInitStructure.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
FSMC_NORSRAMInitStructure.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
FSMC_NORSRAMInitStructure.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
FSMC_NORSRAMInitStructure.WriteBurst = FSMC_WRITE_BURST_DISABLE;
FSMC_NORSRAMInitStructure.PageSize = FSMC_PAGE_SIZE_NONE;
FSMC_NORSRAM_Init(FSMC_NORSRAM_DEVICE, &FSMC_NORSRAMInitStructure);
FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_DEVICE, &FSMC_NORSRAMTimingStructure, FSMC_NORSRAMInitStructure.NSBank);
// FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_DEVICE, &FSMC_NORSRAMTimingStructure, FSMC_NORSRAMInitStructure.NSBank, FSMC_NORSRAMInitStructure.ExtendedMode);
__FSMC_NORSRAM_ENABLE(FSMC_NORSRAM_DEVICE, FSMC_NORSRAMInitStructure.NSBank);
}
/*
static void display_sleep(void) {
CMD(0x28); // display off
HAL_Delay(20);
CMD(0x10); // enter sleep
}
*/
static void display_unsleep(void) {
CMD(0x11); // exit sleep
HAL_Delay(20);
CMD(0x29); // display
}
static void display_init(void) {
sram_init();
CMD(0x01); // software reset
HAL_Delay(20);
CMD(0x28); // display off
CMD(0xCF); DATAS("\x00\xC1\x30", 3);
CMD(0xED); DATAS("\x64\x03\x12\x81", 4);
CMD(0xE8); DATAS("\x85\x10\x7A", 3);
CMD(0xCB); DATAS("\x39\x2C\x00\x34\x02", 5);
CMD(0xF7); DATA(0x20);
CMD(0xEA); DATAS("\x00\x00", 2);
CMD(0xC0); DATA(0x23); // power control VRH[5:0]
CMD(0xC1); DATA(0x12); // power control SAP[2:0] BT[3:0]
CMD(0xC5); DATAS("\x60\x44", 2); // vcm control 1
CMD(0xC7); DATA(0x8A); // vcm control 2
CMD(0x36); DATA(0x08); // memory access control (RGB)
CMD(0x3A); DATA(0x55); // memory access control (16-bit 565)
CMD(0xB1); DATAS("\x00\x18", 2); // framerate
CMD(0xB6); DATAS("\x0A\xA2", 2); // display function control
CMD(0xF6); DATAS("\x01\x30\x00", 3); // interface control
CMD(0xF2); DATA(0x00); // 3 gamma func disable
CMD(0x26); DATA(0x01); // gamma func enable
CMD(0xE0); DATAS("\x0F\x2F\x2C\x0B\x0F\x09\x56\xD9\x4A\x0B\x14\x05\x0C\x06\x00", 15); // gamma curve 1
CMD(0xE1); DATAS("\x00\x10\x13\x04\x10\x06\x25\x26\x3B\x04\x0B\x0A\x33\x39\x0F", 15); // gamma curve 2
CMD(0x21); // invert colors
display_unsleep();
}
static void display_set_window(uint8_t x, uint8_t y, uint8_t w, uint8_t h) {
CMD(0x2A); DATA(0); DATA(x); DATA(0); DATA(x + w - 1); // column addr set
CMD(0x2B); DATA(0); DATA(y); DATA(0); DATA(y + h - 1); // row addr set
CMD(0x2C);
}
static void display_update(void) {
}

View File

@ -0,0 +1,69 @@
/*
* Copyright (c) Pavol Rusnak, SatoshiLabs
*
* Licensed under Microsoft Reference Source License (Ms-RSL)
* see LICENSE.md file for details
*/
#include <SDL2/SDL.h>
static int SDL_inited = 0;
static SDL_Renderer *RENDERER = 0;
static SDL_Surface *SCREEN = 0;
static SDL_Texture *TEXTURE = 0;
static int DATAODD = 0;
static int POSX, POSY, SX, SY, EX, EY = 0;
static void DATA(uint8_t x) {
if (!SDL_inited) return;
if (POSX <= EX && POSY <= EY) {
((uint8_t *)SCREEN->pixels)[POSX * 2 + POSY * SCREEN->pitch + (DATAODD ^ 1)] = x;
}
DATAODD = !DATAODD;
if (DATAODD == 0) {
POSX++;
if (POSX > EX) {
POSX = SX;
POSY++;
}
}
}
static void display_init(void)
{
if (SDL_inited) return;
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
printf("SDL_Init Error: %s\n", SDL_GetError());
}
SDL_Window *win = SDL_CreateWindow("TREZOR", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, RESX, RESY, SDL_WINDOW_SHOWN);
if (!win) {
printf("SDL_CreateWindow Error: %s\n", SDL_GetError());
SDL_Quit();
}
RENDERER = SDL_CreateRenderer(win, -1, SDL_RENDERER_SOFTWARE);
if (!RENDERER) {
printf("SDL_CreateRenderer Error: %s\n", SDL_GetError());
SDL_DestroyWindow(win);
SDL_Quit();
}
SDL_RenderClear(RENDERER);
SCREEN = SDL_CreateRGBSurface(0, RESX, RESY, 16, 0xF800, 0x07E0, 0x001F, 0x0000);
TEXTURE = SDL_CreateTexture(RENDERER, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, RESX, RESY);
SDL_inited = 1;
}
static void display_set_window(uint8_t x, uint8_t y, uint8_t w, uint8_t h) {
if (!SDL_inited) return;
SX = x; SY = y;
EX = x + w - 1; EY = y + h - 1;
POSX = SX; POSY = SY;
DATAODD = 0;
}
static void display_update(void)
{
if (!SDL_inited) return;
SDL_UpdateTexture(TEXTURE, NULL, SCREEN->pixels, SCREEN->pitch);
SDL_RenderCopy(RENDERER, TEXTURE, NULL, NULL);
SDL_RenderPresent(RENDERER);
}

View File

@ -0,0 +1,222 @@
/*
* Copyright (c) Pavol Rusnak, SatoshiLabs
*
* Licensed under Microsoft Reference Source License (Ms-RSL)
* see LICENSE.md file for details
*/
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "py/nlr.h"
#include "py/runtime.h"
#include "py/binary.h"
#if MICROPY_PY_TREZORUI
#define RESX 240
#define RESY 240
#if defined STM32_HAL_H
#include "modTrezorUi-stmhal.h"
#elif defined UNIX
#include "modTrezorUi-unix.h"
#else
#error Unsupported port. Only STMHAL and UNIX ports are supported.
#endif
#define SINF_WRITE DATA
#include "modTrezorUi-inflate.h"
#include "modTrezorUi-font_roboto.h"
// common functions
static void DATAS(void *bytes, int len) {
const uint8_t *c = (const uint8_t *)bytes;
while (len-- > 0) {
DATA(*c);
c++;
}
}
static void display_bar(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t c) {
display_set_window(x, y, w, h);
int i;
for (i = 0; i < w * h; i++) {
DATA(c >> 8);
DATA(c & 0xFF);
}
display_update();
}
static void display_blit(uint8_t x, uint8_t y, uint8_t w, uint8_t h, void *data, int datalen) {
display_set_window(x, y, w, h);
DATAS(data, datalen);
display_update();
}
static void display_image(uint8_t x, uint8_t y, uint8_t w, uint8_t h, void *data, int datalen) {
display_set_window(x, y, w, h);
sinf_inflate(data);
display_update();
}
// first two bytes are width and height of the glyph
// third, fourth and fifth bytes are advance, bearingX and bearingY of the horizontal metrics of the glyph
// rest is packed 4-bit glyph data
static void display_text(uint8_t x, uint8_t y, uint8_t *text, int textlen, uint16_t fgcolor, uint16_t bgcolor) {
int i, j, xx = x;
const uint8_t *g;
uint8_t c, cr, cg, cb;
uint16_t ct[16];
// precompute color table
for (i = 0; i < 16; i++) {
cr = (((fgcolor & 0xF800) >> 11) * i + ((bgcolor & 0xF800) >> 11) * (15 - i)) / 15;
cg = (((fgcolor & 0x07E0) >> 5) * i + ((bgcolor & 0x07E0) >> 5) * (15 - i)) / 15;
cb = ((fgcolor & 0x001F) * i + (bgcolor & 0x001F) * (15 - i)) / 15;
ct[i] = (cr << 11) | (cg << 5) | cb;
}
// render glyphs
for (i = 0; i < textlen; i++) {
if (text[i] >= ' ' && text[i] <= '~') {
g = Font_Roboto_Regular_18[text[i] - ' '];
} else
// UTF-8 handling: https://en.wikipedia.org/wiki/UTF-8#Description
if (text[i] >= 0xC0) {
// bytes 11xxxxxx are first byte of UTF-8 characters
g = Font_Roboto_Regular_18['_' - ' '];
} else {
// bytes 10xxxxxx are successive UTF-8 characters
continue;
}
// g[0], g[1] = width, height
// g[2] = advance
// g[3], g[4] = bearingX, bearingY
if (g[0] && g[1]) {
display_set_window(xx + g[3], y - g[4], g[0], g[1]);
for (j = 0; j < g[0] * g[1]; j++) {
if (j % 2 == 0) {
c = g[5 + j/2] >> 4;
} else {
c = g[5 + j/2] & 0x0F;
}
DATA(ct[c] >> 8);
DATA(ct[c] & 0xFF);
}
display_update();
}
xx += g[2];
}
}
// uPy wrappers
// class Display(object):
typedef struct _mp_obj_Display_t {
mp_obj_base_t base;
} mp_obj_Display_t;
// def Display.__init__(self):
STATIC mp_obj_t mod_TrezorUi_Display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
display_init();
mp_obj_Display_t *o = m_new_obj(mp_obj_Display_t);
o->base.type = type;
return MP_OBJ_FROM_PTR(o);
}
// def Display.bar(self, x: int, y: int, w: int, h: int, color: int) -> None:
STATIC mp_obj_t mod_TrezorUi_Display_bar(size_t n_args, const mp_obj_t *args) {
mp_int_t x = mp_obj_get_int(args[1]);
mp_int_t y = mp_obj_get_int(args[2]);
mp_int_t w = mp_obj_get_int(args[3]);
mp_int_t h = mp_obj_get_int(args[4]);
uint16_t c = mp_obj_get_int(args[5]);
if ((x < 0) || (y < 0) || (x + w > RESX) || (y + h > RESY)) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Out of bounds"));
}
display_bar(x, y, w, h, c);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_TrezorUi_Display_bar_obj, 6, 6, mod_TrezorUi_Display_bar);
// def Display.blit(self, x: int, y: int, w: int, h: int, data: bytes) -> None:
STATIC mp_obj_t mod_TrezorUi_Display_blit(size_t n_args, const mp_obj_t *args) {
mp_int_t x = mp_obj_get_int(args[1]);
mp_int_t y = mp_obj_get_int(args[2]);
mp_int_t w = mp_obj_get_int(args[3]);
mp_int_t h = mp_obj_get_int(args[4]);
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(args[5], &bufinfo, MP_BUFFER_READ);
if (bufinfo.len != 2 * w * h) {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "Wrong data size (got %d bytes, expected %d bytes)", bufinfo.len, 2 * w * h));
}
display_blit(x, y, w, h, bufinfo.buf, bufinfo.len);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_TrezorUi_Display_blit_obj, 6, 6, mod_TrezorUi_Display_blit);
// def Display.image(self, x: int, y: int, image: bytes) -> None:
STATIC mp_obj_t mod_TrezorUi_Display_image(size_t n_args, const mp_obj_t *args) {
mp_int_t x = mp_obj_get_int(args[1]);
mp_int_t y = mp_obj_get_int(args[2]);
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ);
uint8_t *data = bufinfo.buf;
if (bufinfo.len < 8 || memcmp(data, "TOIa", 4) != 0) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Invalid image format"));
}
mp_int_t w = (data[4] << 8) | data[5];
mp_int_t h = (data[6] << 8) | data[7];
if ((x < 0) || (y < 0) || (x + w > RESX) || (y + h > RESY)) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Out of bounds"));
}
display_image(x, y, w, h, data + 8, bufinfo.len - 8);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_TrezorUi_Display_image_obj, 4, 4, mod_TrezorUi_Display_image);
// def Display.text(self, x: int, y: int, text: bytes, fgcolor: int, bgcolor: int) -> None:
STATIC mp_obj_t mod_TrezorUi_Display_text(size_t n_args, const mp_obj_t *args) {
mp_int_t x = mp_obj_get_int(args[1]);
mp_int_t y = mp_obj_get_int(args[2]);
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ);
mp_int_t fgcolor = mp_obj_get_int(args[4]);
mp_int_t bgcolor = mp_obj_get_int(args[5]);
display_text(x, y, bufinfo.buf, bufinfo.len, fgcolor, bgcolor);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_TrezorUi_Display_text_obj, 6, 6, mod_TrezorUi_Display_text);
STATIC const mp_rom_map_elem_t mod_TrezorUi_Display_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_bar), MP_ROM_PTR(&mod_TrezorUi_Display_bar_obj) },
{ MP_ROM_QSTR(MP_QSTR_blit), MP_ROM_PTR(&mod_TrezorUi_Display_blit_obj) },
{ MP_ROM_QSTR(MP_QSTR_image), MP_ROM_PTR(&mod_TrezorUi_Display_image_obj) },
{ MP_ROM_QSTR(MP_QSTR_text), MP_ROM_PTR(&mod_TrezorUi_Display_text_obj) },
};
STATIC MP_DEFINE_CONST_DICT(mod_TrezorUi_Display_locals_dict, mod_TrezorUi_Display_locals_dict_table);
STATIC const mp_obj_type_t mod_TrezorUi_Display_type = {
{ &mp_type_type },
.name = MP_QSTR_Display,
.make_new = mod_TrezorUi_Display_make_new,
.locals_dict = (void*)&mod_TrezorUi_Display_locals_dict,
};
STATIC const mp_rom_map_elem_t mp_module_TrezorUi_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_TrezorUi) },
{ MP_ROM_QSTR(MP_QSTR_Display), MP_ROM_PTR(&mod_TrezorUi_Display_type) },
};
STATIC MP_DEFINE_CONST_DICT(mp_module_TrezorUi_globals, mp_module_TrezorUi_globals_table);
const mp_obj_module_t mp_module_TrezorUi = {
.base = { &mp_type_module },
.name = MP_QSTR_TrezorUi,
.globals = (mp_obj_dict_t*)&mp_module_TrezorUi_globals,
};
#endif // MICROPY_PY_TREZORUI