summaryrefslogtreecommitdiff
path: root/core/src/fxcodec/jbig2/JBig2_Context.h
blob: 48bc794205b1bd4a36b9b073acc00b9469bb082b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// 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 CORE_SRC_FXCODEC_JBIG2_JBIG2_CONTEXT_H_
#define CORE_SRC_FXCODEC_JBIG2_JBIG2_CONTEXT_H_

#include <list>
#include <utility>

#include "../../../../third_party/base/nonstd_unique_ptr.h"
#include "../../../include/fxcodec/fx_codec_def.h"
#include "JBig2_List.h"
#include "JBig2_Page.h"
#include "JBig2_Segment.h"

class CJBig2_GRDProc;
class IFX_Pause;

using CJBig2_CachePair = std::pair<const uint8_t*, CJBig2_SymbolDict*>;

#define JBIG2_SUCCESS 0
#define JBIG2_FAILED -1
#define JBIG2_ERROR_TOO_SHORT -2
#define JBIG2_ERROR_FATAL -3
#define JBIG2_END_OF_PAGE 2
#define JBIG2_END_OF_FILE 3
#define JBIG2_ERROR_FILE_FORMAT -4
#define JBIG2_ERROR_STREAM_TYPE -5
#define JBIG2_ERROR_LIMIT -6
#define JBIG2_FILE_STREAM 0
#define JBIG2_SQUENTIAL_STREAM 1
#define JBIG2_RANDOM_STREAM 2
#define JBIG2_EMBED_STREAM 3
#define JBIG2_MIN_SEGMENT_SIZE 11

class CJBig2_Context {
 public:
  static CJBig2_Context* CreateContext(
      const uint8_t* pGlobalData,
      FX_DWORD dwGlobalLength,
      const uint8_t* pData,
      FX_DWORD dwLength,
      int32_t nStreamType,
      std::list<CJBig2_CachePair>* pSymbolDictCache,
      IFX_Pause* pPause = NULL);

  static void DestroyContext(CJBig2_Context* pContext);

  int32_t getFirstPage(uint8_t* pBuf,
                       int32_t width,
                       int32_t height,
                       int32_t stride,
                       IFX_Pause* pPause);

  int32_t getFirstPage(CJBig2_Image** image, IFX_Pause* pPause);

  int32_t Continue(IFX_Pause* pPause);
  FXCODEC_STATUS GetProcessingStatus() { return m_ProcessingStatus; }

 private:
  enum JBig2State {
    JBIG2_OUT_OF_PAGE = 0,
    JBIG2_IN_PAGE,
  };

  CJBig2_Context(const uint8_t* pGlobalData,
                 FX_DWORD dwGlobalLength,
                 const uint8_t* pData,
                 FX_DWORD dwLength,
                 int32_t nStreamType,
                 std::list<CJBig2_CachePair>* pSymbolDictCache,
                 IFX_Pause* pPause);

  ~CJBig2_Context();

  int32_t decodeFile(IFX_Pause* pPause);

  int32_t decode_SquentialOrgnazation(IFX_Pause* pPause);

  int32_t decode_EmbedOrgnazation(IFX_Pause* pPause);

  int32_t decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause);

  int32_t decode_RandomOrgnazation(IFX_Pause* pPause);

  CJBig2_Segment* findSegmentByNumber(FX_DWORD dwNumber);

  CJBig2_Segment* findReferredSegmentByTypeAndIndex(CJBig2_Segment* pSegment,
                                                    uint8_t cType,
                                                    int32_t nIndex);

  int32_t parseSegmentHeader(CJBig2_Segment* pSegment);

  int32_t parseSegmentData(CJBig2_Segment* pSegment, IFX_Pause* pPause);
  int32_t ProcessingParseSegmentData(CJBig2_Segment* pSegment,
                                     IFX_Pause* pPause);

  int32_t parseSymbolDict(CJBig2_Segment* pSegment, IFX_Pause* pPause);

  int32_t parseTextRegion(CJBig2_Segment* pSegment);

  int32_t parsePatternDict(CJBig2_Segment* pSegment, IFX_Pause* pPause);

  int32_t parseHalftoneRegion(CJBig2_Segment* pSegment, IFX_Pause* pPause);

  int32_t parseGenericRegion(CJBig2_Segment* pSegment, IFX_Pause* pPause);

  int32_t parseGenericRefinementRegion(CJBig2_Segment* pSegment);

  int32_t parseTable(CJBig2_Segment* pSegment);

  int32_t parseRegionInfo(JBig2RegionInfo* pRI);

  JBig2HuffmanCode* decodeSymbolIDHuffmanTable(CJBig2_BitStream* pStream,
                                               FX_DWORD SBNUMSYMS);

  void huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP);

  void huffman_assign_code(JBig2HuffmanCode* SBSYMCODES, int NTEMP);

 private:
  CJBig2_Context* m_pGlobalContext;
  int32_t m_nStreamType;
  CJBig2_BitStream* m_pStream;
  int32_t m_nState;
  CJBig2_List<CJBig2_Segment> m_SegmentList;
  CJBig2_List<JBig2PageInfo> m_PageInfoList;
  CJBig2_Image* m_pPage;
  FX_BOOL m_bBufSpecified;
  size_t m_nSegmentDecoded;
  IFX_Pause* m_pPause;
  int32_t m_PauseStep;
  FXCODEC_STATUS m_ProcessingStatus;
  FX_BOOL m_bFirstPage;
  CJBig2_ArithDecoder* m_pArithDecoder;
  CJBig2_GRDProc* m_pGRD;
  JBig2ArithCtx* m_gbContext;
  nonstd::unique_ptr<CJBig2_Segment> m_pSegment;
  FX_DWORD m_dwOffset;
  JBig2RegionInfo m_ri;
  std::list<CJBig2_CachePair>* m_pSymbolDictCache;
};

#endif  // CORE_SRC_FXCODEC_JBIG2_JBIG2_CONTEXT_H_