現在プレビュー中のWindowsターミナル Ver.1.22には、Sixelと呼ばれる、グラフィック表示機能(写真01)がある。Sixelは、縦6 bitを単位としたグラフィックス機能である。エスケープシーケンスを使い、ASCIIコードの“?”から“~”の64文字で縦6 bitのビットパターンを表現する。
Linuxには、Libsixelがあり、ライブラリを使っての変換処理などが可能になる。これに付属のimg2sixelコマンドは、画像ファイルをターミナル内に表示することができる。
また、ImageMagickがSixelに対応しており、以下のコマンドを使って、Windows側でも、WSL上でも、画像ファイルをSixelに変換して表示できる(写真02)。
magick P08741-20020422-004733.JPG -resize 50% Sixel:
エスケープシーケンスとしては、
[DCS] ["q"] [ビットパターン指定など] [ST]
ただし
[DCS] = [Esc] ["P"]
[ST] = [Esc] [\]
となる。本来のエスケープシーケンスではアスペクト比などのオプション指定が可能だが、Windowsターミナルでは、[DCS]の後にパラメーターを置いても無視された。
「ビットパターン指定など」に関しては、(表01)を参照されたい。
このエスケープシーケンスは、文字カーソル位置には影響を与えないが、描画の起点に現在の文字位置を使う。また、Sixel用のポインタを持ち、ビットパターンごとにポイント位置を更新する。文字間にグラフィックスを置きたいときは、エスケープシーケンスでカーソル位置を必要だけ右へ移動させる必要がある。
Sixelのポインタは、”$"で先頭(Sixel描画開始位置。キャリッジリターン)に戻り、”-”(ラインフィード)で6ドット下に移動する。これらをつかわないと、ポインタはビットパターンごとに右に1ドットずつ進んでいく。エスケープシーケンス内では、間にCR、LFのコードが入っても動作には影響しない。
“#”は、色レジスタ指定を表す。Sixelでは、各ビットにRGBの0~100%の色指定が可能だ。論理的には、100×100×100=1000000色が利用できる。エスケープシーケンス内で、
“#<レジスタ番号>;2;<赤%>;<緑%>;<青%>”
上記のシーケンスで色レジスタにRGB値を設定できる。以後は、“#<レジスタ番号>”でその色を描画色に指定できる。
ただし、パターン文字1つでは、「描画色」、「背景色」の2色しか指定できず、縦6 bitを塗り分けるには、“$”などで行の先頭に戻り、描画色を切り替えて、同じSixelに別の描画色で描画を行う。同じ位置への描画では、OR描画となる。
なお、Windowsターミナルで、Cascadia Codeフォントを使った場合、ASCII文字の1文字分は、10×10ドットに相当する。このことを利用することで、プログラムから10x10ドットの「ユーザー定義文字」を表示することも可能になる。
このエスケープシーケンスは、Windowsターミナル独自ではなく、過去に旧DEC社のVT300シリーズなどに実装されていたもの。このため、ターミナルエミュレーター間での互換性がある。
今回のタイトルネタは、トム・クランシーの「レインボーシックス」シリーズ(邦訳、新潮文庫)である。「レッド・オクトーバーを追え」に始まる「ジャック・ライアン」シリーズからのスピンオフ作品。作者の亡くなったあとも、ジャック・ライアン・シリーズは、続いているが、このレインボーシックスが出たあたりが同シリーズのピークだろう。極端な話、同シリーズで読むべきは、このあたりまでである。