diff --git a/bob/io/image/cpp/gif.cpp b/bob/io/image/cpp/gif.cpp index e6cb0b4baccf61e67b02425529f6a8b428d63fe8..85fbf7688ac99ae34f46b5b281820a7e249105b5 100644 --- a/bob/io/image/cpp/gif.cpp +++ b/bob/io/image/cpp/gif.cpp @@ -417,17 +417,21 @@ static void im_load_color(boost::shared_ptr<GifFileType> in_file, bob::io::base: GifByteType *extension; int InterlacedOffset[] = { 0, 4, 2, 1 }; // The way Interlaced image should. int InterlacedJumps[] = { 8, 8, 4, 2 }; // be read - offsets and jumps... - int row, col, width, height, ext_code; + int row, col, width, height, count, ext_code; bool terminated = false; bool image_found = false; do{ int error = DGifGetRecordType(in_file.get(), &record_type); if(error == GIF_ERROR) - GifErrorHandler("DGifGetRecordType", in_file->Error); + GifErrorHandler("DGifGetRecordType", error); switch(record_type) { case IMAGE_DESC_RECORD_TYPE: + if (image_found){ + // we already have found an image... + break; + } error = DGifGetImageDesc(in_file.get()); - if (error == GIF_ERROR) GifErrorHandler("DGifGetImageDesc", in_file->Error); + if (error == GIF_ERROR) GifErrorHandler("DGifGetImageDesc", error); row = in_file->Image.Top; // Image Position relative to Screen. col = in_file->Image.Left; width = in_file->Image.Width; @@ -439,26 +443,17 @@ static void im_load_color(boost::shared_ptr<GifFileType> in_file, bob::io::base: } if(in_file->Image.Interlace) { // Need to perform 4 passes on the images: - for(int i=0; i<4; ++i) + for(int i=count=0; i<4; ++i) for(int j=row+InterlacedOffset[i]; j<row+height; j+=InterlacedJumps[i]) { - if (image_found) - // image buffer already filled; read in into junk buffer - error = DGifGetLine(in_file.get(), &temp_buffer[col], width); - else - // read into image buffer - error = DGifGetLine(in_file.get(), &screen_buffer[j][col], width); - if(error == GIF_ERROR) GifErrorHandler("DGifGetLine", in_file->Error); + ++count; + error = DGifGetLine(in_file.get(), &screen_buffer[j][col], width); + if(error == GIF_ERROR) GifErrorHandler("DGifGetLine", error); } } else { for(int i=0; i<height; ++i) { - if (image_found) - // image buffer already filled; read in into junk buffer - error = DGifGetLine(in_file.get(), &temp_buffer[col], width); - else - // read into image buffer - error = DGifGetLine(in_file.get(), &screen_buffer[row++][col], width); - if(error == GIF_ERROR) GifErrorHandler("DGifGetLine", in_file->Error); + error = DGifGetLine(in_file.get(), &screen_buffer[row++][col], width); + if(error == GIF_ERROR) GifErrorHandler("DGifGetLine", error); } } image_found = true; @@ -466,10 +461,10 @@ static void im_load_color(boost::shared_ptr<GifFileType> in_file, bob::io::base: case EXTENSION_RECORD_TYPE: // Skip any extension blocks in file: error = DGifGetExtension(in_file.get(), &ext_code, &extension); - if (error == GIF_ERROR) GifErrorHandler("DGifGetExtension", in_file->Error); + if (error == GIF_ERROR) GifErrorHandler("DGifGetExtension", error); while(extension != NULL) { error = DGifGetExtensionNext(in_file.get(), &extension); - if(error == GIF_ERROR) GifErrorHandler("DGifGetExtensionNext", in_file->Error); + if(error == GIF_ERROR) GifErrorHandler("DGifGetExtensionNext", error); } break; case TERMINATE_RECORD_TYPE: