1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include "JBig2_HuffmanDecoder.h" 8 CJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream) 9 { 10 m_pStream = pStream; 11 } 12 CJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder() 13 { 14 } 15 int CJBig2_HuffmanDecoder::decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult) 16 { 17 int nVal, nTmp, i, nBits; 18 nVal = 0; 19 nBits = 0; 20 while(1) { 21 if(m_pStream->read1Bit(&nTmp) == -1) { 22 return -1; 23 } 24 nVal = (nVal << 1) | nTmp; 25 nBits ++; 26 for(i = 0; i < pTable->NTEMP; i++) { 27 if((pTable->PREFLEN[i] == nBits) && (pTable->CODES[i] == nVal)) { 28 if((pTable->HTOOB == 1) && (i == pTable->NTEMP - 1)) { 29 return JBIG2_OOB; 30 } 31 if(m_pStream->readNBits(pTable->RANGELEN[i], &nTmp) == -1) { 32 return -1; 33 } 34 if(pTable->HTOOB) { 35 if(i == pTable->NTEMP - 3) { 36 *nResult = pTable->RANGELOW[i] - nTmp; 37 return 0; 38 } else { 39 *nResult = pTable->RANGELOW[i] + nTmp; 40 return 0; 41 } 42 } else { 43 if(i == pTable->NTEMP - 2) { 44 *nResult = pTable->RANGELOW[i] - nTmp; 45 return 0; 46 } else { 47 *nResult = pTable->RANGELOW[i] + nTmp; 48 return 0; 49 } 50 } 51 } 52 } 53 } 54 return -2; 55 } 56