giflib の使い方 (4)

読み込みや書き出しの方法として、大雑把に2つあります。

順次読み出し

giflib/util 以下の gifrotat.c と gifrsize.c で使っている方式です。

while ((DGifGetRecordType(&GifFile, &RecordType)) &&
       (RecordType != TERMINATE_RECORD_TYPE)) {
    switch(RecordType) {
      case SCREEN_DESC_RECORD_TYPE:
        DGifGetScreenDesc(&GifFile);
        break;
      case IMAGE_DESC_RECORD_TYPE:
        DGifGetImageDesc(&GifFile);
        break;
      case EXTENSION_RECORD_TYPE:
        DGifGetExtension(&GifFile, &GifExtCode, &GifExtension);
        while ((GifExtensionNext != NULL) &&
	       (DGifGetExtensionNext(&GifFile, &GifExtension) == GIF_ERROR)) ;
        break;
      default:
       break;
}

こんな感じ。
尚、case の中で DGifGet... 系を呼ばないと、次の DGifGetRecordType で失敗します。
parse 処理を想像すれば仕方ないですが、途中 parse を飛ばせないって事で。
出力は、D(Decode) を E(Encode)に、そして Get を Put に変更すれば大体 OK.

まとめ読み出し

DGifSlurp(&GifFile);

出力は

EGifSpew(&GifFile);

どちらもその関数の中で順次読み出し/書き出しをしてるだけ。