| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "JBig2_Context.h" | 7 #include "JBig2_Context.h" |
| 8 | 8 |
| 9 #include <list> | 9 #include <list> |
| 10 | 10 |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 } else { | 561 } else { |
| 562 CJBig2_Segment* pSeg = | 562 CJBig2_Segment* pSeg = |
| 563 findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex); | 563 findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex); |
| 564 if (!pSeg) | 564 if (!pSeg) |
| 565 return JBIG2_ERROR_FATAL; | 565 return JBIG2_ERROR_FATAL; |
| 566 pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht; | 566 pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht; |
| 567 } | 567 } |
| 568 } | 568 } |
| 569 } | 569 } |
| 570 | 570 |
| 571 nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext; | 571 const bool bUseGbContext = (pSymbolDictDecoder->SDHUFF == 0); |
| 572 nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> grContext; | 572 const bool bUseGrContext = (pSymbolDictDecoder->SDREFAGG == 1); |
| 573 if ((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) { | 573 const size_t gbContextSize = |
| 574 if (pSymbolDictDecoder->SDHUFF == 0) { | 574 GetHuffContextSize(pSymbolDictDecoder->SDTEMPLATE); |
| 575 const size_t size = GetHuffContextSize(pSymbolDictDecoder->SDTEMPLATE); | 575 const size_t grContextSize = |
| 576 gbContext.reset(FX_Alloc(JBig2ArithCtx, size)); | 576 GetRefAggContextSize(pSymbolDictDecoder->SDRTEMPLATE); |
| 577 JBIG2_memcpy(gbContext.get(), pLRSeg->m_Result.sd->m_gbContext, | 577 std::vector<JBig2ArithCtx> gbContext; |
| 578 sizeof(JBig2ArithCtx) * size); | 578 std::vector<JBig2ArithCtx> grContext; |
| 579 if ((wFlags & 0x0100) && pLRSeg) { |
| 580 if (bUseGbContext) { |
| 581 gbContext = pLRSeg->m_Result.sd->GbContext(); |
| 582 if (gbContext.size() != gbContextSize) |
| 583 return JBIG2_ERROR_FATAL; |
| 579 } | 584 } |
| 580 if (pSymbolDictDecoder->SDREFAGG == 1) { | 585 if (bUseGrContext) { |
| 581 const size_t size = GetRefAggContextSize(pSymbolDictDecoder->SDRTEMPLATE); | 586 grContext = pLRSeg->m_Result.sd->GrContext(); |
| 582 grContext.reset(FX_Alloc(JBig2ArithCtx, size)); | 587 if (grContext.size() != grContextSize) |
| 583 JBIG2_memcpy(grContext.get(), pLRSeg->m_Result.sd->m_grContext, | 588 return JBIG2_ERROR_FATAL; |
| 584 sizeof(JBig2ArithCtx) * size); | |
| 585 } | 589 } |
| 586 } else { | 590 } else { |
| 587 if (pSymbolDictDecoder->SDHUFF == 0) { | 591 if (bUseGbContext) |
| 588 const size_t size = GetHuffContextSize(pSymbolDictDecoder->SDTEMPLATE); | 592 gbContext.resize(gbContextSize); |
| 589 gbContext.reset(FX_Alloc(JBig2ArithCtx, size)); | 593 if (bUseGrContext) |
| 590 JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * size); | 594 grContext.resize(grContextSize); |
| 591 } | |
| 592 if (pSymbolDictDecoder->SDREFAGG == 1) { | |
| 593 const size_t size = GetRefAggContextSize(pSymbolDictDecoder->SDRTEMPLATE); | |
| 594 grContext.reset(FX_Alloc(JBig2ArithCtx, size)); | |
| 595 JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * size); | |
| 596 } | |
| 597 } | 595 } |
| 596 |
| 598 CJBig2_CacheKey key = | 597 CJBig2_CacheKey key = |
| 599 CJBig2_CacheKey(pSegment->m_dwObjNum, pSegment->m_dwDataOffset); | 598 CJBig2_CacheKey(pSegment->m_dwObjNum, pSegment->m_dwDataOffset); |
| 600 FX_BOOL cache_hit = false; | 599 FX_BOOL cache_hit = false; |
| 601 pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER; | 600 pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER; |
| 602 if (m_bIsGlobal && key.first != 0) { | 601 if (m_bIsGlobal && key.first != 0) { |
| 603 for (auto it = m_pSymbolDictCache->begin(); it != m_pSymbolDictCache->end(); | 602 for (auto it = m_pSymbolDictCache->begin(); it != m_pSymbolDictCache->end(); |
| 604 ++it) { | 603 ++it) { |
| 605 if (it->first == key) { | 604 if (it->first == key) { |
| 606 nonstd::unique_ptr<CJBig2_SymbolDict> copy(it->second->DeepCopy()); | 605 nonstd::unique_ptr<CJBig2_SymbolDict> copy(it->second->DeepCopy()); |
| 607 pSegment->m_Result.sd = copy.release(); | 606 pSegment->m_Result.sd = copy.release(); |
| 608 m_pSymbolDictCache->push_front(*it); | 607 m_pSymbolDictCache->push_front(*it); |
| 609 m_pSymbolDictCache->erase(it); | 608 m_pSymbolDictCache->erase(it); |
| 610 cache_hit = true; | 609 cache_hit = true; |
| 611 break; | 610 break; |
| 612 } | 611 } |
| 613 } | 612 } |
| 614 } | 613 } |
| 615 if (!cache_hit) { | 614 if (!cache_hit) { |
| 616 if (pSymbolDictDecoder->SDHUFF == 0) { | 615 if (bUseGbContext) { |
| 617 nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder( | 616 nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder( |
| 618 new CJBig2_ArithDecoder(m_pStream.get())); | 617 new CJBig2_ArithDecoder(m_pStream.get())); |
| 619 pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith( | 618 pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith( |
| 620 pArithDecoder.get(), gbContext.get(), grContext.get()); | 619 pArithDecoder.get(), &gbContext, &grContext); |
| 621 if (!pSegment->m_Result.sd) | 620 if (!pSegment->m_Result.sd) |
| 622 return JBIG2_ERROR_FATAL; | 621 return JBIG2_ERROR_FATAL; |
| 623 | 622 |
| 624 m_pStream->alignByte(); | 623 m_pStream->alignByte(); |
| 625 m_pStream->offset(2); | 624 m_pStream->offset(2); |
| 626 } else { | 625 } else { |
| 627 pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman( | 626 pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman( |
| 628 m_pStream.get(), gbContext.get(), grContext.get(), pPause); | 627 m_pStream.get(), &gbContext, &grContext, pPause); |
| 629 if (!pSegment->m_Result.sd) | 628 if (!pSegment->m_Result.sd) |
| 630 return JBIG2_ERROR_FATAL; | 629 return JBIG2_ERROR_FATAL; |
| 631 m_pStream->alignByte(); | 630 m_pStream->alignByte(); |
| 632 } | 631 } |
| 633 if (m_bIsGlobal && kSymbolDictCacheMaxSize > 0) { | 632 if (m_bIsGlobal && kSymbolDictCacheMaxSize > 0) { |
| 634 nonstd::unique_ptr<CJBig2_SymbolDict> value = | 633 nonstd::unique_ptr<CJBig2_SymbolDict> value = |
| 635 pSegment->m_Result.sd->DeepCopy(); | 634 pSegment->m_Result.sd->DeepCopy(); |
| 636 if (value) { | 635 while (m_pSymbolDictCache->size() >= kSymbolDictCacheMaxSize) { |
| 637 while (m_pSymbolDictCache->size() >= kSymbolDictCacheMaxSize) { | 636 delete m_pSymbolDictCache->back().second; |
| 638 delete m_pSymbolDictCache->back().second; | 637 m_pSymbolDictCache->pop_back(); |
| 639 m_pSymbolDictCache->pop_back(); | |
| 640 } | |
| 641 m_pSymbolDictCache->push_front(CJBig2_CachePair(key, value.release())); | |
| 642 } | 638 } |
| 639 m_pSymbolDictCache->push_front(CJBig2_CachePair(key, value.release())); |
| 643 } | 640 } |
| 644 } | 641 } |
| 645 if (wFlags & 0x0200) { | 642 if (wFlags & 0x0200) { |
| 646 pSegment->m_Result.sd->m_bContextRetained = TRUE; | 643 if (bUseGbContext) |
| 647 if (pSymbolDictDecoder->SDHUFF == 0) { | 644 pSegment->m_Result.sd->SetGbContext(gbContext); |
| 648 pSegment->m_Result.sd->m_gbContext = gbContext.release(); | 645 if (bUseGrContext) |
| 649 } | 646 pSegment->m_Result.sd->SetGrContext(grContext); |
| 650 if (pSymbolDictDecoder->SDREFAGG == 1) { | |
| 651 pSegment->m_Result.sd->m_grContext = grContext.release(); | |
| 652 } | |
| 653 } | 647 } |
| 654 return JBIG2_SUCCESS; | 648 return JBIG2_SUCCESS; |
| 655 } | 649 } |
| 656 | 650 |
| 657 int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) { | 651 int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) { |
| 658 FX_WORD wFlags; | 652 FX_WORD wFlags; |
| 659 JBig2RegionInfo ri; | 653 JBig2RegionInfo ri; |
| 660 if (parseRegionInfo(&ri) != JBIG2_SUCCESS || | 654 if (parseRegionInfo(&ri) != JBIG2_SUCCESS || |
| 661 m_pStream->readShortInteger(&wFlags) != 0) { | 655 m_pStream->readShortInteger(&wFlags) != 0) { |
| 662 return JBIG2_ERROR_TOO_SHORT; | 656 return JBIG2_ERROR_TOO_SHORT; |
| (...skipping 763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1426 SBSYMCODES[CURTEMP].code = CURCODE; | 1420 SBSYMCODES[CURTEMP].code = CURCODE; |
| 1427 CURCODE = CURCODE + 1; | 1421 CURCODE = CURCODE + 1; |
| 1428 } | 1422 } |
| 1429 CURTEMP = CURTEMP + 1; | 1423 CURTEMP = CURTEMP + 1; |
| 1430 } | 1424 } |
| 1431 CURLEN = CURLEN + 1; | 1425 CURLEN = CURLEN + 1; |
| 1432 } | 1426 } |
| 1433 FX_Free(LENCOUNT); | 1427 FX_Free(LENCOUNT); |
| 1434 FX_Free(FIRSTCODE); | 1428 FX_Free(FIRSTCODE); |
| 1435 } | 1429 } |
| OLD | NEW |