# ITerm

&#x20;ターミナル（コンソール）の基底クラスで、画面上の文字列を管理する。このクラスは、実際の画面描画についての手続きは含まれず、このクラスを継承したサブクラスによって画面描画を実装します。

## メソッド

### ITerm() - コンストラクタ

```cpp
ITerm(uint8_t u8c, uint8_t u8l)
ITerm(uint8_t u8c, uint8_t u8l, SimpBuf_GChar* pAryLines, GChar* pBuff)
```

カラム数`u8c`と行数`u8l`を指定して、ターミナルを構築する。カラム数と行数はターミナルで管理できる最大の値を指定する。ターミナルのサイズ変更を行った場合でも各々の最大の値を超える変更は行われない。

`pAryLines`と`pBuff`を指定する場合は、ITerm内でのメモリ確保は行われず、外部で確保済みの配列を利用する。

```cpp
// 静的メモリ確保例
const uint8_t U8COL = 64;
const uint8_t U8LINE = 20;
static TWETERM::GChar screen_buf[U8COL * U8LINE];   // pBuff
static TWETERM::SimpBuf_GChar screen_lines[U8LINE]; // pAryLines
```

### \~ITrem() - デストラクタ

```cpp
virtual ~ITerm()
```

動的にメモリを確保した場合は、そのメモリ領域を破棄します。

### clear(), home(), clear\_screen()

```cpp
void clear()
void home()
void clear_screen()
```

`clear()`は画面バッファのクリア、`home()`はカーソル位置をホームポジションに移動、`clear_screen()`は両者を実行します。

### refresh(), force\_refresh()

```cpp
virtual void refresh() = 0
void force_refresh()
```

サブクラスにより実装される画面更新描画のためのメソッドです。描画方法は２種類あり、メンバー変数`u32Dirty`に定義されるビットマスクに対応した行のみを再描画するものと、`force_refresh()`メソッドによる画面全体を再描画するものがあります。

画面全体の再描画では、いったん背景を背景色で塗りつぶしてから再描画します。初回の描画では`force_refresh()`を行うようにしてください。

### write()

```cpp
ITerm& write(wchar_t c)
ITerm& write(char_t c)
```

ターミナルに１文字書き出します。カーソル位置に文字を書き出します。16bit `wchar_t`型のUnicodeを渡します。

`char_t` (char) 型のパラメータを渡した場合は、入力をUTF-8として取り扱います。例えば0x7F までのASCII文字はそのまま`write(wchar_t)`が呼び出され、３バイトのUTF-8エンコードされた日本語文字は、連続して３バイトを投入した時点で`write(wchar_t)`が呼び出されます。

{% hint style="info" %}
日本語文字セットを表示するためのフォントの取り扱いについては[TWEFONT::FontDef](https://mwm5.twelite.info/0.8/references/untitled/twefont/fontdef)を参照してください。
{% endhint %}

### get\_height(),  get\_width()

```cpp
uint8_t get_height() // 行数
uint8_t get_width()  // カラム数
```

ターミナルの行数、カラム数を返す。

### operator <<

```cpp
ITerm& operator << (const char *s)
TWE::IStreamOut& operator << (TWE::IStreamSpecial& sc)
TWE::IStreamOut& operator << (ITerm& t, char_t c)
TWE::IStreamOut& operator << (ITerm& t, wchar_t c)
TWE::IStreamOut& operator << (ITerm& t, int i)
TWE::IStreamOut& operator << (ITerm& t, TermAttr a)
TWE::IStreamOut& operator << (TWE::IStreamOut& t, TermAttr a)
```

`<<`演算子を用いてターミナルに文字列を書き出します。

| パラメータ              | 意味                                  |
| ------------------ | ----------------------------------- |
| const char \*s     | 文字列 s をターミナルに書き出す (UTF-8のデコードを行います) |
| IStreamSpecial& sc | crlf （改行）など特殊文字を出力する                |
| char\_t c          | 文字 c  をターミナルに書き出す (UTF-8のでコードを行います) |
| wchar\_t c         | 文字 c (Unicode)をターミナルに書き出す           |
| int i              | printf("%d", i) に該当する出力を行います        |
| TermAttr a         | 文字属性を設定します                          |

## メソッド (サブクラス実装用)

| メソッド名                  | 解説                                                                                                                                                                                                                                                     |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| post\_refresh()        | サブクラスでのrefresh()実装で、最後に呼び出す必要があります。必要な変数の初期化を行います。                                                                                                                                                                                                     |
| resize\_screen()       | 指定されたカラム数・行数に従い、バッファを再構成します。コンストラクタ指定の初期値を超えた指定はできません。                                                                                                                                                                                                 |
| column\_idx\_to\_vis() | <p><code>uint16\_t column\_idx\_to\_vis(int16\_t idx , int16\_t lin)</code><br>Unicodeで管理されている画面バッファー上の行位置・カラム位置（ともに0が先頭位置)から、画面上のカラム位置を計算します。日本語文字のような２文字幅文字を２カラムとして計算します。 "abcあいう"という文字列が格納された行のカラム位置4は"い"の文字が格納されますが、本関数で画面上のカラム位置を計算すると5になります。</p> |
| column\_vis\_to\_idx() | <p>column\_vis\_to\_idx(int16\_t c\_vis, int16\_t lin)</p><p>画面上の行位置、カラム位置（ともに0が先頭位置)から、画面バッファー上のカラム位置を計算します。日本語文字のような２文字幅文字を２カラムとして計算します。 "abcあいう"という文字列が格納された行の画面上のカラム位置5または6は"い"の文字が格納されますが、本関数で画面バッファー上のカラム位置を計算すると4になります。</p>                     |
|                        |                                                                                                                                                                                                                                                        |
