Use enum class GifDecodeStatus instead of integers in fx_gif

Change-Id: If37147f513a87bafb3299a493393a6bc44165dbe
Reviewed-on: https://pdfium-review.googlesource.com/4811
Commit-Queue: Nicolás Peña <npm@chromium.org>
Reviewed-by: dsinclair <dsinclair@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcodec/lgif/fx_gif.cpp b/core/fxcodec/lgif/fx_gif.cpp
index 82d1bdd..307834d 100644
--- a/core/fxcodec/lgif/fx_gif.cpp
+++ b/core/fxcodec/lgif/fx_gif.cpp
@@ -6,9 +6,19 @@
 
 #include "core/fxcodec/lgif/fx_gif.h"
 
+#include <utility>
+
 #include "core/fxcodec/lbmp/fx_bmp.h"
 #include "third_party/base/stl_util.h"
 
+static_assert(sizeof(GifImageInfo) == 9,
+              "GifImageInfo should have a size of 9");
+static_assert(sizeof(GifPalette) == 3, "GifPalette should have a size of 3");
+static_assert(sizeof(GifPTE) == 13, "GifPTE should have a size of 13");
+static_assert(sizeof(GifGCE) == 5, "GifGCE should have a size of 5");
+static_assert(sizeof(GifHeader) == 6, "GifHeader should have a size of 6");
+static_assert(sizeof(GifLSD) == 7, "GifLSD should have a size of 7");
+
 namespace {
 
 void gif_error(gif_decompress_struct_p gif_ptr, const char* err_msg) {
@@ -21,10 +31,8 @@
 void gif_takeover_gce_ptr(gif_decompress_struct_p gif_ptr,
                           GifGCE** gce_ptr_ptr) {
   *gce_ptr_ptr = nullptr;
-  if (gif_ptr->gce_ptr && gce_ptr_ptr) {
-    *gce_ptr_ptr = gif_ptr->gce_ptr;
-    gif_ptr->gce_ptr = nullptr;
-  }
+  if (gif_ptr->gce_ptr)
+    std::swap(*gce_ptr_ptr, gif_ptr->gce_ptr);
 }
 
 uint8_t* gif_read_data(gif_decompress_struct_p gif_ptr,
@@ -45,7 +53,7 @@
   gif_ptr->skip_size = 0;
 }
 
-int32_t gif_decode_extension(gif_decompress_struct_p gif_ptr) {
+GifDecodeStatus gif_decode_extension(gif_decompress_struct_p gif_ptr) {
   uint8_t* data_size_ptr = nullptr;
   uint8_t* data_ptr = nullptr;
   uint32_t skip_size_org = gif_ptr->skip_size;
@@ -53,7 +61,7 @@
     case GIF_D_STATUS_EXT_CE: {
       if (!gif_read_data(gif_ptr, &data_size_ptr, 1)) {
         gif_ptr->skip_size = skip_size_org;
-        return 2;
+        return GifDecodeStatus::Unfinished;
       }
       gif_ptr->cmt_data_ptr->clear();
       while (*data_size_ptr != GIF_BLOCK_TERMINAL) {
@@ -61,17 +69,16 @@
         if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) ||
             !gif_read_data(gif_ptr, &data_size_ptr, 1)) {
           gif_ptr->skip_size = skip_size_org;
-          return 2;
+          return GifDecodeStatus::Unfinished;
         }
         *(gif_ptr->cmt_data_ptr) +=
             CFX_ByteString((const char*)data_ptr, data_size);
       }
     } break;
     case GIF_D_STATUS_EXT_PTE: {
-      ASSERT(sizeof(GifPTE) == 13);
       GifPTE* gif_pte_ptr = nullptr;
       if (!gif_read_data(gif_ptr, (uint8_t**)&gif_pte_ptr, 13))
-        return 2;
+        return GifDecodeStatus::Unfinished;
 
       GifPlainText* gif_pt_ptr = FX_Alloc(GifPlainText, 1);
       memset(gif_pt_ptr, 0, sizeof(GifPlainText));
@@ -99,7 +106,7 @@
           delete gif_pt_ptr->string_ptr;
           FX_Free(gif_pt_ptr);
         }
-        return 2;
+        return GifDecodeStatus::Unfinished;
       }
       while (*data_size_ptr != GIF_BLOCK_TERMINAL) {
         uint8_t data_size = *data_size_ptr;
@@ -112,7 +119,7 @@
             delete gif_pt_ptr->string_ptr;
             FX_Free(gif_pt_ptr);
           }
-          return 2;
+          return GifDecodeStatus::Unfinished;
         }
         *(gif_pt_ptr->string_ptr) +=
             CFX_ByteString((const char*)data_ptr, data_size);
