diff options
author | Lei Zhang <thestig@chromium.org> | 2015-12-18 17:01:09 -0800 |
---|---|---|
committer | Lei Zhang <thestig@chromium.org> | 2015-12-18 17:01:09 -0800 |
commit | aedd4555ec1a80121f176586cb72180337e4ccd8 (patch) | |
tree | 75a23e3962e47e0eb1cdf0472bd69729bf406029 /core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp | |
parent | 4b84705b63eacb0140186983d55113f48d093f16 (diff) | |
download | pdfium-aedd4555ec1a80121f176586cb72180337e4ccd8.tar.xz |
Merge to XFA: Cleanup CJBig2_HuffmanTable and friends.
TBR=tsepez@chromium.org
Review URL: https://codereview.chromium.org/1536923002 .
(cherry picked from commit 9c061e2dfb22a0e321728b73c8650eded8828d90)
Review URL: https://codereview.chromium.org/1539023002 .
Diffstat (limited to 'core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp')
-rw-r--r-- | core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp | 162 |
1 files changed, 63 insertions, 99 deletions
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp index 8aaebf46a2..5833f118fe 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); } |