dreamcast/maple/maple_display.hpp

62 lines
1.5 KiB
C++

namespace maple {
namespace display {
namespace vmu {
constexpr int32_t width = 48;
constexpr int32_t height = 32;
constexpr int32_t pixels_per_byte = 8;
constexpr int32_t framebuffer_size = width * height / pixels_per_byte;
}
struct font_renderer {
// 6x8 px font assumed
uint8_t const * const font;
uint8_t fb[vmu::framebuffer_size];
constexpr font_renderer(uint8_t const * const font)
: font(font)
{ }
constexpr inline void glyph(uint8_t c, int x, int y)
{
int y_ix = 186 - (y * 6 * 8);
for (int i = 0; i < 8; i++) {
switch (x) {
case 0:
fb[y_ix - i * 6 + 5] = font[(c - ' ') * 8 + i];
break;
case 1:
fb[y_ix - i * 6 + 5] |= (font[(c - ' ') * 8 + i] & 0b11) << 6;
fb[y_ix - i * 6 + 4] = font[(c - ' ') * 8 + i] >> 2; // 0b1111
break;
case 2:
fb[y_ix - i * 6 + 4] |= (font[(c - ' ') * 8 + i] & 0b1111) << 4;
fb[y_ix - i * 6 + 3] = font[(c - ' ') * 8 + i] >> 4; // 0b11
break;
case 3:
fb[y_ix - i * 6 + 3] |= font[(c - ' ') * 8 + i] << 2;
break;
case 4:
fb[y_ix - i * 6 + 2] = font[(c - ' ') * 8 + i];
break;
case 5:
fb[y_ix - i * 6 + 2] |= (font[(c - ' ') * 8 + i] & 0b11) << 6;
fb[y_ix - i * 6 + 1] = font[(c - ' ') * 8 + i] >> 2; // 0b1111
break;
case 6:
fb[y_ix - i * 6 + 1] |= (font[(c - ' ') * 8 + i] & 0b1111) << 4;
fb[y_ix - i * 6 + 0] = font[(c - ' ') * 8 + i] >> 4; // 0b11
break;
case 7:
fb[y_ix - i * 6 + 0] |= font[(c - ' ') * 8 + i] << 2;
break;
}
}
}
};
} // namespace display
} // namespace maple