Stop inlining CJBig2_BitStream.
[pdfium.git] / core / src / fxcodec / jbig2 / JBig2_HuffmanTable.cpp
index 87722d2..a09d152 100644 (file)
@@ -5,9 +5,15 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include "JBig2_HuffmanTable.h"
-#include "JBig2_BitStream.h"
+
 #include <string.h>
 
+#include <vector>
+
+#include "../../../include/fxcrt/fx_memory.h"
+#include "JBig2_BitStream.h"
+#include "JBig2_Define.h"
+
 CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine* pTable,
                                          int nLines,
                                          FX_BOOL bHTOOB) {
@@ -21,18 +27,10 @@ CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream* pStream) {
 }
 
 CJBig2_HuffmanTable::~CJBig2_HuffmanTable() {
-  if (CODES) {
-    m_pModule->JBig2_Free(CODES);
-  }
-  if (PREFLEN) {
-    m_pModule->JBig2_Free(PREFLEN);
-  }
-  if (RANGELEN) {
-    m_pModule->JBig2_Free(RANGELEN);
-  }
-  if (RANGELOW) {
-    m_pModule->JBig2_Free(RANGELOW);
-  }
+  FX_Free(CODES);
+  FX_Free(PREFLEN);
+  FX_Free(RANGELEN);
+  FX_Free(RANGELOW);
 }
 void CJBig2_HuffmanTable::init() {
   HTOOB = FALSE;
@@ -45,17 +43,17 @@ void CJBig2_HuffmanTable::init() {
 int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine* pTable,
                                                 int nLines,
                                                 FX_BOOL bHTOOB) {
-  int CURLEN, LENMAX, CURCODE, CURTEMP, i;
+  int CURLEN, LENMAX, CURCODE, CURTEMP;
   int* LENCOUNT;
   int* FIRSTCODE;
   HTOOB = bHTOOB;
   NTEMP = nLines;
-  CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
-  PREFLEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
-  RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
-  RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+  CODES = FX_Alloc(int, NTEMP);
+  PREFLEN = FX_Alloc(int, NTEMP);
+  RANGELEN = FX_Alloc(int, NTEMP);
+  RANGELOW = FX_Alloc(int, NTEMP);
   LENMAX = 0;
-  for (i = 0; i < NTEMP; i++) {
+  for (int i = 0; i < NTEMP; i++) {
     PREFLEN[i] = pTable[i].PREFLEN;
     RANGELEN[i] = pTable[i].RANDELEN;
     RANGELOW[i] = pTable[i].RANGELOW;
@@ -63,10 +61,10 @@ int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine* pTable,
       LENMAX = PREFLEN[i];
     }
   }
-  LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+  LENCOUNT = FX_Alloc(int, LENMAX + 1);
   JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
-  FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
-  for (i = 0; i < NTEMP; i++) {
+  FIRSTCODE = FX_Alloc(int, LENMAX + 1);
+  for (int i = 0; i < NTEMP; i++) {
     LENCOUNT[PREFLEN[i]]++;
   }
   CURLEN = 1;
@@ -85,105 +83,90 @@ int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine* pTable,
     }
     CURLEN = CURLEN + 1;
   }
-  m_pModule->JBig2_Free(LENCOUNT);
-  m_pModule->JBig2_Free(FIRSTCODE);
+  FX_Free(LENCOUNT);
+  FX_Free(FIRSTCODE);
   return 1;
 }
 
