From 81085ed3886cb055f5ca41028a829f83f5392b62 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 9 Nov 2019 16:15:06 +0100 Subject: [PATCH] legacy/oled: remove non-ASCII symbols from font definitions --- legacy/gen/font.inc | 32 -------------------------------- legacy/gen/fontfixed.inc | 32 -------------------------------- legacy/gen/fonts.c | 15 ++++++++++----- legacy/gen/fonts.h | 6 +++--- legacy/gen/fonts/font.png | Bin 1795 -> 11083 bytes legacy/gen/fonts/fontfixed.png | Bin 1794 -> 9484 bytes legacy/gen/fonts/generate.py | 5 +++-- legacy/oled.c | 10 +++++----- legacy/oled.h | 11 +++++------ 9 files changed, 26 insertions(+), 85 deletions(-) diff --git a/legacy/gen/font.inc b/legacy/gen/font.inc index e14089597..20a2ed555 100644 --- a/legacy/gen/font.inc +++ b/legacy/gen/font.inc @@ -1,35 +1,3 @@ - /* 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", diff --git a/legacy/gen/fontfixed.inc b/legacy/gen/fontfixed.inc index 823d4b0a1..68d72aefa 100644 --- a/legacy/gen/fontfixed.inc +++ b/legacy/gen/fontfixed.inc @@ -1,35 +1,3 @@ - /* 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", diff --git a/legacy/gen/fonts.c b/legacy/gen/fonts.c index 8e801953c..c41114b1a 100644 --- a/legacy/gen/fonts.c +++ b/legacy/gen/fonts.c @@ -1,6 +1,8 @@ #include "fonts.h" -const uint8_t *const font_data[2][128] = { +#define FONTS 2 + +const uint8_t *const font_data[FONTS][128 - 32] = { { #include "font.inc" }, @@ -9,8 +11,11 @@ const uint8_t *const font_data[2][128] = { }, }; -int fontCharWidth(int font, uint8_t c) { return font_data[font][c & 0x7f][0]; } - -const uint8_t *fontCharData(int font, uint8_t c) { - return font_data[font][c & 0x7f] + 1; +int fontCharWidth(uint8_t font, uint8_t c) { + return (c < 0x20 || c >= 0x80) ? 0 : font_data[font % FONTS][c - 32][0]; +} + +const uint8_t *fontCharData(uint8_t font, uint8_t c) { + return (c < 0x20 || c >= 0x80) ? (const uint8_t *)"" + : font_data[font % FONTS][c - 32] + 1; } diff --git a/legacy/gen/fonts.h b/legacy/gen/fonts.h index d08188f05..6d691aed0 100644 --- a/legacy/gen/fonts.h +++ b/legacy/gen/fonts.h @@ -8,9 +8,9 @@ #define FONT_FIXED 1 #define FONT_DOUBLE 0x80 -extern const uint8_t *const font_data[2][128]; +extern const uint8_t *const font_data[2][128 - 32]; -int fontCharWidth(int font, uint8_t c); -const uint8_t *fontCharData(int font, uint8_t c); +int fontCharWidth(uint8_t font, uint8_t c); +const uint8_t *fontCharData(uint8_t font, uint8_t c); #endif diff --git a/legacy/gen/fonts/font.png b/legacy/gen/fonts/font.png index a3d26a98eb7fa4eb7a3937783f9dad53dca2e414..d9ba1a843ac9b9d1d84e136611d712be6c28b924 100644 GIT binary patch literal 11083 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 eBw4dOx%>gaaF%>lYtCc<0000S5jh delta 1791 zcmVhgpiDF*sE)5YF88p zb|Zm0!imeWgc!0|!bhz~#2At%7=LyLBsj(xWBmOAg~NLA zk6qk%K!R6NVRu*$hT8E%G#slIvL$ev@L@j;C)OcK95H5H8R8TfNSvef4~|Hjf?Re!SLwc=C=_kH)xU^dA{eyy?YsH`Gc8- zSU$S)FM*J($@i43D?^Df_^WLT6;ZNKvcO=Nf1z?)KT=_5TbWW} zR%l!7d4F4mkAdW*%bdfE*t4gta?GCaemDrJ3(;G6&jfH`%=0OyyneP)X1ca5_Po9) zmvv; z{vj z-Rwv^(whS5!#z6}bvev>HWS&1b$<1EMX5(?a<_4dR^_x_GY*t2lq@i`lBLv)?rkfp zQGZUIOA9Q@Kk-z=CLCI>G znY>lO^!(?V99uq_ozK%A<41%AK<3oLuF(&jQB< zEfOVbY%59@N*3sP-*Dc=y`f}zRH28h8htJO{j~U1gxq#5F*X$Q&h6AFP32TkGx`*Y z$8F5lvfd40>t{m&&$1eNCp%?BHwzk#z;jjBkK8t4gfEto9(*{o)EJ%9P} zcKoNlgDLFlMGR9;0BJJ?7p&2&C0+c z7ZW9|?JB4I0sIyh%xP7It&qnVPHoRyU6ic*t)6p>cb|Dg$wJ8jJ!9TflKP+|*BR-< zU9!%o*fw`4#y@7^H05EpRnzmPRey;+-@b56;iadU+>+`v8hLTMYs-V*+(ipnho^K# zX)Q}A^1ZJAE?M~1wBiq{Y2HxFJB6SpX&LFDqFu29}~`)ZN07 zU1G($s-Mo4t@tT^Zp4G1($~y7S7`GM`h3`|mh`4%img#tLgx7%A^-G`yCjt4=jL{^ znzrV>{Vf@GZNgbsRay1H=YMP=rswR#Rh79dV;W ze8Kt8Ek3o^&Ta7fcSbjdo|{o`bCVy1$nHqbivBsqJ^CNq;C=C|RIyf=j<$ zh_!1g9!!V^5DXv~Krnz{0Kwn@lq@_L^i43j&(Kypm=Fyh7(g(9U;x1Yg24eOS$Ht$ zn_zUGp{;l@AsRq1fM5W@0D=Jog9A{q@LRwf&l~r2nG-g4nWDmgF)W}qx%eP#e)ga0D=Jo0|*8X3?LXB zfRcp=gT4ty_ZixX2NR+J1Oo^L5DXv~KrlD}B?}J*eG`oCGqe>CCPV`W1`rG&7(g(9 hU~m9R79I?G#($Zze2^&YT~+`9002ovPDHLkV1i*GapwR4 diff --git a/legacy/gen/fonts/generate.py b/legacy/gen/fonts/generate.py index 463d73e63..f23c0be52 100755 --- a/legacy/gen/fonts/generate.py +++ b/legacy/gen/fonts/generate.py @@ -23,7 +23,7 @@ def convert(imgfile, outfile): img = Img(imgfile) cur = "" with open(outfile, "w") as f: - for i in range(128): + for i in range(128 - 32): x = (i % 16) * 10 y = (i // 16) * 10 cur = "" @@ -32,7 +32,8 @@ def convert(imgfile, outfile): 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 "_" + i += 32 + ch = "_" if (i == 127) else chr(i) f.write('\t/* 0x%02x %c */ (uint8_t *)"%s",\n' % (i, ch, cur)) diff --git a/legacy/oled.c b/legacy/oled.c index 70928bb12..2f6528b9e 100644 --- a/legacy/oled.c +++ b/legacy/oled.c @@ -241,7 +241,7 @@ void oledSetBuffer(uint8_t *buf) { memcpy(_oledbuffer, buf, sizeof(_oledbuffer)); } -void oledDrawChar(int x, int y, char c, int font) { +void oledDrawChar(int x, int y, char c, uint8_t font) { if (x >= OLED_WIDTH || y >= OLED_HEIGHT || y <= -FONT_HEIGHT) { return; } @@ -304,7 +304,7 @@ static uint8_t convert_char(const char a) { return 0; } -int oledStringWidth(const char *text, int font) { +int oledStringWidth(const char *text, uint8_t font) { if (!text) return 0; int space = (font & FONT_DOUBLE) ? 2 : 1; int l = 0; @@ -317,7 +317,7 @@ int oledStringWidth(const char *text, int font) { return l; } -void oledDrawString(int x, int y, const char *text, int font) { +void oledDrawString(int x, int y, const char *text, uint8_t font) { if (!text) return; int l = 0; int space = (font & FONT_DOUBLE) ? 2 : 1; @@ -330,12 +330,12 @@ void oledDrawString(int x, int y, const char *text, int font) { } } -void oledDrawStringCenter(int x, int y, const char *text, int font) { +void oledDrawStringCenter(int x, int y, const char *text, uint8_t font) { x = x - oledStringWidth(text, font) / 2; oledDrawString(x, y, text, font); } -void oledDrawStringRight(int x, int y, const char *text, int font) { +void oledDrawStringRight(int x, int y, const char *text, uint8_t font) { x -= oledStringWidth(text, font); oledDrawString(x, y, text, font); } diff --git a/legacy/oled.h b/legacy/oled.h index 114e76c27..3b883175c 100644 --- a/legacy/oled.h +++ b/legacy/oled.h @@ -43,12 +43,11 @@ bool oledGetPixel(int x, int y); 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 font); - -void oledDrawString(int x, int y, const char *text, int font); -void oledDrawStringCenter(int x, int y, const char *text, int font); -void oledDrawStringRight(int x, int y, const char *text, int font); +void oledDrawChar(int x, int y, char c, uint8_t font); +int oledStringWidth(const char *text, uint8_t font); +void oledDrawString(int x, int y, const char *text, uint8_t font); +void oledDrawStringCenter(int x, int y, const char *text, uint8_t font); +void oledDrawStringRight(int x, int y, const char *text, uint8_t 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);