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