Emacsでは、ピクセルバッファが紐付けられた「キャンバス」と呼ばれる画像オブジェクトを作成できます。これらの画像オブジェクトには、動的モジュールを介してネイティブにアクセスし、更新することが可能です。詳細については、Canvas Imagesを参照してください。
以下の関数を使用すると、動的モジュールを持つキャンバス画像オブジェクトを操作できます。
uint32_t *canvas_data (emacs_env *env,
emacs_value canvas) ¶この関数は、canvasのピクセルバッファへのアクセスを提供します。ピクセルバッファは行優先順で、サイズはwidthxheightです。ピクセルフォーマットは、すべてのプラットフォームでARGB32です。エラーが発生した場合はNULLを返します。
なお、ピクセルバッファは、キャンバスオブジェクトが生存しており、かつそのサイズが変更されていない間のみ有効です。サイズが変更された場合、Emacsは新しいピクセルバッファを作成し、キャンバスを自動的にリサイズします。
ダイナミックモジュール経由でキャンバスのピクセルバッファを更新した後は、Emacsにキャンバスを再表示させるために canvas-refresh を呼び出す必要があります。これは、モジュールから Elisp の funcall
を用いて実行できます。
/* Access the pixel buffer */
uint32_t *pixel = env->canvas_data (env, canvas);
/* Write to the pixel buffer */
...
/* Redraw the canvas */
env->funcall(env, env->intern(env, "canvas-refresh"), 2,
(emacs_value[]){canvas, Qnil});
なお、canvas-refresh には、キャンバス画像の指定から :data
ベクトルまたは文字列を再読み込みするためのオプションのブール型引数があります。動的モジュールから呼び出される場合、この引数は通常 Qnil となります。
このように、Canvas Images で規定されている仕様に従い、キャンバスの画像オブジェクトを引数に取るモジュール関数を単純に定義し、上記のコードを用いてキャンバスのピクセルバッファを操作して再描画すればよい。