| 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 c004c875037881d09723c6c9da8148b14e36ad79..bd2421e3f94715255a25093a2ad118e342e2afd4 100644
|
| --- a/core/src/fxcodec/jbig2/JBig2_Context.cpp
|
| +++ b/core/src/fxcodec/jbig2/JBig2_Context.cpp
|
| @@ -29,93 +29,49 @@ CJBig2_Context* CJBig2_Context::CreateContext(
|
| FX_DWORD dwGlobalLength,
|
| const uint8_t* pData,
|
| FX_DWORD dwLength,
|
| - int32_t nStreamType,
|
| std::list<CJBig2_CachePair>* pSymbolDictCache,
|
| IFX_Pause* pPause) {
|
| return new CJBig2_Context(pGlobalData, dwGlobalLength, pData, dwLength,
|
| - nStreamType, pSymbolDictCache, pPause);
|
| + pSymbolDictCache, pPause);
|
| }
|
| +
|
| void CJBig2_Context::DestroyContext(CJBig2_Context* pContext) {
|
| delete pContext;
|
| }
|
| +
|
| CJBig2_Context::CJBig2_Context(const uint8_t* pGlobalData,
|
| FX_DWORD dwGlobalLength,
|
| const uint8_t* pData,
|
| FX_DWORD dwLength,
|
| - int32_t nStreamType,
|
| std::list<CJBig2_CachePair>* pSymbolDictCache,
|
| - IFX_Pause* pPause) {
|
| + IFX_Pause* pPause)
|
| + : m_nSegmentDecoded(0),
|
| + m_bInPage(false),
|
| + m_bBufSpecified(false),
|
| + m_PauseStep(10),
|
| + m_pPause(pPause),
|
| + m_ProcessingStatus(FXCODEC_STATUS_FRAME_READY),
|
| + m_pArithDecoder(NULL),
|
| + m_gbContext(NULL),
|
| + m_dwOffset(0),
|
| + m_pSymbolDictCache(pSymbolDictCache) {
|
| if (pGlobalData && (dwGlobalLength > 0)) {
|
| - m_pGlobalContext =
|
| - new CJBig2_Context(NULL, 0, pGlobalData, dwGlobalLength,
|
| - JBIG2_EMBED_STREAM, pSymbolDictCache, pPause);
|
| + m_pGlobalContext = new CJBig2_Context(
|
| + nullptr, 0, pGlobalData, dwGlobalLength, pSymbolDictCache, pPause);
|
| } else {
|
| - m_pGlobalContext = NULL;
|
| - }
|
| - m_pStream = new CJBig2_BitStream(pData, dwLength);
|
| - m_nStreamType = nStreamType;
|
| - m_nState = JBIG2_OUT_OF_PAGE;
|
| - 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_dwOffset = 0;
|
| - m_ProcessingStatus = FXCODEC_STATUS_FRAME_READY;
|
| - m_pSymbolDictCache = pSymbolDictCache;
|
| + m_pGlobalContext = nullptr;
|
| + }
|
| +
|
| + m_pStream.reset(new CJBig2_BitStream(pData, dwLength));
|
| }
|
| +
|
| CJBig2_Context::~CJBig2_Context() {
|
| delete m_pArithDecoder;
|
| m_pArithDecoder = NULL;
|
| - delete m_pGRD;
|
| - m_pGRD = NULL;
|
| FX_Free(m_gbContext);
|
| m_gbContext = NULL;
|
| delete m_pGlobalContext;
|
| m_pGlobalContext = NULL;
|
| - if (m_bBufSpecified) {
|
| - delete m_pPage;
|
| - }
|
| - m_pPage = NULL;
|
| - delete m_pStream;
|
| - m_pStream = NULL;
|
| -}
|
| -
|
| -int32_t CJBig2_Context::decodeFile(IFX_Pause* pPause) {
|
| - if (m_pStream->getByteLeft() < 8)
|
| - return JBIG2_ERROR_TOO_SHORT;
|
| -
|
| - const uint8_t fileID[] = {0x97, 0x4A, 0x42, 0x32, 0x0D, 0x0A, 0x1A, 0x0A};
|
| - if (JBIG2_memcmp(m_pStream->getPointer(), fileID, 8) != 0)
|
| - return JBIG2_ERROR_FILE_FORMAT;
|
| -
|
| - m_pStream->offset(8);
|
| -
|
| - uint8_t cFlags;
|
| - if (m_pStream->read1Byte(&cFlags) != 0)
|
| - return JBIG2_ERROR_TOO_SHORT;
|
| -
|
| - if (!(cFlags & 0x02)) {
|
| - FX_DWORD dwTemp;
|
| - if (m_pStream->readInteger(&dwTemp) != 0)
|
| - return JBIG2_ERROR_TOO_SHORT;
|
| -
|
| - if (dwTemp > 0) {
|
| - m_PageInfoList.clear();
|
| - m_PageInfoList.resize(dwTemp);
|
| - }
|
| - }
|
| -
|
| - if (cFlags & 0x01) {
|
| - m_nStreamType = JBIG2_SQUENTIAL_STREAM;
|
| - return decode_SquentialOrgnazation(pPause);
|
| - }
|
| -
|
| - m_nStreamType = JBIG2_RANDOM_STREAM;
|
| - return decode_RandomOrgnazation_FirstPage(pPause);
|
| }
|
|
|
| int32_t CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause) {
|
| @@ -148,7 +104,7 @@ int32_t CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause) {
|
| return nRet;
|
| }
|
| if (m_pSegment->m_dwData_length != 0xffffffff) {
|
| - m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length;
|
| + m_dwOffset += m_pSegment->m_dwData_length;
|
| m_pStream->setOffset(m_dwOffset);
|
| } else {
|
| m_pStream->offset(4);
|
| @@ -217,44 +173,21 @@ int32_t CJBig2_Context::getFirstPage(uint8_t* pBuf,
|
| return nRet;
|
| }
|
| }
|
| - m_bFirstPage = TRUE;
|
| m_PauseStep = 0;
|
| - delete m_pPage;
|
| - m_pPage = new CJBig2_Image(width, height, stride, pBuf);
|
| - m_bBufSpecified = TRUE;
|
| - if (m_pPage && pPause && pPause->NeedToPauseNow()) {
|
| + m_pPage.reset(new CJBig2_Image(width, height, stride, pBuf));
|
| + m_bBufSpecified = true;
|
| + if (pPause && pPause->NeedToPauseNow()) {
|
| m_PauseStep = 1;
|
| m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
|
| return nRet;
|
| }
|
| - int ret = Continue(pPause);
|
| - return ret;
|
| + return Continue(pPause);
|
| }
|
| int32_t CJBig2_Context::Continue(IFX_Pause* pPause) {
|
| m_ProcessingStatus = 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_ProcessingStatus = FXCODEC_STATUS_ERROR;
|
| - return JBIG2_ERROR_STREAM_TYPE;
|
| - }
|
| + nRet = decode_EmbedOrgnazation(pPause);
|
| } else if (m_PauseStep == 2) {
|
| nRet = decode_SquentialOrgnazation(pPause);
|
| } else if (m_PauseStep == 3) {
|
| @@ -280,19 +213,7 @@ int32_t CJBig2_Context::Continue(IFX_Pause* pPause) {
|
| }
|
| 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);
|
| -}
|
| +
|
| CJBig2_Segment* CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber) {
|
| CJBig2_Segment* pSeg;
|
| if (m_pGlobalContext) {
|
| @@ -421,7 +342,7 @@ int32_t CJBig2_Context::ProcessingParseSegmentData(CJBig2_Segment* pSegment,
|
| case 4:
|
| case 6:
|
| case 7:
|
| - if (m_nState == JBIG2_OUT_OF_PAGE)
|
| + if (!m_bInPage)
|
| return JBIG2_ERROR_FATAL;
|
| return parseTextRegion(pSegment);
|
| case 16:
|
| @@ -429,19 +350,19 @@ int32_t CJBig2_Context::ProcessingParseSegmentData(CJBig2_Segment* pSegment,
|
| case 20:
|
| case 22:
|
| case 23:
|
| - if (m_nState == JBIG2_OUT_OF_PAGE)
|
| + if (!m_bInPage)
|
| return JBIG2_ERROR_FATAL;
|
| return parseHalftoneRegion(pSegment, pPause);
|
| case 36:
|
| case 38:
|
| case 39:
|
| - if (m_nState == JBIG2_OUT_OF_PAGE)
|
| + if (!m_bInPage)
|
| return JBIG2_ERROR_FATAL;
|
| return parseGenericRegion(pSegment, pPause);
|
| case 40:
|
| case 42:
|
| case 43:
|
| - if (m_nState == JBIG2_OUT_OF_PAGE)
|
| + if (!m_bInPage)
|
| return JBIG2_ERROR_FATAL;
|
| return parseGenericRefinementRegion(pSegment);
|
| case 48: {
|
| @@ -462,10 +383,9 @@ int32_t CJBig2_Context::ProcessingParseSegmentData(CJBig2_Segment* pSegment,
|
| pPageInfo->m_bIsStriped = TRUE;
|
|
|
| if (!m_bBufSpecified) {
|
| - delete m_pPage;
|
| FX_DWORD height =
|
| bMaxHeight ? pPageInfo->m_wMaxStripeSize : pPageInfo->m_dwHeight;
|
| - m_pPage = new CJBig2_Image(pPageInfo->m_dwWidth, height);
|
| + m_pPage.reset(new CJBig2_Image(pPageInfo->m_dwWidth, height));
|
| }
|
|
|
| if (!m_pPage->m_pData) {
|
| @@ -475,10 +395,10 @@ int32_t CJBig2_Context::ProcessingParseSegmentData(CJBig2_Segment* pSegment,
|
|
|
| m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0);
|
| m_PageInfoList.push_back(pPageInfo.release());
|
| - m_nState = JBIG2_IN_PAGE;
|
| + m_bInPage = true;
|
| } break;
|
| case 49:
|
| - m_nState = JBIG2_OUT_OF_PAGE;
|
| + m_bInPage = false;
|
| return JBIG2_END_OF_PAGE;
|
| break;
|
| case 50:
|
| @@ -709,7 +629,7 @@ int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment,
|
| }
|
| if (!cache_hit) {
|
| if (pSymbolDictDecoder->SDHUFF == 0) {
|
| - pArithDecoder = new CJBig2_ArithDecoder(m_pStream);
|
| + pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
|
| pSegment->m_Result.sd =
|
| pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext);
|
| delete pArithDecoder;
|
| @@ -721,7 +641,7 @@ int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment,
|
| m_pStream->offset(2);
|
| } else {
|
| pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman(
|
| - m_pStream, gbContext, grContext, pPause);
|
| + m_pStream.get(), gbContext, grContext, pPause);
|
| if (pSegment->m_Result.sd == NULL) {
|
| nRet = JBIG2_ERROR_FATAL;
|
| goto failed;
|
| @@ -873,7 +793,7 @@ int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) {
|
| pTRD->SBSYMS = NULL;
|
| }
|
| if (pTRD->SBHUFF == 1) {
|
| - SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream, pTRD->SBNUMSYMS);
|
| + SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream.get(), pTRD->SBNUMSYMS);
|
| if (SBSYMCODES == NULL) {
|
| nRet = JBIG2_ERROR_FATAL;
|
| goto failed;
|
| @@ -1062,7 +982,7 @@ int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) {
|
| JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
|
| }
|
| if (pTRD->SBHUFF == 0) {
|
| - pArithDecoder = new CJBig2_ArithDecoder(m_pStream);
|
| + pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
|
| pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
|
| pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext);
|
| delete pArithDecoder;
|
| @@ -1074,7 +994,7 @@ int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) {
|
| m_pStream->offset(2);
|
| } else {
|
| pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
|
| - pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream, grContext);
|
| + pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream.get(), grContext);
|
| if (pSegment->m_Result.im == NULL) {
|
| nRet = JBIG2_ERROR_FATAL;
|
| goto failed;
|
| @@ -1156,7 +1076,7 @@ int32_t CJBig2_Context::parsePatternDict(CJBig2_Segment* pSegment,
|
| pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024;
|
| gbContext = FX_Alloc(JBig2ArithCtx, dwTemp);
|
| JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
|
| - pArithDecoder = new CJBig2_ArithDecoder(m_pStream);
|
| + pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
|
| pSegment->m_Result.pd =
|
| pPDD->decode_Arith(pArithDecoder, gbContext, pPause);
|
| delete pArithDecoder;
|
| @@ -1169,7 +1089,7 @@ int32_t CJBig2_Context::parsePatternDict(CJBig2_Segment* pSegment,
|
| m_pStream->alignByte();
|
| m_pStream->offset(2);
|
| } else {
|
| - pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream, pPause);
|
| + pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream.get(), pPause);
|
| if (pSegment->m_Result.pd == NULL) {
|
| nRet = JBIG2_ERROR_FATAL;
|
| goto failed;
|
| @@ -1234,7 +1154,7 @@ int32_t CJBig2_Context::parseHalftoneRegion(CJBig2_Segment* pSegment,
|
| dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024;
|
| gbContext = FX_Alloc(JBig2ArithCtx, dwTemp);
|
| JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
|
| - pArithDecoder = new CJBig2_ArithDecoder(m_pStream);
|
| + pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
|
| pSegment->m_Result.im =
|
| pHRD->decode_Arith(pArithDecoder, gbContext, pPause);
|
| delete pArithDecoder;
|
| @@ -1247,7 +1167,7 @@ int32_t CJBig2_Context::parseHalftoneRegion(CJBig2_Segment* pSegment,
|
| m_pStream->alignByte();
|
| m_pStream->offset(2);
|
| } else {
|
| - pSegment->m_Result.im = pHRD->decode_MMR(m_pStream, pPause);
|
| + pSegment->m_Result.im = pHRD->decode_MMR(m_pStream.get(), pPause);
|
| if (pSegment->m_Result.im == NULL) {
|
| nRet = JBIG2_ERROR_FATAL;
|
| goto failed;
|
| @@ -1279,8 +1199,8 @@ int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment,
|
| FX_DWORD dwTemp;
|
| uint8_t cFlags;
|
| int32_t i, nRet;
|
| - if (m_pGRD == NULL) {
|
| - m_pGRD = new CJBig2_GRDProc();
|
| + if (!m_pGRD) {
|
| + m_pGRD.reset(new CJBig2_GRDProc);
|
| if ((parseRegionInfo(&m_ri) != JBIG2_SUCCESS) ||
|
| (m_pStream->read1Byte(&cFlags) != 0)) {
|
| nRet = JBIG2_ERROR_TOO_SHORT;
|
| @@ -1323,7 +1243,7 @@ int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment,
|
| JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
|
| }
|
| if (m_pArithDecoder == NULL) {
|
| - m_pArithDecoder = new CJBig2_ArithDecoder(m_pStream);
|
| + m_pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
|
| m_ProcessingStatus = m_pGRD->Start_decode_Arith(
|
| &pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause);
|
| } else {
|
| @@ -1361,8 +1281,8 @@ int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment,
|
| m_pStream->offset(2);
|
| }
|
| } else {
|
| - FXCODEC_STATUS status =
|
| - m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, m_pStream, pPause);
|
| + FXCODEC_STATUS status = m_pGRD->Start_decode_MMR(&pSegment->m_Result.im,
|
| + m_pStream.get(), pPause);
|
| while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
|
| m_pGRD->Continue_decode(pPause);
|
| }
|
| @@ -1388,12 +1308,10 @@ int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment,
|
| delete pSegment->m_Result.im;
|
| pSegment->m_Result.im = NULL;
|
| }
|
| - delete m_pGRD;
|
| - m_pGRD = NULL;
|
| + m_pGRD.reset();
|
| return JBIG2_SUCCESS;
|
| failed:
|
| - delete m_pGRD;
|
| - m_pGRD = NULL;
|
| + m_pGRD.reset();
|
| return nRet;
|
| }
|
|
|
| @@ -1442,14 +1360,14 @@ int32_t CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment* pSegment) {
|
| }
|
| pGRRD->GRREFERENCE = pSeg->m_Result.im;
|
| } else {
|
| - pGRRD->GRREFERENCE = m_pPage;
|
| + pGRRD->GRREFERENCE = m_pPage.get();
|
| }
|
| pGRRD->GRREFERENCEDX = 0;
|
| pGRRD->GRREFERENCEDY = 0;
|
| dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13;
|
| grContext = FX_Alloc(JBig2ArithCtx, dwTemp);
|
| JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
|
| - pArithDecoder = new CJBig2_ArithDecoder(m_pStream);
|
| + pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
|
| pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
|
| pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext);
|
| delete pArithDecoder;
|
| @@ -1482,7 +1400,7 @@ failed:
|
| }
|
| int32_t CJBig2_Context::parseTable(CJBig2_Segment* pSegment) {
|
| pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER;
|
| - pSegment->m_Result.ht = new CJBig2_HuffmanTable(m_pStream);
|
| + pSegment->m_Result.ht = new CJBig2_HuffmanTable(m_pStream.get());
|
| if (!pSegment->m_Result.ht->isOK()) {
|
| delete pSegment->m_Result.ht;
|
| pSegment->m_Result.ht = NULL;
|
|
|