Kittyやsixel対応エミュレータだと画像表示出来るようになったらしい。
サイズなど制約はあるけど、純粋なVimで画像表示できるのは素晴らしい進化。
やってみる。
構想issueを読む
mattnさんすげぇ
popup_create()とpopup_setoptions()にpixelバッファをレンダーする機能を追加したと。
ターミナルバックエンドはバッファをDEC sixel DCSセクエンスで出力する。(FEAT_IMAGE_SIXEL) ←←←なんだこれ
もしくは、kitty graphics protocol APC セクエンスで出力する。(FEAT_IMAGE_KITTY) ←←←なんだこれ
MS-Windows GUIでは何か良い感じにこのデータを処理してやってるらしい。
popupウィンドウは画像のピクセルから自動的にセルボックス(縁取り?)を計算する。
なので、呼び出し側はminWidhtとかmaxHeightなどを手動で計算する必要はない。

Vim自身はlibpng, libjpeg, libwebpなどの画像でコード系ライブラリのリンクを持っていない
なので、imageアトリビュート(APIって認識で良いのか?)はすでにRGB or RGBAのピクセルバッファにデコードされているやつを取り扱う。
すなわち、呼び出し側がやる必要があり、呼び出し側は、ファイルを任意の外部ツール(ffmpeg, imagemagic, …etc)と繋げることができ、結果バイト列をBlob経由で渡すことができる。
これは、Vimが生成したフットプリント(←なんだこれ)を変更することがない。ユーザーに各種画像フォーマットにレンダーしてる間
これは、Vimのビルドサイズを変更するとなく、ユーザーが既に持っているデコーダを使って、各種画像フォーマットをレンダリングすることが出来る。
image dict(←??引数のことかな) はdata(width*heigh*3のRGB or width*heigh*4のRGBAのBlob)とwidth, heightを許可する
仲間のscriptのgetbgcolor()は背景色を[r, g, b]で返す。だから、ピクセルと事前合成したいスクリプトは実際のポップアップの背景に合わせることが出来る。
let pixels = repeat([0xff, 0x00, 0x00], 4 * 4)->list2blob()
call popup_create('', #{
\ image: #{ data: pixels, width: 4, height: 4 },
\ line: 'cursor+1', col: 'cursor',
\ })
サンプルコードのこれをやってみる