blob: 3f43c979a5196875b44d7f82bfeea534ea05c05e [file] [log] [blame]
// 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_GENERAL_DECODER_H_
#define _JBIG2_GENERAL_DECODER_H_
#include "../../../include/fxcodec/fx_codec_def.h"
#include "../../../include/fxcrt/fx_basic.h"
#include "JBig2_Define.h"
#include "JBig2_SymbolDict.h"
#include "JBig2_ArithDecoder.h"
#include "JBig2_ArithIntDecoder.h"
#include "../../../include/fxcrt/fx_coordinates.h"
class CJBig2_HuffmanTable;
class CJBig2_Image;
class CJBig2_PatternDict;
typedef enum {
JBIG2_CORNER_BOTTOMLEFT = 0,
JBIG2_CORNER_TOPLEFT = 1,
JBIG2_CORNER_BOTTOMRIGHT = 2,
JBIG2_CORNER_TOPRIGHT = 3
} JBig2Corner;
class CJBig2_GRDProc : public CJBig2_Object
{
public:
CJBig2_GRDProc()
{
m_loopIndex = 0;
m_pLine = NULL;
m_pPause = NULL;
m_DecodeType = 0;
LTP = 0;
m_ReplaceRect.left = 0;
m_ReplaceRect.bottom = 0;
m_ReplaceRect.top = 0;
m_ReplaceRect.right = 0;
}
CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream);
FXCODEC_STATUS Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
FXCODEC_STATUS Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
FXCODEC_STATUS Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
FXCODEC_STATUS Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause = NULL);
FXCODEC_STATUS Continue_decode(IFX_Pause* pPause);
FX_RECT GetReplaceRect()
{
return m_ReplaceRect;
};
private:
FXCODEC_STATUS decode_Arith(IFX_Pause* pPause);
FXCODEC_STATUS decode_Arith_V2(IFX_Pause* pPause);
FXCODEC_STATUS decode_Arith_V1(IFX_Pause* pPause);
FXCODEC_STATUS decode_MMR();
FXCODEC_STATUS decode_Arith_Template0_opt3(CJBig2_Image*pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
FXCODEC_STATUS decode_Arith_Template0_unopt(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
FXCODEC_STATUS decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
FXCODEC_STATUS decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
FXCODEC_STATUS decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
FXCODEC_STATUS decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
FXCODEC_STATUS decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
FXCODEC_STATUS decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
FX_DWORD m_loopIndex;
FX_BYTE * m_pLine;
IFX_Pause* m_pPause;
FXCODEC_STATUS m_ProssiveStatus;
CJBig2_Image** m_pImage;
CJBig2_ArithDecoder *m_pArithDecoder;
JBig2ArithCtx *m_gbContext;
FX_WORD m_DecodeType;
FX_BOOL LTP;
FX_RECT m_ReplaceRect;
private:
CJBig2_Image *decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
CJBig2_Image *decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
public:
FX_BOOL MMR;
FX_DWORD GBW;
FX_DWORD GBH;
FX_BYTE GBTEMPLATE;
FX_BOOL TPGDON;
FX_BOOL USESKIP;
CJBig2_Image * SKIP;
signed char GBAT[8];
};
class CJBig2_GRRDProc : public CJBig2_Object
{
public:
CJBig2_Image *decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
CJBig2_Image *decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
CJBig2_Image *decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
CJBig2_Image *decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
CJBig2_Image *decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
CJBig2_Image *decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
public:
FX_DWORD GRW;
FX_DWORD GRH;
FX_BOOL GRTEMPLATE;
CJBig2_Image *GRREFERENCE;
FX_INT32 GRREFERENCEDX;
FX_INT32 GRREFERENCEDY;
FX_BOOL TPGRON;
signed char GRAT[4];
};
typedef struct {
CJBig2_ArithIntDecoder *IADT,
*IAFS,
*IADS,
*IAIT,
*IARI,
*IARDW,
*IARDH,
*IARDX,
*IARDY;
CJBig2_ArithIaidDecoder *IAID;
} JBig2IntDecoderState;
class CJBig2_TRDProc : public CJBig2_Object
{
public:
CJBig2_Image *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext);
CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,
JBig2IntDecoderState *pIDS = NULL);
public:
FX_BOOL SBHUFF;
FX_BOOL SBREFINE;
FX_DWORD SBW;
FX_DWORD SBH;
FX_DWORD SBNUMINSTANCES;
FX_DWORD SBSTRIPS;
FX_DWORD SBNUMSYMS;
JBig2HuffmanCode *SBSYMCODES;
FX_BYTE SBSYMCODELEN;
CJBig2_Image **SBSYMS;
FX_BOOL SBDEFPIXEL;
JBig2ComposeOp SBCOMBOP;
FX_BOOL TRANSPOSED;
JBig2Corner REFCORNER;
signed char SBDSOFFSET;
CJBig2_HuffmanTable *SBHUFFFS,
*SBHUFFDS,
*SBHUFFDT,
*SBHUFFRDW,
*SBHUFFRDH,
*SBHUFFRDX,
*SBHUFFRDY,
*SBHUFFRSIZE;
FX_BOOL SBRTEMPLATE;
signed char SBRAT[4];
};
class CJBig2_SDDProc : public CJBig2_Object
{
public:
CJBig2_SymbolDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext);
CJBig2_SymbolDict *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause);
public:
FX_BOOL SDHUFF;
FX_BOOL SDREFAGG;
FX_DWORD SDNUMINSYMS;
CJBig2_Image ** SDINSYMS;
FX_DWORD SDNUMNEWSYMS;
FX_DWORD SDNUMEXSYMS;
CJBig2_HuffmanTable *SDHUFFDH,
*SDHUFFDW,
*SDHUFFBMSIZE,
*SDHUFFAGGINST;
FX_BYTE SDTEMPLATE;
signed char SDAT[8];
FX_BOOL SDRTEMPLATE;
signed char SDRAT[4];
};
class CJBig2_HTRDProc : public CJBig2_Object
{
public:
CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
public:
FX_DWORD HBW,
HBH;
FX_BOOL HMMR;
FX_BYTE HTEMPLATE;
FX_DWORD HNUMPATS;
CJBig2_Image **HPATS;
FX_BOOL HDEFPIXEL;
JBig2ComposeOp HCOMBOP;
FX_BOOL HENABLESKIP;
FX_DWORD HGW,
HGH;
FX_INT32 HGX,
HGY;
FX_WORD HRX,
HRY;
FX_BYTE HPW,
HPH;
};
class CJBig2_PDDProc : public CJBig2_Object
{
public:
CJBig2_PatternDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
CJBig2_PatternDict *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
public:
FX_BOOL HDMMR;
FX_BYTE HDPW,
HDPH;
FX_DWORD GRAYMAX;
FX_BYTE HDTEMPLATE;
};
class CJBig2_GSIDProc : public CJBig2_Object
{
public:
FX_DWORD *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
FX_DWORD *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
public:
FX_BOOL GSMMR;
FX_BOOL GSUSESKIP;
FX_BYTE GSBPP;
FX_DWORD GSW,
GSH;
FX_BYTE GSTEMPLATE;
CJBig2_Image *GSKIP;
};
#endif