@@ -120,10 +127,9 @@
       gif_ptr->pt_ptr_arr_ptr->push_back(gif_pt_ptr);
     } break;
     case GIF_D_STATUS_EXT_GCE: {
-      ASSERT(sizeof(GifGCE) == 5);
       GifGCE* gif_gce_ptr = nullptr;
       if (!gif_read_data(gif_ptr, (uint8_t**)&gif_gce_ptr, 6))
-        return 2;
+        return GifDecodeStatus::Unfinished;
 
       if (!gif_ptr->gce_ptr)
         gif_ptr->gce_ptr = FX_Alloc(GifGCE, 1);
@@ -139,31 +145,30 @@
         gif_ptr->gce_ptr = nullptr;
       }
       if (!gif_read_data(gif_ptr, &data_size_ptr, 1))
-        return 2;
+        return GifDecodeStatus::Unfinished;
 
       while (*data_size_ptr != GIF_BLOCK_TERMINAL) {
         if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) ||
             !gif_read_data(gif_ptr, &data_size_ptr, 1)) {
           gif_ptr->skip_size = skip_size_org;
-          return 2;
+          return GifDecodeStatus::Unfinished;
         }
       }
     }
   }
   gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG);
-  return 1;
+  return GifDecodeStatus::Success;
 }
 
-int32_t gif_decode_image_info(gif_decompress_struct_p gif_ptr) {
+GifDecodeStatus gif_decode_image_info(gif_decompress_struct_p gif_ptr) {
   if (gif_ptr->width == 0 || gif_ptr->height == 0) {
     gif_error(gif_ptr, "No Image Header Info");
-    return 0;
+    return GifDecodeStatus::Error;
   }
   uint32_t skip_size_org = gif_ptr->skip_size;
-  ASSERT(sizeof(GifImageInfo) == 9);
   GifImageInfo* gif_img_info_ptr = nullptr;
   if (!gif_read_data(gif_ptr, (uint8_t**)&gif_img_info_ptr, 9))
-    return 2;
+    return GifDecodeStatus::Unfinished;
 
   GifImage* gif_image_ptr = FX_Alloc(GifImage, 1);
   memset(gif_image_ptr, 0, sizeof(GifImage));
@@ -187,11 +192,10 @@
     FX_Free(gif_image_ptr->image_row_buf);
     FX_Free(gif_image_ptr);
     gif_error(gif_ptr, "Image Data Out Of LSD, The File May Be Corrupt");
-    return 0;
+    return GifDecodeStatus::Error;
   }
   GifLF* gif_img_info_lf_ptr = (GifLF*)&gif_img_info_ptr->local_flag;
   if (gif_img_info_lf_ptr->local_pal) {
-    ASSERT(sizeof(GifPalette) == 3);
     int32_t loc_pal_size = (2 << gif_img_info_lf_ptr->pal_bits) * 3;
     uint8_t* loc_pal_ptr = nullptr;
     if (!gif_read_data(gif_ptr, &loc_pal_ptr, loc_pal_size)) {
@@ -199,7 +203,7 @@
       FX_Free(gif_image_ptr->image_info_ptr);
       FX_Free(gif_image_ptr->image_row_buf);
       FX_Free(gif_image_ptr);
-      return 2;
+      return GifDecodeStatus::Unfinished;
     }
     gif_image_ptr->local_pal_ptr =
         (GifPalette*)gif_ptr->gif_ask_buf_for_pal_fn(gif_ptr, loc_pal_size);
@@ -214,7 +218,7 @@
     FX_Free(gif_image_ptr->local_pal_ptr);
     FX_Free(gif_image_ptr->image_row_buf);
     FX_Free(gif_image_ptr);
-    return 2;
+    return GifDecodeStatus::Unfinished;
   }
   gif_image_ptr->image_code_size = *code_size_ptr;
   gif_ptr->gif_record_current_position_fn(gif_ptr,
@@ -223,7 +227,7 @@
   gif_takeover_gce_ptr(gif_ptr, &gif_image_ptr->image_gce_ptr);
   gif_ptr->img_ptr_arr_ptr->push_back(gif_image_ptr);
   gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA);
-  return 1;
+  return GifDecodeStatus::Success;
 }
 
 void gif_decoding_failure_at_tail_cleanup(gif_decompress_struct_p gif_ptr,
@@ -311,16 +315,16 @@
   }
 }
 
