Annotation of nono/lib/textscreen.h, revision 1.1.1.4

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: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.