Index: core/src/fxcodec/codec/fx_codec_jbig.cpp |
diff --git a/core/src/fxcodec/codec/fx_codec_jbig.cpp b/core/src/fxcodec/codec/fx_codec_jbig.cpp |
index 18a665784a7382cc3d70c8ce9b6ec36376ad44f5..1524b68df06c2cae1d7d6959184b3359e6df3eee 100644 |
--- a/core/src/fxcodec/codec/fx_codec_jbig.cpp |
+++ b/core/src/fxcodec/codec/fx_codec_jbig.cpp |
@@ -7,14 +7,41 @@ |
#include "../../../include/fxcodec/fx_codec.h" |
#include "codec_int.h" |
+// Holds per-document JBig2 related data. |
+class JBig2DocumentContext : public CFX_DestructObject { |
+ public: |
+ std::list<CJBig2_CachePair>* GetSymbolDictCache() { |
+ return &m_SymbolDictCache; |
+ } |
+ |
+ ~JBig2DocumentContext() { |
+ for (auto it : m_SymbolDictCache) { |
+ delete it.second; |
+ } |
+ } |
+ |
+ private: |
+ std::list<CJBig2_CachePair> m_SymbolDictCache; |
+}; |
+ |
+JBig2DocumentContext* GetJBig2DocumentContext(CCodec_Jbig2Module* pModule, |
+ CFX_PrivateData* pPrivateData) { |
+ void* pModulePrivateData = pPrivateData->GetPrivateData(pModule); |
+ if (pModulePrivateData) { |
+ CFX_DestructObject* pDestructObject = |
+ reinterpret_cast<CFX_DestructObject*>(pModulePrivateData); |
+ return static_cast<JBig2DocumentContext*>(pDestructObject); |
+ } |
+ JBig2DocumentContext* pJBig2DocumentContext = new JBig2DocumentContext(); |
+ pPrivateData->SetPrivateObj(pModule, pJBig2DocumentContext); |
+ return pJBig2DocumentContext; |
+} |
+ |
CCodec_Jbig2Context::CCodec_Jbig2Context() { |
FXSYS_memset(this, 0, sizeof(CCodec_Jbig2Context)); |
} |
CCodec_Jbig2Module::~CCodec_Jbig2Module() { |
- for (auto it : m_SymbolDictCache) { |
- delete it.second; |
- } |
} |
void* CCodec_Jbig2Module::CreateJbig2Context() { |
@@ -29,31 +56,31 @@ void CCodec_Jbig2Module::DestroyJbig2Context(void* pJbig2Content) { |
pJbig2Content = NULL; |
} |
FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, |
+ CFX_PrivateData* pPrivateData, |
FX_DWORD width, |
FX_DWORD height, |
- const uint8_t* src_buf, |
- FX_DWORD src_size, |
- const uint8_t* global_data, |
- FX_DWORD global_size, |
+ CPDF_StreamAcc* src_stream, |
+ CPDF_StreamAcc* global_stream, |
uint8_t* dest_buf, |
FX_DWORD dest_pitch, |
IFX_Pause* pPause) { |
if (!pJbig2Context) { |
return FXCODEC_STATUS_ERR_PARAMS; |
} |
+ JBig2DocumentContext* pJBig2DocumentContext = |
+ GetJBig2DocumentContext(this, pPrivateData); |
CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context; |
m_pJbig2Context->m_width = width; |
m_pJbig2Context->m_height = height; |
- m_pJbig2Context->m_src_buf = (unsigned char*)src_buf; |
- m_pJbig2Context->m_src_size = src_size; |
- m_pJbig2Context->m_global_data = global_data; |
- m_pJbig2Context->m_global_size = global_size; |
+ m_pJbig2Context->m_pSrcStream = src_stream; |
+ m_pJbig2Context->m_pGlobalStream = global_stream; |
m_pJbig2Context->m_dest_buf = dest_buf; |
m_pJbig2Context->m_dest_pitch = dest_pitch; |
m_pJbig2Context->m_pPause = pPause; |
FXSYS_memset(dest_buf, 0, height * dest_pitch); |
m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext( |
- global_data, global_size, src_buf, src_size, &m_SymbolDictCache, pPause); |
+ global_stream, src_stream, pJBig2DocumentContext->GetSymbolDictCache(), |
+ pPause); |
if (!m_pJbig2Context->m_pContext) { |
return FXCODEC_STATUS_ERROR; |
} |