summaryrefslogtreecommitdiff
path: root/core/src/fxcodec/jbig2/JBig2_Context.h
blob: 61379fe2ff5176c81afc0b3dfaded5d4f0e16c82 (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
// 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/fpdfapi/fpdf_objects.h"
#include "../../../include/fxcodec/fx_codec_def.h"
#include "JBig2_List.h"
#include "JBig2_Page.h"
#include "JBig2_Segment.h"

class CJBig2_ArithDecoder;
class CJBig2_GRDProc;
class IFX_Pause;

// Cache is keyed by the ObjNum of a stream and an index within the stream.
using CJBig2_CacheKey = std::pair<FX_DWORD, FX_DWORD>;
// NB: CJBig2_SymbolDict* is owned.
using CJBig2_CachePair = std::pair<CJBig2_CacheKey, 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_MIN_SEGMENT_SIZE 11

class CJBig2_Context {
 public:
  static CJBig2_Context* CreateContext(
      CPDF_StreamAcc* pGlobalStream,
      CPDF_StreamAcc* pSrcStream,
      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 Continue(IFX_Pause* pPause);
  FXCODEC_STATUS GetProcessingStatus() { return m_ProcessingStatus; }

 private:
  CJBig2_Context(CPDF_StreamAcc* pGlobalStream,
                 CPDF_StreamAcc* pSrcStream,
                 std::list<CJBig2_CachePair>* pSymbolDictCache,
                 IFX_Pause* pPause,
                 bool bIsGlobal);

  ~CJBig2_Context();

  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;
  nonstd::unique_ptr<CJBig2_BitStream> m_pStream;
  CJBig2_List<CJBig2_Segment> m_SegmentList;
  CJBig2_List<JBig2PageInfo> m_PageInfoList;
  nonstd::unique_ptr<CJBig2_Image> m_pPage;
  size_t m_nSegmentDecoded;
  bool m_bInPage;
  bool m_bBufSpecified;
  int32_t m_PauseStep;
  IFX_Pause* m_pPause;
  FXCODEC_STATUS m_ProcessingStatus;
  nonstd::unique_ptr<CJBig2_ArithDecoder> m_pArithDecoder;
  nonstd::unique_ptr<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>* const m_pSymbolDictCache;
  bool m_bIsGlobal;
};

#endif  // CORE_SRC_FXCODEC_JBIG2_JBIG2_CONTEXT_H_