Bitmap Fonts: Refactor and support for pound/degrees.

This commit is contained in:
Phil Howard 2022-04-01 15:21:08 +01:00
parent b2ff46b516
commit 0d43973326
8 changed files with 148 additions and 34 deletions

View File

@ -11,6 +11,16 @@ table to map anything prefixed with 0xc3 to its non-accented equivilent.
namespace unicode_sorta { namespace unicode_sorta {
const char PAGE_194_START = 194;
const char PAGE_195_START = 195;
// Codepage is probably completely the wrong terminology here
// but character pairs come in the form 0xc2 0x00 and 0xc3 0x00.
enum codepage_t : uint8_t {
PAGE_194,
PAGE_195
};
const uint8_t UNICODE_PREFIX = 0xc3; const uint8_t UNICODE_PREFIX = 0xc3;
enum accents : uint8_t { enum accents : uint8_t {
@ -92,7 +102,46 @@ static const accents char_accent[] = {
ACCENT_DIAERESIS ACCENT_DIAERESIS
}; };
static const char char_base[] = { // Codepage 194. Starts at 0x80 but the first 32 are non-printable
// Since we're already implementing LUTs for various accented characters,
// it makes sense for us poor brits to grab a usable £, too!
static const char char_base_194[] = {
' ', // - c2 a0 - NO-BREAK SPACE
'i', // ¡ - c2 a1 - INVERTED EXCLAMATION MARK
' ', // ¢ - c2 a2 - CENT SIGN
'\x85', // £ - c2 a3 - POUND SIGN
' ', // ¤ - c2 a4 - CURRENCY SIGN
'\x86', // ¥ - c2 a5 - YEN SIGN
' ', // ¦ - c2 a6 - BROKEN BAR
'S', // § - c2 a7 - SECTION SIGN
' ', // ¨ - c2 a8 - DIAERESIS
'\x87', // © - c2 a9 - COPYRIGHT SIGN
'a', // ª - c2 aa - FEMININE ORDINAL INDICATOR
'<', // « - c2 ab - LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
' ', // ¬ - c2 ac - NOT SIGN
' ', // ­ - c2 ad - SOFT HYPHEN
'R', // ® - c2 ae - REGISTERED SIGN
' ', // ¯ - c2 af - MACRON
'\x88', // ° - c2 b0 - DEGREE SIGN
' ', // ± - c2 b1 - PLUS-MINUS SIGN
'2', // ² - c2 b2 - SUPERSCRIPT TWO
'3', // ³ - c2 b3 - SUPERSCRIPT THREE
' ', // ´ - c2 b4 - ACUTE ACCENT
' ', // µ - c2 b5 - MICRO SIGN
' ', // ¶ - c2 b6 - PILCROW SIGN
' ', // · - c2 b7 - MIDDLE DOT
' ', // ¸ - c2 b8 - CEDILLA
' ', // ¹ - c2 b9 - SUPERSCRIPT ONE
' ', // º - c2 ba - MASCULINE ORDINAL INDICATOR
' ', // » - c2 bb - RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
' ', // ¼ - c2 bc - VULGAR FRACTION ONE QUARTER
' ', // ½ - c2 bd - VULGAR FRACTION ONE HALF
' ', // ¾ - c2 be - VULGAR FRACTION THREE QUARTERS
' ', // ¿ - c2 bf - INVERTED QUESTION MARK
};
// Codepage 195. Starts at 0x80
static const char char_base_195[] = {
'A', // À - c3 80 - A + GRAVE 'A', // À - c3 80 - A + GRAVE
'A', // Á - c3 81 - A + ACUTE 'A', // Á - c3 81 - A + ACUTE
'A', // Â - c3 82 - A + CIRCUMFLEX 'A', // Â - c3 82 - A + CIRCUMFLEX

View File

@ -1,8 +1,7 @@
#include "bitmap_fonts.hpp" #include "bitmap_fonts.hpp"
#include "common/unicode_sorta.hpp"
namespace bitmap { namespace bitmap {
int32_t measure_character(const font_t *font, const char c, const uint8_t scale) { int32_t measure_character(const font_t *font, const char c, const uint8_t scale, unicode_sorta::codepage_t codepage) {
if(c < 32 || c > 127 + 64) { // + 64 char remappings defined in unicode_sorta.hpp if(c < 32 || c > 127 + 64) { // + 64 char remappings defined in unicode_sorta.hpp
return 0; return 0;
} }
@ -10,7 +9,11 @@ namespace bitmap {
uint8_t char_index = c; uint8_t char_index = c;
if(char_index > 127) { if(char_index > 127) {
char_index = unicode_sorta::char_base[c - 128]; if(codepage == unicode_sorta::PAGE_195) {
char_index = unicode_sorta::char_base_195[c - 128];
} else {
char_index = unicode_sorta::char_base_194[c - 128 - 32];
}
} }
char_index -= 32; char_index -= 32;
@ -20,13 +23,22 @@ namespace bitmap {
int32_t measure_text(const font_t *font, const std::string &t, const uint8_t scale) { int32_t measure_text(const font_t *font, const std::string &t, const uint8_t scale) {
int32_t text_width = 0; int32_t text_width = 0;
unicode_sorta::codepage_t codepage = unicode_sorta::PAGE_195;
for(auto c : t) { for(auto c : t) {
text_width += measure_character(font, c, scale); if(c == unicode_sorta::PAGE_194_START) {
codepage = unicode_sorta::PAGE_194;
continue;
} else if (c == unicode_sorta::PAGE_195_START) {
continue;
}
text_width += measure_character(font, c, scale, codepage);
text_width += 1 * scale;
codepage = unicode_sorta::PAGE_195; // Reset back to default
} }
return text_width; return text_width;
} }
void character(const font_t *font, rect_func rectangle, const char c, const int32_t x, const int32_t y, const uint8_t scale) { void character(const font_t *font, rect_func rectangle, const char c, const int32_t x, const int32_t y, const uint8_t scale, unicode_sorta::codepage_t codepage) {
if(c < 32 || c > 127 + 64) { // + 64 char remappings defined in unicode_sorta.hpp if(c < 32 || c > 127 + 64) { // + 64 char remappings defined in unicode_sorta.hpp
return; return;
} }
@ -37,8 +49,13 @@ namespace bitmap {
// Remap any chars that fall outside of the 7-bit ASCII range // Remap any chars that fall outside of the 7-bit ASCII range
// using our unicode fudge lookup table. // using our unicode fudge lookup table.
if(char_index > 127) { if(char_index > 127) {
char_index = unicode_sorta::char_base[c - 128]; if(codepage == unicode_sorta::PAGE_195) {
char_accent = unicode_sorta::char_accent[c - 128]; char_index = unicode_sorta::char_base_195[c - 128];
char_accent = unicode_sorta::char_accent[c - 128];
} else {
char_index = unicode_sorta::char_base_194[c - 128 - 32];
char_accent = unicode_sorta::ACCENT_NONE;
}
} }
// We don't map font data for the first 32 non-printable ASCII chars // We don't map font data for the first 32 non-printable ASCII chars
@ -55,7 +72,7 @@ namespace bitmap {
// Accents can be up to 8 pixels tall on both 8bit and 16bit fonts // Accents can be up to 8 pixels tall on both 8bit and 16bit fonts
// Each accent's data is font->max_width bytes + 2 offset bytes long // Each accent's data is font->max_width bytes + 2 offset bytes long
const uint8_t *a = &font->data[101 * bytes_per_char + char_accent * (font->max_width + 2)]; const uint8_t *a = &font->data[(base_chars + extra_chars) * bytes_per_char + char_accent * (font->max_width + 2)];
// Effectively shift off the first two bytes of accent data- // Effectively shift off the first two bytes of accent data-
// these are the lower and uppercase accent offsets // these are the lower and uppercase accent offsets
@ -104,6 +121,7 @@ namespace bitmap {
void text(const font_t *font, rect_func rectangle, const std::string &t, const int32_t x, const int32_t y, const int32_t wrap, const uint8_t scale) { void text(const font_t *font, rect_func rectangle, const std::string &t, const int32_t x, const int32_t y, const int32_t wrap, const uint8_t scale) {
uint32_t co = 0, lo = 0; // character and line (if wrapping) offset uint32_t co = 0, lo = 0; // character and line (if wrapping) offset
unicode_sorta::codepage_t codepage = unicode_sorta::PAGE_195;
size_t i = 0; size_t i = 0;
while(i < t.length()) { while(i < t.length()) {
@ -116,7 +134,14 @@ namespace bitmap {
uint16_t word_width = 0; uint16_t word_width = 0;
for(size_t j = i; j < next_space; j++) { for(size_t j = i; j < next_space; j++) {
word_width += measure_character(font, t[j], scale); if (t[j] == unicode_sorta::PAGE_194_START) {
codepage = unicode_sorta::PAGE_194;
continue;
} else if (t[j] == unicode_sorta::PAGE_195_START) {
continue;
}
word_width += measure_character(font, t[j], scale, codepage);
codepage = unicode_sorta::PAGE_195;
} }
// if this word would exceed the wrap limit then // if this word would exceed the wrap limit then
@ -128,8 +153,16 @@ namespace bitmap {
// draw word // draw word
for(size_t j = i; j < next_space; j++) { for(size_t j = i; j < next_space; j++) {
character(font, rectangle, t[j], x + co, y + lo, scale); if (t[j] == unicode_sorta::PAGE_194_START) {
co += measure_character(font, t[j], scale); codepage = unicode_sorta::PAGE_194;
continue;
} else if (t[j] == unicode_sorta::PAGE_195_START) {
continue;
}
character(font, rectangle, t[j], x + co, y + lo, scale, codepage);
co += measure_character(font, t[j], scale, codepage);
co += 1 * scale;
codepage = unicode_sorta::PAGE_195;
} }
// move character offset to end of word and add a space // move character offset to end of word and add a space

View File

@ -3,20 +3,24 @@
#include <functional> #include <functional>
#include <string> #include <string>
#include <cstdint> #include <cstdint>
#include "common/unicode_sorta.hpp"
namespace bitmap { namespace bitmap {
const int base_chars = 96; // 96 printable ASCII chars
const int extra_chars = 9; // Extra chars we've rempped that aren't just an ASCII char plus an accent
struct font_t { struct font_t {
const uint8_t height; const uint8_t height;
const uint8_t max_width; const uint8_t max_width;
const uint8_t widths[96 + 5]; // 96 printable ASCII chars plus 5 exta we can't easily remap and decorate with accents const uint8_t widths[base_chars + extra_chars];
const uint8_t data[]; const uint8_t data[];
}; };
typedef std::function<void(int32_t x, int32_t y, int32_t w, int32_t h)> rect_func; typedef std::function<void(int32_t x, int32_t y, int32_t w, int32_t h)> rect_func;
int32_t measure_character(const font_t *font, const char c, const uint8_t scale); int32_t measure_character(const font_t *font, const char c, const uint8_t scale, unicode_sorta::codepage_t codepage = unicode_sorta::PAGE_195);
int32_t measure_text(const font_t *font, const std::string &t, const uint8_t scale); int32_t measure_text(const font_t *font, const std::string &t, const uint8_t scale);
void character(const font_t *font, rect_func rectangle, const char c, const int32_t x, const int32_t y, const uint8_t scale = 2); void character(const font_t *font, rect_func rectangle, const char c, const int32_t x, const int32_t y, const uint8_t scale = 2, unicode_sorta::codepage_t codepage = unicode_sorta::PAGE_195);
void text(const font_t *font, rect_func rectangle, const std::string &t, const int32_t x, const int32_t y, const int32_t wrap, const uint8_t scale = 2); void text(const font_t *font, rect_func rectangle, const std::string &t, const int32_t x, const int32_t y, const int32_t wrap, const uint8_t scale = 2);
} }

View File

@ -12,7 +12,9 @@ const bitmap::font_t font14_outline {
6, 9, 6, 6, 7, 7, 7, 9, 7, 7, 7, 5, 7, 5, 7, 8, 6, 9, 6, 6, 7, 7, 7, 9, 7, 7, 7, 5, 7, 5, 7, 8,
5, 8, 6, 5, 6, 6, 5, 7, 6, 3, 5, 6, 5, 9, 6, 7, 5, 8, 6, 5, 6, 6, 5, 7, 6, 3, 5, 6, 5, 9, 6, 7,
6, 7, 5, 5, 6, 6, 7, 9, 7, 7, 7, 5, 3, 5, 8, 5, 6, 7, 5, 5, 6, 6, 7, 9, 7, 7, 7, 5, 3, 5, 8, 5,
9, 6, 6, 10, 6 // Extra // Extra
// Æ Þ ß æ þ £ ¥ © °
9, 6, 6, 10, 6, 6, 6, 6, 5
}, },
.data = { .data = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
@ -122,6 +124,10 @@ const bitmap::font_t font14_outline {
0x0f, 0xfc, 0x08, 0x04, 0x0f, 0xb4, 0x0b, 0xb4, 0x0c, 0x4c, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ß 0x0f, 0xfc, 0x08, 0x04, 0x0f, 0xb4, 0x0b, 0xb4, 0x0c, 0x4c, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ß
0x07, 0xc0, 0x0c, 0x60, 0x0b, 0xa0, 0x0a, 0xa0, 0x0b, 0xa0, 0x0c, 0x60, 0x0a, 0xa0, 0x0a, 0xa0, 0x0b, 0x60, 0x0f, 0xc0, // æ 0x07, 0xc0, 0x0c, 0x60, 0x0b, 0xa0, 0x0a, 0xa0, 0x0b, 0xa0, 0x0c, 0x60, 0x0a, 0xa0, 0x0a, 0xa0, 0x0b, 0x60, 0x0f, 0xc0, // æ
0x3f, 0xe0, 0x20, 0x20, 0x3d, 0xa0, 0x05, 0xa0, 0x06, 0x60, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // þ 0x3f, 0xe0, 0x20, 0x20, 0x3d, 0xa0, 0x05, 0xa0, 0x06, 0x60, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // þ
0x00, 0xe0, 0x0f, 0xb8, 0x08, 0x04, 0x0b, 0xb4, 0x0a, 0xb4, 0x0e, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // £
0x00, 0x3c, 0x00, 0xe4, 0x0f, 0x9c, 0x08, 0x70, 0x0f, 0x9c, 0x00, 0xe4, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ¥
0x07, 0xc0, 0x0c, 0x60, 0x0b, 0xa0, 0x0a, 0xa0, 0x0e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ©
0x00, 0x38, 0x00, 0x44, 0x00, 0x54, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // °
// Accents + Offsets // Accents + Offsets
// All chars are shifted 8px down into a 32 pixel canvas for combining with accents. // All chars are shifted 8px down into a 32 pixel canvas for combining with accents.
// Accent shift values (the first two numbers in each line below) move the accent down to meet them. // Accent shift values (the first two numbers in each line below) move the accent down to meet them.

View File

@ -6,13 +6,15 @@ const bitmap::font_t font6 {
.height = 6, .height = 6,
.max_width = 6, .max_width = 6,
.widths = { .widths = {
3, 2, 4, 6, 6, 6, 7, 2, 3, 3, 4, 4, 2, 4, 2, 4, 3, 1, 3, 5, 5, 5, 6, 1, 2, 2, 3, 3, 1, 3, 1, 3,
6, 3, 5, 5, 6, 5, 6, 6, 6, 6, 2, 2, 4, 4, 4, 5, 5, 2, 4, 4, 5, 4, 5, 5, 5, 5, 1, 1, 3, 3, 3, 4,
7, 6, 6, 5, 6, 5, 5, 6, 5, 4, 5, 5, 5, 6, 6, 6, 6, 5, 5, 4, 5, 4, 4, 5, 4, 3, 4, 4, 4, 5, 5, 5,
6, 6, 6, 5, 6, 6, 6, 6, 5, 5, 5, 3, 4, 3, 4, 4, 5, 5, 5, 4, 5, 5, 5, 5, 4, 4, 4, 2, 3, 2, 3, 3,
3, 6, 6, 5, 6, 5, 5, 6, 5, 4, 5, 5, 5, 6, 6, 6, 2, 5, 5, 4, 5, 4, 4, 5, 4, 3, 4, 4, 4, 5, 5, 5,
6, 6, 6, 5, 6, 6, 6, 6, 5, 5, 5, 4, 2, 4, 4, 2, 5, 5, 5, 4, 5, 5, 5, 5, 4, 4, 4, 3, 1, 3, 3, 1,
6, 5, 5, 6, 5 // Extra // Extra
// Æ Þ ß æ þ £ ¥ © °
5, 5, 4, 5, 5, 4, 4, 4, 3
}, },
.data = { .data = {
0x00,0x00,0x00,0x00,0x00,0x00, // 0x00,0x00,0x00,0x00,0x00,0x00, //
@ -117,6 +119,10 @@ const bitmap::font_t font6 {
0x3e,0x0a,0x2a,0x34,0x00,0x00, // ß 0x3e,0x0a,0x2a,0x34,0x00,0x00, // ß
0x3c,0x12,0x3c,0x2a,0x2a,0x00, // æ 0x3c,0x12,0x3c,0x2a,0x2a,0x00, // æ
0x3f,0x12,0x12,0x12,0x0e,0x00, // þ 0x3f,0x12,0x12,0x12,0x0e,0x00, // þ
0x08,0x3c,0x2a,0x2a,0x00,0x00, // £
0x26,0x28,0x28,0x1e,0x00,0x00, // ¥s
0x1c,0x22,0x22,0x22,0x00,0x00, // ©
0x02,0x05,0x02,0x00,0x00,0x00, // °
// Accents + Offsets // Accents + Offsets
// All chars are shifted 8px down into a 32 pixel canvas for combining with accents. // All chars are shifted 8px down into a 32 pixel canvas for combining with accents.
// Accent shift values (the first two numbers in each line below) move the accent down to meet them. // Accent shift values (the first two numbers in each line below) move the accent down to meet them.

View File

@ -6,13 +6,15 @@ const bitmap::font_t font8 {
.height = 8, .height = 8,
.max_width = 6, .max_width = 6,
.widths = { .widths = {
2, 2, 4, 6, 5, 5, 5, 2, 4, 4, 4, 4, 3, 4, 3, 5, 3, 1, 3, 5, 4, 4, 4, 1, 3, 3, 3, 3, 2, 3, 2, 4,
5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 2, 3, 4, 4, 4, 5, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 1, 2, 3, 3, 3, 4,
5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 5, 4, 4,
5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 3, 5, 3, 4, 4, 4, 4, 4, 4, 5, 4, 4, 5, 4, 4, 4, 2, 4, 2, 3, 3,
5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 4, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 3, 5, 4, 4,
5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 4, 2, 4, 5, 2, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 3, 1, 3, 4, 1,
6, 5, 5, 6, 5 // Extra // Extra
// Æ Þ ß æ þ £ ¥ © °
5, 4, 4, 5, 4, 4, 4, 4, 3
}, },
.data = { .data = {
0x00,0x00,0x00,0x00,0x00,0x00, // 0x00,0x00,0x00,0x00,0x00,0x00, //
@ -117,6 +119,10 @@ const bitmap::font_t font8 {
0x7e,0x09,0x49,0x36,0x00,0x00, // ß 0x7e,0x09,0x49,0x36,0x00,0x00, // ß
0x20,0x54,0x78,0x54,0x58,0x00, // æ 0x20,0x54,0x78,0x54,0x58,0x00, // æ
0x7f,0x24,0x24,0x18,0x00,0x00, // þ 0x7f,0x24,0x24,0x18,0x00,0x00, // þ
0x08,0x7e,0x49,0x41,0x00,0x00, // £
0x47,0x48,0x48,0x3f,0x00,0x00, // ¥
0x38,0x44,0x44,0x28,0x00,0x00, // ©
0x02,0x05,0x02,0x00,0x00,0x00, // °
// Accents + Offsets // Accents + Offsets
// All chars are shifted 8px down into a 32 pixel canvas for combining with accents. // All chars are shifted 8px down into a 32 pixel canvas for combining with accents.
// Accent shift values (the first two numbers in each line below) move the accent down to meet them. // Accent shift values (the first two numbers in each line below) move the accent down to meet them.

View File

@ -24,7 +24,7 @@ namespace hershey {
} }
if(c > 127) { if(c > 127) {
c = unicode_sorta::char_base[c - 128]; c = unicode_sorta::char_base_195[c - 128];
} }
return &font->chars[c - 32]; return &font->chars[c - 32];

View File

@ -444,7 +444,7 @@ mp_obj_t Badger2040_glyph(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_
enum { ARG_self, ARG_char, ARG_x, ARG_y, ARG_scale, ARG_rotation }; enum { ARG_self, ARG_char, ARG_x, ARG_y, ARG_scale, ARG_rotation };
static const mp_arg_t allowed_args[] = { static const mp_arg_t allowed_args[] = {
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ }, { MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ },
{ MP_QSTR_char, MP_ARG_REQUIRED | MP_ARG_INT }, { MP_QSTR_char, MP_ARG_REQUIRED | MP_ARG_OBJ },
{ MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT }, { MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT },
{ MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT }, { MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT },
{ MP_QSTR_scale, MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_scale, MP_ARG_OBJ, {.u_obj = mp_const_none} },
@ -455,7 +455,8 @@ mp_obj_t Badger2040_glyph(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
int c = args[ARG_char].u_int; int c = 0;
int x = args[ARG_x].u_int; int x = args[ARG_x].u_int;
int y = args[ARG_y].u_int; int y = args[ARG_y].u_int;
float scale = 1.0f; float scale = 1.0f;
@ -468,7 +469,16 @@ mp_obj_t Badger2040_glyph(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_
} }
_Badger2040_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, _Badger2040_obj_t); _Badger2040_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, _Badger2040_obj_t);
self->badger2040->glyph(c, x, y, scale, rotation);
if (mp_obj_is_int(args[ARG_char].u_obj)) {
c = (uint8_t)mp_obj_get_int(args[ARG_char].u_obj);
self->badger2040->glyph(c, x, y, scale, rotation);
} else if (mp_obj_is_str_or_bytes(args[ARG_char].u_obj)) {
std::string message = mp_obj_to_string_r(args[ARG_char].u_obj);
self->badger2040->text(message, x, y, scale, rotation);
} else {
mp_raise_TypeError("glyph: expected char or string.");
}
return mp_const_none; return mp_const_none;
} }