GIF 画像入れ替え処理実装 (3)
夢の中でデバッグ終了。
仮に getPNGData にバグがないとしたら、 0 byte の画像データが入っている
んじゃないかという事で、朝までコードを追ってました(夢の中で…)。
% php sample/swfdump.phps ~/tmp.swf <略> [169] tag=DefineBitsLossless2(36) length=8 image_id=69 format=3 width=84 height=188 <略>
正解!
palette 処理
GIF から吸い出したパレットでない変数を参照していたと…
compress 処理
既存の不具合を発見。
compress(tmp_buff, &compsize, old_buff_ref, old_size); fprintf(stderr, "XXX: compsize=%lu old_size=%lu\n, compsize, old_size"); XXX: compsize=0 old_size=16816
ここで compsize (圧縮後の値) が 0 になるので画像データが消えるのですが、
fprintf(stderr, "AAA: compsize=%lu old_size=%lu\n, compsize, old_size"); compress(tmp_buff, &compsize, old_buff_ref, old_size); fprintf(stderr, "XXX: compsize=%lu old_size=%lu\n, compsize, old_size"); AAA: compsize=0 old_size=16816 XXX: compsize=0 old_size=16816
あーーっっ。○rz
fprintf(stderr, "AAA: compsize=%lu old_size=%lu\n, compsize, old_size"); compress(tmp_buff, &compsize, old_buff_ref, old_size); fprintf(stderr, "XXX: compsize=%lu old_size=%lu\n, compsize, old_size");
圧縮後のデータの格納先 buff としてどの位確保したのかを伝えないとダメでした。
compsize = old_size; fprintf(stderr, "AAA: compsize=%lu old_size=%lu\n, compsize, old_size"); compress(tmp_buff, &compsize, old_buff_ref, old_size); fprintf(stderr, "XXX: compsize=%lu old_size=%lu\n, compsize, old_size"); AAA: compsize=16816 old_size=16816 XXX: compsize=8543 old_size=1681
format = 5 では初期化してたけど format = 3 では忘れてたみたい。
format = 3 の動作確認もしてましたが、stack のゴミが入っていて
たまたま動いていたようです。
-O0 もテストパターンに含めておきますかね…
成功!