giflib でフィルタ処理 (2)

フィルタを作る準備としてとりあえず、Encode/Decode だけするプログラムを
順次処理方式と、そうでない方式で作成してみました。

  • 順次処理方式

- http://diary.awm.jp/~yoya/data/2008/09/23/gifinout1.c

  • そうでない方式

- http://diary.awm.jp/~yoya/data/2008/09/23/gifinout2.c

後者の方がシンプルなコードになるけど、処理を最小にしようとすると前者を
使うしかないかも。 状況によって使い分けって事で。

補足

あ、念の為に補足しとくと、このプログラムだけなら EGifOpenFileHandle
に stdout を渡せばコードがかなり短くなりますが、データ配列のまま
ごにょごにょする予定なので、こんな回りくどいコードになってます。

SWF Editor for PHP (スウィフエディター) プロジェクト日本語トップページ - OSDN でも流用するつもりですし。(*'ω'*)

Close 処理が微妙な…

GIFアニメはカラーマップをグローバルなのと別にフレーム毎(ローカル)
に持てますが、グローバルなのと最終フレーム(←終了時に処理対象カーソルが
指してるフレーム) のカラーマップしか Free してような… (´Д`;)

582 DGifCloseFile(GifFileType * GifFile) {
	<略>
600     if (GifFile->Image.ColorMap) {
601         FreeMapObject(GifFile->Image.ColorMap);
602         GifFile->Image.ColorMap = NULL;
603     }
604 
605     if (GifFile->SColorMap) {
606         FreeMapObject(GifFile->SColorMap);
607         GifFile->SColorMap = NULL;
608     }

多分、正しくは↓このはず。

for ( i = 0 ; i < GifFile->ImageCount ; i++ ) {
    GifImageDesc *ImageDesc = & GifFile->SavedImages[i].ImageDesc;
    if (ImageDesc->ColorMap) {
        FreeMapObject(ImageDesc->ColorMap);
        ImageDesc->ColorMap = NULL;
    }
}

if (GifFile->SColorMap) {
    FreeMapObject(GifFile->SColorMap);
    GifFile->SColorMap = NULL;
}

でも、何か勘違いしてるのかなぁ…
そんな分かりやすい不具合があったら誰か困って即刻直りそうですし。
又は、実際のところ、フレーム毎にカラーマップを持つ GIF アニメ自体絶滅種
(形式的にはありうるけど、実際には作られないorまともに動かない)ので、
頑張っても無駄とか。(無駄な所を頑張るのは好きなのでむしろ嬉しいけどw)

不安なので、SavedImages のデータ構造を生成してる場所、よくチェックしておこ。