-int32_t CGifLZWDecoder::Decode(uint8_t* des_buf, uint32_t* des_size) {
+GifDecodeStatus CGifLZWDecoder::Decode(uint8_t* des_buf, uint32_t* des_size) {
   if (*des_size == 0)
-    return 3;
+    return GifDecodeStatus::InsufficientDestSize;
 
   uint32_t i = 0;
   if (stack_size != 0) {
     if (*des_size < stack_size) {
       memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], *des_size);
       stack_size -= static_cast<uint16_t>(*des_size);
-      return 3;
+      return GifDecodeStatus::InsufficientDestSize;
     }
     memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], stack_size);
     des_buf += stack_size;
@@ -331,19 +335,19 @@
   while (i <= *des_size && (avail_in > 0 || bits_left >= code_size_cur)) {
     if (code_size_cur > 12) {
       strncpy(err_msg_ptr, "Code Length Out Of Range", GIF_MAX_ERROR_SIZE - 1);
-      return 0;
+      return GifDecodeStatus::Error;
     }
     if (avail_in > 0) {
       if (bits_left > 31) {
         strncpy(err_msg_ptr, "Decode Error", GIF_MAX_ERROR_SIZE - 1);
-        return 0;
+        return GifDecodeStatus::Error;
       }
       pdfium::base::CheckedNumeric<uint32_t> safe_code = *next_in++;
       safe_code <<= bits_left;
       safe_code |= code_store;
       if (!safe_code.IsValid()) {
         strncpy(err_msg_ptr, "Code Store Out Of Range", GIF_MAX_ERROR_SIZE - 1);
-        return 0;
+        return GifDecodeStatus::Error;
       }
       code_store = safe_code.ValueOrDie();
       --avail_in;
@@ -360,7 +364,7 @@
       }
       if (code == code_end) {
         *des_size = i;
-        return 1;
+        return GifDecodeStatus::Success;
       }
       if (code_old != static_cast<uint16_t>(-1)) {
         if (code_next < GIF_MAX_LZW_CODE) {
@@ -370,7 +374,7 @@
           } else if (code > code_next) {
             strncpy(err_msg_ptr, "Decode Error, Out Of Range",
                     GIF_MAX_ERROR_SIZE - 1);
-            return 0;
+            return GifDecodeStatus::Error;
           } else {
             DecodeString(code);
             uint8_t append_char = stack[GIF_MAX_LZW_CODE - stack_size];
@@ -384,7 +388,7 @@
       if (i + stack_size > *des_size) {
         memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], *des_size - i);
         stack_size -= static_cast<uint16_t>(*des_size - i);
-        return 3;
+        return GifDecodeStatus::InsufficientDestSize;
       }
       memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], stack_size);
       des_buf += stack_size;
@@ -394,9 +398,9 @@
   }
   if (avail_in == 0) {
     *des_size = i;
-    return 2;
+    return GifDecodeStatus::Unfinished;
   }
-  return 0;
+  return GifDecodeStatus::Error;
 }
 
 gif_decompress_struct_p gif_create_decompress() {
@@ -448,36 +452,33 @@
   FX_Free(gif_ptr);
 }
 
-int32_t gif_read_header(gif_decompress_struct_p gif_ptr) {
+GifDecodeStatus gif_read_header(gif_decompress_struct_p gif_ptr) {
   if (!gif_ptr)
-    return 0;
+    return GifDecodeStatus::Error;
 
   uint32_t skip_size_org = gif_ptr->skip_size;
-  ASSERT(sizeof(GifHeader) == 6);
   GifHeader* gif_header_ptr = nullptr;
   if (!gif_read_data(gif_ptr, reinterpret_cast<uint8_t**>(&gif_header_ptr), 6))
-    return 2;
+    return GifDecodeStatus::Unfinished;
 
   if (strncmp(gif_header_ptr->signature, GIF_SIGNATURE, 3) != 0 ||
       gif_header_ptr->version[0] != '8' || gif_header_ptr->version[2] != 'a') {
     gif_error(gif_ptr, "Not A Gif Image");
-    return 0;
+    return GifDecodeStatus::Error;
   }
-  ASSERT(sizeof(GifLSD) == 7);
   GifLSD* gif_lsd_ptr = nullptr;
   if (!gif_read_data(gif_ptr, reinterpret_cast<uint8_t**>(&gif_lsd_ptr), 7)) {
     gif_ptr->skip_size = skip_size_org;
-    return 2;
+    return GifDecodeStatus::Unfinished;
   }
   if (reinterpret_cast<GifGF*>(&gif_lsd_ptr->global_flag)->global_pal) {
     gif_ptr->global_pal_num =
         2 << reinterpret_cast<GifGF*>(&gif_lsd_ptr->global_flag)->pal_bits;
-    ASSERT(sizeof(GifPalette) == 3);
     int32_t global_pal_size = gif_ptr->global_pal_num * 3;
     uint8_t* global_pal_ptr = nullptr;
     if (!gif_read_data(gif_ptr, &global_pal_ptr, global_pal_size)) {
       gif_ptr->skip_size = skip_size_org;
-      return 2;
+      return GifDecodeStatus::Unfinished;
     }
     gif_ptr->global_sort_flag = ((GifGF*)&gif_lsd_ptr->global_flag)->sort_flag;
     gif_ptr->global_color_resolution =
@@ -490,22 +491,22 @@
   gif_ptr->height = (int)GetWord_LSBFirst((uint8_t*)&gif_lsd_ptr->height);
   gif_ptr->bc_index = gif_lsd_ptr->bc_index;
   gif_ptr->pixel_aspect = gif_lsd_ptr->pixel_aspect;
-  return 1;
+  return GifDecodeStatus::Success;
 }
 
-int32_t gif_get_frame(gif_decompress_struct_p gif_ptr) {
+GifDecodeStatus gif_get_frame(gif_decompress_struct_p gif_ptr) {
   if (!gif_ptr)
-    return 0;
+    return GifDecodeStatus::Error;
 
-  int32_t ret = 1;
+  GifDecodeStatus ret = GifDecodeStatus::Success;
   while (true) {
     switch (gif_ptr->decode_status) {
       case GIF_D_STATUS_TAIL:
-        return 1;
+        return GifDecodeStatus::Success;
       case GIF_D_STATUS_SIG: {
         uint8_t* sig_ptr = nullptr;
         if (!gif_read_data(gif_ptr, &sig_ptr, 1))
-          return 2;
+          return GifDecodeStatus::Unfinished;
 
         switch (*sig_ptr) {
           case GIF_SIG_EXTENSION:
@@ -516,7 +517,7 @@
             continue;
           case GIF_SIG_TRAILER:
             gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL);
-            return 1;
+            return GifDecodeStatus::Success;
           default:
             if (gif_ptr->avail_in) {
               gif_warn(gif_ptr, "The Gif File has non_standard Tag!");
@@ -524,13 +525,13 @@
               continue;
             }
             gif_warn(gif_ptr, "The Gif File Doesn't have Trailer Tag!");
-            return 1;
+            return GifDecodeStatus::Success;
         }
       }
       case GIF_D_STATUS_EXT: {
         uint8_t* ext_ptr = nullptr;
         if (!gif_read_data(gif_ptr, &ext_ptr, 1))
-          return 2;
+          return GifDecodeStatus::Unfinished;
 
         switch (*ext_ptr) {
           case GIF_BLOCK_CE:
@@ -554,9 +555,8 @@
       }
       case GIF_D_STATUS_IMG_INFO: {
         ret = gif_decode_image_info(gif_ptr);
-        if (ret != 1) {
+        if (ret != GifDecodeStatus::Success)
           return ret;
-        }
         continue;
       }
       case GIF_D_STATUS_IMG_DATA: {
@@ -564,35 +564,36 @@
         uint8_t* data_ptr = nullptr;
         uint32_t skip_size_org = gif_ptr->skip_size;
         if (!gif_read_data(gif_ptr, &data_size_ptr, 1))
-          return 2;
+          return GifDecodeStatus::Unfinished;
 
         while (*data_size_ptr != GIF_BLOCK_TERMINAL) {
           if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr)) {
             gif_ptr->skip_size = skip_size_org;
-            return 2;
+            return GifDecodeStatus::Unfinished;
           }
           gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA);
           skip_size_org = gif_ptr->skip_size;
           if (!gif_read_data(gif_ptr, &data_size_ptr, 1))
-            return 2;
+            return GifDecodeStatus::Unfinished;
         }
         gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG);
         continue;
       }
       default: {
         ret = gif_decode_extension(gif_ptr);
-        if (ret != 1)
+        if (ret != GifDecodeStatus::Success)
           return ret;
         break;
       }
     }
   }
