// 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_ArithIntDecoder.h"
CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder() {
  IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);
  JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
}
CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder() {
  m_pModule->JBig2_Free(IAx);
}
int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder* pArithDecoder,
                                   int* nResult) {
  int PREV, V;
  int S, D;
  int nNeedBits, nTemp, i;
  PREV = 1;
  S = pArithDecoder->DECODE(IAx + PREV);
  PREV = (PREV << 1) | S;
  D = pArithDecoder->DECODE(IAx + PREV);
  PREV = (PREV << 1) | D;
  if (D) {
    D = pArithDecoder->DECODE(IAx + PREV);
    PREV = (PREV << 1) | D;
    if (D) {
      D = pArithDecoder->DECODE(IAx + PREV);
      PREV = (PREV << 1) | D;
      if (D) {
        D = pArithDecoder->DECODE(IAx + PREV);
        PREV = (PREV << 1) | D;
        if (D) {
          D = pArithDecoder->DECODE(IAx + PREV);
          PREV = (PREV << 1) | D;
          if (D) {
            nNeedBits = 32;
            V = 4436;
          } else {
            nNeedBits = 12;
            V = 340;
          }
        } else {
          nNeedBits = 8;
          V = 84;
        }
      } else {
        nNeedBits = 6;
        V = 20;
      }
    } else {
      nNeedBits = 4;
      V = 4;
    }
  } else {
    nNeedBits = 2;
    V = 0;
  }
  nTemp = 0;
  for (i = 0; i < nNeedBits; i++) {
    D = pArithDecoder->DECODE(IAx + PREV);
    if (PREV < 256) {
      PREV = (PREV << 1) | D;
    } else {
      PREV = (((PREV << 1) | D) & 511) | 256;
    }
    nTemp = (nTemp << 1) | D;
  }
  V += nTemp;
  if (S == 1 && V > 0) {
    V = -V;
  }
  *nResult = V;
  if (S == 1 && V == 0) {
    return JBIG2_OOB;
  }
  return 0;
}
CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA) {
  SBSYMCODELEN = SBSYMCODELENA;
  IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx),
                                                  (1 << SBSYMCODELEN));
  JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));
}
CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder() {
  m_pModule->JBig2_Free(IAID);
}
int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder* pArithDecoder,
                                    int* nResult) {
  int PREV;
  int D;
  int i;
  PREV = 1;
  for (i = 0; i < SBSYMCODELEN; i++) {
    D = pArithDecoder->DECODE(IAID + PREV);
    PREV = (PREV << 1) | D;
  }
  PREV = PREV - (1 << SBSYMCODELEN);
  *nResult = PREV;
  return 0;
}
