#include "GraphicDisplay.proto.h" #include u32int consoleColor[16] = { 0x00000000, // 0 == black 0x000000AA, // 1 == dark blue 0x0000AA00, // 2 == dark green 0x0000AAAA, // 3 == dark cyan 0x00AA0000, // 4 == dark red 0x00AA00AA, // 5 == dark magenta 0x00AA5500, // 6 == dark orange 0x00A0A0A0, // 7 == light grey 0x00555555, // 8 == dark grey 0x005555FF, // 9 == bright blue 0x0055FF55, // A == bright green 0x0055FFFF, // B == bright cyan 0x00FF5555, // C == bright red 0x00FF55FF, // D == bright yellow 0x00FFFF00, // E == bright orange 0x00FFFFFF, // F == white }; void GraphicDisplay::putChar(u16int line, u16int col, WChar c, u8int color) { drawChar(line, col, c, color); if (line == m_csrBuff.line and col == m_csrBuff.col) { getCsrBuff(); drawCsr(); } } void GraphicDisplay::drawChar(u16int line, u16int col, WChar c, u8int color) { u8int ch = c.toAscii(); if (ch == 0) return; u16int sx = col * C_FONT_WIDTH, sy = line * C_FONT_HEIGHT; u32int fgcolor = consoleColor[color & 0xF], bgcolor = consoleColor[(color >> 4) & 0xF]; for (int y = 0; y < C_FONT_HEIGHT; y++) { u8int pixs = consoleFont[ch][y]; for (int x = 7; x >= 0; x--) { putPix(sx + x, sy + y, ((pixs & 1) != 0 ? fgcolor : bgcolor)); pixs = pixs >> 1; } putPix(sx + 8, sy + y, bgcolor); } } void GraphicDisplay::moveCursor(u16int line, u16int col) { putCsrBuff(); m_csrBuff.line = line; m_csrBuff.col = col; getCsrBuff(); drawCsr(); } //************ CURSOR HANDLING void GraphicDisplay::getCsrBuff() { if (m_csrBuff.col < 0 or m_csrBuff.line < 0) return; for (int x = 0; x < C_FONT_WIDTH; x++) { for (int y = 0; y < C_FONT_HEIGHT; y++) { m_csrBuff.buff[x][y] = getPix((m_csrBuff.col * C_FONT_WIDTH) + x, (m_csrBuff.line * C_FONT_HEIGHT) + y); } } } void GraphicDisplay::putCsrBuff() { if (m_csrBuff.col < 0 or m_csrBuff.line < 0) return; for (int x = 0; x < C_FONT_WIDTH; x++) { for (int y = 0; y < C_FONT_HEIGHT; y++) { putPix((m_csrBuff.col * C_FONT_WIDTH) + x, (m_csrBuff.line * C_FONT_HEIGHT) + y, m_csrBuff.buff[x][y]); } } } void GraphicDisplay::drawCsr() { if (m_csrBuff.col < 0 or m_csrBuff.line < 0) return; for (int x = 0; x < C_FONT_WIDTH; x++) { putPix((m_csrBuff.col * C_FONT_WIDTH) + x, (m_csrBuff.line * C_FONT_HEIGHT) + 14, 0x00FFFFFF); putPix((m_csrBuff.col * C_FONT_WIDTH) + x, (m_csrBuff.line * C_FONT_HEIGHT) + 15, 0x00000000); } }