Index: core/src/fxcodec/jbig2/JBig2_Context.cpp |
diff --git a/core/src/fxcodec/jbig2/JBig2_Context.cpp b/core/src/fxcodec/jbig2/JBig2_Context.cpp |
index 68c973547cd54c24b117f76b546410c75c51ccda..4a08c21949c5f2a81ee0beacb860e212d54e312c 100644 |
--- a/core/src/fxcodec/jbig2/JBig2_Context.cpp |
+++ b/core/src/fxcodec/jbig2/JBig2_Context.cpp |
@@ -1,7 +1,7 @@ |
// 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 |
#include <map> |
@@ -17,1753 +17,1880 @@ |
// difference for typical JBIG2 documents. |
const int kSymbolDictCacheMaxSize = 2; |
-void OutputBitmap(CJBig2_Image* pImage) |
-{ |
- if(!pImage) { |
- return; |
- } |
-} |
-CJBig2_Context *CJBig2_Context::CreateContext(CJBig2_Module *pModule, uint8_t *pGlobalData, FX_DWORD dwGlobalLength, |
- uint8_t *pData, FX_DWORD dwLength, int32_t nStreamType, std::list<CJBig2_CachePair>* pSymbolDictCache, IFX_Pause* pPause) |
-{ |
- return new(pModule)CJBig2_Context(pGlobalData, dwGlobalLength, pData, dwLength, nStreamType, pSymbolDictCache, pPause); |
+void OutputBitmap(CJBig2_Image* pImage) { |
+ if (!pImage) { |
+ return; |
+ } |
} |
-void CJBig2_Context::DestroyContext(CJBig2_Context *pContext) |
-{ |
- delete pContext; |
+CJBig2_Context* CJBig2_Context::CreateContext( |
+ CJBig2_Module* pModule, |
+ uint8_t* pGlobalData, |
+ FX_DWORD dwGlobalLength, |
+ uint8_t* pData, |
+ FX_DWORD dwLength, |
+ int32_t nStreamType, |
+ std::list<CJBig2_CachePair>* pSymbolDictCache, |
+ IFX_Pause* pPause) { |
+ return new (pModule) |
+ CJBig2_Context(pGlobalData, dwGlobalLength, pData, dwLength, nStreamType, |
+ pSymbolDictCache, pPause); |
} |
-CJBig2_Context::CJBig2_Context(uint8_t *pGlobalData, FX_DWORD dwGlobalLength, |
- uint8_t *pData, FX_DWORD dwLength, int32_t nStreamType, std::list<CJBig2_CachePair>* pSymbolDictCache, IFX_Pause* pPause) |
-{ |
- if(pGlobalData && (dwGlobalLength > 0)) { |
- JBIG2_ALLOC(m_pGlobalContext, CJBig2_Context(NULL, 0, pGlobalData, dwGlobalLength, |
- JBIG2_EMBED_STREAM, pSymbolDictCache, pPause)); |
- } else { |
- m_pGlobalContext = NULL; |
- } |
- JBIG2_ALLOC(m_pStream, CJBig2_BitStream(pData, dwLength)); |
- m_nStreamType = nStreamType; |
- m_nState = JBIG2_OUT_OF_PAGE; |
- JBIG2_ALLOC(m_pSegmentList, CJBig2_List<CJBig2_Segment>); |
- JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(1)); |
- m_pPage = NULL; |
- m_bBufSpecified = FALSE; |
- m_pPause = pPause; |
- m_nSegmentDecoded = 0; |
- m_PauseStep = 10; |
- m_pArithDecoder = NULL; |
- m_pGRD = NULL; |
- m_gbContext = NULL; |
- m_pSegment = NULL; |
- m_dwOffset = 0; |
- m_ProcessiveStatus = FXCODEC_STATUS_FRAME_READY; |
- m_pSymbolDictCache = pSymbolDictCache; |
+void CJBig2_Context::DestroyContext(CJBig2_Context* pContext) { |
+ delete pContext; |
} |
-CJBig2_Context::~CJBig2_Context() |
-{ |
- delete m_pArithDecoder; |
- m_pArithDecoder = NULL; |
- delete m_pGRD; |
- m_pGRD = NULL; |
- if(m_gbContext) { |
- m_pModule->JBig2_Free(m_gbContext); |
- } |
- m_gbContext = NULL; |
- delete m_pGlobalContext; |
+CJBig2_Context::CJBig2_Context(uint8_t* pGlobalData, |
+ FX_DWORD dwGlobalLength, |
+ uint8_t* pData, |
+ FX_DWORD dwLength, |
+ int32_t nStreamType, |
+ std::list<CJBig2_CachePair>* pSymbolDictCache, |
+ IFX_Pause* pPause) { |
+ if (pGlobalData && (dwGlobalLength > 0)) { |
+ JBIG2_ALLOC(m_pGlobalContext, |
+ CJBig2_Context(NULL, 0, pGlobalData, dwGlobalLength, |
+ JBIG2_EMBED_STREAM, pSymbolDictCache, pPause)); |
+ } else { |
m_pGlobalContext = NULL; |
- delete m_pPageInfoList; |
- m_pPageInfoList = NULL; |
- if(m_bBufSpecified) { |
- delete m_pPage; |
- } |
- m_pPage = NULL; |
- delete m_pStream; |
- m_pStream = NULL; |
- delete m_pSegmentList; |
- m_pSegmentList = NULL; |
+ } |
+ JBIG2_ALLOC(m_pStream, CJBig2_BitStream(pData, dwLength)); |
+ m_nStreamType = nStreamType; |
+ m_nState = JBIG2_OUT_OF_PAGE; |
+ JBIG2_ALLOC(m_pSegmentList, CJBig2_List<CJBig2_Segment>); |
+ JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(1)); |
+ m_pPage = NULL; |
+ m_bBufSpecified = FALSE; |
+ m_pPause = pPause; |
+ m_nSegmentDecoded = 0; |
+ m_PauseStep = 10; |
+ m_pArithDecoder = NULL; |
+ m_pGRD = NULL; |
+ m_gbContext = NULL; |
+ m_pSegment = NULL; |
+ m_dwOffset = 0; |
+ m_ProcessiveStatus = FXCODEC_STATUS_FRAME_READY; |
+ m_pSymbolDictCache = pSymbolDictCache; |
} |
-int32_t CJBig2_Context::decodeFile(IFX_Pause* pPause) |
-{ |
- uint8_t cFlags; |
- FX_DWORD dwTemp; |
- const uint8_t fileID[] = {0x97, 0x4A, 0x42, 0x32, 0x0D, 0x0A, 0x1A, 0x0A}; |
- int32_t nRet; |
- if(m_pStream->getByteLeft() < 8) { |
- m_pModule->JBig2_Error("file header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- if(JBIG2_memcmp(m_pStream->getPointer(), fileID, 8) != 0) { |
- m_pModule->JBig2_Error("not jbig2 file"); |
- nRet = JBIG2_ERROR_FILE_FORMAT; |
- goto failed; |
- } |
- m_pStream->offset(8); |
- if(m_pStream->read1Byte(&cFlags) != 0) { |
- m_pModule->JBig2_Error("file header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- if(!(cFlags & 0x02)) { |
- if(m_pStream->readInteger(&dwTemp) != 0) { |
- m_pModule->JBig2_Error("file header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- if(dwTemp > 0) { |
- delete m_pPageInfoList; |
- JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(dwTemp)); |
- } |
- } |
- if(cFlags & 0x01) { |
- m_nStreamType = JBIG2_SQUENTIAL_STREAM; |
- return decode_SquentialOrgnazation(pPause); |
- } else { |
- m_nStreamType = JBIG2_RANDOM_STREAM; |
- return decode_RandomOrgnazation_FirstPage(pPause); |
- } |
+CJBig2_Context::~CJBig2_Context() { |
+ delete m_pArithDecoder; |
+ m_pArithDecoder = NULL; |
+ delete m_pGRD; |
+ m_pGRD = NULL; |
+ if (m_gbContext) { |
+ m_pModule->JBig2_Free(m_gbContext); |
+ } |
+ m_gbContext = NULL; |
+ delete m_pGlobalContext; |
+ m_pGlobalContext = NULL; |
+ delete m_pPageInfoList; |
+ m_pPageInfoList = NULL; |
+ if (m_bBufSpecified) { |
+ delete m_pPage; |
+ } |
+ m_pPage = NULL; |
+ delete m_pStream; |
+ m_pStream = NULL; |
+ delete m_pSegmentList; |
+ m_pSegmentList = NULL; |
+} |
+int32_t CJBig2_Context::decodeFile(IFX_Pause* pPause) { |
+ uint8_t cFlags; |
+ FX_DWORD dwTemp; |
+ const uint8_t fileID[] = {0x97, 0x4A, 0x42, 0x32, 0x0D, 0x0A, 0x1A, 0x0A}; |
+ int32_t nRet; |
+ if (m_pStream->getByteLeft() < 8) { |
+ m_pModule->JBig2_Error("file header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ if (JBIG2_memcmp(m_pStream->getPointer(), fileID, 8) != 0) { |
+ m_pModule->JBig2_Error("not jbig2 file"); |
+ nRet = JBIG2_ERROR_FILE_FORMAT; |
+ goto failed; |
+ } |
+ m_pStream->offset(8); |
+ if (m_pStream->read1Byte(&cFlags) != 0) { |
+ m_pModule->JBig2_Error("file header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ if (!(cFlags & 0x02)) { |
+ if (m_pStream->readInteger(&dwTemp) != 0) { |
+ m_pModule->JBig2_Error("file header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ if (dwTemp > 0) { |
+ delete m_pPageInfoList; |
+ JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(dwTemp)); |
+ } |
+ } |
+ if (cFlags & 0x01) { |
+ m_nStreamType = JBIG2_SQUENTIAL_STREAM; |
+ return decode_SquentialOrgnazation(pPause); |
+ } else { |
+ m_nStreamType = JBIG2_RANDOM_STREAM; |
+ return decode_RandomOrgnazation_FirstPage(pPause); |
+ } |
failed: |
- return nRet; |
+ return nRet; |
} |
-int32_t CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause) |
-{ |
- int32_t nRet; |
- if(m_pStream->getByteLeft() > 0) { |
- while(m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) { |
- if(m_pSegment == NULL) { |
- JBIG2_ALLOC(m_pSegment, CJBig2_Segment()); |
- nRet = parseSegmentHeader(m_pSegment); |
- if(nRet != JBIG2_SUCCESS) { |
- delete m_pSegment; |
- m_pSegment = NULL; |
- return nRet; |
- } |
- m_dwOffset = m_pStream->getOffset(); |
- } |
- nRet = parseSegmentData(m_pSegment, pPause); |
- if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- m_PauseStep = 2; |
- return JBIG2_SUCCESS; |
- } |
- if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) { |
- delete m_pSegment; |
- m_pSegment = NULL; |
- break; |
- } else if(nRet != JBIG2_SUCCESS) { |
- delete m_pSegment; |
- m_pSegment = NULL; |
- return nRet; |
- } |
- m_pSegmentList->addItem(m_pSegment); |
- if(m_pSegment->m_dwData_length != 0xffffffff) { |
- m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length; |
- m_pStream->setOffset(m_dwOffset); |
- } else { |
- m_pStream->offset(4); |
- } |
- OutputBitmap(m_pPage); |
- m_pSegment = NULL; |
- if(m_pStream->getByteLeft() > 0 && m_pPage && pPause && pPause->NeedToPauseNow()) { |
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- m_PauseStep = 2; |
- return JBIG2_SUCCESS; |
- } |
- } |
- } else { |
- return JBIG2_END_OF_FILE; |
+int32_t CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause) { |
+ int32_t nRet; |
+ if (m_pStream->getByteLeft() > 0) { |
+ while (m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) { |
+ if (m_pSegment == NULL) { |
+ JBIG2_ALLOC(m_pSegment, CJBig2_Segment()); |
+ nRet = parseSegmentHeader(m_pSegment); |
+ if (nRet != JBIG2_SUCCESS) { |
+ delete m_pSegment; |
+ m_pSegment = NULL; |
+ return nRet; |
+ } |
+ m_dwOffset = m_pStream->getOffset(); |
+ } |
+ nRet = parseSegmentData(m_pSegment, pPause); |
+ if (m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ m_PauseStep = 2; |
+ return JBIG2_SUCCESS; |
+ } |
+ if ((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) { |
+ delete m_pSegment; |
+ m_pSegment = NULL; |
+ break; |
+ } else if (nRet != JBIG2_SUCCESS) { |
+ delete m_pSegment; |
+ m_pSegment = NULL; |
+ return nRet; |
+ } |
+ m_pSegmentList->addItem(m_pSegment); |
+ if (m_pSegment->m_dwData_length != 0xffffffff) { |
+ m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length; |
+ m_pStream->setOffset(m_dwOffset); |
+ } else { |
+ m_pStream->offset(4); |
+ } |
+ OutputBitmap(m_pPage); |
+ m_pSegment = NULL; |
+ if (m_pStream->getByteLeft() > 0 && m_pPage && pPause && |
+ pPause->NeedToPauseNow()) { |
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ m_PauseStep = 2; |
+ return JBIG2_SUCCESS; |
+ } |
} |
- return JBIG2_SUCCESS; |
+ } else { |
+ return JBIG2_END_OF_FILE; |
+ } |
+ return JBIG2_SUCCESS; |
} |
-int32_t CJBig2_Context::decode_EmbedOrgnazation(IFX_Pause* pPause) |
-{ |
- return decode_SquentialOrgnazation(pPause); |
+int32_t CJBig2_Context::decode_EmbedOrgnazation(IFX_Pause* pPause) { |
+ return decode_SquentialOrgnazation(pPause); |
} |
-int32_t CJBig2_Context::decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause) |
-{ |
- CJBig2_Segment *pSegment; |
- int32_t nRet; |
- while(m_pStream->getByteLeft() > JBIG2_MIN_SEGMENT_SIZE) { |
- JBIG2_ALLOC(pSegment, CJBig2_Segment()); |
- nRet = parseSegmentHeader(pSegment); |
- if(nRet != JBIG2_SUCCESS) { |
- delete pSegment; |
- return nRet; |
- } else if(pSegment->m_cFlags.s.type == 51) { |
- delete pSegment; |
- break; |
- } |
- m_pSegmentList->addItem(pSegment); |
- if(pPause && m_pPause && pPause->NeedToPauseNow()) { |
- m_PauseStep = 3; |
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return JBIG2_SUCCESS; |
- } |
- } |
- m_nSegmentDecoded = 0; |
- return decode_RandomOrgnazation(pPause); |
+int32_t CJBig2_Context::decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause) { |
+ CJBig2_Segment* pSegment; |
+ int32_t nRet; |
+ while (m_pStream->getByteLeft() > JBIG2_MIN_SEGMENT_SIZE) { |
+ JBIG2_ALLOC(pSegment, CJBig2_Segment()); |
+ nRet = parseSegmentHeader(pSegment); |
+ if (nRet != JBIG2_SUCCESS) { |
+ delete pSegment; |
+ return nRet; |
+ } else if (pSegment->m_cFlags.s.type == 51) { |
+ delete pSegment; |
+ break; |
+ } |
+ m_pSegmentList->addItem(pSegment); |
+ if (pPause && m_pPause && pPause->NeedToPauseNow()) { |
+ m_PauseStep = 3; |
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return JBIG2_SUCCESS; |
+ } |
+ } |
+ m_nSegmentDecoded = 0; |
+ return decode_RandomOrgnazation(pPause); |
} |
-int32_t CJBig2_Context::decode_RandomOrgnazation(IFX_Pause* pPause) |
-{ |
- int32_t nRet; |
- for(; m_nSegmentDecoded < m_pSegmentList->getLength(); m_nSegmentDecoded++) { |
- nRet = parseSegmentData(m_pSegmentList->getAt(m_nSegmentDecoded), pPause); |
- if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) { |
- break; |
- } else if(nRet != JBIG2_SUCCESS) { |
- return nRet; |
- } |
- if(m_pPage && pPause && pPause->NeedToPauseNow()) { |
- m_PauseStep = 4; |
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return JBIG2_SUCCESS; |
- } |
- } |
- return JBIG2_SUCCESS; |
+int32_t CJBig2_Context::decode_RandomOrgnazation(IFX_Pause* pPause) { |
+ int32_t nRet; |
+ for (; m_nSegmentDecoded < m_pSegmentList->getLength(); m_nSegmentDecoded++) { |
+ nRet = parseSegmentData(m_pSegmentList->getAt(m_nSegmentDecoded), pPause); |
+ if ((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) { |
+ break; |
+ } else if (nRet != JBIG2_SUCCESS) { |
+ return nRet; |
+ } |
+ if (m_pPage && pPause && pPause->NeedToPauseNow()) { |
+ m_PauseStep = 4; |
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return JBIG2_SUCCESS; |
+ } |
+ } |
+ return JBIG2_SUCCESS; |
} |
-int32_t CJBig2_Context::getFirstPage(uint8_t *pBuf, int32_t width, int32_t height, int32_t stride, IFX_Pause* pPause) |
-{ |
- int32_t nRet = 0; |
- if(m_pGlobalContext) { |
- nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause); |
- if(nRet != JBIG2_SUCCESS) { |
- m_ProcessiveStatus = FXCODEC_STATUS_ERROR; |
- return nRet; |
- } |
- } |
- m_bFirstPage = TRUE; |
- m_PauseStep = 0; |
- delete m_pPage; |
- JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf)); |
- m_bBufSpecified = TRUE; |
- if(m_pPage && pPause && pPause->NeedToPauseNow()) { |
- m_PauseStep = 1; |
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return nRet; |
- } |
- int ret = Continue(pPause); |
- return ret; |
+int32_t CJBig2_Context::getFirstPage(uint8_t* pBuf, |
+ int32_t width, |
+ int32_t height, |
+ int32_t stride, |
+ IFX_Pause* pPause) { |
+ int32_t nRet = 0; |
+ if (m_pGlobalContext) { |
+ nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause); |
+ if (nRet != JBIG2_SUCCESS) { |
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR; |
+ return nRet; |
+ } |
+ } |
+ m_bFirstPage = TRUE; |
+ m_PauseStep = 0; |
+ delete m_pPage; |
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf)); |
+ m_bBufSpecified = TRUE; |
+ if (m_pPage && pPause && pPause->NeedToPauseNow()) { |
+ m_PauseStep = 1; |
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return nRet; |
+ } |
+ int ret = Continue(pPause); |
+ return ret; |
} |
-int32_t CJBig2_Context::Continue(IFX_Pause* pPause) |
-{ |
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_READY; |
- int32_t nRet; |
- if(m_PauseStep <= 1) { |
- switch(m_nStreamType) { |
- case JBIG2_FILE_STREAM: |
- nRet = decodeFile(pPause); |
- break; |
- case JBIG2_SQUENTIAL_STREAM: |
- nRet = decode_SquentialOrgnazation(pPause); |
- break; |
- case JBIG2_RANDOM_STREAM: |
- if(m_bFirstPage) { |
- nRet = decode_RandomOrgnazation_FirstPage(pPause); |
- } else { |
- nRet = decode_RandomOrgnazation(pPause); |
- } |
- break; |
- case JBIG2_EMBED_STREAM: |
- nRet = decode_EmbedOrgnazation(pPause); |
- break; |
- default: |
- m_ProcessiveStatus = FXCODEC_STATUS_ERROR; |
- return JBIG2_ERROR_STREAM_TYPE; |
- } |
- } else if(m_PauseStep == 2) { |
+int32_t CJBig2_Context::Continue(IFX_Pause* pPause) { |
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_READY; |
+ int32_t nRet; |
+ if (m_PauseStep <= 1) { |
+ switch (m_nStreamType) { |
+ case JBIG2_FILE_STREAM: |
+ nRet = decodeFile(pPause); |
+ break; |
+ case JBIG2_SQUENTIAL_STREAM: |
nRet = decode_SquentialOrgnazation(pPause); |
- } else if(m_PauseStep == 3) { |
- nRet = decode_RandomOrgnazation_FirstPage(pPause); |
- } else if(m_PauseStep == 4) { |
- nRet = decode_RandomOrgnazation(pPause); |
- } else if(m_PauseStep == 5) { |
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return JBIG2_SUCCESS; |
- } |
- if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- return nRet; |
- } |
- m_PauseStep = 5; |
- if(!m_bBufSpecified && nRet == JBIG2_SUCCESS) { |
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return JBIG2_SUCCESS; |
- } |
- if(nRet == JBIG2_SUCCESS) { |
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- } else { |
+ break; |
+ case JBIG2_RANDOM_STREAM: |
+ if (m_bFirstPage) { |
+ nRet = decode_RandomOrgnazation_FirstPage(pPause); |
+ } else { |
+ nRet = decode_RandomOrgnazation(pPause); |
+ } |
+ break; |
+ case JBIG2_EMBED_STREAM: |
+ nRet = decode_EmbedOrgnazation(pPause); |
+ break; |
+ default: |
m_ProcessiveStatus = FXCODEC_STATUS_ERROR; |
- } |
+ return JBIG2_ERROR_STREAM_TYPE; |
+ } |
+ } else if (m_PauseStep == 2) { |
+ nRet = decode_SquentialOrgnazation(pPause); |
+ } else if (m_PauseStep == 3) { |
+ nRet = decode_RandomOrgnazation_FirstPage(pPause); |
+ } else if (m_PauseStep == 4) { |
+ nRet = decode_RandomOrgnazation(pPause); |
+ } else if (m_PauseStep == 5) { |
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return JBIG2_SUCCESS; |
+ } |
+ if (m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
return nRet; |
+ } |
+ m_PauseStep = 5; |
+ if (!m_bBufSpecified && nRet == JBIG2_SUCCESS) { |
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return JBIG2_SUCCESS; |
+ } |
+ if (nRet == JBIG2_SUCCESS) { |
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ } else { |
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR; |
+ } |
+ return nRet; |
} |
-int32_t CJBig2_Context::getNextPage(uint8_t *pBuf, int32_t width, int32_t height, int32_t stride, IFX_Pause* pPause) |
-{ |
- int32_t nRet = JBIG2_ERROR_STREAM_TYPE; |
- m_bFirstPage = FALSE; |
- m_PauseStep = 0; |
- delete m_pPage; |
- JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf)); |
- m_bBufSpecified = TRUE; |
- if(m_pPage && pPause && pPause->NeedToPauseNow()) { |
- m_PauseStep = 1; |
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return nRet; |
- } |
- return Continue(pPause); |
- switch(m_nStreamType) { |
- case JBIG2_FILE_STREAM: |
- nRet = decodeFile(pPause); |
- break; |
- case JBIG2_SQUENTIAL_STREAM: |
- nRet = decode_SquentialOrgnazation(pPause); |
- break; |
- case JBIG2_RANDOM_STREAM: |
- nRet = decode_RandomOrgnazation(pPause); |
- break; |
- case JBIG2_EMBED_STREAM: |
- nRet = decode_EmbedOrgnazation(pPause); |
- break; |
- default: |
- return JBIG2_ERROR_STREAM_TYPE; |
- } |
+int32_t CJBig2_Context::getNextPage(uint8_t* pBuf, |
+ int32_t width, |
+ int32_t height, |
+ int32_t stride, |
+ IFX_Pause* pPause) { |
+ int32_t nRet = JBIG2_ERROR_STREAM_TYPE; |
+ m_bFirstPage = FALSE; |
+ m_PauseStep = 0; |
+ delete m_pPage; |
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf)); |
+ m_bBufSpecified = TRUE; |
+ if (m_pPage && pPause && pPause->NeedToPauseNow()) { |
+ m_PauseStep = 1; |
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
return nRet; |
+ } |
+ return Continue(pPause); |
+ switch (m_nStreamType) { |
+ case JBIG2_FILE_STREAM: |
+ nRet = decodeFile(pPause); |
+ break; |
+ case JBIG2_SQUENTIAL_STREAM: |
+ nRet = decode_SquentialOrgnazation(pPause); |
+ break; |
+ case JBIG2_RANDOM_STREAM: |
+ nRet = decode_RandomOrgnazation(pPause); |
+ break; |
+ case JBIG2_EMBED_STREAM: |
+ nRet = decode_EmbedOrgnazation(pPause); |
+ break; |
+ default: |
+ return JBIG2_ERROR_STREAM_TYPE; |
+ } |
+ return nRet; |
} |
-int32_t CJBig2_Context::getFirstPage(CJBig2_Image **image, IFX_Pause* pPause) |
-{ |
- int32_t nRet; |
- m_bFirstPage = TRUE; |
- m_PauseStep = 0; |
- if(m_pGlobalContext) { |
- nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause); |
- if(nRet != JBIG2_SUCCESS) { |
- return nRet; |
- } |
- } |
- m_bBufSpecified = FALSE; |
- return Continue(pPause); |
+int32_t CJBig2_Context::getFirstPage(CJBig2_Image** image, IFX_Pause* pPause) { |
+ int32_t nRet; |
+ m_bFirstPage = TRUE; |
+ m_PauseStep = 0; |
+ if (m_pGlobalContext) { |
+ nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause); |
+ if (nRet != JBIG2_SUCCESS) { |
+ return nRet; |
+ } |
+ } |
+ m_bBufSpecified = FALSE; |
+ return Continue(pPause); |
} |
-int32_t CJBig2_Context::getNextPage(CJBig2_Image **image, IFX_Pause* pPause) |
-{ |
- int32_t nRet; |
- m_bBufSpecified = FALSE; |
- m_bFirstPage = FALSE; |
- m_PauseStep = 0; |
- switch(m_nStreamType) { |
- case JBIG2_FILE_STREAM: |
- nRet = decodeFile(pPause); |
- break; |
- case JBIG2_SQUENTIAL_STREAM: |
- nRet = decode_SquentialOrgnazation(pPause); |
- break; |
- case JBIG2_RANDOM_STREAM: |
- nRet = decode_RandomOrgnazation(pPause); |
- break; |
- case JBIG2_EMBED_STREAM: |
- nRet = decode_EmbedOrgnazation(pPause); |
- break; |
- default: |
- return JBIG2_ERROR_STREAM_TYPE; |
- } |
- if(nRet == JBIG2_SUCCESS) { |
- *image = m_pPage; |
- m_pPage = NULL; |
- return JBIG2_SUCCESS; |
- } |
- return nRet; |
+int32_t CJBig2_Context::getNextPage(CJBig2_Image** image, IFX_Pause* pPause) { |
+ int32_t nRet; |
+ m_bBufSpecified = FALSE; |
+ m_bFirstPage = FALSE; |
+ m_PauseStep = 0; |
+ switch (m_nStreamType) { |
+ case JBIG2_FILE_STREAM: |
+ nRet = decodeFile(pPause); |
+ break; |
+ case JBIG2_SQUENTIAL_STREAM: |
+ nRet = decode_SquentialOrgnazation(pPause); |
+ break; |
+ case JBIG2_RANDOM_STREAM: |
+ nRet = decode_RandomOrgnazation(pPause); |
+ break; |
+ case JBIG2_EMBED_STREAM: |
+ nRet = decode_EmbedOrgnazation(pPause); |
+ break; |
+ default: |
+ return JBIG2_ERROR_STREAM_TYPE; |
+ } |
+ if (nRet == JBIG2_SUCCESS) { |
+ *image = m_pPage; |
+ m_pPage = NULL; |
+ return JBIG2_SUCCESS; |
+ } |
+ return nRet; |
} |
-CJBig2_Segment *CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber) |
-{ |
- CJBig2_Segment *pSeg; |
- int32_t i; |
- if(m_pGlobalContext) { |
- pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber); |
- if(pSeg) { |
- return pSeg; |
- } |
- } |
- for(i = 0; i < m_pSegmentList->getLength(); i++) { |
- pSeg = m_pSegmentList->getAt(i); |
- if(pSeg->m_dwNumber == dwNumber) { |
- return pSeg; |
- } |
- } |
- return NULL; |
+CJBig2_Segment* CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber) { |
+ CJBig2_Segment* pSeg; |
+ int32_t i; |
+ if (m_pGlobalContext) { |
+ pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber); |
+ if (pSeg) { |
+ return pSeg; |
+ } |
+ } |
+ for (i = 0; i < m_pSegmentList->getLength(); i++) { |
+ pSeg = m_pSegmentList->getAt(i); |
+ if (pSeg->m_dwNumber == dwNumber) { |
+ return pSeg; |
+ } |
+ } |
+ return NULL; |
} |
-CJBig2_Segment *CJBig2_Context::findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment, |
- uint8_t cType, int32_t nIndex) |
-{ |
- CJBig2_Segment *pSeg; |
- int32_t i, count; |
- count = 0; |
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
- if(pSeg && pSeg->m_cFlags.s.type == cType) { |
- if(count == nIndex) { |
- return pSeg; |
- } else { |
- count ++; |
- } |
- } |
- } |
- return NULL; |
+CJBig2_Segment* CJBig2_Context::findReferredSegmentByTypeAndIndex( |
+ CJBig2_Segment* pSegment, |
+ uint8_t cType, |
+ int32_t nIndex) { |
+ CJBig2_Segment* pSeg; |
+ int32_t i, count; |
+ count = 0; |
+ for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
+ if (pSeg && pSeg->m_cFlags.s.type == cType) { |
+ if (count == nIndex) { |
+ return pSeg; |
+ } else { |
+ count++; |
+ } |
+ } |
+ } |
+ return NULL; |
} |
-int32_t CJBig2_Context::parseSegmentHeader(CJBig2_Segment *pSegment) |
-{ |
- uint8_t cSSize, cPSize; |
- uint8_t cTemp; |
- FX_WORD wTemp; |
- FX_DWORD dwTemp; |
- if((m_pStream->readInteger(&pSegment->m_dwNumber) != 0) |
- || (m_pStream->read1Byte(&pSegment->m_cFlags.c) != 0)) { |
- goto failed; |
- } |
- cTemp = m_pStream->getCurByte(); |
- if((cTemp >> 5) == 7) { |
- if(m_pStream->readInteger((FX_DWORD*)&pSegment->m_nReferred_to_segment_count) != 0) { |
- goto failed; |
- } |
- pSegment->m_nReferred_to_segment_count &= 0x1fffffff; |
- if (pSegment->m_nReferred_to_segment_count > JBIG2_MAX_REFERRED_SEGMENT_COUNT) { |
- m_pModule->JBig2_Error("Too many referred segments."); |
- return JBIG2_ERROR_LIMIT; |
- } |
- dwTemp = 5 + 4 + (pSegment->m_nReferred_to_segment_count + 1) / 8; |
- } else { |
- if(m_pStream->read1Byte(&cTemp) != 0) { |
+int32_t CJBig2_Context::parseSegmentHeader(CJBig2_Segment* pSegment) { |
+ uint8_t cSSize, cPSize; |
+ uint8_t cTemp; |
+ FX_WORD wTemp; |
+ FX_DWORD dwTemp; |
+ if ((m_pStream->readInteger(&pSegment->m_dwNumber) != 0) || |
+ (m_pStream->read1Byte(&pSegment->m_cFlags.c) != 0)) { |
+ goto failed; |
+ } |
+ cTemp = m_pStream->getCurByte(); |
+ if ((cTemp >> 5) == 7) { |
+ if (m_pStream->readInteger( |
+ (FX_DWORD*)&pSegment->m_nReferred_to_segment_count) != 0) { |
+ goto failed; |
+ } |
+ pSegment->m_nReferred_to_segment_count &= 0x1fffffff; |
+ if (pSegment->m_nReferred_to_segment_count > |
+ JBIG2_MAX_REFERRED_SEGMENT_COUNT) { |
+ m_pModule->JBig2_Error("Too many referred segments."); |
+ return JBIG2_ERROR_LIMIT; |
+ } |
+ dwTemp = 5 + 4 + (pSegment->m_nReferred_to_segment_count + 1) / 8; |
+ } else { |
+ if (m_pStream->read1Byte(&cTemp) != 0) { |
+ goto failed; |
+ } |
+ pSegment->m_nReferred_to_segment_count = cTemp >> 5; |
+ dwTemp = 5 + 1; |
+ } |
+ cSSize = |
+ pSegment->m_dwNumber > 65536 ? 4 : pSegment->m_dwNumber > 256 ? 2 : 1; |
+ cPSize = pSegment->m_cFlags.s.page_association_size ? 4 : 1; |
+ if (pSegment->m_nReferred_to_segment_count) { |
+ pSegment->m_pReferred_to_segment_numbers = |
+ (FX_DWORD*)m_pModule->JBig2_Malloc2( |
+ sizeof(FX_DWORD), pSegment->m_nReferred_to_segment_count); |
+ for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
+ switch (cSSize) { |
+ case 1: |
+ if (m_pStream->read1Byte(&cTemp) != 0) { |
goto failed; |
- } |
- pSegment->m_nReferred_to_segment_count = cTemp >> 5; |
- dwTemp = 5 + 1; |
- } |
- cSSize = pSegment->m_dwNumber > 65536 ? 4 : pSegment->m_dwNumber > 256 ? 2 : 1; |
- cPSize = pSegment->m_cFlags.s.page_association_size ? 4 : 1; |
- if(pSegment->m_nReferred_to_segment_count) { |
- pSegment->m_pReferred_to_segment_numbers = (FX_DWORD*)m_pModule->JBig2_Malloc2( |
- sizeof(FX_DWORD), pSegment->m_nReferred_to_segment_count); |
- for(int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
- switch(cSSize) { |
- case 1: |
- if(m_pStream->read1Byte(&cTemp) != 0) { |
- goto failed; |
- } |
- pSegment->m_pReferred_to_segment_numbers[i] = cTemp; |
- break; |
- case 2: |
- if(m_pStream->readShortInteger(&wTemp) != 0) { |
- goto failed; |
- } |
- pSegment->m_pReferred_to_segment_numbers[i] = wTemp; |
- break; |
- case 4: |
- if(m_pStream->readInteger(&dwTemp) != 0) { |
- goto failed; |
- } |
- pSegment->m_pReferred_to_segment_numbers[i] = dwTemp; |
- break; |
- } |
- if (pSegment->m_pReferred_to_segment_numbers[i] >= pSegment->m_dwNumber) { |
- m_pModule->JBig2_Error("The referred segment number is greater than this segment number."); |
- goto failed; |
- } |
- } |
- } |
- if(cPSize == 1) { |
- if(m_pStream->read1Byte(&cTemp) != 0) { |
+ } |
+ pSegment->m_pReferred_to_segment_numbers[i] = cTemp; |
+ break; |
+ case 2: |
+ if (m_pStream->readShortInteger(&wTemp) != 0) { |
goto failed; |
- } |
- pSegment->m_dwPage_association = cTemp; |
- } else { |
- if(m_pStream->readInteger(&pSegment->m_dwPage_association) != 0) { |
+ } |
+ pSegment->m_pReferred_to_segment_numbers[i] = wTemp; |
+ break; |
+ case 4: |
+ if (m_pStream->readInteger(&dwTemp) != 0) { |
goto failed; |
- } |
- } |
- if(m_pStream->readInteger(&pSegment->m_dwData_length) != 0) { |
+ } |
+ pSegment->m_pReferred_to_segment_numbers[i] = dwTemp; |
+ break; |
+ } |
+ if (pSegment->m_pReferred_to_segment_numbers[i] >= pSegment->m_dwNumber) { |
+ m_pModule->JBig2_Error( |
+ "The referred segment number is greater than this segment number."); |
goto failed; |
- } |
- pSegment->m_pData = m_pStream->getPointer(); |
- pSegment->m_State = JBIG2_SEGMENT_DATA_UNPARSED; |
- return JBIG2_SUCCESS; |
+ } |
+ } |
+ } |
+ if (cPSize == 1) { |
+ if (m_pStream->read1Byte(&cTemp) != 0) { |
+ goto failed; |
+ } |
+ pSegment->m_dwPage_association = cTemp; |
+ } else { |
+ if (m_pStream->readInteger(&pSegment->m_dwPage_association) != 0) { |
+ goto failed; |
+ } |
+ } |
+ if (m_pStream->readInteger(&pSegment->m_dwData_length) != 0) { |
+ goto failed; |
+ } |
+ pSegment->m_pData = m_pStream->getPointer(); |
+ pSegment->m_State = JBIG2_SEGMENT_DATA_UNPARSED; |
+ return JBIG2_SUCCESS; |
failed: |
- m_pModule->JBig2_Error("header too short."); |
- return JBIG2_ERROR_TOO_SHORT; |
+ m_pModule->JBig2_Error("header too short."); |
+ return JBIG2_ERROR_TOO_SHORT; |
} |
-int32_t CJBig2_Context::parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause) |
-{ |
- int32_t ret = ProcessiveParseSegmentData(pSegment, pPause); |
- while(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE && m_pStream->getByteLeft() > 0) { |
- ret = ProcessiveParseSegmentData(pSegment, pPause); |
- } |
- return ret; |
+int32_t CJBig2_Context::parseSegmentData(CJBig2_Segment* pSegment, |
+ IFX_Pause* pPause) { |
+ int32_t ret = ProcessiveParseSegmentData(pSegment, pPause); |
+ while (m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE && |
+ m_pStream->getByteLeft() > 0) { |
+ ret = ProcessiveParseSegmentData(pSegment, pPause); |
+ } |
+ return ret; |
} |
-int32_t CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause) |
-{ |
- switch(pSegment->m_cFlags.s.type) { |
- case 0: |
- return parseSymbolDict(pSegment, pPause); |
- case 4: |
- case 6: |
- case 7: |
- if(m_nState == JBIG2_OUT_OF_PAGE) { |
- goto failed2; |
- } else { |
- return parseTextRegion(pSegment); |
- } |
- case 16: |
- return parsePatternDict(pSegment, pPause); |
- case 20: |
- case 22: |
- case 23: |
- if(m_nState == JBIG2_OUT_OF_PAGE) { |
- goto failed2; |
- } else { |
- return parseHalftoneRegion(pSegment, pPause); |
- } |
- case 36: |
- case 38: |
- case 39: |
- if(m_nState == JBIG2_OUT_OF_PAGE) { |
- goto failed2; |
- } else { |
- return parseGenericRegion(pSegment, pPause); |
- } |
- case 40: |
- case 42: |
- case 43: |
- if(m_nState == JBIG2_OUT_OF_PAGE) { |
- goto failed2; |
- } else { |
- return parseGenericRefinementRegion(pSegment); |
- } |
- case 48: { |
- FX_WORD wTemp; |
- JBig2PageInfo *pPageInfo; |
- JBIG2_ALLOC(pPageInfo, JBig2PageInfo); |
- if((m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0) |
- || (m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0) |
- || (m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0) |
- || (m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0) |
- || (m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0) |
- || (m_pStream->readShortInteger(&wTemp) != 0)) { |
- delete pPageInfo; |
- goto failed1; |
- } |
- pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? 1 : 0; |
- pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff; |
- if((pPageInfo->m_dwHeight == 0xffffffff) && (pPageInfo->m_bIsStriped != 1)) { |
- m_pModule->JBig2_Warn("page height = 0xffffffff buf stripe field is 0"); |
- pPageInfo->m_bIsStriped = 1; |
- } |
- if(!m_bBufSpecified) { |
- delete m_pPage; |
- if(pPageInfo->m_dwHeight == 0xffffffff) { |
- JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_wMaxStripeSize)); |
- } else { |
- JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_dwHeight)); |
- } |
- } |
- m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0); |
- m_pPageInfoList->addItem(pPageInfo); |
- m_nState = JBIG2_IN_PAGE; |
- } |
- break; |
- case 49: |
- m_nState = JBIG2_OUT_OF_PAGE; |
- return JBIG2_END_OF_PAGE; |
- break; |
- case 50: |
- m_pStream->offset(pSegment->m_dwData_length); |
- break; |
- case 51: |
- return JBIG2_END_OF_FILE; |
- case 52: |
- m_pStream->offset(pSegment->m_dwData_length); |
- break; |
- case 53: |
- return parseTable(pSegment); |
- case 62: |
- m_pStream->offset(pSegment->m_dwData_length); |
- break; |
- default: |
- break; |
- } |
- return JBIG2_SUCCESS; |
+int32_t CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment* pSegment, |
+ IFX_Pause* pPause) { |
+ switch (pSegment->m_cFlags.s.type) { |
+ case 0: |
+ return parseSymbolDict(pSegment, pPause); |
+ case 4: |
+ case 6: |
+ case 7: |
+ if (m_nState == JBIG2_OUT_OF_PAGE) { |
+ goto failed2; |
+ } else { |
+ return parseTextRegion(pSegment); |
+ } |
+ case 16: |
+ return parsePatternDict(pSegment, pPause); |
+ case 20: |
+ case 22: |
+ case 23: |
+ if (m_nState == JBIG2_OUT_OF_PAGE) { |
+ goto failed2; |
+ } else { |
+ return parseHalftoneRegion(pSegment, pPause); |
+ } |
+ case 36: |
+ case 38: |
+ case 39: |
+ if (m_nState == JBIG2_OUT_OF_PAGE) { |
+ goto failed2; |
+ } else { |
+ return parseGenericRegion(pSegment, pPause); |
+ } |
+ case 40: |
+ case 42: |
+ case 43: |
+ if (m_nState == JBIG2_OUT_OF_PAGE) { |
+ goto failed2; |
+ } else { |
+ return parseGenericRefinementRegion(pSegment); |
+ } |
+ case 48: { |
+ FX_WORD wTemp; |
+ JBig2PageInfo* pPageInfo; |
+ JBIG2_ALLOC(pPageInfo, JBig2PageInfo); |
+ if ((m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0) || |
+ (m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0) || |
+ (m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0) || |
+ (m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0) || |
+ (m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0) || |
+ (m_pStream->readShortInteger(&wTemp) != 0)) { |
+ delete pPageInfo; |
+ goto failed1; |
+ } |
+ pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? 1 : 0; |
+ pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff; |
+ if ((pPageInfo->m_dwHeight == 0xffffffff) && |
+ (pPageInfo->m_bIsStriped != 1)) { |
+ m_pModule->JBig2_Warn("page height = 0xffffffff buf stripe field is 0"); |
+ pPageInfo->m_bIsStriped = 1; |
+ } |
+ if (!m_bBufSpecified) { |
+ delete m_pPage; |
+ if (pPageInfo->m_dwHeight == 0xffffffff) { |
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, |
+ pPageInfo->m_wMaxStripeSize)); |
+ } else { |
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, |
+ pPageInfo->m_dwHeight)); |
+ } |
+ } |
+ m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0); |
+ m_pPageInfoList->addItem(pPageInfo); |
+ m_nState = JBIG2_IN_PAGE; |
+ } break; |
+ case 49: |
+ m_nState = JBIG2_OUT_OF_PAGE; |
+ return JBIG2_END_OF_PAGE; |
+ break; |
+ case 50: |
+ m_pStream->offset(pSegment->m_dwData_length); |
+ break; |
+ case 51: |
+ return JBIG2_END_OF_FILE; |
+ case 52: |
+ m_pStream->offset(pSegment->m_dwData_length); |
+ break; |
+ case 53: |
+ return parseTable(pSegment); |
+ case 62: |
+ m_pStream->offset(pSegment->m_dwData_length); |
+ break; |
+ default: |
+ break; |
+ } |
+ return JBIG2_SUCCESS; |
failed1: |
- m_pModule->JBig2_Error("segment data too short."); |
- return JBIG2_ERROR_TOO_SHORT; |
+ m_pModule->JBig2_Error("segment data too short."); |
+ return JBIG2_ERROR_TOO_SHORT; |
failed2: |
- m_pModule->JBig2_Error("segment syntax error."); |
- return JBIG2_ERROR_FATAL; |
+ m_pModule->JBig2_Error("segment syntax error."); |
+ return JBIG2_ERROR_FATAL; |
} |
-int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause) |
-{ |
- FX_DWORD dwTemp; |
- FX_WORD wFlags; |
- uint8_t cSDHUFFDH, cSDHUFFDW, cSDHUFFBMSIZE, cSDHUFFAGGINST; |
- CJBig2_HuffmanTable *Table_B1 = NULL, *Table_B2 = NULL, *Table_B3 = NULL, *Table_B4 = NULL, *Table_B5 = NULL; |
- int32_t i, nIndex, nRet; |
- CJBig2_Segment *pSeg = NULL, *pLRSeg = NULL; |
- FX_BOOL bUsed; |
- CJBig2_Image ** SDINSYMS = NULL; |
- CJBig2_SDDProc *pSymbolDictDecoder; |
- JBig2ArithCtx *gbContext = NULL, *grContext = NULL; |
- CJBig2_ArithDecoder *pArithDecoder; |
- JBIG2_ALLOC(pSymbolDictDecoder, CJBig2_SDDProc()); |
- uint8_t *key = pSegment->m_pData; |
- FX_BOOL cache_hit = false; |
- if(m_pStream->readShortInteger(&wFlags) != 0) { |
- m_pModule->JBig2_Error("symbol dictionary segment : data header too short."); |
+int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment, |
+ IFX_Pause* pPause) { |
+ FX_DWORD dwTemp; |
+ FX_WORD wFlags; |
+ uint8_t cSDHUFFDH, cSDHUFFDW, cSDHUFFBMSIZE, cSDHUFFAGGINST; |
+ CJBig2_HuffmanTable *Table_B1 = NULL, *Table_B2 = NULL, *Table_B3 = NULL, |
+ *Table_B4 = NULL, *Table_B5 = NULL; |
+ int32_t i, nIndex, nRet; |
+ CJBig2_Segment *pSeg = NULL, *pLRSeg = NULL; |
+ FX_BOOL bUsed; |
+ CJBig2_Image** SDINSYMS = NULL; |
+ CJBig2_SDDProc* pSymbolDictDecoder; |
+ JBig2ArithCtx *gbContext = NULL, *grContext = NULL; |
+ CJBig2_ArithDecoder* pArithDecoder; |
+ JBIG2_ALLOC(pSymbolDictDecoder, CJBig2_SDDProc()); |
+ uint8_t* key = pSegment->m_pData; |
+ FX_BOOL cache_hit = false; |
+ if (m_pStream->readShortInteger(&wFlags) != 0) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : data header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ pSymbolDictDecoder->SDHUFF = wFlags & 0x0001; |
+ pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001; |
+ pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003; |
+ pSymbolDictDecoder->SDRTEMPLATE = (wFlags >> 12) & 0x0003; |
+ cSDHUFFDH = (wFlags >> 2) & 0x0003; |
+ cSDHUFFDW = (wFlags >> 4) & 0x0003; |
+ cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001; |
+ cSDHUFFAGGINST = (wFlags >> 7) & 0x0001; |
+ if (pSymbolDictDecoder->SDHUFF == 0) { |
+ if (pSymbolDictDecoder->SDTEMPLATE == 0) { |
+ dwTemp = 8; |
+ } else { |
+ dwTemp = 2; |
+ } |
+ for (i = 0; i < (int32_t)dwTemp; i++) { |
+ if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDAT[i]) != 0) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : data header too short."); |
nRet = JBIG2_ERROR_TOO_SHORT; |
goto failed; |
- } |
- pSymbolDictDecoder->SDHUFF = wFlags & 0x0001; |
- pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001; |
- pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003; |
- pSymbolDictDecoder->SDRTEMPLATE = (wFlags >> 12) & 0x0003; |
- cSDHUFFDH = (wFlags >> 2) & 0x0003; |
- cSDHUFFDW = (wFlags >> 4) & 0x0003; |
- cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001; |
- cSDHUFFAGGINST = (wFlags >> 7) & 0x0001; |
- if(pSymbolDictDecoder->SDHUFF == 0) { |
- if(pSymbolDictDecoder->SDTEMPLATE == 0) { |
- dwTemp = 8; |
- } else { |
- dwTemp = 2; |
- } |
- for(i = 0; i < (int32_t)dwTemp; i++) { |
- if(m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDAT[i]) != 0) { |
- m_pModule->JBig2_Error("symbol dictionary segment : data header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- } |
- } |
- if((pSymbolDictDecoder->SDREFAGG == 1) && (pSymbolDictDecoder->SDRTEMPLATE == 0)) { |
- for(i = 0; i < 4; i++) { |
- if(m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDRAT[i]) != 0) { |
- m_pModule->JBig2_Error("symbol dictionary segment : data header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- } |
- } |
- if((m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0) |
- || (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0)) { |
- m_pModule->JBig2_Error("symbol dictionary segment : data header too short."); |
+ } |
+ } |
+ } |
+ if ((pSymbolDictDecoder->SDREFAGG == 1) && |
+ (pSymbolDictDecoder->SDRTEMPLATE == 0)) { |
+ for (i = 0; i < 4; i++) { |
+ if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDRAT[i]) != 0) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : data header too short."); |
nRet = JBIG2_ERROR_TOO_SHORT; |
goto failed; |
- } |
- if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS |
- || pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) { |
- m_pModule->JBig2_Error("symbol dictionary segment : too many export/new symbols."); |
- nRet = JBIG2_ERROR_LIMIT; |
+ } |
+ } |
+ } |
+ if ((m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0) || |
+ (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0)) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : data header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS || |
+ pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : too many export/new symbols."); |
+ nRet = JBIG2_ERROR_LIMIT; |
+ goto failed; |
+ } |
+ for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
+ if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : can't find refered to segments"); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ } |
+ pSymbolDictDecoder->SDNUMINSYMS = 0; |
+ for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
+ if (pSeg->m_cFlags.s.type == 0) { |
+ pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->SDNUMEXSYMS; |
+ pLRSeg = pSeg; |
+ } |
+ } |
+ if (pSymbolDictDecoder->SDNUMINSYMS == 0) { |
+ SDINSYMS = NULL; |
+ } else { |
+ SDINSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
+ sizeof(CJBig2_Image*), pSymbolDictDecoder->SDNUMINSYMS); |
+ dwTemp = 0; |
+ for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
+ if (pSeg->m_cFlags.s.type == 0) { |
+ JBIG2_memcpy(SDINSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS, |
+ pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*)); |
+ dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS; |
+ } |
+ } |
+ } |
+ pSymbolDictDecoder->SDINSYMS = SDINSYMS; |
+ if (pSymbolDictDecoder->SDHUFF == 1) { |
+ if ((cSDHUFFDH == 2) || (cSDHUFFDW == 2)) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : SDHUFFDH=2 or SDHUFFDW=2 is not " |
+ "permitted."); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ nIndex = 0; |
+ if (cSDHUFFDH == 0) { |
+ JBIG2_ALLOC(Table_B4, CJBig2_HuffmanTable(HuffmanTable_B4, |
+ sizeof(HuffmanTable_B4) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B4)); |
+ pSymbolDictDecoder->SDHUFFDH = Table_B4; |
+ } else if (cSDHUFFDH == 1) { |
+ JBIG2_ALLOC(Table_B5, CJBig2_HuffmanTable(HuffmanTable_B5, |
+ sizeof(HuffmanTable_B5) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B5)); |
+ pSymbolDictDecoder->SDHUFFDH = Table_B5; |
+ } else { |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : SDHUFFDH can't find user supplied " |
+ "table."); |
+ nRet = JBIG2_ERROR_FATAL; |
goto failed; |
- } |
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
- if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) { |
- m_pModule->JBig2_Error("symbol dictionary segment : can't find refered to segments"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- } |
- pSymbolDictDecoder->SDNUMINSYMS = 0; |
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
- if(pSeg->m_cFlags.s.type == 0) { |
- pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->SDNUMEXSYMS; |
- pLRSeg = pSeg; |
- } |
- } |
- if(pSymbolDictDecoder->SDNUMINSYMS == 0) { |
- SDINSYMS = NULL; |
+ } |
+ pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht; |
+ } |
+ if (cSDHUFFDW == 0) { |
+ JBIG2_ALLOC(Table_B2, CJBig2_HuffmanTable(HuffmanTable_B2, |
+ sizeof(HuffmanTable_B2) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B2)); |
+ pSymbolDictDecoder->SDHUFFDW = Table_B2; |
+ } else if (cSDHUFFDW == 1) { |
+ JBIG2_ALLOC(Table_B3, CJBig2_HuffmanTable(HuffmanTable_B3, |
+ sizeof(HuffmanTable_B3) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B3)); |
+ pSymbolDictDecoder->SDHUFFDW = Table_B3; |
} else { |
- SDINSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
- sizeof(CJBig2_Image*), pSymbolDictDecoder->SDNUMINSYMS); |
- dwTemp = 0; |
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
- if(pSeg->m_cFlags.s.type == 0) { |
- JBIG2_memcpy(SDINSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS, |
- pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*)); |
- dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS; |
- } |
- } |
- } |
- pSymbolDictDecoder->SDINSYMS = SDINSYMS; |
- if(pSymbolDictDecoder->SDHUFF == 1) { |
- if((cSDHUFFDH == 2) || (cSDHUFFDW == 2)) { |
- m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDH=2 or SDHUFFDW=2 is not permitted."); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- nIndex = 0; |
- if(cSDHUFFDH == 0) { |
- JBIG2_ALLOC(Table_B4, CJBig2_HuffmanTable(HuffmanTable_B4, |
- sizeof(HuffmanTable_B4) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B4)); |
- pSymbolDictDecoder->SDHUFFDH = Table_B4; |
- } else if(cSDHUFFDH == 1) { |
- JBIG2_ALLOC(Table_B5, CJBig2_HuffmanTable(HuffmanTable_B5, |
- sizeof(HuffmanTable_B5) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B5)); |
- pSymbolDictDecoder->SDHUFFDH = Table_B5; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDH can't find user supplied table."); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht; |
- } |
- if(cSDHUFFDW == 0) { |
- JBIG2_ALLOC(Table_B2, CJBig2_HuffmanTable(HuffmanTable_B2, |
- sizeof(HuffmanTable_B2) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B2)); |
- pSymbolDictDecoder->SDHUFFDW = Table_B2; |
- } else if(cSDHUFFDW == 1) { |
- JBIG2_ALLOC(Table_B3, CJBig2_HuffmanTable(HuffmanTable_B3, |
- sizeof(HuffmanTable_B3) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B3)); |
- pSymbolDictDecoder->SDHUFFDW = Table_B3; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDW can't find user supplied table."); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht; |
- } |
- if(cSDHUFFBMSIZE == 0) { |
- JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1, |
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1)); |
- pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFBMSIZE can't find user supplied table."); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht; |
- } |
- if(pSymbolDictDecoder->SDREFAGG == 1) { |
- if(cSDHUFFAGGINST == 0) { |
- if(!Table_B1) { |
- JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1, |
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1)); |
- } |
- pSymbolDictDecoder->SDHUFFAGGINST = Table_B1; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFAGGINST can't find user supplied table."); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht; |
- } |
- } |
- } |
- if((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) { |
- if (pSymbolDictDecoder->SDHUFF == 0) { |
- dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ? |
- 8192 : 1024; |
- gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
- JBIG2_memcpy(gbContext, pLRSeg->m_Result.sd->m_gbContext, sizeof(JBig2ArithCtx)*dwTemp); |
- } |
- if (pSymbolDictDecoder->SDREFAGG == 1) { |
- dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13; |
- grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
- JBIG2_memcpy(grContext, pLRSeg->m_Result.sd->m_grContext, sizeof(JBig2ArithCtx)*dwTemp); |
- } |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : SDHUFFDW can't find user supplied " |
+ "table."); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht; |
+ } |
+ if (cSDHUFFBMSIZE == 0) { |
+ JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1, |
+ sizeof(HuffmanTable_B1) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B1)); |
+ pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1; |
} else { |
- if (pSymbolDictDecoder->SDHUFF == 0) { |
- dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ? |
- 8192 : 1024; |
- gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
- JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp); |
- } |
- if (pSymbolDictDecoder->SDREFAGG == 1) { |
- dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13; |
- grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
- JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp); |
- } |
- } |
- pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER; |
- for(std::list<CJBig2_CachePair>::iterator it = |
- m_pSymbolDictCache->begin(); it != m_pSymbolDictCache->end(); ++it) { |
- if (it->first == key) { |
- pSegment->m_Result.sd = it->second->DeepCopy(); |
- m_pSymbolDictCache->push_front(*it); |
- m_pSymbolDictCache->erase(it); |
- cache_hit = true; |
- break; |
- } |
- } |
- if (!cache_hit) { |
- if(pSymbolDictDecoder->SDHUFF == 0) { |
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
- pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext); |
- delete pArithDecoder; |
- if(pSegment->m_Result.sd == NULL) { |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- m_pStream->alignByte(); |
- m_pStream->offset(2); |
- } else { |
- pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman(m_pStream, gbContext, grContext, pPause); |
- if(pSegment->m_Result.sd == NULL) { |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- m_pStream->alignByte(); |
- } |
- CJBig2_SymbolDict *value = pSegment->m_Result.sd->DeepCopy(); |
- if (value && kSymbolDictCacheMaxSize > 0) { |
- while (m_pSymbolDictCache->size() >= kSymbolDictCacheMaxSize) { |
- delete m_pSymbolDictCache->back().second; |
- m_pSymbolDictCache->pop_back(); |
- } |
- m_pSymbolDictCache->push_front(CJBig2_CachePair(key, value)); |
- } |
- } |
- if(wFlags & 0x0200) { |
- pSegment->m_Result.sd->m_bContextRetained = TRUE; |
- if(pSymbolDictDecoder->SDHUFF == 0) { |
- pSegment->m_Result.sd->m_gbContext = gbContext; |
- } |
- if(pSymbolDictDecoder->SDREFAGG == 1) { |
- pSegment->m_Result.sd->m_grContext = grContext; |
- } |
- bUsed = TRUE; |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : SDHUFFBMSIZE can't find user supplied " |
+ "table."); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht; |
+ } |
+ if (pSymbolDictDecoder->SDREFAGG == 1) { |
+ if (cSDHUFFAGGINST == 0) { |
+ if (!Table_B1) { |
+ JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1, |
+ sizeof(HuffmanTable_B1) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B1)); |
+ } |
+ pSymbolDictDecoder->SDHUFFAGGINST = Table_B1; |
+ } else { |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary segment : SDHUFFAGGINST can't find user " |
+ "supplied table."); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht; |
+ } |
+ } |
+ } |
+ if ((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) { |
+ if (pSymbolDictDecoder->SDHUFF == 0) { |
+ dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 |
+ ? 65536 |
+ : pSymbolDictDecoder->SDTEMPLATE == 1 ? 8192 : 1024; |
+ gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2( |
+ sizeof(JBig2ArithCtx), dwTemp); |
+ JBIG2_memcpy(gbContext, pLRSeg->m_Result.sd->m_gbContext, |
+ sizeof(JBig2ArithCtx) * dwTemp); |
+ } |
+ if (pSymbolDictDecoder->SDREFAGG == 1) { |
+ dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13; |
+ grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2( |
+ sizeof(JBig2ArithCtx), dwTemp); |
+ JBIG2_memcpy(grContext, pLRSeg->m_Result.sd->m_grContext, |
+ sizeof(JBig2ArithCtx) * dwTemp); |
+ } |
+ } else { |
+ if (pSymbolDictDecoder->SDHUFF == 0) { |
+ dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 |
+ ? 65536 |
+ : pSymbolDictDecoder->SDTEMPLATE == 1 ? 8192 : 1024; |
+ gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2( |
+ sizeof(JBig2ArithCtx), dwTemp); |
+ JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); |
+ } |
+ if (pSymbolDictDecoder->SDREFAGG == 1) { |
+ dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13; |
+ grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2( |
+ sizeof(JBig2ArithCtx), dwTemp); |
+ JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp); |
+ } |
+ } |
+ pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER; |
+ for (std::list<CJBig2_CachePair>::iterator it = m_pSymbolDictCache->begin(); |
+ it != m_pSymbolDictCache->end(); ++it) { |
+ if (it->first == key) { |
+ pSegment->m_Result.sd = it->second->DeepCopy(); |
+ m_pSymbolDictCache->push_front(*it); |
+ m_pSymbolDictCache->erase(it); |
+ cache_hit = true; |
+ break; |
+ } |
+ } |
+ if (!cache_hit) { |
+ if (pSymbolDictDecoder->SDHUFF == 0) { |
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
+ pSegment->m_Result.sd = |
+ pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext); |
+ delete pArithDecoder; |
+ if (pSegment->m_Result.sd == NULL) { |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ m_pStream->alignByte(); |
+ m_pStream->offset(2); |
} else { |
- bUsed = FALSE; |
- } |
- delete pSymbolDictDecoder; |
- if(SDINSYMS) { |
- m_pModule->JBig2_Free(SDINSYMS); |
- } |
- delete Table_B1; |
- delete Table_B2; |
- delete Table_B3; |
- delete Table_B4; |
- delete Table_B5; |
- if(bUsed == FALSE) { |
- if(gbContext) { |
- m_pModule->JBig2_Free(gbContext); |
- } |
- if(grContext) { |
- m_pModule->JBig2_Free(grContext); |
- } |
- } |
- return JBIG2_SUCCESS; |
+ pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman( |
+ m_pStream, gbContext, grContext, pPause); |
+ if (pSegment->m_Result.sd == NULL) { |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ m_pStream->alignByte(); |
+ } |
+ CJBig2_SymbolDict* value = pSegment->m_Result.sd->DeepCopy(); |
+ if (value && kSymbolDictCacheMaxSize > 0) { |
+ while (m_pSymbolDictCache->size() >= kSymbolDictCacheMaxSize) { |
+ delete m_pSymbolDictCache->back().second; |
+ m_pSymbolDictCache->pop_back(); |
+ } |
+ m_pSymbolDictCache->push_front(CJBig2_CachePair(key, value)); |
+ } |
+ } |
+ if (wFlags & 0x0200) { |
+ pSegment->m_Result.sd->m_bContextRetained = TRUE; |
+ if (pSymbolDictDecoder->SDHUFF == 0) { |
+ pSegment->m_Result.sd->m_gbContext = gbContext; |
+ } |
+ if (pSymbolDictDecoder->SDREFAGG == 1) { |
+ pSegment->m_Result.sd->m_grContext = grContext; |
+ } |
+ bUsed = TRUE; |
+ } else { |
+ bUsed = FALSE; |
+ } |
+ delete pSymbolDictDecoder; |
+ if (SDINSYMS) { |
+ m_pModule->JBig2_Free(SDINSYMS); |
+ } |
+ delete Table_B1; |
+ delete Table_B2; |
+ delete Table_B3; |
+ delete Table_B4; |
+ delete Table_B5; |
+ if (bUsed == FALSE) { |
+ if (gbContext) { |
+ m_pModule->JBig2_Free(gbContext); |
+ } |
+ if (grContext) { |
+ m_pModule->JBig2_Free(grContext); |
+ } |
+ } |
+ return JBIG2_SUCCESS; |
failed: |
- delete pSymbolDictDecoder; |
- if(SDINSYMS) { |
- m_pModule->JBig2_Free(SDINSYMS); |
- } |
- delete Table_B1; |
- delete Table_B2; |
- delete Table_B3; |
- delete Table_B4; |
- delete Table_B5; |
- if(gbContext) { |
- m_pModule->JBig2_Free(gbContext); |
- } |
- if(grContext) { |
- m_pModule->JBig2_Free(grContext); |
- } |
- return nRet; |
+ delete pSymbolDictDecoder; |
+ if (SDINSYMS) { |
+ m_pModule->JBig2_Free(SDINSYMS); |
+ } |
+ delete Table_B1; |
+ delete Table_B2; |
+ delete Table_B3; |
+ delete Table_B4; |
+ delete Table_B5; |
+ if (gbContext) { |
+ m_pModule->JBig2_Free(gbContext); |
+ } |
+ if (grContext) { |
+ m_pModule->JBig2_Free(grContext); |
+ } |
+ return nRet; |
} |
-int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment *pSegment) |
-{ |
- FX_DWORD dwTemp; |
- FX_WORD wFlags; |
- int32_t i, nIndex, nRet; |
- JBig2RegionInfo ri; |
- CJBig2_Segment *pSeg; |
- CJBig2_Image **SBSYMS = NULL; |
- JBig2HuffmanCode *SBSYMCODES = NULL; |
- uint8_t cSBHUFFFS, cSBHUFFDS, cSBHUFFDT, cSBHUFFRDW, cSBHUFFRDH, cSBHUFFRDX, cSBHUFFRDY, cSBHUFFRSIZE; |
- CJBig2_HuffmanTable *Table_B1 = NULL, |
- *Table_B6 = NULL, |
- *Table_B7 = NULL, |
- *Table_B8 = NULL, |
- *Table_B9 = NULL, |
- *Table_B10 = NULL, |
- *Table_B11 = NULL, |
- *Table_B12 = NULL, |
- *Table_B13 = NULL, |
- *Table_B14 = NULL, |
- *Table_B15 = NULL; |
- JBig2ArithCtx *grContext = NULL; |
- CJBig2_ArithDecoder *pArithDecoder; |
- CJBig2_TRDProc *pTRD; |
- JBIG2_ALLOC(pTRD, CJBig2_TRDProc()); |
- if((parseRegionInfo(&ri) != JBIG2_SUCCESS) |
- || (m_pStream->readShortInteger(&wFlags) != 0)) { |
+int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) { |
+ FX_DWORD dwTemp; |
+ FX_WORD wFlags; |
+ int32_t i, nIndex, nRet; |
+ JBig2RegionInfo ri; |
+ CJBig2_Segment* pSeg; |
+ CJBig2_Image** SBSYMS = NULL; |
+ JBig2HuffmanCode* SBSYMCODES = NULL; |
+ uint8_t cSBHUFFFS, cSBHUFFDS, cSBHUFFDT, cSBHUFFRDW, cSBHUFFRDH, cSBHUFFRDX, |
+ cSBHUFFRDY, cSBHUFFRSIZE; |
+ CJBig2_HuffmanTable *Table_B1 = NULL, *Table_B6 = NULL, *Table_B7 = NULL, |
+ *Table_B8 = NULL, *Table_B9 = NULL, *Table_B10 = NULL, |
+ *Table_B11 = NULL, *Table_B12 = NULL, *Table_B13 = NULL, |
+ *Table_B14 = NULL, *Table_B15 = NULL; |
+ JBig2ArithCtx* grContext = NULL; |
+ CJBig2_ArithDecoder* pArithDecoder; |
+ CJBig2_TRDProc* pTRD; |
+ JBIG2_ALLOC(pTRD, CJBig2_TRDProc()); |
+ if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) || |
+ (m_pStream->readShortInteger(&wFlags) != 0)) { |
+ m_pModule->JBig2_Error("text region segment : data header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ pTRD->SBW = ri.width; |
+ pTRD->SBH = ri.height; |
+ pTRD->SBHUFF = wFlags & 0x0001; |
+ pTRD->SBREFINE = (wFlags >> 1) & 0x0001; |
+ dwTemp = (wFlags >> 2) & 0x0003; |
+ pTRD->SBSTRIPS = 1 << dwTemp; |
+ pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003); |
+ pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001; |
+ pTRD->SBCOMBOP = (JBig2ComposeOp)((wFlags >> 7) & 0x0003); |
+ pTRD->SBDEFPIXEL = (wFlags >> 9) & 0x0001; |
+ pTRD->SBDSOFFSET = (wFlags >> 10) & 0x001f; |
+ if (pTRD->SBDSOFFSET >= 0x0010) { |
+ pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020; |
+ } |
+ pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001; |
+ if (pTRD->SBHUFF == 1) { |
+ if (m_pStream->readShortInteger(&wFlags) != 0) { |
+ m_pModule->JBig2_Error("text region segment : data header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ cSBHUFFFS = wFlags & 0x0003; |
+ cSBHUFFDS = (wFlags >> 2) & 0x0003; |
+ cSBHUFFDT = (wFlags >> 4) & 0x0003; |
+ cSBHUFFRDW = (wFlags >> 6) & 0x0003; |
+ cSBHUFFRDH = (wFlags >> 8) & 0x0003; |
+ cSBHUFFRDX = (wFlags >> 10) & 0x0003; |
+ cSBHUFFRDY = (wFlags >> 12) & 0x0003; |
+ cSBHUFFRSIZE = (wFlags >> 14) & 0x0001; |
+ } |
+ if ((pTRD->SBREFINE == 1) && (pTRD->SBRTEMPLATE == 0)) { |
+ for (i = 0; i < 4; i++) { |
+ if (m_pStream->read1Byte((uint8_t*)&pTRD->SBRAT[i]) != 0) { |
m_pModule->JBig2_Error("text region segment : data header too short."); |
nRet = JBIG2_ERROR_TOO_SHORT; |
goto failed; |
+ } |
+ } |
+ } |
+ if (m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) { |
+ m_pModule->JBig2_Error("text region segment : data header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
+ if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) { |
+ m_pModule->JBig2_Error( |
+ "text region segment : can't find refered to segments"); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ } |
+ pTRD->SBNUMSYMS = 0; |
+ for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
+ if (pSeg->m_cFlags.s.type == 0) { |
+ pTRD->SBNUMSYMS += pSeg->m_Result.sd->SDNUMEXSYMS; |
+ } |
+ } |
+ if (pTRD->SBNUMSYMS > 0) { |
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), |
+ pTRD->SBNUMSYMS); |
+ dwTemp = 0; |
+ for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
+ if (pSeg->m_cFlags.s.type == 0) { |
+ JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS, |
+ pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*)); |
+ dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS; |
+ } |
+ } |
+ pTRD->SBSYMS = SBSYMS; |
+ } else { |
+ pTRD->SBSYMS = NULL; |
+ } |
+ if (pTRD->SBHUFF == 1) { |
+ SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream, pTRD->SBNUMSYMS); |
+ if (SBSYMCODES == NULL) { |
+ m_pModule->JBig2_Error( |
+ "text region segment: symbol ID huffman table decode failure!"); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
} |
- pTRD->SBW = ri.width; |
- pTRD->SBH = ri.height; |
- pTRD->SBHUFF = wFlags & 0x0001; |
- pTRD->SBREFINE = (wFlags >> 1) & 0x0001; |
- dwTemp = (wFlags >> 2) & 0x0003; |
- pTRD->SBSTRIPS = 1 << dwTemp; |
- pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003); |
- pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001; |
- pTRD->SBCOMBOP = (JBig2ComposeOp)((wFlags >> 7) & 0x0003); |
- pTRD->SBDEFPIXEL = (wFlags >> 9) & 0x0001; |
- pTRD->SBDSOFFSET = (wFlags >> 10) & 0x001f; |
- if(pTRD->SBDSOFFSET >= 0x0010) { |
- pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020; |
- } |
- pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001; |
- if(pTRD->SBHUFF == 1) { |
- if(m_pStream->readShortInteger(&wFlags) != 0) { |
- m_pModule->JBig2_Error("text region segment : data header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- cSBHUFFFS = wFlags & 0x0003; |
- cSBHUFFDS = (wFlags >> 2) & 0x0003; |
- cSBHUFFDT = (wFlags >> 4) & 0x0003; |
- cSBHUFFRDW = (wFlags >> 6) & 0x0003; |
- cSBHUFFRDH = (wFlags >> 8) & 0x0003; |
- cSBHUFFRDX = (wFlags >> 10) & 0x0003; |
- cSBHUFFRDY = (wFlags >> 12) & 0x0003; |
- cSBHUFFRSIZE = (wFlags >> 14) & 0x0001; |
- } |
- if((pTRD->SBREFINE == 1) && (pTRD->SBRTEMPLATE == 0)) { |
- for(i = 0; i < 4; i++) { |
- if(m_pStream->read1Byte((uint8_t*)&pTRD->SBRAT[i]) != 0) { |
- m_pModule->JBig2_Error("text region segment : data header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- } |
- } |
- if(m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) { |
- m_pModule->JBig2_Error("text region segment : data header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
- if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) { |
- m_pModule->JBig2_Error("text region segment : can't find refered to segments"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- } |
- pTRD->SBNUMSYMS = 0; |
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
- if(pSeg->m_cFlags.s.type == 0) { |
- pTRD->SBNUMSYMS += pSeg->m_Result.sd->SDNUMEXSYMS; |
- } |
- } |
- if (pTRD->SBNUMSYMS > 0) { |
- SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
- sizeof(CJBig2_Image*), pTRD->SBNUMSYMS); |
- dwTemp = 0; |
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
- if(pSeg->m_cFlags.s.type == 0) { |
- JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS, |
- pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*)); |
- dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS; |
- } |
- } |
- pTRD->SBSYMS = SBSYMS; |
+ m_pStream->alignByte(); |
+ pTRD->SBSYMCODES = SBSYMCODES; |
+ } else { |
+ dwTemp = 0; |
+ while ((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) { |
+ dwTemp++; |
+ } |
+ pTRD->SBSYMCODELEN = (uint8_t)dwTemp; |
+ } |
+ if (pTRD->SBHUFF == 1) { |
+ if ((cSBHUFFFS == 2) || (cSBHUFFRDW == 2) || (cSBHUFFRDH == 2) || |
+ (cSBHUFFRDX == 2) || (cSBHUFFRDY == 2)) { |
+ m_pModule->JBig2_Error( |
+ "text region segment : SBHUFFFS=2 or SBHUFFRDW=2 or " |
+ "SBHUFFRDH=2 or SBHUFFRDX=2 or SBHUFFRDY=2 is not permitted"); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ nIndex = 0; |
+ if (cSBHUFFFS == 0) { |
+ JBIG2_ALLOC(Table_B6, CJBig2_HuffmanTable(HuffmanTable_B6, |
+ sizeof(HuffmanTable_B6) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B6)); |
+ pTRD->SBHUFFFS = Table_B6; |
+ } else if (cSBHUFFFS == 1) { |
+ JBIG2_ALLOC(Table_B7, CJBig2_HuffmanTable(HuffmanTable_B7, |
+ sizeof(HuffmanTable_B7) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B7)); |
+ pTRD->SBHUFFFS = Table_B7; |
} else { |
- pTRD->SBSYMS = NULL; |
- } |
- if(pTRD->SBHUFF == 1) { |
- SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream, pTRD->SBNUMSYMS); |
- if(SBSYMCODES == NULL) { |
- m_pModule->JBig2_Error("text region segment: symbol ID huffman table decode failure!"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- m_pStream->alignByte(); |
- pTRD->SBSYMCODES = SBSYMCODES; |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "text region segment : SBHUFFFS can't find user supplied table"); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ pTRD->SBHUFFFS = pSeg->m_Result.ht; |
+ } |
+ if (cSBHUFFDS == 0) { |
+ JBIG2_ALLOC(Table_B8, CJBig2_HuffmanTable(HuffmanTable_B8, |
+ sizeof(HuffmanTable_B8) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B8)); |
+ pTRD->SBHUFFDS = Table_B8; |
+ } else if (cSBHUFFDS == 1) { |
+ JBIG2_ALLOC(Table_B9, CJBig2_HuffmanTable(HuffmanTable_B9, |
+ sizeof(HuffmanTable_B9) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B9)); |
+ pTRD->SBHUFFDS = Table_B9; |
+ } else if (cSBHUFFDS == 2) { |
+ JBIG2_ALLOC(Table_B10, CJBig2_HuffmanTable(HuffmanTable_B10, |
+ sizeof(HuffmanTable_B10) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B10)); |
+ pTRD->SBHUFFDS = Table_B10; |
} else { |
- dwTemp = 0; |
- while((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) { |
- dwTemp ++; |
- } |
- pTRD->SBSYMCODELEN = (uint8_t)dwTemp; |
- } |
- if(pTRD->SBHUFF == 1) { |
- if((cSBHUFFFS == 2) || (cSBHUFFRDW == 2) || (cSBHUFFRDH == 2) |
- || (cSBHUFFRDX == 2) || (cSBHUFFRDY == 2)) { |
- m_pModule->JBig2_Error("text region segment : SBHUFFFS=2 or SBHUFFRDW=2 or " |
- "SBHUFFRDH=2 or SBHUFFRDX=2 or SBHUFFRDY=2 is not permitted"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- nIndex = 0; |
- if(cSBHUFFFS == 0) { |
- JBIG2_ALLOC(Table_B6, CJBig2_HuffmanTable(HuffmanTable_B6, |
- sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6)); |
- pTRD->SBHUFFFS = Table_B6; |
- } else if(cSBHUFFFS == 1) { |
- JBIG2_ALLOC(Table_B7, CJBig2_HuffmanTable(HuffmanTable_B7, |
- sizeof(HuffmanTable_B7) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B7)); |
- pTRD->SBHUFFFS = Table_B7; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("text region segment : SBHUFFFS can't find user supplied table"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pTRD->SBHUFFFS = pSeg->m_Result.ht; |
- } |
- if(cSBHUFFDS == 0) { |
- JBIG2_ALLOC(Table_B8, CJBig2_HuffmanTable(HuffmanTable_B8, |
- sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8)); |
- pTRD->SBHUFFDS = Table_B8; |
- } else if(cSBHUFFDS == 1) { |
- JBIG2_ALLOC(Table_B9, CJBig2_HuffmanTable(HuffmanTable_B9, |
- sizeof(HuffmanTable_B9) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B9)); |
- pTRD->SBHUFFDS = Table_B9; |
- } else if(cSBHUFFDS == 2) { |
- JBIG2_ALLOC(Table_B10, CJBig2_HuffmanTable(HuffmanTable_B10, |
- sizeof(HuffmanTable_B10) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B10)); |
- pTRD->SBHUFFDS = Table_B10; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("text region segment : SBHUFFDS can't find user supplied table"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pTRD->SBHUFFDS = pSeg->m_Result.ht; |
- } |
- if(cSBHUFFDT == 0) { |
- JBIG2_ALLOC(Table_B11, CJBig2_HuffmanTable(HuffmanTable_B11, |
- sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11)); |
- pTRD->SBHUFFDT = Table_B11; |
- } else if(cSBHUFFDT == 1) { |
- JBIG2_ALLOC(Table_B12, CJBig2_HuffmanTable(HuffmanTable_B12, |
- sizeof(HuffmanTable_B12) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B12)); |
- pTRD->SBHUFFDT = Table_B12; |
- } else if(cSBHUFFDT == 2) { |
- JBIG2_ALLOC(Table_B13, CJBig2_HuffmanTable(HuffmanTable_B13, |
- sizeof(HuffmanTable_B13) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B13)); |
- pTRD->SBHUFFDT = Table_B13; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("text region segment : SBHUFFDT can't find user supplied table"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pTRD->SBHUFFDT = pSeg->m_Result.ht; |
- } |
- if(cSBHUFFRDW == 0) { |
- JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14, |
- sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14)); |
- pTRD->SBHUFFRDW = Table_B14; |
- } else if(cSBHUFFRDW == 1) { |
- JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- pTRD->SBHUFFRDW = Table_B15; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("text region segment : SBHUFFRDW can't find user supplied table"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pTRD->SBHUFFRDW = pSeg->m_Result.ht; |
- } |
- if(cSBHUFFRDH == 0) { |
- if(!Table_B14) { |
- JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14, |
- sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14)); |
- } |
- pTRD->SBHUFFRDH = Table_B14; |
- } else if(cSBHUFFRDH == 1) { |
- if(!Table_B15) { |
- JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- } |
- pTRD->SBHUFFRDH = Table_B15; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("text region segment : SBHUFFRDH can't find user supplied table"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pTRD->SBHUFFRDH = pSeg->m_Result.ht; |
- } |
- if(cSBHUFFRDX == 0) { |
- if(!Table_B14) { |
- JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14, |
- sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14)); |
- } |
- pTRD->SBHUFFRDX = Table_B14; |
- } else if(cSBHUFFRDX == 1) { |
- if(!Table_B15) { |
- JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- } |
- pTRD->SBHUFFRDX = Table_B15; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("text region segment : SBHUFFRDX can't find user supplied table"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pTRD->SBHUFFRDX = pSeg->m_Result.ht; |
- } |
- if(cSBHUFFRDY == 0) { |
- if(!Table_B14) { |
- JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14, |
- sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14)); |
- } |
- pTRD->SBHUFFRDY = Table_B14; |
- } else if(cSBHUFFRDY == 1) { |
- if(!Table_B15) { |
- JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- } |
- pTRD->SBHUFFRDY = Table_B15; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("text region segment : SBHUFFRDY can't find user supplied table"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pTRD->SBHUFFRDY = pSeg->m_Result.ht; |
- } |
- if(cSBHUFFRSIZE == 0) { |
- JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1, |
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1)); |
- pTRD->SBHUFFRSIZE = Table_B1; |
- } else { |
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
- if(!pSeg) { |
- m_pModule->JBig2_Error("text region segment : SBHUFFRSIZE can't find user supplied table"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pTRD->SBHUFFRSIZE = pSeg->m_Result.ht; |
- } |
- } |
- if(pTRD->SBREFINE == 1) { |
- dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13; |
- grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
- JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp); |
- } |
- if(pTRD->SBHUFF == 0) { |
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
- pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
- pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext); |
- delete pArithDecoder; |
- if(pSegment->m_Result.im == NULL) { |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- m_pStream->alignByte(); |
- m_pStream->offset(2); |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "text region segment : SBHUFFDS can't find user supplied table"); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ pTRD->SBHUFFDS = pSeg->m_Result.ht; |
+ } |
+ if (cSBHUFFDT == 0) { |
+ JBIG2_ALLOC(Table_B11, CJBig2_HuffmanTable(HuffmanTable_B11, |
+ sizeof(HuffmanTable_B11) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B11)); |
+ pTRD->SBHUFFDT = Table_B11; |
+ } else if (cSBHUFFDT == 1) { |
+ JBIG2_ALLOC(Table_B12, CJBig2_HuffmanTable(HuffmanTable_B12, |
+ sizeof(HuffmanTable_B12) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B12)); |
+ pTRD->SBHUFFDT = Table_B12; |
+ } else if (cSBHUFFDT == 2) { |
+ JBIG2_ALLOC(Table_B13, CJBig2_HuffmanTable(HuffmanTable_B13, |
+ sizeof(HuffmanTable_B13) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B13)); |
+ pTRD->SBHUFFDT = Table_B13; |
} else { |
- pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
- pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream, grContext); |
- if(pSegment->m_Result.im == NULL) { |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- m_pStream->alignByte(); |
- } |
- if(pSegment->m_cFlags.s.type != 4) { |
- if(!m_bBufSpecified) { |
- JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast(); |
- if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) { |
- m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
- } |
- } |
- m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03)); |
- delete pSegment->m_Result.im; |
- pSegment->m_Result.im = NULL; |
- } |
- delete pTRD; |
- if(SBSYMS) { |
- m_pModule->JBig2_Free(SBSYMS); |
- } |
- if(SBSYMCODES) { |
- m_pModule->JBig2_Free(SBSYMCODES); |
- } |
- if(grContext) { |
- m_pModule->JBig2_Free(grContext); |
- } |
- delete Table_B1; |
- delete Table_B6; |
- delete Table_B7; |
- delete Table_B8; |
- delete Table_B9; |
- delete Table_B10; |
- delete Table_B11; |
- delete Table_B12; |
- delete Table_B13; |
- delete Table_B14; |
- delete Table_B15; |
- return JBIG2_SUCCESS; |
-failed: |
- delete pTRD; |
- if(SBSYMS) { |
- m_pModule->JBig2_Free(SBSYMS); |
- } |
- if(SBSYMCODES) { |
- m_pModule->JBig2_Free(SBSYMCODES); |
- } |
- if(grContext) { |
- m_pModule->JBig2_Free(grContext); |
- } |
- delete Table_B1; |
- delete Table_B6; |
- delete Table_B7; |
- delete Table_B8; |
- delete Table_B9; |
- delete Table_B10; |
- delete Table_B11; |
- delete Table_B12; |
- delete Table_B13; |
- delete Table_B14; |
- delete Table_B15; |
- return nRet; |
-} |
- |
-int32_t CJBig2_Context::parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause) |
-{ |
- FX_DWORD dwTemp; |
- uint8_t cFlags; |
- JBig2ArithCtx *gbContext; |
- CJBig2_ArithDecoder *pArithDecoder; |
- CJBig2_PDDProc *pPDD; |
- int32_t nRet; |
- JBIG2_ALLOC(pPDD, CJBig2_PDDProc()); |
- if((m_pStream->read1Byte(&cFlags) != 0) |
- || (m_pStream->read1Byte(&pPDD->HDPW) != 0) |
- || (m_pStream->read1Byte(&pPDD->HDPH) != 0) |
- || (m_pStream->readInteger(&pPDD->GRAYMAX) != 0)) { |
- m_pModule->JBig2_Error("pattern dictionary segment : data header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "text region segment : SBHUFFDT can't find user supplied table"); |
+ nRet = JBIG2_ERROR_FATAL; |
goto failed; |
- } |
- if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) { |
- m_pModule->JBig2_Error("pattern dictionary segment : too max gray max."); |
- nRet = JBIG2_ERROR_LIMIT; |
+ } |
+ pTRD->SBHUFFDT = pSeg->m_Result.ht; |
+ } |
+ if (cSBHUFFRDW == 0) { |
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14, |
+ sizeof(HuffmanTable_B14) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B14)); |
+ pTRD->SBHUFFRDW = Table_B14; |
+ } else if (cSBHUFFRDW == 1) { |
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ pTRD->SBHUFFRDW = Table_B15; |
+ } else { |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "text region segment : SBHUFFRDW can't find user supplied table"); |
+ nRet = JBIG2_ERROR_FATAL; |
goto failed; |
- } |
- pPDD->HDMMR = cFlags & 0x01; |
- pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03; |
- pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER; |
- if(pPDD->HDMMR == 0) { |
- dwTemp = pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024; |
- gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
- JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp); |
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
- pSegment->m_Result.pd = pPDD->decode_Arith(pArithDecoder, gbContext, pPause); |
- delete pArithDecoder; |
- if(pSegment->m_Result.pd == NULL) { |
- m_pModule->JBig2_Free(gbContext); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- m_pModule->JBig2_Free(gbContext); |
- m_pStream->alignByte(); |
- m_pStream->offset(2); |
+ } |
+ pTRD->SBHUFFRDW = pSeg->m_Result.ht; |
+ } |
+ if (cSBHUFFRDH == 0) { |
+ if (!Table_B14) { |
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14, |
+ sizeof(HuffmanTable_B14) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B14)); |
+ } |
+ pTRD->SBHUFFRDH = Table_B14; |
+ } else if (cSBHUFFRDH == 1) { |
+ if (!Table_B15) { |
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ } |
+ pTRD->SBHUFFRDH = Table_B15; |
} else { |
- pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream, pPause); |
- if(pSegment->m_Result.pd == NULL) { |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- m_pStream->alignByte(); |
- } |
- delete pPDD; |
- return JBIG2_SUCCESS; |
-failed: |
- delete pPDD; |
- return nRet; |
-} |
-int32_t CJBig2_Context::parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause) |
-{ |
- FX_DWORD dwTemp; |
- uint8_t cFlags; |
- JBig2RegionInfo ri; |
- CJBig2_Segment *pSeg; |
- CJBig2_PatternDict *pPatternDict; |
- JBig2ArithCtx *gbContext; |
- CJBig2_ArithDecoder *pArithDecoder; |
- CJBig2_HTRDProc *pHRD; |
- int32_t nRet; |
- JBIG2_ALLOC(pHRD, CJBig2_HTRDProc()); |
- if((parseRegionInfo(&ri) != JBIG2_SUCCESS) |
- || (m_pStream->read1Byte(&cFlags) != 0) |
- || (m_pStream->readInteger(&pHRD->HGW) != 0) |
- || (m_pStream->readInteger(&pHRD->HGH) != 0) |
- || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0) |
- || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0) |
- || (m_pStream->readShortInteger(&pHRD->HRX) != 0) |
- || (m_pStream->readShortInteger(&pHRD->HRY) != 0)) { |
- m_pModule->JBig2_Error("halftone region segment : data header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "text region segment : SBHUFFRDH can't find user supplied table"); |
+ nRet = JBIG2_ERROR_FATAL; |
goto failed; |
- } |
- pHRD->HBW = ri.width; |
- pHRD->HBH = ri.height; |
- pHRD->HMMR = cFlags & 0x01; |
- pHRD->HTEMPLATE = (cFlags >> 1) & 0x03; |
- pHRD->HENABLESKIP = (cFlags >> 3) & 0x01; |
- pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07); |
- pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01; |
- if(pSegment->m_nReferred_to_segment_count != 1) { |
- m_pModule->JBig2_Error("halftone region segment : refered to segment count not equals 1"); |
+ } |
+ pTRD->SBHUFFRDH = pSeg->m_Result.ht; |
+ } |
+ if (cSBHUFFRDX == 0) { |
+ if (!Table_B14) { |
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14, |
+ sizeof(HuffmanTable_B14) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B14)); |
+ } |
+ pTRD->SBHUFFRDX = Table_B14; |
+ } else if (cSBHUFFRDX == 1) { |
+ if (!Table_B15) { |
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ } |
+ pTRD->SBHUFFRDX = Table_B15; |
+ } else { |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "text region segment : SBHUFFRDX can't find user supplied table"); |
nRet = JBIG2_ERROR_FATAL; |
goto failed; |
- } |
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); |
- if( (pSeg == NULL) || (pSeg->m_cFlags.s.type != 16)) { |
- m_pModule->JBig2_Error("halftone region segment : refered to segment is not pattern dict"); |
+ } |
+ pTRD->SBHUFFRDX = pSeg->m_Result.ht; |
+ } |
+ if (cSBHUFFRDY == 0) { |
+ if (!Table_B14) { |
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14, |
+ sizeof(HuffmanTable_B14) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B14)); |
+ } |
+ pTRD->SBHUFFRDY = Table_B14; |
+ } else if (cSBHUFFRDY == 1) { |
+ if (!Table_B15) { |
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ } |
+ pTRD->SBHUFFRDY = Table_B15; |
+ } else { |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "text region segment : SBHUFFRDY can't find user supplied table"); |
nRet = JBIG2_ERROR_FATAL; |
goto failed; |
- } |
- pPatternDict = pSeg->m_Result.pd; |
- if((pPatternDict == NULL) || (pPatternDict->NUMPATS == 0)) { |
- m_pModule->JBig2_Error("halftone region segment : has no patterns input"); |
+ } |
+ pTRD->SBHUFFRDY = pSeg->m_Result.ht; |
+ } |
+ if (cSBHUFFRSIZE == 0) { |
+ JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1, |
+ sizeof(HuffmanTable_B1) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B1)); |
+ pTRD->SBHUFFRSIZE = Table_B1; |
+ } else { |
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
+ if (!pSeg) { |
+ m_pModule->JBig2_Error( |
+ "text region segment : SBHUFFRSIZE can't find user supplied table"); |
nRet = JBIG2_ERROR_FATAL; |
goto failed; |
+ } |
+ pTRD->SBHUFFRSIZE = pSeg->m_Result.ht; |
+ } |
+ } |
+ if (pTRD->SBREFINE == 1) { |
+ dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13; |
+ grContext = |
+ (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
+ JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp); |
+ } |
+ if (pTRD->SBHUFF == 0) { |
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
+ pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext); |
+ delete pArithDecoder; |
+ if (pSegment->m_Result.im == NULL) { |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
} |
- pHRD->HNUMPATS = pPatternDict->NUMPATS; |
- pHRD->HPATS = pPatternDict->HDPATS; |
- pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth; |
- pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight; |
+ m_pStream->alignByte(); |
+ m_pStream->offset(2); |
+ } else { |
pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
- if(pHRD->HMMR == 0) { |
- dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024; |
- gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
- JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp); |
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
- pSegment->m_Result.im = pHRD->decode_Arith(pArithDecoder, gbContext, pPause); |
- delete pArithDecoder; |
- if(pSegment->m_Result.im == NULL) { |
- m_pModule->JBig2_Free(gbContext); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- m_pModule->JBig2_Free(gbContext); |
- m_pStream->alignByte(); |
- m_pStream->offset(2); |
- } else { |
- pSegment->m_Result.im = pHRD->decode_MMR(m_pStream, pPause); |
- if(pSegment->m_Result.im == NULL) { |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- m_pStream->alignByte(); |
- } |
- if(pSegment->m_cFlags.s.type != 20) { |
- if(!m_bBufSpecified) { |
- JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast(); |
- if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) { |
- m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
- } |
- } |
- m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03)); |
- delete pSegment->m_Result.im; |
- pSegment->m_Result.im = NULL; |
+ pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream, grContext); |
+ if (pSegment->m_Result.im == NULL) { |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
} |
- delete pHRD; |
- return JBIG2_SUCCESS; |
+ m_pStream->alignByte(); |
+ } |
+ if (pSegment->m_cFlags.s.type != 4) { |
+ if (!m_bBufSpecified) { |
+ JBig2PageInfo* pPageInfo = m_pPageInfoList->getLast(); |
+ if ((pPageInfo->m_bIsStriped == 1) && |
+ (ri.y + ri.height > m_pPage->m_nHeight)) { |
+ m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
+ } |
+ } |
+ m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, |
+ (JBig2ComposeOp)(ri.flags & 0x03)); |
+ delete pSegment->m_Result.im; |
+ pSegment->m_Result.im = NULL; |
+ } |
+ delete pTRD; |
+ if (SBSYMS) { |
+ m_pModule->JBig2_Free(SBSYMS); |
+ } |
+ if (SBSYMCODES) { |
+ m_pModule->JBig2_Free(SBSYMCODES); |
+ } |
+ if (grContext) { |
+ m_pModule->JBig2_Free(grContext); |
+ } |
+ delete Table_B1; |
+ delete Table_B6; |
+ delete Table_B7; |
+ delete Table_B8; |
+ delete Table_B9; |
+ delete Table_B10; |
+ delete Table_B11; |
+ delete Table_B12; |
+ delete Table_B13; |
+ delete Table_B14; |
+ delete Table_B15; |
+ return JBIG2_SUCCESS; |
failed: |
- delete pHRD; |
- return nRet; |
+ delete pTRD; |
+ if (SBSYMS) { |
+ m_pModule->JBig2_Free(SBSYMS); |
+ } |
+ if (SBSYMCODES) { |
+ m_pModule->JBig2_Free(SBSYMCODES); |
+ } |
+ if (grContext) { |
+ m_pModule->JBig2_Free(grContext); |
+ } |
+ delete Table_B1; |
+ delete Table_B6; |
+ delete Table_B7; |
+ delete Table_B8; |
+ delete Table_B9; |
+ delete Table_B10; |
+ delete Table_B11; |
+ delete Table_B12; |
+ delete Table_B13; |
+ delete Table_B14; |
+ delete Table_B15; |
+ return nRet; |
+} |
+ |
+int32_t CJBig2_Context::parsePatternDict(CJBig2_Segment* pSegment, |
+ IFX_Pause* pPause) { |
+ FX_DWORD dwTemp; |
+ uint8_t cFlags; |
+ JBig2ArithCtx* gbContext; |
+ CJBig2_ArithDecoder* pArithDecoder; |
+ CJBig2_PDDProc* pPDD; |
+ int32_t nRet; |
+ JBIG2_ALLOC(pPDD, CJBig2_PDDProc()); |
+ if ((m_pStream->read1Byte(&cFlags) != 0) || |
+ (m_pStream->read1Byte(&pPDD->HDPW) != 0) || |
+ (m_pStream->read1Byte(&pPDD->HDPH) != 0) || |
+ (m_pStream->readInteger(&pPDD->GRAYMAX) != 0)) { |
+ m_pModule->JBig2_Error( |
+ "pattern dictionary segment : data header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) { |
+ m_pModule->JBig2_Error("pattern dictionary segment : too max gray max."); |
+ nRet = JBIG2_ERROR_LIMIT; |
+ goto failed; |
+ } |
+ pPDD->HDMMR = cFlags & 0x01; |
+ pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03; |
+ pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER; |
+ if (pPDD->HDMMR == 0) { |
+ dwTemp = |
+ pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024; |
+ gbContext = |
+ (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
+ JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); |
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
+ pSegment->m_Result.pd = |
+ pPDD->decode_Arith(pArithDecoder, gbContext, pPause); |
+ delete pArithDecoder; |
+ if (pSegment->m_Result.pd == NULL) { |
+ m_pModule->JBig2_Free(gbContext); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ m_pModule->JBig2_Free(gbContext); |
+ m_pStream->alignByte(); |
+ m_pStream->offset(2); |
+ } else { |
+ pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream, pPause); |
+ if (pSegment->m_Result.pd == NULL) { |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ m_pStream->alignByte(); |
+ } |
+ delete pPDD; |
+ return JBIG2_SUCCESS; |
+failed: |
+ delete pPDD; |
+ return nRet; |
+} |
+int32_t CJBig2_Context::parseHalftoneRegion(CJBig2_Segment* pSegment, |
+ IFX_Pause* pPause) { |
+ FX_DWORD dwTemp; |
+ uint8_t cFlags; |
+ JBig2RegionInfo ri; |
+ CJBig2_Segment* pSeg; |
+ CJBig2_PatternDict* pPatternDict; |
+ JBig2ArithCtx* gbContext; |
+ CJBig2_ArithDecoder* pArithDecoder; |
+ CJBig2_HTRDProc* pHRD; |
+ int32_t nRet; |
+ JBIG2_ALLOC(pHRD, CJBig2_HTRDProc()); |
+ if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) || |
+ (m_pStream->read1Byte(&cFlags) != 0) || |
+ (m_pStream->readInteger(&pHRD->HGW) != 0) || |
+ (m_pStream->readInteger(&pHRD->HGH) != 0) || |
+ (m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0) || |
+ (m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0) || |
+ (m_pStream->readShortInteger(&pHRD->HRX) != 0) || |
+ (m_pStream->readShortInteger(&pHRD->HRY) != 0)) { |
+ m_pModule->JBig2_Error("halftone region segment : data header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ pHRD->HBW = ri.width; |
+ pHRD->HBH = ri.height; |
+ pHRD->HMMR = cFlags & 0x01; |
+ pHRD->HTEMPLATE = (cFlags >> 1) & 0x03; |
+ pHRD->HENABLESKIP = (cFlags >> 3) & 0x01; |
+ pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07); |
+ pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01; |
+ if (pSegment->m_nReferred_to_segment_count != 1) { |
+ m_pModule->JBig2_Error( |
+ "halftone region segment : refered to segment count not equals 1"); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); |
+ if ((pSeg == NULL) || (pSeg->m_cFlags.s.type != 16)) { |
+ m_pModule->JBig2_Error( |
+ "halftone region segment : refered to segment is not pattern dict"); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ pPatternDict = pSeg->m_Result.pd; |
+ if ((pPatternDict == NULL) || (pPatternDict->NUMPATS == 0)) { |
+ m_pModule->JBig2_Error("halftone region segment : has no patterns input"); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ pHRD->HNUMPATS = pPatternDict->NUMPATS; |
+ pHRD->HPATS = pPatternDict->HDPATS; |
+ pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth; |
+ pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight; |
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
+ if (pHRD->HMMR == 0) { |
+ dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024; |
+ gbContext = |
+ (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
+ JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); |
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
+ pSegment->m_Result.im = |
+ pHRD->decode_Arith(pArithDecoder, gbContext, pPause); |
+ delete pArithDecoder; |
+ if (pSegment->m_Result.im == NULL) { |
+ m_pModule->JBig2_Free(gbContext); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ m_pModule->JBig2_Free(gbContext); |
+ m_pStream->alignByte(); |
+ m_pStream->offset(2); |
+ } else { |
+ pSegment->m_Result.im = pHRD->decode_MMR(m_pStream, pPause); |
+ if (pSegment->m_Result.im == NULL) { |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ m_pStream->alignByte(); |
+ } |
+ if (pSegment->m_cFlags.s.type != 20) { |
+ if (!m_bBufSpecified) { |
+ JBig2PageInfo* pPageInfo = m_pPageInfoList->getLast(); |
+ if ((pPageInfo->m_bIsStriped == 1) && |
+ (ri.y + ri.height > m_pPage->m_nHeight)) { |
+ m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
+ } |
+ } |
+ m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, |
+ (JBig2ComposeOp)(ri.flags & 0x03)); |
+ delete pSegment->m_Result.im; |
+ pSegment->m_Result.im = NULL; |
+ } |
+ delete pHRD; |
+ return JBIG2_SUCCESS; |
+failed: |
+ delete pHRD; |
+ return nRet; |
} |
-int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause) |
-{ |
- FX_DWORD dwTemp; |
- uint8_t cFlags; |
- int32_t i, nRet; |
- if(m_pGRD == NULL) { |
- JBIG2_ALLOC(m_pGRD, CJBig2_GRDProc()); |
- if((parseRegionInfo(&m_ri) != JBIG2_SUCCESS) |
- || (m_pStream->read1Byte(&cFlags) != 0)) { |
- m_pModule->JBig2_Error("generic region segment : data header too short."); |
+int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment, |
+ IFX_Pause* pPause) { |
+ FX_DWORD dwTemp; |
+ uint8_t cFlags; |
+ int32_t i, nRet; |
+ if (m_pGRD == NULL) { |
+ JBIG2_ALLOC(m_pGRD, CJBig2_GRDProc()); |
+ if ((parseRegionInfo(&m_ri) != JBIG2_SUCCESS) || |
+ (m_pStream->read1Byte(&cFlags) != 0)) { |
+ m_pModule->JBig2_Error("generic region segment : data header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ if (m_ri.height < 0 || m_ri.width < 0) { |
+ m_pModule->JBig2_Error("generic region segment : wrong data."); |
+ nRet = JBIG2_FAILED; |
+ goto failed; |
+ } |
+ m_pGRD->GBW = m_ri.width; |
+ m_pGRD->GBH = m_ri.height; |
+ m_pGRD->MMR = cFlags & 0x01; |
+ m_pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03; |
+ m_pGRD->TPGDON = (cFlags >> 3) & 0x01; |
+ if (m_pGRD->MMR == 0) { |
+ if (m_pGRD->GBTEMPLATE == 0) { |
+ for (i = 0; i < 8; i++) { |
+ if (m_pStream->read1Byte((uint8_t*)&m_pGRD->GBAT[i]) != 0) { |
+ m_pModule->JBig2_Error( |
+ "generic region segment : data header too short."); |
nRet = JBIG2_ERROR_TOO_SHORT; |
goto failed; |
+ } |
} |
- if (m_ri.height < 0 || m_ri.width < 0) { |
- m_pModule->JBig2_Error("generic region segment : wrong data."); |
- nRet = JBIG2_FAILED; |
+ } else { |
+ for (i = 0; i < 2; i++) { |
+ if (m_pStream->read1Byte((uint8_t*)&m_pGRD->GBAT[i]) != 0) { |
+ m_pModule->JBig2_Error( |
+ "generic region segment : data header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
goto failed; |
- } |
- m_pGRD->GBW = m_ri.width; |
- m_pGRD->GBH = m_ri.height; |
- m_pGRD->MMR = cFlags & 0x01; |
- m_pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03; |
- m_pGRD->TPGDON = (cFlags >> 3) & 0x01; |
- if(m_pGRD->MMR == 0) { |
- if(m_pGRD->GBTEMPLATE == 0) { |
- for(i = 0; i < 8; i++) { |
- if(m_pStream->read1Byte((uint8_t*)&m_pGRD->GBAT[i]) != 0) { |
- m_pModule->JBig2_Error("generic region segment : data header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- } |
- } else { |
- for(i = 0; i < 2; i++) { |
- if(m_pStream->read1Byte((uint8_t*)&m_pGRD->GBAT[i]) != 0) { |
- m_pModule->JBig2_Error("generic region segment : data header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- } |
- } |
- } |
- m_pGRD->USESKIP = 0; |
- } |
- pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
- if(m_pGRD->MMR == 0) { |
- dwTemp = m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024; |
- if(m_gbContext == NULL) { |
- m_gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc(sizeof(JBig2ArithCtx) * dwTemp); |
- JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp); |
- } |
- if(m_pArithDecoder == NULL) { |
- JBIG2_ALLOC(m_pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
- m_ProcessiveStatus = m_pGRD->Start_decode_Arith(&pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause); |
- } else { |
- m_ProcessiveStatus = m_pGRD->Continue_decode(pPause); |
- } |
- OutputBitmap(pSegment->m_Result.im); |
- if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- if(pSegment->m_cFlags.s.type != 36) { |
- if(!m_bBufSpecified) { |
- JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast(); |
- if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { |
- m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
- } |
- } |
- FX_RECT Rect = m_pGRD->GetReplaceRect(); |
- m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); |
- } |
- return JBIG2_SUCCESS; |
- } else { |
- delete m_pArithDecoder; |
- m_pArithDecoder = NULL; |
- if(pSegment->m_Result.im == NULL) { |
- m_pModule->JBig2_Free(m_gbContext); |
- nRet = JBIG2_ERROR_FATAL; |
- m_gbContext = NULL; |
- m_ProcessiveStatus = FXCODEC_STATUS_ERROR; |
- goto failed; |
- } |
- m_pModule->JBig2_Free(m_gbContext); |
- m_gbContext = NULL; |
- m_pStream->alignByte(); |
- m_pStream->offset(2); |
- } |
+ } |
+ } |
+ } |
+ } |
+ m_pGRD->USESKIP = 0; |
+ } |
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
+ if (m_pGRD->MMR == 0) { |
+ dwTemp = |
+ m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024; |
+ if (m_gbContext == NULL) { |
+ m_gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc( |
+ sizeof(JBig2ArithCtx) * dwTemp); |
+ JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); |
+ } |
+ if (m_pArithDecoder == NULL) { |
+ JBIG2_ALLOC(m_pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
+ m_ProcessiveStatus = m_pGRD->Start_decode_Arith( |
+ &pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause); |
} else { |
- FXCODEC_STATUS status = m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, m_pStream, pPause); |
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- m_pGRD->Continue_decode(pPause); |
- } |
- if(pSegment->m_Result.im == NULL) { |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- m_pStream->alignByte(); |
- } |
- if(pSegment->m_cFlags.s.type != 36) { |
- if(!m_bBufSpecified) { |
- JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast(); |
- if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { |
- m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
- } |
+ m_ProcessiveStatus = m_pGRD->Continue_decode(pPause); |
+ } |
+ OutputBitmap(pSegment->m_Result.im); |
+ if (m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ if (pSegment->m_cFlags.s.type != 36) { |
+ if (!m_bBufSpecified) { |
+ JBig2PageInfo* pPageInfo = m_pPageInfoList->getLast(); |
+ if ((pPageInfo->m_bIsStriped == 1) && |
+ (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { |
+ m_pPage->expand(m_ri.y + m_ri.height, |
+ (pPageInfo->m_cFlags & 4) ? 1 : 0); |
+ } |
} |
FX_RECT Rect = m_pGRD->GetReplaceRect(); |
- m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); |
- delete pSegment->m_Result.im; |
- pSegment->m_Result.im = NULL; |
+ m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, |
+ pSegment->m_Result.im, |
+ (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); |
+ } |
+ return JBIG2_SUCCESS; |
+ } else { |
+ delete m_pArithDecoder; |
+ m_pArithDecoder = NULL; |
+ if (pSegment->m_Result.im == NULL) { |
+ m_pModule->JBig2_Free(m_gbContext); |
+ nRet = JBIG2_ERROR_FATAL; |
+ m_gbContext = NULL; |
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR; |
+ goto failed; |
+ } |
+ m_pModule->JBig2_Free(m_gbContext); |
+ m_gbContext = NULL; |
+ m_pStream->alignByte(); |
+ m_pStream->offset(2); |
+ } |
+ } else { |
+ FXCODEC_STATUS status = |
+ m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, m_pStream, pPause); |
+ while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ m_pGRD->Continue_decode(pPause); |
+ } |
+ if (pSegment->m_Result.im == NULL) { |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
} |
- delete m_pGRD; |
- m_pGRD = NULL; |
- return JBIG2_SUCCESS; |
+ m_pStream->alignByte(); |
+ } |
+ if (pSegment->m_cFlags.s.type != 36) { |
+ if (!m_bBufSpecified) { |
+ JBig2PageInfo* pPageInfo = m_pPageInfoList->getLast(); |
+ if ((pPageInfo->m_bIsStriped == 1) && |
+ (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { |
+ m_pPage->expand(m_ri.y + m_ri.height, |
+ (pPageInfo->m_cFlags & 4) ? 1 : 0); |
+ } |
+ } |
+ FX_RECT Rect = m_pGRD->GetReplaceRect(); |
+ m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, |
+ pSegment->m_Result.im, |
+ (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); |
+ delete pSegment->m_Result.im; |
+ pSegment->m_Result.im = NULL; |
+ } |
+ delete m_pGRD; |
+ m_pGRD = NULL; |
+ return JBIG2_SUCCESS; |
failed: |
- delete m_pGRD; |
- m_pGRD = NULL; |
- return nRet; |
+ delete m_pGRD; |
+ m_pGRD = NULL; |
+ return nRet; |
} |
-int32_t CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment *pSegment) |
-{ |
- FX_DWORD dwTemp; |
- JBig2RegionInfo ri; |
- CJBig2_Segment *pSeg; |
- int32_t i, nRet; |
- uint8_t cFlags; |
- JBig2ArithCtx *grContext; |
- CJBig2_GRRDProc *pGRRD; |
- CJBig2_ArithDecoder *pArithDecoder; |
- JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
- if((parseRegionInfo(&ri) != JBIG2_SUCCESS) |
- || (m_pStream->read1Byte(&cFlags) != 0)) { |
- m_pModule->JBig2_Error("generic refinement region segment : data header too short."); |
+int32_t CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment* pSegment) { |
+ FX_DWORD dwTemp; |
+ JBig2RegionInfo ri; |
+ CJBig2_Segment* pSeg; |
+ int32_t i, nRet; |
+ uint8_t cFlags; |
+ JBig2ArithCtx* grContext; |
+ CJBig2_GRRDProc* pGRRD; |
+ CJBig2_ArithDecoder* pArithDecoder; |
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
+ if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) || |
+ (m_pStream->read1Byte(&cFlags) != 0)) { |
+ m_pModule->JBig2_Error( |
+ "generic refinement region segment : data header too short."); |
+ nRet = JBIG2_ERROR_TOO_SHORT; |
+ goto failed; |
+ } |
+ pGRRD->GRW = ri.width; |
+ pGRRD->GRH = ri.height; |
+ pGRRD->GRTEMPLATE = cFlags & 0x01; |
+ pGRRD->TPGRON = (cFlags >> 1) & 0x01; |
+ if (pGRRD->GRTEMPLATE == 0) { |
+ for (i = 0; i < 4; i++) { |
+ if (m_pStream->read1Byte((uint8_t*)&pGRRD->GRAT[i]) != 0) { |
+ m_pModule->JBig2_Error( |
+ "generic refinement region segment : data header too short."); |
nRet = JBIG2_ERROR_TOO_SHORT; |
goto failed; |
- } |
- pGRRD->GRW = ri.width; |
- pGRRD->GRH = ri.height; |
- pGRRD->GRTEMPLATE = cFlags & 0x01; |
- pGRRD->TPGRON = (cFlags >> 1) & 0x01; |
- if(pGRRD->GRTEMPLATE == 0) { |
- for(i = 0; i < 4; i++) { |
- if(m_pStream->read1Byte((uint8_t*)&pGRRD->GRAT[i]) != 0) { |
- m_pModule->JBig2_Error("generic refinement region segment : data header too short."); |
- nRet = JBIG2_ERROR_TOO_SHORT; |
- goto failed; |
- } |
- } |
- } |
- pSeg = NULL; |
- if(pSegment->m_nReferred_to_segment_count > 0) { |
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); |
- if(pSeg == NULL) { |
- m_pModule->JBig2_Error("generic refinement region segment : can't find refered to segments"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- if((pSeg->m_cFlags.s.type == 4) || (pSeg->m_cFlags.s.type == 20) |
- || (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) { |
- break; |
- } |
- } |
- if(i >= pSegment->m_nReferred_to_segment_count) { |
- m_pModule->JBig2_Error("generic refinement region segment : can't find refered to intermediate region"); |
- nRet = JBIG2_ERROR_FATAL; |
- goto failed; |
- } |
- pGRRD->GRREFERENCE = pSeg->m_Result.im; |
- } else { |
- pGRRD->GRREFERENCE = m_pPage; |
- } |
- pGRRD->GRREFERENCEDX = 0; |
- pGRRD->GRREFERENCEDY = 0; |
- dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13; |
- grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
- JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp); |
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
- pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
- pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext); |
- delete pArithDecoder; |
- if(pSegment->m_Result.im == NULL) { |
- m_pModule->JBig2_Free(grContext); |
+ } |
+ } |
+ } |
+ pSeg = NULL; |
+ if (pSegment->m_nReferred_to_segment_count > 0) { |
+ for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); |
+ if (pSeg == NULL) { |
+ m_pModule->JBig2_Error( |
+ "generic refinement region segment : can't find refered to " |
+ "segments"); |
nRet = JBIG2_ERROR_FATAL; |
goto failed; |
- } |
+ } |
+ if ((pSeg->m_cFlags.s.type == 4) || (pSeg->m_cFlags.s.type == 20) || |
+ (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) { |
+ break; |
+ } |
+ } |
+ if (i >= pSegment->m_nReferred_to_segment_count) { |
+ m_pModule->JBig2_Error( |
+ "generic refinement region segment : can't find refered to " |
+ "intermediate region"); |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ pGRRD->GRREFERENCE = pSeg->m_Result.im; |
+ } else { |
+ pGRRD->GRREFERENCE = m_pPage; |
+ } |
+ pGRRD->GRREFERENCEDX = 0; |
+ pGRRD->GRREFERENCEDY = 0; |
+ dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13; |
+ grContext = |
+ (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp); |
+ JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp); |
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
+ pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext); |
+ delete pArithDecoder; |
+ if (pSegment->m_Result.im == NULL) { |
m_pModule->JBig2_Free(grContext); |
- m_pStream->alignByte(); |
- m_pStream->offset(2); |
- if(pSegment->m_cFlags.s.type != 40) { |
- if(!m_bBufSpecified) { |
- JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast(); |
- if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) { |
- m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
- } |
- } |
- m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03)); |
- delete pSegment->m_Result.im; |
- pSegment->m_Result.im = NULL; |
- } |
- delete pGRRD; |
- return JBIG2_SUCCESS; |
+ nRet = JBIG2_ERROR_FATAL; |
+ goto failed; |
+ } |
+ m_pModule->JBig2_Free(grContext); |
+ m_pStream->alignByte(); |
+ m_pStream->offset(2); |
+ if (pSegment->m_cFlags.s.type != 40) { |
+ if (!m_bBufSpecified) { |
+ JBig2PageInfo* pPageInfo = m_pPageInfoList->getLast(); |
+ if ((pPageInfo->m_bIsStriped == 1) && |
+ (ri.y + ri.height > m_pPage->m_nHeight)) { |
+ m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
+ } |
+ } |
+ m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, |
+ (JBig2ComposeOp)(ri.flags & 0x03)); |
+ delete pSegment->m_Result.im; |
+ pSegment->m_Result.im = NULL; |
+ } |
+ delete pGRRD; |
+ return JBIG2_SUCCESS; |
failed: |
- delete pGRRD; |
- return nRet; |
+ delete pGRRD; |
+ return nRet; |
} |
-int32_t CJBig2_Context::parseTable(CJBig2_Segment *pSegment) |
-{ |
- pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER; |
- JBIG2_ALLOC(pSegment->m_Result.ht, CJBig2_HuffmanTable(m_pStream)); |
- if(!pSegment->m_Result.ht->isOK()) { |
- delete pSegment->m_Result.ht; |
- pSegment->m_Result.ht = NULL; |
- return JBIG2_ERROR_FATAL; |
- } |
- m_pStream->alignByte(); |
- return JBIG2_SUCCESS; |
+int32_t CJBig2_Context::parseTable(CJBig2_Segment* pSegment) { |
+ pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER; |
+ JBIG2_ALLOC(pSegment->m_Result.ht, CJBig2_HuffmanTable(m_pStream)); |
+ if (!pSegment->m_Result.ht->isOK()) { |
+ delete pSegment->m_Result.ht; |
+ pSegment->m_Result.ht = NULL; |
+ return JBIG2_ERROR_FATAL; |
+ } |
+ m_pStream->alignByte(); |
+ return JBIG2_SUCCESS; |
} |
-int32_t CJBig2_Context::parseRegionInfo(JBig2RegionInfo *pRI) |
-{ |
- if((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0) |
- || (m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0) |
- || (m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0) |
- || (m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0) |
- || (m_pStream->read1Byte(&pRI->flags) != 0)) { |
- return JBIG2_ERROR_TOO_SHORT; |
- } |
- return JBIG2_SUCCESS; |
+int32_t CJBig2_Context::parseRegionInfo(JBig2RegionInfo* pRI) { |
+ if ((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0) || |
+ (m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0) || |
+ (m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0) || |
+ (m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0) || |
+ (m_pStream->read1Byte(&pRI->flags) != 0)) { |
+ return JBIG2_ERROR_TOO_SHORT; |
+ } |
+ return JBIG2_SUCCESS; |
} |
-JBig2HuffmanCode *CJBig2_Context::decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream, |
- FX_DWORD SBNUMSYMS) |
-{ |
- JBig2HuffmanCode *SBSYMCODES; |
- int32_t runcodes[35]; |
- int32_t runcodes_len[35]; |
- int32_t runcode; |
- int32_t i; |
- int32_t j; |
- int32_t nVal; |
- int32_t nBits; |
- int32_t run; |
- FX_DWORD nTemp; |
- SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(sizeof(JBig2HuffmanCode), SBNUMSYMS); |
- for (i = 0; i < 35; i ++) { |
- if(pStream->readNBits(4, &runcodes_len[i]) != 0) { |
- goto failed; |
- } |
+JBig2HuffmanCode* CJBig2_Context::decodeSymbolIDHuffmanTable( |
+ CJBig2_BitStream* pStream, |
+ FX_DWORD SBNUMSYMS) { |
+ JBig2HuffmanCode* SBSYMCODES; |
+ int32_t runcodes[35]; |
+ int32_t runcodes_len[35]; |
+ int32_t runcode; |
+ int32_t i; |
+ int32_t j; |
+ int32_t nVal; |
+ int32_t nBits; |
+ int32_t run; |
+ FX_DWORD nTemp; |
+ SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2( |
+ sizeof(JBig2HuffmanCode), SBNUMSYMS); |
+ for (i = 0; i < 35; i++) { |
+ if (pStream->readNBits(4, &runcodes_len[i]) != 0) { |
+ goto failed; |
+ } |
+ } |
+ huffman_assign_code(runcodes, runcodes_len, 35); |
+ i = 0; |
+ while (i < (int)SBNUMSYMS) { |
+ nVal = 0; |
+ nBits = 0; |
+ for (;;) { |
+ if (pStream->read1Bit(&nTemp) != 0) { |
+ goto failed; |
+ } |
+ nVal = (nVal << 1) | nTemp; |
+ nBits++; |
+ for (j = 0; j < 35; j++) { |
+ if ((nBits == runcodes_len[j]) && (nVal == runcodes[j])) { |
+ break; |
+ } |
+ } |
+ if (j < 35) { |
+ break; |
+ } |
+ } |
+ runcode = j; |
+ if (runcode < 32) { |
+ SBSYMCODES[i].codelen = runcode; |
+ run = 0; |
+ } else if (runcode == 32) { |
+ if (pStream->readNBits(2, &nTemp) != 0) { |
+ goto failed; |
+ } |
+ run = nTemp + 3; |
+ } else if (runcode == 33) { |
+ if (pStream->readNBits(3, &nTemp) != 0) { |
+ goto failed; |
+ } |
+ run = nTemp + 3; |
+ } else if (runcode == 34) { |
+ if (pStream->readNBits(7, &nTemp) != 0) { |
+ goto failed; |
+ } |
+ run = nTemp + 11; |
} |
- huffman_assign_code(runcodes, runcodes_len, 35); |
- i = 0; |
- while(i < (int)SBNUMSYMS) { |
- nVal = 0; |
- nBits = 0; |
- for(;;) { |
- if(pStream->read1Bit(&nTemp) != 0) { |
- goto failed; |
- } |
- nVal = (nVal << 1) | nTemp; |
- nBits ++; |
- for(j = 0; j < 35; j++) { |
- if((nBits == runcodes_len[j]) && (nVal == runcodes[j])) { |
- break; |
- } |
- } |
- if(j < 35) { |
- break; |
- } |
- } |
- runcode = j; |
- if(runcode < 32) { |
- SBSYMCODES[i].codelen = runcode; |
- run = 0; |
- } else if(runcode == 32) { |
- if(pStream->readNBits(2, &nTemp) != 0) { |
- goto failed; |
- } |
- run = nTemp + 3; |
- } else if(runcode == 33) { |
- if(pStream->readNBits(3, &nTemp) != 0) { |
- goto failed; |
- } |
- run = nTemp + 3; |
- } else if(runcode == 34) { |
- if(pStream->readNBits(7, &nTemp) != 0) { |
- goto failed; |
- } |
- run = nTemp + 11; |
- } |
- if(run > 0) { |
- if (i + run > (int)SBNUMSYMS) { |
- goto failed; |
- } |
- for(j = 0; j < run; j++) { |
- if(runcode == 32 && i > 0) { |
- SBSYMCODES[i + j].codelen = SBSYMCODES[i - 1].codelen; |
- } else { |
- SBSYMCODES[i + j].codelen = 0; |
- } |
- } |
- i += run; |
+ if (run > 0) { |
+ if (i + run > (int)SBNUMSYMS) { |
+ goto failed; |
+ } |
+ for (j = 0; j < run; j++) { |
+ if (runcode == 32 && i > 0) { |
+ SBSYMCODES[i + j].codelen = SBSYMCODES[i - 1].codelen; |
} else { |
- i ++; |
+ SBSYMCODES[i + j].codelen = 0; |
} |
+ } |
+ i += run; |
+ } else { |
+ i++; |
} |
- huffman_assign_code(SBSYMCODES, SBNUMSYMS); |
- return SBSYMCODES; |
+ } |
+ huffman_assign_code(SBSYMCODES, SBNUMSYMS); |
+ return SBSYMCODES; |
failed: |
- m_pModule->JBig2_Free(SBSYMCODES); |
- return NULL; |
+ m_pModule->JBig2_Free(SBSYMCODES); |
+ return NULL; |
} |
-void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP) |
-{ |
- int CURLEN, LENMAX, CURCODE, CURTEMP, i; |
- int *LENCOUNT; |
- int *FIRSTCODE; |
- LENMAX = 0; |
- for(i = 0; i < NTEMP; i++) { |
- if(PREFLEN[i] > LENMAX) { |
- LENMAX = PREFLEN[i]; |
- } |
- } |
- LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1)); |
- JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1)); |
- FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1)); |
- for(i = 0; i < NTEMP; i++) { |
- LENCOUNT[PREFLEN[i]] ++; |
- } |
- CURLEN = 1; |
- FIRSTCODE[0] = 0; |
- LENCOUNT[0] = 0; |
- while(CURLEN <= LENMAX) { |
- FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1; |
- CURCODE = FIRSTCODE[CURLEN]; |
- CURTEMP = 0; |
- while(CURTEMP < NTEMP) { |
- if(PREFLEN[CURTEMP] == CURLEN) { |
- CODES[CURTEMP] = CURCODE; |
- CURCODE = CURCODE + 1; |
- } |
- CURTEMP = CURTEMP + 1; |
- } |
- CURLEN = CURLEN + 1; |
- } |
- m_pModule->JBig2_Free(LENCOUNT); |
- m_pModule->JBig2_Free(FIRSTCODE); |
+void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP) { |
+ int CURLEN, LENMAX, CURCODE, CURTEMP, i; |
+ int* LENCOUNT; |
+ int* FIRSTCODE; |
+ LENMAX = 0; |
+ for (i = 0; i < NTEMP; i++) { |
+ if (PREFLEN[i] > LENMAX) { |
+ LENMAX = PREFLEN[i]; |
+ } |
+ } |
+ LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1)); |
+ JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1)); |
+ FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1)); |
+ for (i = 0; i < NTEMP; i++) { |
+ LENCOUNT[PREFLEN[i]]++; |
+ } |
+ CURLEN = 1; |
+ FIRSTCODE[0] = 0; |
+ LENCOUNT[0] = 0; |
+ while (CURLEN <= LENMAX) { |
+ FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1; |
+ CURCODE = FIRSTCODE[CURLEN]; |
+ CURTEMP = 0; |
+ while (CURTEMP < NTEMP) { |
+ if (PREFLEN[CURTEMP] == CURLEN) { |
+ CODES[CURTEMP] = CURCODE; |
+ CURCODE = CURCODE + 1; |
+ } |
+ CURTEMP = CURTEMP + 1; |
+ } |
+ CURLEN = CURLEN + 1; |
+ } |
+ m_pModule->JBig2_Free(LENCOUNT); |
+ m_pModule->JBig2_Free(FIRSTCODE); |
} |
-void CJBig2_Context::huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP) |
-{ |
- int CURLEN, LENMAX, CURCODE, CURTEMP, i; |
- int *LENCOUNT; |
- int *FIRSTCODE; |
- LENMAX = 0; |
- for(i = 0; i < NTEMP; i++) { |
- if(SBSYMCODES[i].codelen > LENMAX) { |
- LENMAX = SBSYMCODES[i].codelen; |
- } |
- } |
- LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1)); |
- JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1)); |
- FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1)); |
- for(i = 0; i < NTEMP; i++) { |
- LENCOUNT[SBSYMCODES[i].codelen] ++; |
- } |
- CURLEN = 1; |
- FIRSTCODE[0] = 0; |
- LENCOUNT[0] = 0; |
- while(CURLEN <= LENMAX) { |
- FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1; |
- CURCODE = FIRSTCODE[CURLEN]; |
- CURTEMP = 0; |
- while(CURTEMP < NTEMP) { |
- if(SBSYMCODES[CURTEMP].codelen == CURLEN) { |
- SBSYMCODES[CURTEMP].code = CURCODE; |
- CURCODE = CURCODE + 1; |
- } |
- CURTEMP = CURTEMP + 1; |
- } |
- CURLEN = CURLEN + 1; |
- } |
- m_pModule->JBig2_Free(LENCOUNT); |
- m_pModule->JBig2_Free(FIRSTCODE); |
+void CJBig2_Context::huffman_assign_code(JBig2HuffmanCode* SBSYMCODES, |
+ int NTEMP) { |
+ int CURLEN, LENMAX, CURCODE, CURTEMP, i; |
+ int* LENCOUNT; |
+ int* FIRSTCODE; |
+ LENMAX = 0; |
+ for (i = 0; i < NTEMP; i++) { |
+ if (SBSYMCODES[i].codelen > LENMAX) { |
+ LENMAX = SBSYMCODES[i].codelen; |
+ } |
+ } |
+ LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1)); |
+ JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1)); |
+ FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1)); |
+ for (i = 0; i < NTEMP; i++) { |
+ LENCOUNT[SBSYMCODES[i].codelen]++; |
+ } |
+ CURLEN = 1; |
+ FIRSTCODE[0] = 0; |
+ LENCOUNT[0] = 0; |
+ while (CURLEN <= LENMAX) { |
+ FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1; |
+ CURCODE = FIRSTCODE[CURLEN]; |
+ CURTEMP = 0; |
+ while (CURTEMP < NTEMP) { |
+ if (SBSYMCODES[CURTEMP].codelen == CURLEN) { |
+ SBSYMCODES[CURTEMP].code = CURCODE; |
+ CURCODE = CURCODE + 1; |
+ } |
+ CURTEMP = CURTEMP + 1; |
+ } |
+ CURLEN = CURLEN + 1; |
+ } |
+ m_pModule->JBig2_Free(LENCOUNT); |
+ m_pModule->JBig2_Free(FIRSTCODE); |
} |