67 lines
2.1 KiB
C++
67 lines
2.1 KiB
C++
#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
|