• Rainbow Sixel

現在プレビュー中のWindowsターミナル Ver.1.22には、Sixelと呼ばれる、グラフィック表示機能(写真01)がある。Sixelは、縦6 bitを単位としたグラフィックス機能である。エスケープシーケンスを使い、ASCIIコードの“?”から“~”の64文字で縦6 bitのビットパターンを表現する。

  • 写真01: WSL(Linux)では、LibSixelライブラリがあり、Sixelイメージの生成などを行える。言語によっては、ライブラリとして対応しているものがある。LibSixel付属のimg2sixelコマンドでは、画像ファイルをSixel化してターミナル内に表示することができる

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]の後にパラメーターを置いても無視された。

  • 写真02: ImageMagickは、Sixelに対応しているので、WindowsでもLinuxでも、プラットフォームを問わずにSixel表示が可能

「ビットパターン指定など」に関しては、(表01)を参照されたい。

  • ■表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シリーズなどに実装されていたもの。このため、ターミナルエミュレーター間での互換性がある。

今回のタイトルネタは、トム・クランシーの「レインボーシックス」シリーズ(邦訳、新潮文庫)である。「レッド・オクトーバーを追え」に始まる「ジャック・ライアン」シリーズからのスピンオフ作品。作者の亡くなったあとも、ジャック・ライアン・シリーズは、続いているが、このレインボーシックスが出たあたりが同シリーズのピークだろう。極端な話、同シリーズで読むべきは、このあたりまでである。