vim-jp » Vimのユーザーと開発者を結ぶコミュニティサイト

Windows で色付きの絵文字が表示出来る様になりました。

Posted on 2017-11-27


色付き絵文字の問題

Windows 版の gvim は基本部分は GDI (Graphics Device Interface) で描画し、フォントのレンダリングを DirectX API の DirectWrite を使って描画しています。ハードウェアレンダリング用の API ではありますが、Vim は GDI でのレンダリングにツギハギをあてる様に DirectWrite を使った実装が行われているため、思った様にパフォーマンスを得る事が出来ず、逆に遅くなってしまっていました。renderoptions オプションを使っておられた方であれば、アンチエイリアスを効かせたとたん Vim がモッサリしていたのをご存じかと思います。

それとは別に、Windows 版の gvim には Windows 8.1 以降でサポートされた「色付きの絵文字」がレンダリング出来ないという極めて重大な欠陥がありました。寿司絵文字 :sushi: やビール絵文字 :beer: が色付きで描画されないという事は、エンジニアの進捗度合いにも影響しかねません。

この問題に対して Windows で色付きの絵文字を描画できる様にして、なおかつ描画パフォーマンスも改善するパッチがマージされました。

色付き絵文字

技術背景

これまでの gvim は Compatible Bitmap を使って DirectWrite に一括描画させ、それを BitBlt という描画転送 API を使ってレンダリングするという手法が使われてきました。この制限により DirectWrite で使える API も限定されていました。今回の修正では、実装にてグリフを解釈し個々に色付けする事で絵文字を描画しています。

実装内容をお知りになりたい方は、今回マージされた pull-request を参照下さい。

https://github.com/vim/vim/pull/2375

色付き絵文字が表示されない条件

gvim をお使いの環境や設定次第では正しく描画されないケースがあります。

まず、色付きの絵文字を表示する為には Windows 8.1 以降である必要があります。Windows 7 は色付き絵文字はサポートしていません。

またフォントの設定オプション guifont で指定されたフォントに、既に色付きでない絵文字のグリフが含まれている場合には、そちらが優先して描画されるため色付きの絵文字が表示されません。

フォントに絵文字のグリフが含まれていない場合にはシステムのフォントにフォールバックされます。Windows 10 であれば「Segoe UI Emoji」が代替フォントとして使用されます。この代替フォントで対象のグリフが固定幅でない場合は文字の描画幅を超えて描画される場合があります。以下の画面で幾らかの絵文字が幅を超えて描画されている事が確認頂けます。この問題を解消するには、全て等幅の絵文字のグリフを持ったフォントを導入して頂く必要があります。

色付き絵文字

パフォーマンスの改善

今回はこの色付き絵文字の対応を行った際に、前述の Compatible Bitmap を使った方式を廃止し、DirectWrite にデバイスコンテキストを預けて描画させる方式へとスイッチしました。これにより、これまでの色付き絵文字に対応していないバージョンよりも描画パフォーマンスが改善しモッサリ感が幾らか解消されました。ぜひ最新版を使って頂き、このパフォーマンス改善を体感して頂きたいと思います。Vim の nightly build は以下からダウンロード出来ます。

https://github.com/vim/vim-win32-installer/releases

対応裏話

今回の色付き絵文字対応は vim-jp の3名で行いました。Vim の開発者 Bram Moolenaar 氏は、送られてきたパッチを事細かく確認される方なので、マージされるまでには数週間掛かるのではとも言われていました。しかしいざ pull-request を送ってみたところ、わずか3時間というスピードマージとなり、担当した3人も驚きを隠せませんでした。

この開発裏話がブログ記事になっていますので、こちらもぜひご覧下さい。

カラー絵文字パッチ制作の経緯 - KaoriYa

また renderoptions の詳しい情報は vimdoc の日本語翻訳版の renderoptions の補足にて確認して頂く事が出来ます。


もどる