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 "JBig2_SddProc.h" | 7 #include "JBig2_SddProc.h" |
8 | 8 |
9 #include "../../../../third_party/base/nonstd_unique_ptr.h" | 9 #include "../../../../third_party/base/nonstd_unique_ptr.h" |
10 #include "../../../include/fxcrt/fx_basic.h" | 10 #include "../../../include/fxcrt/fx_basic.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 CJBig2_Image* BS; | 28 CJBig2_Image* BS; |
29 FX_DWORD I, J, REFAGGNINST; | 29 FX_DWORD I, J, REFAGGNINST; |
30 FX_BOOL* EXFLAGS; | 30 FX_BOOL* EXFLAGS; |
31 FX_DWORD EXINDEX; | 31 FX_DWORD EXINDEX; |
32 FX_BOOL CUREXFLAG; | 32 FX_BOOL CUREXFLAG; |
33 FX_DWORD EXRUNLENGTH; | 33 FX_DWORD EXRUNLENGTH; |
34 int32_t nVal; | 34 int32_t nVal; |
35 FX_DWORD nTmp; | 35 FX_DWORD nTmp; |
36 FX_DWORD SBNUMSYMS; | 36 FX_DWORD SBNUMSYMS; |
37 uint8_t SBSYMCODELEN; | 37 uint8_t SBSYMCODELEN; |
38 FX_DWORD IDI; | |
39 int32_t RDXI, RDYI; | 38 int32_t RDXI, RDYI; |
40 CJBig2_Image** SBSYMS; | 39 CJBig2_Image** SBSYMS; |
41 nonstd::unique_ptr<CJBig2_ArithIaidDecoder> IAID; | 40 nonstd::unique_ptr<CJBig2_ArithIaidDecoder> IAID; |
42 nonstd::unique_ptr<CJBig2_SymbolDict> pDict; | 41 nonstd::unique_ptr<CJBig2_SymbolDict> pDict; |
43 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADH(new CJBig2_ArithIntDecoder); | 42 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADH(new CJBig2_ArithIntDecoder); |
44 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADW(new CJBig2_ArithIntDecoder); | 43 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADW(new CJBig2_ArithIntDecoder); |
45 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAAI(new CJBig2_ArithIntDecoder); | 44 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAAI(new CJBig2_ArithIntDecoder); |
46 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDX(new CJBig2_ArithIntDecoder); | 45 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDX(new CJBig2_ArithIntDecoder); |
47 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDY(new CJBig2_ArithIntDecoder); | 46 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDY(new CJBig2_ArithIntDecoder); |
48 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAEX(new CJBig2_ArithIntDecoder); | 47 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAEX(new CJBig2_ArithIntDecoder); |
49 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADT(new CJBig2_ArithIntDecoder); | 48 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADT(new CJBig2_ArithIntDecoder); |
50 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAFS(new CJBig2_ArithIntDecoder); | 49 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAFS(new CJBig2_ArithIntDecoder); |
51 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADS(new CJBig2_ArithIntDecoder); | 50 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADS(new CJBig2_ArithIntDecoder); |
52 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAIT(new CJBig2_ArithIntDecoder); | 51 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAIT(new CJBig2_ArithIntDecoder); |
53 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARI(new CJBig2_ArithIntDecoder); | 52 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARI(new CJBig2_ArithIntDecoder); |
54 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDW(new CJBig2_ArithIntDecoder); | 53 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDW(new CJBig2_ArithIntDecoder); |
55 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDH(new CJBig2_ArithIntDecoder); | 54 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDH(new CJBig2_ArithIntDecoder); |
56 nTmp = 0; | 55 nTmp = 0; |
57 while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { | 56 while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { |
58 nTmp++; | 57 nTmp++; |
59 } | 58 } |
60 IAID.reset(new CJBig2_ArithIaidDecoder((uint8_t)nTmp)); | 59 IAID.reset(new CJBig2_ArithIaidDecoder((uint8_t)nTmp)); |
61 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); | 60 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); |
62 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); | 61 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
63 | 62 |
64 HCHEIGHT = 0; | 63 HCHEIGHT = 0; |
65 NSYMSDECODED = 0; | 64 NSYMSDECODED = 0; |
66 while (NSYMSDECODED < SDNUMNEWSYMS) { | 65 while (NSYMSDECODED < SDNUMNEWSYMS) { |
67 BS = nullptr; | 66 BS = nullptr; |
68 if (IADH->decode(pArithDecoder, &HCDH) == -1) { | 67 if (!IADH->decode(pArithDecoder, &HCDH)) { |
69 goto failed; | 68 goto failed; |
70 } | 69 } |
71 HCHEIGHT = HCHEIGHT + HCDH; | 70 HCHEIGHT = HCHEIGHT + HCDH; |
72 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { | 71 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { |
73 goto failed; | 72 goto failed; |
74 } | 73 } |
75 SYMWIDTH = 0; | 74 SYMWIDTH = 0; |
76 TOTWIDTH = 0; | 75 TOTWIDTH = 0; |
77 for (;;) { | 76 for (;;) { |
78 nVal = IADW->decode(pArithDecoder, &DW); | 77 nVal = IADW->decode(pArithDecoder, &DW); |
(...skipping 30 matching lines...) Expand all Loading... |
109 pGRD->GBAT[3] = SDAT[3]; | 108 pGRD->GBAT[3] = SDAT[3]; |
110 pGRD->GBAT[4] = SDAT[4]; | 109 pGRD->GBAT[4] = SDAT[4]; |
111 pGRD->GBAT[5] = SDAT[5]; | 110 pGRD->GBAT[5] = SDAT[5]; |
112 pGRD->GBAT[6] = SDAT[6]; | 111 pGRD->GBAT[6] = SDAT[6]; |
113 pGRD->GBAT[7] = SDAT[7]; | 112 pGRD->GBAT[7] = SDAT[7]; |
114 BS = pGRD->decode_Arith(pArithDecoder, gbContext); | 113 BS = pGRD->decode_Arith(pArithDecoder, gbContext); |
115 if (!BS) { | 114 if (!BS) { |
116 goto failed; | 115 goto failed; |
117 } | 116 } |
118 } else { | 117 } else { |
119 if (IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) { | 118 if (!IAAI->decode(pArithDecoder, (int*)&REFAGGNINST)) { |
120 goto failed; | 119 goto failed; |
121 } | 120 } |
122 if (REFAGGNINST > 1) { | 121 if (REFAGGNINST > 1) { |
123 nonstd::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc()); | 122 nonstd::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc()); |
124 pDecoder->SBHUFF = SDHUFF; | 123 pDecoder->SBHUFF = SDHUFF; |
125 pDecoder->SBREFINE = 1; | 124 pDecoder->SBREFINE = 1; |
126 pDecoder->SBW = SYMWIDTH; | 125 pDecoder->SBW = SYMWIDTH; |
127 pDecoder->SBH = HCHEIGHT; | 126 pDecoder->SBH = HCHEIGHT; |
128 pDecoder->SBNUMINSTANCES = REFAGGNINST; | 127 pDecoder->SBNUMINSTANCES = REFAGGNINST; |
129 pDecoder->SBSTRIPS = 1; | 128 pDecoder->SBSTRIPS = 1; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 ids.IARDY = IARDY.get(); | 201 ids.IARDY = IARDY.get(); |
203 ids.IAID = IAID.get(); | 202 ids.IAID = IAID.get(); |
204 BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids); | 203 BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids); |
205 if (!BS) { | 204 if (!BS) { |
206 FX_Free(SBSYMS); | 205 FX_Free(SBSYMS); |
207 goto failed; | 206 goto failed; |
208 } | 207 } |
209 FX_Free(SBSYMS); | 208 FX_Free(SBSYMS); |
210 } else if (REFAGGNINST == 1) { | 209 } else if (REFAGGNINST == 1) { |
211 SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; | 210 SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
212 if (IAID->decode(pArithDecoder, (int*)&IDI) == -1) { | 211 FX_DWORD IDI; |
213 goto failed; | 212 IAID->decode(pArithDecoder, &IDI); |
214 } | 213 if (!IARDX->decode(pArithDecoder, &RDXI) || |
215 if ((IARDX->decode(pArithDecoder, &RDXI) == -1) || | 214 !IARDY->decode(pArithDecoder, &RDYI)) { |
216 (IARDY->decode(pArithDecoder, &RDYI) == -1)) { | |
217 goto failed; | 215 goto failed; |
218 } | 216 } |
219 if (IDI >= SBNUMSYMS) { | 217 if (IDI >= SBNUMSYMS) { |
220 goto failed; | 218 goto failed; |
221 } | 219 } |
222 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); | 220 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); |
223 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 221 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
224 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, | 222 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
225 NSYMSDECODED * sizeof(CJBig2_Image*)); | 223 NSYMSDECODED * sizeof(CJBig2_Image*)); |
226 if (!SBSYMS[IDI]) { | 224 if (!SBSYMS[IDI]) { |
(...skipping 22 matching lines...) Expand all Loading... |
249 } | 247 } |
250 SDNEWSYMS[NSYMSDECODED] = BS; | 248 SDNEWSYMS[NSYMSDECODED] = BS; |
251 BS = nullptr; | 249 BS = nullptr; |
252 NSYMSDECODED = NSYMSDECODED + 1; | 250 NSYMSDECODED = NSYMSDECODED + 1; |
253 } | 251 } |
254 } | 252 } |
255 EXINDEX = 0; | 253 EXINDEX = 0; |
256 CUREXFLAG = 0; | 254 CUREXFLAG = 0; |
257 EXFLAGS = FX_Alloc(FX_BOOL, SDNUMINSYMS + SDNUMNEWSYMS); | 255 EXFLAGS = FX_Alloc(FX_BOOL, SDNUMINSYMS + SDNUMNEWSYMS); |
258 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { | 256 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { |
259 if (IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) { | 257 if (!IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH)) { |
260 FX_Free(EXFLAGS); | 258 FX_Free(EXFLAGS); |
261 goto failed; | 259 goto failed; |
262 } | 260 } |
263 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { | 261 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { |
264 FX_Free(EXFLAGS); | 262 FX_Free(EXFLAGS); |
265 goto failed; | 263 goto failed; |
266 } | 264 } |
267 if (EXRUNLENGTH != 0) { | 265 if (EXRUNLENGTH != 0) { |
268 for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { | 266 for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { |
269 EXFLAGS[I] = CUREXFLAG; | 267 EXFLAGS[I] = CUREXFLAG; |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 failed: | 640 failed: |
643 for (I = 0; I < NSYMSDECODED; I++) { | 641 for (I = 0; I < NSYMSDECODED; I++) { |
644 delete SDNEWSYMS[I]; | 642 delete SDNEWSYMS[I]; |
645 } | 643 } |
646 FX_Free(SDNEWSYMS); | 644 FX_Free(SDNEWSYMS); |
647 if (SDREFAGG == 0) { | 645 if (SDREFAGG == 0) { |
648 FX_Free(SDNEWSYMWIDTHS); | 646 FX_Free(SDNEWSYMWIDTHS); |
649 } | 647 } |
650 return nullptr; | 648 return nullptr; |
651 } | 649 } |
OLD | NEW |