From: Nathael Pajani Date: Sun, 16 Oct 2016 15:32:57 +0000 (+0200) Subject: Modification to the font and the way it is handled This allows for the font to reside... X-Git-Url: http://git.techno-innov.fr/?a=commitdiff_plain;h=e926fe5fb37996bc1ed694e74932992b4ca48dc3;p=soft%2Flpc122x%2Fcore Modification to the font and the way it is handled This allows for the font to reside in flash, sparing abour 700 bytes of RAM --- diff --git a/include/lib/font.h b/include/lib/font.h index 3473f5e..fcce7d7 100644 --- a/include/lib/font.h +++ b/include/lib/font.h @@ -26,13 +26,159 @@ #ifndef LIB_FONT_H #define LIB_FONT_H +#include "lib/stdint.h" + +#define NB_FONT_TILES 95 +#define FIRST_FONT_CHAR 0x20 + + +#define NORMAL(x) (x) + +/* + * Actual font data is written in "human drawing order", but must be sent in revers bit order + * for some drivers (Epaper for example). + * This macro takes care of bit reversal for each font byte once and for all. + * This is a little bit ugly, but made at compile time, which allows storage of modified font + * in FLASH memory. + */ +#define REV1(x) ( (((x) >> 1) & 0x5555555555555555) | (((x) & 0x5555555555555555) << 1) ) +#define REV2(x) ( ((REV1(x) >> 2) & 0x3333333333333333) | ((REV1(x) & 0x3333333333333333) << 2) ) +#define REVERSE(x) ( ((REV2(x) >> 4) & 0x0F0F0F0F0F0F0F0F) | ((REV2(x) & 0x0F0F0F0F0F0F0F0F) << 4) ) + + +/* + * Actual font data is written in "human drawing order", but must be sent in a "vertical" way + * for some drivers (Oled for example). + * This macro takes care of bit reversal for each font byte once and for all. + * This is a little bit ugly, but made at compile time, which allows storage of modified font + * in FLASH memory. + */ +#define SBV(x, n) ( ((x) & (0x01ULL << (n * 8))) >> (n * 7) ) +#define VER1(x) ( SBV(x, 7) | SBV(x, 6) | SBV(x, 5) | SBV(x, 4) | SBV(x, 3) | SBV(x, 2) | SBV(x, 1) | SBV(x, 0) ) +#define VER2(x, n) ( (VER1((x) >> n)) << (n * 8) ) +#define VERTICAL(x) ( VER2(x, 0) | VER2(x, 1) | VER2(x, 2)| VER2(x, 3)| VER2(x, 4)| VER2(x, 5)| VER2(x, 6)| VER2(x, 7) ) + + +/* + * Actual font data is written in "human drawing order", but must be sent in a "vertical" way + * for some drivers (Oled for example). + * This macro takes care of bit reversal for each font byte once and for all. + * This is a little bit ugly, but made at compile time, which allows storage of modified font + * in FLASH memory. + */ +#define SBR(x, n) REVERSE( SBV(x, n) ) +#define VR1(x) ( SBR(x, 7) | SBR(x, 6) | SBR(x, 5) | SBR(x, 4) | SBR(x, 3) | SBR(x, 2) | SBR(x, 1) | SBR(x, 0) ) +#define VR2(x, n) ( (VR1((x) >> (7 - n))) << (n * 8) ) +#define VERTICAL_REV(x) ( VR2(x, 0) | VR2(x, 1) | VR2(x, 2)| VR2(x, 3)| VR2(x, 4)| VR2(x, 5)| VR2(x, 6)| VR2(x, 7) ) + + /* * The values in this array are a 8x8 bitmap font for ascii characters * As memory is a very precious ressource on a micro-controller all chars * before "space" (0x20) have been removed. */ -#define NB_FONT_TILES 95 -extern uint8_t first_font_char; -extern uint64_t font[NB_FONT_TILES]; +#define FONT_TABLE \ + ROW(0x0000000000000000), /* (space) */ /* 0x20 */ \ + ROW(0x0808080800080000), /* ! */ \ + ROW(0x2828000000000000), /* " */ \ + ROW(0x00287C287C280000), /* # */ \ + ROW(0x081E281C0A3C0800), /* $ */ \ + ROW(0x6094681629060000), /* % */ \ + ROW(0x1C20201926190000), /* & */ \ + ROW(0x0808000000000000), /* ' */ \ + ROW(0x0810202010080000), /* ( */ \ + ROW(0x1008040408100000), /* ) */ \ + ROW(0x2A1C3E1C2A000000), /* * */ \ + ROW(0x0008083E08080000), /* + */ \ + ROW(0x0000000000081000), /* , */ \ + ROW(0x0000003C00000000), /* - */ \ + ROW(0x0000000000080000), /* . */ \ + ROW(0x0204081020400000), /* / */ \ + ROW(0x1824424224180000), /* 0 */ /*x30 */ \ + ROW(0x08180808081C0000), /* 1 */ \ + ROW(0x3C420418207E0000), /* 2 */ \ + ROW(0x3C420418423C0000), /* 3 */ \ + ROW(0x081828487C080000), /* 4 */ \ + ROW(0x7E407C02423C0000), /* 5 */ \ + ROW(0x3C407C42423C0000), /* 6 */ \ + ROW(0x7E04081020400000), /* 7 */ \ + ROW(0x3C423C42423C0000), /* 8 */ \ + ROW(0x3C42423E023C0000), /* 9 */ \ + ROW(0x0000080000080000), /* : */ \ + ROW(0x0000080000081000), /* ; */ \ + ROW(0x0006186018060000), /* < */ \ + ROW(0x00007E007E000000), /* = */ \ + ROW(0x0060180618600000), /* > */ \ + ROW(0x3844041800100000), /* ? */ \ + ROW(0x003C449C945C201C), /* @ */ /* 0x40 */ \ + ROW(0x1818243C42420000), /* A */ \ + ROW(0x7844784444780000), /* B */ \ + ROW(0x3844808044380000), /* C */ \ + ROW(0x7844444444780000), /* D */ \ + ROW(0x7C407840407C0000), /* E */ \ + ROW(0x7C40784040400000), /* F */ \ + ROW(0x3844809C44380000), /* G */ \ + ROW(0x42427E4242420000), /* H */ \ + ROW(0x3E080808083E0000), /* I */ \ + ROW(0x1C04040444380000), /* J */ \ + ROW(0x4448507048440000), /* K */ \ + ROW(0x40404040407E0000), /* L */ \ + ROW(0x4163554941410000), /* M */ \ + ROW(0x4262524A46420000), /* N */ \ + ROW(0x1C222222221C0000), /* O */ \ + ROW(0x7844784040400000), /* P */ /* 0x50 */ \ + ROW(0x1C222222221C0200), /* Q */ \ + ROW(0x7844785048440000), /* R */ \ + ROW(0x1C22100C221C0000), /* S */ \ + ROW(0x7F08080808080000), /* T */ \ + ROW(0x42424242423C0000), /* U */ \ + ROW(0x8142422424180000), /* V */ \ + ROW(0x4141495563410000), /* W */ \ + ROW(0x4224181824420000), /* X */ \ + ROW(0x4122140808080000), /* Y */ \ + ROW(0x7E040810207E0000), /* Z */ \ + ROW(0x3820202020380000), /* [ */ \ + ROW(0x4020100804020000), /* \ */ \ + ROW(0x3808080808380000), /* ] */ \ + ROW(0x1028000000000000), /* ^ */ \ + ROW(0x00000000007E0000), /* _ */ \ + ROW(0x1008000000000000), /* ` */ /* 0x60 */ \ + ROW(0x003C023E463A0000), /* a */ \ + ROW(0x40407C42625C0000), /* b */ \ + ROW(0x00001C20201C0000), /* c */ \ + ROW(0x02023E42463A0000), /* d */ \ + ROW(0x003C427E403C0000), /* e */ \ + ROW(0x0018103810100000), /* f */ \ + ROW(0x0000344C44340438), /* g */ \ + ROW(0x2020382424240000), /* h */ \ + ROW(0x0800080808080000), /* i */ \ + ROW(0x0800180808080870), /* j */ \ + ROW(0x20202428302C0000), /* k */ \ + ROW(0x1010101010180000), /* l */ \ + ROW(0x0000665A42420000), /* m */ \ + ROW(0x00002E3222220000), /* n */ \ + ROW(0x00003C42423C0000), /* o */ \ + ROW(0x00005C62427C4040), /* p */ /* 0x70 */ \ + ROW(0x00003A46423E0202), /* q */ \ + ROW(0x00002C3220200000), /* r */ \ + ROW(0x001C201804380000), /* s */ \ + ROW(0x00103C1010180000), /* t */ \ + ROW(0x00002222261A0000), /* u */ \ + ROW(0x0000424224180000), /* v */ \ + ROW(0x000081815A660000), /* w */ \ + ROW(0x0000422418660000), /* x */ \ + ROW(0x0000422214081060), /* y */ \ + ROW(0x00003C08103C0000), /* z */ \ + ROW(0x1C103030101C0000), /* { */ \ + ROW(0x0808080808080800), /* | */ \ + ROW(0x38080C0C08380000), /* } */ \ + ROW(0x000000324C000000), /* ~ */ +/* End of Table */ + + +#define DECLARE_FONT(font_name) \ +const uint64_t font_name[NB_FONT_TILES] = { \ + FONT_TABLE \ +}; #endif /* LIB_FONT_H */ diff --git a/lib/font.c b/lib/font.c deleted file mode 100644 index b98c544..0000000 --- a/lib/font.c +++ /dev/null @@ -1,132 +0,0 @@ -/************************************************************************ - * lib/font.c - * - * Copyright (C) Lisa Milne 2014 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * - ************************************************************************/ - -/* - * The font has been found on opengameart.org: - * http://opengameart.org/content/8x8-ascii-bitmap-font-with-c-source - */ - -#include "lib/stdint.h" -#include "lib/font.h" - -/* - * The values in this array are a 8x8 bitmap font for ascii characters - * As memory is a very precious ressource on a micro-controller all chars - * before "space" (0x20) have been removed. - */ -uint8_t first_font_char = 0x20; -uint64_t font[NB_FONT_TILES] = { - 0x0000000000000000, /* (space) */ /* 0x20 */ - 0x0808080800080000, /* ! */ - 0x2828000000000000, /* " */ - 0x00287C287C280000, /* # */ - 0x081E281C0A3C0800, /* $ */ - 0x6094681629060000, /* % */ - 0x1C20201926190000, /* & */ - 0x0808000000000000, /* ' */ - 0x0810202010080000, /* ( */ - 0x1008040408100000, /* ) */ - 0x2A1C3E1C2A000000, /* * */ - 0x0008083E08080000, /* + */ - 0x0000000000081000, /* , */ - 0x0000003C00000000, /* - */ - 0x0000000000080000, /* . */ - 0x0204081020400000, /* / */ - 0x1824424224180000, /* 0 */ /*x30 */ - 0x08180808081C0000, /* 1 */ - 0x3C420418207E0000, /* 2 */ - 0x3C420418423C0000, /* 3 */ - 0x081828487C080000, /* 4 */ - 0x7E407C02423C0000, /* 5 */ - 0x3C407C42423C0000, /* 6 */ - 0x7E04081020400000, /* 7 */ - 0x3C423C42423C0000, /* 8 */ - 0x3C42423E023C0000, /* 9 */ - 0x0000080000080000, /* : */ - 0x0000080000081000, /* ; */ - 0x0006186018060000, /* < */ - 0x00007E007E000000, /* = */ - 0x0060180618600000, /* > */ - 0x3844041800100000, /* ? */ - 0x003C449C945C201C, /* @ */ /* 0x40 */ - 0x1818243C42420000, /* A */ - 0x7844784444780000, /* B */ - 0x3844808044380000, /* C */ - 0x7844444444780000, /* D */ - 0x7C407840407C0000, /* E */ - 0x7C40784040400000, /* F */ - 0x3844809C44380000, /* G */ - 0x42427E4242420000, /* H */ - 0x3E080808083E0000, /* I */ - 0x1C04040444380000, /* J */ - 0x4448507048440000, /* K */ - 0x40404040407E0000, /* L */ - 0x4163554941410000, /* M */ - 0x4262524A46420000, /* N */ - 0x1C222222221C0000, /* O */ - 0x7844784040400000, /* P */ /* 0x50 */ - 0x1C222222221C0200, /* Q */ - 0x7844785048440000, /* R */ - 0x1C22100C221C0000, /* S */ - 0x7F08080808080000, /* T */ - 0x42424242423C0000, /* U */ - 0x8142422424180000, /* V */ - 0x4141495563410000, /* W */ - 0x4224181824420000, /* X */ - 0x4122140808080000, /* Y */ - 0x7E040810207E0000, /* Z */ - 0x3820202020380000, /* [ */ - 0x4020100804020000, /* \ */ - 0x3808080808380000, /* ] */ - 0x1028000000000000, /* ^ */ - 0x00000000007E0000, /* _ */ - 0x1008000000000000, /* ` */ /* 0x60 */ - 0x003C023E463A0000, /* a */ - 0x40407C42625C0000, /* b */ - 0x00001C20201C0000, /* c */ - 0x02023E42463A0000, /* d */ - 0x003C427E403C0000, /* e */ - 0x0018103810100000, /* f */ - 0x0000344C44340438, /* g */ - 0x2020382424240000, /* h */ - 0x0800080808080000, /* i */ - 0x0800180808080870, /* j */ - 0x20202428302C0000, /* k */ - 0x1010101010180000, /* l */ - 0x0000665A42420000, /* m */ - 0x00002E3222220000, /* n */ - 0x00003C42423C0000, /* o */ - 0x00005C62427C4040, /* p */ /* 0x70 */ - 0x00003A46423E0202, /* q */ - 0x00002C3220200000, /* r */ - 0x001C201804380000, /* s */ - 0x00103C1010180000, /* t */ - 0x00002222261A0000, /* u */ - 0x0000424224180000, /* v */ - 0x000081815A660000, /* w */ - 0x0000422418660000, /* x */ - 0x0000422214081060, /* y */ - 0x00003C08103C0000, /* z */ - 0x1C103030101C0000, /* { */ - 0x0808080808080800, /* | */ - 0x38080C0C08380000, /* } */ - 0x000000324C000000, /* ~ */ -}; -