#ifndef GAME_FONT_H #define GAME_FONT_H #include "Bitmap.h" class Font { public: Font(Bitmap *bitmap, unsigned w, unsigned h, unsigned minCode = 32, unsigned maxCode = 127) : _font(bitmap), _w(w), _h(h), _minCode(minCode), _maxCode(maxCode) { _charsPerRow = _font->GetWidth() / _w; } void renderCharAlpha(int c, int x, int y, uint8_t color, uint8_t *fb, unsigned fbWidth, unsigned fbHeight) { if (c < _minCode || c > _maxCode) return; c -= _minCode; auto bitmapX = (c % _charsPerRow) * _w; auto bitmapY = (c / _charsPerRow) * _h; for (auto charY = 0; charY < _h; charY++) { if (y + charY < 0) continue; if (y + charY >= fbHeight) break; auto yOffset = (y + charY) * fbWidth; for (auto charX = 0; charX < _w; charX++) { if (x + charX < 0) continue; if (x + charX >= fbWidth) break; auto pv = _font->GetPixel(bitmapX + charX, bitmapY + charY); if (pv & 0x80) continue; fb[yOffset + x + charX] = color; } } } void renderChar(int c, int x, int y, uint8_t fgColor, uint8_t bgColor, uint8_t *fb, unsigned fbWidth, unsigned fbHeight) { if (c < _minCode || c > _maxCode) return; c -= _minCode; auto bitmapX = (c % _charsPerRow) * _w; auto bitmapY = (c / _charsPerRow) * _h; for (auto charY = 0; charY < _h; charY++) { if (y + charY < 0) continue; if (y + charY >= fbHeight) break; auto yOffset = (y + charY) * fbWidth; for (auto charX = 0; charX < _w; charX++) { if (x + charX < 0) continue; if (x + charX >= fbWidth) break; auto pv = _font->GetPixel(bitmapX + charX, bitmapY + charY) & 0x80 ? bgColor : fgColor; fb[yOffset + x + charX] = pv; } } } private: Bitmap *_font; unsigned _w, _h; unsigned _minCode; unsigned _maxCode; unsigned _charsPerRow{0}; }; #endif //GAME_FONT_H