diff options
Diffstat (limited to 'core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp')
-rw-r--r-- | core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp | 386 |
1 files changed, 193 insertions, 193 deletions
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp index af4a54988d..0a5bc8e645 100644 --- a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp +++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp @@ -1,193 +1,193 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_HuffmanTable.h"
-#include "JBig2_BitStream.h"
-#include <string.h>
-
-CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines,
- FX_BOOL bHTOOB)
-{
- init();
- m_bOK = parseFromStandardTable(pTable, nLines, bHTOOB);
-}
-
-CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream *pStream)
-{
- init();
- m_bOK = parseFromCodedBuffer(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);
- }
-}
-void CJBig2_HuffmanTable::init()
-{
- HTOOB = FALSE;
- NTEMP = 0;
- CODES = NULL;
- PREFLEN = NULL;
- RANGELEN = NULL;
- RANGELOW = NULL;
-}
-int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB)
-{
- int CURLEN, LENMAX, CURCODE, CURTEMP, i;
- 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);
- LENMAX = 0;
- for(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];
- }
- }
- 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(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;
- }
- CURLEN = CURLEN + 1;
- }
- m_pModule->JBig2_Free(LENCOUNT);
- m_pModule->JBig2_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); \
- }
-int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream *pStream)
-{
- unsigned char HTPS, HTRS;
- int HTLOW, HTHIGH;
- int CURRANGELOW;
- int nSize = 16;
- int CURLEN, LENMAX, CURCODE, CURTEMP, i;
- int *LENCOUNT;
- int *FIRSTCODE;
- unsigned char cTemp;
- if(pStream->read1Byte(&cTemp) == -1) {
- goto failed;
- }
- HTOOB = cTemp & 0x01;
- HTPS = ((cTemp >> 1) & 0x07) + 1;
- HTRS = ((cTemp >> 4) & 0x07) + 1;
- if(pStream->readInteger((FX_DWORD*)&HTLOW) == -1 ||
- pStream->readInteger((FX_DWORD*)&HTHIGH) == -1) {
- goto failed;
- }
- 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;
- NTEMP = 0;
- do {
- HT_CHECK_MEMORY_ADJUST
- if((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)
- || (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) {
- goto failed;
- }
- 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;
- }
- RANGELEN[NTEMP] = 32;
- RANGELOW[NTEMP] = HTLOW - 1;
- NTEMP = NTEMP + 1;
- HT_CHECK_MEMORY_ADJUST
- if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
- goto failed;
- }
- RANGELEN[NTEMP] = 32;
- RANGELOW[NTEMP] = HTHIGH;
- NTEMP = NTEMP + 1;
- if(HTOOB) {
- HT_CHECK_MEMORY_ADJUST
- if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
- goto failed;
- }
- NTEMP = NTEMP + 1;
- }
- CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
- LENMAX = 0;
- for(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(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;
- }
- CURLEN = CURLEN + 1;
- }
- m_pModule->JBig2_Free(LENCOUNT);
- m_pModule->JBig2_Free(FIRSTCODE);
- return TRUE;
-failed:
- return FALSE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "JBig2_HuffmanTable.h" +#include "JBig2_BitStream.h" +#include <string.h> + +CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines, + FX_BOOL bHTOOB) +{ + init(); + m_bOK = parseFromStandardTable(pTable, nLines, bHTOOB); +} + +CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream *pStream) +{ + init(); + m_bOK = parseFromCodedBuffer(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); + } +} +void CJBig2_HuffmanTable::init() +{ + HTOOB = FALSE; + NTEMP = 0; + CODES = NULL; + PREFLEN = NULL; + RANGELEN = NULL; + RANGELOW = NULL; +} +int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB) +{ + int CURLEN, LENMAX, CURCODE, CURTEMP, i; + 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); + LENMAX = 0; + for(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]; + } + } + 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(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; + } + CURLEN = CURLEN + 1; + } + m_pModule->JBig2_Free(LENCOUNT); + m_pModule->JBig2_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); \ + } +int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream *pStream) +{ + unsigned char HTPS, HTRS; + int HTLOW, HTHIGH; + int CURRANGELOW; + int nSize = 16; + int CURLEN, LENMAX, CURCODE, CURTEMP, i; + int *LENCOUNT; + int *FIRSTCODE; + unsigned char cTemp; + if(pStream->read1Byte(&cTemp) == -1) { + goto failed; + } + HTOOB = cTemp & 0x01; + HTPS = ((cTemp >> 1) & 0x07) + 1; + HTRS = ((cTemp >> 4) & 0x07) + 1; + if(pStream->readInteger((FX_DWORD*)&HTLOW) == -1 || + pStream->readInteger((FX_DWORD*)&HTHIGH) == -1) { + goto failed; + } + 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; + NTEMP = 0; + do { + HT_CHECK_MEMORY_ADJUST + if((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) + || (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) { + goto failed; + } + 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; + } + RANGELEN[NTEMP] = 32; + RANGELOW[NTEMP] = HTLOW - 1; + NTEMP = NTEMP + 1; + HT_CHECK_MEMORY_ADJUST + if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) { + goto failed; + } + RANGELEN[NTEMP] = 32; + RANGELOW[NTEMP] = HTHIGH; + NTEMP = NTEMP + 1; + if(HTOOB) { + HT_CHECK_MEMORY_ADJUST + if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) { + goto failed; + } + NTEMP = NTEMP + 1; + } + CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP); + LENMAX = 0; + for(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(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; + } + CURLEN = CURLEN + 1; + } + m_pModule->JBig2_Free(LENCOUNT); + m_pModule->JBig2_Free(FIRSTCODE); + return TRUE; +failed: + return FALSE; +} |