fx_codec_flate code cleanup.

This CL cleans up the namespacing along with some type confusion in the flate
codec class.

Change-Id: I4772ee571bcd78f1c839b5cefc370860aca06bb3
Reviewed-on: https://pdfium-review.googlesource.com/2917
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcodec/codec/fx_codec_flate.cpp b/core/fxcodec/codec/fx_codec_flate.cpp
index b17e202..2ba505d 100644
--- a/core/fxcodec/codec/fx_codec_flate.cpp
+++ b/core/fxcodec/codec/fx_codec_flate.cpp
@@ -13,84 +13,87 @@
 
 #include "core/fxcodec/fx_codec.h"
 #include "core/fxcrt/fx_ext.h"
+#include "third_party/base/numerics/safe_conversions.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/zlib_v128/zlib.h"
 
 extern "C" {
+
 static void* my_alloc_func(void* opaque,
                            unsigned int items,
                            unsigned int size) {
   return FX_Alloc2D(uint8_t, items, size);
 }
+
 static void my_free_func(void* opaque, void* address) {
   FX_Free(address);
 }
-static int FPDFAPI_FlateGetTotalOut(void* context) {
-  return ((z_stream*)context)->total_out;
-}
-static int FPDFAPI_FlateGetTotalIn(void* context) {
-  return ((z_stream*)context)->total_in;
-}
-
-static bool FPDFAPI_FlateCompress(unsigned char* dest_buf,
-                                  unsigned long* dest_size,
-                                  const unsigned char* src_buf,
-                                  unsigned long src_size) {
-  return compress(dest_buf, dest_size, src_buf, src_size) == Z_OK;
-}
-
-void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),
-                        void (*free_func)(void*, void*)) {
-  z_stream* p = (z_stream*)alloc_func(0, 1, sizeof(z_stream));
-  if (!p)
-    return nullptr;
-
-  FXSYS_memset(p, 0, sizeof(z_stream));
-  p->zalloc = alloc_func;
-  p->zfree = free_func;
-  inflateInit(p);
-  return p;
-}
-
-void FPDFAPI_FlateInput(void* context,
-                        const unsigned char* src_buf,
-                        unsigned int src_size) {
-  ((z_stream*)context)->next_in = (unsigned char*)src_buf;
-  ((z_stream*)context)->avail_in = src_size;
-}
-
-int FPDFAPI_FlateOutput(void* context,
-                        unsigned char* dest_buf,
-                        unsigned int dest_size) {
-  ((z_stream*)context)->next_out = dest_buf;
-  ((z_stream*)context)->avail_out = dest_size;
-  unsigned int pre_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);
-  int ret = inflate((z_stream*)context, Z_SYNC_FLUSH);
-  unsigned int post_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);
-  unsigned int written = post_pos - pre_pos;
-  if (written < dest_size) {
-    FXSYS_memset(dest_buf + written, '\0', dest_size - written);
-  }
-  return ret;
-}
-
-int FPDFAPI_FlateGetAvailIn(void* context) {
-  return ((z_stream*)context)->avail_in;
-}
-
-int FPDFAPI_FlateGetAvailOut(void* context) {
-  return ((z_stream*)context)->avail_out;
-}
-
-void FPDFAPI_FlateEnd(void* context) {
-  inflateEnd((z_stream*)context);
-  ((z_stream*)context)->zfree(0, context);
-}
 
 }  // extern "C"
 
 namespace {
 
+uint32_t FlateGetPossiblyTruncatedTotalOut(void* context) {
+  return pdfium::base::saturated_cast<uint32_t>(
+      static_cast<z_stream*>(context)->total_out);
+}
+
+uint32_t FlateGetPossiblyTruncatedTotalIn(void* context) {
+  return pdfium::base::saturated_cast<uint32_t>(
+      static_cast<z_stream*>(context)->total_in);
+}
+
+bool FlateCompress(unsigned char* dest_buf,
+                   unsigned long* dest_size,
+                   const unsigned char* src_buf,
+                   uint32_t src_size) {
+  return compress(dest_buf, dest_size, src_buf, src_size) == Z_OK;
+}
+
+void* FlateInit() {
+  z_stream* p = FX_Alloc(z_stream, 1);
+  FXSYS_memset(p, 0, sizeof(z_stream));
+  p->zalloc = my_alloc_func;
+  p->zfree = my_free_func;
+  inflateInit(p);
+  return p;
+}
+
+void FlateInput(void* context,
+                const unsigned char* src_buf,
+                uint32_t src_size) {
+  static_cast<z_stream*>(context)->next_in =
+      const_cast<unsigned char*>(src_buf);
+  static_cast<z_stream*>(context)->avail_in = src_size;
+}
+
+uint32_t FlateOutput(void* context,
+                     unsigned char* dest_buf,
+                     uint32_t dest_size) {
+  static_cast<z_stream*>(context)->next_out = dest_buf;
+  static_cast<z_stream*>(context)->avail_out = dest_size;
+  uint32_t pre_pos = FlateGetPossiblyTruncatedTotalOut(context);
+  int ret = inflate(static_cast<z_stream*>(context), Z_SYNC_FLUSH);
+
+  uint32_t post_pos = FlateGetPossiblyTruncatedTotalOut(context);
+  ASSERT(post_pos >= pre_pos);
+
+  uint32_t written = post_pos - pre_pos;
+  if (written < dest_size)
+    FXSYS_memset(dest_buf + written, '\0', dest_size - written);
+
+  return ret;
+}
+
+uint32_t FlateGetAvailOut(void* context) {
+  return static_cast<z_stream*>(context)->avail_out;
+}
+
+void FlateEnd(void* context) {
+  inflateEnd(static_cast<z_stream*>(context));
+  static_cast<z_stream*>(context)->zfree(0, context);
+}
+
 class CLZWDecoder {
  public:
   int Decode(uint8_t* output,
@@ -518,7 +521,7 @@
 
   dest_buf = nullptr;
   dest_size = 0;
-  void* context = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
+  void* context = FlateInit();
   if (!context)
     return;
 
@@ -526,23 +529,23 @@
       FX_Alloc(uint8_t, guess_size + 1));
   guess_buf.get()[guess_size] = '\0';
 
-  FPDFAPI_FlateInput(context, src_buf, src_size);
+  FlateInput(context, src_buf, src_size);
 
   if (src_size < kStepSize) {
     // This is the old implementation.
     uint8_t* cur_buf = guess_buf.get();
     while (1) {
-      int32_t ret = FPDFAPI_FlateOutput(context, cur_buf, buf_size);
+      uint32_t ret = FlateOutput(context, cur_buf, buf_size);
       if (ret != Z_OK)
         break;
-      int32_t avail_buf_size = FPDFAPI_FlateGetAvailOut(context);
+      uint32_t avail_buf_size = FlateGetAvailOut(context);
       if (avail_buf_size != 0)
         break;
 
       uint32_t old_size = guess_size;
       guess_size += alloc_step;
       if (guess_size < old_size || guess_size + 1 < guess_size) {
-        FPDFAPI_FlateEnd(context);
+        FlateEnd(context);
         return;
       }
 
@@ -555,8 +558,8 @@
       cur_buf = guess_buf.get() + old_size;
       buf_size = guess_size - old_size;
     }
-    dest_size = FPDFAPI_FlateGetTotalOut(context);
-    offset = FPDFAPI_FlateGetTotalIn(context);
+    dest_size = FlateGetPossiblyTruncatedTotalOut(context);
+    offset = FlateGetPossiblyTruncatedTotalIn(context);
     if (guess_size / 2 > dest_size) {
       {
         uint8_t* new_buf =
@@ -571,14 +574,9 @@
     std::vector<uint8_t*> result_tmp_bufs;
     uint8_t* cur_buf = guess_buf.release();
     while (1) {
-      int32_t ret = FPDFAPI_FlateOutput(context, cur_buf, buf_size);
-      int32_t avail_buf_size = FPDFAPI_FlateGetAvailOut(context);
-      if (ret != Z_OK) {
-        last_buf_size = buf_size - avail_buf_size;
-        result_tmp_bufs.push_back(cur_buf);
-        break;
-      }
-      if (avail_buf_size != 0) {
+      uint32_t ret = FlateOutput(context, cur_buf, buf_size);
+      uint32_t avail_buf_size = FlateGetAvailOut(context);
+      if (ret != Z_OK || avail_buf_size != 0) {
         last_buf_size = buf_size - avail_buf_size;
         result_tmp_bufs.push_back(cur_buf);
         break;
@@ -591,8 +589,8 @@
     // The TotalOut size returned from the library may not be big enough to
     // handle the content the library returns. We can only handle items
     // up to 4GB in size.
-    dest_size = FPDFAPI_FlateGetTotalOut(context);
-    offset = FPDFAPI_FlateGetTotalIn(context);
+    dest_size = FlateGetPossiblyTruncatedTotalOut(context);
+    offset = FlateGetPossiblyTruncatedTotalIn(context);
     if (result_tmp_bufs.size() == 1) {
       dest_buf = result_tmp_bufs[0];
     } else {
@@ -602,19 +600,20 @@
       for (size_t i = 0; i < result_tmp_bufs.size(); i++) {
         uint8_t* tmp_buf = result_tmp_bufs[i];
         uint32_t tmp_buf_size = buf_size;
-        if (i == result_tmp_bufs.size() - 1) {
+        if (i == result_tmp_bufs.size() - 1)
           tmp_buf_size = last_buf_size;
-        }
+
         uint32_t cp_size = std::min(tmp_buf_size, remaining);
         FXSYS_memcpy(result_buf + result_pos, tmp_buf, cp_size);
         result_pos += cp_size;
         remaining -= cp_size;
+
         FX_Free(result_tmp_bufs[i]);
       }
       dest_buf = result_buf;
     }
   }
-  FPDFAPI_FlateEnd(context);
+  FlateEnd(context);
 }
 
 }  // namespace
@@ -663,15 +662,16 @@
   m_pPredictRaw = nullptr;
   m_LeftOver = 0;
 }
+
 CCodec_FlateScanlineDecoder::~CCodec_FlateScanlineDecoder() {
   FX_Free(m_pScanline);
   FX_Free(m_pLastLine);
   FX_Free(m_pPredictBuffer);
   FX_Free(m_pPredictRaw);
-  if (m_pFlate) {
-    FPDFAPI_FlateEnd(m_pFlate);
-  }
+  if (m_pFlate)
+    FlateEnd(m_pFlate);
 }
+
 void CCodec_FlateScanlineDecoder::Create(const uint8_t* src_buf,
                                          uint32_t src_size,
                                          int width,
@@ -716,28 +716,30 @@
     }
   }
 }
+
 bool CCodec_FlateScanlineDecoder::v_Rewind() {
-  if (m_pFlate) {
-    FPDFAPI_FlateEnd(m_pFlate);
-  }
-  m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
-  if (!m_pFlate) {
+  if (m_pFlate)
+    FlateEnd(m_pFlate);
+
+  m_pFlate = FlateInit();
+  if (!m_pFlate)
     return false;
-  }
-  FPDFAPI_FlateInput(m_pFlate, m_SrcBuf, m_SrcSize);
+
+  FlateInput(m_pFlate, m_SrcBuf, m_SrcSize);
   m_LeftOver = 0;
   return true;
 }
+
 uint8_t* CCodec_FlateScanlineDecoder::v_GetNextLine() {
   if (m_Predictor) {
     if (m_Pitch == m_PredictPitch) {
       if (m_Predictor == 2) {
-        FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
+        FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
         PNG_PredictLine(m_pScanline, m_pPredictRaw, m_pLastLine,
                         m_BitsPerComponent, m_Colors, m_Columns);
         FXSYS_memcpy(m_pLastLine, m_pScanline, m_PredictPitch);
       } else {
-        FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);
+        FlateOutput(m_pFlate, m_pScanline, m_Pitch);
         TIFF_PredictLine(m_pScanline, m_PredictPitch, m_bpc, m_nComps,
                          m_OutputWidth);
       }
@@ -754,12 +756,12 @@
       }
       while (bytes_to_go) {
         if (m_Predictor == 2) {
-          FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
+          FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
           PNG_PredictLine(m_pPredictBuffer, m_pPredictRaw, m_pLastLine,
                           m_BitsPerComponent, m_Colors, m_Columns);
           FXSYS_memcpy(m_pLastLine, m_pPredictBuffer, m_PredictPitch);
         } else {
-          FPDFAPI_FlateOutput(m_pFlate, m_pPredictBuffer, m_PredictPitch);
+          FlateOutput(m_pFlate, m_pPredictBuffer, m_PredictPitch);
           TIFF_PredictLine(m_pPredictBuffer, m_PredictPitch, m_BitsPerComponent,
                            m_Colors, m_Columns);
         }
@@ -772,12 +774,13 @@
       }
     }
   } else {
-    FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);
+    FlateOutput(m_pFlate, m_pScanline, m_Pitch);
   }
   return m_pScanline;
 }
+
 uint32_t CCodec_FlateScanlineDecoder::GetSrcOffset() {
-  return FPDFAPI_FlateGetTotalIn(m_pFlate);
+  return FlateGetPossiblyTruncatedTotalIn(m_pFlate);
 }
 
 std::unique_ptr<CCodec_ScanlineDecoder> CCodec_FlateModule::CreateDecoder(
@@ -859,7 +862,7 @@
   *dest_size = src_size + src_size / 1000 + 12;
   *dest_buf = FX_Alloc(uint8_t, *dest_size);
   unsigned long temp_size = *dest_size;
-  if (!FPDFAPI_FlateCompress(*dest_buf, &temp_size, src_buf, src_size))
+  if (!FlateCompress(*dest_buf, &temp_size, src_buf, src_size))
     return false;
 
   *dest_size = (uint32_t)temp_size;