1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/jbig2/JBig2_HuffmanDecoder.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/jbig2/JBig2_Define.h"
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream* pStream)
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_pStream(pStream) {}
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder() {}
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CJBig2_HuffmanDecoder::decodeAValue(CJBig2_HuffmanTable* pTable,
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int* nResult) {
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nVal = 0;
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nBits = 0;
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint32_t nTmp;
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pStream->read1Bit(&nTmp) == -1)
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nVal = (nVal << 1) | nTmp;
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ++nBits;
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (uint32_t i = 0; i < pTable->Size(); ++i) {
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pTable->GetPREFLEN()[i] == nBits && pTable->GetCODES()[i] == nVal) {
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pTable->IsHTOOB() && i == pTable->Size() - 1)
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return JBIG2_OOB;
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (m_pStream->readNBits(pTable->GetRANGELEN()[i], &nTmp) == -1)
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return -1;
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        uint32_t offset = pTable->IsHTOOB() ? 3 : 2;
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (i == pTable->Size() - offset)
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          *nResult = pTable->GetRANGELOW()[i] - nTmp;
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        else
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          *nResult = pTable->GetRANGELOW()[i] + nTmp;
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 0;
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return -1;
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
46