続 libpng

パレットカラーと透過色に対応しました。
png_loader.cppの差分


libpngにはよく使用されるフォーマット変換用のフィルタが用意されているので、これを使って常に32ビットカラー(BGRA)で読み込むようにしています。
実は昨日のコードにも組み込んではいたのですが、試したら動かなかったのでした。
マニュアルをよく読むと、マズい箇所が二つほど見つかりました。


一つは、png_get_IHDR()が無効な引数のため失敗していた点です。
この関数は後ろの3引数以外は必須(非NULL)なのですが、幅と高さがいらなかったのでNULLにしていました。
結果、ビット深度とカラータイプがゴミデータになっていて、フィルタを正しく選択できていませんでした。


もう一つは、フィルタを設定した後にpng_read_update_info()の呼び出しが抜けていた点です。
png_set_palette_to_rgb()等のフィルタを設定すると、画像フォーマットが変わってしまうため、png_read_update_info()でpng_infoを更新する必要がありました。


これでフルカラー以外のPNGも使えるようになったので、画像を全て256色(+透過色)に変換しました。
あと、libpngのサイトを久々に見たらバージョンが上がっていたので更新して、Hamigaki.PngのJamfileもそれに合わせて微調整しています。