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