toge's diary

コンピュータ関連の趣味をつらつらと。

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はやっぱり手が入っているのかなぁ。