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 |