v.0.1.0 fonts as vectors

This commit is contained in:
tiijay
2025-11-07 14:19:01 +01:00
parent f0614c9a4a
commit b3d9b6bb6c
12 changed files with 426 additions and 447 deletions

View File

@@ -1,4 +1,5 @@
#include "LedMatrix.h"
#include <fonts.hpp>
LedMatrix::LedMatrix(uint8_t h, uint8_t w)
: height(h), width(w), num_leds(h * w), leds(num_leds)
@@ -10,12 +11,22 @@ LedMatrix::~LedMatrix()
{
}
// N entspricht Font-Height
template <size_t N>
const uint8_t LedMatrix::getFontHeight()
{
#ifdef USE_FONT_5x7
return 7;
#elifdef USE_FONT_8x8
return 8;
#elifdef USE_FONT_16x16
return 16;
#endif
}
uint8_t LedMatrix::charWidth(const uint8_t *charMatrix)
{
const uint16_t fHeight = getFontHeight();
uint16_t max_val = 0;
for (size_t i = 0; i < N; i++)
for (size_t i = 0; i < fHeight; i++)
{
if (charMatrix[i] > max_val)
max_val = charMatrix[i];
@@ -47,9 +58,17 @@ void LedMatrix::drawPixel(int x, int y, CRGB color)
uint8_t LedMatrix::drawChar(int x, int y, char c, CRGB color)
{
const uint8_t *fontData = getFontChar_5x7(c);
const u_int8_t char_width_pixel = charWidth<7>(fontData);
const u_int8_t font_height = fontHeight_5x7();
#ifdef USE_FONT_5x7
const std::map<uint8_t, std::vector<uint8_t>> &font = font_5x7;
#elifdef USE_FONT_8x8
const std::map<uint8_t, std::vector<uint8_t>> &font = font_8x8;
#elifdef USE_FONT_16x16
const std::map<uint8_t, std::vector<uint8_t>> &font = font_16x16;
#endif
const vector<uint8_t> &fontData_ = getFontChar(c, font);
const uint8_t *fontData = fontData_.data();
const u_int8_t char_width_pixel = charWidth(fontData);
const u_int8_t font_height = getFontHeight();
const u_int8_t font_width = 5;
for (u_int8_t row = 0; row < font_height; row++)
@@ -89,22 +108,29 @@ void LedMatrix::drawText(int x, int y, const char *text, CRGB color)
}
}
uint8_t LedMatrix::getTextWidth(const char *text)
const uint8_t LedMatrix::getTextWidth(const char *text)
{
uint8_t totalWidth = 0;
for (uint8_t i = 0; text[i] != '\0'; i++)
{
const uint8_t *fontData = getFontChar_5x7(text[i]);
totalWidth += charWidth<7>(fontData) + 1; // char width + spacing
#ifdef USE_FONT_5x7
const std::map<uint8_t, std::vector<uint8_t>> &font = font_5x7;
#elifdef USE_FONT_8x8
const std::map<uint8_t, std::vector<uint8_t>> &font = font_8x8;
#elifdef USE_FONT_16x16
const std::map<uint8_t, std::vector<uint8_t>> &font = font_16x16;
#endif
const vector<uint8_t> &fontData_ = getFontChar(text[i], font);
const uint8_t *fontData = fontData_.data();
totalWidth += charWidth(fontData) + 1; // char width + spacing
}
return totalWidth;
}
void LedMatrix::clearRow(uint8_t y)
{
const u_int8_t font_height = fontHeight_5x7();
Serial.printf("clearRow: %dx%d@%d\n\r", font_height, width, y);
const u_int8_t font_height = getFontHeight();
for (uint8_t line = y; line < (y + font_height); line++)
{

View File

@@ -3,13 +3,21 @@
using namespace std;
#define USE_FONT_5x7
// #define USE_FONT_8x8
// #define USE_FONT_16x16
#include <Arduino.h>
#include <FastLED.h>
#include <vector>
#ifdef USE_FONT_5x7
#include <font_5x7.h>
// #include <font_8x8.h>
// #include <font_16x16.h>
#elifdef USE_FONT_8x8
#include <font_8x8.h>
#elifdef USE_FONT_16x16
#include <font_16x16.h>
#endif
class LedMatrix : public CFastLED
{
@@ -21,14 +29,14 @@ private:
uint16_t num_leds; // default 64x64 = 4096 LEDs
vector<CRGB> leds; // Automatic memory management
template <size_t N>
uint8_t charWidth(const uint8_t *charMatrix);
// Text Scrolling
int8_t scrollPosition = 0;
unsigned long lastScrollTime = 0;
uint8_t getTextWidth(const char *text);
const uint8_t getTextWidth(const char *text);
const uint8_t getFontHeight();
public:
LedMatrix(uint8_t h = 64, uint8_t w = 64);