Chromium Code Reviews| 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 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 418 m_pStream->offset(pSegment->m_dwData_length); | 418 m_pStream->offset(pSegment->m_dwData_length); |
| 419 break; | 419 break; |
| 420 default: | 420 default: |
| 421 break; | 421 break; |
| 422 } | 422 } |
| 423 return JBIG2_SUCCESS; | 423 return JBIG2_SUCCESS; |
| 424 } | 424 } |
| 425 | 425 |
| 426 int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment, | 426 int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment, |
| 427 IFX_Pause* pPause) { | 427 IFX_Pause* pPause) { |
| 428 FX_DWORD dwTemp; | |
| 429 FX_WORD wFlags; | 428 FX_WORD wFlags; |
| 430 uint8_t cSDHUFFDH, cSDHUFFDW, cSDHUFFBMSIZE, cSDHUFFAGGINST; | 429 if (m_pStream->readShortInteger(&wFlags) != 0) |
| 431 CJBig2_HuffmanTable* Table_B1 = nullptr; | 430 return JBIG2_ERROR_TOO_SHORT; |
| 432 CJBig2_HuffmanTable* Table_B2 = nullptr; | 431 |
| 433 CJBig2_HuffmanTable* Table_B3 = nullptr; | 432 nonstd::unique_ptr<CJBig2_SDDProc> pSymbolDictDecoder(new CJBig2_SDDProc); |
| 434 CJBig2_HuffmanTable* Table_B4 = nullptr; | |
| 435 CJBig2_HuffmanTable* Table_B5 = nullptr; | |
| 436 int32_t i, nIndex, nRet; | |
| 437 CJBig2_Segment* pSeg = nullptr; | |
| 438 CJBig2_Segment* pLRSeg = nullptr; | |
| 439 FX_BOOL bUsed; | |
| 440 CJBig2_Image** SDINSYMS = nullptr; | |
| 441 JBig2ArithCtx* gbContext = nullptr; | |
| 442 JBig2ArithCtx* grContext = nullptr; | |
| 443 CJBig2_ArithDecoder* pArithDecoder; | |
| 444 CJBig2_SDDProc* pSymbolDictDecoder = new CJBig2_SDDProc(); | |
| 445 const uint8_t* key = pSegment->m_pData; | |
| 446 FX_BOOL cache_hit = false; | |
| 447 if (m_pStream->readShortInteger(&wFlags) != 0) { | |
| 448 nRet = JBIG2_ERROR_TOO_SHORT; | |
| 449 goto failed; | |
| 450 } | |
| 451 pSymbolDictDecoder->SDHUFF = wFlags & 0x0001; | 433 pSymbolDictDecoder->SDHUFF = wFlags & 0x0001; |
| 452 pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001; | 434 pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001; |
| 453 pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003; | 435 pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003; |
| 454 pSymbolDictDecoder->SDRTEMPLATE = (wFlags >> 12) & 0x0003; | 436 pSymbolDictDecoder->SDRTEMPLATE = (wFlags >> 12) & 0x0003; |
| 455 cSDHUFFDH = (wFlags >> 2) & 0x0003; | 437 uint8_t cSDHUFFDH = (wFlags >> 2) & 0x0003; |
| 456 cSDHUFFDW = (wFlags >> 4) & 0x0003; | 438 uint8_t cSDHUFFDW = (wFlags >> 4) & 0x0003; |
| 457 cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001; | 439 uint8_t cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001; |
| 458 cSDHUFFAGGINST = (wFlags >> 7) & 0x0001; | 440 uint8_t cSDHUFFAGGINST = (wFlags >> 7) & 0x0001; |
| 441 FX_DWORD dwTemp; | |
|
Tom Sepez
2015/10/05 16:34:31
Can we scope this to the next block? That way, it
Lei Zhang
2015/10/07 07:51:11
Done.
| |
| 459 if (pSymbolDictDecoder->SDHUFF == 0) { | 442 if (pSymbolDictDecoder->SDHUFF == 0) { |
| 460 if (pSymbolDictDecoder->SDTEMPLATE == 0) { | 443 if (pSymbolDictDecoder->SDTEMPLATE == 0) { |
| 461 dwTemp = 8; | 444 dwTemp = 8; |
|
Tom Sepez
2015/10/05 16:34:32
nit: this becomes a nice ? expr when combined with
Lei Zhang
2015/10/07 07:51:11
Done.
| |
| 462 } else { | 445 } else { |
| 463 dwTemp = 2; | 446 dwTemp = 2; |
| 464 } | 447 } |
| 465 for (i = 0; i < (int32_t)dwTemp; i++) { | 448 for (int32_t i = 0; i < (int32_t)dwTemp; i++) { |
|
Tom Sepez
2015/10/05 16:34:32
nit: why not FX_DWORD i and lose the cast? also ++
Lei Zhang
2015/10/07 07:51:12
Done.
| |
| 466 if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDAT[i]) != 0) { | 449 if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDAT[i]) != 0) |
| 467 nRet = JBIG2_ERROR_TOO_SHORT; | 450 return JBIG2_ERROR_TOO_SHORT; |
| 468 goto failed; | |
| 469 } | |
| 470 } | 451 } |
| 471 } | 452 } |
| 472 if ((pSymbolDictDecoder->SDREFAGG == 1) && | 453 if ((pSymbolDictDecoder->SDREFAGG == 1) && |
| 473 (pSymbolDictDecoder->SDRTEMPLATE == 0)) { | 454 (pSymbolDictDecoder->SDRTEMPLATE == 0)) { |
| 474 for (i = 0; i < 4; i++) { | 455 for (int32_t i = 0; i < 4; i++) { |
| 475 if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDRAT[i]) != 0) { | 456 if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDRAT[i]) != 0) |
| 476 nRet = JBIG2_ERROR_TOO_SHORT; | 457 return JBIG2_ERROR_TOO_SHORT; |
| 477 goto failed; | |
| 478 } | |
| 479 } | 458 } |
| 480 } | 459 } |
| 481 if ((m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0) || | 460 if ((m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0) || |
| 482 (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0)) { | 461 (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0)) { |
| 483 nRet = JBIG2_ERROR_TOO_SHORT; | 462 return JBIG2_ERROR_TOO_SHORT; |
| 484 goto failed; | |
| 485 } | 463 } |
| 486 if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS || | 464 if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS || |
| 487 pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) { | 465 pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) { |
| 488 nRet = JBIG2_ERROR_LIMIT; | 466 return JBIG2_ERROR_LIMIT; |
| 489 goto failed; | |
| 490 } | 467 } |
| 491 for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { | 468 for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
| 492 if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) { | 469 if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) |
| 493 nRet = JBIG2_ERROR_FATAL; | 470 return JBIG2_ERROR_FATAL; |
| 494 goto failed; | |
| 495 } | |
| 496 } | 471 } |
| 472 CJBig2_Segment* pSeg = nullptr; | |
|
Tom Sepez
2015/10/05 16:34:32
nit: pSeg maybe scopes tighter? I think it's alwa
Lei Zhang
2015/10/07 07:51:11
Done.
| |
| 473 CJBig2_Segment* pLRSeg = nullptr; | |
| 497 pSymbolDictDecoder->SDNUMINSYMS = 0; | 474 pSymbolDictDecoder->SDNUMINSYMS = 0; |
| 498 for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { | 475 for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
| 499 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); | 476 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
| 500 if (pSeg->m_cFlags.s.type == 0) { | 477 if (pSeg->m_cFlags.s.type == 0) { |
| 501 pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->SDNUMEXSYMS; | 478 pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->SDNUMEXSYMS; |
| 502 pLRSeg = pSeg; | 479 pLRSeg = pSeg; |
| 503 } | 480 } |
| 504 } | 481 } |
| 505 if (pSymbolDictDecoder->SDNUMINSYMS == 0) { | 482 |
| 506 SDINSYMS = NULL; | 483 nonstd::unique_ptr<CJBig2_Image*, FxFreeDeleter> SDINSYMS; |
| 507 } else { | 484 if (pSymbolDictDecoder->SDNUMINSYMS != 0) { |
| 508 SDINSYMS = FX_Alloc(CJBig2_Image*, pSymbolDictDecoder->SDNUMINSYMS); | 485 SDINSYMS.reset(FX_Alloc(CJBig2_Image*, pSymbolDictDecoder->SDNUMINSYMS)); |
| 509 dwTemp = 0; | 486 dwTemp = 0; |
| 510 for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { | 487 for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
| 511 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); | 488 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
| 512 if (pSeg->m_cFlags.s.type == 0) { | 489 if (pSeg->m_cFlags.s.type == 0) { |
| 513 JBIG2_memcpy(SDINSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS, | 490 JBIG2_memcpy(SDINSYMS.get() + dwTemp, pSeg->m_Result.sd->SDEXSYMS, |
| 514 pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*)); | 491 pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*)); |
| 515 dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS; | 492 dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS; |
| 516 } | 493 } |
| 517 } | 494 } |
| 518 } | 495 } |
| 519 pSymbolDictDecoder->SDINSYMS = SDINSYMS; | 496 pSymbolDictDecoder->SDINSYMS = SDINSYMS.get(); |
| 497 | |
| 498 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B1; | |
| 499 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B2; | |
| 500 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B3; | |
| 501 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B4; | |
| 502 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B5; | |
| 520 if (pSymbolDictDecoder->SDHUFF == 1) { | 503 if (pSymbolDictDecoder->SDHUFF == 1) { |
| 521 if ((cSDHUFFDH == 2) || (cSDHUFFDW == 2)) { | 504 if ((cSDHUFFDH == 2) || (cSDHUFFDW == 2)) |
| 522 nRet = JBIG2_ERROR_FATAL; | 505 return JBIG2_ERROR_FATAL; |
| 523 goto failed; | 506 |
| 524 } | 507 int32_t nIndex = 0; |
| 525 nIndex = 0; | |
| 526 if (cSDHUFFDH == 0) { | 508 if (cSDHUFFDH == 0) { |
| 527 Table_B4 = new CJBig2_HuffmanTable(HuffmanTable_B4, | 509 Table_B4.reset(new CJBig2_HuffmanTable(HuffmanTable_B4, |
| 528 FX_ArraySize(HuffmanTable_B4), | 510 FX_ArraySize(HuffmanTable_B4), |
| 529 HuffmanTable_HTOOB_B4); | 511 HuffmanTable_HTOOB_B4)); |
| 530 pSymbolDictDecoder->SDHUFFDH = Table_B4; | 512 pSymbolDictDecoder->SDHUFFDH = Table_B4.get(); |
| 531 } else if (cSDHUFFDH == 1) { | 513 } else if (cSDHUFFDH == 1) { |
| 532 Table_B5 = new CJBig2_HuffmanTable(HuffmanTable_B5, | 514 Table_B5.reset(new CJBig2_HuffmanTable(HuffmanTable_B5, |
| 533 FX_ArraySize(HuffmanTable_B5), | 515 FX_ArraySize(HuffmanTable_B5), |
| 534 HuffmanTable_HTOOB_B5); | 516 HuffmanTable_HTOOB_B5)); |
| 535 pSymbolDictDecoder->SDHUFFDH = Table_B5; | 517 pSymbolDictDecoder->SDHUFFDH = Table_B5.get(); |
| 536 } else { | 518 } else { |
| 537 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 519 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 538 if (!pSeg) { | 520 if (!pSeg) |
| 539 nRet = JBIG2_ERROR_FATAL; | 521 return JBIG2_ERROR_FATAL; |
| 540 goto failed; | |
| 541 } | |
| 542 pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht; | 522 pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht; |
| 543 } | 523 } |
| 544 if (cSDHUFFDW == 0) { | 524 if (cSDHUFFDW == 0) { |
| 545 Table_B2 = new CJBig2_HuffmanTable(HuffmanTable_B2, | 525 Table_B2.reset(new CJBig2_HuffmanTable(HuffmanTable_B2, |
| 546 FX_ArraySize(HuffmanTable_B2), | 526 FX_ArraySize(HuffmanTable_B2), |
| 547 HuffmanTable_HTOOB_B2); | 527 HuffmanTable_HTOOB_B2)); |
| 548 pSymbolDictDecoder->SDHUFFDW = Table_B2; | 528 pSymbolDictDecoder->SDHUFFDW = Table_B2.get(); |
| 549 } else if (cSDHUFFDW == 1) { | 529 } else if (cSDHUFFDW == 1) { |
| 550 Table_B3 = new CJBig2_HuffmanTable(HuffmanTable_B3, | 530 Table_B3.reset(new CJBig2_HuffmanTable(HuffmanTable_B3, |
| 551 FX_ArraySize(HuffmanTable_B3), | 531 FX_ArraySize(HuffmanTable_B3), |
| 552 HuffmanTable_HTOOB_B3); | 532 HuffmanTable_HTOOB_B3)); |
| 553 pSymbolDictDecoder->SDHUFFDW = Table_B3; | 533 pSymbolDictDecoder->SDHUFFDW = Table_B3.get(); |
| 554 } else { | 534 } else { |
| 555 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 535 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 556 if (!pSeg) { | 536 if (!pSeg) |
| 557 nRet = JBIG2_ERROR_FATAL; | 537 return JBIG2_ERROR_FATAL; |
| 558 goto failed; | |
| 559 } | |
| 560 pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht; | 538 pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht; |
| 561 } | 539 } |
| 562 if (cSDHUFFBMSIZE == 0) { | 540 if (cSDHUFFBMSIZE == 0) { |
| 563 Table_B1 = new CJBig2_HuffmanTable(HuffmanTable_B1, | 541 Table_B1.reset(new CJBig2_HuffmanTable(HuffmanTable_B1, |
| 564 FX_ArraySize(HuffmanTable_B1), | 542 FX_ArraySize(HuffmanTable_B1), |
| 565 HuffmanTable_HTOOB_B1); | 543 HuffmanTable_HTOOB_B1)); |
| 566 pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1; | 544 pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1.get(); |
| 567 } else { | 545 } else { |
| 568 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 546 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 569 if (!pSeg) { | 547 if (!pSeg) |
| 570 nRet = JBIG2_ERROR_FATAL; | 548 return JBIG2_ERROR_FATAL; |
| 571 goto failed; | |
| 572 } | |
| 573 pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht; | 549 pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht; |
| 574 } | 550 } |
| 575 if (pSymbolDictDecoder->SDREFAGG == 1) { | 551 if (pSymbolDictDecoder->SDREFAGG == 1) { |
| 576 if (cSDHUFFAGGINST == 0) { | 552 if (cSDHUFFAGGINST == 0) { |
| 577 if (!Table_B1) { | 553 if (!Table_B1) { |
| 578 Table_B1 = new CJBig2_HuffmanTable(HuffmanTable_B1, | 554 Table_B1.reset(new CJBig2_HuffmanTable(HuffmanTable_B1, |
| 579 FX_ArraySize(HuffmanTable_B1), | 555 FX_ArraySize(HuffmanTable_B1), |
| 580 HuffmanTable_HTOOB_B1); | 556 HuffmanTable_HTOOB_B1)); |
| 581 } | 557 } |
| 582 pSymbolDictDecoder->SDHUFFAGGINST = Table_B1; | 558 pSymbolDictDecoder->SDHUFFAGGINST = Table_B1.get(); |
| 583 } else { | 559 } else { |
| 584 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 560 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 585 if (!pSeg) { | 561 if (!pSeg) |
| 586 nRet = JBIG2_ERROR_FATAL; | 562 return JBIG2_ERROR_FATAL; |
| 587 goto failed; | |
| 588 } | |
| 589 pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht; | 563 pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht; |
| 590 } | 564 } |
| 591 } | 565 } |
| 592 } | 566 } |
| 567 | |
| 568 nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext; | |
| 569 nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> grContext; | |
| 593 if ((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) { | 570 if ((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) { |
| 594 if (pSymbolDictDecoder->SDHUFF == 0) { | 571 if (pSymbolDictDecoder->SDHUFF == 0) { |
| 595 dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 | 572 dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 |
| 596 ? 65536 | 573 ? 65536 |
| 597 : pSymbolDictDecoder->SDTEMPLATE == 1 ? 8192 : 1024; | 574 : pSymbolDictDecoder->SDTEMPLATE == 1 ? 8192 : 1024; |
| 598 gbContext = FX_Alloc(JBig2ArithCtx, dwTemp); | 575 gbContext.reset(FX_Alloc(JBig2ArithCtx, dwTemp)); |
| 599 JBIG2_memcpy(gbContext, pLRSeg->m_Result.sd->m_gbContext, | 576 JBIG2_memcpy(gbContext.get(), pLRSeg->m_Result.sd->m_gbContext, |
| 600 sizeof(JBig2ArithCtx) * dwTemp); | 577 sizeof(JBig2ArithCtx) * dwTemp); |
| 601 } | 578 } |
| 602 if (pSymbolDictDecoder->SDREFAGG == 1) { | 579 if (pSymbolDictDecoder->SDREFAGG == 1) { |
| 603 dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13; | 580 dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13; |
|
Tom Sepez
2015/10/05 16:34:31
nit: 8192 and 1024 as in line 574, but let's write
Lei Zhang
2015/10/07 07:51:11
I refactored some of this code, but I'll fix the b
| |
| 604 grContext = FX_Alloc(JBig2ArithCtx, dwTemp); | 581 grContext.reset(FX_Alloc(JBig2ArithCtx, dwTemp)); |
| 605 JBIG2_memcpy(grContext, pLRSeg->m_Result.sd->m_grContext, | 582 JBIG2_memcpy(grContext.get(), pLRSeg->m_Result.sd->m_grContext, |
| 606 sizeof(JBig2ArithCtx) * dwTemp); | 583 sizeof(JBig2ArithCtx) * dwTemp); |
| 607 } | 584 } |
| 608 } else { | 585 } else { |
| 609 if (pSymbolDictDecoder->SDHUFF == 0) { | 586 if (pSymbolDictDecoder->SDHUFF == 0) { |
| 610 dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 | 587 dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 |
| 611 ? 65536 | 588 ? 65536 |
| 612 : pSymbolDictDecoder->SDTEMPLATE == 1 ? 8192 : 1024; | 589 : pSymbolDictDecoder->SDTEMPLATE == 1 ? 8192 : 1024; |
| 613 gbContext = FX_Alloc(JBig2ArithCtx, dwTemp); | 590 gbContext.reset(FX_Alloc(JBig2ArithCtx, dwTemp)); |
| 614 JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); | 591 JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * dwTemp); |
| 615 } | 592 } |
| 616 if (pSymbolDictDecoder->SDREFAGG == 1) { | 593 if (pSymbolDictDecoder->SDREFAGG == 1) { |
| 617 dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13; | 594 dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13; |
| 618 grContext = FX_Alloc(JBig2ArithCtx, dwTemp); | 595 grContext.reset(FX_Alloc(JBig2ArithCtx, dwTemp)); |
| 619 JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp); | 596 JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * dwTemp); |
| 620 } | 597 } |
| 621 } | 598 } |
| 599 const uint8_t* key = pSegment->m_pData; | |
| 600 FX_BOOL cache_hit = false; | |
| 622 pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER; | 601 pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER; |
| 623 for (std::list<CJBig2_CachePair>::iterator it = m_pSymbolDictCache->begin(); | 602 for (std::list<CJBig2_CachePair>::iterator it = m_pSymbolDictCache->begin(); |
|
Tom Sepez
2015/10/05 16:34:32
nit: not your fault, but auto now that it's allowe
Lei Zhang
2015/10/07 07:51:12
another day... maybe dml@ will get to this.
| |
| 624 it != m_pSymbolDictCache->end(); ++it) { | 603 it != m_pSymbolDictCache->end(); ++it) { |
| 625 if (it->first == key) { | 604 if (it->first == key) { |
| 626 pSegment->m_Result.sd = it->second->DeepCopy(); | 605 pSegment->m_Result.sd = it->second->DeepCopy(); |
| 627 m_pSymbolDictCache->push_front(*it); | 606 m_pSymbolDictCache->push_front(*it); |
| 628 m_pSymbolDictCache->erase(it); | 607 m_pSymbolDictCache->erase(it); |
| 629 cache_hit = true; | 608 cache_hit = true; |
| 630 break; | 609 break; |
| 631 } | 610 } |
| 632 } | 611 } |
| 633 if (!cache_hit) { | 612 if (!cache_hit) { |
| 634 if (pSymbolDictDecoder->SDHUFF == 0) { | 613 if (pSymbolDictDecoder->SDHUFF == 0) { |
| 635 pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get()); | 614 CJBig2_ArithDecoder* pArithDecoder = |
|
Tom Sepez
2015/10/05 16:34:31
nit: this could be unique_ptr and lose the delete
Lei Zhang
2015/10/07 07:51:11
Done.
| |
| 636 pSegment->m_Result.sd = | 615 new CJBig2_ArithDecoder(m_pStream.get()); |
| 637 pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext); | 616 pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith( |
| 617 pArithDecoder, gbContext.get(), grContext.get()); | |
| 638 delete pArithDecoder; | 618 delete pArithDecoder; |
| 639 if (pSegment->m_Result.sd == NULL) { | 619 if (!pSegment->m_Result.sd) |
| 640 nRet = JBIG2_ERROR_FATAL; | 620 return JBIG2_ERROR_FATAL; |
| 641 goto failed; | 621 |
| 642 } | |
| 643 m_pStream->alignByte(); | 622 m_pStream->alignByte(); |
| 644 m_pStream->offset(2); | 623 m_pStream->offset(2); |
| 645 } else { | 624 } else { |
| 646 pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman( | 625 pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman( |
| 647 m_pStream.get(), gbContext, grContext, pPause); | 626 m_pStream.get(), gbContext.get(), grContext.get(), pPause); |
| 648 if (pSegment->m_Result.sd == NULL) { | 627 if (!pSegment->m_Result.sd) |
| 649 nRet = JBIG2_ERROR_FATAL; | 628 return JBIG2_ERROR_FATAL; |
| 650 goto failed; | |
| 651 } | |
| 652 m_pStream->alignByte(); | 629 m_pStream->alignByte(); |
| 653 } | 630 } |
| 654 CJBig2_SymbolDict* value = pSegment->m_Result.sd->DeepCopy(); | 631 CJBig2_SymbolDict* value = pSegment->m_Result.sd->DeepCopy(); |
| 655 if (value && kSymbolDictCacheMaxSize > 0) { | 632 if (value && kSymbolDictCacheMaxSize > 0) { |
| 656 while (m_pSymbolDictCache->size() >= kSymbolDictCacheMaxSize) { | 633 while (m_pSymbolDictCache->size() >= kSymbolDictCacheMaxSize) { |
| 657 delete m_pSymbolDictCache->back().second; | 634 delete m_pSymbolDictCache->back().second; |
| 658 m_pSymbolDictCache->pop_back(); | 635 m_pSymbolDictCache->pop_back(); |
| 659 } | 636 } |
| 660 m_pSymbolDictCache->push_front(CJBig2_CachePair(key, value)); | 637 m_pSymbolDictCache->push_front(CJBig2_CachePair(key, value)); |
| 661 } | 638 } |
| 662 } | 639 } |
| 663 if (wFlags & 0x0200) { | 640 if (wFlags & 0x0200) { |
| 664 pSegment->m_Result.sd->m_bContextRetained = TRUE; | 641 pSegment->m_Result.sd->m_bContextRetained = TRUE; |
| 665 if (pSymbolDictDecoder->SDHUFF == 0) { | 642 if (pSymbolDictDecoder->SDHUFF == 0) { |
| 666 pSegment->m_Result.sd->m_gbContext = gbContext; | 643 pSegment->m_Result.sd->m_gbContext = gbContext.release(); |
| 667 } | 644 } |
| 668 if (pSymbolDictDecoder->SDREFAGG == 1) { | 645 if (pSymbolDictDecoder->SDREFAGG == 1) { |
| 669 pSegment->m_Result.sd->m_grContext = grContext; | 646 pSegment->m_Result.sd->m_grContext = grContext.release(); |
| 670 } | 647 } |
| 671 bUsed = TRUE; | |
| 672 } else { | |
| 673 bUsed = FALSE; | |
| 674 } | |
| 675 delete pSymbolDictDecoder; | |
| 676 FX_Free(SDINSYMS); | |
| 677 delete Table_B1; | |
| 678 delete Table_B2; | |
| 679 delete Table_B3; | |
| 680 delete Table_B4; | |
| 681 delete Table_B5; | |
| 682 if (bUsed == FALSE) { | |
| 683 FX_Free(gbContext); | |
| 684 FX_Free(grContext); | |
| 685 } | 648 } |
| 686 return JBIG2_SUCCESS; | 649 return JBIG2_SUCCESS; |
| 687 failed: | |
| 688 delete pSymbolDictDecoder; | |
| 689 FX_Free(SDINSYMS); | |
| 690 delete Table_B1; | |
| 691 delete Table_B2; | |
| 692 delete Table_B3; | |
| 693 delete Table_B4; | |
| 694 delete Table_B5; | |
| 695 FX_Free(gbContext); | |
| 696 FX_Free(grContext); | |
| 697 return nRet; | |
| 698 } | 650 } |
| 699 | 651 |
| 700 int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) { | 652 int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) { |
| 701 FX_DWORD dwTemp; | |
| 702 FX_WORD wFlags; | 653 FX_WORD wFlags; |
| 703 int32_t i, nIndex, nRet; | |
| 704 JBig2RegionInfo ri; | 654 JBig2RegionInfo ri; |
| 705 CJBig2_Segment* pSeg; | |
| 706 CJBig2_Image** SBSYMS = nullptr; | |
| 707 JBig2HuffmanCode* SBSYMCODES = nullptr; | |
| 708 uint8_t cSBHUFFFS, cSBHUFFDS, cSBHUFFDT, cSBHUFFRDW, cSBHUFFRDH, cSBHUFFRDX, | |
| 709 cSBHUFFRDY, cSBHUFFRSIZE; | |
| 710 CJBig2_HuffmanTable* Table_B1 = nullptr; | |
| 711 CJBig2_HuffmanTable* Table_B6 = nullptr; | |
| 712 CJBig2_HuffmanTable* Table_B7 = nullptr; | |
| 713 CJBig2_HuffmanTable* Table_B8 = nullptr; | |
| 714 CJBig2_HuffmanTable* Table_B9 = nullptr; | |
| 715 CJBig2_HuffmanTable* Table_B10 = nullptr; | |
| 716 CJBig2_HuffmanTable* Table_B11 = nullptr; | |
| 717 CJBig2_HuffmanTable* Table_B12 = nullptr; | |
| 718 CJBig2_HuffmanTable* Table_B13 = nullptr; | |
| 719 CJBig2_HuffmanTable* Table_B14 = nullptr; | |
| 720 CJBig2_HuffmanTable* Table_B15 = nullptr; | |
| 721 JBig2ArithCtx* grContext = nullptr; | |
| 722 CJBig2_ArithDecoder* pArithDecoder; | |
| 723 CJBig2_TRDProc* pTRD = new CJBig2_TRDProc(); | |
| 724 if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) || | 655 if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) || |
|
Tom Sepez
2015/10/05 16:34:31
nit: overparenthesized
Lei Zhang
2015/10/07 07:51:12
Done.
| |
| 725 (m_pStream->readShortInteger(&wFlags) != 0)) { | 656 (m_pStream->readShortInteger(&wFlags) != 0)) { |
| 726 nRet = JBIG2_ERROR_TOO_SHORT; | 657 return JBIG2_ERROR_TOO_SHORT; |
| 727 goto failed; | |
| 728 } | 658 } |
| 659 | |
| 660 nonstd::unique_ptr<CJBig2_TRDProc> pTRD(new CJBig2_TRDProc); | |
| 729 pTRD->SBW = ri.width; | 661 pTRD->SBW = ri.width; |
| 730 pTRD->SBH = ri.height; | 662 pTRD->SBH = ri.height; |
| 731 pTRD->SBHUFF = wFlags & 0x0001; | 663 pTRD->SBHUFF = wFlags & 0x0001; |
| 732 pTRD->SBREFINE = (wFlags >> 1) & 0x0001; | 664 pTRD->SBREFINE = (wFlags >> 1) & 0x0001; |
| 733 dwTemp = (wFlags >> 2) & 0x0003; | 665 FX_DWORD dwTemp = (wFlags >> 2) & 0x0003; |
| 734 pTRD->SBSTRIPS = 1 << dwTemp; | 666 pTRD->SBSTRIPS = 1 << dwTemp; |
| 735 pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003); | 667 pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003); |
| 736 pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001; | 668 pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001; |
| 737 pTRD->SBCOMBOP = (JBig2ComposeOp)((wFlags >> 7) & 0x0003); | 669 pTRD->SBCOMBOP = (JBig2ComposeOp)((wFlags >> 7) & 0x0003); |
| 738 pTRD->SBDEFPIXEL = (wFlags >> 9) & 0x0001; | 670 pTRD->SBDEFPIXEL = (wFlags >> 9) & 0x0001; |
| 739 pTRD->SBDSOFFSET = (wFlags >> 10) & 0x001f; | 671 pTRD->SBDSOFFSET = (wFlags >> 10) & 0x001f; |
| 740 if (pTRD->SBDSOFFSET >= 0x0010) { | 672 if (pTRD->SBDSOFFSET >= 0x0010) { |
| 741 pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020; | 673 pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020; |
| 742 } | 674 } |
| 743 pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001; | 675 pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001; |
| 676 | |
| 677 uint8_t cSBHUFFFS; | |
|
Tom Sepez
2015/10/05 16:34:32
nit: Yeah, these are used later only when pTRD->SB
Lei Zhang
2015/10/07 07:51:12
they are only used when pTRD->SBHUFF == 1.
| |
| 678 uint8_t cSBHUFFDS; | |
| 679 uint8_t cSBHUFFDT; | |
| 680 uint8_t cSBHUFFRDW; | |
| 681 uint8_t cSBHUFFRDH; | |
| 682 uint8_t cSBHUFFRDX; | |
| 683 uint8_t cSBHUFFRDY; | |
| 684 uint8_t cSBHUFFRSIZE; | |
| 744 if (pTRD->SBHUFF == 1) { | 685 if (pTRD->SBHUFF == 1) { |
| 745 if (m_pStream->readShortInteger(&wFlags) != 0) { | 686 if (m_pStream->readShortInteger(&wFlags) != 0) |
| 746 nRet = JBIG2_ERROR_TOO_SHORT; | 687 return JBIG2_ERROR_TOO_SHORT; |
| 747 goto failed; | 688 |
| 748 } | |
| 749 cSBHUFFFS = wFlags & 0x0003; | 689 cSBHUFFFS = wFlags & 0x0003; |
| 750 cSBHUFFDS = (wFlags >> 2) & 0x0003; | 690 cSBHUFFDS = (wFlags >> 2) & 0x0003; |
| 751 cSBHUFFDT = (wFlags >> 4) & 0x0003; | 691 cSBHUFFDT = (wFlags >> 4) & 0x0003; |
| 752 cSBHUFFRDW = (wFlags >> 6) & 0x0003; | 692 cSBHUFFRDW = (wFlags >> 6) & 0x0003; |
| 753 cSBHUFFRDH = (wFlags >> 8) & 0x0003; | 693 cSBHUFFRDH = (wFlags >> 8) & 0x0003; |
| 754 cSBHUFFRDX = (wFlags >> 10) & 0x0003; | 694 cSBHUFFRDX = (wFlags >> 10) & 0x0003; |
| 755 cSBHUFFRDY = (wFlags >> 12) & 0x0003; | 695 cSBHUFFRDY = (wFlags >> 12) & 0x0003; |
| 756 cSBHUFFRSIZE = (wFlags >> 14) & 0x0001; | 696 cSBHUFFRSIZE = (wFlags >> 14) & 0x0001; |
| 757 } | 697 } |
| 758 if ((pTRD->SBREFINE == 1) && (pTRD->SBRTEMPLATE == 0)) { | 698 if ((pTRD->SBREFINE == 1) && (pTRD->SBRTEMPLATE == 0)) { |
| 759 for (i = 0; i < 4; i++) { | 699 for (int32_t i = 0; i < 4; i++) { |
| 760 if (m_pStream->read1Byte((uint8_t*)&pTRD->SBRAT[i]) != 0) { | 700 if (m_pStream->read1Byte((uint8_t*)&pTRD->SBRAT[i]) != 0) |
| 761 nRet = JBIG2_ERROR_TOO_SHORT; | 701 return JBIG2_ERROR_TOO_SHORT; |
| 762 goto failed; | |
| 763 } | |
| 764 } | 702 } |
| 765 } | 703 } |
| 766 if (m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) { | 704 if (m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) |
| 767 nRet = JBIG2_ERROR_TOO_SHORT; | 705 return JBIG2_ERROR_TOO_SHORT; |
| 768 goto failed; | 706 |
| 707 for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { | |
| 708 if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) | |
| 709 return JBIG2_ERROR_FATAL; | |
| 769 } | 710 } |
| 770 for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { | 711 |
| 771 if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) { | 712 CJBig2_Segment* pSeg; |
|
Tom Sepez
2015/10/05 16:34:32
does this scope tighter even if it costs a couple
Lei Zhang
2015/10/07 07:51:11
Done.
| |
| 772 nRet = JBIG2_ERROR_FATAL; | |
| 773 goto failed; | |
| 774 } | |
| 775 } | |
| 776 pTRD->SBNUMSYMS = 0; | 713 pTRD->SBNUMSYMS = 0; |
| 777 for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { | 714 for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
| 778 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); | 715 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
| 779 if (pSeg->m_cFlags.s.type == 0) { | 716 if (pSeg->m_cFlags.s.type == 0) { |
| 780 pTRD->SBNUMSYMS += pSeg->m_Result.sd->SDNUMEXSYMS; | 717 pTRD->SBNUMSYMS += pSeg->m_Result.sd->SDNUMEXSYMS; |
| 781 } | 718 } |
| 782 } | 719 } |
| 720 | |
| 721 nonstd::unique_ptr<CJBig2_Image*, FxFreeDeleter> SBSYMS; | |
| 783 if (pTRD->SBNUMSYMS > 0) { | 722 if (pTRD->SBNUMSYMS > 0) { |
| 784 SBSYMS = FX_Alloc(CJBig2_Image*, pTRD->SBNUMSYMS); | 723 SBSYMS.reset(FX_Alloc(CJBig2_Image*, pTRD->SBNUMSYMS)); |
| 785 dwTemp = 0; | 724 dwTemp = 0; |
| 786 for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { | 725 for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
| 787 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); | 726 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); |
| 788 if (pSeg->m_cFlags.s.type == 0) { | 727 if (pSeg->m_cFlags.s.type == 0) { |
| 789 JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS, | 728 JBIG2_memcpy(SBSYMS.get() + dwTemp, pSeg->m_Result.sd->SDEXSYMS, |
| 790 pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*)); | 729 pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*)); |
| 791 dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS; | 730 dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS; |
| 792 } | 731 } |
| 793 } | 732 } |
| 794 pTRD->SBSYMS = SBSYMS; | 733 pTRD->SBSYMS = SBSYMS.get(); |
| 795 } else { | 734 } else { |
| 796 pTRD->SBSYMS = NULL; | 735 pTRD->SBSYMS = NULL; |
| 797 } | 736 } |
| 737 | |
| 738 nonstd::unique_ptr<JBig2HuffmanCode, FxFreeDeleter> SBSYMCODES; | |
| 798 if (pTRD->SBHUFF == 1) { | 739 if (pTRD->SBHUFF == 1) { |
| 799 SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream.get(), pTRD->SBNUMSYMS); | 740 SBSYMCODES.reset( |
| 800 if (SBSYMCODES == NULL) { | 741 decodeSymbolIDHuffmanTable(m_pStream.get(), pTRD->SBNUMSYMS)); |
| 801 nRet = JBIG2_ERROR_FATAL; | 742 if (!SBSYMCODES) |
| 802 goto failed; | 743 return JBIG2_ERROR_FATAL; |
| 803 } | 744 |
| 804 m_pStream->alignByte(); | 745 m_pStream->alignByte(); |
| 805 pTRD->SBSYMCODES = SBSYMCODES; | 746 pTRD->SBSYMCODES = SBSYMCODES.get(); |
| 806 } else { | 747 } else { |
| 807 dwTemp = 0; | 748 dwTemp = 0; |
| 808 while ((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) { | 749 while ((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) { |
| 809 dwTemp++; | 750 dwTemp++; |
| 810 } | 751 } |
| 811 pTRD->SBSYMCODELEN = (uint8_t)dwTemp; | 752 pTRD->SBSYMCODELEN = (uint8_t)dwTemp; |
| 812 } | 753 } |
| 754 | |
| 755 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B1; | |
| 756 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B6; | |
| 757 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B7; | |
| 758 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B8; | |
| 759 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B9; | |
| 760 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B10; | |
| 761 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B11; | |
| 762 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B12; | |
| 763 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B13; | |
| 764 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B14; | |
| 765 nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B15; | |
| 813 if (pTRD->SBHUFF == 1) { | 766 if (pTRD->SBHUFF == 1) { |
| 814 if ((cSBHUFFFS == 2) || (cSBHUFFRDW == 2) || (cSBHUFFRDH == 2) || | 767 if ((cSBHUFFFS == 2) || (cSBHUFFRDW == 2) || (cSBHUFFRDH == 2) || |
| 815 (cSBHUFFRDX == 2) || (cSBHUFFRDY == 2)) { | 768 (cSBHUFFRDX == 2) || (cSBHUFFRDY == 2)) { |
| 816 nRet = JBIG2_ERROR_FATAL; | 769 return JBIG2_ERROR_FATAL; |
| 817 goto failed; | |
| 818 } | 770 } |
| 819 nIndex = 0; | 771 int32_t nIndex = 0; |
| 820 if (cSBHUFFFS == 0) { | 772 if (cSBHUFFFS == 0) { |
| 821 Table_B6 = new CJBig2_HuffmanTable(HuffmanTable_B6, | 773 Table_B6.reset(new CJBig2_HuffmanTable(HuffmanTable_B6, |
| 822 FX_ArraySize(HuffmanTable_B6), | 774 FX_ArraySize(HuffmanTable_B6), |
| 823 HuffmanTable_HTOOB_B6); | 775 HuffmanTable_HTOOB_B6)); |
| 824 pTRD->SBHUFFFS = Table_B6; | 776 pTRD->SBHUFFFS = Table_B6.get(); |
| 825 } else if (cSBHUFFFS == 1) { | 777 } else if (cSBHUFFFS == 1) { |
| 826 Table_B7 = new CJBig2_HuffmanTable(HuffmanTable_B7, | 778 Table_B7.reset(new CJBig2_HuffmanTable(HuffmanTable_B7, |
| 827 FX_ArraySize(HuffmanTable_B7), | 779 FX_ArraySize(HuffmanTable_B7), |
| 828 HuffmanTable_HTOOB_B7); | 780 HuffmanTable_HTOOB_B7)); |
| 829 pTRD->SBHUFFFS = Table_B7; | 781 pTRD->SBHUFFFS = Table_B7.get(); |
| 830 } else { | 782 } else { |
| 831 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 783 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 832 if (!pSeg) { | 784 if (!pSeg) |
| 833 nRet = JBIG2_ERROR_FATAL; | 785 return JBIG2_ERROR_FATAL; |
| 834 goto failed; | |
| 835 } | |
| 836 pTRD->SBHUFFFS = pSeg->m_Result.ht; | 786 pTRD->SBHUFFFS = pSeg->m_Result.ht; |
| 837 } | 787 } |
| 838 if (cSBHUFFDS == 0) { | 788 if (cSBHUFFDS == 0) { |
| 839 Table_B8 = new CJBig2_HuffmanTable(HuffmanTable_B8, | 789 Table_B8.reset(new CJBig2_HuffmanTable(HuffmanTable_B8, |
| 840 FX_ArraySize(HuffmanTable_B8), | 790 FX_ArraySize(HuffmanTable_B8), |
| 841 HuffmanTable_HTOOB_B8); | 791 HuffmanTable_HTOOB_B8)); |
| 842 pTRD->SBHUFFDS = Table_B8; | 792 pTRD->SBHUFFDS = Table_B8.get(); |
| 843 } else if (cSBHUFFDS == 1) { | 793 } else if (cSBHUFFDS == 1) { |
| 844 Table_B9 = new CJBig2_HuffmanTable(HuffmanTable_B9, | 794 Table_B9.reset(new CJBig2_HuffmanTable(HuffmanTable_B9, |
| 845 FX_ArraySize(HuffmanTable_B9), | 795 FX_ArraySize(HuffmanTable_B9), |
| 846 HuffmanTable_HTOOB_B9); | 796 HuffmanTable_HTOOB_B9)); |
| 847 pTRD->SBHUFFDS = Table_B9; | 797 pTRD->SBHUFFDS = Table_B9.get(); |
| 848 } else if (cSBHUFFDS == 2) { | 798 } else if (cSBHUFFDS == 2) { |
| 849 Table_B10 = new CJBig2_HuffmanTable(HuffmanTable_B10, | 799 Table_B10.reset(new CJBig2_HuffmanTable(HuffmanTable_B10, |
| 850 FX_ArraySize(HuffmanTable_B10), | 800 FX_ArraySize(HuffmanTable_B10), |
| 851 HuffmanTable_HTOOB_B10); | 801 HuffmanTable_HTOOB_B10)); |
| 852 pTRD->SBHUFFDS = Table_B10; | 802 pTRD->SBHUFFDS = Table_B10.get(); |
| 853 } else { | 803 } else { |
| 854 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 804 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 855 if (!pSeg) { | 805 if (!pSeg) |
| 856 nRet = JBIG2_ERROR_FATAL; | 806 return JBIG2_ERROR_FATAL; |
| 857 goto failed; | |
| 858 } | |
| 859 pTRD->SBHUFFDS = pSeg->m_Result.ht; | 807 pTRD->SBHUFFDS = pSeg->m_Result.ht; |
| 860 } | 808 } |
| 861 if (cSBHUFFDT == 0) { | 809 if (cSBHUFFDT == 0) { |
| 862 Table_B11 = new CJBig2_HuffmanTable(HuffmanTable_B11, | 810 Table_B11.reset(new CJBig2_HuffmanTable(HuffmanTable_B11, |
| 863 FX_ArraySize(HuffmanTable_B11), | 811 FX_ArraySize(HuffmanTable_B11), |
| 864 HuffmanTable_HTOOB_B11); | 812 HuffmanTable_HTOOB_B11)); |
| 865 pTRD->SBHUFFDT = Table_B11; | 813 pTRD->SBHUFFDT = Table_B11.get(); |
| 866 } else if (cSBHUFFDT == 1) { | 814 } else if (cSBHUFFDT == 1) { |
| 867 Table_B12 = new CJBig2_HuffmanTable(HuffmanTable_B12, | 815 Table_B12.reset(new CJBig2_HuffmanTable(HuffmanTable_B12, |
| 868 FX_ArraySize(HuffmanTable_B12), | 816 FX_ArraySize(HuffmanTable_B12), |
| 869 HuffmanTable_HTOOB_B12); | 817 HuffmanTable_HTOOB_B12)); |
| 870 pTRD->SBHUFFDT = Table_B12; | 818 pTRD->SBHUFFDT = Table_B12.get(); |
| 871 } else if (cSBHUFFDT == 2) { | 819 } else if (cSBHUFFDT == 2) { |
| 872 Table_B13 = new CJBig2_HuffmanTable(HuffmanTable_B13, | 820 Table_B13.reset(new CJBig2_HuffmanTable(HuffmanTable_B13, |
| 873 FX_ArraySize(HuffmanTable_B13), | 821 FX_ArraySize(HuffmanTable_B13), |
| 874 HuffmanTable_HTOOB_B13); | 822 HuffmanTable_HTOOB_B13)); |
| 875 pTRD->SBHUFFDT = Table_B13; | 823 pTRD->SBHUFFDT = Table_B13.get(); |
| 876 } else { | 824 } else { |
| 877 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 825 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 878 if (!pSeg) { | 826 if (!pSeg) |
| 879 nRet = JBIG2_ERROR_FATAL; | 827 return JBIG2_ERROR_FATAL; |
| 880 goto failed; | |
| 881 } | |
| 882 pTRD->SBHUFFDT = pSeg->m_Result.ht; | 828 pTRD->SBHUFFDT = pSeg->m_Result.ht; |
| 883 } | 829 } |
| 884 if (cSBHUFFRDW == 0) { | 830 if (cSBHUFFRDW == 0) { |
| 885 Table_B14 = new CJBig2_HuffmanTable(HuffmanTable_B14, | 831 Table_B14.reset(new CJBig2_HuffmanTable(HuffmanTable_B14, |
| 886 FX_ArraySize(HuffmanTable_B14), | 832 FX_ArraySize(HuffmanTable_B14), |
| 887 HuffmanTable_HTOOB_B14); | 833 HuffmanTable_HTOOB_B14)); |
| 888 pTRD->SBHUFFRDW = Table_B14; | 834 pTRD->SBHUFFRDW = Table_B14.get(); |
| 889 } else if (cSBHUFFRDW == 1) { | 835 } else if (cSBHUFFRDW == 1) { |
| 890 Table_B15 = new CJBig2_HuffmanTable(HuffmanTable_B15, | 836 Table_B15.reset(new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 891 FX_ArraySize(HuffmanTable_B15), | 837 FX_ArraySize(HuffmanTable_B15), |
| 892 HuffmanTable_HTOOB_B15); | 838 HuffmanTable_HTOOB_B15)); |
| 893 pTRD->SBHUFFRDW = Table_B15; | 839 pTRD->SBHUFFRDW = Table_B15.get(); |
| 894 } else { | 840 } else { |
| 895 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 841 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 896 if (!pSeg) { | 842 if (!pSeg) |
| 897 nRet = JBIG2_ERROR_FATAL; | 843 return JBIG2_ERROR_FATAL; |
| 898 goto failed; | |
| 899 } | |
| 900 pTRD->SBHUFFRDW = pSeg->m_Result.ht; | 844 pTRD->SBHUFFRDW = pSeg->m_Result.ht; |
| 901 } | 845 } |
| 902 if (cSBHUFFRDH == 0) { | 846 if (cSBHUFFRDH == 0) { |
| 903 if (!Table_B14) { | 847 if (!Table_B14) { |
| 904 Table_B14 = new CJBig2_HuffmanTable(HuffmanTable_B14, | 848 Table_B14.reset(new CJBig2_HuffmanTable(HuffmanTable_B14, |
| 905 FX_ArraySize(HuffmanTable_B14), | 849 FX_ArraySize(HuffmanTable_B14), |
| 906 HuffmanTable_HTOOB_B14); | 850 HuffmanTable_HTOOB_B14)); |
| 907 } | 851 } |
| 908 pTRD->SBHUFFRDH = Table_B14; | 852 pTRD->SBHUFFRDH = Table_B14.get(); |
| 909 } else if (cSBHUFFRDH == 1) { | 853 } else if (cSBHUFFRDH == 1) { |
| 910 if (!Table_B15) { | 854 if (!Table_B15) { |
| 911 Table_B15 = new CJBig2_HuffmanTable(HuffmanTable_B15, | 855 Table_B15.reset(new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 912 FX_ArraySize(HuffmanTable_B15), | 856 FX_ArraySize(HuffmanTable_B15), |
| 913 HuffmanTable_HTOOB_B15); | 857 HuffmanTable_HTOOB_B15)); |
| 914 } | 858 } |
| 915 pTRD->SBHUFFRDH = Table_B15; | 859 pTRD->SBHUFFRDH = Table_B15.get(); |
| 916 } else { | 860 } else { |
| 917 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 861 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 918 if (!pSeg) { | 862 if (!pSeg) |
| 919 nRet = JBIG2_ERROR_FATAL; | 863 return JBIG2_ERROR_FATAL; |
| 920 goto failed; | |
| 921 } | |
| 922 pTRD->SBHUFFRDH = pSeg->m_Result.ht; | 864 pTRD->SBHUFFRDH = pSeg->m_Result.ht; |
| 923 } | 865 } |
| 924 if (cSBHUFFRDX == 0) { | 866 if (cSBHUFFRDX == 0) { |
| 925 if (!Table_B14) { | 867 if (!Table_B14) { |
| 926 Table_B14 = new CJBig2_HuffmanTable(HuffmanTable_B14, | 868 Table_B14.reset(new CJBig2_HuffmanTable(HuffmanTable_B14, |
| 927 FX_ArraySize(HuffmanTable_B14), | 869 FX_ArraySize(HuffmanTable_B14), |
| 928 HuffmanTable_HTOOB_B14); | 870 HuffmanTable_HTOOB_B14)); |
| 929 } | 871 } |
| 930 pTRD->SBHUFFRDX = Table_B14; | 872 pTRD->SBHUFFRDX = Table_B14.get(); |
| 931 } else if (cSBHUFFRDX == 1) { | 873 } else if (cSBHUFFRDX == 1) { |
| 932 if (!Table_B15) { | 874 if (!Table_B15) { |
| 933 Table_B15 = new CJBig2_HuffmanTable(HuffmanTable_B15, | 875 Table_B15.reset(new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 934 FX_ArraySize(HuffmanTable_B15), | 876 FX_ArraySize(HuffmanTable_B15), |
| 935 HuffmanTable_HTOOB_B15); | 877 HuffmanTable_HTOOB_B15)); |
| 936 } | 878 } |
| 937 pTRD->SBHUFFRDX = Table_B15; | 879 pTRD->SBHUFFRDX = Table_B15.get(); |
| 938 } else { | 880 } else { |
| 939 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 881 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 940 if (!pSeg) { | 882 if (!pSeg) |
| 941 nRet = JBIG2_ERROR_FATAL; | 883 return JBIG2_ERROR_FATAL; |
| 942 goto failed; | |
| 943 } | |
| 944 pTRD->SBHUFFRDX = pSeg->m_Result.ht; | 884 pTRD->SBHUFFRDX = pSeg->m_Result.ht; |
| 945 } | 885 } |
| 946 if (cSBHUFFRDY == 0) { | 886 if (cSBHUFFRDY == 0) { |
| 947 if (!Table_B14) { | 887 if (!Table_B14) { |
| 948 Table_B14 = new CJBig2_HuffmanTable(HuffmanTable_B14, | 888 Table_B14.reset(new CJBig2_HuffmanTable(HuffmanTable_B14, |
| 949 FX_ArraySize(HuffmanTable_B14), | 889 FX_ArraySize(HuffmanTable_B14), |
| 950 HuffmanTable_HTOOB_B14); | 890 HuffmanTable_HTOOB_B14)); |
| 951 } | 891 } |
| 952 pTRD->SBHUFFRDY = Table_B14; | 892 pTRD->SBHUFFRDY = Table_B14.get(); |
| 953 } else if (cSBHUFFRDY == 1) { | 893 } else if (cSBHUFFRDY == 1) { |
| 954 if (!Table_B15) { | 894 if (!Table_B15) { |
| 955 Table_B15 = new CJBig2_HuffmanTable(HuffmanTable_B15, | 895 Table_B15.reset(new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 956 FX_ArraySize(HuffmanTable_B15), | 896 FX_ArraySize(HuffmanTable_B15), |
| 957 HuffmanTable_HTOOB_B15); | 897 HuffmanTable_HTOOB_B15)); |
| 958 } | 898 } |
| 959 pTRD->SBHUFFRDY = Table_B15; | 899 pTRD->SBHUFFRDY = Table_B15.get(); |
| 960 } else { | 900 } else { |
| 961 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 901 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 962 if (!pSeg) { | 902 if (!pSeg) |
| 963 nRet = JBIG2_ERROR_FATAL; | 903 return JBIG2_ERROR_FATAL; |
| 964 goto failed; | |
| 965 } | |
| 966 pTRD->SBHUFFRDY = pSeg->m_Result.ht; | 904 pTRD->SBHUFFRDY = pSeg->m_Result.ht; |
| 967 } | 905 } |
| 968 if (cSBHUFFRSIZE == 0) { | 906 if (cSBHUFFRSIZE == 0) { |
| 969 Table_B1 = new CJBig2_HuffmanTable(HuffmanTable_B1, | 907 Table_B1.reset(new CJBig2_HuffmanTable(HuffmanTable_B1, |
| 970 FX_ArraySize(HuffmanTable_B1), | 908 FX_ArraySize(HuffmanTable_B1), |
| 971 HuffmanTable_HTOOB_B1); | 909 HuffmanTable_HTOOB_B1)); |
| 972 pTRD->SBHUFFRSIZE = Table_B1; | 910 pTRD->SBHUFFRSIZE = Table_B1.get(); |
| 973 } else { | 911 } else { |
| 974 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); | 912 pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); |
| 975 if (!pSeg) { | 913 if (!pSeg) |
| 976 nRet = JBIG2_ERROR_FATAL; | 914 return JBIG2_ERROR_FATAL; |
| 977 goto failed; | |
| 978 } | |
| 979 pTRD->SBHUFFRSIZE = pSeg->m_Result.ht; | 915 pTRD->SBHUFFRSIZE = pSeg->m_Result.ht; |
| 980 } | 916 } |
| 981 } | 917 } |
| 918 nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> grContext; | |
| 982 if (pTRD->SBREFINE == 1) { | 919 if (pTRD->SBREFINE == 1) { |
| 983 dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13; | 920 dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13; |
| 984 grContext = FX_Alloc(JBig2ArithCtx, dwTemp); | 921 grContext.reset(FX_Alloc(JBig2ArithCtx, dwTemp)); |
| 985 JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp); | 922 JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * dwTemp); |
| 986 } | 923 } |
| 987 if (pTRD->SBHUFF == 0) { | 924 if (pTRD->SBHUFF == 0) { |
| 988 pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get()); | 925 CJBig2_ArithDecoder* pArithDecoder = |
| 926 new CJBig2_ArithDecoder(m_pStream.get()); | |
| 989 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; | 927 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
| 990 pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext); | 928 pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext.get()); |
| 991 delete pArithDecoder; | 929 delete pArithDecoder; |
| 992 if (pSegment->m_Result.im == NULL) { | 930 if (!pSegment->m_Result.im) |
| 993 nRet = JBIG2_ERROR_FATAL; | 931 return JBIG2_ERROR_FATAL; |
| 994 goto failed; | |
| 995 } | |
| 996 m_pStream->alignByte(); | 932 m_pStream->alignByte(); |
| 997 m_pStream->offset(2); | 933 m_pStream->offset(2); |
| 998 } else { | 934 } else { |
| 999 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; | 935 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
| 1000 pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream.get(), grContext); | 936 pSegment->m_Result.im = |
| 1001 if (pSegment->m_Result.im == NULL) { | 937 pTRD->decode_Huffman(m_pStream.get(), grContext.get()); |
| 1002 nRet = JBIG2_ERROR_FATAL; | 938 if (!pSegment->m_Result.im) |
| 1003 goto failed; | 939 return JBIG2_ERROR_FATAL; |
| 1004 } | |
| 1005 m_pStream->alignByte(); | 940 m_pStream->alignByte(); |
| 1006 } | 941 } |
| 1007 if (pSegment->m_cFlags.s.type != 4) { | 942 if (pSegment->m_cFlags.s.type != 4) { |
| 1008 if (!m_bBufSpecified) { | 943 if (!m_bBufSpecified) { |
| 1009 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); | 944 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); |
| 1010 if ((pPageInfo->m_bIsStriped == 1) && | 945 if ((pPageInfo->m_bIsStriped == 1) && |
| 1011 (ri.y + ri.height > m_pPage->m_nHeight)) { | 946 (ri.y + ri.height > m_pPage->m_nHeight)) { |
| 1012 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); | 947 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
| 1013 } | 948 } |
| 1014 } | 949 } |
| 1015 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, | 950 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, |
| 1016 (JBig2ComposeOp)(ri.flags & 0x03)); | 951 (JBig2ComposeOp)(ri.flags & 0x03)); |
| 1017 delete pSegment->m_Result.im; | 952 delete pSegment->m_Result.im; |
| 1018 pSegment->m_Result.im = NULL; | 953 pSegment->m_Result.im = NULL; |
| 1019 } | 954 } |
| 1020 delete pTRD; | |
| 1021 FX_Free(SBSYMS); | |
| 1022 FX_Free(SBSYMCODES); | |
| 1023 FX_Free(grContext); | |
| 1024 delete Table_B1; | |
| 1025 delete Table_B6; | |
| 1026 delete Table_B7; | |
| 1027 delete Table_B8; | |
| 1028 delete Table_B9; | |
| 1029 delete Table_B10; | |
| 1030 delete Table_B11; | |
| 1031 delete Table_B12; | |
| 1032 delete Table_B13; | |
| 1033 delete Table_B14; | |
| 1034 delete Table_B15; | |
| 1035 return JBIG2_SUCCESS; | 955 return JBIG2_SUCCESS; |
| 1036 failed: | |
| 1037 delete pTRD; | |
| 1038 FX_Free(SBSYMS); | |
| 1039 FX_Free(SBSYMCODES); | |
| 1040 FX_Free(grContext); | |
| 1041 delete Table_B1; | |
| 1042 delete Table_B6; | |
| 1043 delete Table_B7; | |
| 1044 delete Table_B8; | |
| 1045 delete Table_B9; | |
| 1046 delete Table_B10; | |
| 1047 delete Table_B11; | |
| 1048 delete Table_B12; | |
| 1049 delete Table_B13; | |
| 1050 delete Table_B14; | |
| 1051 delete Table_B15; | |
| 1052 return nRet; | |
| 1053 } | 956 } |
| 1054 | 957 |
| 1055 int32_t CJBig2_Context::parsePatternDict(CJBig2_Segment* pSegment, | 958 int32_t CJBig2_Context::parsePatternDict(CJBig2_Segment* pSegment, |
| 1056 IFX_Pause* pPause) { | 959 IFX_Pause* pPause) { |
| 1057 FX_DWORD dwTemp; | |
| 1058 uint8_t cFlags; | 960 uint8_t cFlags; |
| 1059 JBig2ArithCtx* gbContext; | 961 nonstd::unique_ptr<CJBig2_PDDProc> pPDD(new CJBig2_PDDProc); |
| 1060 CJBig2_ArithDecoder* pArithDecoder; | |
| 1061 int32_t nRet; | |
| 1062 CJBig2_PDDProc* pPDD = new CJBig2_PDDProc(); | |
| 1063 if ((m_pStream->read1Byte(&cFlags) != 0) || | 962 if ((m_pStream->read1Byte(&cFlags) != 0) || |
| 1064 (m_pStream->read1Byte(&pPDD->HDPW) != 0) || | 963 (m_pStream->read1Byte(&pPDD->HDPW) != 0) || |
| 1065 (m_pStream->read1Byte(&pPDD->HDPH) != 0) || | 964 (m_pStream->read1Byte(&pPDD->HDPH) != 0) || |
| 1066 (m_pStream->readInteger(&pPDD->GRAYMAX) != 0)) { | 965 (m_pStream->readInteger(&pPDD->GRAYMAX) != 0)) { |
| 1067 nRet = JBIG2_ERROR_TOO_SHORT; | 966 return JBIG2_ERROR_TOO_SHORT; |
| 1068 goto failed; | |
| 1069 } | 967 } |
| 1070 if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) { | 968 if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) |
| 1071 nRet = JBIG2_ERROR_LIMIT; | 969 return JBIG2_ERROR_LIMIT; |
| 1072 goto failed; | 970 |
| 1073 } | |
| 1074 pPDD->HDMMR = cFlags & 0x01; | 971 pPDD->HDMMR = cFlags & 0x01; |
| 1075 pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03; | 972 pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03; |
| 1076 pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER; | 973 pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER; |
| 1077 if (pPDD->HDMMR == 0) { | 974 if (pPDD->HDMMR == 0) { |
| 1078 dwTemp = | 975 FX_DWORD dwTemp = |
| 1079 pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024; | 976 pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024; |
| 1080 gbContext = FX_Alloc(JBig2ArithCtx, dwTemp); | 977 nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext( |
| 1081 JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); | 978 FX_Alloc(JBig2ArithCtx, dwTemp)); |
| 1082 pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get()); | 979 JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * dwTemp); |
| 980 CJBig2_ArithDecoder* pArithDecoder = | |
|
Tom Sepez
2015/10/05 16:34:32
nit: unique_ptr here, too?
Lei Zhang
2015/10/07 07:51:11
Done.
| |
| 981 new CJBig2_ArithDecoder(m_pStream.get()); | |
| 1083 pSegment->m_Result.pd = | 982 pSegment->m_Result.pd = |
| 1084 pPDD->decode_Arith(pArithDecoder, gbContext, pPause); | 983 pPDD->decode_Arith(pArithDecoder, gbContext.get(), pPause); |
| 1085 delete pArithDecoder; | 984 delete pArithDecoder; |
| 1086 if (pSegment->m_Result.pd == NULL) { | 985 if (!pSegment->m_Result.pd) |
| 1087 FX_Free(gbContext); | 986 return JBIG2_ERROR_FATAL; |
| 1088 nRet = JBIG2_ERROR_FATAL; | 987 |
| 1089 goto failed; | |
| 1090 } | |
| 1091 FX_Free(gbContext); | |
| 1092 m_pStream->alignByte(); | 988 m_pStream->alignByte(); |
| 1093 m_pStream->offset(2); | 989 m_pStream->offset(2); |
| 1094 } else { | 990 } else { |
| 1095 pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream.get(), pPause); | 991 pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream.get(), pPause); |
| 1096 if (pSegment->m_Result.pd == NULL) { | 992 if (!pSegment->m_Result.pd) |
| 1097 nRet = JBIG2_ERROR_FATAL; | 993 return JBIG2_ERROR_FATAL; |
| 1098 goto failed; | |
| 1099 } | |
| 1100 m_pStream->alignByte(); | 994 m_pStream->alignByte(); |
| 1101 } | 995 } |
| 1102 delete pPDD; | |
| 1103 return JBIG2_SUCCESS; | 996 return JBIG2_SUCCESS; |
| 1104 failed: | |
| 1105 delete pPDD; | |
| 1106 return nRet; | |
| 1107 } | 997 } |
| 998 | |
| 1108 int32_t CJBig2_Context::parseHalftoneRegion(CJBig2_Segment* pSegment, | 999 int32_t CJBig2_Context::parseHalftoneRegion(CJBig2_Segment* pSegment, |
| 1109 IFX_Pause* pPause) { | 1000 IFX_Pause* pPause) { |
| 1110 FX_DWORD dwTemp; | |
| 1111 uint8_t cFlags; | 1001 uint8_t cFlags; |
| 1112 JBig2RegionInfo ri; | 1002 JBig2RegionInfo ri; |
| 1113 CJBig2_Segment* pSeg; | 1003 nonstd::unique_ptr<CJBig2_HTRDProc> pHRD(new CJBig2_HTRDProc); |
| 1114 CJBig2_PatternDict* pPatternDict; | |
| 1115 JBig2ArithCtx* gbContext; | |
| 1116 CJBig2_ArithDecoder* pArithDecoder; | |
| 1117 int32_t nRet; | |
| 1118 CJBig2_HTRDProc* pHRD = new CJBig2_HTRDProc(); | |
| 1119 if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) || | 1004 if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) || |
| 1120 (m_pStream->read1Byte(&cFlags) != 0) || | 1005 (m_pStream->read1Byte(&cFlags) != 0) || |
| 1121 (m_pStream->readInteger(&pHRD->HGW) != 0) || | 1006 (m_pStream->readInteger(&pHRD->HGW) != 0) || |
| 1122 (m_pStream->readInteger(&pHRD->HGH) != 0) || | 1007 (m_pStream->readInteger(&pHRD->HGH) != 0) || |
| 1123 (m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0) || | 1008 (m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0) || |
|
Tom Sepez
2015/10/05 16:34:31
nit: theoretically illegal casts here.
Lei Zhang
2015/10/07 07:51:12
file a bug so I don't forget these?
| |
| 1124 (m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0) || | 1009 (m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0) || |
| 1125 (m_pStream->readShortInteger(&pHRD->HRX) != 0) || | 1010 (m_pStream->readShortInteger(&pHRD->HRX) != 0) || |
| 1126 (m_pStream->readShortInteger(&pHRD->HRY) != 0)) { | 1011 (m_pStream->readShortInteger(&pHRD->HRY) != 0)) { |
| 1127 nRet = JBIG2_ERROR_TOO_SHORT; | 1012 return JBIG2_ERROR_TOO_SHORT; |
| 1128 goto failed; | |
| 1129 } | 1013 } |
| 1130 if (pHRD->HGW == 0 || pHRD->HGH == 0) { | 1014 |
| 1131 nRet = JBIG2_ERROR_FATAL; | 1015 if (pHRD->HGW == 0 || pHRD->HGH == 0) |
| 1132 goto failed; | 1016 return JBIG2_ERROR_FATAL; |
| 1133 } | |
| 1134 | 1017 |
| 1135 pHRD->HBW = ri.width; | 1018 pHRD->HBW = ri.width; |
| 1136 pHRD->HBH = ri.height; | 1019 pHRD->HBH = ri.height; |
| 1137 pHRD->HMMR = cFlags & 0x01; | 1020 pHRD->HMMR = cFlags & 0x01; |
| 1138 pHRD->HTEMPLATE = (cFlags >> 1) & 0x03; | 1021 pHRD->HTEMPLATE = (cFlags >> 1) & 0x03; |
| 1139 pHRD->HENABLESKIP = (cFlags >> 3) & 0x01; | 1022 pHRD->HENABLESKIP = (cFlags >> 3) & 0x01; |
| 1140 pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07); | 1023 pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07); |
| 1141 pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01; | 1024 pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01; |
| 1142 if (pSegment->m_nReferred_to_segment_count != 1) { | 1025 if (pSegment->m_nReferred_to_segment_count != 1) |
| 1143 nRet = JBIG2_ERROR_FATAL; | 1026 return JBIG2_ERROR_FATAL; |
| 1144 goto failed; | 1027 |
| 1145 } | 1028 CJBig2_Segment* pSeg = |
| 1146 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); | 1029 findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); |
| 1147 if ((pSeg == NULL) || (pSeg->m_cFlags.s.type != 16)) { | 1030 if (!pSeg || (pSeg->m_cFlags.s.type != 16)) |
| 1148 nRet = JBIG2_ERROR_FATAL; | 1031 return JBIG2_ERROR_FATAL; |
|
Tom Sepez
2015/10/05 16:34:32
Does this leak for the non-16 case?
Lei Zhang
2015/10/07 07:51:11
What are we leaking? |pSeg|? I don't think we have
Tom Sepez
2015/10/07 17:13:12
Acknowledged.
| |
| 1149 goto failed; | 1032 |
| 1150 } | 1033 CJBig2_PatternDict* pPatternDict = pSeg->m_Result.pd; |
| 1151 pPatternDict = pSeg->m_Result.pd; | 1034 if (!pPatternDict || (pPatternDict->NUMPATS == 0)) |
| 1152 if ((pPatternDict == NULL) || (pPatternDict->NUMPATS == 0)) { | 1035 return JBIG2_ERROR_FATAL; |
|
Tom Sepez
2015/10/05 16:34:32
ditto
Lei Zhang
2015/10/07 07:51:12
Ditto, no leak?
Tom Sepez
2015/10/07 17:13:12
Acknowledged.
| |
| 1153 nRet = JBIG2_ERROR_FATAL; | 1036 |
| 1154 goto failed; | |
| 1155 } | |
| 1156 pHRD->HNUMPATS = pPatternDict->NUMPATS; | 1037 pHRD->HNUMPATS = pPatternDict->NUMPATS; |
| 1157 pHRD->HPATS = pPatternDict->HDPATS; | 1038 pHRD->HPATS = pPatternDict->HDPATS; |
| 1158 pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth; | 1039 pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth; |
| 1159 pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight; | 1040 pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight; |
| 1160 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; | 1041 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
| 1161 if (pHRD->HMMR == 0) { | 1042 if (pHRD->HMMR == 0) { |
| 1162 dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024; | 1043 FX_DWORD dwTemp = |
| 1163 gbContext = FX_Alloc(JBig2ArithCtx, dwTemp); | 1044 pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024; |
| 1164 JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); | 1045 nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext( |
| 1165 pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get()); | 1046 FX_Alloc(JBig2ArithCtx, dwTemp)); |
| 1047 JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * dwTemp); | |
| 1048 CJBig2_ArithDecoder* pArithDecoder = | |
|
Tom Sepez
2015/10/05 16:34:31
nonstd unique ptr?
Lei Zhang
2015/10/07 07:51:11
Done.
| |
| 1049 new CJBig2_ArithDecoder(m_pStream.get()); | |
| 1166 pSegment->m_Result.im = | 1050 pSegment->m_Result.im = |
| 1167 pHRD->decode_Arith(pArithDecoder, gbContext, pPause); | 1051 pHRD->decode_Arith(pArithDecoder, gbContext.get(), pPause); |
| 1168 delete pArithDecoder; | 1052 delete pArithDecoder; |
| 1169 if (pSegment->m_Result.im == NULL) { | 1053 if (!pSegment->m_Result.im) |
| 1170 FX_Free(gbContext); | 1054 return JBIG2_ERROR_FATAL; |
| 1171 nRet = JBIG2_ERROR_FATAL; | 1055 |
| 1172 goto failed; | |
| 1173 } | |
| 1174 FX_Free(gbContext); | |
| 1175 m_pStream->alignByte(); | 1056 m_pStream->alignByte(); |
| 1176 m_pStream->offset(2); | 1057 m_pStream->offset(2); |
| 1177 } else { | 1058 } else { |
| 1178 pSegment->m_Result.im = pHRD->decode_MMR(m_pStream.get(), pPause); | 1059 pSegment->m_Result.im = pHRD->decode_MMR(m_pStream.get(), pPause); |
| 1179 if (pSegment->m_Result.im == NULL) { | 1060 if (!pSegment->m_Result.im) |
| 1180 nRet = JBIG2_ERROR_FATAL; | 1061 return JBIG2_ERROR_FATAL; |
| 1181 goto failed; | |
| 1182 } | |
| 1183 m_pStream->alignByte(); | 1062 m_pStream->alignByte(); |
| 1184 } | 1063 } |
| 1185 if (pSegment->m_cFlags.s.type != 20) { | 1064 if (pSegment->m_cFlags.s.type != 20) { |
| 1186 if (!m_bBufSpecified) { | 1065 if (!m_bBufSpecified) { |
| 1187 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); | 1066 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); |
| 1188 if ((pPageInfo->m_bIsStriped == 1) && | 1067 if ((pPageInfo->m_bIsStriped == 1) && |
| 1189 (ri.y + ri.height > m_pPage->m_nHeight)) { | 1068 (ri.y + ri.height > m_pPage->m_nHeight)) { |
| 1190 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); | 1069 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
| 1191 } | 1070 } |
| 1192 } | 1071 } |
| 1193 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, | 1072 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, |
| 1194 (JBig2ComposeOp)(ri.flags & 0x03)); | 1073 (JBig2ComposeOp)(ri.flags & 0x03)); |
| 1195 delete pSegment->m_Result.im; | 1074 delete pSegment->m_Result.im; |
| 1196 pSegment->m_Result.im = NULL; | 1075 pSegment->m_Result.im = NULL; |
| 1197 } | 1076 } |
| 1198 delete pHRD; | |
| 1199 return JBIG2_SUCCESS; | 1077 return JBIG2_SUCCESS; |
| 1200 failed: | |
| 1201 delete pHRD; | |
| 1202 return nRet; | |
| 1203 } | 1078 } |
| 1204 | 1079 |
| 1205 int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment, | 1080 int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment, |
| 1206 IFX_Pause* pPause) { | 1081 IFX_Pause* pPause) { |
| 1207 FX_DWORD dwTemp; | |
| 1208 uint8_t cFlags; | |
| 1209 int32_t i, nRet; | |
| 1210 if (!m_pGRD) { | 1082 if (!m_pGRD) { |
| 1211 m_pGRD.reset(new CJBig2_GRDProc); | 1083 m_pGRD.reset(new CJBig2_GRDProc); |
|
Tom Sepez
2015/10/05 16:34:31
maybe a local unique_ptr and nonstd::move() at the
Lei Zhang
2015/10/07 07:51:11
Done.
| |
| 1084 uint8_t cFlags; | |
| 1212 if ((parseRegionInfo(&m_ri) != JBIG2_SUCCESS) || | 1085 if ((parseRegionInfo(&m_ri) != JBIG2_SUCCESS) || |
| 1213 (m_pStream->read1Byte(&cFlags) != 0)) { | 1086 (m_pStream->read1Byte(&cFlags) != 0)) { |
| 1214 nRet = JBIG2_ERROR_TOO_SHORT; | 1087 m_pGRD.reset(); |
| 1215 goto failed; | 1088 return JBIG2_ERROR_TOO_SHORT; |
| 1216 } | 1089 } |
| 1217 if (m_ri.height < 0 || m_ri.width < 0) { | 1090 if (m_ri.height < 0 || m_ri.width < 0) { |
| 1218 nRet = JBIG2_FAILED; | 1091 m_pGRD.reset(); |
| 1219 goto failed; | 1092 return JBIG2_FAILED; |
| 1220 } | 1093 } |
| 1221 m_pGRD->GBW = m_ri.width; | 1094 m_pGRD->GBW = m_ri.width; |
| 1222 m_pGRD->GBH = m_ri.height; | 1095 m_pGRD->GBH = m_ri.height; |
| 1223 m_pGRD->MMR = cFlags & 0x01; | 1096 m_pGRD->MMR = cFlags & 0x01; |
| 1224 m_pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03; | 1097 m_pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03; |
| 1225 m_pGRD->TPGDON = (cFlags >> 3) & 0x01; | 1098 m_pGRD->TPGDON = (cFlags >> 3) & 0x01; |
| 1226 if (m_pGRD->MMR == 0) { | 1099 if (m_pGRD->MMR == 0) { |
| 1227 if (m_pGRD->GBTEMPLATE == 0) { | 1100 if (m_pGRD->GBTEMPLATE == 0) { |
| 1228 for (i = 0; i < 8; i++) { | 1101 for (int32_t i = 0; i < 8; i++) { |
| 1229 if (m_pStream->read1Byte((uint8_t*)&m_pGRD->GBAT[i]) != 0) { | 1102 if (m_pStream->read1Byte((uint8_t*)&m_pGRD->GBAT[i]) != 0) { |
| 1230 nRet = JBIG2_ERROR_TOO_SHORT; | 1103 m_pGRD.reset(); |
| 1231 goto failed; | 1104 return JBIG2_ERROR_TOO_SHORT; |
| 1232 } | 1105 } |
| 1233 } | 1106 } |
| 1234 } else { | 1107 } else { |
| 1235 for (i = 0; i < 2; i++) { | 1108 for (int32_t i = 0; i < 2; i++) { |
| 1236 if (m_pStream->read1Byte((uint8_t*)&m_pGRD->GBAT[i]) != 0) { | 1109 if (m_pStream->read1Byte((uint8_t*)&m_pGRD->GBAT[i]) != 0) { |
| 1237 nRet = JBIG2_ERROR_TOO_SHORT; | 1110 m_pGRD.reset(); |
| 1238 goto failed; | 1111 return JBIG2_ERROR_TOO_SHORT; |
| 1239 } | 1112 } |
| 1240 } | 1113 } |
| 1241 } | 1114 } |
| 1242 } | 1115 } |
| 1243 m_pGRD->USESKIP = 0; | 1116 m_pGRD->USESKIP = 0; |
| 1244 } | 1117 } |
| 1245 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; | 1118 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
| 1246 if (m_pGRD->MMR == 0) { | 1119 if (m_pGRD->MMR == 0) { |
| 1247 dwTemp = | 1120 FX_DWORD dwTemp = |
| 1248 m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024; | 1121 m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024; |
| 1249 if (m_gbContext == NULL) { | 1122 if (!m_gbContext) { |
| 1250 m_gbContext = FX_Alloc(JBig2ArithCtx, dwTemp); | 1123 m_gbContext = FX_Alloc(JBig2ArithCtx, dwTemp); |
| 1251 JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); | 1124 JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); |
| 1252 } | 1125 } |
| 1253 if (m_pArithDecoder == NULL) { | 1126 if (!m_pArithDecoder) { |
| 1254 m_pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get()); | 1127 m_pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get()); |
| 1255 m_ProcessingStatus = m_pGRD->Start_decode_Arith( | 1128 m_ProcessingStatus = m_pGRD->Start_decode_Arith( |
| 1256 &pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause); | 1129 &pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause); |
| 1257 } else { | 1130 } else { |
| 1258 m_ProcessingStatus = m_pGRD->Continue_decode(pPause); | 1131 m_ProcessingStatus = m_pGRD->Continue_decode(pPause); |
| 1259 } | 1132 } |
| 1260 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 1133 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
| 1261 if (pSegment->m_cFlags.s.type != 36) { | 1134 if (pSegment->m_cFlags.s.type != 36) { |
| 1262 if (!m_bBufSpecified) { | 1135 if (!m_bBufSpecified) { |
| 1263 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); | 1136 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); |
| 1264 if ((pPageInfo->m_bIsStriped == 1) && | 1137 if ((pPageInfo->m_bIsStriped == 1) && |
| 1265 (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { | 1138 (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { |
| 1266 m_pPage->expand(m_ri.y + m_ri.height, | 1139 m_pPage->expand(m_ri.y + m_ri.height, |
| 1267 (pPageInfo->m_cFlags & 4) ? 1 : 0); | 1140 (pPageInfo->m_cFlags & 4) ? 1 : 0); |
| 1268 } | 1141 } |
| 1269 } | 1142 } |
| 1270 FX_RECT Rect = m_pGRD->GetReplaceRect(); | 1143 FX_RECT Rect = m_pGRD->GetReplaceRect(); |
| 1271 m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, | 1144 m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, |
| 1272 pSegment->m_Result.im, | 1145 pSegment->m_Result.im, |
| 1273 (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); | 1146 (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); |
| 1274 } | 1147 } |
| 1275 return JBIG2_SUCCESS; | 1148 return JBIG2_SUCCESS; |
| 1276 } else { | 1149 } else { |
| 1277 delete m_pArithDecoder; | 1150 delete m_pArithDecoder; |
|
Tom Sepez
2015/10/05 16:34:31
should m_pArithDecoder be unique_ptr?
Lei Zhang
2015/10/07 07:51:12
Done.
| |
| 1278 m_pArithDecoder = NULL; | 1151 m_pArithDecoder = NULL; |
| 1279 if (pSegment->m_Result.im == NULL) { | |
| 1280 FX_Free(m_gbContext); | |
| 1281 nRet = JBIG2_ERROR_FATAL; | |
| 1282 m_gbContext = NULL; | |
| 1283 m_ProcessingStatus = FXCODEC_STATUS_ERROR; | |
| 1284 goto failed; | |
| 1285 } | |
| 1286 FX_Free(m_gbContext); | 1152 FX_Free(m_gbContext); |
| 1287 m_gbContext = NULL; | 1153 m_gbContext = NULL; |
| 1154 if (!pSegment->m_Result.im) { | |
| 1155 m_ProcessingStatus = FXCODEC_STATUS_ERROR; | |
| 1156 m_pGRD.reset(); | |
| 1157 return JBIG2_ERROR_FATAL; | |
| 1158 } | |
| 1288 m_pStream->alignByte(); | 1159 m_pStream->alignByte(); |
| 1289 m_pStream->offset(2); | 1160 m_pStream->offset(2); |
| 1290 } | 1161 } |
| 1291 } else { | 1162 } else { |
| 1292 FXCODEC_STATUS status = m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, | 1163 FXCODEC_STATUS status = m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, |
| 1293 m_pStream.get(), pPause); | 1164 m_pStream.get(), pPause); |
| 1294 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 1165 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
| 1295 m_pGRD->Continue_decode(pPause); | 1166 m_pGRD->Continue_decode(pPause); |
| 1296 } | 1167 } |
| 1297 if (pSegment->m_Result.im == NULL) { | 1168 if (!pSegment->m_Result.im) { |
| 1298 nRet = JBIG2_ERROR_FATAL; | 1169 m_pGRD.reset(); |
| 1299 goto failed; | 1170 return JBIG2_ERROR_FATAL; |
| 1300 } | 1171 } |
| 1301 m_pStream->alignByte(); | 1172 m_pStream->alignByte(); |
| 1302 } | 1173 } |
| 1303 if (pSegment->m_cFlags.s.type != 36) { | 1174 if (pSegment->m_cFlags.s.type != 36) { |
| 1304 if (!m_bBufSpecified) { | 1175 if (!m_bBufSpecified) { |
| 1305 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); | 1176 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); |
| 1306 if ((pPageInfo->m_bIsStriped == 1) && | 1177 if ((pPageInfo->m_bIsStriped == 1) && |
| 1307 (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { | 1178 (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { |
| 1308 m_pPage->expand(m_ri.y + m_ri.height, | 1179 m_pPage->expand(m_ri.y + m_ri.height, |
| 1309 (pPageInfo->m_cFlags & 4) ? 1 : 0); | 1180 (pPageInfo->m_cFlags & 4) ? 1 : 0); |
| 1310 } | 1181 } |
| 1311 } | 1182 } |
| 1312 FX_RECT Rect = m_pGRD->GetReplaceRect(); | 1183 FX_RECT Rect = m_pGRD->GetReplaceRect(); |
| 1313 m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, | 1184 m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, |
| 1314 pSegment->m_Result.im, | 1185 pSegment->m_Result.im, |
| 1315 (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); | 1186 (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); |
| 1316 delete pSegment->m_Result.im; | 1187 delete pSegment->m_Result.im; |
| 1317 pSegment->m_Result.im = NULL; | 1188 pSegment->m_Result.im = NULL; |
| 1318 } | 1189 } |
| 1319 m_pGRD.reset(); | 1190 m_pGRD.reset(); |
| 1320 return JBIG2_SUCCESS; | 1191 return JBIG2_SUCCESS; |
| 1321 failed: | |
| 1322 m_pGRD.reset(); | |
| 1323 return nRet; | |
| 1324 } | 1192 } |
| 1325 | 1193 |
| 1326 int32_t CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment* pSegment) { | 1194 int32_t CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment* pSegment) { |
| 1327 FX_DWORD dwTemp; | |
| 1328 JBig2RegionInfo ri; | 1195 JBig2RegionInfo ri; |
| 1329 CJBig2_Segment* pSeg; | |
| 1330 int32_t i, nRet; | |
| 1331 uint8_t cFlags; | 1196 uint8_t cFlags; |
| 1332 JBig2ArithCtx* grContext; | |
| 1333 CJBig2_ArithDecoder* pArithDecoder; | |
| 1334 CJBig2_GRRDProc* pGRRD = new CJBig2_GRRDProc(); | |
| 1335 if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) || | 1197 if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) || |
| 1336 (m_pStream->read1Byte(&cFlags) != 0)) { | 1198 (m_pStream->read1Byte(&cFlags) != 0)) { |
| 1337 nRet = JBIG2_ERROR_TOO_SHORT; | 1199 return JBIG2_ERROR_TOO_SHORT; |
| 1338 goto failed; | |
| 1339 } | 1200 } |
| 1201 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc); | |
| 1340 pGRRD->GRW = ri.width; | 1202 pGRRD->GRW = ri.width; |
| 1341 pGRRD->GRH = ri.height; | 1203 pGRRD->GRH = ri.height; |
| 1342 pGRRD->GRTEMPLATE = cFlags & 0x01; | 1204 pGRRD->GRTEMPLATE = cFlags & 0x01; |
| 1343 pGRRD->TPGRON = (cFlags >> 1) & 0x01; | 1205 pGRRD->TPGRON = (cFlags >> 1) & 0x01; |
| 1344 if (pGRRD->GRTEMPLATE == 0) { | 1206 if (pGRRD->GRTEMPLATE == 0) { |
| 1345 for (i = 0; i < 4; i++) { | 1207 for (int32_t i = 0; i < 4; i++) { |
| 1346 if (m_pStream->read1Byte((uint8_t*)&pGRRD->GRAT[i]) != 0) { | 1208 if (m_pStream->read1Byte((uint8_t*)&pGRRD->GRAT[i]) != 0) |
| 1347 nRet = JBIG2_ERROR_TOO_SHORT; | 1209 return JBIG2_ERROR_TOO_SHORT; |
| 1348 goto failed; | |
| 1349 } | |
| 1350 } | 1210 } |
| 1351 } | 1211 } |
| 1352 pSeg = NULL; | 1212 CJBig2_Segment* pSeg = nullptr; |
| 1353 if (pSegment->m_nReferred_to_segment_count > 0) { | 1213 if (pSegment->m_nReferred_to_segment_count > 0) { |
| 1214 int32_t i; | |
| 1354 for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { | 1215 for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) { |
| 1355 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); | 1216 pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); |
| 1356 if (pSeg == NULL) { | 1217 if (!pSeg) |
| 1357 nRet = JBIG2_ERROR_FATAL; | 1218 return JBIG2_ERROR_FATAL; |
| 1358 goto failed; | 1219 |
| 1359 } | |
| 1360 if ((pSeg->m_cFlags.s.type == 4) || (pSeg->m_cFlags.s.type == 20) || | 1220 if ((pSeg->m_cFlags.s.type == 4) || (pSeg->m_cFlags.s.type == 20) || |
| 1361 (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) { | 1221 (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) { |
| 1362 break; | 1222 break; |
| 1363 } | 1223 } |
| 1364 } | 1224 } |
| 1365 if (i >= pSegment->m_nReferred_to_segment_count) { | 1225 if (i >= pSegment->m_nReferred_to_segment_count) |
| 1366 nRet = JBIG2_ERROR_FATAL; | 1226 return JBIG2_ERROR_FATAL; |
| 1367 goto failed; | 1227 |
| 1368 } | |
| 1369 pGRRD->GRREFERENCE = pSeg->m_Result.im; | 1228 pGRRD->GRREFERENCE = pSeg->m_Result.im; |
| 1370 } else { | 1229 } else { |
| 1371 pGRRD->GRREFERENCE = m_pPage.get(); | 1230 pGRRD->GRREFERENCE = m_pPage.get(); |
| 1372 } | 1231 } |
| 1373 pGRRD->GRREFERENCEDX = 0; | 1232 pGRRD->GRREFERENCEDX = 0; |
| 1374 pGRRD->GRREFERENCEDY = 0; | 1233 pGRRD->GRREFERENCEDY = 0; |
| 1375 dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13; | 1234 FX_DWORD dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13; |
|
Tom Sepez
2015/10/05 16:34:32
nit: our friends 1k and 8k again.
Lei Zhang
2015/10/07 07:51:12
Done.
| |
| 1376 grContext = FX_Alloc(JBig2ArithCtx, dwTemp); | 1235 nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> grContext( |
| 1377 JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp); | 1236 FX_Alloc(JBig2ArithCtx, dwTemp)); |
| 1378 pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get()); | 1237 JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * dwTemp); |
| 1238 CJBig2_ArithDecoder* pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get()); | |
| 1379 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; | 1239 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; |
| 1380 pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext); | 1240 pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext.get()); |
| 1381 delete pArithDecoder; | 1241 delete pArithDecoder; |
|
Tom Sepez
2015/10/05 16:34:32
same pattern here as above
Lei Zhang
2015/10/07 07:51:11
Done.
| |
| 1382 if (pSegment->m_Result.im == NULL) { | 1242 if (!pSegment->m_Result.im) |
| 1383 FX_Free(grContext); | 1243 return JBIG2_ERROR_FATAL; |
| 1384 nRet = JBIG2_ERROR_FATAL; | 1244 |
| 1385 goto failed; | |
| 1386 } | |
| 1387 FX_Free(grContext); | |
| 1388 m_pStream->alignByte(); | 1245 m_pStream->alignByte(); |
| 1389 m_pStream->offset(2); | 1246 m_pStream->offset(2); |
| 1390 if (pSegment->m_cFlags.s.type != 40) { | 1247 if (pSegment->m_cFlags.s.type != 40) { |
| 1391 if (!m_bBufSpecified) { | 1248 if (!m_bBufSpecified) { |
| 1392 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); | 1249 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); |
| 1393 if ((pPageInfo->m_bIsStriped == 1) && | 1250 if ((pPageInfo->m_bIsStriped == 1) && |
| 1394 (ri.y + ri.height > m_pPage->m_nHeight)) { | 1251 (ri.y + ri.height > m_pPage->m_nHeight)) { |
| 1395 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); | 1252 m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); |
| 1396 } | 1253 } |
| 1397 } | 1254 } |
| 1398 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, | 1255 m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, |
| 1399 (JBig2ComposeOp)(ri.flags & 0x03)); | 1256 (JBig2ComposeOp)(ri.flags & 0x03)); |
| 1400 delete pSegment->m_Result.im; | 1257 delete pSegment->m_Result.im; |
| 1401 pSegment->m_Result.im = NULL; | 1258 pSegment->m_Result.im = NULL; |
| 1402 } | 1259 } |
| 1403 delete pGRRD; | |
| 1404 return JBIG2_SUCCESS; | 1260 return JBIG2_SUCCESS; |
| 1405 failed: | |
| 1406 delete pGRRD; | |
| 1407 return nRet; | |
| 1408 } | 1261 } |
| 1262 | |
| 1409 int32_t CJBig2_Context::parseTable(CJBig2_Segment* pSegment) { | 1263 int32_t CJBig2_Context::parseTable(CJBig2_Segment* pSegment) { |
| 1410 pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER; | 1264 pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER; |
| 1411 pSegment->m_Result.ht = new CJBig2_HuffmanTable(m_pStream.get()); | 1265 pSegment->m_Result.ht = new CJBig2_HuffmanTable(m_pStream.get()); |
| 1412 if (!pSegment->m_Result.ht->isOK()) { | 1266 if (!pSegment->m_Result.ht->isOK()) { |
| 1413 delete pSegment->m_Result.ht; | 1267 delete pSegment->m_Result.ht; |
| 1414 pSegment->m_Result.ht = NULL; | 1268 pSegment->m_Result.ht = NULL; |
| 1415 return JBIG2_ERROR_FATAL; | 1269 return JBIG2_ERROR_FATAL; |
| 1416 } | 1270 } |
| 1417 m_pStream->alignByte(); | 1271 m_pStream->alignByte(); |
| 1418 return JBIG2_SUCCESS; | 1272 return JBIG2_SUCCESS; |
| 1419 } | 1273 } |
| 1274 | |
| 1420 int32_t CJBig2_Context::parseRegionInfo(JBig2RegionInfo* pRI) { | 1275 int32_t CJBig2_Context::parseRegionInfo(JBig2RegionInfo* pRI) { |
| 1421 if ((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0) || | 1276 if ((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0) || |
| 1422 (m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0) || | 1277 (m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0) || |
| 1423 (m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0) || | 1278 (m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0) || |
| 1424 (m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0) || | 1279 (m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0) || |
| 1425 (m_pStream->read1Byte(&pRI->flags) != 0)) { | 1280 (m_pStream->read1Byte(&pRI->flags) != 0)) { |
| 1426 return JBIG2_ERROR_TOO_SHORT; | 1281 return JBIG2_ERROR_TOO_SHORT; |
| 1427 } | 1282 } |
| 1428 return JBIG2_SUCCESS; | 1283 return JBIG2_SUCCESS; |
| 1429 } | 1284 } |
| 1285 | |
| 1430 JBig2HuffmanCode* CJBig2_Context::decodeSymbolIDHuffmanTable( | 1286 JBig2HuffmanCode* CJBig2_Context::decodeSymbolIDHuffmanTable( |
| 1431 CJBig2_BitStream* pStream, | 1287 CJBig2_BitStream* pStream, |
| 1432 FX_DWORD SBNUMSYMS) { | 1288 FX_DWORD SBNUMSYMS) { |
| 1433 JBig2HuffmanCode* SBSYMCODES; | 1289 size_t kRunCodesSize = 35; |
| 1434 int32_t runcodes[35]; | 1290 int32_t runcodes[kRunCodesSize]; |
| 1435 int32_t runcodes_len[35]; | 1291 int32_t runcodes_len[kRunCodesSize]; |
| 1436 int32_t runcode; | 1292 for (int32_t i = 0; i < kRunCodesSize; i++) { |
| 1437 int32_t i; | 1293 if (pStream->readNBits(4, &runcodes_len[i]) != 0) |
| 1438 int32_t j; | 1294 return nullptr; |
| 1439 int32_t nVal; | 1295 } |
| 1440 int32_t nBits; | 1296 huffman_assign_code(runcodes, runcodes_len, kRunCodesSize); |
| 1297 | |
| 1298 nonstd::unique_ptr<JBig2HuffmanCode, FxFreeDeleter> SBSYMCODES( | |
| 1299 FX_Alloc(JBig2HuffmanCode, SBNUMSYMS)); | |
| 1441 int32_t run; | 1300 int32_t run; |
| 1442 FX_DWORD nTemp; | 1301 int32_t i = 0; |
| 1443 SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS); | |
| 1444 for (i = 0; i < 35; i++) { | |
| 1445 if (pStream->readNBits(4, &runcodes_len[i]) != 0) { | |
| 1446 goto failed; | |
| 1447 } | |
| 1448 } | |
| 1449 huffman_assign_code(runcodes, runcodes_len, 35); | |
| 1450 i = 0; | |
| 1451 while (i < (int)SBNUMSYMS) { | 1302 while (i < (int)SBNUMSYMS) { |
| 1452 nVal = 0; | 1303 int32_t j; |
| 1453 nBits = 0; | 1304 int32_t nVal = 0; |
| 1454 for (;;) { | 1305 int32_t nBits = 0; |
| 1455 if (pStream->read1Bit(&nTemp) != 0) { | 1306 FX_DWORD nTemp; |
| 1456 goto failed; | 1307 while (true) { |
| 1457 } | 1308 if (pStream->read1Bit(&nTemp) != 0) |
| 1309 return nullptr; | |
| 1310 | |
| 1458 nVal = (nVal << 1) | nTemp; | 1311 nVal = (nVal << 1) | nTemp; |
| 1459 nBits++; | 1312 nBits++; |
| 1460 for (j = 0; j < 35; j++) { | 1313 for (j = 0; j < kRunCodesSize; j++) { |
| 1461 if ((nBits == runcodes_len[j]) && (nVal == runcodes[j])) { | 1314 if ((nBits == runcodes_len[j]) && (nVal == runcodes[j])) { |
|
Tom Sepez
2015/10/05 16:34:31
nit: overparenthesized.
Lei Zhang
2015/10/07 07:51:11
Done.
| |
| 1462 break; | 1315 break; |
| 1463 } | 1316 } |
| 1464 } | 1317 } |
| 1465 if (j < 35) { | 1318 if (j < kRunCodesSize) { |
| 1466 break; | 1319 break; |
| 1467 } | 1320 } |
| 1468 } | 1321 } |
| 1469 runcode = j; | 1322 int32_t runcode = j; |
| 1470 if (runcode < 32) { | 1323 if (runcode < 32) { |
| 1471 SBSYMCODES[i].codelen = runcode; | 1324 SBSYMCODES.get()[i].codelen = runcode; |
| 1472 run = 0; | 1325 run = 0; |
| 1473 } else if (runcode == 32) { | 1326 } else if (runcode == 32) { |
| 1474 if (pStream->readNBits(2, &nTemp) != 0) { | 1327 if (pStream->readNBits(2, &nTemp) != 0) |
| 1475 goto failed; | 1328 return nullptr; |
| 1476 } | |
| 1477 run = nTemp + 3; | 1329 run = nTemp + 3; |
| 1478 } else if (runcode == 33) { | 1330 } else if (runcode == 33) { |
| 1479 if (pStream->readNBits(3, &nTemp) != 0) { | 1331 if (pStream->readNBits(3, &nTemp) != 0) |
| 1480 goto failed; | 1332 return nullptr; |
| 1481 } | |
| 1482 run = nTemp + 3; | 1333 run = nTemp + 3; |
| 1483 } else if (runcode == 34) { | 1334 } else if (runcode == 34) { |
| 1484 if (pStream->readNBits(7, &nTemp) != 0) { | 1335 if (pStream->readNBits(7, &nTemp) != 0) |
| 1485 goto failed; | 1336 return nullptr; |
| 1486 } | |
| 1487 run = nTemp + 11; | 1337 run = nTemp + 11; |
| 1488 } | 1338 } |
| 1489 if (run > 0) { | 1339 if (run > 0) { |
| 1490 if (i + run > (int)SBNUMSYMS) { | 1340 if (i + run > (int)SBNUMSYMS) |
| 1491 goto failed; | 1341 return nullptr; |
| 1492 } | |
| 1493 for (j = 0; j < run; j++) { | 1342 for (j = 0; j < run; j++) { |
| 1494 if (runcode == 32 && i > 0) { | 1343 if (runcode == 32 && i > 0) { |
| 1495 SBSYMCODES[i + j].codelen = SBSYMCODES[i - 1].codelen; | 1344 SBSYMCODES.get()[i + j].codelen = SBSYMCODES.get()[i - 1].codelen; |
| 1496 } else { | 1345 } else { |
| 1497 SBSYMCODES[i + j].codelen = 0; | 1346 SBSYMCODES.get()[i + j].codelen = 0; |
| 1498 } | 1347 } |
| 1499 } | 1348 } |
| 1500 i += run; | 1349 i += run; |
| 1501 } else { | 1350 } else { |
| 1502 i++; | 1351 i++; |
| 1503 } | 1352 } |
| 1504 } | 1353 } |
| 1505 huffman_assign_code(SBSYMCODES, SBNUMSYMS); | 1354 huffman_assign_code(SBSYMCODES.get(), SBNUMSYMS); |
| 1506 return SBSYMCODES; | 1355 return SBSYMCODES.release(); |
| 1507 failed: | |
| 1508 FX_Free(SBSYMCODES); | |
| 1509 return NULL; | |
| 1510 } | 1356 } |
| 1357 | |
| 1511 void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP) { | 1358 void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP) { |
| 1512 int CURLEN, LENMAX, CURCODE, CURTEMP, i; | 1359 int CURLEN, LENMAX, CURCODE, CURTEMP, i; |
| 1513 int* LENCOUNT; | 1360 int* LENCOUNT; |
| 1514 int* FIRSTCODE; | 1361 int* FIRSTCODE; |
| 1515 LENMAX = 0; | 1362 LENMAX = 0; |
| 1516 for (i = 0; i < NTEMP; i++) { | 1363 for (i = 0; i < NTEMP; i++) { |
| 1517 if (PREFLEN[i] > LENMAX) { | 1364 if (PREFLEN[i] > LENMAX) { |
| 1518 LENMAX = PREFLEN[i]; | 1365 LENMAX = PREFLEN[i]; |
| 1519 } | 1366 } |
| 1520 } | 1367 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1572 SBSYMCODES[CURTEMP].code = CURCODE; | 1419 SBSYMCODES[CURTEMP].code = CURCODE; |
| 1573 CURCODE = CURCODE + 1; | 1420 CURCODE = CURCODE + 1; |
| 1574 } | 1421 } |
| 1575 CURTEMP = CURTEMP + 1; | 1422 CURTEMP = CURTEMP + 1; |
| 1576 } | 1423 } |
| 1577 CURLEN = CURLEN + 1; | 1424 CURLEN = CURLEN + 1; |
| 1578 } | 1425 } |
| 1579 FX_Free(LENCOUNT); | 1426 FX_Free(LENCOUNT); |
| 1580 FX_Free(FIRSTCODE); | 1427 FX_Free(FIRSTCODE); |
| 1581 } | 1428 } |
| OLD | NEW |