libpngで独自チャンクを読み込む
libpngでの独自チャンクなんて情報どこにもなくて困り果てていたので、とりあえずメモ書きだけでも。
某プログラムでは、libpngで独自チャンクを含むpngを作成し、それをlibpngで読み込むという処理をしています。
これがFedora Coreではうまく動くのですが、MinGWになった途端読み込みで見事に失敗します。
何をやっても駄目なので、ソースコードをもぐってみたところ、独自チャンクをlibpngに読み込んでもらうためには、以下の処理が必須だとわかりました。
int dummychunkreader(png_structp a, png_unknown_chunkp b) { return 0; } png_set_read_user_chunk_fn(png, NULL, dummychunkreader); ... png_read_end(png, end_info);
これでend_infoに対してpng_get_unknown_chunksすると正しくデータを取得できます。
わざわざpng_set_read_user_chunkで関数設定しないといけないとは・・・。
どうもpngrutil.cのpng_handle_unknownを読む限り、PNG_READ_USER_CHUNKS_SUPPORTEDが定義されている限りこれは必須らしい。
PNG_READ_USER_CHUNKS_SUPPORTEDはpngconf.hでPNG_READ_UNKNOWN_CHUNKS_SUPPORTEDに紐付いて勝手に定義される。
これを消せばいいんだろうけど、libpngの再コンパイルが必要になって、現実的ではない。
上に上げた方法をとるしか回避策はなさそう。
ところがこんなコード既存のコードにはないのですが、Linuxでは動いてしまいます。
謎だなぁ。rpmのソースに手が入っているのかしら?
じつはこの修正を書けたら、Linuxでは動かなくなったりして・・・。
追記
Linuxでも上記設定でうまく動きました。うーん、rpmはやっぱり手が入っているのかなぁ。