Home | History | Annotate | Download | only in jbig2
      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"
      8 CJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream)
      9 {
     10     m_pStream = pStream;
     11 }
     12 CJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder()
     13 {
     14 }
     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