-  return 1;
+  return GifDecodeStatus::Success;
 }
 
-int32_t gif_load_frame(gif_decompress_struct_p gif_ptr, int32_t frame_num) {
+GifDecodeStatus gif_load_frame(gif_decompress_struct_p gif_ptr,
+                               int32_t frame_num) {
   if (!gif_ptr || !pdfium::IndexInBounds(*gif_ptr->img_ptr_arr_ptr, frame_num))
-    return 0;
+    return GifDecodeStatus::Error;
 
   uint8_t* data_size_ptr = nullptr;
   uint8_t* data_ptr = nullptr;
@@ -601,7 +602,7 @@
   uint32_t gif_img_row_bytes = gif_image_ptr->image_info_ptr->width;
   if (gif_img_row_bytes == 0) {
     gif_error(gif_ptr, "Error Invalid Number of Row Bytes");
-    return 0;
+    return GifDecodeStatus::Error;
   }
   if (gif_ptr->decode_status == GIF_D_STATUS_TAIL) {
     if (gif_image_ptr->image_row_buf) {
@@ -630,7 +631,7 @@
         FX_Free(gif_image_ptr->image_row_buf);
         gif_image_ptr->image_row_buf = nullptr;
         gif_error(gif_ptr, "Error Read Record Position Data");
-        return 0;
+        return GifDecodeStatus::Error;
       }
     } else {
       bool bRes = gif_ptr->gif_get_record_position_fn(
@@ -653,14 +654,14 @@
         FX_Free(gif_image_ptr->image_row_buf);
         gif_image_ptr->image_row_buf = nullptr;
         gif_error(gif_ptr, "Error Read Record Position Data");
-        return 0;
+        return GifDecodeStatus::Error;
       }
     }
     if (gif_image_ptr->image_code_size >= 32) {
       FX_Free(gif_image_ptr->image_row_buf);
       gif_image_ptr->image_row_buf = nullptr;
       gif_error(gif_ptr, "Error Invalid Code Size");
-      return 0;
+      return GifDecodeStatus::Error;
     }
     if (!gif_ptr->img_decoder_ptr)
       gif_ptr->img_decoder_ptr = new CGifLZWDecoder(gif_ptr->err_ptr);
@@ -674,43 +675,43 @@
   CGifLZWDecoder* img_decoder_ptr = gif_ptr->img_decoder_ptr;
   if (gif_ptr->decode_status == GIF_D_STATUS_IMG_DATA) {
     if (!gif_read_data(gif_ptr, &data_size_ptr, 1))
-      return 2;
+      return GifDecodeStatus::Unfinished;
 
     if (*data_size_ptr != GIF_BLOCK_TERMINAL) {
       if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr)) {
         gif_ptr->skip_size = skip_size_org;
-        return 2;
+        return GifDecodeStatus::Unfinished;
       }
       img_decoder_ptr->Input(data_ptr, *data_size_ptr);
       gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA);
       gif_ptr->img_row_offset += gif_ptr->img_row_avail_size;
       gif_ptr->img_row_avail_size = gif_img_row_bytes - gif_ptr->img_row_offset;
-      int32_t ret = img_decoder_ptr->Decode(
+      GifDecodeStatus ret = img_decoder_ptr->Decode(
           gif_image_ptr->image_row_buf + gif_ptr->img_row_offset,
           &gif_ptr->img_row_avail_size);
-      if (ret == 0) {
+      if (ret == GifDecodeStatus::Error) {
         gif_decoding_failure_at_tail_cleanup(gif_ptr, gif_image_ptr);
-        return 0;
+        return GifDecodeStatus::Error;
       }
-      while (ret != 0) {
-        if (ret == 1) {
+      while (ret != GifDecodeStatus::Error) {
+        if (ret == GifDecodeStatus::Success) {
           gif_ptr->gif_get_row_fn(gif_ptr, gif_image_ptr->image_row_num,
                                   gif_image_ptr->image_row_buf);
           FX_Free(gif_image_ptr->image_row_buf);
           gif_image_ptr->image_row_buf = nullptr;
           gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL);
-          return 1;
+          return GifDecodeStatus::Success;
         }
-        if (ret == 2) {
+        if (ret == GifDecodeStatus::Unfinished) {
           ASSERT(img_decoder_ptr->GetAvailInput() == 0);
           skip_size_org = gif_ptr->skip_size;
           if (!gif_read_data(gif_ptr, &data_size_ptr, 1))
-            return 2;
+            return GifDecodeStatus::Unfinished;
 
           if (*data_size_ptr != GIF_BLOCK_TERMINAL) {
             if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr)) {
               gif_ptr->skip_size = skip_size_org;
-              return 2;
+              return GifDecodeStatus::Unfinished;
             }
             img_decoder_ptr->Input(data_ptr, *data_size_ptr);
             gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA);
@@ -722,7 +723,7 @@
                 &gif_ptr->img_row_avail_size);
           }
         }
-        if (ret == 3) {
+        if (ret == GifDecodeStatus::InsufficientDestSize) {
           if (((GifLF*)&gif_image_ptr->image_info_ptr->local_flag)->interlace) {
             gif_ptr->gif_get_row_fn(gif_ptr, gif_image_ptr->image_row_num,
                                     gif_image_ptr->image_row_buf);
@@ -733,7 +734,7 @@
               gif_ptr->img_pass_num++;
               if (gif_ptr->img_pass_num == FX_ArraySize(s_gif_interlace_step)) {
                 gif_decoding_failure_at_tail_cleanup(gif_ptr, gif_image_ptr);
-                return 0;
+                return GifDecodeStatus::Error;
               }
               gif_image_ptr->image_row_num =
                   s_gif_interlace_step[gif_ptr->img_pass_num] / 2;
@@ -748,16 +749,16 @@
               gif_image_ptr->image_row_buf + gif_ptr->img_row_offset,
               &gif_ptr->img_row_avail_size);
         }
-        if (ret == 0) {
+        if (ret == GifDecodeStatus::Error) {
           gif_decoding_failure_at_tail_cleanup(gif_ptr, gif_image_ptr);
-          return 0;
+          return GifDecodeStatus::Error;
         }
       }
     }
     gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL);
   }
   gif_error(gif_ptr, "Decode Image Data Error");
-  return 0;
+  return GifDecodeStatus::Error;
 }
 
 void gif_input_buffer(gif_decompress_struct_p gif_ptr,