diff --git a/src/graphics/ScreenFonts.h b/src/graphics/ScreenFonts.h index c497a27b2..d68f35fec 100644 --- a/src/graphics/ScreenFonts.h +++ b/src/graphics/ScreenFonts.h @@ -103,3 +103,44 @@ #define FONT_HEIGHT_SMALL _fontHeight(FONT_SMALL) #define FONT_HEIGHT_MEDIUM _fontHeight(FONT_MEDIUM) #define FONT_HEIGHT_LARGE _fontHeight(FONT_LARGE) + +// ============================================================================ +// FINAL OVERRIDE: Force TomThumb font +// ============================================================================ +#ifdef DISPLAY_FORCE_TOMTHUMB_FONT + +#include "graphics/fonts/OLEDDisplayFontsTomThumb.h" + +// ----------------------------- +// Replace all Meshtastic fonts +// ----------------------------- +#undef FONT_SMALL_LOCAL +#undef FONT_MEDIUM_LOCAL +#undef FONT_LARGE_LOCAL + +#undef FONT_SMALL +#undef FONT_MEDIUM +#undef FONT_LARGE + +#define FONT_SMALL_LOCAL TomThumb4x6 +#define FONT_MEDIUM_LOCAL TomThumb4x6 +#define FONT_LARGE_LOCAL TomThumb4x6 + +#define FONT_SMALL TomThumb4x6 +#define FONT_MEDIUM TomThumb4x6 +#define FONT_LARGE TomThumb4x6 + +// ------------------------------------------------------- +// Override the *line height used for spacing*, NOT glyphs +// TomThumb is 6 px tall → we give it 11 px layout height +// ------------------------------------------------------- +#undef FONT_HEIGHT_SMALL +#undef FONT_HEIGHT_MEDIUM +#undef FONT_HEIGHT_LARGE + +#define FONT_HEIGHT_SMALL 6 +#define FONT_HEIGHT_MEDIUM 6 +#define FONT_HEIGHT_LARGE 6 + +#endif +// ============================================================================ \ No newline at end of file diff --git a/src/graphics/SharedUIDisplay.cpp b/src/graphics/SharedUIDisplay.cpp index 1645789a7..5d89dee30 100644 --- a/src/graphics/SharedUIDisplay.cpp +++ b/src/graphics/SharedUIDisplay.cpp @@ -380,6 +380,17 @@ const int *getTextPositions(OLEDDisplay *display) { static int textPositions[7]; // Static array that persists beyond function scope +#ifdef DISPLAY_FORCE_TOMTHUMB_FONT + textPositions[0] = textZeroLine; + textPositions[1] = textFirstLine_tiny; + textPositions[2] = textSecondLine_tiny; + textPositions[3] = textThirdLine_tiny; + textPositions[4] = textFourthLine_tiny; + textPositions[5] = textFifthLine_tiny; + textPositions[6] = textSixthLine_tiny; + return textPositions; +#endif + if (isHighResolution) { textPositions[0] = textZeroLine; textPositions[1] = textFirstLine_medium; diff --git a/src/graphics/SharedUIDisplay.h b/src/graphics/SharedUIDisplay.h index b51dfea36..153eaa146 100644 --- a/src/graphics/SharedUIDisplay.h +++ b/src/graphics/SharedUIDisplay.h @@ -35,6 +35,21 @@ namespace graphics #define textFifthLine_large (textFourthLine_large + (FONT_HEIGHT_SMALL + 5)) #define textSixthLine_large (textFifthLine_large + (FONT_HEIGHT_SMALL + 5)) +// Tiny Font Spacing (TomThumb) +// Only active when DISPLAY_FORCE_TOMTHUMB_FONT is defined +#ifdef DISPLAY_FORCE_TOMTHUMB_FONT + +#define TINY_REDUCE 5 + +#define textFirstLine_tiny (FONT_HEIGHT_SMALL + 1) +#define textSecondLine_tiny (textFirstLine_tiny + (FONT_HEIGHT_SMALL - TINY_REDUCE + 5)) +#define textThirdLine_tiny (textSecondLine_tiny + (FONT_HEIGHT_SMALL - TINY_REDUCE + 5)) +#define textFourthLine_tiny (textThirdLine_tiny + (FONT_HEIGHT_SMALL - TINY_REDUCE + 5)) +#define textFifthLine_tiny (textFourthLine_tiny + (FONT_HEIGHT_SMALL - TINY_REDUCE + 5)) +#define textSixthLine_tiny (textFifthLine_tiny + (FONT_HEIGHT_SMALL - TINY_REDUCE + 5)) + +#endif + // Quick screen access #define SCREEN_WIDTH display->getWidth() #define SCREEN_HEIGHT display->getHeight() diff --git a/src/graphics/draw/MessageRenderer.cpp b/src/graphics/draw/MessageRenderer.cpp index da6ec7abc..873f72c5f 100644 --- a/src/graphics/draw/MessageRenderer.cpp +++ b/src/graphics/draw/MessageRenderer.cpp @@ -24,7 +24,11 @@ along with this program. If not, see . #include "configuration.h" #if HAS_SCREEN #include "MessageRenderer.h" - +#ifdef DISPLAY_FORCE_TOMTHUMB_FONT +#define MESSAGE_TINY_Y_OFFSET -3 +#else +#define MESSAGE_TINY_Y_OFFSET 0 +#endif // Core includes #include "NodeDB.h" #include "configuration.h" diff --git a/src/graphics/draw/NodeListRenderer.cpp b/src/graphics/draw/NodeListRenderer.cpp index 1a36a6188..e0f792cbf 100644 --- a/src/graphics/draw/NodeListRenderer.cpp +++ b/src/graphics/draw/NodeListRenderer.cpp @@ -424,7 +424,11 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t EntryRenderer renderer, NodeExtrasRenderer extras, float heading, double lat, double lon) { const int COMMON_HEADER_HEIGHT = FONT_HEIGHT_SMALL - 1; - const int rowYOffset = FONT_HEIGHT_SMALL - 3; + int rowYOffset = FONT_HEIGHT_SMALL - 3; + +#ifdef DISPLAY_FORCE_TOMTHUMB_FONT + rowYOffset += 4; +#endif bool locationScreen = false; if (strcmp(title, "Bearings") == 0) @@ -443,6 +447,9 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t // Space below header y += COMMON_HEADER_HEIGHT; +#ifdef DISPLAY_FORCE_TOMTHUMB_FONT + y += 2; // Push entire list down by 2 pixels for TomThumb +#endif int totalEntries = nodeDB->getNumMeshNodes(); int totalRowsAvailable = (display->getHeight() - y) / rowYOffset; diff --git a/src/graphics/draw/NotificationRenderer.cpp b/src/graphics/draw/NotificationRenderer.cpp index 26bfe8447..e21bb6914 100644 --- a/src/graphics/draw/NotificationRenderer.cpp +++ b/src/graphics/draw/NotificationRenderer.cpp @@ -278,6 +278,9 @@ void NotificationRenderer::drawNodePicker(OLEDDisplay *display, OLEDDisplayUiSta uint16_t totalLines = lineCount + alertBannerOptions; uint16_t screenHeight = display->height(); uint8_t effectiveLineHeight = FONT_HEIGHT_SMALL - 3; +#ifdef DISPLAY_FORCE_TOMTHUMB_FONT + effectiveLineHeight = FONT_HEIGHT_SMALL + 2; +#endif uint8_t visibleTotalLines = std::min(totalLines, (screenHeight - vPadding * 2) / effectiveLineHeight); uint8_t linesShown = lineCount; const char *linePointers[visibleTotalLines + 1] = {0}; // this is sort of a dynamic allocation @@ -408,6 +411,9 @@ void NotificationRenderer::drawAlertBannerOverlay(OLEDDisplay *display, OLEDDisp uint16_t screenHeight = display->height(); uint8_t effectiveLineHeight = FONT_HEIGHT_SMALL - 3; +#ifdef DISPLAY_FORCE_TOMTHUMB_FONT + effectiveLineHeight = FONT_HEIGHT_SMALL + 2; +#endif uint8_t visibleTotalLines = std::min(totalLines, (screenHeight - vPadding * 2) / effectiveLineHeight); uint8_t linesShown = lineCount; const char *linePointers[visibleTotalLines + 1] = {0}; // this is sort of a dynamic allocation @@ -633,6 +639,9 @@ void NotificationRenderer::drawNotificationBox(OLEDDisplay *display, OLEDDisplay uint16_t screenHeight = display->height(); uint8_t effectiveLineHeight = FONT_HEIGHT_SMALL - 3; +#ifdef DISPLAY_FORCE_TOMTHUMB_FONT + effectiveLineHeight = FONT_HEIGHT_SMALL + 2; +#endif uint8_t visibleTotalLines = std::min(lineCount, (screenHeight - vPadding * 2) / effectiveLineHeight); uint16_t contentHeight = visibleTotalLines * effectiveLineHeight; uint16_t boxHeight = contentHeight + vPadding * 2; @@ -664,6 +673,9 @@ void NotificationRenderer::drawNotificationBox(OLEDDisplay *display, OLEDDisplay // === Draw Content === int16_t lineY = boxTop + vPadding; +#ifdef DISPLAY_FORCE_TOMTHUMB_FONT + lineY += 2; // Offset entire options list downward +#endif for (int i = 0; i < lineCount; i++) { int16_t textX = boxLeft + (boxWidth - lineWidths[i]) / 2; if (needs_bell && i == 0) { diff --git a/src/graphics/fonts/OLEDDisplayFontsTomThumb.cpp b/src/graphics/fonts/OLEDDisplayFontsTomThumb.cpp new file mode 100644 index 000000000..8041d7b64 --- /dev/null +++ b/src/graphics/fonts/OLEDDisplayFontsTomThumb.cpp @@ -0,0 +1,410 @@ +#include "OLEDDisplayFontsTomThumb.h" + +const uint8_t TomThumb4x6[] PROGMEM = { + 0x05, // heightMinus1 = 5 → height = 6 + 0x04, // width (unused by Meshtastic, but must exist) + 0x20, // first char + 0xBD, // last char + // Jump Table: + 0xFF, 0xFF, 0x00, 0x04, // space (advance 3->4) + 0x00, 0x00, 0x02, 0x04, // exclam (advance 3->4) + 0x00, 0x02, 0x03, 0x04, // quotedbl (advance 3->4) + 0x00, 0x05, 0x03, 0x04, // numbersign (advance 3->4) + 0x00, 0x08, 0x03, 0x04, // dollar (advance 3->4) + 0x00, 0x0B, 0x03, 0x04, // percent (advance 3->4) + 0x00, 0x0E, 0x03, 0x04, // ampersand (advance 3->4) + 0x00, 0x11, 0x02, 0x04, // quotesingle (advance 3->4) + 0x00, 0x13, 0x03, 0x04, // parenleft (advance 3->4) + 0x00, 0x16, 0x02, 0x04, // parenright (advance 3->4) + 0x00, 0x18, 0x03, 0x04, // asterisk (advance 3->4) + 0x00, 0x1B, 0x03, 0x04, // plus (advance 3->4) + 0x00, 0x1E, 0x02, 0x04, // comma (advance 3->4) + 0x00, 0x20, 0x03, 0x04, // hyphen (advance 3->4) + 0x00, 0x23, 0x02, 0x04, // period (advance 3->4) + 0x00, 0x25, 0x03, 0x04, // slash (advance 3->4) + 0x00, 0x28, 0x03, 0x04, // zero (advance 3->4) + 0x00, 0x2B, 0x02, 0x04, // one (advance 3->4) + 0x00, 0x2D, 0x03, 0x04, // two (advance 3->4) + 0x00, 0x30, 0x03, 0x04, // three (advance 3->4) + 0x00, 0x33, 0x03, 0x04, // four (advance 3->4) + 0x00, 0x36, 0x03, 0x04, // five (advance 3->4) + 0x00, 0x39, 0x03, 0x04, // six (advance 3->4) + 0x00, 0x3C, 0x03, 0x04, // seven (advance 3->4) + 0x00, 0x3F, 0x03, 0x04, // eight (advance 3->4) + 0x00, 0x42, 0x03, 0x04, // nine (advance 3->4) + 0x00, 0x45, 0x02, 0x04, // colon (advance 3->4) + 0x00, 0x47, 0x02, 0x04, // semicolon (advance 3->4) + 0x00, 0x49, 0x03, 0x04, // less (advance 3->4) + 0x00, 0x4C, 0x03, 0x04, // equal (advance 3->4) + 0x00, 0x4F, 0x03, 0x04, // greater (advance 3->4) + 0x00, 0x52, 0x03, 0x04, // question (advance 3->4) + 0x00, 0x55, 0x03, 0x04, // at (advance 3->4) + 0x00, 0x58, 0x03, 0x04, // A (advance 3->4) + 0x00, 0x5B, 0x03, 0x04, // B (advance 3->4) + 0x00, 0x5E, 0x03, 0x04, // C (advance 3->4) + 0x00, 0x61, 0x03, 0x04, // D (advance 3->4) + 0x00, 0x64, 0x03, 0x04, // E (advance 3->4) + 0x00, 0x67, 0x03, 0x04, // F (advance 3->4) + 0x00, 0x6A, 0x03, 0x04, // G (advance 3->4) + 0x00, 0x6D, 0x03, 0x04, // H (advance 3->4) + 0x00, 0x70, 0x03, 0x04, // I (advance 3->4) + 0x00, 0x73, 0x03, 0x04, // J (advance 3->4) + 0x00, 0x76, 0x03, 0x04, // K (advance 3->4) + 0x00, 0x79, 0x03, 0x04, // L (advance 3->4) + 0x00, 0x7C, 0x03, 0x04, // M (advance 3->4) + 0x00, 0x7F, 0x03, 0x04, // N (advance 3->4) + 0x00, 0x82, 0x03, 0x04, // O (advance 3->4) + 0x00, 0x85, 0x03, 0x04, // P (advance 3->4) + 0x00, 0x88, 0x03, 0x04, // Q (advance 3->4) + 0x00, 0x8B, 0x03, 0x04, // R (advance 3->4) + 0x00, 0x8E, 0x03, 0x04, // S (advance 3->4) + 0x00, 0x91, 0x03, 0x04, // T (advance 3->4) + 0x00, 0x94, 0x03, 0x04, // U (advance 3->4) + 0x00, 0x97, 0x03, 0x04, // V (advance 3->4) + 0x00, 0x9A, 0x03, 0x04, // W (advance 3->4) + 0x00, 0x9D, 0x03, 0x04, // X (advance 3->4) + 0x00, 0xA0, 0x03, 0x04, // Y (advance 3->4) + 0x00, 0xA3, 0x03, 0x04, // Z (advance 3->4) + 0x00, 0xA6, 0x03, 0x04, // bracketleft (advance 3->4) + 0x00, 0xA9, 0x03, 0x04, // backslash (advance 3->4) + 0x00, 0xAC, 0x03, 0x04, // bracketright (advance 3->4) + 0x00, 0xAF, 0x03, 0x04, // asciicircum (advance 3->4) + 0x00, 0xB2, 0x03, 0x04, // underscore (advance 3->4) + 0x00, 0xB5, 0x02, 0x04, // grave (advance 3->4) + 0x00, 0xB7, 0x03, 0x04, // a (advance 3->4) + 0x00, 0xBA, 0x03, 0x04, // b (advance 3->4) + 0x00, 0xBD, 0x03, 0x04, // c (advance 3->4) + 0x00, 0xC0, 0x03, 0x04, // d (advance 3->4) + 0x00, 0xC3, 0x03, 0x04, // e (advance 3->4) + 0x00, 0xC6, 0x03, 0x04, // f (advance 3->4) + 0x00, 0xC9, 0x03, 0x04, // g (advance 3->4) + 0x00, 0xCC, 0x03, 0x04, // h (advance 3->4) + 0x00, 0xCF, 0x02, 0x04, // i (advance 3->4) + 0x00, 0xD1, 0x03, 0x04, // j (advance 3->4) + 0x00, 0xD4, 0x03, 0x04, // k (advance 3->4) + 0x00, 0xD7, 0x03, 0x04, // l (advance 3->4) + 0x00, 0xDA, 0x03, 0x04, // m (advance 3->4) + 0x00, 0xDD, 0x03, 0x04, // n (advance 3->4) + 0x00, 0xE0, 0x03, 0x04, // o (advance 3->4) + 0x00, 0xE3, 0x03, 0x04, // p (advance 3->4) + 0x00, 0xE6, 0x03, 0x04, // q (advance 3->4) + 0x00, 0xE9, 0x03, 0x04, // r (advance 3->4) + 0x00, 0xEC, 0x03, 0x04, // s (advance 3->4) + 0x00, 0xEF, 0x03, 0x04, // t (advance 3->4) + 0x00, 0xF2, 0x03, 0x04, // u (advance 3->4) + 0x00, 0xF5, 0x03, 0x04, // v (advance 3->4) + 0x00, 0xF8, 0x03, 0x04, // w (advance 3->4) + 0x00, 0xFB, 0x03, 0x04, // x (advance 3->4) + 0x00, 0xFE, 0x03, 0x04, // y (advance 3->4) + 0x01, 0x01, 0x03, 0x04, // z (advance 3->4) + 0x01, 0x04, 0x03, 0x04, // braceleft (advance 3->4) + 0x01, 0x07, 0x02, 0x04, // bar (advance 3->4) + 0x01, 0x09, 0x03, 0x04, // braceright (advance 3->4) + 0x01, 0x0C, 0x03, 0x04, // asciitilde (advance 3->4) + 0x01, 0x0F, 0x02, 0x04, // exclamdown (advance 3->4) + 0x01, 0x11, 0x03, 0x04, // cent + 0x01, 0x14, 0x03, 0x04, // sterling + 0x01, 0x17, 0x03, 0x04, // currency + 0x01, 0x1A, 0x03, 0x04, // yen + 0x01, 0x1D, 0x02, 0x04, // brokenbar + 0x01, 0x1F, 0x03, 0x04, // section + 0x01, 0x22, 0x03, 0x04, // dieresis + 0x01, 0x25, 0x03, 0x04, // copyright + 0x01, 0x28, 0x03, 0x04, // ordfeminine + 0x01, 0x2B, 0x02, 0x04, // guillemotleft + 0x01, 0x2D, 0x03, 0x04, // logicalnot + 0x01, 0x30, 0x02, 0x04, // softhyphen + 0x01, 0x32, 0x03, 0x04, // registered + 0x01, 0x35, 0x03, 0x04, // macron + 0x01, 0x38, 0x03, 0x04, // degree + 0x01, 0x3B, 0x03, 0x04, // plusminus + 0x01, 0x3E, 0x03, 0x04, // twosuperior + 0x01, 0x41, 0x03, 0x04, // threesuperior + 0x01, 0x44, 0x03, 0x04, // acute + 0x01, 0x47, 0x03, 0x04, // mu + 0x01, 0x4A, 0x03, 0x04, // paragraph + 0x01, 0x4D, 0x03, 0x04, // periodcentered + 0x01, 0x50, 0x03, 0x04, // cedilla + 0x01, 0x53, 0x02, 0x04, // onesuperior + 0x01, 0x55, 0x03, 0x04, // ordmasculine + 0x01, 0x58, 0x03, 0x04, // guillemotright + 0x01, 0x5B, 0x03, 0x04, // onequarter + 0x01, 0x5E, 0x03, 0x04, // onehalf + 0x01, 0x61, 0x03, 0x04, // threequarters + 0x01, 0x64, 0x03, 0x04, // questiondown + 0x01, 0x67, 0x03, 0x04, // Agrave + 0x01, 0x6A, 0x03, 0x04, // Aacute + 0x01, 0x6D, 0x03, 0x04, // Acircumflex + 0x01, 0x70, 0x03, 0x04, // Atilde + 0x01, 0x73, 0x03, 0x04, // Adieresis + 0x01, 0x76, 0x03, 0x04, // Aring + 0x01, 0x79, 0x03, 0x04, // AE + 0x01, 0x7C, 0x03, 0x04, // Ccedilla + 0x01, 0x7F, 0x03, 0x04, // Egrave + 0x01, 0x82, 0x03, 0x04, // Eacute + 0x01, 0x85, 0x03, 0x04, // Ecircumflex + 0x01, 0x88, 0x03, 0x04, // Edieresis + 0x01, 0x8B, 0x03, 0x04, // Igrave + 0x01, 0x8E, 0x03, 0x04, // Iacute + 0x01, 0x91, 0x03, 0x04, // Icircumflex + 0x01, 0x94, 0x03, 0x04, // Idieresis + 0x01, 0x97, 0x03, 0x04, // Eth + 0x01, 0x9A, 0x03, 0x04, // Ntilde + 0x01, 0x9D, 0x03, 0x04, // Ograve + 0x01, 0xA0, 0x03, 0x04, // Oacute + 0x01, 0xA3, 0x03, 0x04, // Ocircumflex + 0x01, 0xA6, 0x03, 0x04, // Otilde + 0x01, 0xA9, 0x03, 0x04, // Odieresis + 0x01, 0xAC, 0x03, 0x04, // multiply + 0x01, 0xAF, 0x03, 0x04, // Oslash + 0x01, 0xB2, 0x03, 0x04, // Ugrave + 0x01, 0xB5, 0x03, 0x04, // Uacute + 0x01, 0xB8, 0x03, 0x04, // Ucircumflex + 0x01, 0xBB, 0x03, 0x04, // Udieresis + 0x01, 0xBE, 0x03, 0x04, // Yacute + 0x01, 0xC1, 0x03, 0x04, // Thorn + 0x01, 0xC4, 0x03, 0x04, // germandbls + 0x01, 0xC7, 0x03, 0x04, // agrave + 0x01, 0xCA, 0x03, 0x04, // aacute + 0x01, 0xCD, 0x03, 0x04, // acircumflex + 0x01, 0xD0, 0x03, 0x04, // atilde + 0x01, 0xD3, 0x03, 0x04, // adieresis + 0x01, 0xD6, 0x03, 0x04, // aring + 0x01, 0xD9, 0x03, 0x04, // ae + 0x01, 0xDC, 0x03, 0x04, // ccedilla + 0x01, 0xDF, 0x03, 0x04, // egrave + 0x01, 0xE2, 0x03, 0x04, // eacute + 0x01, 0xE5, 0x03, 0x04, // ecircumflex + 0x01, 0xE8, 0x03, 0x04, // edieresis + 0x01, 0xEB, 0x03, 0x04, // igrave + 0x01, 0xEE, 0x02, 0x04, // iacute + 0x01, 0xF0, 0x03, 0x04, // icircumflex + 0x01, 0xF3, 0x03, 0x04, // idieresis + 0x01, 0xF6, 0x03, 0x04, // eth + 0x01, 0xF9, 0x03, 0x04, // ntilde + 0x01, 0xFC, 0x03, 0x04, // ograve + 0x01, 0xFF, 0x03, 0x04, // oacute + 0x02, 0x02, 0x03, 0x04, // ocircumflex + 0x02, 0x05, 0x03, 0x04, // otilde + 0x02, 0x08, 0x03, 0x04, // odieresis + 0x02, 0x0B, 0x03, 0x04, // divide + 0x02, 0x0E, 0x03, 0x04, // oslash + 0x02, 0x11, 0x03, 0x04, // ugrave + 0x02, 0x14, 0x03, 0x04, // uacute + 0x02, 0x17, 0x03, 0x04, // ucircumflex + 0x02, 0x1A, 0x03, 0x04, // udieresis + 0x02, 0x1D, 0x03, 0x04, // yacute + 0x02, 0x20, 0x03, 0x04, // thorn + + // ================= + // Font Bitmap Data: + // ================= + 0x00, 0x17, // exclam + 0x03, 0x00, 0x04, // quotedbl + 0x1F, 0x0A, 0x1F, // numbersign + 0x0A, 0x1F, 0x05, // dollar + 0x09, 0x04, 0x12, // percent + 0x0F, 0x17, 0x1C, // ampersand + 0x00, 0x04, // quotesingle + 0x00, 0x0E, 0x11, // parenleft + 0x11, 0x0E, // parenright + 0x05, 0x02, 0x05, // asterisk + 0x04, 0x0E, 0x04, // plus + 0x10, 0x08, // comma + 0x04, 0x04, 0x04, // hyphen + 0x00, 0x10, // period + 0x18, 0x04, 0x04, // slash + 0x1E, 0x11, 0x0F, // zero + 0x02, 0x1F, // one + 0x19, 0x15, 0x12, // two + 0x11, 0x15, 0x0A, // three + 0x07, 0x04, 0x1F, // four + 0x17, 0x15, 0x09, // five + 0x1E, 0x15, 0x1D, // six + 0x19, 0x05, 0x04, // seven + 0x1F, 0x15, 0x1F, // eight + 0x17, 0x15, 0x0F, // nine + 0x00, 0x0A, // colon + 0x10, 0x0A, // semicolon + 0x04, 0x0A, 0x11, // less + 0x0A, 0x0A, 0x0A, // equal + 0x11, 0x0A, 0x04, // greater + 0x01, 0x15, 0x04, // question + 0x0E, 0x15, 0x16, // at + 0x1E, 0x05, 0x1E, // A + 0x1F, 0x15, 0x0A, // B + 0x0E, 0x11, 0x11, // C + 0x1F, 0x11, 0x0E, // D + 0x1F, 0x15, 0x15, // E + 0x1F, 0x05, 0x05, // F + 0x0E, 0x15, 0x1D, // G + 0x1F, 0x04, 0x1F, // H + 0x11, 0x1F, 0x11, // I + 0x08, 0x10, 0x0F, // J + 0x1F, 0x04, 0x1B, // K + 0x1F, 0x10, 0x10, // L + 0x1F, 0x06, 0x1F, // M + 0x1F, 0x0E, 0x1F, // N + 0x0E, 0x11, 0x0E, // O + 0x1F, 0x05, 0x02, // P + 0x0E, 0x19, 0x1E, // Q + 0x1F, 0x0D, 0x16, // R + 0x12, 0x15, 0x09, // S + 0x01, 0x1F, 0x01, // T + 0x0F, 0x10, 0x1F, // U + 0x07, 0x18, 0x07, // V + 0x1F, 0x0C, 0x1F, // W + 0x1B, 0x04, 0x1B, // X + 0x03, 0x1C, 0x04, // Y + 0x19, 0x15, 0x13, // Z + 0x1F, 0x11, 0x11, // bracketleft + 0x02, 0x04, 0x08, // backslash + 0x11, 0x11, 0x1F, // bracketright + 0x02, 0x01, 0x02, // asciicircum + 0x10, 0x10, 0x10, // underscore + 0x01, 0x02, // grave + 0x1A, 0x16, 0x1C, // a + 0x1F, 0x12, 0x0C, // b + 0x0C, 0x12, 0x12, // c + 0x0C, 0x12, 0x1F, // d + 0x0C, 0x1A, 0x16, // e + 0x04, 0x1E, 0x05, // f + 0x0C, 0x2A, 0x1E, // g + 0x1F, 0x02, 0x1C, // h + 0x00, 0x1D, // i + 0x10, 0x20, 0x1D, // j + 0x1F, 0x0C, 0x12, // k + 0x11, 0x1F, 0x10, // l + 0x1E, 0x0E, 0x1E, // m + 0x1E, 0x02, 0x1C, // n + 0x0C, 0x12, 0x0C, // o + 0x3E, 0x12, 0x0C, // p + 0x0C, 0x12, 0x3E, // q + 0x1C, 0x02, 0x02, // r + 0x14, 0x1E, 0x0A, // s + 0x02, 0x1F, 0x12, // t + 0x0E, 0x10, 0x1E, // u + 0x0E, 0x18, 0x0E, // v + 0x1E, 0x1C, 0x1E, // w + 0x12, 0x0C, 0x12, // x + 0x06, 0x28, 0x1E, // y + 0x1A, 0x1E, 0x16, // z + 0x04, 0x1B, 0x11, // braceleft + 0x00, 0x1B, // bar + 0x11, 0x1B, 0x04, // braceright + 0x02, 0x03, 0x01, // asciitilde + 0x00, 0x1D, // exclamdown + 0x0E, 0x1B, 0x0A, // cent + 0x14, 0x1F, 0x15, // sterling + 0x15, 0x0E, 0x15, // currency + 0x0B, 0x1C, 0x0B, // yen + 0x00, 0x1B, // brokenbar + 0x14, 0x1B, 0x05, // section + 0x01, 0x00, 0x01, // dieresis + 0x02, 0x05, 0x05, // copyright + 0x16, 0x15, 0x17, // ordfeminine + 0x02, 0x05, // guillemotleft + 0x02, 0x02, 0x06, // logicalnot + 0x04, 0x04, // softhyphen + 0x07, 0x03, 0x04, // registered + 0x01, 0x01, 0x01, // macron + 0x02, 0x05, 0x02, // degree + 0x12, 0x17, 0x12, // plusminus + 0x01, 0x07, 0x04, // twosuperior + 0x05, 0x07, 0x07, // threesuperior + 0x00, 0x02, 0x01, // acute + 0x1F, 0x08, 0x07, // mu + 0x02, 0x1D, 0x1F, // paragraph + 0x0E, 0x0E, 0x0E, // periodcentered + 0x10, 0x14, 0x08, // cedilla + 0x00, 0x07, // onesuperior + 0x12, 0x15, 0x12, // ordmasculine + 0x00, 0x05, 0x02, // guillemotright + 0x03, 0x08, 0x18, // onequarter + 0x0B, 0x18, 0x10, // onehalf + 0x03, 0x0B, 0x18, // threequarters + 0x18, 0x15, 0x10, // questiondown + 0x18, 0x0D, 0x1A, // Agrave + 0x1A, 0x0D, 0x18, // Aacute + 0x19, 0x0D, 0x19, // Acircumflex + 0x1A, 0x0F, 0x19, // Atilde + 0x1D, 0x0A, 0x1D, // Adieresis + 0x1F, 0x0B, 0x1C, // Aring + 0x1E, 0x1F, 0x15, // AE + 0x06, 0x29, 0x19, // Ccedilla + 0x1C, 0x1D, 0x16, // Egrave + 0x1E, 0x1D, 0x14, // Eacute + 0x1D, 0x1D, 0x15, // Ecircumflex + 0x1D, 0x1C, 0x15, // Edieresis + 0x14, 0x1D, 0x16, // Igrave + 0x16, 0x1D, 0x14, // Iacute + 0x15, 0x1D, 0x15, // Icircumflex + 0x15, 0x1C, 0x15, // Idieresis + 0x1F, 0x15, 0x0E, // Eth + 0x1D, 0x0B, 0x1E, // Ntilde + 0x1C, 0x15, 0x1E, // Ograve + 0x1E, 0x15, 0x1C, // Oacute + 0x1D, 0x15, 0x1D, // Ocircumflex + 0x1D, 0x17, 0x1E, // Otilde + 0x1D, 0x14, 0x1D, // Odieresis + 0x0A, 0x04, 0x0A, // multiply + 0x1E, 0x15, 0x0F, // Oslash + 0x1D, 0x12, 0x1C, // Ugrave + 0x1C, 0x12, 0x1D, // Uacute + 0x1D, 0x11, 0x1D, // Ucircumflex + 0x1D, 0x10, 0x1D, // Udieresis + 0x0C, 0x1A, 0x0D, // Yacute + 0x1F, 0x0A, 0x0E, // Thorn + 0x3E, 0x15, 0x0B, // germandbls + 0x18, 0x15, 0x1E, // agrave + 0x1A, 0x15, 0x1C, // aacute + 0x19, 0x15, 0x1D, // acircumflex + 0x1A, 0x17, 0x1D, // atilde + 0x19, 0x14, 0x1D, // adieresis + 0x18, 0x17, 0x1F, // aring + 0x1C, 0x1E, 0x0E, // ae + 0x04, 0x2A, 0x1A, // ccedilla + 0x08, 0x1D, 0x1E, // egrave + 0x0A, 0x1D, 0x1C, // eacute + 0x09, 0x1D, 0x1D, // ecircumflex + 0x09, 0x1C, 0x1D, // edieresis + 0x00, 0x1D, 0x02, // igrave + 0x02, 0x1D, // iacute + 0x01, 0x1D, 0x01, // icircumflex + 0x01, 0x1C, 0x01, // idieresis + 0x0A, 0x17, 0x1D, // eth + 0x1D, 0x07, 0x1A, // ntilde + 0x08, 0x15, 0x0A, // ograve + 0x0A, 0x15, 0x08, // oacute + 0x09, 0x15, 0x09, // ocircumflex + 0x09, 0x17, 0x0A, // otilde + 0x09, 0x14, 0x09, // odieresis + 0x04, 0x15, 0x04, // divide + 0x1C, 0x16, 0x0E, // oslash + 0x0D, 0x12, 0x1C, // ugrave + 0x0C, 0x12, 0x1D, // uacute + 0x0D, 0x11, 0x1D, // ucircumflex + 0x0D, 0x10, 0x1D, // udieresis + 0x04, 0x2A, 0x1D, // yacute + 0x3E, 0x14, 0x08 // thorn +}; + +// ============================================================================ +// FONT_INFO wrapper required by Meshtastic +// ============================================================================ +// +// NOTE: +// Meshtastic OLED renderer does *not* use the FONT_CHAR_INFO jump table when +// the font uses the raw-array jump table format. But this struct MUST exist. +// +static const FONT_CHAR_INFO TomThumb4x6_CharInfo[] PROGMEM = {}; + +// ============================================================================ +// Final FONT_INFO Export +// ============================================================================ +const FONT_INFO TomThumb4x6_Info = {.heightBits = 6, // REAL glyph height + .baseline = 4, // Correct baseline for 6px font + .startChar = 0x20, + .endChar = 0xBD, + .charInfo = TomThumb4x6_CharInfo, + .data = TomThumb4x6}; \ No newline at end of file diff --git a/src/graphics/fonts/OLEDDisplayFontsTomThumb.h b/src/graphics/fonts/OLEDDisplayFontsTomThumb.h new file mode 100644 index 000000000..95d77f09d --- /dev/null +++ b/src/graphics/fonts/OLEDDisplayFontsTomThumb.h @@ -0,0 +1,32 @@ +#pragma once +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Information about a single character +typedef struct { + uint8_t widthBits; // Glyph width in bits + uint16_t offset; // Offset into the bitmap table +} FONT_CHAR_INFO; + +// Information about the whole font +typedef struct { + uint8_t heightBits; // Character height in pixels (6px) + uint8_t baseline; // baseline (height-1) = 5 + uint8_t startChar; // First supported char = 0x20 + uint8_t endChar; // Last supported char = 0xBD + const FONT_CHAR_INFO *charInfo; // Jump table + const uint8_t *data; // Bitmap table +} FONT_INFO; + +// Raw PROGMEM font data (jump table + bitmap stream) +extern const uint8_t TomThumb4x6[] PROGMEM; + +// Wrapper combining the tables so OLED code can use it +extern const FONT_INFO TomThumb4x6_Info; + +#ifdef __cplusplus +} +#endif diff --git a/variants/esp32s3/heltec_v3/variant.h b/variants/esp32s3/heltec_v3/variant.h index d760c3b7f..4778d1043 100644 --- a/variants/esp32s3/heltec_v3/variant.h +++ b/variants/esp32s3/heltec_v3/variant.h @@ -1,6 +1,8 @@ #define LED_PIN LED #define USE_SSD1306 // Heltec_v3 has a SSD1306 display +#define DISPLAY_FORCE_SMALL_FONTS +#define DISPLAY_FORCE_TOMTHUMB_FONT #define RESET_OLED RST_OLED #define I2C_SDA SDA_OLED // I2C pins for this board diff --git a/variants/nrf52840/seeed_wio_tracker_L1/variant.h b/variants/nrf52840/seeed_wio_tracker_L1/variant.h index c5647caa8..11f4e35b8 100644 --- a/variants/nrf52840/seeed_wio_tracker_L1/variant.h +++ b/variants/nrf52840/seeed_wio_tracker_L1/variant.h @@ -7,6 +7,12 @@ #define VARIANT_MCK (64000000ul) // Master clock frequency #define USE_LFXO // 32.768kHz crystal for LFCLK +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +// Sample size change +// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +#define DISPLAY_FORCE_SMALL_FONTS +#define DISPLAY_FORCE_TOMTHUMB_FONT + // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // Pin Capacity Definitions // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━