Remove CJBig2_HuffmanTable::InitCodes().

Use CJBig2_Context::HuffmanAssignCode() instead.

Change-Id: Ief187420494a8cefa26eeedb98a55683caf7807b
Reviewed-on: https://pdfium-review.googlesource.com/31538
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/core/fxcodec/jbig2/JBig2_Context.cpp b/core/fxcodec/jbig2/JBig2_Context.cpp
index 6cb9487..8d416ffc 100644
--- a/core/fxcodec/jbig2/JBig2_Context.cpp
+++ b/core/fxcodec/jbig2/JBig2_Context.cpp
@@ -1319,9 +1319,9 @@
   return SBSYMCODES;
 }
 
+// static
 bool CJBig2_Context::HuffmanAssignCode(JBig2HuffmanCode* SBSYMCODES,
                                        uint32_t NTEMP) {
-  // TODO(thestig): CJBig2_HuffmanTable::InitCodes() has similar code.
   int LENMAX = 0;
   for (uint32_t i = 0; i < NTEMP; ++i)
     LENMAX = std::max(SBSYMCODES[i].codelen, LENMAX);
@@ -1331,7 +1331,6 @@
   for (uint32_t i = 0; i < NTEMP; ++i)
     ++LENCOUNT[SBSYMCODES[i].codelen];
 
-  LENCOUNT[0] = 0;
   for (int i = 1; i <= LENMAX; ++i) {
     pdfium::base::CheckedNumeric<int> shifted = FIRSTCODE[i - 1];
     shifted += LENCOUNT[i - 1];
@@ -1342,9 +1341,8 @@
     FIRSTCODE[i] = shifted.ValueOrDie();
     int CURCODE = FIRSTCODE[i];
     for (uint32_t j = 0; j < NTEMP; ++j) {
-      if (SBSYMCODES[j].codelen == i) {
+      if (SBSYMCODES[j].codelen == i)
         SBSYMCODES[j].code = CURCODE++;
-      }
     }
   }
   return true;
diff --git a/core/fxcodec/jbig2/JBig2_Context.h b/core/fxcodec/jbig2/JBig2_Context.h
index 3f3304d..e1ee679 100644
--- a/core/fxcodec/jbig2/JBig2_Context.h
+++ b/core/fxcodec/jbig2/JBig2_Context.h
@@ -45,6 +45,8 @@
                  bool bIsGlobal);
   ~CJBig2_Context();
 
+  static bool HuffmanAssignCode(JBig2HuffmanCode* SBSYMCODES, uint32_t NTEMP);
+
   int32_t GetFirstPage(uint8_t* pBuf,
                        int32_t width,
                        int32_t height,
@@ -82,8 +84,6 @@
 
   std::vector<JBig2HuffmanCode> DecodeSymbolIDHuffmanTable(uint32_t SBNUMSYMS);
 
-  bool HuffmanAssignCode(JBig2HuffmanCode* SBSYMCODES, uint32_t NTEMP);
-
   std::unique_ptr<CJBig2_Context> m_pGlobalContext;
   std::unique_ptr<CJBig2_BitStream> m_pStream;
   std::vector<std::unique_ptr<CJBig2_Segment>> m_SegmentList;
diff --git a/core/fxcodec/jbig2/JBig2_HuffmanTable.cpp b/core/fxcodec/jbig2/JBig2_HuffmanTable.cpp
index aa3cd0b..988978a 100644
--- a/core/fxcodec/jbig2/JBig2_HuffmanTable.cpp
+++ b/core/fxcodec/jbig2/JBig2_HuffmanTable.cpp
@@ -6,11 +6,11 @@
 
 #include "core/fxcodec/jbig2/JBig2_HuffmanTable.h"
 
-#include <algorithm>
 #include <limits>
 #include <vector>
 
 #include "core/fxcodec/jbig2/JBig2_BitStream.h"
+#include "core/fxcodec/jbig2/JBig2_Context.h"
 #include "core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h"
 #include "core/fxcrt/fx_memory.h"
 #include "third_party/base/numerics/safe_math.h"
@@ -18,8 +18,9 @@
 CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine* pTable,
                                          uint32_t nLines,
                                          bool bHTOOB)
