#include "engine/microfont.h" #include namespace { // Знак — пять строк по три бита, старший бит слева. Читается как картинка, // если смотреть на единицы: именно поэтому таблица записана двоичными // литералами, а не шестнадцатеричными. struct Glyph { char c; uint8_t rows[MICRO_H]; }; const Glyph GLYPHS[] = { {'0', {0b111, 0b101, 0b101, 0b101, 0b111}}, {'1', {0b010, 0b110, 0b010, 0b010, 0b111}}, {'2', {0b111, 0b001, 0b111, 0b100, 0b111}}, {'3', {0b111, 0b001, 0b011, 0b001, 0b111}}, {'4', {0b101, 0b101, 0b111, 0b001, 0b001}}, {'5', {0b111, 0b100, 0b111, 0b001, 0b111}}, {'6', {0b111, 0b100, 0b111, 0b101, 0b111}}, {'7', {0b111, 0b001, 0b010, 0b010, 0b010}}, {'8', {0b111, 0b101, 0b111, 0b101, 0b111}}, {'9', {0b111, 0b101, 0b111, 0b001, 0b111}}, {'A', {0b111, 0b101, 0b111, 0b101, 0b101}}, {'B', {0b110, 0b101, 0b110, 0b101, 0b110}}, {'C', {0b111, 0b100, 0b100, 0b100, 0b111}}, {'D', {0b110, 0b101, 0b101, 0b101, 0b110}}, {'E', {0b111, 0b100, 0b110, 0b100, 0b111}}, {'F', {0b111, 0b100, 0b110, 0b100, 0b100}}, {'G', {0b111, 0b100, 0b101, 0b101, 0b111}}, {'H', {0b101, 0b101, 0b111, 0b101, 0b101}}, {'I', {0b111, 0b010, 0b010, 0b010, 0b111}}, {'J', {0b001, 0b001, 0b001, 0b101, 0b111}}, {'K', {0b101, 0b101, 0b110, 0b101, 0b101}}, {'L', {0b100, 0b100, 0b100, 0b100, 0b111}}, {'M', {0b101, 0b111, 0b111, 0b101, 0b101}}, {'N', {0b110, 0b101, 0b101, 0b101, 0b101}}, {'O', {0b111, 0b101, 0b101, 0b101, 0b111}}, {'P', {0b111, 0b101, 0b111, 0b100, 0b100}}, {'Q', {0b111, 0b101, 0b101, 0b111, 0b011}}, {'R', {0b111, 0b101, 0b110, 0b101, 0b101}}, {'S', {0b111, 0b100, 0b111, 0b001, 0b111}}, {'T', {0b111, 0b010, 0b010, 0b010, 0b010}}, {'U', {0b101, 0b101, 0b101, 0b101, 0b111}}, {'V', {0b101, 0b101, 0b101, 0b101, 0b010}}, {'W', {0b101, 0b101, 0b111, 0b111, 0b101}}, {'X', {0b101, 0b101, 0b010, 0b101, 0b101}}, {'Y', {0b101, 0b101, 0b010, 0b010, 0b010}}, {'Z', {0b111, 0b001, 0b010, 0b100, 0b111}}, {'-', {0b000, 0b000, 0b111, 0b000, 0b000}}, {'+', {0b000, 0b010, 0b111, 0b010, 0b000}}, {':', {0b000, 0b010, 0b000, 0b010, 0b000}}, {'.', {0b000, 0b000, 0b000, 0b000, 0b010}}, {'/', {0b001, 0b001, 0b010, 0b100, 0b100}}, {'%', {0b101, 0b001, 0b010, 0b100, 0b101}}, {'!', {0b010, 0b010, 0b010, 0b000, 0b010}}, }; const Glyph* Find(char c) { // Строчные приводятся к заглавным: подпись не должна пропадать из-за того, // что кто-то написал её в другом регистре. if (c >= 'a' && c <= 'z') c = char(c - 'a' + 'A'); for (const Glyph& g : GLYPHS) if (g.c == c) return &g; return nullptr; } } // namespace int MicroTextWidth(const char* s) { if (!s || !*s) return 0; const int n = int(std::strlen(s)); return n * MICRO_ADVANCE - 1; } void MicroText(Framebuffer& fb, int x, int y, const char* s, uint32_t color) { if (!s) return; for (int i = 0; s[i]; ++i) { const Glyph* g = Find(s[i]); const int gx = x + i * MICRO_ADVANCE; if (!g) continue; // пробел и всё незнакомое — просто пропуск for (int row = 0; row < MICRO_H; ++row) { const uint8_t bits = g->rows[row]; for (int col = 0; col < MICRO_W; ++col) if (bits & (1u << (MICRO_W - 1 - col))) fb.Put(gx + col, y + row, color); } } } void MicroTextShadow(Framebuffer& fb, int x, int y, const char* s, uint32_t color, uint32_t shadow) { // Подложка — четыре сдвига по осям. Диагонали не нужны: на 3x5 они // съедают просвет внутри знака, и цифра превращается в кляксу. MicroText(fb, x - 1, y, s, shadow); MicroText(fb, x + 1, y, s, shadow); MicroText(fb, x, y - 1, s, shadow); MicroText(fb, x, y + 1, s, shadow); MicroText(fb, x, y, s, color); }