0.13 release
PNG PALETTE 形式の透明度対応
PNG の透明度が効かない場合があるとの事で調べたところ、 PALETTE 形式の透明度の考慮が抜けている事が分かりました。
マニュアルを見る感じ、これっぽい。
png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, &trans_values); trans - array of transparent entries for palette (PNG_INFO_tRNS) trans_values - graylevel or color sample values of the single transparent color for non-paletted images (PNG_INFO_tRNS) num_trans - number of transparent entries (PNG_INFO_tRNS)
png_get_bKGD(png_ptr, info_ptr, &background); background - background color (PNG_VALID_bKGD) valid 16-bit red, green and blue values, regardless of color_type
とりあえず前者の tRNS を解析する事にしました。
png.h を見ると
extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values));
となっているので、この型でやり取りすれば OK っぽいです。
実験
コード
png_color *palette = NULL; int palette_num = 0; png_bytep trans; int num_trans; png_color_16p trans_values; png_get_PLTE(png_ptr, png_info, &palette, &palette_num); printf(" palette_num=%d", palette_num); png_get_tRNS(png_ptr, png_info, &trans, &num_trans, &trans_values); printf(" num_trans=%d",num_trans);
実験結果
palette_num=127 num_trans=127
あってるっぽい。
png_dump.c
透明度付き PALETTE 形式 PNG に対応したのでプログラムを晒します。
- http://diary.awm.jp/~yoya/data/2008/10/06/png_dump.c
- http://diary.awm.jp/~yoya/data/2008/10/06/bitstream.h
- http://diary.awm.jp/~yoya/data/2008/10/06/bitstream.c
gcc png_dump.c -lpng bitstream.c
実行結果
(width, height)=(80,80) bpp=8 color_type=3(PALETTE) palette_num=127 num_trans=127 [000] #000000(00) #010101(20) #030202(11) #040404(3e) [004] #080706(52) #090605(2a) #140c0b(ff) #141111(72) [008] #350e0f(ff) #1b1b1b(9d) #241f1d(ff) #312020(5f)
実験ページ
swfed への適用
swf_png.c に実装を追加。
replace API の戻り値を修正
成功:false, 失敗:true になっていたので、修正。
C 言語では成功=>0、失敗=>非0 が一般的ですが、そのまま PHP の false, true に bind しちゃってました。○rz
リリース
ふぅ… 。色々とバグを治しました。
というか replace API の戻り値の不具合は本当にごめんなさい。ごめんなさい。(´Д`;)