// 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;
}
