|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2024 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // メイン画面をコンソールにする ! 9: // ! 10: ! 11: #pragma once ! 12: ! 13: #include "device.h" ! 14: #include "event.h" ! 15: #include "keyboard.h" ! 16: #include "renderer.h" ! 17: #include <vector> ! 18: ! 19: class BitmapRGBX; ! 20: class COMDriver; ! 21: class COMDriverCons; ! 22: ! 23: class ConsoleDevice : public Device ! 24: { ! 25: using inherited = Device; ! 26: ! 27: static const uint width = 80; ! 28: static const uint height = 30; ! 29: static const uint font_width = 8; ! 30: static const uint font_height = 16; ! 31: ! 32: // 1文字 32ビットのうち下位8ビットが文字コード、上位24ビットが各種属性。 ! 33: // ! 34: // ! 35: // 3 2 1 ! 36: // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 ! 37: // +---------------+---------------+---------------+---------------+ ! 38: // | bgcolor | fgcolor |R| |D|O|S|U|I|B| 文字コード | ! 39: // +---------------+---------------+---------------+---------------+ ! 40: // ! 41: // bgcolor, fgcolor はカラーパレット番号。 ! 42: ! 43: static const uint32 ATTR_BOLD = 0x0000'0100; // B: ボールド ! 44: static const uint32 ATTR_ITALIC = 0x0000'0200; // I: イタリック ! 45: static const uint32 ATTR_UNDERLINE = 0x0000'0400; // U: 下線 ! 46: static const uint32 ATTR_STRIKE = 0x0000'0800; // S: 打ち消し線 ! 47: static const uint32 ATTR_OVERLINE = 0x0000'1000; // O: 上線 ! 48: static const uint32 ATTR_DECSG = 0x0000'2000; // D: DEC 特殊文字 ! 49: static const uint32 ATTR_REVERSE = 0x0000'8000; // R: 反転(暫定) ! 50: ! 51: static const uint32 ATTR_LINEMASK = (ATTR_UNDERLINE | ! 52: ATTR_STRIKE | ! 53: ATTR_OVERLINE); ! 54: ! 55: // フチ [pixel] ! 56: static const uint Padding = ConsoleRenderer::Padding; ! 57: ! 58: public: ! 59: ConsoleDevice(); ! 60: ~ConsoleDevice() override; ! 61: ! 62: bool Init() override; ! 63: void ResetHard(bool poweron) override; ! 64: ! 65: void Attach(COMDriver *); ! 66: void Putchar(uint32); ! 67: ! 68: bool Render(BitmapRGBX& dst); ! 69: ! 70: private: ! 71: void VSyncCallback(Event&); ! 72: void ResetTerminal(); ! 73: void ResetState(); ! 74: void PutcharPlain(uint32); ! 75: void PutcharDebug(uint32); ! 76: bool PutcharESC(uint32); ! 77: bool PutcharCSI(uint32); ! 78: bool PutcharCSIQ(uint32); ! 79: ! 80: void Clear(); ! 81: ! 82: void LocateX(int x); ! 83: void LocateY(int y); ! 84: void Locate(int x, int y) { ! 85: LocateX(x); ! 86: LocateY(y); ! 87: } ! 88: ! 89: void Ascend(); ! 90: void CR(); ! 91: void LF(); ! 92: void CRLF() { ! 93: CR(); ! 94: LF(); ! 95: } ! 96: void ScrollUp(); ! 97: void ScrollDown(); ! 98: ! 99: // 現在位置に、現在の属性で文字 ch を出力する。出力後カーソルは移動する。 ! 100: void Putc(uint32 ch); ! 101: ! 102: // (x, y) の位置に chattr を出力する。カーソルは移動しない。 ! 103: void Setc(int x, int y, uint32 chattr); ! 104: ! 105: // 現在の属性を設定する。 ! 106: void SetAttr(uint32 new_attr); ! 107: ! 108: std::string Dump() const; ! 109: std::string Dump(uint32 ch) const; ! 110: static std::string Dump(const std::vector<uint8>&); ! 111: ! 112: // 画面は 1文字分が uint32 の [width * height] の配列。 ! 113: std::vector<uint32> screen {}; ! 114: // カーソル位置。 ! 115: int cur_x {}; ! 116: int cur_y {}; ! 117: ! 118: // VM スレッド内での行ごとの更新情報。 ! 119: std::vector<bool> dirty {}; ! 120: // レンダラスレッドで未処理の行。 ! 121: // VM スレッドからレンダラスレッドへの連絡用なので mtx で保護する。 ! 122: std::vector<bool> pending {}; ! 123: std::mutex mtx {}; ! 124: ! 125: // 画面初期化。 ! 126: bool init_screen {}; ! 127: ! 128: // 現在の状態。 ! 129: char state {}; ! 130: // 現在の属性。 ! 131: uint32 cur_attr {}; ! 132: ! 133: // 現在の1文字前までのエスケープシーケンス。(現在の文字は ch) ! 134: std::vector<uint8> seq {}; ! 135: // パラメータ部分。 ! 136: std::string arg {}; ! 137: ! 138: // カーソル位置保存。 ! 139: int save_curx {}; ! 140: int save_cury {}; ! 141: ! 142: // スクロール範囲。[0, height) の座標系。 ! 143: int scroll_top {}; ! 144: int scroll_btm {}; ! 145: ! 146: // デバッグログ。 ! 147: FILE *log {}; ! 148: bool log_newline {}; ! 149: ! 150: Event vsync_event { this }; ! 151: ! 152: Renderer *renderer {}; ! 153: COMDriver *comdriver {}; ! 154: ! 155: static const uint8 decsg8x16[15 * font_height]; ! 156: static const Color palette[3]; ! 157: }; ! 158: ! 159: // 入力担当デバイス ! 160: class ConsoleKeyboard : public DumbKeyboard ! 161: { ! 162: using inherited = DumbKeyboard; ! 163: public: ! 164: ConsoleKeyboard(); ! 165: ~ConsoleKeyboard() override; ! 166: ! 167: void Attach(COMDriverCons *); ! 168: ! 169: void CharInput(uint charcode) override; ! 170: ! 171: private: ! 172: COMDriverCons *comdriver {}; ! 173: }; ! 174: ! 175: static inline ConsoleDevice *GetConsoleDevice() { ! 176: return Object::GetObject<ConsoleDevice>(OBJ_CONSOLE); ! 177: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.