diff --git a/core/fxcodec/bmp/cfx_bmpdecompressor.cpp b/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
index 32362da..f494b8e 100644
--- a/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
+++ b/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
@@ -344,7 +344,7 @@
   }
 }
 
-int32_t CFX_BmpDecompressor::DecodeImage() {
+BmpModule::Status CFX_BmpDecompressor::DecodeImage() {
   if (decode_status_ == DecodeStatus::kDataPre) {
     input_buffer_->Seek(0);
     if (!GetDataPosition(header_offset_)) {
@@ -370,7 +370,7 @@
     case kBmpRle4:
       return DecodeRLE4();
     default:
-      return 0;
+      return BmpModule::Status::kFail;
   }
 }
 
@@ -383,12 +383,12 @@
   return true;
 }
 
-int32_t CFX_BmpDecompressor::DecodeRGB() {
+BmpModule::Status CFX_BmpDecompressor::DecodeRGB() {
   std::vector<uint8_t> dest_buf(src_row_bytes_);
   while (row_num_ < height_) {
     size_t idx = 0;
     if (!ReadData(dest_buf.data(), src_row_bytes_))
-      return 2;
+      return BmpModule::Status::kContinue;
 
     SaveDecodingStatus(DecodeStatus::kData);
     switch (bit_counts_) {
@@ -422,7 +422,7 @@
         green_bits += blue_bits;
         red_bits += green_bits;
         if (blue_bits > 8 || green_bits < 8 || red_bits < 8)
-          return 2;
+          return BmpModule::Status::kContinue;
         blue_bits = 8 - blue_bits;
         green_bits -= 8;
         red_bits -= 8;
@@ -448,25 +448,25 @@
     }
     for (uint8_t byte : out_row_buffer_) {
       if (!ValidateColorIndex(byte))
-        return 0;
+        return BmpModule::Status::kFail;
     }
     ReadNextScanline();
   }
   SaveDecodingStatus(DecodeStatus::kTail);
-  return 1;
+  return BmpModule::Status::kSuccess;
 }
 
-int32_t CFX_BmpDecompressor::DecodeRLE8() {
+BmpModule::Status CFX_BmpDecompressor::DecodeRLE8() {
   uint8_t first_part;
   col_num_ = 0;
   while (true) {
     if (!ReadData(&first_part, sizeof(first_part)))
-      return 2;
+      return BmpModule::Status::kContinue;
 
     switch (first_part) {
       case kRleMarker: {
         if (!ReadData(&first_part, sizeof(first_part)))
-          return 2;
+          return BmpModule::Status::kContinue;
 
         switch (first_part) {
           case kRleEol: {
@@ -486,12 +486,12 @@
             if (row_num_ < height_)
               ReadNextScanline();
             SaveDecodingStatus(DecodeStatus::kTail);
-            return 1;
+            return BmpModule::Status::kSuccess;
           }
           case kRleDelta: {
             uint8_t delta[2];
             if (!ReadData(delta, sizeof(delta)))
-              return 2;
+              return BmpModule::Status::kContinue;
 
             col_num_ += delta[0];
             size_t bmp_row_num__next = row_num_ + delta[1];
@@ -518,13 +518,13 @@
             std::vector<uint8_t> second_part(second_part_size);
             uint8_t* second_part_data = second_part.data();
             if (!ReadData(second_part_data, second_part_size))
-              return 2;
+              return BmpModule::Status::kContinue;
 
             std::copy(second_part_data, second_part_data + first_part,
                       out_row_buffer_.begin() + col_num_);
             for (size_t i = col_num_; i < col_num_ + first_part; ++i) {
               if (!ValidateColorIndex(out_row_buffer_[i]))
-                return 0;
+                return BmpModule::Status::kFail;
             }
             col_num_ += first_part;
           }
@@ -540,12 +540,12 @@
 
         uint8_t second_part;
         if (!ReadData(&second_part, sizeof(second_part)))
-          return 2;
+          return BmpModule::Status::kContinue;
 
         std::fill(out_row_buffer_.begin() + col_num_,
                   out_row_buffer_.begin() + col_num_ + first_part, second_part);
         if (!ValidateColorIndex(out_row_buffer_[col_num_]))
-          return 0;
+          return BmpModule::Status::kFail;
         col_num_ += first_part;
       }
     }
@@ -554,18 +554,18 @@
   NOTREACHED();
 }
 
-int32_t CFX_BmpDecompressor::DecodeRLE4() {
+BmpModule::Status CFX_BmpDecompressor::DecodeRLE4() {
   uint8_t first_part;
   col_num_ = 0;
   while (true) {
     if (!ReadData(&first_part, sizeof(first_part)))
-      return 2;
+      return BmpModule::Status::kContinue;
 
     switch (first_part) {
       case kRleMarker: {
-        if (!ReadData(&first_part, sizeof(first_part))) {
-          return 2;
-        }
+        if (!ReadData(&first_part, sizeof(first_part)))
+          return BmpModule::Status::kContinue;
+
         switch (first_part) {
           case kRleEol: {
             if (row_num_ >= height_) {
@@ -584,12 +584,12 @@
             if (row_num_ < height_)
               ReadNextScanline();
             SaveDecodingStatus(DecodeStatus::kTail);
-            return 1;
+            return BmpModule::Status::kSuccess;
           }
           case kRleDelta: {
             uint8_t delta[2];
             if (!ReadData(delta, sizeof(delta)))
-              return 2;
+              return BmpModule::Status::kContinue;
 
             col_num_ += delta[0];
             size_t bmp_row_num__next = row_num_ + delta[1];
@@ -623,13 +623,13 @@
             std::vector<uint8_t> second_part(second_part_size);
             uint8_t* second_part_data = second_part.data();
             if (!ReadData(second_part_data, second_part_size))
-              return 2;
+              return BmpModule::Status::kContinue;
 
             for (uint8_t i = 0; i < first_part; i++) {
               uint8_t color = (i & 0x01) ? (*second_part_data++ & 0x0F)
                                          : (*second_part_data & 0xF0) >> 4;
               if (!ValidateColorIndex(color))
-                return 0;
+                return BmpModule::Status::kFail;
 
               out_row_buffer_[col_num_++] = color;
             }
@@ -655,14 +655,14 @@
         }
         uint8_t second_part;
         if (!ReadData(&second_part, sizeof(second_part)))
-          return 2;
+          return BmpModule::Status::kContinue;
 
         for (uint8_t i = 0; i < first_part; i++) {
           uint8_t second_byte = second_part;
           second_byte =
               i & 0x01 ? (second_byte & 0x0F) : (second_byte & 0xF0) >> 4;
           if (!ValidateColorIndex(second_byte))
-            return 0;
+            return BmpModule::Status::kFail;
 
           out_row_buffer_[col_num_++] = second_byte;
         }
diff --git a/core/fxcodec/bmp/cfx_bmpdecompressor.h b/core/fxcodec/bmp/cfx_bmpdecompressor.h
index eb987b2..2d25141 100644
--- a/core/fxcodec/bmp/cfx_bmpdecompressor.h
+++ b/core/fxcodec/bmp/cfx_bmpdecompressor.h
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "core/fxcodec/bmp/fx_bmp.h"
+#include "core/fxcodec/codec/bmpmodule.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/unowned_ptr.h"
 
@@ -24,7 +25,7 @@
   ~CFX_BmpDecompressor();
 
   void Error();
-  int32_t DecodeImage();
+  BmpModule::Status DecodeImage();
   bool ReadHeader();
   void SetInputBuffer(RetainPtr<CFX_CodecMemory> codec_memory);
   FX_FILESIZE GetAvailInput() const;
@@ -55,9 +56,9 @@
   bool ReadBmpPalette();
   bool GetDataPosition(uint32_t cur_pos);
   void ReadNextScanline();
-  int32_t DecodeRGB();
-  int32_t DecodeRLE8();
-  int32_t DecodeRLE4();
+  BmpModule::Status DecodeRGB();
+  BmpModule::Status DecodeRLE8();
+  BmpModule::Status DecodeRLE4();
   bool ReadData(uint8_t* destination, uint32_t size);
   void SaveDecodingStatus(DecodeStatus status);
   bool ValidateColorIndex(uint8_t val);
diff --git a/core/fxcodec/codec/bmpmodule.cpp b/core/fxcodec/codec/bmpmodule.cpp
index 26d1bfd..d052413 100644
--- a/core/fxcodec/codec/bmpmodule.cpp
+++ b/core/fxcodec/codec/bmpmodule.cpp
@@ -26,22 +26,22 @@
   return pdfium::MakeUnique<CFX_BmpContext>(this, pDelegate);
 }
 
-int32_t BmpModule::ReadHeader(Context* pContext,
-                              int32_t* width,
-                              int32_t* height,
-                              bool* tb_flag,
-                              int32_t* components,
-                              int32_t* pal_num,
-                              const std::vector<uint32_t>** palette,
-                              CFX_DIBAttribute* pAttribute) {
+BmpModule::Status BmpModule::ReadHeader(Context* pContext,
+                                        int32_t* width,
+                                        int32_t* height,
+                                        bool* tb_flag,
+                                        int32_t* components,
+                                        int32_t* pal_num,
+                                        const std::vector<uint32_t>** palette,
+                                        CFX_DIBAttribute* pAttribute) {
   ASSERT(pAttribute);
 
   auto* ctx = static_cast<CFX_BmpContext*>(pContext);
   if (setjmp(*ctx->m_Bmp.jmpbuf()))
-    return 0;
+    return Status::kFail;
 
   if (!ctx->m_Bmp.ReadHeader())
-    return 2;
+    return Status::kContinue;
 
   *width = ctx->m_Bmp.width();
   *height = ctx->m_Bmp.height();
@@ -52,13 +52,13 @@
   pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_METER;
   pAttribute->m_nXDPI = ctx->m_Bmp.dpi_x();
   pAttribute->m_nYDPI = ctx->m_Bmp.dpi_y();
-  return 1;
+  return Status::kSuccess;
 }
 
-int32_t BmpModule::LoadImage(Context* pContext) {
+BmpModule::Status BmpModule::LoadImage(Context* pContext) {
   auto* ctx = static_cast<CFX_BmpContext*>(pContext);
   if (setjmp(*ctx->m_Bmp.jmpbuf()))
-    return 0;
+    return Status::kFail;
 
   return ctx->m_Bmp.DecodeImage();
 }
diff --git a/core/fxcodec/codec/bmpmodule.h b/core/fxcodec/codec/bmpmodule.h
index d96f4f5..3a8b257 100644
--- a/core/fxcodec/codec/bmpmodule.h
+++ b/core/fxcodec/codec/bmpmodule.h
@@ -25,6 +25,8 @@
                                  const std::vector<uint8_t>& row_buf) = 0;
   };
 
+  enum class Status : uint8_t { kFail, kSuccess, kContinue };
+
   BmpModule();
   ~BmpModule() override;
 
@@ -35,15 +37,15 @@
              CFX_DIBAttribute* pAttribute) override;
 
   std::unique_ptr<Context> Start(Delegate* pDelegate);
-  int32_t ReadHeader(Context* pContext,
-                     int32_t* width,
-                     int32_t* height,
-                     bool* tb_flag,
-                     int32_t* components,
-                     int32_t* pal_num,
-                     const std::vector<uint32_t>** palette,
-                     CFX_DIBAttribute* pAttribute);
-  int32_t LoadImage(Context* pContext);
+  Status ReadHeader(Context* pContext,
+                    int32_t* width,
+                    int32_t* height,
+                    bool* tb_flag,
+                    int32_t* components,
+                    int32_t* pal_num,
+                    const std::vector<uint32_t>** palette,
+                    CFX_DIBAttribute* pAttribute);
+  Status LoadImage(Context* pContext);
 };
 
 }  // namespace fxcodec
diff --git a/core/fxcodec/codec/ccodec_progressivedecoder.cpp b/core/fxcodec/codec/ccodec_progressivedecoder.cpp
index 45d32d6..433e88a 100644
--- a/core/fxcodec/codec/ccodec_progressivedecoder.cpp
+++ b/core/fxcodec/codec/ccodec_progressivedecoder.cpp
@@ -725,21 +725,21 @@
   pBmpModule->Input(pBmpContext.get(), m_pCodecMemory, nullptr);
 
   const std::vector<uint32_t>* palette;
-  int32_t readResult = pBmpModule->ReadHeader(
+  BmpModule::Status read_result = pBmpModule->ReadHeader(
       pBmpContext.get(), &m_SrcWidth, &m_SrcHeight, &m_BmpIsTopBottom,
       &m_SrcComponents, &m_SrcPaletteNumber, &palette, pAttribute);
-  while (readResult == 2) {
+  while (read_result == BmpModule::Status::kContinue) {
     FXCODEC_STATUS error_status = FXCODEC_STATUS_ERR_FORMAT;
     if (!BmpReadMoreData(pBmpModule, pBmpContext.get(), error_status)) {
       m_status = error_status;
       return false;
     }
-    readResult = pBmpModule->ReadHeader(
+    read_result = pBmpModule->ReadHeader(
         pBmpContext.get(), &m_SrcWidth, &m_SrcHeight, &m_BmpIsTopBottom,
         &m_SrcComponents, &m_SrcPaletteNumber, &palette, pAttribute);
   }
 
-  if (readResult != 1) {
+  if (read_result != BmpModule::Status::kSuccess) {
     m_status = FXCODEC_STATUS_ERR_FORMAT;
     return false;
   }
@@ -825,8 +825,8 @@
     return m_status;
   }
   while (true) {
-    int32_t readRes = pBmpModule->LoadImage(m_pBmpContext.get());
-    while (readRes == 2) {
+    BmpModule::Status read_res = pBmpModule->LoadImage(m_pBmpContext.get());
+    while (read_res == BmpModule::Status::kContinue) {
       FXCODEC_STATUS error_status = FXCODEC_STATUS_DECODE_FINISH;
       if (!BmpReadMoreData(pBmpModule, m_pBmpContext.get(), error_status)) {
         m_pDeviceBitmap = nullptr;
@@ -834,9 +834,9 @@
         m_status = error_status;
         return m_status;
       }
-      readRes = pBmpModule->LoadImage(m_pBmpContext.get());
+      read_res = pBmpModule->LoadImage(m_pBmpContext.get());
     }
-    if (readRes == 1) {
+    if (read_res == BmpModule::Status::kSuccess) {
       m_pDeviceBitmap = nullptr;
       m_pFile = nullptr;
       m_status = FXCODEC_STATUS_DECODE_FINISH;
