From 5110c4743751145c4ae1934cd1d83bc6c55bb43f Mon Sep 17 00:00:00 2001 From: John Abd-El-Malek Date: Sat, 17 May 2014 22:33:34 -0700 Subject: Initial commit. --- core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp | 55 +++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp (limited to 'core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp') diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp new file mode 100644 index 0000000000..8199fe7c21 --- /dev/null +++ b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp @@ -0,0 +1,55 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "JBig2_HuffmanDecoder.h" +CJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream) +{ + m_pStream = pStream; +} +CJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder() +{ +} +int CJBig2_HuffmanDecoder::decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult) +{ + int nVal, nTmp, i, nBits; + nVal = 0; + nBits = 0; + while(1) { + if(m_pStream->read1Bit(&nTmp) == -1) { + return -1; + } + nVal = (nVal << 1) | nTmp; + nBits ++; + for(i = 0; i < pTable->NTEMP; i++) { + if((pTable->PREFLEN[i] == nBits) && (pTable->CODES[i] == nVal)) { + if((pTable->HTOOB == 1) && (i == pTable->NTEMP - 1)) { + return JBIG2_OOB; + } + if(m_pStream->readNBits(pTable->RANGELEN[i], &nTmp) == -1) { + return -1; + } + if(pTable->HTOOB) { + if(i == pTable->NTEMP - 3) { + *nResult = pTable->RANGELOW[i] - nTmp; + return 0; + } else { + *nResult = pTable->RANGELOW[i] + nTmp; + return 0; + } + } else { + if(i == pTable->NTEMP - 2) { + *nResult = pTable->RANGELOW[i] - nTmp; + return 0; + } else { + *nResult = pTable->RANGELOW[i] + nTmp; + return 0; + } + } + } + } + } + return -2; +} -- cgit v1.2.3