| OLD | NEW |
| 1 // Copyright 2015 PDFium Authors. All rights reserved. | 1 // Copyright 2015 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "core/fxcodec/jbig2/JBig2_SddProc.h" | 7 #include "core/fxcodec/jbig2/JBig2_SddProc.h" |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 133 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| 134 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, | 134 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
| 135 NSYMSDECODED * sizeof(CJBig2_Image*)); | 135 NSYMSDECODED * sizeof(CJBig2_Image*)); |
| 136 pDecoder->SBSYMS = SBSYMS; | 136 pDecoder->SBSYMS = SBSYMS; |
| 137 pDecoder->SBDEFPIXEL = 0; | 137 pDecoder->SBDEFPIXEL = 0; |
| 138 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; | 138 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
| 139 pDecoder->TRANSPOSED = 0; | 139 pDecoder->TRANSPOSED = 0; |
| 140 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; | 140 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
| 141 pDecoder->SBDSOFFSET = 0; | 141 pDecoder->SBDSOFFSET = 0; |
| 142 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS(new CJBig2_HuffmanTable( | 142 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS(new CJBig2_HuffmanTable( |
| 143 HuffmanTable_B6, FX_ArraySize(HuffmanTable_B6), | 143 HuffmanTable_B6, HuffmanTable_B6_Size, HuffmanTable_HTOOB_B6)); |
| 144 HuffmanTable_HTOOB_B6)); | |
| 145 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS(new CJBig2_HuffmanTable( | 144 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS(new CJBig2_HuffmanTable( |
| 146 HuffmanTable_B8, FX_ArraySize(HuffmanTable_B8), | 145 HuffmanTable_B8, HuffmanTable_B8_Size, HuffmanTable_HTOOB_B8)); |
| 147 HuffmanTable_HTOOB_B8)); | |
| 148 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT(new CJBig2_HuffmanTable( | 146 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT(new CJBig2_HuffmanTable( |
| 149 HuffmanTable_B11, FX_ArraySize(HuffmanTable_B11), | 147 HuffmanTable_B11, HuffmanTable_B11_Size, HuffmanTable_HTOOB_B11)); |
| 150 HuffmanTable_HTOOB_B11)); | |
| 151 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( | 148 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( |
| 152 new CJBig2_HuffmanTable(HuffmanTable_B15, | 149 new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, |
| 153 FX_ArraySize(HuffmanTable_B15), | |
| 154 HuffmanTable_HTOOB_B15)); | 150 HuffmanTable_HTOOB_B15)); |
| 155 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( | 151 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( |
| 156 new CJBig2_HuffmanTable(HuffmanTable_B15, | 152 new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, |
| 157 FX_ArraySize(HuffmanTable_B15), | |
| 158 HuffmanTable_HTOOB_B15)); | 153 HuffmanTable_HTOOB_B15)); |
| 159 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( | 154 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( |
| 160 new CJBig2_HuffmanTable(HuffmanTable_B15, | 155 new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, |
| 161 FX_ArraySize(HuffmanTable_B15), | |
| 162 HuffmanTable_HTOOB_B15)); | 156 HuffmanTable_HTOOB_B15)); |
| 163 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( | 157 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( |
| 164 new CJBig2_HuffmanTable(HuffmanTable_B15, | 158 new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, |
| 165 FX_ArraySize(HuffmanTable_B15), | |
| 166 HuffmanTable_HTOOB_B15)); | 159 HuffmanTable_HTOOB_B15)); |
| 167 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( | 160 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( |
| 168 new CJBig2_HuffmanTable(HuffmanTable_B1, | 161 new CJBig2_HuffmanTable(HuffmanTable_B1, HuffmanTable_B1_Size, |
| 169 FX_ArraySize(HuffmanTable_B1), | |
| 170 HuffmanTable_HTOOB_B1)); | 162 HuffmanTable_HTOOB_B1)); |
| 171 pDecoder->SBHUFFFS = SBHUFFFS.get(); | 163 pDecoder->SBHUFFFS = SBHUFFFS.get(); |
| 172 pDecoder->SBHUFFDS = SBHUFFDS.get(); | 164 pDecoder->SBHUFFDS = SBHUFFDS.get(); |
| 173 pDecoder->SBHUFFDT = SBHUFFDT.get(); | 165 pDecoder->SBHUFFDT = SBHUFFDT.get(); |
| 174 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); | 166 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); |
| 175 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); | 167 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); |
| 176 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); | 168 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); |
| 177 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); | 169 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); |
| 178 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE.get(); | 170 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE.get(); |
| 179 pDecoder->SBRTEMPLATE = SDRTEMPLATE; | 171 pDecoder->SBRTEMPLATE = SDRTEMPLATE; |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 382 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| 391 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, | 383 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
| 392 NSYMSDECODED * sizeof(CJBig2_Image*)); | 384 NSYMSDECODED * sizeof(CJBig2_Image*)); |
| 393 pDecoder->SBSYMS = SBSYMS; | 385 pDecoder->SBSYMS = SBSYMS; |
| 394 pDecoder->SBDEFPIXEL = 0; | 386 pDecoder->SBDEFPIXEL = 0; |
| 395 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; | 387 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
| 396 pDecoder->TRANSPOSED = 0; | 388 pDecoder->TRANSPOSED = 0; |
| 397 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; | 389 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
| 398 pDecoder->SBDSOFFSET = 0; | 390 pDecoder->SBDSOFFSET = 0; |
| 399 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS(new CJBig2_HuffmanTable( | 391 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS(new CJBig2_HuffmanTable( |
| 400 HuffmanTable_B6, FX_ArraySize(HuffmanTable_B6), | 392 HuffmanTable_B6, HuffmanTable_B6_Size, HuffmanTable_HTOOB_B6)); |
| 401 HuffmanTable_HTOOB_B6)); | |
| 402 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS(new CJBig2_HuffmanTable( | 393 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS(new CJBig2_HuffmanTable( |
| 403 HuffmanTable_B8, FX_ArraySize(HuffmanTable_B8), | 394 HuffmanTable_B8, HuffmanTable_B8_Size, HuffmanTable_HTOOB_B8)); |
| 404 HuffmanTable_HTOOB_B8)); | |
| 405 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT(new CJBig2_HuffmanTable( | 395 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT(new CJBig2_HuffmanTable( |
| 406 HuffmanTable_B11, FX_ArraySize(HuffmanTable_B11), | 396 HuffmanTable_B11, HuffmanTable_B11_Size, HuffmanTable_HTOOB_B11)); |
| 407 HuffmanTable_HTOOB_B11)); | |
| 408 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( | 397 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( |
| 409 new CJBig2_HuffmanTable(HuffmanTable_B15, | 398 new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, |
| 410 FX_ArraySize(HuffmanTable_B15), | |
| 411 HuffmanTable_HTOOB_B15)); | 399 HuffmanTable_HTOOB_B15)); |
| 412 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( | 400 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( |
| 413 new CJBig2_HuffmanTable(HuffmanTable_B15, | 401 new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, |
| 414 FX_ArraySize(HuffmanTable_B15), | |
| 415 HuffmanTable_HTOOB_B15)); | 402 HuffmanTable_HTOOB_B15)); |
| 416 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( | 403 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( |
| 417 new CJBig2_HuffmanTable(HuffmanTable_B15, | 404 new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, |
| 418 FX_ArraySize(HuffmanTable_B15), | |
| 419 HuffmanTable_HTOOB_B15)); | 405 HuffmanTable_HTOOB_B15)); |
| 420 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( | 406 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( |
| 421 new CJBig2_HuffmanTable(HuffmanTable_B15, | 407 new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, |
| 422 FX_ArraySize(HuffmanTable_B15), | |
| 423 HuffmanTable_HTOOB_B15)); | 408 HuffmanTable_HTOOB_B15)); |
| 424 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( | 409 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( |
| 425 new CJBig2_HuffmanTable(HuffmanTable_B1, | 410 new CJBig2_HuffmanTable(HuffmanTable_B1, HuffmanTable_B1_Size, |
| 426 FX_ArraySize(HuffmanTable_B1), | |
| 427 HuffmanTable_HTOOB_B1)); | 411 HuffmanTable_HTOOB_B1)); |
| 428 pDecoder->SBHUFFFS = SBHUFFFS.get(); | 412 pDecoder->SBHUFFFS = SBHUFFFS.get(); |
| 429 pDecoder->SBHUFFDS = SBHUFFDS.get(); | 413 pDecoder->SBHUFFDS = SBHUFFDS.get(); |
| 430 pDecoder->SBHUFFDT = SBHUFFDT.get(); | 414 pDecoder->SBHUFFDT = SBHUFFDT.get(); |
| 431 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); | 415 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); |
| 432 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); | 416 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); |
| 433 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); | 417 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); |
| 434 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); | 418 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); |
| 435 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE.get(); | 419 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE.get(); |
| 436 pDecoder->SBRTEMPLATE = SDRTEMPLATE; | 420 pDecoder->SBRTEMPLATE = SDRTEMPLATE; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 (nBits == SBSYMCODES[IDI].codelen)) { | 455 (nBits == SBSYMCODES[IDI].codelen)) { |
| 472 break; | 456 break; |
| 473 } | 457 } |
| 474 } | 458 } |
| 475 if (IDI < SBNUMSYMS) { | 459 if (IDI < SBNUMSYMS) { |
| 476 break; | 460 break; |
| 477 } | 461 } |
| 478 } | 462 } |
| 479 FX_Free(SBSYMCODES); | 463 FX_Free(SBSYMCODES); |
| 480 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( | 464 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( |
| 481 new CJBig2_HuffmanTable(HuffmanTable_B15, | 465 new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, |
| 482 FX_ArraySize(HuffmanTable_B15), | |
| 483 HuffmanTable_HTOOB_B15)); | 466 HuffmanTable_HTOOB_B15)); |
| 484 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( | 467 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( |
| 485 new CJBig2_HuffmanTable(HuffmanTable_B1, | 468 new CJBig2_HuffmanTable(HuffmanTable_B1, HuffmanTable_B1_Size, |
| 486 FX_ArraySize(HuffmanTable_B1), | |
| 487 HuffmanTable_HTOOB_B1)); | 469 HuffmanTable_HTOOB_B1)); |
| 488 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDXI) != 0) || | 470 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDXI) != 0) || |
| 489 (pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDYI) != 0) || | 471 (pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDYI) != 0) || |
| 490 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE.get(), &nVal) != 0)) { | 472 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE.get(), &nVal) != 0)) { |
| 491 goto failed; | 473 goto failed; |
| 492 } | 474 } |
| 493 pStream->alignByte(); | 475 pStream->alignByte(); |
| 494 nTmp = pStream->getOffset(); | 476 nTmp = pStream->getOffset(); |
| 495 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); | 477 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); |
| 496 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 478 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 for (I = HCFIRSTSYM; I < NSYMSDECODED; I++) { | 548 for (I = HCFIRSTSYM; I < NSYMSDECODED; I++) { |
| 567 SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT); | 549 SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT); |
| 568 nTmp += SDNEWSYMWIDTHS[I]; | 550 nTmp += SDNEWSYMWIDTHS[I]; |
| 569 } | 551 } |
| 570 delete BHC; | 552 delete BHC; |
| 571 BHC = nullptr; | 553 BHC = nullptr; |
| 572 } | 554 } |
| 573 } | 555 } |
| 574 EXINDEX = 0; | 556 EXINDEX = 0; |
| 575 CUREXFLAG = 0; | 557 CUREXFLAG = 0; |
| 576 pTable.reset(new CJBig2_HuffmanTable( | 558 pTable.reset(new CJBig2_HuffmanTable(HuffmanTable_B1, HuffmanTable_B1_Size, |
| 577 HuffmanTable_B1, FX_ArraySize(HuffmanTable_B1), HuffmanTable_HTOOB_B1)); | 559 HuffmanTable_HTOOB_B1)); |
| 578 EXFLAGS = FX_Alloc(FX_BOOL, SDNUMINSYMS + SDNUMNEWSYMS); | 560 EXFLAGS = FX_Alloc(FX_BOOL, SDNUMINSYMS + SDNUMNEWSYMS); |
| 579 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { | 561 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { |
| 580 if (pHuffmanDecoder->decodeAValue(pTable.get(), (int*)&EXRUNLENGTH) != 0) { | 562 if (pHuffmanDecoder->decodeAValue(pTable.get(), (int*)&EXRUNLENGTH) != 0) { |
| 581 FX_Free(EXFLAGS); | 563 FX_Free(EXFLAGS); |
| 582 goto failed; | 564 goto failed; |
| 583 } | 565 } |
| 584 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { | 566 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { |
| 585 FX_Free(EXFLAGS); | 567 FX_Free(EXFLAGS); |
| 586 goto failed; | 568 goto failed; |
| 587 } | 569 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 615 failed: | 597 failed: |
| 616 for (I = 0; I < NSYMSDECODED; I++) { | 598 for (I = 0; I < NSYMSDECODED; I++) { |
| 617 delete SDNEWSYMS[I]; | 599 delete SDNEWSYMS[I]; |
| 618 } | 600 } |
| 619 FX_Free(SDNEWSYMS); | 601 FX_Free(SDNEWSYMS); |
| 620 if (SDREFAGG == 0) { | 602 if (SDREFAGG == 0) { |
| 621 FX_Free(SDNEWSYMWIDTHS); | 603 FX_Free(SDNEWSYMWIDTHS); |
| 622 } | 604 } |
| 623 return nullptr; | 605 return nullptr; |
| 624 } | 606 } |
| OLD | NEW |