-    : m_bOK(true), HTOOB(bHTOOB), NTEMP(nLines) {
-  ParseFromStandardTable(pTable);
+    : HTOOB(bHTOOB), NTEMP(nLines) {
+  m_bOK = ParseFromStandardTable(pTable);
+  ASSERT(m_bOK);
 }
 
 CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream* pStream)
@@ -29,7 +30,7 @@
 
 CJBig2_HuffmanTable::~CJBig2_HuffmanTable() {}
 
-void CJBig2_HuffmanTable::ParseFromStandardTable(const JBig2TableLine* pTable) {
+bool CJBig2_HuffmanTable::ParseFromStandardTable(const JBig2TableLine* pTable) {
   CODES.resize(NTEMP);
   RANGELEN.resize(NTEMP);
   RANGELOW.resize(NTEMP);
@@ -38,7 +39,7 @@
     RANGELEN[i] = pTable[i].RANDELEN;
     RANGELOW[i] = pTable[i].RANGELOW;
   }
-  InitCodes();
+  return CJBig2_Context::HuffmanAssignCode(CODES.data(), NTEMP);
 }
 
 bool CJBig2_HuffmanTable::ParseFromCodedBuffer(CJBig2_BitStream* pStream) {
@@ -104,37 +105,7 @@
     ++NTEMP;
   }
 
-  return InitCodes();
-}
-
-bool CJBig2_HuffmanTable::InitCodes() {
-  int lenmax = 0;
-  for (uint32_t i = 0; i < NTEMP; ++i)
-    lenmax = std::max(CODES[i].codelen, lenmax);
-
-  std::vector<int> LENCOUNT(lenmax + 1);
-  std::vector<int> FIRSTCODE(lenmax + 1);
-  for (uint32_t i = 0; i < NTEMP; ++i)
-    ++LENCOUNT[CODES[i].codelen];
-
-  FIRSTCODE[0] = 0;
-  LENCOUNT[0] = 0;
-  for (int i = 1; i <= lenmax; ++i) {
-    pdfium::base::CheckedNumeric<int> shifted = FIRSTCODE[i - 1];
-    shifted += LENCOUNT[i - 1];
-    shifted <<= 1;
-    if (!shifted.IsValid())
-      return false;
-
-    FIRSTCODE[i] = shifted.ValueOrDie();
-    int CURCODE = FIRSTCODE[i];
-    for (uint32_t j = 0; j < NTEMP; ++j) {
-      if (CODES[j].codelen == i)
-        CODES[j].code = CURCODE++;
-    }
-  }
-
-  return true;
+  return CJBig2_Context::HuffmanAssignCode(CODES.data(), NTEMP);
 }
 
 void CJBig2_HuffmanTable::ExtendBuffers(bool increment) {
diff --git a/core/fxcodec/jbig2/JBig2_HuffmanTable.h b/core/fxcodec/jbig2/JBig2_HuffmanTable.h
index cdfb53f..1f4cec0 100644
--- a/core/fxcodec/jbig2/JBig2_HuffmanTable.h
+++ b/core/fxcodec/jbig2/JBig2_HuffmanTable.h
@@ -31,9 +31,8 @@
   bool IsOK() const { return m_bOK; }
 
  private:
-  void ParseFromStandardTable(const JBig2TableLine* pTable);
+  bool ParseFromStandardTable(const JBig2TableLine* pTable);
   bool ParseFromCodedBuffer(CJBig2_BitStream* pStream);
-  bool InitCodes();
   void ExtendBuffers(bool increment);
 
   bool m_bOK;