From 83a69a03349c3a6c37d9c84577b394d2ae1c3589 Mon Sep 17 00:00:00 2001 From: Jochen Hoenicke Date: Tue, 6 Feb 2018 22:29:33 +0100 Subject: [PATCH] Added fixed-width font and multi-font support --- bootloader/bootloader.c | 16 +-- firmware/debug.c | 4 +- firmware/layout2.c | 32 ++--- firmware/pinmatrix.c | 2 +- firmware/recovery.c | 2 +- gen/font.inc | 128 +++++++++++++++++++ gen/fontfixed.inc | 128 +++++++++++++++++++ gen/fonts.c | 272 ++-------------------------------------- gen/fonts.h | 9 +- gen/fonts/fontfixed.png | Bin 0 -> 1761 bytes gen/fonts/generate.py | 29 +++-- gen/strwidth.c | 3 +- layout.c | 28 ++--- oled.c | 31 ++--- oled.h | 10 +- 15 files changed, 355 insertions(+), 339 deletions(-) create mode 100644 gen/font.inc create mode 100644 gen/fontfixed.inc create mode 100644 gen/fonts/fontfixed.png diff --git a/bootloader/bootloader.c b/bootloader/bootloader.c index 6a9e71f..2cf8988 100644 --- a/bootloader/bootloader.c +++ b/bootloader/bootloader.c @@ -105,18 +105,18 @@ void bootloader_loop(void) oledClear(); oledDrawBitmap(0, 0, &bmp_logo64); if (firmware_present()) { - oledDrawString(52, 0, "TREZOR"); + oledDrawString(52, 0, "TREZOR", FONT_STANDARD); static char serial[25]; fill_serialno_fixed(serial); - oledDrawString(52, 20, "Serial No."); - oledDrawString(52, 40, serial + 12); // second part of serial + oledDrawString(52, 20, "Serial No.", FONT_STANDARD); + oledDrawString(52, 40, serial + 12, FONT_STANDARD); // second part of serial serial[12] = 0; - oledDrawString(52, 30, serial); // first part of serial - oledDrawStringRight(OLED_WIDTH - 1, OLED_HEIGHT - 8, "Loader " VERSTR(VERSION_MAJOR) "." VERSTR(VERSION_MINOR) "." VERSTR(VERSION_PATCH)); + oledDrawString(52, 30, serial, FONT_STANDARD); // first part of serial + oledDrawStringRight(OLED_WIDTH - 1, OLED_HEIGHT - 8, "Loader " VERSTR(VERSION_MAJOR) "." VERSTR(VERSION_MINOR) "." VERSTR(VERSION_PATCH), FONT_STANDARD); } else { - oledDrawString(52, 10, "Welcome!"); - oledDrawString(52, 30, "Please visit"); - oledDrawString(52, 50, "trezor.io/start"); + oledDrawString(52, 10, "Welcome!", FONT_STANDARD); + oledDrawString(52, 30, "Please visit", FONT_STANDARD); + oledDrawString(52, 50, "trezor.io/start", FONT_STANDARD); } oledRefresh(); diff --git a/firmware/debug.c b/firmware/debug.c index a8519fd..eb27314 100644 --- a/firmware/debug.c +++ b/firmware/debug.c @@ -35,8 +35,8 @@ void oledDebug(const char *line) oledClear(); for (int i = 0; i < 8; i++) { if (lines[i]) { - oledDrawChar(0, i * 8, '0' + (id + i) % 10, 1); - oledDrawString(8, i * 8, lines[i]); + oledDrawChar(0, i * 8, '0' + (id + i) % 10, FONT_STANDARD); + oledDrawString(8, i * 8, lines[i], FONT_STANDARD); } } oledRefresh(); diff --git a/firmware/layout2.c b/firmware/layout2.c index 7852460..528205b 100644 --- a/firmware/layout2.c +++ b/firmware/layout2.c @@ -109,14 +109,14 @@ void layoutHome(void) } else { if (label && strlen(label) > 0) { oledDrawBitmap(44, 4, &bmp_logo48); - oledDrawStringCenter(OLED_HEIGHT - 8, label); + oledDrawStringCenter(OLED_HEIGHT - 8, label, FONT_STANDARD); } else { oledDrawBitmap(40, 0, &bmp_logo64); } } if (storage_needsBackup()) { oledBox(0, 0, 127, 8, false); - oledDrawStringCenter(0, "NEEDS BACKUP!"); + oledDrawStringCenter(0, "NEEDS BACKUP!", FONT_STANDARD); } oledRefresh(); @@ -316,13 +316,13 @@ void layoutResetWord(const char *word, int pass, int word_pos, bool last) oledDrawBitmap(0, 0, &bmp_icon_info); left = bmp_icon_info.width + 4; - oledDrawString(left, 0 * 9, action); - oledDrawString(left, 2 * 9, word_pos < 10 ? index_str + 1 : index_str); - oledDrawStringDouble(left, 3 * 9, word); + oledDrawString(left, 0 * 9, action, FONT_STANDARD); + oledDrawString(left, 2 * 9, word_pos < 10 ? index_str + 1 : index_str, FONT_STANDARD); + oledDrawString(left, 3 * 9, word, FONT_STANDARD | FONT_DOUBLE); oledHLine(OLED_HEIGHT - 13); - oledDrawString(OLED_WIDTH - fontCharWidth('\x06') - 1, OLED_HEIGHT - 8, "\x06"); - oledDrawString(OLED_WIDTH - oledStringWidth(btnYes) - fontCharWidth('\x06') - 3, OLED_HEIGHT - 8, btnYes); - oledInvert(OLED_WIDTH - oledStringWidth(btnYes) - fontCharWidth('\x06') - 4, OLED_HEIGHT - 9, OLED_WIDTH - 1, OLED_HEIGHT - 1); + oledDrawString(OLED_WIDTH - fontCharWidth(FONT_STANDARD, '\x06') - 1, OLED_HEIGHT - 8, "\x06", FONT_STANDARD); + oledDrawStringRight(OLED_WIDTH - fontCharWidth(FONT_STANDARD, '\x06') - 3, OLED_HEIGHT - 8, btnYes, FONT_STANDARD); + oledInvert(OLED_WIDTH - oledStringWidth(btnYes, FONT_STANDARD) - fontCharWidth(FONT_STANDARD, '\x06') - 4, OLED_HEIGHT - 9, OLED_WIDTH - 1, OLED_HEIGHT - 1); oledRefresh(); } @@ -491,24 +491,24 @@ void layoutAddress(const char *address, const char *desc, bool qrcode, bool igno uint32_t rowlen = (addrlen - 1) / (addrlen <= 40 ? 2 : addrlen <= 60 ? 3 : 4) + 1; const char **str = split_message((const uint8_t *)address, addrlen, rowlen); if (desc) { - oledDrawString(0, 0 * 9, desc); + oledDrawString(0, 0 * 9, desc, FONT_STANDARD); } for (int i = 0; i < 4; i++) { - oledDrawString(0, (i + 1) * 9 + 4, str[i]); + oledDrawString(0, (i + 1) * 9 + 4, str[i], FONT_FIXED); } - oledDrawString(0, 42, address_n_str(address_n, address_n_count)); + oledDrawString(0, 42, address_n_str(address_n, address_n_count), FONT_STANDARD); } if (!qrcode) { static const char *btnNo = _("QR Code"); - oledDrawString(2, OLED_HEIGHT - 8, btnNo); - oledInvert(0, OLED_HEIGHT - 9, oledStringWidth(btnNo) + 3, OLED_HEIGHT - 1); + oledDrawString(2, OLED_HEIGHT - 8, btnNo, FONT_STANDARD); + oledInvert(0, OLED_HEIGHT - 9, oledStringWidth(btnNo, FONT_STANDARD) + 3, OLED_HEIGHT - 1); } static const char *btnYes = _("Continue"); - oledDrawString(OLED_WIDTH - fontCharWidth('\x06') - 1, OLED_HEIGHT - 8, "\x06"); - oledDrawString(OLED_WIDTH - oledStringWidth(btnYes) - fontCharWidth('\x06') - 3, OLED_HEIGHT - 8, btnYes); - oledInvert(OLED_WIDTH - oledStringWidth(btnYes) - fontCharWidth('\x06') - 4, OLED_HEIGHT - 9, OLED_WIDTH - 1, OLED_HEIGHT - 1); + oledDrawString(OLED_WIDTH - fontCharWidth(FONT_STANDARD, '\x06') - 1, OLED_HEIGHT - 8, "\x06", FONT_STANDARD); + oledDrawStringRight(OLED_WIDTH - fontCharWidth(FONT_STANDARD, '\x06') - 3, OLED_HEIGHT - 8, btnYes, FONT_STANDARD); + oledInvert(OLED_WIDTH - oledStringWidth(btnYes, FONT_STANDARD) - fontCharWidth(FONT_STANDARD, '\x06') - 4, OLED_HEIGHT - 9, OLED_WIDTH - 1, OLED_HEIGHT - 1); oledRefresh(); } diff --git a/firmware/pinmatrix.c b/firmware/pinmatrix.c index 39f60fc..c3a5aac 100644 --- a/firmware/pinmatrix.c +++ b/firmware/pinmatrix.c @@ -39,7 +39,7 @@ void pinmatrix_draw(const char *text) // use (2 - j) instead of j to achieve 789456123 layout int k = pinmatrix_perm[i + (2 - j) * 3] - '0'; if (text) { - oledDrawStringCenter(0, text); + oledDrawStringCenter(0, text, FONT_STANDARD); } oledDrawBitmap((OLED_WIDTH - 3 * w - 2 * pad) / 2 + i * (w + pad), OLED_HEIGHT - 3 * h - 2 * pad + j * (h + pad), bmp_digits[k]); } diff --git a/firmware/recovery.c b/firmware/recovery.c index 7348748..b01e510 100644 --- a/firmware/recovery.c +++ b/firmware/recovery.c @@ -260,7 +260,7 @@ static void display_choices(bool twoColumn, char choices[9][12], int num) int x = twoColumn ? 64 * col + 32 : 42 * col + 22; int choice = word_matrix[nColumns*row + col]; const char *text = choice < num ? choices[choice] : "-"; - oledDrawString(x - oledStringWidth(text)/2, y, text); + oledDrawString(x - oledStringWidth(text, FONT_STANDARD)/2, y, text, FONT_STANDARD); if (twoColumn) { oledInvert(x - 32 + 1, y - 1, x - 32 + 63 - 1, y + 8); } else { diff --git a/gen/font.inc b/gen/font.inc new file mode 100644 index 0000000..e140895 --- /dev/null +++ b/gen/font.inc @@ -0,0 +1,128 @@ + /* 0x00 _ */ (uint8_t *)"\x01\x00", + /* 0x01 _ */ (uint8_t *)"\x01\x00", + /* 0x02 _ */ (uint8_t *)"\x01\x00", + /* 0x03 _ */ (uint8_t *)"\x01\x00", + /* 0x04 _ */ (uint8_t *)"\x01\x00", + /* 0x05 _ */ (uint8_t *)"\x01\x00", + /* 0x06 _ */ (uint8_t *)"\x07\x18\x1c\x0e\x18\x30\x40\x80", + /* 0x07 _ */ (uint8_t *)"\x01\x00", + /* 0x08 _ */ (uint8_t *)"\x01\x00", + /* 0x09 _ */ (uint8_t *)"\x01\x00", + /* 0x0a _ */ (uint8_t *)"\x01\x00", + /* 0x0b _ */ (uint8_t *)"\x01\x00", + /* 0x0c _ */ (uint8_t *)"\x01\x00", + /* 0x0d _ */ (uint8_t *)"\x01\x00", + /* 0x0e _ */ (uint8_t *)"\x01\x00", + /* 0x0f _ */ (uint8_t *)"\x01\x00", + /* 0x10 _ */ (uint8_t *)"\x01\x00", + /* 0x11 _ */ (uint8_t *)"\x01\x00", + /* 0x12 _ */ (uint8_t *)"\x01\x00", + /* 0x13 _ */ (uint8_t *)"\x01\x00", + /* 0x14 _ */ (uint8_t *)"\x01\x00", + /* 0x15 _ */ (uint8_t *)"\x07\x44\xee\x7c\x38\x7c\xee\x44", + /* 0x16 _ */ (uint8_t *)"\x01\x00", + /* 0x17 _ */ (uint8_t *)"\x01\x00", + /* 0x18 _ */ (uint8_t *)"\x01\x00", + /* 0x19 _ */ (uint8_t *)"\x01\x00", + /* 0x1a _ */ (uint8_t *)"\x01\x00", + /* 0x1b _ */ (uint8_t *)"\x01\x00", + /* 0x1c _ */ (uint8_t *)"\x01\x00", + /* 0x1d _ */ (uint8_t *)"\x01\x00", + /* 0x1e _ */ (uint8_t *)"\x01\x00", + /* 0x1f _ */ (uint8_t *)"\x01\x00", + /* 0x20 */ (uint8_t *)"\x01\x00", + /* 0x21 ! */ (uint8_t *)"\x02\xfa\xfa", + /* 0x22 " */ (uint8_t *)"\x03\xc0\x00\xc0", + /* 0x23 # */ (uint8_t *)"\x05\x6c\xfe\x6c\xfe\x6c", + /* 0x24 $ */ (uint8_t *)"\x05\x32\xff\x5a\xff\x4c", + /* 0x25 % */ (uint8_t *)"\x06\xc0\xc6\x1c\x70\xc6\x06", + /* 0x26 & */ (uint8_t *)"\x06\x5c\xfe\xb2\xfe\x4c\x1e", + /* 0x27 ' */ (uint8_t *)"\x01\xc0", + /* 0x28 ( */ (uint8_t *)"\x03\x38\x7c\x82", + /* 0x29 ) */ (uint8_t *)"\x03\x82\x7c\x38", + /* 0x2a * */ (uint8_t *)"\x05\x6c\x38\xfe\x38\x6c", + /* 0x2b + */ (uint8_t *)"\x05\x10\x10\x7c\x10\x10", + /* 0x2c , */ (uint8_t *)"\x02\x03\x06", + /* 0x2d - */ (uint8_t *)"\x04\x10\x10\x10\x10", + /* 0x2e . */ (uint8_t *)"\x02\x06\x06", + /* 0x2f / */ (uint8_t *)"\x03\x0e\x38\xe0", + /* 0x30 0 */ (uint8_t *)"\x05\x7c\xfe\x82\xfe\x7c", + /* 0x31 1 */ (uint8_t *)"\x03\x40\xfe\xfe", + /* 0x32 2 */ (uint8_t *)"\x05\x8e\x9e\x92\xf2\x62", + /* 0x33 3 */ (uint8_t *)"\x05\x82\x92\x92\xfe\x6c", + /* 0x34 4 */ (uint8_t *)"\x05\x18\x28\x48\xfe\xfe", + /* 0x35 5 */ (uint8_t *)"\x05\xe2\xa2\xa2\xbe\x1c", + /* 0x36 6 */ (uint8_t *)"\x05\x7c\xfe\xa2\xbe\x1c", + /* 0x37 7 */ (uint8_t *)"\x05\x80\x8e\xbe\xf0\xc0", + /* 0x38 8 */ (uint8_t *)"\x05\x6c\xfe\x92\xfe\x6c", + /* 0x39 9 */ (uint8_t *)"\x05\x70\xfa\x8a\xfe\x7c", + /* 0x3a : */ (uint8_t *)"\x02\x36\x36", + /* 0x3b ; */ (uint8_t *)"\x02\x33\x36", + /* 0x3c < */ (uint8_t *)"\x04\x10\x38\x6c\xc6", + /* 0x3d = */ (uint8_t *)"\x04\x28\x28\x28\x28", + /* 0x3e > */ (uint8_t *)"\x04\xc6\x6c\x38\x10", + /* 0x3f ? */ (uint8_t *)"\x05\x80\x9a\xba\xe0\x40", + /* 0x40 @ */ (uint8_t *)"\x06\x7c\xfe\xaa\xba\xfa\x78", + /* 0x41 A */ (uint8_t *)"\x05\x7e\xfe\x88\xfe\x7e", + /* 0x42 B */ (uint8_t *)"\x05\xfe\xfe\xa2\xfe\x5c", + /* 0x43 C */ (uint8_t *)"\x05\x7c\xfe\x82\x82\x82", + /* 0x44 D */ (uint8_t *)"\x05\xfe\xfe\x82\xfe\x7c", + /* 0x45 E */ (uint8_t *)"\x05\xfe\xfe\xa2\xa2\x82", + /* 0x46 F */ (uint8_t *)"\x05\xfe\xfe\xa0\xa0\x80", + /* 0x47 G */ (uint8_t *)"\x05\x7c\xfe\x82\x9e\x1e", + /* 0x48 H */ (uint8_t *)"\x05\xfe\xfe\x20\xfe\xfe", + /* 0x49 I */ (uint8_t *)"\x02\xfe\xfe", + /* 0x4a J */ (uint8_t *)"\x04\x02\x02\xfe\xfc", + /* 0x4b K */ (uint8_t *)"\x06\xfe\xfe\x38\x6c\xc6\x82", + /* 0x4c L */ (uint8_t *)"\x04\xfe\xfe\x02\x02", + /* 0x4d M */ (uint8_t *)"\x07\xfe\x7e\x30\x18\x30\x7e\xfe", + /* 0x4e N */ (uint8_t *)"\x06\xfe\x7e\x30\x18\xfc\xfe", + /* 0x4f O */ (uint8_t *)"\x06\x7c\xfe\x82\x82\xfe\x7c", + /* 0x50 P */ (uint8_t *)"\x05\xfe\xfe\x88\xf8\x70", + /* 0x51 Q */ (uint8_t *)"\x06\x7c\xfe\x82\x86\xff\x7d", + /* 0x52 R */ (uint8_t *)"\x05\xfe\xfe\x88\xfe\x72", + /* 0x53 S */ (uint8_t *)"\x04\x62\xf2\x9e\x8c", + /* 0x54 T */ (uint8_t *)"\x06\x80\x80\xfe\xfe\x80\x80", + /* 0x55 U */ (uint8_t *)"\x05\xfc\xfe\x02\xfe\xfc", + /* 0x56 V */ (uint8_t *)"\x06\xe0\xf8\x1e\x1e\xf8\xe0", + /* 0x57 W */ (uint8_t *)"\x07\xf0\xfe\x1e\x3c\x1e\xfe\xf0", + /* 0x58 X */ (uint8_t *)"\x06\xc6\xee\x38\x38\xee\xc6", + /* 0x59 Y */ (uint8_t *)"\x06\xc0\xe0\x3e\x3e\xe0\xc0", + /* 0x5a Z */ (uint8_t *)"\x05\x8e\x9e\xba\xf2\xe2", + /* 0x5b [ */ (uint8_t *)"\x03\xfe\xfe\x82", + /* 0x5c \ */ (uint8_t *)"\x03\xe0\x38\x0e", + /* 0x5d ] */ (uint8_t *)"\x03\x82\xfe\xfe", + /* 0x5e ^ */ (uint8_t *)"\x03\x60\xc0\x60", + /* 0x5f _ */ (uint8_t *)"\x06\x02\x02\x02\x02\x02\x02", + /* 0x60 ` */ (uint8_t *)"\x02\x80\x40", + /* 0x61 a */ (uint8_t *)"\x05\x04\x2e\x2a\x3e\x1e", + /* 0x62 b */ (uint8_t *)"\x05\xfe\xfe\x22\x3e\x1c", + /* 0x63 c */ (uint8_t *)"\x05\x1c\x3e\x22\x36\x14", + /* 0x64 d */ (uint8_t *)"\x05\x1c\x3e\x22\xfe\xfe", + /* 0x65 e */ (uint8_t *)"\x05\x1c\x3e\x2a\x3a\x1a", + /* 0x66 f */ (uint8_t *)"\x03\x7e\xfe\xa0", + /* 0x67 g */ (uint8_t *)"\x05\x18\x3d\x25\x3f\x3e", + /* 0x68 h */ (uint8_t *)"\x05\xfe\xfe\x20\x3e\x1e", + /* 0x69 i */ (uint8_t *)"\x02\xbe\xbe", + /* 0x6a j */ (uint8_t *)"\x03\x01\xbf\xbe", + /* 0x6b k */ (uint8_t *)"\x05\xfe\xfe\x1c\x36\x22", + /* 0x6c l */ (uint8_t *)"\x02\xfe\xfe", + /* 0x6d m */ (uint8_t *)"\x08\x3e\x3e\x20\x3e\x3e\x20\x3e\x1e", + /* 0x6e n */ (uint8_t *)"\x05\x3e\x3e\x20\x3e\x1e", + /* 0x6f o */ (uint8_t *)"\x05\x1c\x3e\x22\x3e\x1c", + /* 0x70 p */ (uint8_t *)"\x05\x3f\x3f\x24\x3c\x18", + /* 0x71 q */ (uint8_t *)"\x05\x18\x3c\x24\x3f\x3f", + /* 0x72 r */ (uint8_t *)"\x04\x3e\x3e\x10\x30", + /* 0x73 s */ (uint8_t *)"\x04\x1a\x3a\x2e\x2c", + /* 0x74 t */ (uint8_t *)"\x03\xfc\xfe\x22", + /* 0x75 u */ (uint8_t *)"\x05\x3c\x3e\x02\x3e\x3e", + /* 0x76 v */ (uint8_t *)"\x05\x30\x3c\x0e\x3c\x30", + /* 0x77 w */ (uint8_t *)"\x07\x38\x3e\x06\x1c\x06\x3e\x38", + /* 0x78 x */ (uint8_t *)"\x05\x36\x3e\x08\x3e\x36", + /* 0x79 y */ (uint8_t *)"\x05\x38\x3d\x05\x3f\x3e", + /* 0x7a z */ (uint8_t *)"\x05\x26\x2e\x3a\x32\x22", + /* 0x7b { */ (uint8_t *)"\x04\x10\x7c\xee\x82", + /* 0x7c | */ (uint8_t *)"\x02\xff\xff", + /* 0x7d } */ (uint8_t *)"\x04\x82\xee\x7c\x10", + /* 0x7e ~ */ (uint8_t *)"\x04\x08\x10\x08\x10", + /* 0x7f _ */ (uint8_t *)"\x01\x00", diff --git a/gen/fontfixed.inc b/gen/fontfixed.inc new file mode 100644 index 0000000..747f190 --- /dev/null +++ b/gen/fontfixed.inc @@ -0,0 +1,128 @@ + /* 0x00 _ */ (uint8_t *)"\x01\x00", + /* 0x01 _ */ (uint8_t *)"\x01\x00", + /* 0x02 _ */ (uint8_t *)"\x01\x00", + /* 0x03 _ */ (uint8_t *)"\x01\x00", + /* 0x04 _ */ (uint8_t *)"\x01\x00", + /* 0x05 _ */ (uint8_t *)"\x01\x00", + /* 0x06 _ */ (uint8_t *)"\x07\x18\x1c\x0e\x18\x30\x40\x80", + /* 0x07 _ */ (uint8_t *)"\x01\x00", + /* 0x08 _ */ (uint8_t *)"\x01\x00", + /* 0x09 _ */ (uint8_t *)"\x01\x00", + /* 0x0a _ */ (uint8_t *)"\x01\x00", + /* 0x0b _ */ (uint8_t *)"\x01\x00", + /* 0x0c _ */ (uint8_t *)"\x01\x00", + /* 0x0d _ */ (uint8_t *)"\x01\x00", + /* 0x0e _ */ (uint8_t *)"\x01\x00", + /* 0x0f _ */ (uint8_t *)"\x01\x00", + /* 0x10 _ */ (uint8_t *)"\x01\x00", + /* 0x11 _ */ (uint8_t *)"\x01\x00", + /* 0x12 _ */ (uint8_t *)"\x01\x00", + /* 0x13 _ */ (uint8_t *)"\x01\x00", + /* 0x14 _ */ (uint8_t *)"\x01\x00", + /* 0x15 _ */ (uint8_t *)"\x07\x44\xee\x7c\x38\x7c\xee\x44", + /* 0x16 _ */ (uint8_t *)"\x01\x00", + /* 0x17 _ */ (uint8_t *)"\x01\x00", + /* 0x18 _ */ (uint8_t *)"\x01\x00", + /* 0x19 _ */ (uint8_t *)"\x01\x00", + /* 0x1a _ */ (uint8_t *)"\x01\x00", + /* 0x1b _ */ (uint8_t *)"\x01\x00", + /* 0x1c _ */ (uint8_t *)"\x01\x00", + /* 0x1d _ */ (uint8_t *)"\x01\x00", + /* 0x1e _ */ (uint8_t *)"\x01\x00", + /* 0x1f _ */ (uint8_t *)"\x01\x00", + /* 0x20 */ (uint8_t *)"\x01\x00", + /* 0x21 ! */ (uint8_t *)"\x03\x60\xfa\x60", + /* 0x22 " */ (uint8_t *)"\x05\x00\xe0\x00\xe0\x00", + /* 0x23 # */ (uint8_t *)"\x05\x6c\xfe\x6c\xfe\x6c", + /* 0x24 $ */ (uint8_t *)"\x05\x32\xff\x5a\xff\x4c", + /* 0x25 % */ (uint8_t *)"\x05\xc2\xcc\x10\x66\x86", + /* 0x26 & */ (uint8_t *)"\x05\x5c\xa2\xb2\x4c\x1a", + /* 0x27 ' */ (uint8_t *)"\x05\x00\x00\xe0\x00\x00", + /* 0x28 ( */ (uint8_t *)"\x03\x38\x44\x82", + /* 0x29 ) */ (uint8_t *)"\x03\x82\x44\x38", + /* 0x2a * */ (uint8_t *)"\x05\x44\x28\xfe\x28\x44", + /* 0x2b + */ (uint8_t *)"\x05\x10\x10\x7c\x10\x10", + /* 0x2c , */ (uint8_t *)"\x03\x01\x06\x00", + /* 0x2d - */ (uint8_t *)"\x04\x10\x10\x10\x10", + /* 0x2e . */ (uint8_t *)"\x03\x00\x02\x00", + /* 0x2f / */ (uint8_t *)"\x03\x06\x38\xc0", + /* 0x30 0 */ (uint8_t *)"\x05\x7c\x82\x92\x82\x7c", + /* 0x31 1 */ (uint8_t *)"\x05\x00\x42\xfe\x02\x00", + /* 0x32 2 */ (uint8_t *)"\x05\x42\x86\x8a\x92\x62", + /* 0x33 3 */ (uint8_t *)"\x05\x44\x82\x92\x92\x6c", + /* 0x34 4 */ (uint8_t *)"\x05\x18\x28\x48\x88\xfe", + /* 0x35 5 */ (uint8_t *)"\x05\xf4\x92\x92\x92\x8c", + /* 0x36 6 */ (uint8_t *)"\x05\x7c\x92\x92\x92\x4c", + /* 0x37 7 */ (uint8_t *)"\x05\x80\x80\x8e\xb0\xc0", + /* 0x38 8 */ (uint8_t *)"\x05\x6c\x92\x92\x92\x6c", + /* 0x39 9 */ (uint8_t *)"\x05\x64\x92\x92\x92\x7c", + /* 0x3a : */ (uint8_t *)"\x03\x00\x24\x00", + /* 0x3b ; */ (uint8_t *)"\x03\x01\x26\x00", + /* 0x3c < */ (uint8_t *)"\x04\x10\x28\x44\x82", + /* 0x3d = */ (uint8_t *)"\x04\x28\x28\x28\x28", + /* 0x3e > */ (uint8_t *)"\x04\x82\x44\x28\x10", + /* 0x3f ? */ (uint8_t *)"\x05\x40\x80\x9a\xa0\x40", + /* 0x40 @ */ (uint8_t *)"\x05\x7c\x82\x9a\xaa\x72", + /* 0x41 A */ (uint8_t *)"\x05\x7e\x90\x90\x90\x7e", + /* 0x42 B */ (uint8_t *)"\x05\xfe\x92\x92\x92\x6c", + /* 0x43 C */ (uint8_t *)"\x05\x7c\x82\x82\x82\x44", + /* 0x44 D */ (uint8_t *)"\x05\xfe\x82\x82\x82\x7c", + /* 0x45 E */ (uint8_t *)"\x05\xfe\x92\x92\x92\x82", + /* 0x46 F */ (uint8_t *)"\x05\xfe\x90\x90\x90\x80", + /* 0x47 G */ (uint8_t *)"\x05\x7c\x82\x82\x92\x5c", + /* 0x48 H */ (uint8_t *)"\x05\xfe\x10\x10\x10\xfe", + /* 0x49 I */ (uint8_t *)"\x03\x82\xfe\x82", + /* 0x4a J */ (uint8_t *)"\x05\x04\x02\x02\x82\xfc", + /* 0x4b K */ (uint8_t *)"\x05\xfe\x10\x28\x44\x82", + /* 0x4c L */ (uint8_t *)"\x05\xfe\x02\x02\x02\x02", + /* 0x4d M */ (uint8_t *)"\x05\xfe\x40\x30\x40\xfe", + /* 0x4e N */ (uint8_t *)"\x05\xfe\x40\x38\x04\xfe", + /* 0x4f O */ (uint8_t *)"\x05\x7c\x82\x82\x82\x7c", + /* 0x50 P */ (uint8_t *)"\x05\xfe\x90\x90\x90\x60", + /* 0x51 Q */ (uint8_t *)"\x05\x7c\x82\x8a\x84\x7a", + /* 0x52 R */ (uint8_t *)"\x05\xfe\x90\x98\x94\x62", + /* 0x53 S */ (uint8_t *)"\x05\x64\x92\x92\x92\x4c", + /* 0x54 T */ (uint8_t *)"\x05\x80\x80\xfe\x80\x80", + /* 0x55 U */ (uint8_t *)"\x05\xfc\x02\x02\x02\xfc", + /* 0x56 V */ (uint8_t *)"\x05\xe0\x18\x06\x18\xe0", + /* 0x57 W */ (uint8_t *)"\x05\xfc\x02\x1c\x02\xfc", + /* 0x58 X */ (uint8_t *)"\x05\xc6\x28\x10\x28\xc6", + /* 0x59 Y */ (uint8_t *)"\x05\xc0\x20\x1e\x20\xc0", + /* 0x5a Z */ (uint8_t *)"\x05\x86\x8a\x92\xa2\xc2", + /* 0x5b [ */ (uint8_t *)"\x03\xfe\x82\x82", + /* 0x5c \ */ (uint8_t *)"\x03\xe0\x38\x0e", + /* 0x5d ] */ (uint8_t *)"\x03\x82\x82\xfe", + /* 0x5e ^ */ (uint8_t *)"\x03\x60\xc0\x60", + /* 0x5f _ */ (uint8_t *)"\x05\x02\x02\x02\x02\x02", + /* 0x60 ` */ (uint8_t *)"\x05\x00\x80\x40\x20\x00", + /* 0x61 a */ (uint8_t *)"\x05\x04\x2a\x2a\x2a\x1e", + /* 0x62 b */ (uint8_t *)"\x05\xfe\x22\x22\x22\x1c", + /* 0x63 c */ (uint8_t *)"\x05\x1c\x22\x22\x22\x14", + /* 0x64 d */ (uint8_t *)"\x05\x1c\x22\x22\x22\xfe", + /* 0x65 e */ (uint8_t *)"\x05\x1c\x2a\x2a\x2a\x1a", + /* 0x66 f */ (uint8_t *)"\x05\x00\x10\x7e\x90\x40", + /* 0x67 g */ (uint8_t *)"\x05\x18\x25\x25\x25\x3e", + /* 0x68 h */ (uint8_t *)"\x05\xfe\x20\x20\x20\x1e", + /* 0x69 i */ (uint8_t *)"\x05\x00\x22\xbe\x02\x00", + /* 0x6a j */ (uint8_t *)"\x05\x02\x21\xbe\x00\x00", + /* 0x6b k */ (uint8_t *)"\x05\xfe\x08\x14\x22\x00", + /* 0x6c l */ (uint8_t *)"\x05\x00\x82\xfe\x02\x00", + /* 0x6d m */ (uint8_t *)"\x05\x3e\x20\x1e\x20\x1e", + /* 0x6e n */ (uint8_t *)"\x05\x3e\x20\x20\x20\x1e", + /* 0x6f o */ (uint8_t *)"\x05\x1c\x22\x22\x22\x1c", + /* 0x70 p */ (uint8_t *)"\x05\x3f\x24\x24\x24\x18", + /* 0x71 q */ (uint8_t *)"\x05\x18\x24\x24\x24\x3f", + /* 0x72 r */ (uint8_t *)"\x05\x3e\x10\x20\x20\x10", + /* 0x73 s */ (uint8_t *)"\x05\x12\x2a\x2a\x2a\x24", + /* 0x74 t */ (uint8_t *)"\x05\x00\x20\xfc\x22\x02", + /* 0x75 u */ (uint8_t *)"\x05\x3c\x02\x02\x02\x3e", + /* 0x76 v */ (uint8_t *)"\x05\x30\x0c\x02\x0c\x30", + /* 0x77 w */ (uint8_t *)"\x05\x3c\x02\x0c\x02\x3c", + /* 0x78 x */ (uint8_t *)"\x05\x22\x36\x08\x36\x22", + /* 0x79 y */ (uint8_t *)"\x05\x38\x05\x05\x05\x3e", + /* 0x7a z */ (uint8_t *)"\x05\x22\x26\x2a\x32\x22", + /* 0x7b { */ (uint8_t *)"\x04\x10\x7c\xee\x82", + /* 0x7c | */ (uint8_t *)"\x03\x00\xfe\x00", + /* 0x7d } */ (uint8_t *)"\x04\x82\xee\x7c\x10", + /* 0x7e ~ */ (uint8_t *)"\x05\x18\x20\x10\x08\x30", + /* 0x7f _ */ (uint8_t *)"\x01\x00", diff --git a/gen/fonts.c b/gen/fonts.c index a9f23df..68deb54 100644 --- a/gen/fonts.c +++ b/gen/fonts.c @@ -1,268 +1,18 @@ #include "fonts.h" -const uint8_t * const font_data[256] = { - /* 0x00 _ */ (uint8_t *)"\x01\x00", - /* 0x01 _ */ (uint8_t *)"\x01\x00", - /* 0x02 _ */ (uint8_t *)"\x01\x00", - /* 0x03 _ */ (uint8_t *)"\x01\x00", - /* 0x04 _ */ (uint8_t *)"\x01\x00", - /* 0x05 _ */ (uint8_t *)"\x01\x00", - /* 0x06 _ */ (uint8_t *)"\x07\x18\x1c\x0e\x18\x30\x40\x80", - /* 0x07 _ */ (uint8_t *)"\x01\x00", - /* 0x08 _ */ (uint8_t *)"\x01\x00", - /* 0x09 _ */ (uint8_t *)"\x01\x00", - /* 0x0a _ */ (uint8_t *)"\x01\x00", - /* 0x0b _ */ (uint8_t *)"\x01\x00", - /* 0x0c _ */ (uint8_t *)"\x01\x00", - /* 0x0d _ */ (uint8_t *)"\x01\x00", - /* 0x0e _ */ (uint8_t *)"\x01\x00", - /* 0x0f _ */ (uint8_t *)"\x01\x00", - /* 0x10 _ */ (uint8_t *)"\x01\x00", - /* 0x11 _ */ (uint8_t *)"\x01\x00", - /* 0x12 _ */ (uint8_t *)"\x01\x00", - /* 0x13 _ */ (uint8_t *)"\x01\x00", - /* 0x14 _ */ (uint8_t *)"\x01\x00", - /* 0x15 _ */ (uint8_t *)"\x07\x44\xee\x7c\x38\x7c\xee\x44", - /* 0x16 _ */ (uint8_t *)"\x01\x00", - /* 0x17 _ */ (uint8_t *)"\x01\x00", - /* 0x18 _ */ (uint8_t *)"\x01\x00", - /* 0x19 _ */ (uint8_t *)"\x01\x00", - /* 0x1a _ */ (uint8_t *)"\x01\x00", - /* 0x1b _ */ (uint8_t *)"\x01\x00", - /* 0x1c _ */ (uint8_t *)"\x01\x00", - /* 0x1d _ */ (uint8_t *)"\x01\x00", - /* 0x1e _ */ (uint8_t *)"\x01\x00", - /* 0x1f _ */ (uint8_t *)"\x01\x00", - /* 0x20 */ (uint8_t *)"\x01\x00", - /* 0x21 ! */ (uint8_t *)"\x02\xfa\xfa", - /* 0x22 " */ (uint8_t *)"\x03\xc0\x00\xc0", - /* 0x23 # */ (uint8_t *)"\x05\x6c\xfe\x6c\xfe\x6c", - /* 0x24 $ */ (uint8_t *)"\x05\x32\xff\x5a\xff\x4c", - /* 0x25 % */ (uint8_t *)"\x06\xc0\xc6\x1c\x70\xc6\x06", - /* 0x26 & */ (uint8_t *)"\x06\x5c\xfe\xb2\xfe\x4c\x1e", - /* 0x27 ' */ (uint8_t *)"\x01\xc0", - /* 0x28 ( */ (uint8_t *)"\x03\x38\x7c\x82", - /* 0x29 ) */ (uint8_t *)"\x03\x82\x7c\x38", - /* 0x2a * */ (uint8_t *)"\x05\x6c\x38\xfe\x38\x6c", - /* 0x2b + */ (uint8_t *)"\x05\x10\x10\x7c\x10\x10", - /* 0x2c , */ (uint8_t *)"\x02\x03\x06", - /* 0x2d - */ (uint8_t *)"\x04\x10\x10\x10\x10", - /* 0x2e . */ (uint8_t *)"\x02\x06\x06", - /* 0x2f / */ (uint8_t *)"\x03\x0e\x38\xe0", - /* 0x30 0 */ (uint8_t *)"\x05\x7c\xfe\x82\xfe\x7c", - /* 0x31 1 */ (uint8_t *)"\x03\x40\xfe\xfe", - /* 0x32 2 */ (uint8_t *)"\x05\x8e\x9e\x92\xf2\x62", - /* 0x33 3 */ (uint8_t *)"\x05\x82\x92\x92\xfe\x6c", - /* 0x34 4 */ (uint8_t *)"\x05\x18\x28\x48\xfe\xfe", - /* 0x35 5 */ (uint8_t *)"\x05\xe2\xa2\xa2\xbe\x1c", - /* 0x36 6 */ (uint8_t *)"\x05\x7c\xfe\xa2\xbe\x1c", - /* 0x37 7 */ (uint8_t *)"\x05\x80\x8e\xbe\xf0\xc0", - /* 0x38 8 */ (uint8_t *)"\x05\x6c\xfe\x92\xfe\x6c", - /* 0x39 9 */ (uint8_t *)"\x05\x70\xfa\x8a\xfe\x7c", - /* 0x3a : */ (uint8_t *)"\x02\x36\x36", - /* 0x3b ; */ (uint8_t *)"\x02\x33\x36", - /* 0x3c < */ (uint8_t *)"\x04\x10\x38\x6c\xc6", - /* 0x3d = */ (uint8_t *)"\x04\x28\x28\x28\x28", - /* 0x3e > */ (uint8_t *)"\x04\xc6\x6c\x38\x10", - /* 0x3f ? */ (uint8_t *)"\x05\x80\x9a\xba\xe0\x40", - /* 0x40 @ */ (uint8_t *)"\x06\x7c\xfe\xaa\xba\xfa\x78", - /* 0x41 A */ (uint8_t *)"\x05\x7e\xfe\x88\xfe\x7e", - /* 0x42 B */ (uint8_t *)"\x05\xfe\xfe\xa2\xfe\x5c", - /* 0x43 C */ (uint8_t *)"\x05\x7c\xfe\x82\x82\x82", - /* 0x44 D */ (uint8_t *)"\x05\xfe\xfe\x82\xfe\x7c", - /* 0x45 E */ (uint8_t *)"\x05\xfe\xfe\xa2\xa2\x82", - /* 0x46 F */ (uint8_t *)"\x05\xfe\xfe\xa0\xa0\x80", - /* 0x47 G */ (uint8_t *)"\x05\x7c\xfe\x82\x9e\x1e", - /* 0x48 H */ (uint8_t *)"\x05\xfe\xfe\x20\xfe\xfe", - /* 0x49 I */ (uint8_t *)"\x02\xfe\xfe", - /* 0x4a J */ (uint8_t *)"\x04\x02\x02\xfe\xfc", - /* 0x4b K */ (uint8_t *)"\x06\xfe\xfe\x38\x6c\xc6\x82", - /* 0x4c L */ (uint8_t *)"\x04\xfe\xfe\x02\x02", - /* 0x4d M */ (uint8_t *)"\x07\xfe\x7e\x30\x18\x30\x7e\xfe", - /* 0x4e N */ (uint8_t *)"\x06\xfe\x7e\x30\x18\xfc\xfe", - /* 0x4f O */ (uint8_t *)"\x06\x7c\xfe\x82\x82\xfe\x7c", - /* 0x50 P */ (uint8_t *)"\x05\xfe\xfe\x88\xf8\x70", - /* 0x51 Q */ (uint8_t *)"\x06\x7c\xfe\x82\x86\xff\x7d", - /* 0x52 R */ (uint8_t *)"\x05\xfe\xfe\x88\xfe\x72", - /* 0x53 S */ (uint8_t *)"\x04\x62\xf2\x9e\x8c", - /* 0x54 T */ (uint8_t *)"\x06\x80\x80\xfe\xfe\x80\x80", - /* 0x55 U */ (uint8_t *)"\x05\xfc\xfe\x02\xfe\xfc", - /* 0x56 V */ (uint8_t *)"\x06\xe0\xf8\x1e\x1e\xf8\xe0", - /* 0x57 W */ (uint8_t *)"\x07\xf0\xfe\x1e\x3c\x1e\xfe\xf0", - /* 0x58 X */ (uint8_t *)"\x06\xc6\xee\x38\x38\xee\xc6", - /* 0x59 Y */ (uint8_t *)"\x06\xc0\xe0\x3e\x3e\xe0\xc0", - /* 0x5a Z */ (uint8_t *)"\x05\x8e\x9e\xba\xf2\xe2", - /* 0x5b [ */ (uint8_t *)"\x03\xfe\xfe\x82", - /* 0x5c \ */ (uint8_t *)"\x03\xe0\x38\x0e", - /* 0x5d ] */ (uint8_t *)"\x03\x82\xfe\xfe", - /* 0x5e ^ */ (uint8_t *)"\x03\x60\xc0\x60", - /* 0x5f _ */ (uint8_t *)"\x06\x02\x02\x02\x02\x02\x02", - /* 0x60 ` */ (uint8_t *)"\x02\x80\x40", - /* 0x61 a */ (uint8_t *)"\x05\x04\x2e\x2a\x3e\x1e", - /* 0x62 b */ (uint8_t *)"\x05\xfe\xfe\x22\x3e\x1c", - /* 0x63 c */ (uint8_t *)"\x05\x1c\x3e\x22\x36\x14", - /* 0x64 d */ (uint8_t *)"\x05\x1c\x3e\x22\xfe\xfe", - /* 0x65 e */ (uint8_t *)"\x05\x1c\x3e\x2a\x3a\x1a", - /* 0x66 f */ (uint8_t *)"\x03\x7e\xfe\xa0", - /* 0x67 g */ (uint8_t *)"\x05\x18\x3d\x25\x3f\x3e", - /* 0x68 h */ (uint8_t *)"\x05\xfe\xfe\x20\x3e\x1e", - /* 0x69 i */ (uint8_t *)"\x02\xbe\xbe", - /* 0x6a j */ (uint8_t *)"\x03\x01\xbf\xbe", - /* 0x6b k */ (uint8_t *)"\x05\xfe\xfe\x1c\x36\x22", - /* 0x6c l */ (uint8_t *)"\x02\xfe\xfe", - /* 0x6d m */ (uint8_t *)"\x08\x3e\x3e\x20\x3e\x3e\x20\x3e\x1e", - /* 0x6e n */ (uint8_t *)"\x05\x3e\x3e\x20\x3e\x1e", - /* 0x6f o */ (uint8_t *)"\x05\x1c\x3e\x22\x3e\x1c", - /* 0x70 p */ (uint8_t *)"\x05\x3f\x3f\x24\x3c\x18", - /* 0x71 q */ (uint8_t *)"\x05\x18\x3c\x24\x3f\x3f", - /* 0x72 r */ (uint8_t *)"\x04\x3e\x3e\x10\x30", - /* 0x73 s */ (uint8_t *)"\x04\x1a\x3a\x2e\x2c", - /* 0x74 t */ (uint8_t *)"\x03\xfc\xfe\x22", - /* 0x75 u */ (uint8_t *)"\x05\x3c\x3e\x02\x3e\x3e", - /* 0x76 v */ (uint8_t *)"\x05\x30\x3c\x0e\x3c\x30", - /* 0x77 w */ (uint8_t *)"\x07\x38\x3e\x06\x1c\x06\x3e\x38", - /* 0x78 x */ (uint8_t *)"\x05\x36\x3e\x08\x3e\x36", - /* 0x79 y */ (uint8_t *)"\x05\x38\x3d\x05\x3f\x3e", - /* 0x7a z */ (uint8_t *)"\x05\x26\x2e\x3a\x32\x22", - /* 0x7b { */ (uint8_t *)"\x04\x10\x7c\xee\x82", - /* 0x7c | */ (uint8_t *)"\x02\xff\xff", - /* 0x7d } */ (uint8_t *)"\x04\x82\xee\x7c\x10", - /* 0x7e ~ */ (uint8_t *)"\x04\x08\x10\x08\x10", - /* 0x7f _ */ (uint8_t *)"\x01\x00", - /* 0x80 _ */ (uint8_t *)"\x01\x00", - /* 0x81 _ */ (uint8_t *)"\x01\x00", - /* 0x82 _ */ (uint8_t *)"\x01\x00", - /* 0x83 _ */ (uint8_t *)"\x01\x00", - /* 0x84 _ */ (uint8_t *)"\x01\x00", - /* 0x85 _ */ (uint8_t *)"\x01\x00", - /* 0x86 _ */ (uint8_t *)"\x01\x00", - /* 0x87 _ */ (uint8_t *)"\x01\x00", - /* 0x88 _ */ (uint8_t *)"\x01\x00", - /* 0x89 _ */ (uint8_t *)"\x01\x00", - /* 0x8a _ */ (uint8_t *)"\x01\x00", - /* 0x8b _ */ (uint8_t *)"\x01\x00", - /* 0x8c _ */ (uint8_t *)"\x01\x00", - /* 0x8d _ */ (uint8_t *)"\x01\x00", - /* 0x8e _ */ (uint8_t *)"\x01\x00", - /* 0x8f _ */ (uint8_t *)"\x01\x00", - /* 0x90 _ */ (uint8_t *)"\x01\x00", - /* 0x91 _ */ (uint8_t *)"\x01\x00", - /* 0x92 _ */ (uint8_t *)"\x01\x00", - /* 0x93 _ */ (uint8_t *)"\x01\x00", - /* 0x94 _ */ (uint8_t *)"\x01\x00", - /* 0x95 _ */ (uint8_t *)"\x01\x00", - /* 0x96 _ */ (uint8_t *)"\x01\x00", - /* 0x97 _ */ (uint8_t *)"\x01\x00", - /* 0x98 _ */ (uint8_t *)"\x01\x00", - /* 0x99 _ */ (uint8_t *)"\x01\x00", - /* 0x9a _ */ (uint8_t *)"\x01\x00", - /* 0x9b _ */ (uint8_t *)"\x01\x00", - /* 0x9c _ */ (uint8_t *)"\x01\x00", - /* 0x9d _ */ (uint8_t *)"\x01\x00", - /* 0x9e _ */ (uint8_t *)"\x01\x00", - /* 0x9f _ */ (uint8_t *)"\x01\x00", - /* 0xa0 _ */ (uint8_t *)"\x01\x00", - /* 0xa1 _ */ (uint8_t *)"\x01\x00", - /* 0xa2 _ */ (uint8_t *)"\x01\x00", - /* 0xa3 _ */ (uint8_t *)"\x01\x00", - /* 0xa4 _ */ (uint8_t *)"\x01\x00", - /* 0xa5 _ */ (uint8_t *)"\x01\x00", - /* 0xa6 _ */ (uint8_t *)"\x01\x00", - /* 0xa7 _ */ (uint8_t *)"\x01\x00", - /* 0xa8 _ */ (uint8_t *)"\x01\x00", - /* 0xa9 _ */ (uint8_t *)"\x01\x00", - /* 0xaa _ */ (uint8_t *)"\x01\x00", - /* 0xab _ */ (uint8_t *)"\x01\x00", - /* 0xac _ */ (uint8_t *)"\x01\x00", - /* 0xad _ */ (uint8_t *)"\x01\x00", - /* 0xae _ */ (uint8_t *)"\x01\x00", - /* 0xaf _ */ (uint8_t *)"\x01\x00", - /* 0xb0 _ */ (uint8_t *)"\x01\x00", - /* 0xb1 _ */ (uint8_t *)"\x01\x00", - /* 0xb2 _ */ (uint8_t *)"\x01\x00", - /* 0xb3 _ */ (uint8_t *)"\x01\x00", - /* 0xb4 _ */ (uint8_t *)"\x01\x00", - /* 0xb5 _ */ (uint8_t *)"\x01\x00", - /* 0xb6 _ */ (uint8_t *)"\x01\x00", - /* 0xb7 _ */ (uint8_t *)"\x01\x00", - /* 0xb8 _ */ (uint8_t *)"\x01\x00", - /* 0xb9 _ */ (uint8_t *)"\x01\x00", - /* 0xba _ */ (uint8_t *)"\x01\x00", - /* 0xbb _ */ (uint8_t *)"\x01\x00", - /* 0xbc _ */ (uint8_t *)"\x01\x00", - /* 0xbd _ */ (uint8_t *)"\x01\x00", - /* 0xbe _ */ (uint8_t *)"\x01\x00", - /* 0xbf _ */ (uint8_t *)"\x01\x00", - /* 0xc0 _ */ (uint8_t *)"\x01\x00", - /* 0xc1 _ */ (uint8_t *)"\x01\x00", - /* 0xc2 _ */ (uint8_t *)"\x01\x00", - /* 0xc3 _ */ (uint8_t *)"\x01\x00", - /* 0xc4 _ */ (uint8_t *)"\x01\x00", - /* 0xc5 _ */ (uint8_t *)"\x01\x00", - /* 0xc6 _ */ (uint8_t *)"\x01\x00", - /* 0xc7 _ */ (uint8_t *)"\x01\x00", - /* 0xc8 _ */ (uint8_t *)"\x01\x00", - /* 0xc9 _ */ (uint8_t *)"\x01\x00", - /* 0xca _ */ (uint8_t *)"\x01\x00", - /* 0xcb _ */ (uint8_t *)"\x01\x00", - /* 0xcc _ */ (uint8_t *)"\x01\x00", - /* 0xcd _ */ (uint8_t *)"\x01\x00", - /* 0xce _ */ (uint8_t *)"\x01\x00", - /* 0xcf _ */ (uint8_t *)"\x01\x00", - /* 0xd0 _ */ (uint8_t *)"\x01\x00", - /* 0xd1 _ */ (uint8_t *)"\x01\x00", - /* 0xd2 _ */ (uint8_t *)"\x01\x00", - /* 0xd3 _ */ (uint8_t *)"\x01\x00", - /* 0xd4 _ */ (uint8_t *)"\x01\x00", - /* 0xd5 _ */ (uint8_t *)"\x01\x00", - /* 0xd6 _ */ (uint8_t *)"\x01\x00", - /* 0xd7 _ */ (uint8_t *)"\x01\x00", - /* 0xd8 _ */ (uint8_t *)"\x01\x00", - /* 0xd9 _ */ (uint8_t *)"\x01\x00", - /* 0xda _ */ (uint8_t *)"\x01\x00", - /* 0xdb _ */ (uint8_t *)"\x01\x00", - /* 0xdc _ */ (uint8_t *)"\x01\x00", - /* 0xdd _ */ (uint8_t *)"\x01\x00", - /* 0xde _ */ (uint8_t *)"\x01\x00", - /* 0xdf _ */ (uint8_t *)"\x01\x00", - /* 0xe0 _ */ (uint8_t *)"\x01\x00", - /* 0xe1 _ */ (uint8_t *)"\x01\x00", - /* 0xe2 _ */ (uint8_t *)"\x01\x00", - /* 0xe3 _ */ (uint8_t *)"\x01\x00", - /* 0xe4 _ */ (uint8_t *)"\x01\x00", - /* 0xe5 _ */ (uint8_t *)"\x01\x00", - /* 0xe6 _ */ (uint8_t *)"\x01\x00", - /* 0xe7 _ */ (uint8_t *)"\x01\x00", - /* 0xe8 _ */ (uint8_t *)"\x01\x00", - /* 0xe9 _ */ (uint8_t *)"\x01\x00", - /* 0xea _ */ (uint8_t *)"\x01\x00", - /* 0xeb _ */ (uint8_t *)"\x01\x00", - /* 0xec _ */ (uint8_t *)"\x01\x00", - /* 0xed _ */ (uint8_t *)"\x01\x00", - /* 0xee _ */ (uint8_t *)"\x01\x00", - /* 0xef _ */ (uint8_t *)"\x01\x00", - /* 0xf0 _ */ (uint8_t *)"\x01\x00", - /* 0xf1 _ */ (uint8_t *)"\x01\x00", - /* 0xf2 _ */ (uint8_t *)"\x01\x00", - /* 0xf3 _ */ (uint8_t *)"\x01\x00", - /* 0xf4 _ */ (uint8_t *)"\x01\x00", - /* 0xf5 _ */ (uint8_t *)"\x01\x00", - /* 0xf6 _ */ (uint8_t *)"\x01\x00", - /* 0xf7 _ */ (uint8_t *)"\x01\x00", - /* 0xf8 _ */ (uint8_t *)"\x01\x00", - /* 0xf9 _ */ (uint8_t *)"\x01\x00", - /* 0xfa _ */ (uint8_t *)"\x01\x00", - /* 0xfb _ */ (uint8_t *)"\x01\x00", - /* 0xfc _ */ (uint8_t *)"\x01\x00", - /* 0xfd _ */ (uint8_t *)"\x01\x00", - /* 0xfe _ */ (uint8_t *)"\x01\x00", - /* 0xff _ */ (uint8_t *)"\x01\x00", +const uint8_t * const font_data[2][128] = { + { +#include"font.inc" + }, + { +#include"fontfixed.inc" + }, }; -int fontCharWidth(char c) { - return font_data[(int)(c)][0]; +int fontCharWidth(int font, char c) { + return font_data[font][c & 0x7f][0]; } -const uint8_t *fontCharData(char c) { - return font_data[(int)(c)] + 1; +const uint8_t *fontCharData(int font, char c) { + return font_data[font][c & 0x7f] + 1; } diff --git a/gen/fonts.h b/gen/fonts.h index 43ca21a..dbbbef1 100644 --- a/gen/fonts.h +++ b/gen/fonts.h @@ -4,10 +4,13 @@ #include #define FONT_HEIGHT 8 +#define FONT_STANDARD 0 +#define FONT_FIXED 1 +#define FONT_DOUBLE 0x80 -extern const uint8_t * const font_data[256]; +extern const uint8_t * const font_data[2][128]; -int fontCharWidth(char c); -const uint8_t *fontCharData(char c); +int fontCharWidth(int font, char c); +const uint8_t *fontCharData(int font, char c); #endif diff --git a/gen/fonts/fontfixed.png b/gen/fonts/fontfixed.png new file mode 100644 index 0000000000000000000000000000000000000000..13f8d90727b23e21752de0ddbf56ae2a6fb03f5c GIT binary patch literal 1761 zcmdUw`#Tc~7{})lHMg9xB}L9-N4CjilOtKpC7XM-v7}UHjwP2hB$0?yq}psW$0gzv zGw004S#AeM<#wi!h+#uLCBs}=SVw=x`QiJ1p6C1i@_nB7dA{#$f8XPJz}-Lq0HBBS zbUU%d((l@?zBMLvBGBgT_N0|0bD-=zlN{I+Y$)V_lAao3irYZ?7$vU8hq1OU*w zfpa@{Dsl94(G=tHKHZGArOk6A>vjn+n1y9o`}L6Ez~I8PV;s%b>X3Z$4!f{FGwz)} z`OmKWmD-Xhh3OmX<$Jqie1w`V4mqdq8Ixo8{LA__VAjf{dE;O58=AF`+voo<(-q3H zA{>c6VP2($3!(jXZG4SZ%3X_0=thc4rAi~xDVtBUU%MFurdt;m@_av(zNbPhKxGZd{t(1C`b%znrtjg)w?RtjAO_an6EX^H* zK^6!~vu=dw#79m;$#3X$v{j8ee32CgRZV&aB$m4xe`+0jpjh8ZJ)1f66J6x%GrKAr zQc*3ETFqr+;}})O%5d~>?)gOm0vglAX{k5#ju1cg3yj2+;^L+ki>YfWxw=V>qJdUT z{7T()obSJ@-D8n7aXjB|CRRu>gF)!i3(RY5V?WRs3TzCw)sJ)y9BqFt2{R48n^``$ z<78uamqn5sC?e;D>pP(Q_7gTF(!V384Z^_}lpnfVHL?7&DV1R%CeI?$Yr|P+m#UX3oN^(-5UK;!(alssU=2zcZ0?f%0HMIR8%&i{PNDAax$^L0fgyD@k5E4Xk}%Wn zKik=SYt0(~8Fe;~>sBPd$(6K`3w@s`airt%E+8r!giI}r4q7B0D5z)QkLd7FPYZr` za)(mNhOp7F%Ai?IZ?IF?b)P4xEfuyIX(A~0Pu|+h=lI#a#PwpQhN^;uhc5&!YCX!e za~ORu!e$-j+5oEA;fs0uoQQky%dnQ9{}R*Rt~VT_*RtTEbY=Tc*qx#VNtaRUFsN(> z3HM^{o?1;Zw#ni)Pg_<8ynhtPRkDwMjp_Rr7ouNR-09|UVehxEO=W}SD{;cuY~qZd z*j_&mk%vGE7!`v#^EUA60N*07ADpmxY(8|wheu*u9wggV#@u5NSf|E<>I-&r=m(+> zf`o8kAs>JM&s*fu*M=ebH7=G9j0g0G_zvD3cH-}I#roby0lTM43#PNIvyT+atHM^t$3e& z8O193d0M>EhrA#-A|Dxgm{>=a^=r9})#)Eh1DJmI*+R&>d z4_wAV=IvkSq4$^#3rLPW)vobgcJO#XE0FU%YeAxL>n)m{)d-+fhgN_{GL+ ze_So0#p{g#?{e>?vqNAHnNfw1W>0sg6lcq-AAoHp=oQXF#8|pj&Lb(Pt36kl6X718 za1J9D|7vSyxP11JER7_)n2n%k7j-2@xm5mqkV@kle5A_Zq^gJfa6cl!5@n#Tpp!c% zqbL7*btM0rtQaxm4tv9ivW8yc1MuKKtVy<7V3PgESn10a{~y)}o2y~ugbkzCL((?C z3Y1Gg0tU;9yGhI1g_T!0tKgQ5?wk zcu%}J{YrXdzA-w;x88njXj)#Y6Y^tJY`JT4TheVNEp(>aspC>?@>|Z4Pn|%6O`G}a z%NdPlC_*O3^lCuJuPuSbPAwX@8MeT6QDjzKlhr3=4{`j8)r8JZStB0Rb#Z;ih}Y$b zHs3H+p|ip7= 32 and i <= 126 else '_' - print('\t/* 0x%02x %c */ (uint8_t *)"%s",' % (i, ch , cur)) + with open(outfile, 'w') as f: + for i in range(128): + x = (i % 16) * 10 + y = (i // 16) * 10 + cur = '' + while img.pixel(x, y) != None: + val = ''.join(img.pixel(x, y + j) for j in range(8)) + x += 1 + cur += '\\x%02x' % int(val, 2) + cur = '\\x%02x' % (len(cur) // 4) + cur + ch = chr(i) if i >= 32 and i <= 126 else '_' + f.write('\t/* 0x%02x %c */ (uint8_t *)"%s",\n' % (i, ch , cur)) + +convert('fonts/fontfixed.png', 'fontfixed.inc') +convert('fonts/font.png', 'font.inc') diff --git a/gen/strwidth.c b/gen/strwidth.c index c12f7b0..8ba3f1c 100644 --- a/gen/strwidth.c +++ b/gen/strwidth.c @@ -17,6 +17,7 @@ static inline char convert(char c) { int main(int argc, char **argv) { char *line; + int font = FONT_STANDARD; while ((line = readline(NULL)) != NULL) { size_t length = strlen(line); if (length) { @@ -25,7 +26,7 @@ int main(int argc, char **argv) { size_t width = 0; for (size_t i = 0; i < length; i++) { - width += fontCharWidth(convert(line[i])) + 1; + width += fontCharWidth(font, convert(line[i])) + 1; } printf("%zu\n", width); diff --git a/layout.c b/layout.c index 98e6e59..f29aadb 100644 --- a/layout.c +++ b/layout.c @@ -30,31 +30,31 @@ void layoutDialog(const BITMAP *icon, const char *btnNo, const char *btnYes, con oledDrawBitmap(0, 0, icon); left = icon->width + 4; } - if (line1) oledDrawString(left, 0 * 9, line1); - if (line2) oledDrawString(left, 1 * 9, line2); - if (line3) oledDrawString(left, 2 * 9, line3); - if (line4) oledDrawString(left, 3 * 9, line4); + if (line1) oledDrawString(left, 0 * 9, line1, FONT_STANDARD); + if (line2) oledDrawString(left, 1 * 9, line2, FONT_STANDARD); + if (line3) oledDrawString(left, 2 * 9, line3, FONT_STANDARD); + if (line4) oledDrawString(left, 3 * 9, line4, FONT_STANDARD); if (desc) { - oledDrawStringCenter(OLED_HEIGHT - 2 * 9 - 1, desc); + oledDrawStringCenter(OLED_HEIGHT - 2 * 9 - 1, desc, FONT_STANDARD); if (btnYes || btnNo) { oledHLine(OLED_HEIGHT - 21); } } else { - if (line5) oledDrawString(left, 4 * 9, line5); - if (line6) oledDrawString(left, 5 * 9, line6); + if (line5) oledDrawString(left, 4 * 9, line5, FONT_STANDARD); + if (line6) oledDrawString(left, 5 * 9, line6, FONT_STANDARD); if (btnYes || btnNo) { oledHLine(OLED_HEIGHT - 13); } } if (btnNo) { - oledDrawString(1, OLED_HEIGHT - 8, "\x15"); - oledDrawString(fontCharWidth('\x15') + 3, OLED_HEIGHT - 8, btnNo); - oledInvert(0, OLED_HEIGHT - 9, fontCharWidth('\x15') + oledStringWidth(btnNo) + 2, OLED_HEIGHT - 1); + oledDrawString(1, OLED_HEIGHT - 8, "\x15", FONT_STANDARD); + oledDrawString(fontCharWidth(FONT_STANDARD, '\x15') + 3, OLED_HEIGHT - 8, btnNo, FONT_STANDARD); + oledInvert(0, OLED_HEIGHT - 9, fontCharWidth(FONT_STANDARD, '\x15') + oledStringWidth(btnNo, FONT_STANDARD) + 2, OLED_HEIGHT - 1); } if (btnYes) { - oledDrawString(OLED_WIDTH - fontCharWidth('\x06') - 1, OLED_HEIGHT - 8, "\x06"); - oledDrawString(OLED_WIDTH - oledStringWidth(btnYes) - fontCharWidth('\x06') - 3, OLED_HEIGHT - 8, btnYes); - oledInvert(OLED_WIDTH - oledStringWidth(btnYes) - fontCharWidth('\x06') - 4, OLED_HEIGHT - 9, OLED_WIDTH - 1, OLED_HEIGHT - 1); + oledDrawString(OLED_WIDTH - fontCharWidth(FONT_STANDARD, '\x06') - 1, OLED_HEIGHT - 8, "\x06", FONT_STANDARD); + oledDrawStringRight(OLED_WIDTH - fontCharWidth(FONT_STANDARD, '\x06') - 3, OLED_HEIGHT - 8, btnYes, FONT_STANDARD); + oledInvert(OLED_WIDTH - oledStringWidth(btnYes, FONT_STANDARD) - fontCharWidth(FONT_STANDARD, '\x06') - 4, OLED_HEIGHT - 9, OLED_WIDTH - 1, OLED_HEIGHT - 1); } oledRefresh(); } @@ -100,7 +100,7 @@ void layoutProgress(const char *desc, int permil) // text oledBox(0, OLED_HEIGHT - 16, OLED_WIDTH - 1, OLED_HEIGHT - 16 + 7, 0); if (desc) { - oledDrawStringCenter(OLED_HEIGHT - 16, desc); + oledDrawStringCenter(OLED_HEIGHT - 16, desc, FONT_STANDARD); } oledRefresh(); } diff --git a/oled.c b/oled.c index 0467690..54a15b6 100644 --- a/oled.c +++ b/oled.c @@ -236,14 +236,15 @@ void oledSetBuffer(uint8_t *buf) memcpy(_oledbuffer, buf, sizeof(_oledbuffer)); } -void oledDrawChar(int x, int y, char c, int zoom) +void oledDrawChar(int x, int y, char c, int font) { if (x >= OLED_WIDTH || y >= OLED_HEIGHT || y <= -FONT_HEIGHT) { return; } - int char_width = fontCharWidth(c); - const uint8_t *char_data = fontCharData(c); + int zoom = (font & FONT_DOUBLE ? 2 : 1); + int char_width = fontCharWidth(font & 0x7f, c); + const uint8_t *char_data = fontCharData(font & 0x7f, c); if (x <= -char_width * zoom) { return; @@ -272,41 +273,43 @@ char oledConvertChar(const char c) { return 0; } -int oledStringWidth(const char *text) { +int oledStringWidth(const char *text, int font) { if (!text) return 0; + int size = (font & FONT_DOUBLE ? 2 : 1); int l = 0; for (; *text; text++) { char c = oledConvertChar(*text); if (c) { - l += fontCharWidth(c) + 1; + l += size * (fontCharWidth(font & 0x7f, c) + 1); } } return l; } -void oledDrawStringSize(int x, int y, const char* text, int size) +void oledDrawString(int x, int y, const char* text, int font) { if (!text) return; int l = 0; + int size = (font & FONT_DOUBLE ? 2 : 1); for (; *text; text++) { char c = oledConvertChar(*text); if (c) { - oledDrawChar(x + l, y, c, size); - l += size * (fontCharWidth(c) + 1); + oledDrawChar(x + l, y, c, font); + l += size * (fontCharWidth(font & 0x7f, c) + 1); } } } -void oledDrawStringCenter(int y, const char* text) +void oledDrawStringCenter(int y, const char* text, int font) { - int x = ( OLED_WIDTH - oledStringWidth(text) ) / 2; - oledDrawString(x, y, text); + int x = ( OLED_WIDTH - oledStringWidth(text, font) ) / 2; + oledDrawString(x, y, text, font); } -void oledDrawStringRight(int x, int y, const char* text) +void oledDrawStringRight(int x, int y, const char* text, int font) { - x -= oledStringWidth(text); - oledDrawString(x, y, text); + x -= oledStringWidth(text, font); + oledDrawString(x, y, text, font); } void oledDrawBitmap(int x, int y, const BITMAP *bmp) diff --git a/oled.h b/oled.h index 845e1e2..fcd7cc7 100644 --- a/oled.h +++ b/oled.h @@ -43,13 +43,11 @@ void oledDrawPixel(int x, int y); void oledClearPixel(int x, int y); void oledInvertPixel(int x, int y); void oledDrawChar(int x, int y, char c, int zoom); -int oledStringWidth(const char *text); +int oledStringWidth(const char *text, int font); -#define oledDrawString(x, y, text) oledDrawStringSize((x), (y), (text), 1) -#define oledDrawStringDouble(x, y, text) oledDrawStringSize((x), (y), (text), 2) -void oledDrawStringSize(int x, int y, const char* text, int size); -void oledDrawStringCenter(int y, const char* text); -void oledDrawStringRight(int x, int y, const char* text); +void oledDrawString(int x, int y, const char* text, int font); +void oledDrawStringCenter(int y, const char* text, int font); +void oledDrawStringRight(int x, int y, const char* text, int font); void oledDrawBitmap(int x, int y, const BITMAP *bmp); void oledInvert(int x1, int y1, int x2, int y2); void oledBox(int x1, int y1, int x2, int y2, bool set);