Index: core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp |
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp |
index 8aaebf46a211ec06a963eef200a15479b93dbd40..5833f118fe6c38de2d363d3e98fb9b5cc20b37c5 100644 |
--- a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp |
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp |
@@ -4,107 +4,56 @@ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
-#include "JBig2_HuffmanTable.h" |
- |
-#include <string.h> |
+#include "core/src/fxcodec/jbig2/JBig2_HuffmanTable.h" |
+#include <algorithm> |
#include <vector> |
-#include "JBig2_BitStream.h" |
-#include "JBig2_Define.h" |
#include "core/include/fxcrt/fx_memory.h" |
+#include "core/src/fxcodec/jbig2/JBig2_BitStream.h" |
+#include "core/src/fxcodec/jbig2/JBig2_Define.h" |
+#include "core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" |
CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine* pTable, |
- int nLines, |
- FX_BOOL bHTOOB) { |
- init(); |
- m_bOK = parseFromStandardTable(pTable, nLines, bHTOOB); |
+ FX_DWORD nLines, |
+ bool bHTOOB) |
+ : m_bOK(true), HTOOB(bHTOOB), NTEMP(nLines) { |
+ ParseFromStandardTable(pTable); |
} |
-CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream* pStream) { |
- init(); |
- m_bOK = parseFromCodedBuffer(pStream); |
+CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream* pStream) |
+ : HTOOB(false), NTEMP(0) { |
+ m_bOK = ParseFromCodedBuffer(pStream); |
} |
CJBig2_HuffmanTable::~CJBig2_HuffmanTable() { |
- FX_Free(CODES); |
- FX_Free(PREFLEN); |
- FX_Free(RANGELEN); |
- FX_Free(RANGELOW); |
-} |
-void CJBig2_HuffmanTable::init() { |
- HTOOB = FALSE; |
- NTEMP = 0; |
- CODES = nullptr; |
- PREFLEN = nullptr; |
- RANGELEN = nullptr; |
- RANGELOW = nullptr; |
} |
-int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine* pTable, |
- int nLines, |
- FX_BOOL bHTOOB) { |
- HTOOB = bHTOOB; |
- NTEMP = nLines; |
- CODES = FX_Alloc(int, NTEMP); |
- PREFLEN = FX_Alloc(int, NTEMP); |
- RANGELEN = FX_Alloc(int, NTEMP); |
- RANGELOW = FX_Alloc(int, NTEMP); |
- int LENMAX = 0; |
+ |
+void CJBig2_HuffmanTable::ParseFromStandardTable(const JBig2TableLine* pTable) { |
+ PREFLEN.resize(NTEMP); |
+ RANGELEN.resize(NTEMP); |
+ RANGELOW.resize(NTEMP); |
for (FX_DWORD i = 0; i < NTEMP; ++i) { |
PREFLEN[i] = pTable[i].PREFLEN; |
RANGELEN[i] = pTable[i].RANDELEN; |
RANGELOW[i] = pTable[i].RANGELOW; |
- if (PREFLEN[i] > LENMAX) { |
- LENMAX = PREFLEN[i]; |
- } |
} |
- int* LENCOUNT = FX_Alloc(int, LENMAX + 1); |
- JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1)); |
- int* FIRSTCODE = FX_Alloc(int, LENMAX + 1); |
- for (FX_DWORD i = 0; i < NTEMP; ++i) |
- ++LENCOUNT[PREFLEN[i]]; |
- |
- int CURLEN = 1; |
- FIRSTCODE[0] = 0; |
- LENCOUNT[0] = 0; |
- while (CURLEN <= LENMAX) { |
- FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1; |
- int CURCODE = FIRSTCODE[CURLEN]; |
- FX_DWORD CURTEMP = 0; |
- while (CURTEMP < NTEMP) { |
- if (PREFLEN[CURTEMP] == CURLEN) { |
- CODES[CURTEMP] = CURCODE; |
- CURCODE = CURCODE + 1; |
- } |
- CURTEMP = CURTEMP + 1; |
- } |
- CURLEN = CURLEN + 1; |
- } |
- FX_Free(LENCOUNT); |
- FX_Free(FIRSTCODE); |
- return 1; |
+ InitCodes(); |
} |
-#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) { |
+bool CJBig2_HuffmanTable::ParseFromCodedBuffer(CJBig2_BitStream* pStream) { |
unsigned char cTemp; |
if (pStream->read1Byte(&cTemp) == -1) |
- return FALSE; |
+ return false; |
- HTOOB = cTemp & 0x01; |
+ HTOOB = !!(cTemp & 0x01); |
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) { |
- return FALSE; |
+ return false; |
} |
const int low = static_cast<int>(HTLOW); |
@@ -112,56 +61,57 @@ int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream* pStream) { |
if (low > high) |
return false; |
- FX_DWORD nSize = 16; |
- PREFLEN = FX_Alloc(int, nSize); |
- RANGELEN = FX_Alloc(int, nSize); |
- RANGELOW = FX_Alloc(int, nSize); |
+ ExtendBuffers(false); |
int cur_low = low; |
- NTEMP = 0; |
do { |
- HT_CHECK_MEMORY_ADJUST |
if ((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) || |
(pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) { |
- return FALSE; |
+ return false; |
} |
RANGELOW[NTEMP] = cur_low; |
cur_low += (1 << RANGELEN[NTEMP]); |
- NTEMP = NTEMP + 1; |
+ ExtendBuffers(true); |
} while (cur_low < high); |
- HT_CHECK_MEMORY_ADJUST |
+ |
if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) |
- return FALSE; |
+ return false; |
RANGELEN[NTEMP] = 32; |
RANGELOW[NTEMP] = low - 1; |
- ++NTEMP; |
- HT_CHECK_MEMORY_ADJUST |
+ ExtendBuffers(true); |
+ |
if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) |
- return FALSE; |
+ return false; |
RANGELEN[NTEMP] = 32; |
RANGELOW[NTEMP] = high; |
- NTEMP = NTEMP + 1; |
+ ExtendBuffers(true); |
+ |
if (HTOOB) { |
- HT_CHECK_MEMORY_ADJUST |
if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) |
- return FALSE; |
+ return false; |
++NTEMP; |
} |
- CODES = FX_Alloc(int, NTEMP); |
- int LENMAX = 0; |
- for (FX_DWORD i = 0; i < NTEMP; ++i) |
- LENMAX = std::max(PREFLEN[i], LENMAX); |
- std::vector<int> LENCOUNT(LENMAX + 1); |
+ InitCodes(); |
+ return true; |
+} |
+ |
+void CJBig2_HuffmanTable::InitCodes() { |
+ int lenmax = 0; |
for (FX_DWORD i = 0; i < NTEMP; ++i) |
- LENCOUNT[PREFLEN[i]]++; |
- LENCOUNT[0] = 0; |
+ lenmax = std::max(PREFLEN[i], lenmax); |
+ |
+ CODES.resize(NTEMP); |
+ std::vector<int> LENCOUNT(lenmax + 1); |
+ std::vector<int> FIRSTCODE(lenmax + 1); |
+ for (int len : PREFLEN) |
+ ++LENCOUNT[len]; |
- std::vector<int> FIRSTCODE(LENMAX + 1); |
FIRSTCODE[0] = 0; |
- for (int i = 1; i <= LENMAX; ++i) { |
+ LENCOUNT[0] = 0; |
+ for (int i = 1; i <= lenmax; ++i) { |
FIRSTCODE[i] = (FIRSTCODE[i - 1] + LENCOUNT[i - 1]) << 1; |
int CURCODE = FIRSTCODE[i]; |
for (FX_DWORD j = 0; j < NTEMP; ++j) { |
@@ -169,5 +119,19 @@ int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream* pStream) { |
CODES[j] = CURCODE++; |
} |
} |
- return TRUE; |
+} |
+ |
+void CJBig2_HuffmanTable::ExtendBuffers(bool increment) { |
+ if (increment) |
+ ++NTEMP; |
+ |
+ size_t size = PREFLEN.size(); |
+ if (NTEMP < size) |
+ return; |
+ |
+ size += 16; |
+ ASSERT(NTEMP < size); |
+ PREFLEN.resize(size); |
+ RANGELEN.resize(size); |
+ RANGELOW.resize(size); |
} |