気づいたらGIFのデコーダをC++で実装していた。。。
昨日の続き。
サーバで生成したビットマップ画像をESP32でダウンロードして電子ペーパーに書き込んだりしたのだけど、サイズが大きいし、かといってPNGはメモリが少ないと扱いにくいので、GIFを使うことに。
GIFの構造上は、ネットワーク越しに読み込みながらディスプレイに書き込めば、入力データもデコード済みのピクセルデータもメモリ上に置かなくて良いはず。
パレットの情報とLZWの辞書だけメモリ上に持つ省メモリなGIFデコーダを探したけど、意外と良いのが無い。。
http://www.technoblogy.com/show?45YI
これが一番良さそうに見えたのだけど、GitHubのリポジトリのコード見るとあまりちゃんと動かなそう。
とりあえず自分で書いてみて、どんなサイズのGIFでも16kB+αのメモリがあれば動きそうになった。実装も120行くらい。ピクセルの書き込み順を入れ替えて良ければさらに減るけど、悩ましい。
実装してて思い出したけど、20年くらい前にもJavaでGIFファイルのパーサ書いてるな。。。docomoのガラケーのAPIが画像以外のファイル操作を頑なに受け付けないので、仕方なくGIFのコメントブロック内にファイルシステム作っていた思い出。
追記:リポジトリ https://github.com/binzume/gif-decoder
* ESP32で電子ペーパーを使う
3色表示の電子ペーパーが安くなってきたので、試しに買って触ってみる。
https://www.amazon.co.jp/dp/B08H8R6TQG
800x480で白・黒・赤表示ができるやつ。コントローラはGDEW075Z08というやつだった。
Amazonとかで売ってる電子ペーパーモジュールはWaveShareかGoodDisplayというところのやつが多くて、インターフェイスはだいたい同じ。
SPIで制御できるから簡単。。。と思って余ってたM5Atom Liteにつなごうとしたら、GPIOピンが足りない。。。SPIのMISOが不要な代わりにDC,BUSY,RESET,POWERがある。とりあえず、POWERはVCCに、CSもGNDで固定しておく。
コントローラと通信できるようになったので、https://github.com/ZinggJM/GxEPD2 を使って色々表示してみる。
WiFiつなげてJavaScriptからCanvasっぽく使えると良いなと思っていじってたのだけど、リンク時に
ld.exe: region `dram0_0_seg' overflowed by 17440 bytes
とか言われる。RAMはまだ少し余裕があるはずだけどstaticとグローバル用の領域が足りてなさそう。リンカスクリプトがダメっぽいので見てみると、esp32/ld/memory.ld にセグメントのサイズが書いてあった。SDKの奥底にある上に変更してはいけなさそうな雰囲気の書き方なので、諦めてヒープから確保することにする。。。
東京タワーの階段を登った。
* NTVDM
Windows 11には32ビット版が無くてNTVDM.exeが含まれないので、MS-DOS時代の16ビットアプリケーションをサードパーティ製のツール無しに起動する方法は無くなってしまった。
それで困ることはほぼ無いのだけど、昔のプログラムを実行するのに仮想環境が必要になってしまうのは悔しい。MS-DOS Playerを入れていたのだけど、明示的に16ビットアプリケーションを区別して起動する必要があるので、そのまま実行する方法を探していた。
NTVDMx64というのがあるのを知ったのだけど、リークされたWindowsのソースコード使っていそうで怪しいのと、Secure Bootを無効にしないといけないのがネック。最近のWindowsはSecure Bootが有効だとAppInit_DLLsに登録されたDLLを無視するのか。。。
あと、winevdm があったけど、Windows 3.1時代のGUIプログラムを実行するのが目的で少し違うっぽい。どうやって動いてるのか気になったのだけど、古いアプリケーションの16ビットインストーラーを置き換える仕組みがあるのか。ただ、PEヘッダやNEヘッダのないMS-DOS時代のプログラムは実行できなさそう?
熱海