Files
eink-dairy/pico-ssd1306/textRenderer/TextRenderer.cpp
T
Adolfo Reyna bc8ae91eba single repo
2026-01-01 13:33:51 -05:00

57 lines
1.9 KiB
C++

#include "TextRenderer.h"
namespace pico_ssd1306 {
void drawText(pico_ssd1306::SSD1306 *ssd1306, const unsigned char *font, const char *text, uint8_t anchor_x,
uint8_t anchor_y, WriteMode mode, Rotation rotation) {
if(!ssd1306 || !font || !text) return;
uint8_t font_width = font[0];
uint16_t n = 0;
while (text[n] != '\0') {
switch (rotation) {
case Rotation::deg0:
drawChar(ssd1306, font, text[n], anchor_x + (n * font_width), anchor_y, mode, rotation);
break;
case Rotation::deg90:
drawChar(ssd1306, font, text[n], anchor_x, anchor_y + (n * font_width), mode, rotation);
break;
}
n++;
}
}
void drawChar(pico_ssd1306::SSD1306 *ssd1306, const unsigned char *font, char c, uint8_t anchor_x, uint8_t anchor_y,
WriteMode mode, Rotation rotation) {
if(!ssd1306 || !font || c < 32) return;
uint8_t font_width = font[0];
uint8_t font_height = font[1];
uint16_t seek = (c - 32) * (font_width * font_height) / 8 + 2;
uint8_t b_seek = 0;
for (uint8_t x = 0; x < font_width; x++) {
for (uint8_t y = 0; y < font_height; y++) {
if (font[seek] >> b_seek & 0b00000001) {
switch (rotation) {
case Rotation::deg0:
ssd1306->setPixel(x + anchor_x, y + anchor_y, mode);
break;
case Rotation::deg90:
ssd1306->setPixel(-y + anchor_x + font_height, x + anchor_y, mode);
break;
}
}
b_seek++;
if (b_seek == 8) {
b_seek = 0;
seek++;
}
}
}
}
}