-#define HT_CHECK_MEMORY_ADJUST                                                \
-  if (NTEMP >= nSize) {                                                       \
-    nSize += 16;                                                              \
-    PREFLEN = (int*)m_pModule->JBig2_Realloc(PREFLEN, sizeof(int) * nSize);   \
-    RANGELEN = (int*)m_pModule->JBig2_Realloc(RANGELEN, sizeof(int) * nSize); \
-    RANGELOW = (int*)m_pModule->JBig2_Realloc(RANGELOW, sizeof(int) * nSize); \
+#define HT_CHECK_MEMORY_ADJUST                   \
+  if (NTEMP >= nSize) {                          \
+    nSize += 16;                                 \
+    PREFLEN = FX_Realloc(int, PREFLEN, nSize);   \
+    RANGELEN = FX_Realloc(int, RANGELEN, nSize); \
+    RANGELOW = FX_Realloc(int, RANGELOW, nSize); \
   }
 int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream* pStream) {
-  unsigned char HTPS, HTRS;
-  FX_DWORD HTLOW, HTHIGH;
-  FX_DWORD CURRANGELOW;
-  FX_DWORD nSize = 16;
-  int CURLEN, LENMAX, CURCODE, CURTEMP;
-  int* LENCOUNT;
-  int* FIRSTCODE;
   unsigned char cTemp;
-  if (pStream->read1Byte(&cTemp) == -1) {
-    goto failed;
-  }
+  if (pStream->read1Byte(&cTemp) == -1)
+    return FALSE;
+
   HTOOB = cTemp & 0x01;
-  HTPS = ((cTemp >> 1) & 0x07) + 1;
-  HTRS = ((cTemp >> 4) & 0x07) + 1;
+  unsigned char HTPS = ((cTemp >> 1) & 0x07) + 1;
+  unsigned char HTRS = ((cTemp >> 4) & 0x07) + 1;
+  FX_DWORD HTLOW;
+  FX_DWORD HTHIGH;
   if (pStream->readInteger(&HTLOW) == -1 ||
       pStream->readInteger(&HTHIGH) == -1 || HTLOW > HTHIGH) {
-    goto failed;
+    return FALSE;
   }
-  PREFLEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
-  RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
-  RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
-  CURRANGELOW = HTLOW;
+  FX_DWORD nSize = 16;
+  PREFLEN = FX_Alloc(int, nSize);
+  RANGELEN = FX_Alloc(int, nSize);
+  RANGELOW = FX_Alloc(int, nSize);
+  FX_DWORD CURRANGELOW = HTLOW;
   NTEMP = 0;
   do {
     HT_CHECK_MEMORY_ADJUST
     if ((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) ||
         (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) {
-      goto failed;
+      return FALSE;
     }
     RANGELOW[NTEMP] = CURRANGELOW;
     CURRANGELOW = CURRANGELOW + (1 << RANGELEN[NTEMP]);
     NTEMP = NTEMP + 1;
   } while (CURRANGELOW < HTHIGH);
   HT_CHECK_MEMORY_ADJUST
-  if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
-    goto failed;
-  }
+  if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)
+    return FALSE;
+
   RANGELEN[NTEMP] = 32;
   RANGELOW[NTEMP] = HTLOW - 1;
   NTEMP = NTEMP + 1;
   HT_CHECK_MEMORY_ADJUST
-  if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
-    goto failed;
-  }
+  if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)
+    return FALSE;
+
   RANGELEN[NTEMP] = 32;
   RANGELOW[NTEMP] = HTHIGH;
   NTEMP = NTEMP + 1;
   if (HTOOB) {
     HT_CHECK_MEMORY_ADJUST
-    if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
-      goto failed;
-    }
+    if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)
+      return FALSE;
     NTEMP = NTEMP + 1;
   }
-  CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
-  LENMAX = 0;
+  CODES = FX_Alloc(int, NTEMP);
+  int LENMAX = 0;
   for (int i = 0; i < NTEMP; i++) {
     if (PREFLEN[i] > LENMAX) {
       LENMAX = PREFLEN[i];
     }
   }
-  LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
-  JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
-  FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
-  for (int i = 0; i < NTEMP; i++) {
+
+  std::vector<int> LENCOUNT(LENMAX + 1);
+  for (int i = 0; i < NTEMP; ++i)
     LENCOUNT[PREFLEN[i]]++;
-  }
-  CURLEN = 1;
-  FIRSTCODE[0] = 0;
   LENCOUNT[0] = 0;
-  while (CURLEN <= LENMAX) {
-    FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
-    CURCODE = FIRSTCODE[CURLEN];
-    CURTEMP = 0;
-    while (CURTEMP < NTEMP) {
-      if (PREFLEN[CURTEMP] == CURLEN) {
-        CODES[CURTEMP] = CURCODE;
-        CURCODE = CURCODE + 1;
-      }
-      CURTEMP = CURTEMP + 1;
+
+  std::vector<int> FIRSTCODE(LENMAX + 1);
+  FIRSTCODE[0] = 0;
+  for (int i = 0; i <= LENMAX; ++i) {
+    FIRSTCODE[i] = (FIRSTCODE[i - 1] + LENCOUNT[i - 1]) << 1;
+    int CURCODE = FIRSTCODE[i];
+    for (int j = 0; j < NTEMP; ++j) {
+      if (PREFLEN[j] == i)
+        CODES[j] = CURCODE++;
     }
-    CURLEN = CURLEN + 1;
   }
-  m_pModule->JBig2_Free(LENCOUNT);
-  m_pModule->JBig2_Free(FIRSTCODE);
   return TRUE;
-failed:
-  return FALSE;
 }