|
|
1.1 root 1: //
2: // nono
1.1.1.3 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #pragma once
8:
1.1.1.3 root 9: #include "header.h"
10:
1.1 root 11: // 属性
1.1.1.3 root 12: class TA
13: {
14: public:
15: enum TextAttr : uint {
16: Normal = 0x00 << 8,
17: // On, Off, Disable は3ビットを使った状態値。
18: // これらが実際どう表現されるかはデバイスによる。
19: On = 0x01 << 8, // ビットとかがオンであることを示す
20: Off = 0x02 << 8, // ビットとかがオフであることを示す
21: Disable = 0x03 << 8, // 機能などが無効であることを示す
22: Em = 0x04 << 8, // 値の変化など強調することを示す
23: } attr {};
24:
25: TA() { }
26: TA(TextAttr attr_) : attr(attr_) { }
27:
28: // uint へのキャスト
29: operator uint() const {
30: return (uint)attr;
31: }
32:
33: // val によって On か Off を返す
34: static const TA OnOff(bool val) {
35: return (val) ? TA::On : TA::Off;
36: }
1.1 root 37: };
38:
39: //
40: // テキストスクリーン
41: //
42: // col × row で指定されるテキスト画面。
43: // 表示可能なのは 0x20..0x7e の printable 文字。
44: // 0x20 未満と 0x7f の動作は未定。
45: // 漢字は 2桁占有する。文字列として指定する時は UTF-8 だが、内部コードは
46: // Shift_JIS なので、第一水準、第二水準の文字だけを指定すること。
47: //
48: // TextScreen() コンストラクタで作成して Init(col, row) するか、
49: // TextScreen(col, row) コンストラクタを呼ぶかどちらか選択。
50: // チェックとかはしていないので併用しないこと。
51: //
52: class TextScreen
53: {
54: public:
55: TextScreen();
56: TextScreen(int col, int row);
57: virtual ~TextScreen();
58:
59: // 初期化
60: void Init(int col, int row);
61:
1.1.1.4 root 62: // 画面をクリアして、カーソルをホームポジションに移動
1.1 root 63: void Clear();
64:
1.1.1.2 root 65: // 現在位置を移動
1.1.1.3 root 66: void Locate(int x, int y) {
67: X = x;
68: Y = y;
69: }
1.1.1.2 root 70:
1.1 root 71: // 現在位置に1文字出力 (上位バイトは属性)
1.1.1.4 root 72: // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。
73: virtual void Putc(uint16 ch);
1.1 root 74:
1.1.1.3 root 75: // 現在位置に文字列を出力
1.1.1.4 root 76: // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。
1.1 root 77: void Puts(const char *str);
78:
79: // 現在位置に指定の属性で文字列を出力
1.1.1.4 root 80: // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。
1.1.1.3 root 81: void Puts(TA attr, const char *str);
82:
83: // 座標を指定して文字列を出力
1.1.1.4 root 84: // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。
1.1.1.3 root 85: void Puts(int x, int y, const char *str) {
86: Locate(x, y);
87: Puts(str);
88: }
89:
90: // 座標と属性を指定して、文字列を出力
1.1.1.4 root 91: // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。
1.1.1.3 root 92: void Puts(int x, int y, TA attr, const char *str) {
93: Locate(x, y);
94: Puts(attr, str);
95: }
1.1 root 96:
1.1.1.2 root 97: // 現在位置に属性なしで書式付き文字列を出力
1.1.1.4 root 98: // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。
1.1.1.2 root 99: void Print(const char *fmt, ...) __printflike(2, 3);
100:
1.1 root 101: // 座標を指定して属性なしで書式付き文字列を出力
1.1.1.4 root 102: // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。
1.1 root 103: void Print(int x, int y, const char *fmt, ...) __printflike(4, 5);
104:
105: // 座標と属性を指定して、書式付き文字列を出力
1.1.1.4 root 106: // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。
1.1.1.3 root 107: void Print(int x, int y, TA attr, const char *fmt, ...)
1.1 root 108: __printflike(5, 6);
109:
110: // バッファアドレスを取得。(描画デバイス向け)
1.1.1.2 root 111: const uint16 *GetBuf() const { return textbuf.get(); }
1.1 root 112:
113: // XXX 生バッファを取得
114: // バッファの内部構造を変えた場合はこれを呼んでる人については
115: // 見直しをすること。そのうちなんとかするかも
1.1.1.2 root 116: uint16 *GetRawBuf() { return textbuf.get(); }
117:
118: // 現在の X 座標を取得
119: int GetX() const { return X; }
120: // 現在の Y 座標を取得
121: int GetY() const { return Y; }
1.1 root 122:
123: // 桁数を取得
124: int GetCol() const { return col; }
125:
126: // 行数を取得
127: int GetRow() const { return row; }
128:
1.1.1.4 root 129: // ユーザ定義の引数
130: // ご自由にお使いください。例えばモニタの出力開始オフセットやアドレス
131: // など、呼び出し側が設定して書き出す側がそれに従った内容を出力する
132: // ような用途。
1.1.1.5 root 133: uint64 userdata {};
1.1.1.2 root 134:
1.1.1.4 root 135: protected:
1.1 root 136: // バッファ (幅x高さちょうどの長さ、ゼロ終端文字列ではない)
137: // 上位8ビットは属性、下位8ビットが文字コード。
1.1.1.2 root 138: std::unique_ptr<uint16[]> textbuf {};
1.1 root 139:
140: // 幅
1.1.1.5 root 141: int col {};
1.1 root 142:
143: // 高さ
1.1.1.5 root 144: int row {};
1.1 root 145:
146: // カーソル X 座標
1.1.1.5 root 147: int X {};
1.1 root 148:
149: // カーソル Y 座標
1.1.1.5 root 150: int Y {};
1.1 root 151: };
1.1.1.4 root 152:
153: //
154: // テキストコンソール
155: //
156: class TextConsole : public TextScreen
157: {
158: using inherited = TextScreen;
159: public:
160: TextConsole();
161: virtual ~TextConsole() override;
162:
163: // 現在位置に1文字出力 (上位バイトは属性)
164: // 出力後カーソルは移動する。右端で改行、下端で行スクロールが起きる。
165: void Putc(uint16 ch) override;
166:
167: private:
168: // 改行(次の行の左端に移動)
169: void CRLF();
170: };
171:
172: //
173: // モニターインタフェース
174: //
175: // モニターされる側はこのインタフェースを実装すること。
176: //
177: class IMonitor
178: {
179: public:
1.1.1.6 ! root 180: virtual ~IMonitor();
! 181:
1.1.1.4 root 182: // 自身の現在の状態を TextScreen に書き出す
183: virtual void MonitorUpdate(TextScreen&) = 0;
184:
185: // このモニターが必要とするサイズ(桁数×行数)を取得する
186: virtual nnSize GetMonitorSize() = 0;
187: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.