57 lines
1.9 KiB
C++
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++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |