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