|
|
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.