|
|
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: // ような用途。
! 133: uint64 userdata = 0;
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: // 幅
141: int col = 0;
142:
143: // 高さ
144: int row = 0;
145:
146: // カーソル X 座標
147: int X = 0;
148:
149: // カーソル Y 座標
150: int Y = 0;
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:
! 180: // 自身の現在の状態を TextScreen に書き出す
! 181: virtual void MonitorUpdate(TextScreen&) = 0;
! 182:
! 183: // このモニターが必要とするサイズ(桁数×行数)を取得する
! 184: virtual nnSize GetMonitorSize() = 0;
! 185:
! 186: // デストラクタ
! 187: virtual ~IMonitor() { }
! 188: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.