Home | History | Annotate | Download | only in jbig2
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #ifndef _JBIG2_CONTEXT_H_
      8 #define _JBIG2_CONTEXT_H_
      9 #include "JBig2_Module.h"
     10 #include "JBig2_List.h"
     11 #include "JBig2_Segment.h"
     12 #include "JBig2_Page.h"
     13 #include "JBig2_GeneralDecoder.h"
     14 #include "../../../include/fxcodec/fx_codec_def.h"
     15 #include "../../../include/fxcrt/fx_basic.h"
     16 typedef enum {
     17     JBIG2_OUT_OF_PAGE = 0,
     18     JBIG2_IN_PAGE,
     19 } JBig2State;
     20 #define JBIG2_SUCCESS			 0
     21 #define JBIG2_FAILED			-1
     22 #define JBIG2_ERROR_TOO_SHORT	-2
     23 #define JBIG2_ERROR_FETAL		-3
     24 #define JBIG2_END_OF_PAGE		 2
     25 #define JBIG2_END_OF_FILE		 3
     26 #define JBIG2_ERROR_FILE_FORMAT -4
     27 #define JBIG2_ERROR_STREAM_TYPE -5
     28 #define JBIG2_ERROR_LIMIT		-6
     29 #define JBIG2_FILE_STREAM			0
     30 #define JBIG2_SQUENTIAL_STREAM		1
     31 #define JBIG2_RANDOM_STREAM			2
     32 #define JBIG2_EMBED_STREAM			3
     33 #define JBIG2_MIN_SEGMENT_SIZE					11
     34 class CJBig2_Context : public CJBig2_Object
     35 {
     36 public:
     37 
     38     static CJBig2_Context *CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
     39                                          FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause = NULL);
     40 
     41     static void DestroyContext(CJBig2_Context *pContext);
     42 
     43     FX_INT32 getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);
     44 
     45     FX_INT32 getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);
     46 
     47     FX_INT32 getFirstPage(CJBig2_Image **image, IFX_Pause* pPause);
     48 
     49     FX_INT32 getNextPage(CJBig2_Image **image, IFX_Pause* pPause);
     50     FX_INT32 Continue(IFX_Pause* pPause);
     51     FXCODEC_STATUS GetProcessiveStatus()
     52     {
     53         return m_ProcessiveStatus;
     54     };
     55 private:
     56 
     57     CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
     58                    FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause);
     59 
     60     ~CJBig2_Context();
     61 
     62     FX_INT32 decodeFile(IFX_Pause* pPause);
     63 
     64     FX_INT32 decode_SquentialOrgnazation(IFX_Pause* pPause);
     65 
     66     FX_INT32 decode_EmbedOrgnazation(IFX_Pause* pPause);
     67 
     68     FX_INT32 decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause);
     69 
     70     FX_INT32 decode_RandomOrgnazation(IFX_Pause* pPause);
     71 
     72     CJBig2_Segment *findSegmentByNumber(FX_DWORD dwNumber);
     73 
     74     CJBig2_Segment *findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment, FX_BYTE cType, FX_INT32 nIndex);
     75 
     76     FX_INT32 parseSegmentHeader(CJBig2_Segment *pSegment);
     77 
     78     FX_INT32 parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);
     79     FX_INT32 ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);
     80 
     81     FX_INT32 parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);
     82 
     83     FX_INT32 parseTextRegion(CJBig2_Segment *pSegment);
     84 
     85     FX_INT32 parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);
     86 
     87     FX_INT32 parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);
     88 
     89     FX_INT32 parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);
     90 
     91     FX_INT32 parseGenericRefinementRegion(CJBig2_Segment *pSegment);
     92 
     93     FX_INT32 parseTable(CJBig2_Segment *pSegment);
     94 
     95     FX_INT32 parseRegionInfo(JBig2RegionInfo *pRI);
     96 
     97 
     98 
     99     JBig2HuffmanCode *decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream, FX_DWORD SBNUMSYMS);
    100 
    101     void huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP);
    102 
    103     void huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP);
    104 
    105 private:
    106 
    107     CJBig2_Context *m_pGlobalContext;
    108 
    109     FX_INT32 m_nStreamType;
    110 
    111     CJBig2_BitStream *m_pStream;
    112 
    113     FX_INT32 m_nState;
    114 
    115     CJBig2_List<CJBig2_Segment> *m_pSegmentList;
    116 
    117     CJBig2_List<JBig2PageInfo> *m_pPageInfoList;
    118 
    119     CJBig2_Image *m_pPage;
    120 
    121     FX_BOOL m_bBufSpecified;
    122 
    123     FX_INT32 m_nSegmentDecoded;
    124     IFX_Pause*	m_pPause;
    125     FX_INT32	m_PauseStep;
    126     FXCODEC_STATUS m_ProcessiveStatus;
    127     FX_BOOL	m_bFirstPage;
    128     CJBig2_ArithDecoder *m_pArithDecoder;
    129     CJBig2_GRDProc *m_pGRD;
    130     JBig2ArithCtx *m_gbContext;
    131     CJBig2_Segment *m_pSegment;
    132     FX_DWORD m_dwOffset;
    133     JBig2RegionInfo m_ri;
    134 };
    135 #endif
    136