libpng

action_game.exeでPNGの読み込みにBoost.GILを使っていたのですが、パレットモードや透過色に対応していないため、仕方なく24/32ビットカラーのみをサポートしていました。
やっぱりこれだと不便なので、直接libpngを呼ぶように書き換えました。
png_loader.cpp
ただし、まだGILと同じく24/32ビットカラーしか扱えてません。


libpngで面倒なのはエラー処理です。
既定のエラー処理関数はreturnせずにlongjmp()で戻るようになっています。
ドキュメントによると、longjmp()でなくC++例外を投げてもよいことになっていますが、本当に大丈夫なのか不安だったのでコードを追ってみました。


ざっと見たところ、libpng内のエラーリカバリ処理にもsetjmp()を使用している箇所が見つかりました。
なので、エラー処理関数が例外を投げた場合はリカバリ処理が走らず、メモリリークが発生する場合があります。
ただし、今回のコードではpng_create_read_struct()以外にこの問題はなさそうなので、png_create_read_struct()呼び出し時はlongjmp()を呼ぶエラー処理関数を使い、その後例外を投げるバージョンに差し替えるようにしています。
これで大丈夫なのかも自信はないです。