Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Side by Side Diff: core/src/fxcodec/jbig2/JBig2_Context.cpp

Issue 1382613003: Remove gotos in JBig2 code. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | core/src/fxcodec/jbig2/JBig2_GsidProc.cpp » ('j') | core/src/fxcodec/jbig2/JBig2_GsidProc.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698