6#include "helper/mup_display.h"
17 static const GFXfont *default_font;
18 array<const GFXfont *> fonts;
19 array<FontSize> sizes;
24 FontSize default_size = {0, 6, 8, 0};
25 fonts.add(default_font);
26 sizes.add(default_size);
27 this->features |= MUPDISP_FEATURE_FONTS;
34 void addfont(
const GFXfont *font, uint8_t baseLine) {
35 FontSize size = {baseLine, 0, 0, 0};
36 getFontSize(font, size);
46 void addfont(
const GFXfont *font,
const char *baseLineReference =
"A") {
47 FontSize size = {0, 0, 0, 0};
48 getFontSize(font, size, *baseLineReference);
57 if (font < fonts.length()) {
58 int16_t oldBaseLine = current_font ? sizes[current_font].baseLine : 6;
59 int16_t newBaseLine = font ? sizes[font].baseLine : 6;
61 setTextFont(font, newBaseLine - oldBaseLine);
67 void getFontSize(
const GFXfont *font, FontSize &size,
char baseLineChar = 0) {
68 uint8_t first = pgm_read_byte(&font->first);
69 uint8_t last = pgm_read_byte(&font->last);
70 uint16_t baselineGlyphIndex = (uint16_t)baseLineChar > first ? baseLineChar - first : 0;
71 uint16_t glyphs = last - first + 1;
73 for (uint16_t i = 0; i < glyphs; i++) {
74 GFXglyph *glyph = pgm_read_glyph_ptr(font, i);
75 uint8_t xAdvance = (uint8_t)pgm_read_byte(&glyph->xAdvance);
77 if (baseLineChar && i == baselineGlyphIndex) {
78 size.baseLine = (int8_t)pgm_read_byte(&glyph->yOffset) * -1;
80 if (xAdvance > size.xAdvance) {
81 size.xAdvance = xAdvance;
84 size.yAdvance = (uint8_t)pgm_read_byte(&font->yAdvance);
87 static GFXglyph *pgm_read_glyph_ptr(
const GFXfont *gfxFont, uint8_t c) {
89#if !defined(__INT_MAX__) || (__INT_MAX__ > 0xFFFF)
90 return &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c]);
92 return &(((GFXglyph *)pgm_read_word(&gfxFont->glyph))[c]);
99 return gfxFont->glyph + c;
103 virtual bool commandParser(String command, String args, String topic) {
104 if (MuppletDisplay::commandParser(command, args, topic)) {
106 }
else if (command.startsWith(
"font/")) {
107 return fontParser(command.substring(5), args, topic +
"/font");
112 bool fontParser(String command, String args, String topic) {
113 if (command ==
"get") {
114 pSched->publish(topic, String(current_font));
116 }
else if (command ==
"set") {
117 long font = parseRangedLong(args, 0, fonts.length() - 1, -1, -1);
120 pSched->publish(topic, String(current_font));
128 virtual FontSize getTextFontSize() {
129 return sizes[current_font];
132 virtual uint8_t getTextFontCount() {
133 return fonts.length();
137const GFXfont *MuppletGfxDisplay::default_font =
nullptr;
The base class for all display mupplets.
Definition: mup_display.h:24
The base class for all matrix display mupplets.
Definition: mup_gfx_display.h:14
void addfont(const GFXfont *font, uint8_t baseLine)
Definition: mup_gfx_display.h:34
void addfont(const GFXfont *font, const char *baseLineReference="A")
Definition: mup_gfx_display.h:46
void setfont(uint8_t font)
Definition: mup_gfx_display.h:56
The muwerk namespace.
Definition: display_digits_max72xx.h:10