giflib でフィルタ処理
giflib はデータ構造的にはエンコード用とデコード用で共通ですが、
各々の Open と Close が別になっている為、フィルタを書くのには面倒な API になってます。
こんな感じ。
GifFileType *GifFileIn, *GifFileOut;
GifFileIn = DGifOpen(...);
GifFileOut = EGifOpen(...);
// <データ入力 → GifFileIn の画像データを GifGileOut にコピー →データ出力>
DGifCloseFile(GifFileIn);
EGifCloseFile(GifFileOut);
仮に、Open と Close が共通であれば必要な部分だけデータを書き換えるだけですが、
- http://giflib.cvs.sourceforge.net/giflib/giflib/util/gifrotat.c)
- http://giflib.cvs.sourceforge.net/giflib/giflib/util/gifrsize.c)
↑これらを見ると、カラーマップとかピクセルとか Extension ブロック等を明示的に
一つ一つコピーする処理をかいてるので、手間をかけないとダメそう。
rotat や rsize は全部コピーしちゃうと、後で捨てるデータも出てくるので、
これはこれで合理的なんですけど。例えば、特定のインデックスのピクセルを塗りつぶす
とかの処理を書こうとする時は、無駄な手間って感じがするんですよね。
(処理コストは減らないけど、実装コストを減らすのに) GifFileClone(GifFileIn, GifFileOut);
とか作ると楽になるかな。