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 に対応したのでプログラムを晒します。

コンパイル

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 の戻り値の不具合は本当にごめんなさい。ごめんなさい。(´Д`;)