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 "core/fxcodec/jbig2/JBig2_Context.h" | 7 #include "core/fxcodec/jbig2/JBig2_Context.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <list> | 10 #include <list> |
11 #include <utility> | 11 #include <utility> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "core/fpdfapi/parser/cpdf_stream.h" | 14 #include "core/fpdfapi/parser/cpdf_stream.h" |
15 #include "core/fpdfapi/parser/cpdf_stream_acc.h" | 15 #include "core/fpdfapi/parser/cpdf_stream_acc.h" |
16 #include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" | 16 #include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" |
17 #include "core/fxcodec/jbig2/JBig2_BitStream.h" | 17 #include "core/fxcodec/jbig2/JBig2_BitStream.h" |
18 #include "core/fxcodec/jbig2/JBig2_GrdProc.h" | 18 #include "core/fxcodec/jbig2/JBig2_GrdProc.h" |
19 #include "core/fxcodec/jbig2/JBig2_GrrdProc.h" | 19 #include "core/fxcodec/jbig2/JBig2_GrrdProc.h" |
20 #include "core/fxcodec/jbig2/JBig2_HtrdProc.h" | 20 #include "core/fxcodec/jbig2/JBig2_HtrdProc.h" |
21 #include "core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" | 21 #include "core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" |
22 #include "core/fxcodec/jbig2/JBig2_PddProc.h" | 22 #include "core/fxcodec/jbig2/JBig2_PddProc.h" |
23 #include "core/fxcodec/jbig2/JBig2_SddProc.h" | 23 #include "core/fxcodec/jbig2/JBig2_SddProc.h" |
24 #include "core/fxcodec/jbig2/JBig2_TrdProc.h" | 24 #include "core/fxcodec/jbig2/JBig2_TrdProc.h" |
| 25 #include "third_party/base/ptr_util.h" |
25 #include "third_party/base/stl_util.h" | 26 #include "third_party/base/stl_util.h" |
26 | 27 |
27 namespace { | 28 namespace { |
28 | 29 |
29 size_t GetHuffContextSize(uint8_t val) { | 30 size_t GetHuffContextSize(uint8_t val) { |
30 return val == 0 ? 65536 : val == 1 ? 8192 : 1024; | 31 return val == 0 ? 65536 : val == 1 ? 8192 : 1024; |
31 } | 32 } |
32 | 33 |
33 size_t GetRefAggContextSize(bool val) { | 34 size_t GetRefAggContextSize(bool val) { |
34 return val ? 1024 : 8192; | 35 return val ? 1024 : 8192; |
(...skipping 18 matching lines...) Expand all Loading... |
53 : m_nSegmentDecoded(0), | 54 : m_nSegmentDecoded(0), |
54 m_bInPage(false), | 55 m_bInPage(false), |
55 m_bBufSpecified(false), | 56 m_bBufSpecified(false), |
56 m_PauseStep(10), | 57 m_PauseStep(10), |
57 m_pPause(pPause), | 58 m_pPause(pPause), |
58 m_ProcessingStatus(FXCODEC_STATUS_FRAME_READY), | 59 m_ProcessingStatus(FXCODEC_STATUS_FRAME_READY), |
59 m_dwOffset(0), | 60 m_dwOffset(0), |
60 m_pSymbolDictCache(pSymbolDictCache), | 61 m_pSymbolDictCache(pSymbolDictCache), |
61 m_bIsGlobal(bIsGlobal) { | 62 m_bIsGlobal(bIsGlobal) { |
62 if (pGlobalStream && (pGlobalStream->GetSize() > 0)) { | 63 if (pGlobalStream && (pGlobalStream->GetSize() > 0)) { |
63 m_pGlobalContext.reset(new CJBig2_Context(nullptr, pGlobalStream, | 64 m_pGlobalContext = pdfium::MakeUnique<CJBig2_Context>( |
64 pSymbolDictCache, pPause, true)); | 65 nullptr, pGlobalStream, pSymbolDictCache, pPause, true); |
65 } | 66 } |
66 m_pStream.reset(new CJBig2_BitStream(pSrcStream)); | 67 m_pStream = pdfium::MakeUnique<CJBig2_BitStream>(pSrcStream); |
67 } | 68 } |
68 | 69 |
69 CJBig2_Context::~CJBig2_Context() {} | 70 CJBig2_Context::~CJBig2_Context() {} |
70 | 71 |
71 int32_t CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause) { | 72 int32_t CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause) { |
72 int32_t nRet; | 73 int32_t nRet; |
73 if (m_pStream->getByteLeft() <= 0) | 74 if (m_pStream->getByteLeft() <= 0) |
74 return JBIG2_END_OF_FILE; | 75 return JBIG2_END_OF_FILE; |
75 | 76 |
76 while (m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) { | 77 while (m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) { |
77 if (!m_pSegment) { | 78 if (!m_pSegment) { |
78 m_pSegment.reset(new CJBig2_Segment); | 79 m_pSegment = pdfium::MakeUnique<CJBig2_Segment>(); |
79 nRet = parseSegmentHeader(m_pSegment.get()); | 80 nRet = parseSegmentHeader(m_pSegment.get()); |
80 if (nRet != JBIG2_SUCCESS) { | 81 if (nRet != JBIG2_SUCCESS) { |
81 m_pSegment.reset(); | 82 m_pSegment.reset(); |
82 return nRet; | 83 return nRet; |
83 } | 84 } |
84 m_dwOffset = m_pStream->getOffset(); | 85 m_dwOffset = m_pStream->getOffset(); |
85 } | 86 } |
86 nRet = parseSegmentData(m_pSegment.get(), pPause); | 87 nRet = parseSegmentData(m_pSegment.get(), pPause); |
87 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 88 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
88 m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | 89 m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 IFX_Pause* pPause) { | 166 IFX_Pause* pPause) { |
166 int32_t nRet = 0; | 167 int32_t nRet = 0; |
167 if (m_pGlobalContext) { | 168 if (m_pGlobalContext) { |
168 nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause); | 169 nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause); |
169 if (nRet != JBIG2_SUCCESS) { | 170 if (nRet != JBIG2_SUCCESS) { |
170 m_ProcessingStatus = FXCODEC_STATUS_ERROR; | 171 m_ProcessingStatus = FXCODEC_STATUS_ERROR; |
171 return nRet; | 172 return nRet; |
172 } | 173 } |
173 } | 174 } |
174 m_PauseStep = 0; | 175 m_PauseStep = 0; |
175 m_pPage.reset(new CJBig2_Image(width, height, stride, pBuf)); | 176 m_pPage = pdfium::MakeUnique<CJBig2_Image>(width, height, stride, pBuf); |
176 m_bBufSpecified = true; | 177 m_bBufSpecified = true; |
177 if (pPause && pPause->NeedToPauseNow()) { | 178 if (pPause && pPause->NeedToPauseNow()) { |
178 m_PauseStep = 1; | 179 m_PauseStep = 1; |
179 m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | 180 m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
180 return nRet; | 181 return nRet; |
181 } | 182 } |
182 return Continue(pPause); | 183 return Continue(pPause); |
183 } | 184 } |
184 | 185 |
185 int32_t CJBig2_Context::Continue(IFX_Pause* pPause) { | 186 int32_t CJBig2_Context::Continue(IFX_Pause* pPause) { |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 } | 377 } |
377 pPageInfo->m_bIsStriped = !!(wTemp & 0x8000); | 378 pPageInfo->m_bIsStriped = !!(wTemp & 0x8000); |
378 pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff; | 379 pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff; |
379 bool bMaxHeight = (pPageInfo->m_dwHeight == 0xffffffff); | 380 bool bMaxHeight = (pPageInfo->m_dwHeight == 0xffffffff); |
380 if (bMaxHeight && pPageInfo->m_bIsStriped != true) | 381 if (bMaxHeight && pPageInfo->m_bIsStriped != true) |
381 pPageInfo->m_bIsStriped = true; | 382 pPageInfo->m_bIsStriped = true; |
382 | 383 |
383 if (!m_bBufSpecified) { | 384 if (!m_bBufSpecified) { |
384 uint32_t height = | 385 uint32_t height = |
385 bMaxHeight ? pPageInfo->m_wMaxStripeSize : pPageInfo->m_dwHeight; | 386 bMaxHeight ? pPageInfo->m_wMaxStripeSize : pPageInfo->m_dwHeight; |
386 m_pPage.reset(new CJBig2_Image(pPageInfo->m_dwWidth, height)); | 387 m_pPage = |
| 388 pdfium::MakeUnique<CJBig2_Image>(pPageInfo->m_dwWidth, height); |
387 } | 389 } |
388 | 390 |
389 if (!m_pPage->m_pData) { | 391 if (!m_pPage->m_pData) { |
390 m_ProcessingStatus = FXCODEC_STATUS_ERROR; | 392 m_ProcessingStatus = FXCODEC_STATUS_ERROR; |
391 return JBIG2_ERROR_TOO_SHORT; | 393 return JBIG2_ERROR_TOO_SHORT; |
392 } | 394 } |
393 | 395 |
394 m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0); | 396 m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0); |
395 m_PageInfoList.push_back(pPageInfo.release()); | 397 m_PageInfoList.push_back(pPageInfo.release()); |
396 m_bInPage = true; | 398 m_bInPage = true; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 std::unique_ptr<CJBig2_HuffmanTable> Table_B2; | 492 std::unique_ptr<CJBig2_HuffmanTable> Table_B2; |
491 std::unique_ptr<CJBig2_HuffmanTable> Table_B3; | 493 std::unique_ptr<CJBig2_HuffmanTable> Table_B3; |
492 std::unique_ptr<CJBig2_HuffmanTable> Table_B4; | 494 std::unique_ptr<CJBig2_HuffmanTable> Table_B4; |
493 std::unique_ptr<CJBig2_HuffmanTable> Table_B5; | 495 std::unique_ptr<CJBig2_HuffmanTable> Table_B5; |
494 if (pSymbolDictDecoder->SDHUFF == 1) { | 496 if (pSymbolDictDecoder->SDHUFF == 1) { |
495 if (cSDHUFFDH == 2 || cSDHUFFDW == 2) | 497 if (cSDHUFFDH == 2 || cSDHUFFDW == 2) |
496 return JBIG2_ERROR_FATAL; | 498 return JBIG2_ERROR_FATAL; |
497 | 499 |
498 int32_t nIndex = 0; | 500 int32_t nIndex = 0; |
499 if (cSDHUFFDH == 0) { | 501 if (cSDHUFFDH == 0) { |
500 Table_B4.reset(new CJBig2_HuffmanTable( | 502 Table_B4 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
501 HuffmanTable_B4, HuffmanTable_B4_Size, HuffmanTable_HTOOB_B4)); | 503 HuffmanTable_B4, HuffmanTable_B4_Size, HuffmanTable_HTOOB_B4); |
502 pSymbolDictDecoder->SDHUFFDH = Table_B4.get(); | 504 pSymbolDictDecoder->SDHUFFDH = Table_B4.get(); |
503 } else if (cSDHUFFDH == 1) { | 505 } else if (cSDHUFFDH == 1) { |
504 Table_B5.reset(new CJBig2_HuffmanTable( | 506 Table_B5 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
505 HuffmanTable_B5, HuffmanTable_B5_Size, HuffmanTable_HTOOB_B5)); | 507 HuffmanTable_B5, HuffmanTable_B5_Size, HuffmanTable_HTOOB_B5); |
506 pSymbolDictDecoder->SDHUFFDH = Table_B5.get(); | 508 pSymbolDictDecoder->SDHUFFDH = Table_B5.get(); |
507 } else { | 509 } else { |
508 CJBig2_Segment* pSeg = | 510 CJBig2_Segment* pSeg = |
509 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 511 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
510 if (!pSeg) | 512 if (!pSeg) |
511 return JBIG2_ERROR_FATAL; | 513 return JBIG2_ERROR_FATAL; |
512 pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht; | 514 pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht; |
513 } | 515 } |
514 if (cSDHUFFDW == 0) { | 516 if (cSDHUFFDW == 0) { |
515 Table_B2.reset(new CJBig2_HuffmanTable( | 517 Table_B2 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
516 HuffmanTable_B2, HuffmanTable_B2_Size, HuffmanTable_HTOOB_B2)); | 518 HuffmanTable_B2, HuffmanTable_B2_Size, HuffmanTable_HTOOB_B2); |
517 pSymbolDictDecoder->SDHUFFDW = Table_B2.get(); | 519 pSymbolDictDecoder->SDHUFFDW = Table_B2.get(); |
518 } else if (cSDHUFFDW == 1) { | 520 } else if (cSDHUFFDW == 1) { |
519 Table_B3.reset(new CJBig2_HuffmanTable( | 521 Table_B3 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
520 HuffmanTable_B3, HuffmanTable_B3_Size, HuffmanTable_HTOOB_B3)); | 522 HuffmanTable_B3, HuffmanTable_B3_Size, HuffmanTable_HTOOB_B3); |
521 pSymbolDictDecoder->SDHUFFDW = Table_B3.get(); | 523 pSymbolDictDecoder->SDHUFFDW = Table_B3.get(); |
522 } else { | 524 } else { |
523 CJBig2_Segment* pSeg = | 525 CJBig2_Segment* pSeg = |
524 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 526 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
525 if (!pSeg) | 527 if (!pSeg) |
526 return JBIG2_ERROR_FATAL; | 528 return JBIG2_ERROR_FATAL; |
527 pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht; | 529 pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht; |
528 } | 530 } |
529 if (cSDHUFFBMSIZE == 0) { | 531 if (cSDHUFFBMSIZE == 0) { |
530 Table_B1.reset(new CJBig2_HuffmanTable( | 532 Table_B1 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
531 HuffmanTable_B1, HuffmanTable_B1_Size, HuffmanTable_HTOOB_B1)); | 533 HuffmanTable_B1, HuffmanTable_B1_Size, HuffmanTable_HTOOB_B1); |
532 pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1.get(); | 534 pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1.get(); |
533 } else { | 535 } else { |
534 CJBig2_Segment* pSeg = | 536 CJBig2_Segment* pSeg = |
535 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 537 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
536 if (!pSeg) | 538 if (!pSeg) |
537 return JBIG2_ERROR_FATAL; | 539 return JBIG2_ERROR_FATAL; |
538 pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht; | 540 pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht; |
539 } | 541 } |
540 if (pSymbolDictDecoder->SDREFAGG == 1) { | 542 if (pSymbolDictDecoder->SDREFAGG == 1) { |
541 if (cSDHUFFAGGINST == 0) { | 543 if (cSDHUFFAGGINST == 0) { |
542 if (!Table_B1) { | 544 if (!Table_B1) { |
543 Table_B1.reset(new CJBig2_HuffmanTable( | 545 Table_B1 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
544 HuffmanTable_B1, HuffmanTable_B1_Size, HuffmanTable_HTOOB_B1)); | 546 HuffmanTable_B1, HuffmanTable_B1_Size, HuffmanTable_HTOOB_B1); |
545 } | 547 } |
546 pSymbolDictDecoder->SDHUFFAGGINST = Table_B1.get(); | 548 pSymbolDictDecoder->SDHUFFAGGINST = Table_B1.get(); |
547 } else { | 549 } else { |
548 CJBig2_Segment* pSeg = | 550 CJBig2_Segment* pSeg = |
549 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 551 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
550 if (!pSeg) | 552 if (!pSeg) |
551 return JBIG2_ERROR_FATAL; | 553 return JBIG2_ERROR_FATAL; |
552 pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht; | 554 pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht; |
553 } | 555 } |
554 } | 556 } |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 std::unique_ptr<CJBig2_HuffmanTable> Table_B13; | 754 std::unique_ptr<CJBig2_HuffmanTable> Table_B13; |
753 std::unique_ptr<CJBig2_HuffmanTable> Table_B14; | 755 std::unique_ptr<CJBig2_HuffmanTable> Table_B14; |
754 std::unique_ptr<CJBig2_HuffmanTable> Table_B15; | 756 std::unique_ptr<CJBig2_HuffmanTable> Table_B15; |
755 if (pTRD->SBHUFF == 1) { | 757 if (pTRD->SBHUFF == 1) { |
756 if (cSBHUFFFS == 2 || cSBHUFFRDW == 2 || cSBHUFFRDH == 2 || | 758 if (cSBHUFFFS == 2 || cSBHUFFRDW == 2 || cSBHUFFRDH == 2 || |
757 cSBHUFFRDX == 2 || cSBHUFFRDY == 2) { | 759 cSBHUFFRDX == 2 || cSBHUFFRDY == 2) { |
758 return JBIG2_ERROR_FATAL; | 760 return JBIG2_ERROR_FATAL; |
759 } | 761 } |
760 int32_t nIndex = 0; | 762 int32_t nIndex = 0; |
761 if (cSBHUFFFS == 0) { | 763 if (cSBHUFFFS == 0) { |
762 Table_B6.reset(new CJBig2_HuffmanTable( | 764 Table_B6 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
763 HuffmanTable_B6, HuffmanTable_B6_Size, HuffmanTable_HTOOB_B6)); | 765 HuffmanTable_B6, HuffmanTable_B6_Size, HuffmanTable_HTOOB_B6); |
764 pTRD->SBHUFFFS = Table_B6.get(); | 766 pTRD->SBHUFFFS = Table_B6.get(); |
765 } else if (cSBHUFFFS == 1) { | 767 } else if (cSBHUFFFS == 1) { |
766 Table_B7.reset(new CJBig2_HuffmanTable( | 768 Table_B7 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
767 HuffmanTable_B7, HuffmanTable_B7_Size, HuffmanTable_HTOOB_B7)); | 769 HuffmanTable_B7, HuffmanTable_B7_Size, HuffmanTable_HTOOB_B7); |
768 pTRD->SBHUFFFS = Table_B7.get(); | 770 pTRD->SBHUFFFS = Table_B7.get(); |
769 } else { | 771 } else { |
770 CJBig2_Segment* pSeg = | 772 CJBig2_Segment* pSeg = |
771 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 773 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
772 if (!pSeg) | 774 if (!pSeg) |
773 return JBIG2_ERROR_FATAL; | 775 return JBIG2_ERROR_FATAL; |
774 pTRD->SBHUFFFS = pSeg->m_Result.ht; | 776 pTRD->SBHUFFFS = pSeg->m_Result.ht; |
775 } | 777 } |
776 if (cSBHUFFDS == 0) { | 778 if (cSBHUFFDS == 0) { |
777 Table_B8.reset(new CJBig2_HuffmanTable( | 779 Table_B8 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
778 HuffmanTable_B8, HuffmanTable_B8_Size, HuffmanTable_HTOOB_B8)); | 780 HuffmanTable_B8, HuffmanTable_B8_Size, HuffmanTable_HTOOB_B8); |
779 pTRD->SBHUFFDS = Table_B8.get(); | 781 pTRD->SBHUFFDS = Table_B8.get(); |
780 } else if (cSBHUFFDS == 1) { | 782 } else if (cSBHUFFDS == 1) { |
781 Table_B9.reset(new CJBig2_HuffmanTable( | 783 Table_B9 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
782 HuffmanTable_B9, HuffmanTable_B9_Size, HuffmanTable_HTOOB_B9)); | 784 HuffmanTable_B9, HuffmanTable_B9_Size, HuffmanTable_HTOOB_B9); |
783 pTRD->SBHUFFDS = Table_B9.get(); | 785 pTRD->SBHUFFDS = Table_B9.get(); |
784 } else if (cSBHUFFDS == 2) { | 786 } else if (cSBHUFFDS == 2) { |
785 Table_B10.reset(new CJBig2_HuffmanTable( | 787 Table_B10 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
786 HuffmanTable_B10, HuffmanTable_B10_Size, HuffmanTable_HTOOB_B10)); | 788 HuffmanTable_B10, HuffmanTable_B10_Size, HuffmanTable_HTOOB_B10); |
787 pTRD->SBHUFFDS = Table_B10.get(); | 789 pTRD->SBHUFFDS = Table_B10.get(); |
788 } else { | 790 } else { |
789 CJBig2_Segment* pSeg = | 791 CJBig2_Segment* pSeg = |
790 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 792 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
791 if (!pSeg) | 793 if (!pSeg) |
792 return JBIG2_ERROR_FATAL; | 794 return JBIG2_ERROR_FATAL; |
793 pTRD->SBHUFFDS = pSeg->m_Result.ht; | 795 pTRD->SBHUFFDS = pSeg->m_Result.ht; |
794 } | 796 } |
795 if (cSBHUFFDT == 0) { | 797 if (cSBHUFFDT == 0) { |
796 Table_B11.reset(new CJBig2_HuffmanTable( | 798 Table_B11 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
797 HuffmanTable_B11, HuffmanTable_B11_Size, HuffmanTable_HTOOB_B11)); | 799 HuffmanTable_B11, HuffmanTable_B11_Size, HuffmanTable_HTOOB_B11); |
798 pTRD->SBHUFFDT = Table_B11.get(); | 800 pTRD->SBHUFFDT = Table_B11.get(); |
799 } else if (cSBHUFFDT == 1) { | 801 } else if (cSBHUFFDT == 1) { |
800 Table_B12.reset(new CJBig2_HuffmanTable( | 802 Table_B12 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
801 HuffmanTable_B12, HuffmanTable_B12_Size, HuffmanTable_HTOOB_B12)); | 803 HuffmanTable_B12, HuffmanTable_B12_Size, HuffmanTable_HTOOB_B12); |
802 pTRD->SBHUFFDT = Table_B12.get(); | 804 pTRD->SBHUFFDT = Table_B12.get(); |
803 } else if (cSBHUFFDT == 2) { | 805 } else if (cSBHUFFDT == 2) { |
804 Table_B13.reset(new CJBig2_HuffmanTable( | 806 Table_B13 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
805 HuffmanTable_B13, HuffmanTable_B13_Size, HuffmanTable_HTOOB_B13)); | 807 HuffmanTable_B13, HuffmanTable_B13_Size, HuffmanTable_HTOOB_B13); |
806 pTRD->SBHUFFDT = Table_B13.get(); | 808 pTRD->SBHUFFDT = Table_B13.get(); |
807 } else { | 809 } else { |
808 CJBig2_Segment* pSeg = | 810 CJBig2_Segment* pSeg = |
809 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 811 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
810 if (!pSeg) | 812 if (!pSeg) |
811 return JBIG2_ERROR_FATAL; | 813 return JBIG2_ERROR_FATAL; |
812 pTRD->SBHUFFDT = pSeg->m_Result.ht; | 814 pTRD->SBHUFFDT = pSeg->m_Result.ht; |
813 } | 815 } |
814 if (cSBHUFFRDW == 0) { | 816 if (cSBHUFFRDW == 0) { |
815 Table_B14.reset(new CJBig2_HuffmanTable( | 817 Table_B14 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
816 HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14)); | 818 HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14); |
817 pTRD->SBHUFFRDW = Table_B14.get(); | 819 pTRD->SBHUFFRDW = Table_B14.get(); |
818 } else if (cSBHUFFRDW == 1) { | 820 } else if (cSBHUFFRDW == 1) { |
819 Table_B15.reset(new CJBig2_HuffmanTable( | 821 Table_B15 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
820 HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15)); | 822 HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15); |
821 pTRD->SBHUFFRDW = Table_B15.get(); | 823 pTRD->SBHUFFRDW = Table_B15.get(); |
822 } else { | 824 } else { |
823 CJBig2_Segment* pSeg = | 825 CJBig2_Segment* pSeg = |
824 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 826 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
825 if (!pSeg) | 827 if (!pSeg) |
826 return JBIG2_ERROR_FATAL; | 828 return JBIG2_ERROR_FATAL; |
827 pTRD->SBHUFFRDW = pSeg->m_Result.ht; | 829 pTRD->SBHUFFRDW = pSeg->m_Result.ht; |
828 } | 830 } |
829 if (cSBHUFFRDH == 0) { | 831 if (cSBHUFFRDH == 0) { |
830 if (!Table_B14) { | 832 if (!Table_B14) { |
831 Table_B14.reset(new CJBig2_HuffmanTable( | 833 Table_B14 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
832 HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14)); | 834 HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14); |
833 } | 835 } |
834 pTRD->SBHUFFRDH = Table_B14.get(); | 836 pTRD->SBHUFFRDH = Table_B14.get(); |
835 } else if (cSBHUFFRDH == 1) { | 837 } else if (cSBHUFFRDH == 1) { |
836 if (!Table_B15) { | 838 if (!Table_B15) { |
837 Table_B15.reset(new CJBig2_HuffmanTable( | 839 Table_B15 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
838 HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15)); | 840 HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15); |
839 } | 841 } |
840 pTRD->SBHUFFRDH = Table_B15.get(); | 842 pTRD->SBHUFFRDH = Table_B15.get(); |
841 } else { | 843 } else { |
842 CJBig2_Segment* pSeg = | 844 CJBig2_Segment* pSeg = |
843 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 845 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
844 if (!pSeg) | 846 if (!pSeg) |
845 return JBIG2_ERROR_FATAL; | 847 return JBIG2_ERROR_FATAL; |
846 pTRD->SBHUFFRDH = pSeg->m_Result.ht; | 848 pTRD->SBHUFFRDH = pSeg->m_Result.ht; |
847 } | 849 } |
848 if (cSBHUFFRDX == 0) { | 850 if (cSBHUFFRDX == 0) { |
849 if (!Table_B14) { | 851 if (!Table_B14) { |
850 Table_B14.reset(new CJBig2_HuffmanTable( | 852 Table_B14 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
851 HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14)); | 853 HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14); |
852 } | 854 } |
853 pTRD->SBHUFFRDX = Table_B14.get(); | 855 pTRD->SBHUFFRDX = Table_B14.get(); |
854 } else if (cSBHUFFRDX == 1) { | 856 } else if (cSBHUFFRDX == 1) { |
855 if (!Table_B15) { | 857 if (!Table_B15) { |
856 Table_B15.reset(new CJBig2_HuffmanTable( | 858 Table_B15 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
857 HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15)); | 859 HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15); |
858 } | 860 } |
859 pTRD->SBHUFFRDX = Table_B15.get(); | 861 pTRD->SBHUFFRDX = Table_B15.get(); |
860 } else { | 862 } else { |
861 CJBig2_Segment* pSeg = | 863 CJBig2_Segment* pSeg = |
862 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 864 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
863 if (!pSeg) | 865 if (!pSeg) |
864 return JBIG2_ERROR_FATAL; | 866 return JBIG2_ERROR_FATAL; |
865 pTRD->SBHUFFRDX = pSeg->m_Result.ht; | 867 pTRD->SBHUFFRDX = pSeg->m_Result.ht; |
866 } | 868 } |
867 if (cSBHUFFRDY == 0) { | 869 if (cSBHUFFRDY == 0) { |
868 if (!Table_B14) { | 870 if (!Table_B14) { |
869 Table_B14.reset(new CJBig2_HuffmanTable( | 871 Table_B14 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
870 HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14)); | 872 HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14); |
871 } | 873 } |
872 pTRD->SBHUFFRDY = Table_B14.get(); | 874 pTRD->SBHUFFRDY = Table_B14.get(); |
873 } else if (cSBHUFFRDY == 1) { | 875 } else if (cSBHUFFRDY == 1) { |
874 if (!Table_B15) { | 876 if (!Table_B15) { |
875 Table_B15.reset(new CJBig2_HuffmanTable( | 877 Table_B15 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
876 HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15)); | 878 HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15); |
877 } | 879 } |
878 pTRD->SBHUFFRDY = Table_B15.get(); | 880 pTRD->SBHUFFRDY = Table_B15.get(); |
879 } else { | 881 } else { |
880 CJBig2_Segment* pSeg = | 882 CJBig2_Segment* pSeg = |
881 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 883 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
882 if (!pSeg) | 884 if (!pSeg) |
883 return JBIG2_ERROR_FATAL; | 885 return JBIG2_ERROR_FATAL; |
884 pTRD->SBHUFFRDY = pSeg->m_Result.ht; | 886 pTRD->SBHUFFRDY = pSeg->m_Result.ht; |
885 } | 887 } |
886 if (cSBHUFFRSIZE == 0) { | 888 if (cSBHUFFRSIZE == 0) { |
887 Table_B1.reset(new CJBig2_HuffmanTable( | 889 Table_B1 = pdfium::MakeUnique<CJBig2_HuffmanTable>( |
888 HuffmanTable_B1, HuffmanTable_B1_Size, HuffmanTable_HTOOB_B1)); | 890 HuffmanTable_B1, HuffmanTable_B1_Size, HuffmanTable_HTOOB_B1); |
889 pTRD->SBHUFFRSIZE = Table_B1.get(); | 891 pTRD->SBHUFFRSIZE = Table_B1.get(); |
890 } else { | 892 } else { |
891 CJBig2_Segment* pSeg = | 893 CJBig2_Segment* pSeg = |
892 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 894 findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
893 if (!pSeg) | 895 if (!pSeg) |
894 return JBIG2_ERROR_FATAL; | 896 return JBIG2_ERROR_FATAL; |
895 pTRD->SBHUFFRSIZE = pSeg->m_Result.ht; | 897 pTRD->SBHUFFRSIZE = pSeg->m_Result.ht; |
896 } | 898 } |
897 } | 899 } |
898 std::unique_ptr<JBig2ArithCtx, FxFreeDeleter> grContext; | 900 std::unique_ptr<JBig2ArithCtx, FxFreeDeleter> grContext; |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1088 pGRD->USESKIP = 0; | 1090 pGRD->USESKIP = 0; |
1089 m_pGRD = std::move(pGRD); | 1091 m_pGRD = std::move(pGRD); |
1090 } | 1092 } |
1091 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; | 1093 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
1092 if (m_pGRD->MMR == 0) { | 1094 if (m_pGRD->MMR == 0) { |
1093 if (m_gbContext.empty()) { | 1095 if (m_gbContext.empty()) { |
1094 const size_t size = GetHuffContextSize(m_pGRD->GBTEMPLATE); | 1096 const size_t size = GetHuffContextSize(m_pGRD->GBTEMPLATE); |
1095 m_gbContext.resize(size); | 1097 m_gbContext.resize(size); |
1096 } | 1098 } |
1097 if (!m_pArithDecoder) { | 1099 if (!m_pArithDecoder) { |
1098 m_pArithDecoder.reset(new CJBig2_ArithDecoder(m_pStream.get())); | 1100 m_pArithDecoder = |
| 1101 pdfium::MakeUnique<CJBig2_ArithDecoder>(m_pStream.get()); |
1099 m_ProcessingStatus = m_pGRD->Start_decode_Arith(&pSegment->m_Result.im, | 1102 m_ProcessingStatus = m_pGRD->Start_decode_Arith(&pSegment->m_Result.im, |
1100 m_pArithDecoder.get(), | 1103 m_pArithDecoder.get(), |
1101 &m_gbContext[0], pPause); | 1104 &m_gbContext[0], pPause); |
1102 } else { | 1105 } else { |
1103 m_ProcessingStatus = m_pGRD->Continue_decode(pPause); | 1106 m_ProcessingStatus = m_pGRD->Continue_decode(pPause); |
1104 } | 1107 } |
1105 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 1108 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
1106 if (pSegment->m_cFlags.s.type != 36) { | 1109 if (pSegment->m_cFlags.s.type != 36) { |
1107 if (!m_bBufSpecified) { | 1110 if (!m_bBufSpecified) { |
1108 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); | 1111 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1386 SBSYMCODES[CURTEMP].code = CURCODE; | 1389 SBSYMCODES[CURTEMP].code = CURCODE; |
1387 CURCODE = CURCODE + 1; | 1390 CURCODE = CURCODE + 1; |
1388 } | 1391 } |
1389 CURTEMP = CURTEMP + 1; | 1392 CURTEMP = CURTEMP + 1; |
1390 } | 1393 } |
1391 CURLEN = CURLEN + 1; | 1394 CURLEN = CURLEN + 1; |
1392 } | 1395 } |
1393 FX_Free(LENCOUNT); | 1396 FX_Free(LENCOUNT); |
1394 FX_Free(FIRSTCODE); | 1397 FX_Free(FIRSTCODE); |
1395 } | 1398 } |
OLD | NEW |