diff --git a/BUILD.gn b/BUILD.gn
index 77cc79d..029a8ab 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -729,8 +729,8 @@
       "core/fxcodec/codec/fx_codec_progress.cpp",
       "core/fxcodec/lbmp/fx_bmp.cpp",
       "core/fxcodec/lbmp/fx_bmp.h",
-      "core/fxcodec/lgif/cgifdecompressor.cpp",
-      "core/fxcodec/lgif/cgifdecompressor.h",
+      "core/fxcodec/lgif/cgifcontext.cpp",
+      "core/fxcodec/lgif/cgifcontext.h",
       "core/fxcodec/lgif/fx_gif.cpp",
       "core/fxcodec/lgif/fx_gif.h",
     ]
diff --git a/core/fxcodec/codec/ccodec_gifmodule.cpp b/core/fxcodec/codec/ccodec_gifmodule.cpp
index 983daa0..438f019 100644
--- a/core/fxcodec/codec/ccodec_gifmodule.cpp
+++ b/core/fxcodec/codec/ccodec_gifmodule.cpp
@@ -8,7 +8,7 @@
 
 #include "core/fxcodec/codec/codec_int.h"
 #include "core/fxcodec/fx_codec.h"
-#include "core/fxcodec/lgif/cgifdecompressor.h"
+#include "core/fxcodec/lgif/cgifcontext.h"
 #include "core/fxcodec/lgif/fx_gif.h"
 #include "core/fxge/fx_dib.h"
 #include "third_party/base/ptr_util.h"
@@ -19,77 +19,61 @@
 
 CCodec_GifModule::~CCodec_GifModule() {}
 
