From fba7b53c360cba2d4f080055b8ebc8d9204b3412 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Mon, 15 May 2023 10:17:44 +0100 Subject: [PATCH] PicoGraphics: Fixed-width bitmap font support. --- libraries/bitmap_fonts/bitmap_fonts.cpp | 16 +- libraries/bitmap_fonts/bitmap_fonts.hpp | 6 +- libraries/bitmap_fonts/font8_data.hpp | 228 +++++++++--------- libraries/pico_graphics/pico_graphics.cpp | 8 +- libraries/pico_graphics/pico_graphics.hpp | 4 +- .../modules/picographics/picographics.cpp | 12 +- 6 files changed, 141 insertions(+), 133 deletions(-) diff --git a/libraries/bitmap_fonts/bitmap_fonts.cpp b/libraries/bitmap_fonts/bitmap_fonts.cpp index c7608e88..88c847d9 100644 --- a/libraries/bitmap_fonts/bitmap_fonts.cpp +++ b/libraries/bitmap_fonts/bitmap_fonts.cpp @@ -1,11 +1,15 @@ #include "bitmap_fonts.hpp" namespace bitmap { - int32_t measure_character(const font_t *font, const char c, const uint8_t scale, unicode_sorta::codepage_t codepage) { + int32_t measure_character(const font_t *font, const char c, const uint8_t scale, unicode_sorta::codepage_t codepage, bool fixed_width) { if(c < 32 || c > 127 + 64) { // + 64 char remappings defined in unicode_sorta.hpp return 0; } + if(fixed_width) { + return font->max_width * scale; + } + uint8_t char_index = c; if(char_index > 127) { @@ -21,7 +25,7 @@ namespace bitmap { return font->widths[char_index] * scale; } - int32_t measure_text(const font_t *font, const std::string_view &t, const uint8_t scale, const uint8_t letter_spacing) { + int32_t measure_text(const font_t *font, const std::string_view &t, const uint8_t scale, const uint8_t letter_spacing, bool fixed_width) { int32_t text_width = 0; unicode_sorta::codepage_t codepage = unicode_sorta::PAGE_195; for(auto c : t) { @@ -31,7 +35,7 @@ namespace bitmap { } else if (c == unicode_sorta::PAGE_195_START) { continue; } - text_width += measure_character(font, c, scale, codepage); + text_width += measure_character(font, c, scale, codepage, fixed_width); text_width += letter_spacing * scale; codepage = unicode_sorta::PAGE_195; // Reset back to default } @@ -119,7 +123,7 @@ namespace bitmap { } } - void text(const font_t *font, rect_func rectangle, const std::string_view &t, const int32_t x, const int32_t y, const int32_t wrap, const uint8_t scale, const uint8_t letter_spacing) { + void text(const font_t *font, rect_func rectangle, const std::string_view &t, const int32_t x, const int32_t y, const int32_t wrap, const uint8_t scale, const uint8_t letter_spacing, bool fixed_width) { uint32_t co = 0, lo = 0; // character and line (if wrapping) offset unicode_sorta::codepage_t codepage = unicode_sorta::PAGE_195; @@ -148,7 +152,7 @@ namespace bitmap { } else if (t[j] == unicode_sorta::PAGE_195_START) { continue; } - word_width += measure_character(font, t[j], scale, codepage); + word_width += measure_character(font, t[j], scale, codepage, fixed_width); codepage = unicode_sorta::PAGE_195; } @@ -172,7 +176,7 @@ namespace bitmap { co = 0; } else { character(font, rectangle, t[j], x + co, y + lo, scale, codepage); - co += measure_character(font, t[j], scale, codepage); + co += measure_character(font, t[j], scale, codepage, fixed_width); co += letter_spacing * scale; } codepage = unicode_sorta::PAGE_195; diff --git a/libraries/bitmap_fonts/bitmap_fonts.hpp b/libraries/bitmap_fonts/bitmap_fonts.hpp index b7b31e6d..a0cf9ba8 100644 --- a/libraries/bitmap_fonts/bitmap_fonts.hpp +++ b/libraries/bitmap_fonts/bitmap_fonts.hpp @@ -19,9 +19,9 @@ namespace bitmap { typedef std::function rect_func; - 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_view &t, const uint8_t scale = 2, const uint8_t letter_spacing = 1); + int32_t measure_character(const font_t *font, const char c, const uint8_t scale, unicode_sorta::codepage_t codepage = unicode_sorta::PAGE_195, bool fixed_width = false); + int32_t measure_text(const font_t *font, const std::string_view &t, const uint8_t scale = 2, const uint8_t letter_spacing = 1, bool fixed_width = false); 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_view &t, const int32_t x, const int32_t y, const int32_t wrap, const uint8_t scale = 2, const uint8_t letter_spacing = 1); + void text(const font_t *font, rect_func rectangle, const std::string_view &t, const int32_t x, const int32_t y, const int32_t wrap, const uint8_t scale = 2, const uint8_t letter_spacing = 1, bool fixed_width = false); } \ No newline at end of file diff --git a/libraries/bitmap_fonts/font8_data.hpp b/libraries/bitmap_fonts/font8_data.hpp index 358c894b..2abd8fe4 100644 --- a/libraries/bitmap_fonts/font8_data.hpp +++ b/libraries/bitmap_fonts/font8_data.hpp @@ -4,7 +4,7 @@ const bitmap::font_t font8 { .height = 8, - .max_width = 6, + .max_width = 5, .widths = { 3, 1, 3, 5, 4, 4, 4, 1, 3, 3, 3, 3, 2, 3, 2, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 1, 2, 3, 3, 3, 4, @@ -17,123 +17,123 @@ const bitmap::font_t font8 { 5, 4, 4, 5, 4, 4, 4, 4, 3 }, .data = { - 0x00,0x00,0x00,0x00,0x00,0x00, // - 0x5f,0x00,0x00,0x00,0x00,0x00, // ! - 0x03,0x00,0x03,0x00,0x00,0x00, // " - 0x28,0x7c,0x28,0x7c,0x28,0x00, // # - 0x24,0x7a,0x2f,0x12,0x00,0x00, // $ - 0x66,0x10,0x08,0x66,0x00,0x00, // % - 0x36,0x49,0x49,0x7c,0x00,0x00, // & - 0x03,0x00,0x00,0x00,0x00,0x00, // ' - 0x1c,0x22,0x41,0x00,0x00,0x00, // ( - 0x41,0x22,0x1c,0x00,0x00,0x00, // ) - 0x54,0x38,0x54,0x00,0x00,0x00, // * - 0x10,0x38,0x10,0x00,0x00,0x00, // + - 0x80,0x60,0x00,0x00,0x00,0x00, // , - 0x10,0x10,0x10,0x00,0x00,0x00, // - - 0x60,0x60,0x00,0x00,0x00,0x00, // . - 0x60,0x18,0x06,0x01,0x00,0x00, // / - 0x3e,0x41,0x41,0x3e,0x00,0x00, // 0 - 0x42,0x7f,0x40,0x00,0x00,0x00, // 1 - 0x62,0x51,0x49,0x46,0x00,0x00, // 2 - 0x21,0x49,0x4d,0x33,0x00,0x00, // 3 - 0x18,0x16,0x11,0x7f,0x00,0x00, // 4 - 0x4f,0x49,0x49,0x31,0x00,0x00, // 5 - 0x3c,0x4a,0x49,0x30,0x00,0x00, // 6 - 0x01,0x61,0x19,0x07,0x00,0x00, // 7 - 0x36,0x49,0x49,0x36,0x00,0x00, // 8 - 0x06,0x49,0x29,0x1e,0x00,0x00, // 9 - 0x33,0x00,0x00,0x00,0x00,0x00, // : - 0x80,0x6c,0x00,0x00,0x00,0x00, // ; - 0x10,0x28,0x44,0x00,0x00,0x00, // < - 0x28,0x28,0x28,0x00,0x00,0x00, // = - 0x44,0x28,0x10,0x00,0x00,0x00, // > - 0x02,0x51,0x09,0x06,0x00,0x00, // ? - 0x3e,0x49,0x55,0x5e,0x00,0x00, // @ - 0x7e,0x09,0x09,0x7e,0x00,0x00, // A - 0x7f,0x49,0x49,0x36,0x00,0x00, // B - 0x3e,0x41,0x41,0x22,0x00,0x00, // C - 0x7f,0x41,0x41,0x3e,0x00,0x00, // D - 0x7f,0x49,0x49,0x41,0x00,0x00, // E - 0x7f,0x09,0x09,0x01,0x00,0x00, // F - 0x3e,0x41,0x49,0x79,0x00,0x00, // G - 0x7f,0x08,0x08,0x7f,0x00,0x00, // H - 0x41,0x7f,0x41,0x00,0x00,0x00, // I - 0x30,0x40,0x40,0x3f,0x00,0x00, // J - 0x7f,0x08,0x14,0x63,0x00,0x00, // K - 0x7f,0x40,0x40,0x40,0x00,0x00, // L - 0x7f,0x02,0x04,0x02,0x7f,0x00, // M - 0x7f,0x02,0x04,0x7f,0x00,0x00, // N - 0x3e,0x41,0x41,0x3e,0x00,0x00, // O - 0x7f,0x09,0x09,0x06,0x00,0x00, // P - 0x3e,0x41,0x21,0x5e,0x00,0x00, // Q - 0x7f,0x09,0x19,0x66,0x00,0x00, // R - 0x46,0x49,0x49,0x31,0x00,0x00, // S - 0x01,0x01,0x7f,0x01,0x01,0x00, // T - 0x3f,0x40,0x40,0x3f,0x00,0x00, // U - 0x7f,0x40,0x20,0x1f,0x00,0x00, // V - 0x3f,0x40,0x20,0x40,0x3f,0x00, // W - 0x77,0x08,0x08,0x77,0x00,0x00, // X - 0x47,0x48,0x48,0x3f,0x00,0x00, // Y - 0x71,0x49,0x45,0x43,0x00,0x00, // Z - 0x7f,0x41,0x00,0x00,0x00,0x00, // [ - 0x01,0x06,0x18,0x60,0x00,0x00, // "\" - 0x41,0x7f,0x00,0x00,0x00,0x00, // ] - 0x04,0x02,0x04,0x00,0x00,0x00, // ^ - 0x40,0x40,0x40,0x00,0x00,0x00, // _ - 0x01,0x01,0x00,0x00,0x00,0x00, // ` - 0x20,0x54,0x54,0x78,0x00,0x00, // a - 0x7f,0x44,0x44,0x38,0x00,0x00, // b - 0x38,0x44,0x44,0x28,0x00,0x00, // c - 0x38,0x44,0x44,0x7f,0x00,0x00, // d - 0x38,0x54,0x54,0x58,0x00,0x00, // e - 0x7e,0x09,0x09,0x02,0x00,0x00, // f - 0x18,0xa4,0xa4,0x7c,0x00,0x00, // g - 0x7f,0x04,0x04,0x78,0x00,0x00, // h - 0x04,0x7d,0x40,0x00,0x00,0x00, // i - 0x60,0x80,0x80,0x7d,0x00,0x00, // j - 0x7f,0x10,0x28,0x44,0x00,0x00, // k - 0x01,0x7f,0x40,0x00,0x00,0x00, // l - 0x7c,0x04,0x78,0x04,0x78,0x00, // m - 0x7c,0x04,0x04,0x78,0x00,0x00, // n - 0x38,0x44,0x44,0x38,0x00,0x00, // o - 0xfc,0x24,0x24,0x18,0x00,0x00, // p - 0x18,0x24,0x24,0xfc,0x00,0x00, // q - 0x7c,0x08,0x04,0x04,0x00,0x00, // r - 0x48,0x54,0x54,0x24,0x00,0x00, // s - 0x3e,0x44,0x44,0x20,0x00,0x00, // t - 0x3c,0x40,0x40,0x7c,0x00,0x00, // u - 0x7c,0x40,0x20,0x1c,0x00,0x00, // v - 0x3c,0x40,0x20,0x40,0x3c,0x00, // w - 0x6c,0x10,0x10,0x6c,0x00,0x00, // x - 0x1c,0xa0,0xa0,0x7c,0x00,0x00, // y - 0x64,0x54,0x4c,0x00,0x00,0x00, // z - 0x08,0x3e,0x41,0x00,0x00,0x00, // { - 0x7f,0x00,0x00,0x00,0x00,0x00, // | - 0x41,0x3e,0x08,0x00,0x00,0x00, // } - 0x08,0x04,0x08,0x04,0x00,0x00, // ~ - 0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00, // + 0x5f,0x00,0x00,0x00,0x00, // ! + 0x03,0x00,0x03,0x00,0x00, // " + 0x28,0x7c,0x28,0x7c,0x28, // # + 0x24,0x7a,0x2f,0x12,0x00, // $ + 0x66,0x10,0x08,0x66,0x00, // % + 0x36,0x49,0x49,0x7c,0x00, // & + 0x03,0x00,0x00,0x00,0x00, // ' + 0x1c,0x22,0x41,0x00,0x00, // ( + 0x41,0x22,0x1c,0x00,0x00, // ) + 0x54,0x38,0x54,0x00,0x00, // * + 0x10,0x38,0x10,0x00,0x00, // + + 0x80,0x60,0x00,0x00,0x00, // , + 0x10,0x10,0x10,0x00,0x00, // - + 0x60,0x60,0x00,0x00,0x00, // . + 0x60,0x18,0x06,0x01,0x00, // / + 0x3e,0x41,0x41,0x3e,0x00, // 0 + 0x42,0x7f,0x40,0x00,0x00, // 1 + 0x62,0x51,0x49,0x46,0x00, // 2 + 0x21,0x49,0x4d,0x33,0x00, // 3 + 0x18,0x16,0x11,0x7f,0x00, // 4 + 0x4f,0x49,0x49,0x31,0x00, // 5 + 0x3c,0x4a,0x49,0x30,0x00, // 6 + 0x01,0x61,0x19,0x07,0x00, // 7 + 0x36,0x49,0x49,0x36,0x00, // 8 + 0x06,0x49,0x29,0x1e,0x00, // 9 + 0x33,0x00,0x00,0x00,0x00, // : + 0x80,0x6c,0x00,0x00,0x00, // ; + 0x10,0x28,0x44,0x00,0x00, // < + 0x28,0x28,0x28,0x00,0x00, // = + 0x44,0x28,0x10,0x00,0x00, // > + 0x02,0x51,0x09,0x06,0x00, // ? + 0x3e,0x49,0x55,0x5e,0x00, // @ + 0x7e,0x09,0x09,0x7e,0x00, // A + 0x7f,0x49,0x49,0x36,0x00, // B + 0x3e,0x41,0x41,0x22,0x00, // C + 0x7f,0x41,0x41,0x3e,0x00, // D + 0x7f,0x49,0x49,0x41,0x00, // E + 0x7f,0x09,0x09,0x01,0x00, // F + 0x3e,0x41,0x49,0x79,0x00, // G + 0x7f,0x08,0x08,0x7f,0x00, // H + 0x41,0x7f,0x41,0x00,0x00, // I + 0x30,0x40,0x40,0x3f,0x00, // J + 0x7f,0x08,0x14,0x63,0x00, // K + 0x7f,0x40,0x40,0x40,0x00, // L + 0x7f,0x02,0x04,0x02,0x7f, // M + 0x7f,0x02,0x04,0x7f,0x00, // N + 0x3e,0x41,0x41,0x3e,0x00, // O + 0x7f,0x09,0x09,0x06,0x00, // P + 0x3e,0x41,0x21,0x5e,0x00, // Q + 0x7f,0x09,0x19,0x66,0x00, // R + 0x46,0x49,0x49,0x31,0x00, // S + 0x01,0x01,0x7f,0x01,0x01, // T + 0x3f,0x40,0x40,0x3f,0x00, // U + 0x7f,0x40,0x20,0x1f,0x00, // V + 0x3f,0x40,0x20,0x40,0x3f, // W + 0x77,0x08,0x08,0x77,0x00, // X + 0x47,0x48,0x48,0x3f,0x00, // Y + 0x71,0x49,0x45,0x43,0x00, // Z + 0x7f,0x41,0x00,0x00,0x00, // [ + 0x01,0x06,0x18,0x60,0x00, // "\" + 0x41,0x7f,0x00,0x00,0x00, // ] + 0x04,0x02,0x04,0x00,0x00, // ^ + 0x40,0x40,0x40,0x00,0x00, // _ + 0x01,0x01,0x00,0x00,0x00, // ` + 0x20,0x54,0x54,0x78,0x00, // a + 0x7f,0x44,0x44,0x38,0x00, // b + 0x38,0x44,0x44,0x28,0x00, // c + 0x38,0x44,0x44,0x7f,0x00, // d + 0x38,0x54,0x54,0x58,0x00, // e + 0x7e,0x09,0x09,0x02,0x00, // f + 0x18,0xa4,0xa4,0x7c,0x00, // g + 0x7f,0x04,0x04,0x78,0x00, // h + 0x04,0x7d,0x40,0x00,0x00, // i + 0x60,0x80,0x80,0x7d,0x00, // j + 0x7f,0x10,0x28,0x44,0x00, // k + 0x01,0x7f,0x40,0x00,0x00, // l + 0x7c,0x04,0x78,0x04,0x78, // m + 0x7c,0x04,0x04,0x78,0x00, // n + 0x38,0x44,0x44,0x38,0x00, // o + 0xfc,0x24,0x24,0x18,0x00, // p + 0x18,0x24,0x24,0xfc,0x00, // q + 0x7c,0x08,0x04,0x04,0x00, // r + 0x48,0x54,0x54,0x24,0x00, // s + 0x3e,0x44,0x44,0x20,0x00, // t + 0x3c,0x40,0x40,0x7c,0x00, // u + 0x7c,0x40,0x20,0x1c,0x00, // v + 0x3c,0x40,0x20,0x40,0x3c, // w + 0x6c,0x10,0x10,0x6c,0x00, // x + 0x1c,0xa0,0xa0,0x7c,0x00, // y + 0x64,0x54,0x4c,0x00,0x00, // z + 0x08,0x3e,0x41,0x00,0x00, // { + 0x7f,0x00,0x00,0x00,0x00, // | + 0x41,0x3e,0x08,0x00,0x00, // } + 0x08,0x04,0x08,0x04,0x00, // ~ + 0x00,0x00,0x00,0x00,0x00, // Extra - 0x7e,0x09,0x7f,0x49,0x49,0x00, // Æ - 0x7e,0x24,0x24,0x18,0x00,0x00, // Þ - 0x7e,0x09,0x49,0x36,0x00,0x00, // ß - 0x20,0x54,0x78,0x54,0x58,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, // ° + 0x7e,0x09,0x7f,0x49,0x49, // Æ + 0x7e,0x24,0x24,0x18,0x00, // Þ + 0x7e,0x09,0x49,0x36,0x00, // ß + 0x20,0x54,0x78,0x54,0x58, // æ + 0x7f,0x24,0x24,0x18,0x00, // þ + 0x08,0x7e,0x49,0x41,0x00, // £ + 0x47,0x48,0x48,0x3f,0x00, // ¥ + 0x38,0x44,0x44,0x28,0x00, // © + 0x02,0x05,0x02,0x00,0x00, // ° // Accents + Offsets // 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. // These are the shift values for lower and UPPER case letters respectively. - 6,4, 0x00,0x00,0x01,0x02,0x00,0x00, // Grave - 6,4, 0x00,0x00,0x02,0x01,0x00,0x00, // Acute - 6,4, 0x00,0x02,0x01,0x02,0x00,0x00, // Circumflex - 6,4, 0x00,0x01,0x02,0x01,0x02,0x00, // Tilde - 6,4, 0x00,0x01,0x00,0x01,0x00,0x00, // Diaresis - 6,4, 0x00,0x02,0x05,0x02,0x00,0x00, // Ring Above - 6,4, 0x00,0x80,0x40,0x00,0x00,0x00, // Stroke - 9,9, 0x00,0x00,0xa0,0x40,0x00,0x00 // Cedilla + 6,4, 0x00,0x00,0x01,0x02,0x00, // Grave + 6,4, 0x00,0x00,0x02,0x01,0x00, // Acute + 6,4, 0x00,0x02,0x01,0x02,0x00, // Circumflex + 6,4, 0x00,0x01,0x02,0x01,0x02, // Tilde + 6,4, 0x00,0x01,0x00,0x01,0x00, // Diaresis + 6,4, 0x00,0x02,0x05,0x02,0x00, // Ring Above + 6,4, 0x00,0x80,0x40,0x00,0x00, // Stroke + 9,9, 0x00,0x00,0xa0,0x40,0x00 // Cedilla } }; \ No newline at end of file diff --git a/libraries/pico_graphics/pico_graphics.cpp b/libraries/pico_graphics/pico_graphics.cpp index e8f34a49..82271696 100644 --- a/libraries/pico_graphics/pico_graphics.cpp +++ b/libraries/pico_graphics/pico_graphics.cpp @@ -144,11 +144,11 @@ namespace pimoroni { } } - void PicoGraphics::text(const std::string_view &t, const Point &p, int32_t wrap, float s, float a, uint8_t letter_spacing) { + void PicoGraphics::text(const std::string_view &t, const Point &p, int32_t wrap, float s, float a, uint8_t letter_spacing, bool fixed_width) { if (bitmap_font) { bitmap::text(bitmap_font, [this](int32_t x, int32_t y, int32_t w, int32_t h) { rectangle(Rect(x, y, w, h)); - }, t, p.x, p.y, wrap, std::max(1.0f, s), letter_spacing); + }, t, p.x, p.y, wrap, std::max(1.0f, s), letter_spacing, fixed_width); return; } @@ -166,8 +166,8 @@ namespace pimoroni { } } - int32_t PicoGraphics::measure_text(const std::string_view &t, float s, uint8_t letter_spacing) { - if (bitmap_font) return bitmap::measure_text(bitmap_font, t, std::max(1.0f, s), letter_spacing); + int32_t PicoGraphics::measure_text(const std::string_view &t, float s, uint8_t letter_spacing, bool fixed_width) { + if (bitmap_font) return bitmap::measure_text(bitmap_font, t, std::max(1.0f, s), letter_spacing, fixed_width); if (hershey_font) return hershey::measure_text(hershey_font, t, s); return 0; } diff --git a/libraries/pico_graphics/pico_graphics.hpp b/libraries/pico_graphics/pico_graphics.hpp index 2a6671f7..3b5362b1 100644 --- a/libraries/pico_graphics/pico_graphics.hpp +++ b/libraries/pico_graphics/pico_graphics.hpp @@ -286,8 +286,8 @@ namespace pimoroni { void rectangle(const Rect &r); void circle(const Point &p, int32_t r); void character(const char c, const Point &p, float s = 2.0f, float a = 0.0f); - void text(const std::string_view &t, const Point &p, int32_t wrap, float s = 2.0f, float a = 0.0f, uint8_t letter_spacing = 1); - int32_t measure_text(const std::string_view &t, float s = 2.0f, uint8_t letter_spacing = 1); + void text(const std::string_view &t, const Point &p, int32_t wrap, float s = 2.0f, float a = 0.0f, uint8_t letter_spacing = 1, bool fixed_width = false); + int32_t measure_text(const std::string_view &t, float s = 2.0f, uint8_t letter_spacing = 1, bool fixed_width = false); void polygon(const std::vector &points); void triangle(Point p1, Point p2, Point p3); void line(Point p1, Point p2); diff --git a/micropython/modules/picographics/picographics.cpp b/micropython/modules/picographics/picographics.cpp index 989f1e32..33c27af9 100644 --- a/micropython/modules/picographics/picographics.cpp +++ b/micropython/modules/picographics/picographics.cpp @@ -927,7 +927,7 @@ mp_obj_t ModPicoGraphics_character(size_t n_args, const mp_obj_t *pos_args, mp_m } mp_obj_t ModPicoGraphics_text(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - enum { ARG_self, ARG_text, ARG_x, ARG_y, ARG_wrap, ARG_scale, ARG_angle, ARG_spacing }; + enum { ARG_self, ARG_text, ARG_x, ARG_y, ARG_wrap, ARG_scale, ARG_angle, ARG_spacing, ARG_fixed_width }; static const mp_arg_t allowed_args[] = { { MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ }, { MP_QSTR_text, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -937,6 +937,7 @@ mp_obj_t ModPicoGraphics_text(size_t n_args, const mp_obj_t *pos_args, mp_map_t { MP_QSTR_scale, MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_angle, MP_ARG_INT, {.u_int = 0} }, { MP_QSTR_spacing, MP_ARG_INT, {.u_int = 1} }, + { MP_QSTR_fixed_width, MP_ARG_OBJ, {.u_obj = mp_const_false} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; @@ -958,19 +959,21 @@ mp_obj_t ModPicoGraphics_text(size_t n_args, const mp_obj_t *pos_args, mp_map_t float scale = args[ARG_scale].u_obj == mp_const_none ? 2.0f : mp_obj_get_float(args[ARG_scale].u_obj); int angle = args[ARG_angle].u_int; int letter_spacing = args[ARG_spacing].u_int; + bool fixed_width = args[ARG_fixed_width].u_obj == mp_const_true; - self->graphics->text(t, Point(x, y), wrap, scale, angle, letter_spacing); + self->graphics->text(t, Point(x, y), wrap, scale, angle, letter_spacing, fixed_width); return mp_const_none; } mp_obj_t ModPicoGraphics_measure_text(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - enum { ARG_self, ARG_text, ARG_scale, ARG_spacing }; + enum { ARG_self, ARG_text, ARG_scale, ARG_spacing, ARG_fixed_width }; static const mp_arg_t allowed_args[] = { { MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ }, { MP_QSTR_text, MP_ARG_REQUIRED | MP_ARG_OBJ }, { MP_QSTR_scale, MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_spacing, MP_ARG_INT, {.u_int = 1} }, + { MP_QSTR_fixed_width, MP_ARG_OBJ, {.u_obj = mp_const_false} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; @@ -988,8 +991,9 @@ mp_obj_t ModPicoGraphics_measure_text(size_t n_args, const mp_obj_t *pos_args, m float scale = args[ARG_scale].u_obj == mp_const_none ? 2.0f : mp_obj_get_float(args[ARG_scale].u_obj); int letter_spacing = args[ARG_spacing].u_int; + bool fixed_width = args[ARG_fixed_width].u_obj == mp_const_true; - int width = self->graphics->measure_text(t, scale, letter_spacing); + int width = self->graphics->measure_text(t, scale, letter_spacing, fixed_width); return mp_obj_new_int(width); }