1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <list>
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <memory>
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <utility>
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_object.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/fx_codec_def.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/jbig2/JBig2_Page.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/jbig2/JBig2_Segment.h"
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_safe_types.h"
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CJBig2_ArithDecoder;
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CJBig2_GRDProc;
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_StreamAcc;
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass IFX_PauseIndicator;
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Cache is keyed by the ObjNum of a stream and an index within the stream.
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannusing CJBig2_CacheKey = std::pair<uint32_t, uint32_t>;
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannusing CJBig2_CachePair =
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::pair<CJBig2_CacheKey, std::unique_ptr<CJBig2_SymbolDict>>;
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_SUCCESS 0
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_FAILED -1
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_ERROR_TOO_SHORT -2
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_ERROR_FATAL -3
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_END_OF_PAGE 2
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_END_OF_FILE 3
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_ERROR_LIMIT -6
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_MIN_SEGMENT_SIZE 11
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CJBig2_Context {
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public:
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CJBig2_Context(const RetainPtr<CPDF_StreamAcc>& pGlobalStream,
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 const RetainPtr<CPDF_StreamAcc>& pSrcStream,
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 std::list<CJBig2_CachePair>* pSymbolDictCache,
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 bool bIsGlobal);
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CJBig2_Context();
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t getFirstPage(uint8_t* pBuf,
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       int32_t width,
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       int32_t height,
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       int32_t stride,
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                       IFX_PauseIndicator* pPause);
53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t Continue(IFX_PauseIndicator* pPause);
55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FXCODEC_STATUS GetProcessingStatus() const { return m_ProcessingStatus; }
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann private:
58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t decodeSequential(IFX_PauseIndicator* pPause);
59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t decodeRandomFirstPage(IFX_PauseIndicator* pPause);
60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t decodeRandom(IFX_PauseIndicator* pPause);
61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CJBig2_Segment* findSegmentByNumber(uint32_t dwNumber);
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CJBig2_Segment* findReferredSegmentByTypeAndIndex(CJBig2_Segment* pSegment,
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                    uint8_t cType,
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                    int32_t nIndex);
66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t parseSegmentHeader(CJBig2_Segment* pSegment);
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t parseSegmentData(CJBig2_Segment* pSegment,
69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           IFX_PauseIndicator* pPause);
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t ProcessingParseSegmentData(CJBig2_Segment* pSegment,
71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     IFX_PauseIndicator* pPause);
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t parseSymbolDict(CJBig2_Segment* pSegment);
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t parseTextRegion(CJBig2_Segment* pSegment);
74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t parsePatternDict(CJBig2_Segment* pSegment,
75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           IFX_PauseIndicator* pPause);
76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t parseHalftoneRegion(CJBig2_Segment* pSegment,
77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              IFX_PauseIndicator* pPause);
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t parseGenericRegion(CJBig2_Segment* pSegment,
79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                             IFX_PauseIndicator* pPause);
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t parseGenericRefinementRegion(CJBig2_Segment* pSegment);
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t parseTable(CJBig2_Segment* pSegment);
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t parseRegionInfo(JBig2RegionInfo* pRI);
83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<JBig2HuffmanCode> decodeSymbolIDHuffmanTable(
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CJBig2_BitStream* pStream,
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      uint32_t SBNUMSYMS);
87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  void huffman_assign_code(JBig2HuffmanCode* SBSYMCODES, int NTEMP);
89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CJBig2_Context> m_pGlobalContext;
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::unique_ptr<CJBig2_BitStream> m_pStream;
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<std::unique_ptr<CJBig2_Segment>> m_SegmentList;
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<std::unique_ptr<JBig2PageInfo>> m_PageInfoList;
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::unique_ptr<CJBig2_Image> m_pPage;
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  size_t m_nSegmentDecoded;
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bool m_bInPage;
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bool m_bBufSpecified;
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t m_PauseStep;
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXCODEC_STATUS m_ProcessingStatus;
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<JBig2ArithCtx> m_gbContext;
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::unique_ptr<CJBig2_ArithDecoder> m_pArithDecoder;
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::unique_ptr<CJBig2_GRDProc> m_pGRD;
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::unique_ptr<CJBig2_Segment> m_pSegment;
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FX_SAFE_UINT32 m_dwOffset;
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  JBig2RegionInfo m_ri;
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::list<CJBig2_CachePair>* const m_pSymbolDictCache;
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bool m_bIsGlobal;
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_
111