-FXGIF_Context* CCodec_GifModule::Start() {
-  FXGIF_Context* p = FX_Alloc(FXGIF_Context, 1);
-  if (!p)
-    return nullptr;
-
-  memset(p, 0, sizeof(FXGIF_Context));
-  p->parent_ptr = this;
-  p->m_Gif = pdfium::MakeUnique<CGifDecompressor>(p, m_szLastError);
-  return p;
+std::unique_ptr<CGifContext> CCodec_GifModule::Start() {
+  return pdfium::MakeUnique<CGifContext>(this, m_szLastError);
 }
 
-void CCodec_GifModule::Finish(FXGIF_Context* ctx) {
-  if (ctx) {
-    ctx->m_Gif = nullptr;
-    FX_Free(ctx);
-  }
-}
-
-GifDecodeStatus CCodec_GifModule::ReadHeader(FXGIF_Context* ctx,
+GifDecodeStatus CCodec_GifModule::ReadHeader(CGifContext* context,
                                              int* width,
                                              int* height,
                                              int* pal_num,
                                              void** pal_pp,
                                              int* bg_index,
                                              CFX_DIBAttribute* pAttribute) {
-  if (setjmp(ctx->m_Gif->jmpbuf))
+  if (setjmp(context->jmpbuf))
     return GifDecodeStatus::Error;
 
-  GifDecodeStatus ret = gif_read_header(ctx->m_Gif.get());
+  GifDecodeStatus ret = gif_read_header(context);
   if (ret != GifDecodeStatus::Success)
     return ret;
 
-  *width = ctx->m_Gif->width;
-  *height = ctx->m_Gif->height;
-  *pal_num = ctx->m_Gif->global_pal_num;
-  *pal_pp = ctx->m_Gif->m_GlobalPalette.empty()
-                ? nullptr
-                : ctx->m_Gif->m_GlobalPalette.data();
-  *bg_index = ctx->m_Gif->bc_index;
+  *width = context->width;
+  *height = context->height;
+  *pal_num = context->global_pal_num;
+  *pal_pp = context->m_GlobalPalette.empty() ? nullptr
+                                             : context->m_GlobalPalette.data();
+  *bg_index = context->bc_index;
   return GifDecodeStatus::Success;
 }
 
-GifDecodeStatus CCodec_GifModule::LoadFrameInfo(FXGIF_Context* ctx,
+GifDecodeStatus CCodec_GifModule::LoadFrameInfo(CGifContext* context,
                                                 int* frame_num) {
-  if (setjmp(ctx->m_Gif->jmpbuf))
+  if (setjmp(context->jmpbuf))
     return GifDecodeStatus::Error;
 
-  GifDecodeStatus ret = gif_get_frame(ctx->m_Gif.get());
+  GifDecodeStatus ret = gif_get_frame(context);
   if (ret != GifDecodeStatus::Success)
     return ret;
 
-  *frame_num = gif_get_frame_num(ctx->m_Gif.get());
+  *frame_num = gif_get_frame_num(context);
   return GifDecodeStatus::Success;
 }
 
-GifDecodeStatus CCodec_GifModule::LoadFrame(FXGIF_Context* ctx,
+GifDecodeStatus CCodec_GifModule::LoadFrame(CGifContext* context,
                                             int frame_num,
                                             CFX_DIBAttribute* pAttribute) {
-  if (setjmp(ctx->m_Gif->jmpbuf))
+  if (setjmp(context->jmpbuf))
     return GifDecodeStatus::Error;
 
-  GifDecodeStatus ret = gif_load_frame(ctx->m_Gif.get(), frame_num);
+  GifDecodeStatus ret = gif_load_frame(context, frame_num);
   if (ret == GifDecodeStatus::Success) {
     if (pAttribute) {
-      pAttribute->m_nGifLeft =
-          ctx->m_Gif->m_Images[frame_num]->m_ImageInfo.left;
-      pAttribute->m_nGifTop = ctx->m_Gif->m_Images[frame_num]->m_ImageInfo.top;
-      pAttribute->m_fAspectRatio = ctx->m_Gif->pixel_aspect;
+      pAttribute->m_nGifLeft = context->m_Images[frame_num]->m_ImageInfo.left;
+      pAttribute->m_nGifTop = context->m_Images[frame_num]->m_ImageInfo.top;
+      pAttribute->m_fAspectRatio = context->pixel_aspect;
       const uint8_t* buf =
-          reinterpret_cast<const uint8_t*>(ctx->m_Gif->cmt_data.GetBuffer(0));
-      uint32_t len = ctx->m_Gif->cmt_data.GetLength();
+          reinterpret_cast<const uint8_t*>(context->cmt_data.GetBuffer(0));
+      uint32_t len = context->cmt_data.GetLength();
       if (len > 21) {
         uint8_t size = *buf++;
         if (size != 0)
@@ -102,13 +86,13 @@
   return ret;
 }
 
-uint32_t CCodec_GifModule::GetAvailInput(FXGIF_Context* ctx,
+uint32_t CCodec_GifModule::GetAvailInput(CGifContext* context,
                                          uint8_t** avail_buf_ptr) {
-  return gif_get_avail_input(ctx->m_Gif.get(), avail_buf_ptr);
+  return gif_get_avail_input(context, avail_buf_ptr);
 }
 
-void CCodec_GifModule::Input(FXGIF_Context* ctx,
+void CCodec_GifModule::Input(CGifContext* context,
                              const uint8_t* src_buf,
                              uint32_t src_size) {
-  gif_input_buffer(ctx->m_Gif.get(), (uint8_t*)src_buf, src_size);
+  gif_input_buffer(context, (uint8_t*)src_buf, src_size);
 }
diff --git a/core/fxcodec/codec/ccodec_gifmodule.h b/core/fxcodec/codec/ccodec_gifmodule.h
index 862bee5..5f3f45f 100644
--- a/core/fxcodec/codec/ccodec_gifmodule.h
+++ b/core/fxcodec/codec/ccodec_gifmodule.h
@@ -7,12 +7,13 @@
 #ifndef CORE_FXCODEC_CODEC_CCODEC_GIFMODULE_H_
 #define CORE_FXCODEC_CODEC_CCODEC_GIFMODULE_H_
 
+#include <memory>
+
 #include "core/fxcodec/lgif/fx_gif.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_system.h"
 
 class CFX_DIBAttribute;
-class FXGIF_Context;
 
 class CCodec_GifModule {
  public:
@@ -34,16 +35,13 @@
   CCodec_GifModule();
   ~CCodec_GifModule();
 
-  FXGIF_Context* Start();
-  void Finish(FXGIF_Context* pContext);
-  uint32_t GetAvailInput(FXGIF_Context* pContext,
+  std::unique_ptr<CGifContext> Start();
+  uint32_t GetAvailInput(CGifContext* context,
                          uint8_t** avail_buf_ptr = nullptr);
 
-  void Input(FXGIF_Context* pContext,
-             const uint8_t* src_buf,
-             uint32_t src_size);
+  void Input(CGifContext* context, const uint8_t* src_buf, uint32_t src_size);
 
-  GifDecodeStatus ReadHeader(FXGIF_Context* pContext,
+  GifDecodeStatus ReadHeader(CGifContext* context,
                              int* width,
                              int* height,
                              int* pal_num,
@@ -51,8 +49,8 @@
                              int* bg_index,
                              CFX_DIBAttribute* pAttribute);
 
-  GifDecodeStatus LoadFrameInfo(FXGIF_Context* pContext, int* frame_num);
-  GifDecodeStatus LoadFrame(FXGIF_Context* pContext,
+  GifDecodeStatus LoadFrameInfo(CGifContext* context, int* frame_num);
+  GifDecodeStatus LoadFrame(CGifContext* context,
                             int frame_num,
                             CFX_DIBAttribute* pAttribute);
 
diff --git a/core/fxcodec/codec/ccodec_progressivedecoder.h b/core/fxcodec/codec/ccodec_progressivedecoder.h
index 6fa0daf..2b343b7 100644
--- a/core/fxcodec/codec/ccodec_progressivedecoder.h
+++ b/core/fxcodec/codec/ccodec_progressivedecoder.h
@@ -7,6 +7,7 @@
 #ifndef CORE_FXCODEC_CODEC_CCODEC_PROGRESSIVEDECODER_H_
 #define CORE_FXCODEC_CODEC_CCODEC_PROGRESSIVEDECODER_H_
 
+#include <memory>
 #include <vector>
 
 #include "core/fxcodec/codec/ccodec_bmpmodule.h"
@@ -14,6 +15,7 @@
 #include "core/fxcodec/codec/ccodec_pngmodule.h"
 #include "core/fxcodec/codec/ccodec_tiffmodule.h"
 #include "core/fxcodec/fx_codec_def.h"
+#include "core/fxcodec/lgif/cgifcontext.h"
 #include "core/fxcrt/cfx_retain_ptr.h"
 #include "core/fxcrt/fx_system.h"
 #include "core/fxge/fx_dib.h"
@@ -128,7 +130,7 @@
   CCodec_ModuleMgr* m_pCodecMgr;
   FXJPEG_Context* m_pJpegContext;
   FXPNG_Context* m_pPngContext;
-  FXGIF_Context* m_pGifContext;
+  std::unique_ptr<CGifContext> m_pGifContext;
   FXBMP_Context* m_pBmpContext;
   CCodec_TiffContext* m_pTiffContext;
   FXCODEC_IMAGE_TYPE m_imagType;
diff --git a/core/fxcodec/codec/fx_codec_progress.cpp b/core/fxcodec/codec/fx_codec_progress.cpp
index c61cb0b..aa97ac4 100644
--- a/core/fxcodec/codec/fx_codec_progress.cpp
+++ b/core/fxcodec/codec/fx_codec_progress.cpp
@@ -258,7 +258,6 @@
   m_pFile = nullptr;
   m_pJpegContext = nullptr;
   m_pPngContext = nullptr;
-  m_pGifContext = nullptr;
   m_pBmpContext = nullptr;
   m_pTiffContext = nullptr;
   m_pCodecMgr = nullptr;
@@ -299,8 +298,6 @@
     m_pCodecMgr->GetJpegModule()->Finish(m_pJpegContext);
   if (m_pBmpContext)
     m_pCodecMgr->GetBmpModule()->Finish(m_pBmpContext);
-  if (m_pGifContext)
-    m_pCodecMgr->GetGifModule()->Finish(m_pGifContext);
   if (m_pPngContext)
     m_pCodecMgr->GetPngModule()->Finish(m_pPngContext);
   if (m_pTiffContext)
@@ -579,7 +576,7 @@
     return false;
   }
   dwSize = dwSize - m_offSet;
-  uint32_t dwAvail = pGifModule->GetAvailInput(m_pGifContext, nullptr);
+  uint32_t dwAvail = pGifModule->GetAvailInput(m_pGifContext.get(), nullptr);
   if (dwAvail == m_SrcSize) {
     if (dwSize > FXCODEC_BLOCK_SIZE) {
       dwSize = FXCODEC_BLOCK_SIZE;
@@ -605,13 +602,13 @@
     return false;
   }
   m_offSet += dwSize;
-  pGifModule->Input(m_pGifContext, m_pSrcBuf, dwSize + dwAvail);
+  pGifModule->Input(m_pGifContext.get(), m_pSrcBuf, dwSize + dwAvail);
   return true;
 }
 
 void CCodec_ProgressiveDecoder::GifRecordCurrentPosition(uint32_t& cur_pos) {
   uint32_t remain_size =
-      m_pCodecMgr->GetGifModule()->GetAvailInput(m_pGifContext);
+      m_pCodecMgr->GetGifModule()->GetAvailInput(m_pGifContext.get());
   cur_pos = m_offSet - remain_size;
 }
 
@@ -1177,20 +1174,16 @@
       }
       pGifModule->SetDelegate(this);
       m_pGifContext = pGifModule->Start();
-      if (!m_pGifContext) {
-        m_status = FXCODEC_STATUS_ERR_MEMORY;
-        return false;
-      }
       bool bResult = m_pFile->ReadBlock(m_pSrcBuf, 0, size);
       if (!bResult) {
         m_status = FXCODEC_STATUS_ERR_READ;
         return false;
       }
       m_offSet += size;
-      pGifModule->Input(m_pGifContext, m_pSrcBuf, size);
+      pGifModule->Input(m_pGifContext.get(), m_pSrcBuf, size);
       m_SrcComponents = 1;
       GifDecodeStatus readResult = pGifModule->ReadHeader(
-          m_pGifContext, &m_SrcWidth, &m_SrcHeight, &m_GifPltNumber,
+          m_pGifContext.get(), &m_SrcWidth, &m_SrcHeight, &m_GifPltNumber,
           (void**)&m_pGifPalette, &m_GifBgIndex, nullptr);
       while (readResult == GifDecodeStatus::Unfinished) {
         FXCODEC_STATUS error_status = FXCODEC_STATUS_ERR_FORMAT;
@@ -1199,7 +1192,7 @@
           return false;
         }
         readResult = pGifModule->ReadHeader(
-            m_pGifContext, &m_SrcWidth, &m_SrcHeight, &m_GifPltNumber,
+            m_pGifContext.get(), &m_SrcWidth, &m_SrcHeight, &m_GifPltNumber,
             (void**)&m_pGifPalette, &m_GifBgIndex, nullptr);
       }
       if (readResult == GifDecodeStatus::Success) {
@@ -1207,10 +1200,7 @@
         m_clipBox = FX_RECT(0, 0, m_SrcWidth, m_SrcHeight);
         return true;
       }
-      if (m_pGifContext) {
-        pGifModule->Finish(m_pGifContext);
-        m_pGifContext = nullptr;
-      }
+      m_pGifContext = nullptr;
       m_status = FXCODEC_STATUS_ERR_FORMAT;
       return false;
     }
@@ -1800,23 +1790,22 @@
       }
       while (true) {
         GifDecodeStatus readResult =
-            pGifModule->LoadFrameInfo(m_pGifContext, &m_FrameNumber);
+            pGifModule->LoadFrameInfo(m_pGifContext.get(), &m_FrameNumber);
         while (readResult == GifDecodeStatus::Unfinished) {
           FXCODEC_STATUS error_status = FXCODEC_STATUS_ERR_READ;
           if (!GifReadMoreData(pGifModule, error_status))
             return error_status;
 
-          readResult = pGifModule->LoadFrameInfo(m_pGifContext, &m_FrameNumber);
+          readResult =
+              pGifModule->LoadFrameInfo(m_pGifContext.get(), &m_FrameNumber);
         }
         if (readResult == GifDecodeStatus::Success) {
           frames = m_FrameNumber;
           m_status = FXCODEC_STATUS_DECODE_READY;
           return m_status;
         }
-        if (m_pGifContext) {
-          pGifModule->Finish(m_pGifContext);
+        if (m_pGifContext.get())
           m_pGifContext = nullptr;
-        }
         m_status = FXCODEC_STATUS_ERROR;
         return m_status;
       }
@@ -2118,7 +2107,7 @@
       }
       while (true) {
         GifDecodeStatus readRes =
-            pGifModule->LoadFrame(m_pGifContext, m_FrameCur, nullptr);
+            pGifModule->LoadFrame(m_pGifContext.get(), m_FrameCur, nullptr);
         while (readRes == GifDecodeStatus::Unfinished) {
           FXCODEC_STATUS error_status = FXCODEC_STATUS_DECODE_FINISH;
           if (!GifReadMoreData(pGifModule, error_status)) {
@@ -2127,7 +2116,8 @@
             m_status = error_status;
             return m_status;
           }
-          readRes = pGifModule->LoadFrame(m_pGifContext, m_FrameCur, nullptr);
+          readRes =
+              pGifModule->LoadFrame(m_pGifContext.get(), m_FrameCur, nullptr);
         }
         if (readRes == GifDecodeStatus::Success) {
           m_pDeviceBitmap = nullptr;
diff --git a/core/fxcodec/lgif/cgifcontext.cpp b/core/fxcodec/lgif/cgifcontext.cpp
new file mode 100644
index 0000000..aa2aba6
--- /dev/null
+++ b/core/fxcodec/lgif/cgifcontext.cpp
@@ -0,0 +1,64 @@
+// Copyright 2017 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fxcodec/lgif/cgifcontext.h"
+
+#include <utility>
+
+#include "core/fxcodec/codec/ccodec_gifmodule.h"
+#include "core/fxcodec/lgif/fx_gif.h"
+#include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
+
+CGifContext::CGifContext(CCodec_GifModule* gif_module, char* error_string)
+    : global_pal_num(0),
+      img_row_offset(0),
+      img_row_avail_size(0),
+      avail_in(0),
+      decode_status(GIF_D_STATUS_SIG),
+      skip_size(0),
+      m_Module(gif_module),
+      err_ptr(error_string),
+      next_in(nullptr),
+      width(0),
+      height(0),
+      bc_index(0),
+      pixel_aspect(0),
+      global_sort_flag(0),
+      global_color_resolution(0),
+      img_pass_num(0) {}
+
+CGifContext::~CGifContext() {}
+
+void CGifContext::ErrorData(const char* err_msg) {
+  strncpy(err_ptr, err_msg, GIF_MAX_ERROR_SIZE - 1);
+  longjmp(jmpbuf, 1);
+}
+
+void CGifContext::RecordCurrentPosition(uint32_t* cur_pos_ptr) {
+  m_Module->GetDelegate()->GifRecordCurrentPosition(*cur_pos_ptr);
+}
+
+void CGifContext::ReadScanline(int32_t row_num, uint8_t* row_buf) {
+  m_Module->GetDelegate()->GifReadScanline(row_num, row_buf);
+}
+
+bool CGifContext::GetRecordPosition(uint32_t cur_pos,
+                                    int32_t left,
+                                    int32_t top,
+                                    int32_t width,
+                                    int32_t height,
+                                    int32_t pal_num,
+                                    GifPalette* pal_ptr,
+                                    int32_t delay_time,
+                                    bool user_input,
+                                    int32_t trans_index,
+                                    int32_t disposal_method,
+                                    bool interlace) {
+  return m_Module->GetDelegate()->GifInputRecordPositionBuf(
+      cur_pos, FX_RECT(left, top, left + width, top + height), pal_num, pal_ptr,
+      delay_time, user_input, trans_index, disposal_method, interlace);
+}
diff --git a/core/fxcodec/lgif/cgifdecompressor.h b/core/fxcodec/lgif/cgifcontext.h
similarity index 76%
rename from core/fxcodec/lgif/cgifdecompressor.h
rename to core/fxcodec/lgif/cgifcontext.h
index 8d24154..2ee8fbe 100644
--- a/core/fxcodec/lgif/cgifdecompressor.h
+++ b/core/fxcodec/lgif/cgifcontext.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef CORE_FXCODEC_LGIF_CGIFDECOMPRESSOR_H_
-#define CORE_FXCODEC_LGIF_CGIFDECOMPRESSOR_H_
+#ifndef CORE_FXCODEC_LGIF_CGIFCONTEXT_H_
+#define CORE_FXCODEC_LGIF_CGIFCONTEXT_H_
 
 #include <setjmp.h>
 #include <memory>
@@ -16,20 +16,10 @@
 
 class CCodec_GifModule;
 
-// TODO(npm): Get rid of this, maybe rename CGifDecompressor->GifContext
-class FXGIF_Context {
+class CGifContext {
  public:
-  FXGIF_Context();
-  ~FXGIF_Context();
-
-  std::unique_ptr<CGifDecompressor> m_Gif;
-  CCodec_GifModule* parent_ptr;
-};
-
-class CGifDecompressor {
- public:
-  CGifDecompressor(FXGIF_Context* p, char* error_string);
-  ~CGifDecompressor();
+  CGifContext(CCodec_GifModule* gif_module, char* error_string);
+  ~CGifContext();
 
   void ErrorData(const char* err_msg);
   void RecordCurrentPosition(uint32_t* cur_pos_ptr);
@@ -56,8 +46,8 @@
   int32_t decode_status;
   uint32_t skip_size;
 
+  CCodec_GifModule* m_Module;
   char* err_ptr;
-  FXGIF_Context* gif_context;
   CFX_ByteString cmt_data;
   std::unique_ptr<GifGCE> m_GifGCE;
   uint8_t* next_in;
@@ -74,4 +64,4 @@
   uint8_t img_pass_num;
 };
 
-#endif  // CORE_FXCODEC_LGIF_CGIFDECOMPRESSOR_H_
+#endif  // CORE_FXCODEC_LGIF_CGIFCONTEXT_H_
diff --git a/core/fxcodec/lgif/cgifdecompressor.cpp b/core/fxcodec/lgif/cgifdecompressor.cpp
deleted file mode 100644
index 6e9352f..0000000
--- a/core/fxcodec/lgif/cgifdecompressor.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2017 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/fxcodec/lgif/cgifdecompressor.h"
-
-#include <utility>
-
-#include "core/fxcodec/codec/ccodec_gifmodule.h"
-#include "core/fxcodec/lgif/fx_gif.h"
-#include "third_party/base/ptr_util.h"
-#include "third_party/base/stl_util.h"
-
-FXGIF_Context::FXGIF_Context() {}
-
-FXGIF_Context::~FXGIF_Context() {}
-
-CGifDecompressor::CGifDecompressor(FXGIF_Context* p, char* error_string)
-    : global_pal_num(0),
-      img_row_offset(0),
-      img_row_avail_size(0),
-      avail_in(0),
-      decode_status(GIF_D_STATUS_SIG),
-      skip_size(0),
-      err_ptr(error_string),
-      gif_context(p),
-      next_in(nullptr),
-      width(0),
-      height(0),
-      bc_index(0),
-      pixel_aspect(0),
-      global_sort_flag(0),
-      global_color_resolution(0),
-      img_pass_num(0) {}
-
-CGifDecompressor::~CGifDecompressor() {}
-
-void CGifDecompressor::ErrorData(const char* err_msg) {
-  strncpy(err_ptr, err_msg, GIF_MAX_ERROR_SIZE - 1);
-  longjmp(jmpbuf, 1);
-}
-
-void CGifDecompressor::RecordCurrentPosition(uint32_t* cur_pos_ptr) {
-  gif_context->parent_ptr->GetDelegate()->GifRecordCurrentPosition(
-      *cur_pos_ptr);
-}
-
-void CGifDecompressor::ReadScanline(int32_t row_num, uint8_t* row_buf) {
-  gif_context->parent_ptr->GetDelegate()->GifReadScanline(row_num, row_buf);
-}
-
-bool CGifDecompressor::GetRecordPosition(uint32_t cur_pos,
-                                         int32_t left,
-                                         int32_t top,
-                                         int32_t width,
-                                         int32_t height,
-                                         int32_t pal_num,
-                                         GifPalette* pal_ptr,
-                                         int32_t delay_time,
-                                         bool user_input,
-                                         int32_t trans_index,
-                                         int32_t disposal_method,
-                                         bool interlace) {
-  return gif_context->parent_ptr->GetDelegate()->GifInputRecordPositionBuf(
-      cur_pos, FX_RECT(left, top, left + width, top + height), pal_num, pal_ptr,
-      delay_time, user_input, trans_index, disposal_method, interlace);
-}
diff --git a/core/fxcodec/lgif/fx_gif.cpp b/core/fxcodec/lgif/fx_gif.cpp
index 4248c88..b9ff41c 100644
--- a/core/fxcodec/lgif/fx_gif.cpp
+++ b/core/fxcodec/lgif/fx_gif.cpp
@@ -10,7 +10,7 @@
 #include <utility>
 
 #include "core/fxcodec/lbmp/fx_bmp.h"
-#include "core/fxcodec/lgif/cgifdecompressor.h"
+#include "core/fxcodec/lgif/cgifcontext.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 
@@ -24,60 +24,60 @@
 
 namespace {
 
-uint8_t* gif_read_data(CGifDecompressor* gif_ptr,
+uint8_t* gif_read_data(CGifContext* context,
                        uint8_t** des_buf_pp,
                        uint32_t data_size) {
-  if (!gif_ptr || gif_ptr->avail_in < gif_ptr->skip_size + data_size)
+  if (!context || context->avail_in < context->skip_size + data_size)
     return nullptr;
 
-  *des_buf_pp = gif_ptr->next_in + gif_ptr->skip_size;
-  gif_ptr->skip_size += data_size;
+  *des_buf_pp = context->next_in + context->skip_size;
+  context->skip_size += data_size;
   return *des_buf_pp;
 }
 
-void gif_save_decoding_status(CGifDecompressor* gif_ptr, int32_t status) {
-  gif_ptr->decode_status = status;
-  gif_ptr->next_in += gif_ptr->skip_size;
-  gif_ptr->avail_in -= gif_ptr->skip_size;
-  gif_ptr->skip_size = 0;
+void gif_save_decoding_status(CGifContext* context, int32_t status) {
+  context->decode_status = status;
+  context->next_in += context->skip_size;
+  context->avail_in -= context->skip_size;
+  context->skip_size = 0;
 }
 
-GifDecodeStatus gif_decode_extension(CGifDecompressor* gif_ptr) {
+GifDecodeStatus gif_decode_extension(CGifContext* context) {
   uint8_t* data_size_ptr = nullptr;
   uint8_t* data_ptr = nullptr;
-  uint32_t skip_size_org = gif_ptr->skip_size;
-  switch (gif_ptr->decode_status) {
+  uint32_t skip_size_org = context->skip_size;
+  switch (context->decode_status) {
     case GIF_D_STATUS_EXT_CE: {
-      if (!gif_read_data(gif_ptr, &data_size_ptr, 1)) {
-        gif_ptr->skip_size = skip_size_org;
+      if (!gif_read_data(context, &data_size_ptr, 1)) {
+        context->skip_size = skip_size_org;
         return GifDecodeStatus::Unfinished;
       }
-      gif_ptr->cmt_data.clear();
+      context->cmt_data.clear();
       while (*data_size_ptr != GIF_BLOCK_TERMINAL) {
         uint8_t data_size = *data_size_ptr;
-        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;
+        if (!gif_read_data(context, &data_ptr, *data_size_ptr) ||
+            !gif_read_data(context, &data_size_ptr, 1)) {
+          context->skip_size = skip_size_org;
           return GifDecodeStatus::Unfinished;
         }
-        gif_ptr->cmt_data += CFX_ByteString(data_ptr, data_size);
+        context->cmt_data += CFX_ByteString(data_ptr, data_size);
       }
       break;
     }
     case GIF_D_STATUS_EXT_PTE: {
       GifPTE* gif_pte = nullptr;
-      if (!gif_read_data(gif_ptr, reinterpret_cast<uint8_t**>(&gif_pte), 13))
+      if (!gif_read_data(context, reinterpret_cast<uint8_t**>(&gif_pte), 13))
         return GifDecodeStatus::Unfinished;
 
-      gif_ptr->m_GifGCE = nullptr;
-      if (!gif_read_data(gif_ptr, &data_size_ptr, 1)) {
-        gif_ptr->skip_size = skip_size_org;
+      context->m_GifGCE = nullptr;
+      if (!gif_read_data(context, &data_size_ptr, 1)) {
+        context->skip_size = skip_size_org;
         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;
+        if (!gif_read_data(context, &data_ptr, *data_size_ptr) ||
+            !gif_read_data(context, &data_size_ptr, 1)) {
+          context->skip_size = skip_size_org;
           return GifDecodeStatus::Unfinished;
         }
       }
@@ -85,45 +85,45 @@
     }
     case GIF_D_STATUS_EXT_GCE: {
       GifGCE* gif_gce_ptr = nullptr;
-      if (!gif_read_data(gif_ptr, reinterpret_cast<uint8_t**>(&gif_gce_ptr), 6))
+      if (!gif_read_data(context, reinterpret_cast<uint8_t**>(&gif_gce_ptr), 6))
         return GifDecodeStatus::Unfinished;
 
-      if (!gif_ptr->m_GifGCE.get())
-        gif_ptr->m_GifGCE = pdfium::MakeUnique<GifGCE>();
-      gif_ptr->m_GifGCE->block_size = gif_gce_ptr->block_size;
-      gif_ptr->m_GifGCE->gce_flag = gif_gce_ptr->gce_flag;
-      gif_ptr->m_GifGCE->delay_time = GetWord_LSBFirst(
+      if (!context->m_GifGCE.get())
+        context->m_GifGCE = pdfium::MakeUnique<GifGCE>();
+      context->m_GifGCE->block_size = gif_gce_ptr->block_size;
+      context->m_GifGCE->gce_flag = gif_gce_ptr->gce_flag;
+      context->m_GifGCE->delay_time = GetWord_LSBFirst(
           reinterpret_cast<uint8_t*>(&gif_gce_ptr->delay_time));
-      gif_ptr->m_GifGCE->trans_index = gif_gce_ptr->trans_index;
+      context->m_GifGCE->trans_index = gif_gce_ptr->trans_index;
       break;
     }
     default: {
-      if (gif_ptr->decode_status == GIF_D_STATUS_EXT_PTE)
-        gif_ptr->m_GifGCE = nullptr;
-      if (!gif_read_data(gif_ptr, &data_size_ptr, 1))
+      if (context->decode_status == GIF_D_STATUS_EXT_PTE)
+        context->m_GifGCE = nullptr;
+      if (!gif_read_data(context, &data_size_ptr, 1))
         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;
+        if (!gif_read_data(context, &data_ptr, *data_size_ptr) ||
+            !gif_read_data(context, &data_size_ptr, 1)) {
+          context->skip_size = skip_size_org;
           return GifDecodeStatus::Unfinished;
         }
       }
     }
   }
-  gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG);
+  gif_save_decoding_status(context, GIF_D_STATUS_SIG);
   return GifDecodeStatus::Success;
 }
 
-GifDecodeStatus gif_decode_image_info(CGifDecompressor* gif_ptr) {
-  if (gif_ptr->width == 0 || gif_ptr->height == 0) {
-    gif_ptr->ErrorData("No Image Header Info");
+GifDecodeStatus gif_decode_image_info(CGifContext* context) {
+  if (context->width == 0 || context->height == 0) {
+    context->ErrorData("No Image Header Info");
     return GifDecodeStatus::Error;
   }
-  uint32_t skip_size_org = gif_ptr->skip_size;
+  uint32_t skip_size_org = context->skip_size;
   GifImageInfo* gif_img_info_ptr = nullptr;
-  if (!gif_read_data(gif_ptr, reinterpret_cast<uint8_t**>(&gif_img_info_ptr),
+  if (!gif_read_data(context, reinterpret_cast<uint8_t**>(&gif_img_info_ptr),
                      9))
     return GifDecodeStatus::Unfinished;
 
@@ -138,18 +138,18 @@
       GetWord_LSBFirst(reinterpret_cast<uint8_t*>(&gif_img_info_ptr->height));
   gif_image->m_ImageInfo.local_flag = gif_img_info_ptr->local_flag;
   if (gif_image->m_ImageInfo.left + gif_image->m_ImageInfo.width >
-          gif_ptr->width ||
+          context->width ||
       gif_image->m_ImageInfo.top + gif_image->m_ImageInfo.height >
-          gif_ptr->height) {
-    gif_ptr->ErrorData("Image Data Out Of LSD, The File May Be Corrupt");
+          context->height) {
+    context->ErrorData("Image Data Out Of LSD, The File May Be Corrupt");
     return GifDecodeStatus::Error;
   }
   GifLF* gif_img_info_lf_ptr = (GifLF*)&gif_img_info_ptr->local_flag;
   if (gif_img_info_lf_ptr->local_pal) {
     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)) {
-      gif_ptr->skip_size = skip_size_org;
+    if (!gif_read_data(context, &loc_pal_ptr, loc_pal_size)) {
+      context->skip_size = skip_size_org;
       return GifDecodeStatus::Unfinished;
     }
     gif_image->m_LocalPalettes = std::vector<GifPalette>(loc_pal_size / 3);
@@ -157,28 +157,28 @@
               reinterpret_cast<uint8_t*>(gif_image->m_LocalPalettes.data()));
   }
   uint8_t* code_size_ptr = nullptr;
-  if (!gif_read_data(gif_ptr, &code_size_ptr, 1)) {
-    gif_ptr->skip_size = skip_size_org;
+  if (!gif_read_data(context, &code_size_ptr, 1)) {
+    context->skip_size = skip_size_org;
     return GifDecodeStatus::Unfinished;
   }
   gif_image->image_code_size = *code_size_ptr;
-  gif_ptr->RecordCurrentPosition(&gif_image->image_data_pos);
-  gif_image->image_data_pos += gif_ptr->skip_size;
+  context->RecordCurrentPosition(&gif_image->image_data_pos);
+  gif_image->image_data_pos += context->skip_size;
   gif_image->m_ImageGCE = nullptr;
-  if (gif_ptr->m_GifGCE.get()) {
-    gif_image->m_ImageGCE = std::move(gif_ptr->m_GifGCE);
-    gif_ptr->m_GifGCE = nullptr;
+  if (context->m_GifGCE.get()) {
+    gif_image->m_ImageGCE = std::move(context->m_GifGCE);
+    context->m_GifGCE = nullptr;
   }
-  gif_ptr->m_Images.push_back(std::move(gif_image));
-  gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA);
+  context->m_Images.push_back(std::move(gif_image));
+  gif_save_decoding_status(context, GIF_D_STATUS_IMG_DATA);
   return GifDecodeStatus::Success;
 }
 
-void gif_decoding_failure_at_tail_cleanup(CGifDecompressor* gif_ptr,
+void gif_decoding_failure_at_tail_cleanup(CGifContext* context,
                                           GifImage* gif_image_ptr) {
   gif_image_ptr->m_ImageRowBuf.clear();
-  gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL);
-  gif_ptr->ErrorData("Decode Image Data Error");
+  gif_save_decoding_status(context, GIF_D_STATUS_TAIL);
+  context->ErrorData("Decode Image Data Error");
 }
 
 }  // namespace
@@ -350,77 +350,77 @@
   return GifDecodeStatus::Error;
 }
 
-GifDecodeStatus gif_read_header(CGifDecompressor* gif_ptr) {
-  if (!gif_ptr)
+GifDecodeStatus gif_read_header(CGifContext* context) {
+  if (!context)
     return GifDecodeStatus::Error;
 
-  uint32_t skip_size_org = gif_ptr->skip_size;
+  uint32_t skip_size_org = context->skip_size;
   GifHeader* gif_header_ptr = nullptr;
-  if (!gif_read_data(gif_ptr, reinterpret_cast<uint8_t**>(&gif_header_ptr), 6))
+  if (!gif_read_data(context, reinterpret_cast<uint8_t**>(&gif_header_ptr), 6))
     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_ptr->ErrorData("Not A Gif Image");
+    context->ErrorData("Not A Gif Image");
     return GifDecodeStatus::Error;
   }
   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;
+  if (!gif_read_data(context, reinterpret_cast<uint8_t**>(&gif_lsd_ptr), 7)) {
+    context->skip_size = skip_size_org;
     return GifDecodeStatus::Unfinished;
   }
   if (reinterpret_cast<GifGF*>(&gif_lsd_ptr->global_flag)->global_pal) {
-    gif_ptr->global_pal_num =
+    context->global_pal_num =
         2 << reinterpret_cast<GifGF*>(&gif_lsd_ptr->global_flag)->pal_bits;
-    int32_t global_pal_size = gif_ptr->global_pal_num * 3;
+    int32_t global_pal_size = context->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;
+    if (!gif_read_data(context, &global_pal_ptr, global_pal_size)) {
+      context->skip_size = skip_size_org;
       return GifDecodeStatus::Unfinished;
     }
-    gif_ptr->global_sort_flag = ((GifGF*)&gif_lsd_ptr->global_flag)->sort_flag;
-    gif_ptr->global_color_resolution =
+    context->global_sort_flag = ((GifGF*)&gif_lsd_ptr->global_flag)->sort_flag;
+    context->global_color_resolution =
         ((GifGF*)&gif_lsd_ptr->global_flag)->color_resolution;
-    gif_ptr->m_GlobalPalette.resize(global_pal_size / 3);
-    memcpy(gif_ptr->m_GlobalPalette.data(), global_pal_ptr, global_pal_size);
+    context->m_GlobalPalette.resize(global_pal_size / 3);
+    memcpy(context->m_GlobalPalette.data(), global_pal_ptr, global_pal_size);
   }
-  gif_ptr->width =
+  context->width =
       (int)GetWord_LSBFirst(reinterpret_cast<uint8_t*>(&gif_lsd_ptr->width));
-  gif_ptr->height =
+  context->height =
       (int)GetWord_LSBFirst(reinterpret_cast<uint8_t*>(&gif_lsd_ptr->height));
-  gif_ptr->bc_index = gif_lsd_ptr->bc_index;
-  gif_ptr->pixel_aspect = gif_lsd_ptr->pixel_aspect;
+  context->bc_index = gif_lsd_ptr->bc_index;
+  context->pixel_aspect = gif_lsd_ptr->pixel_aspect;
   return GifDecodeStatus::Success;
 }
 
-GifDecodeStatus gif_get_frame(CGifDecompressor* gif_ptr) {
-  if (!gif_ptr)
+GifDecodeStatus gif_get_frame(CGifContext* context) {
+  if (!context)
     return GifDecodeStatus::Error;
 
   GifDecodeStatus ret = GifDecodeStatus::Success;
   while (true) {
-    switch (gif_ptr->decode_status) {
+    switch (context->decode_status) {
       case GIF_D_STATUS_TAIL:
         return GifDecodeStatus::Success;
       case GIF_D_STATUS_SIG: {
         uint8_t* sig_ptr = nullptr;
-        if (!gif_read_data(gif_ptr, &sig_ptr, 1))
+        if (!gif_read_data(context, &sig_ptr, 1))
           return GifDecodeStatus::Unfinished;
 
         switch (*sig_ptr) {
           case GIF_SIG_EXTENSION:
-            gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT);
+            gif_save_decoding_status(context, GIF_D_STATUS_EXT);
             continue;
           case GIF_SIG_IMAGE:
-            gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_INFO);
+            gif_save_decoding_status(context, GIF_D_STATUS_IMG_INFO);
             continue;
           case GIF_SIG_TRAILER:
-            gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL);
+            gif_save_decoding_status(context, GIF_D_STATUS_TAIL);
             return GifDecodeStatus::Success;
           default:
-            if (gif_ptr->avail_in) {
+            if (context->avail_in) {
               // The Gif File has non_standard Tag!
-              gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG);
+              gif_save_decoding_status(context, GIF_D_STATUS_SIG);
               continue;
             }
             // The Gif File Doesn't have Trailer Tag!
@@ -429,31 +429,31 @@
       }
       case GIF_D_STATUS_EXT: {
         uint8_t* ext_ptr = nullptr;
-        if (!gif_read_data(gif_ptr, &ext_ptr, 1))
+        if (!gif_read_data(context, &ext_ptr, 1))
           return GifDecodeStatus::Unfinished;
 
         switch (*ext_ptr) {
           case GIF_BLOCK_CE:
-            gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT_CE);
+            gif_save_decoding_status(context, GIF_D_STATUS_EXT_CE);
             continue;
           case GIF_BLOCK_GCE:
-            gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT_GCE);
+            gif_save_decoding_status(context, GIF_D_STATUS_EXT_GCE);
             continue;
           case GIF_BLOCK_PTE:
-            gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT_PTE);
+            gif_save_decoding_status(context, GIF_D_STATUS_EXT_PTE);
             continue;
           default: {
             int32_t status = GIF_D_STATUS_EXT_UNE;
             if (*ext_ptr == GIF_BLOCK_PTE) {
               status = GIF_D_STATUS_EXT_PTE;
             }
-            gif_save_decoding_status(gif_ptr, status);
+            gif_save_decoding_status(context, status);
             continue;
           }
         }
       }
       case GIF_D_STATUS_IMG_INFO: {
-        ret = gif_decode_image_info(gif_ptr);
+        ret = gif_decode_image_info(context);
         if (ret != GifDecodeStatus::Success)
           return ret;
         continue;
@@ -461,25 +461,25 @@
       case GIF_D_STATUS_IMG_DATA: {
         uint8_t* data_size_ptr = nullptr;
         uint8_t* data_ptr = nullptr;
-        uint32_t skip_size_org = gif_ptr->skip_size;
-        if (!gif_read_data(gif_ptr, &data_size_ptr, 1))
+        uint32_t skip_size_org = context->skip_size;
+        if (!gif_read_data(context, &data_size_ptr, 1))
           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;
+          if (!gif_read_data(context, &data_ptr, *data_size_ptr)) {
+            context->skip_size = skip_size_org;
             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))
+          gif_save_decoding_status(context, GIF_D_STATUS_IMG_DATA);
+          skip_size_org = context->skip_size;
+          if (!gif_read_data(context, &data_size_ptr, 1))
             return GifDecodeStatus::Unfinished;
         }
-        gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG);
+        gif_save_decoding_status(context, GIF_D_STATUS_SIG);
         continue;
       }
       default: {
-        ret = gif_decode_extension(gif_ptr);
+        ret = gif_decode_extension(context);
         if (ret != GifDecodeStatus::Success)
           return ret;
         break;
@@ -489,32 +489,32 @@
   return GifDecodeStatus::Success;
 }
 
-GifDecodeStatus gif_load_frame(CGifDecompressor* gif_ptr, int32_t frame_num) {
-  if (!gif_ptr || !pdfium::IndexInBounds(gif_ptr->m_Images, frame_num))
+GifDecodeStatus gif_load_frame(CGifContext* context, int32_t frame_num) {
+  if (!context || !pdfium::IndexInBounds(context->m_Images, frame_num))
     return GifDecodeStatus::Error;
 
   uint8_t* data_size_ptr = nullptr;
   uint8_t* data_ptr = nullptr;
-  uint32_t skip_size_org = gif_ptr->skip_size;
-  GifImage* gif_image_ptr = gif_ptr->m_Images[frame_num].get();
+  uint32_t skip_size_org = context->skip_size;
+  GifImage* gif_image_ptr = context->m_Images[frame_num].get();
   uint32_t gif_img_row_bytes = gif_image_ptr->m_ImageInfo.width;
   if (gif_img_row_bytes == 0) {
-    gif_ptr->ErrorData("Error Invalid Number of Row Bytes");
+    context->ErrorData("Error Invalid Number of Row Bytes");
     return GifDecodeStatus::Error;
   }
-  if (gif_ptr->decode_status == GIF_D_STATUS_TAIL) {
+  if (context->decode_status == GIF_D_STATUS_TAIL) {
     gif_image_ptr->m_ImageRowBuf.resize(gif_img_row_bytes);
     GifGCE* gif_img_gce_ptr = gif_image_ptr->m_ImageGCE.get();
     int32_t loc_pal_num =
         ((GifLF*)&gif_image_ptr->m_ImageInfo.local_flag)->local_pal
             ? (2 << ((GifLF*)&gif_image_ptr->m_ImageInfo.local_flag)->pal_bits)
             : 0;
-    gif_ptr->avail_in = 0;
+    context->avail_in = 0;
     GifPalette* pLocalPalette = gif_image_ptr->m_LocalPalettes.empty()
                                     ? nullptr
                                     : gif_image_ptr->m_LocalPalettes.data();
     if (!gif_img_gce_ptr) {
-      bool bRes = gif_ptr->GetRecordPosition(
+      bool bRes = context->GetRecordPosition(
           gif_image_ptr->image_data_pos, gif_image_ptr->m_ImageInfo.left,
           gif_image_ptr->m_ImageInfo.top, gif_image_ptr->m_ImageInfo.width,
           gif_image_ptr->m_ImageInfo.height, loc_pal_num, pLocalPalette, 0, 0,
@@ -522,11 +522,11 @@
           (bool)((GifLF*)&gif_image_ptr->m_ImageInfo.local_flag)->interlace);
       if (!bRes) {
         gif_image_ptr->m_ImageRowBuf.clear();
-        gif_ptr->ErrorData("Error Read Record Position Data");
+        context->ErrorData("Error Read Record Position Data");
         return GifDecodeStatus::Error;
       }
     } else {
-      bool bRes = gif_ptr->GetRecordPosition(
+      bool bRes = context->GetRecordPosition(
           gif_image_ptr->image_data_pos, gif_image_ptr->m_ImageInfo.left,
           gif_image_ptr->m_ImageInfo.top, gif_image_ptr->m_ImageInfo.width,
           gif_image_ptr->m_ImageInfo.height, loc_pal_num, pLocalPalette,
@@ -540,131 +540,130 @@
           (bool)((GifLF*)&gif_image_ptr->m_ImageInfo.local_flag)->interlace);
       if (!bRes) {
         gif_image_ptr->m_ImageRowBuf.clear();
-        gif_ptr->ErrorData("Error Read Record Position Data");
+        context->ErrorData("Error Read Record Position Data");
         return GifDecodeStatus::Error;
       }
     }
     if (gif_image_ptr->image_code_size >= 32) {
       gif_image_ptr->m_ImageRowBuf.clear();
-      gif_ptr->ErrorData("Error Invalid Code Size");
+      context->ErrorData("Error Invalid Code Size");
       return GifDecodeStatus::Error;
     }
-    if (!gif_ptr->m_ImgDecoder.get())
-      gif_ptr->m_ImgDecoder =
-          pdfium::MakeUnique<CGifLZWDecoder>(gif_ptr->err_ptr);
-    gif_ptr->m_ImgDecoder->InitTable(gif_image_ptr->image_code_size);
-    gif_ptr->img_row_offset = 0;
-    gif_ptr->img_row_avail_size = 0;
-    gif_ptr->img_pass_num = 0;
+    if (!context->m_ImgDecoder.get())
+      context->m_ImgDecoder =
+          pdfium::MakeUnique<CGifLZWDecoder>(context->err_ptr);
+    context->m_ImgDecoder->InitTable(gif_image_ptr->image_code_size);
+    context->img_row_offset = 0;
+    context->img_row_avail_size = 0;
+    context->img_pass_num = 0;
     gif_image_ptr->image_row_num = 0;
-    gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA);
+    gif_save_decoding_status(context, GIF_D_STATUS_IMG_DATA);
   }
-  CGifLZWDecoder* img_decoder_ptr = gif_ptr->m_ImgDecoder.get();
-  if (gif_ptr->decode_status == GIF_D_STATUS_IMG_DATA) {
-    if (!gif_read_data(gif_ptr, &data_size_ptr, 1))
+  CGifLZWDecoder* img_decoder_ptr = context->m_ImgDecoder.get();
+  if (context->decode_status == GIF_D_STATUS_IMG_DATA) {
+    if (!gif_read_data(context, &data_size_ptr, 1))
       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;
+      if (!gif_read_data(context, &data_ptr, *data_size_ptr)) {
+        context->skip_size = skip_size_org;
         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;
+      gif_save_decoding_status(context, GIF_D_STATUS_IMG_DATA);
+      context->img_row_offset += context->img_row_avail_size;
+      context->img_row_avail_size = gif_img_row_bytes - context->img_row_offset;
       GifDecodeStatus ret = img_decoder_ptr->Decode(
-          gif_image_ptr->m_ImageRowBuf.data() + gif_ptr->img_row_offset,
-          &gif_ptr->img_row_avail_size);
+          gif_image_ptr->m_ImageRowBuf.data() + context->img_row_offset,
+          &context->img_row_avail_size);
       if (ret == GifDecodeStatus::Error) {
-        gif_decoding_failure_at_tail_cleanup(gif_ptr, gif_image_ptr);
+        gif_decoding_failure_at_tail_cleanup(context, gif_image_ptr);
         return GifDecodeStatus::Error;
       }
       while (ret != GifDecodeStatus::Error) {
         if (ret == GifDecodeStatus::Success) {
-          gif_ptr->ReadScanline(gif_image_ptr->image_row_num,
+          context->ReadScanline(gif_image_ptr->image_row_num,
                                 gif_image_ptr->m_ImageRowBuf.data());
           gif_image_ptr->m_ImageRowBuf.clear();
-          gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL);
+          gif_save_decoding_status(context, GIF_D_STATUS_TAIL);
           return GifDecodeStatus::Success;
         }
         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))
+          skip_size_org = context->skip_size;
+          if (!gif_read_data(context, &data_size_ptr, 1))
             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;
+            if (!gif_read_data(context, &data_ptr, *data_size_ptr)) {
+              context->skip_size = skip_size_org;
               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;
+            gif_save_decoding_status(context, GIF_D_STATUS_IMG_DATA);
+            context->img_row_offset += context->img_row_avail_size;
+            context->img_row_avail_size =
+                gif_img_row_bytes - context->img_row_offset;
             ret = img_decoder_ptr->Decode(
-                gif_image_ptr->m_ImageRowBuf.data() + gif_ptr->img_row_offset,
-                &gif_ptr->img_row_avail_size);
+                gif_image_ptr->m_ImageRowBuf.data() + context->img_row_offset,
+                &context->img_row_avail_size);
           }
         }
         if (ret == GifDecodeStatus::InsufficientDestSize) {
           if (((GifLF*)&gif_image_ptr->m_ImageInfo.local_flag)->interlace) {
-            gif_ptr->ReadScanline(gif_image_ptr->image_row_num,
+            context->ReadScanline(gif_image_ptr->image_row_num,
                                   gif_image_ptr->m_ImageRowBuf.data());
             gif_image_ptr->image_row_num +=
-                s_gif_interlace_step[gif_ptr->img_pass_num];
+                s_gif_interlace_step[context->img_pass_num];
             if (gif_image_ptr->image_row_num >=
                 (int32_t)gif_image_ptr->m_ImageInfo.height) {
-              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);
+              context->img_pass_num++;
+              if (context->img_pass_num == FX_ArraySize(s_gif_interlace_step)) {
+                gif_decoding_failure_at_tail_cleanup(context, gif_image_ptr);
                 return GifDecodeStatus::Error;
               }
               gif_image_ptr->image_row_num =
-                  s_gif_interlace_step[gif_ptr->img_pass_num] / 2;
+                  s_gif_interlace_step[context->img_pass_num] / 2;
             }
           } else {
-            gif_ptr->ReadScanline(gif_image_ptr->image_row_num++,
+            context->ReadScanline(gif_image_ptr->image_row_num++,
                                   gif_image_ptr->m_ImageRowBuf.data());
           }
-          gif_ptr->img_row_offset = 0;
-          gif_ptr->img_row_avail_size = gif_img_row_bytes;
+          context->img_row_offset = 0;
+          context->img_row_avail_size = gif_img_row_bytes;
           ret = img_decoder_ptr->Decode(
-              gif_image_ptr->m_ImageRowBuf.data() + gif_ptr->img_row_offset,
-              &gif_ptr->img_row_avail_size);
+              gif_image_ptr->m_ImageRowBuf.data() + context->img_row_offset,
+              &context->img_row_avail_size);
         }
         if (ret == GifDecodeStatus::Error) {
-          gif_decoding_failure_at_tail_cleanup(gif_ptr, gif_image_ptr);
+          gif_decoding_failure_at_tail_cleanup(context, gif_image_ptr);
           return GifDecodeStatus::Error;
         }
       }
     }
-    gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL);
+    gif_save_decoding_status(context, GIF_D_STATUS_TAIL);
   }
-  gif_ptr->ErrorData("Decode Image Data Error");
+  context->ErrorData("Decode Image Data Error");
   return GifDecodeStatus::Error;
 }
 
-void gif_input_buffer(CGifDecompressor* gif_ptr,
+void gif_input_buffer(CGifContext* context,
                       uint8_t* src_buf,
                       uint32_t src_size) {
-  gif_ptr->next_in = src_buf;
-  gif_ptr->avail_in = src_size;
-  gif_ptr->skip_size = 0;
+  context->next_in = src_buf;
+  context->avail_in = src_size;
+  context->skip_size = 0;
 }
 
-uint32_t gif_get_avail_input(CGifDecompressor* gif_ptr,
-                             uint8_t** avail_buf_ptr) {
+uint32_t gif_get_avail_input(CGifContext* context, uint8_t** avail_buf_ptr) {
   if (avail_buf_ptr) {
     *avail_buf_ptr = nullptr;
-    if (gif_ptr->avail_in > 0)
-      *avail_buf_ptr = gif_ptr->next_in;
+    if (context->avail_in > 0)
+      *avail_buf_ptr = context->next_in;
   }
-  return gif_ptr->avail_in;
+  return context->avail_in;
 }
 
-int32_t gif_get_frame_num(CGifDecompressor* gif_ptr) {
-  return pdfium::CollectionSize<int32_t>(gif_ptr->m_Images);
+int32_t gif_get_frame_num(CGifContext* context) {
+  return pdfium::CollectionSize<int32_t>(context->m_Images);
 }
diff --git a/core/fxcodec/lgif/fx_gif.h b/core/fxcodec/lgif/fx_gif.h
index 7bae79f..5df1f81 100644
--- a/core/fxcodec/lgif/fx_gif.h
+++ b/core/fxcodec/lgif/fx_gif.h
@@ -13,7 +13,7 @@
 
 #include "core/fxcrt/fx_basic.h"
 
-class CGifDecompressor;
+class CGifContext;
 
 #define GIF_SIGNATURE "GIF"
 #define GIF_SIG_EXTENSION 0x21
@@ -166,14 +166,13 @@
 
 static const int32_t s_gif_interlace_step[4] = {8, 8, 4, 2};
 
-GifDecodeStatus gif_read_header(CGifDecompressor* gif_ptr);
-GifDecodeStatus gif_get_frame(CGifDecompressor* gif_ptr);
-int32_t gif_get_frame_num(CGifDecompressor* gif_ptr);
-GifDecodeStatus gif_load_frame(CGifDecompressor* gif_ptr, int32_t frame_num);
-void gif_input_buffer(CGifDecompressor* gif_ptr,
+GifDecodeStatus gif_read_header(CGifContext* gif_ptr);
+GifDecodeStatus gif_get_frame(CGifContext* gif_ptr);
+int32_t gif_get_frame_num(CGifContext* gif_ptr);
+GifDecodeStatus gif_load_frame(CGifContext* gif_ptr, int32_t frame_num);
+void gif_input_buffer(CGifContext* gif_ptr,
                       uint8_t* src_buf,
                       uint32_t src_size);
-uint32_t gif_get_avail_input(CGifDecompressor* gif_ptr,
-                             uint8_t** avail_buf_ptr);
+uint32_t gif_get_avail_input(CGifContext* gif_ptr, uint8_t** avail_buf_ptr);
 
 #endif  // CORE_FXCODEC_LGIF_FX_GIF_H_
