diff --git a/bob/io/image/cpp/gif.cpp b/bob/io/image/cpp/gif.cpp index aa29c69012cdb581b65a2a1b6bd2e2b581765d27..e6cb0b4baccf61e67b02425529f6a8b428d63fe8 100644 --- a/bob/io/image/cpp/gif.cpp +++ b/bob/io/image/cpp/gif.cpp @@ -395,6 +395,8 @@ static void im_load_color(boost::shared_ptr<GifFileType> in_file, bob::io::base: // screen is device independent - it's the screen defined by the // GIF file parameters. std::vector<boost::shared_array<GifPixelType> > screen_buffer; + // The second buffer is just used if the image has already been read + boost::shared_array<GifPixelType> temp_buffer(new GifPixelType[in_file->SWidth]); // Size in bytes one row. int size = in_file->SWidth*sizeof(GifPixelType); @@ -439,13 +441,23 @@ static void im_load_color(boost::shared_ptr<GifFileType> in_file, bob::io::base: // Need to perform 4 passes on the images: for(int i=0; i<4; ++i) for(int j=row+InterlacedOffset[i]; j<row+height; j+=InterlacedJumps[i]) { - error = DGifGetLine(in_file.get(), &screen_buffer[j][col], width); + 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); } } else { for(int i=0; i<height; ++i) { - error = DGifGetLine(in_file.get(), &screen_buffer[row++][col], width); + 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); } }