// 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_SEGMENT_H_
#define _JBIG2_SEGMENT_H_
#include "JBig2_Define.h"
#include "JBig2_SymbolDict.h"
#include "JBig2_PatternDict.h"
#include "JBig2_Module.h"
#include "JBig2_HuffmanTable.h"
#define JBIG2_GET_INT32(buf) (((buf)[0]<<24) | ((buf)[1]<<16) | ((buf)[2]<<8) | (buf)[3])
#define JBIG2_GET_INT16(buf) (((buf)[0]<<8) | (buf)[1])
typedef enum {
    JBIG2_SEGMENT_HEADER_UNPARSED,
    JBIG2_SEGMENT_DATA_UNPARSED,
    JBIG2_SEGMENT_PARSE_COMPLETE,
    JBIG2_SEGMENT_PAUSED,
    JBIG2_SEGMENT_ERROR
} JBig2_SegmentState;
typedef enum {
    JBIG2_VOID_POINTER	= 0,
    JBIG2_IMAGE_POINTER,
    JBIG2_SYMBOL_DICT_POINTER,
    JBIG2_PATTERN_DICT_POINTER,
    JBIG2_HUFFMAN_TABLE_POINTER
} JBig2_ResultType;
class CJBig2_Segment : public CJBig2_Object
{
public:

    CJBig2_Segment();

    ~CJBig2_Segment();

    void init();

    void clean();
public:
    FX_DWORD m_dwNumber;
    union {
        struct {
            uint8_t type					:	6;
            uint8_t page_association_size	:	1;
            uint8_t deferred_non_retain		:	1;
        } s;
        uint8_t c;
    } m_cFlags;
    int32_t m_nReferred_to_segment_count;
    FX_DWORD * m_pReferred_to_segment_numbers;
    FX_DWORD m_dwPage_association;
    FX_DWORD m_dwData_length;

    FX_DWORD m_dwHeader_Length;
    uint8_t  *m_pData;
    JBig2_SegmentState m_State;
    JBig2_ResultType m_nResultType;
    union {
        CJBig2_SymbolDict	*sd;
        CJBig2_PatternDict	*pd;
        CJBig2_Image		*im;
        CJBig2_HuffmanTable	*ht;
        void*			 vd;
    } m_Result;
};
#endif
