以前の記事でもWebAssemblyについて検証を行いましたが、今回はCanvasへの描画についての検証を行っていきます。
Canvasへの描画には一般的にSDL2というライブラリが用いられるそうです。
これは、画像以外にサウンドなども扱える、所謂マルチメディアライブラリという分類になりますが、今回はグラフィック関連のみの検証になります。
nimble install sdl2
以下のサンプルが非常にためになりました。
[timhutton/sdl-canvas-wasm]
https://github.com/timhutton/sdl-canvas-wasm
C言語のサンプルなので、Nimに書き替えます。
ソースコードについてはこんな感じ。
ポイントとしては、SDL2ライブラリをインポートしている点と、SDL2ライブラリ内の各種命令については、直接SDL2のソースを見て調べています。
nim.cfg については、以下の通りになります。
ここでのポイントは dynlibOverride = "SDL2", -s USE_SDL=2 をオプションに付けることです。
これを付けなくてもコンパイルは通りますが、実行するとChromeの場合、
wasm_sdl01.js:1517 To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linkingのエラーを吐きます。
sdl2.nim を見てみると、各OS毎に外部ライブラリを動的にリンクさせる事が基本となっているようです。
WebAssemblyでも動的にリンクが出来るのかも知れませんが、今回は静的に組み込みたいので、d = "SDL_Static" のコンパイラオプションを付ければ良いかと思いましたが、何やら注釈に "SDL_Static option is deprecated and will soon be removed. Instead please use --dynlibOverride:SDL2." (訳:SDL_Static はいずれ無くなるから、代わりに --dynlibOverride:SDL2 オプションを使ってくれ) とあるので、そちらを付けています。
実行用のhtmlはこんな感じです。
最後に、VScode用の tasks.json がこんな感じになります。
思っていたよりも上手くいきました。
今回からサンプルをGitHubに置くことにしました。
karasu-jp-com/wasm_sdl_nim/wasm_sdl01/
一括ダウンロードはこちら
以上になります。