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"
CJBig2_HuffmanDecoder(CJBig2_BitStream * pStream)8 CJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream)
9 {
10     m_pStream = pStream;
11 }
~CJBig2_HuffmanDecoder()12 CJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder()
13 {
14 }
decodeAValue(CJBig2_HuffmanTable * pTable,int * nResult)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