// 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

#ifndef _JBIG2_ARITHMETIC_DECODER_H_
#define _JBIG2_ARITHMETIC_DECODER_H_
#include "JBig2_Define.h"
#include "JBig2_BitStream.h"
#include "JBig2_ArithQe.h"
typedef struct {
    unsigned int MPS;
    unsigned int I;
} JBig2ArithCtx;
class CJBig2_ArithDecoder : public CJBig2_Object
{
public:

    CJBig2_ArithDecoder(CJBig2_BitStream *pStream);

    ~CJBig2_ArithDecoder();

    int DECODE(JBig2ArithCtx *pCX);
private:

    void INITDEC();

    void BYTEIN();
    unsigned char B;
    unsigned int C;
    unsigned int A;
    unsigned int CT;
    CJBig2_BitStream *m_pStream;
};
inline CJBig2_ArithDecoder::CJBig2_ArithDecoder(CJBig2_BitStream *pStream)
{
    m_pStream = pStream;
    INITDEC();
}
inline CJBig2_ArithDecoder::~CJBig2_ArithDecoder()
{
}
inline void CJBig2_ArithDecoder::INITDEC()
{
    B = m_pStream->getCurByte_arith();
    C = (B ^ 0xff) << 16;;
    BYTEIN();
    C = C << 7;
    CT = CT - 7;
    A = 0x8000;
}
inline void CJBig2_ArithDecoder::BYTEIN()
{
    unsigned char B1;
    if(B == 0xff) {
        B1 = m_pStream->getNextByte_arith();
        if(B1 > 0x8f) {
            CT = 8;
        } else {
            m_pStream->incByteIdx();
            B = B1;
            C = C + 0xfe00 - (B << 9);
            CT = 7;
        }
    } else {
        m_pStream->incByteIdx();
        B = m_pStream->getCurByte_arith();
        C = C + 0xff00 - (B << 8);
        CT = 8;
    }
}
inline int CJBig2_ArithDecoder::DECODE(JBig2ArithCtx *pCX)
{
    int D;
    const JBig2ArithQe * qe = &QeTable[pCX->I];
    A = A - qe->Qe;
    if((C >> 16) < A) {
        if(A & 0x8000) {
            D = pCX->MPS;
        } else {
            if(A < qe->Qe) {
                D = 1 - pCX->MPS;
                if(qe->nSwitch == 1) {
                    pCX->MPS = 1 - pCX->MPS;
                }
                pCX->I = qe->NLPS;
            } else {
                D = pCX->MPS;
                pCX->I = qe->NMPS;
            }
            do {
                if (CT == 0) {
                    BYTEIN();
                }
                A <<= 1;
                C <<= 1;
                CT--;
            } while ((A & 0x8000) == 0);
        }
    } else {
        C -= A << 16;
        if(A < qe->Qe) {
            A = qe->Qe;
            D = pCX->MPS;
            pCX->I = qe->NMPS;
        } else {
            A = qe->Qe;
            D = 1 - pCX->MPS;
            if(qe->nSwitch == 1) {
                pCX->MPS = 1 - pCX->MPS;
            }
            pCX->I = qe->NLPS;
        }
        do {
            if (CT == 0) {
                BYTEIN();
            }
            A <<= 1;
            C <<= 1;
            CT--;
        } while ((A & 0x8000) == 0);
    }
    return D;
}
#endif
