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 もテストパターンに含めておきますかね…

成功!