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