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/src/fxcodec/jbig2/JBig2_SddProc.h" | 7 #include "core/src/fxcodec/jbig2/JBig2_SddProc.h" |
8 | 8 |
| 9 #include <memory> |
9 #include <vector> | 10 #include <vector> |
10 | 11 |
11 #include "core/include/fxcrt/fx_basic.h" | 12 #include "core/include/fxcrt/fx_basic.h" |
12 #include "core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h" | 13 #include "core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h" |
13 #include "core/src/fxcodec/jbig2/JBig2_GrdProc.h" | 14 #include "core/src/fxcodec/jbig2/JBig2_GrdProc.h" |
14 #include "core/src/fxcodec/jbig2/JBig2_GrrdProc.h" | 15 #include "core/src/fxcodec/jbig2/JBig2_GrrdProc.h" |
15 #include "core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h" | 16 #include "core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h" |
16 #include "core/src/fxcodec/jbig2/JBig2_HuffmanTable.h" | 17 #include "core/src/fxcodec/jbig2/JBig2_HuffmanTable.h" |
17 #include "core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" | 18 #include "core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" |
18 #include "core/src/fxcodec/jbig2/JBig2_SymbolDict.h" | 19 #include "core/src/fxcodec/jbig2/JBig2_SymbolDict.h" |
19 #include "core/src/fxcodec/jbig2/JBig2_TrdProc.h" | 20 #include "core/src/fxcodec/jbig2/JBig2_TrdProc.h" |
20 #include "third_party/base/nonstd_unique_ptr.h" | |
21 | 21 |
22 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith( | 22 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith( |
23 CJBig2_ArithDecoder* pArithDecoder, | 23 CJBig2_ArithDecoder* pArithDecoder, |
24 std::vector<JBig2ArithCtx>* gbContext, | 24 std::vector<JBig2ArithCtx>* gbContext, |
25 std::vector<JBig2ArithCtx>* grContext) { | 25 std::vector<JBig2ArithCtx>* grContext) { |
26 CJBig2_Image** SDNEWSYMS; | 26 CJBig2_Image** SDNEWSYMS; |
27 FX_DWORD HCHEIGHT, NSYMSDECODED; | 27 FX_DWORD HCHEIGHT, NSYMSDECODED; |
28 int32_t HCDH; | 28 int32_t HCDH; |
29 FX_DWORD SYMWIDTH, TOTWIDTH; | 29 FX_DWORD SYMWIDTH, TOTWIDTH; |
30 int32_t DW; | 30 int32_t DW; |
31 CJBig2_Image* BS; | 31 CJBig2_Image* BS; |
32 FX_DWORD I, J, REFAGGNINST; | 32 FX_DWORD I, J, REFAGGNINST; |
33 FX_BOOL* EXFLAGS; | 33 FX_BOOL* EXFLAGS; |
34 FX_DWORD EXINDEX; | 34 FX_DWORD EXINDEX; |
35 FX_BOOL CUREXFLAG; | 35 FX_BOOL CUREXFLAG; |
36 FX_DWORD EXRUNLENGTH; | 36 FX_DWORD EXRUNLENGTH; |
37 FX_DWORD nTmp; | 37 FX_DWORD nTmp; |
38 FX_DWORD SBNUMSYMS; | 38 FX_DWORD SBNUMSYMS; |
39 uint8_t SBSYMCODELEN; | 39 uint8_t SBSYMCODELEN; |
40 int32_t RDXI, RDYI; | 40 int32_t RDXI, RDYI; |
41 CJBig2_Image** SBSYMS; | 41 CJBig2_Image** SBSYMS; |
42 nonstd::unique_ptr<CJBig2_ArithIaidDecoder> IAID; | 42 std::unique_ptr<CJBig2_ArithIaidDecoder> IAID; |
43 nonstd::unique_ptr<CJBig2_SymbolDict> pDict; | 43 std::unique_ptr<CJBig2_SymbolDict> pDict; |
44 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADH(new CJBig2_ArithIntDecoder); | 44 std::unique_ptr<CJBig2_ArithIntDecoder> IADH(new CJBig2_ArithIntDecoder); |
45 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADW(new CJBig2_ArithIntDecoder); | 45 std::unique_ptr<CJBig2_ArithIntDecoder> IADW(new CJBig2_ArithIntDecoder); |
46 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAAI(new CJBig2_ArithIntDecoder); | 46 std::unique_ptr<CJBig2_ArithIntDecoder> IAAI(new CJBig2_ArithIntDecoder); |
47 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDX(new CJBig2_ArithIntDecoder); | 47 std::unique_ptr<CJBig2_ArithIntDecoder> IARDX(new CJBig2_ArithIntDecoder); |
48 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDY(new CJBig2_ArithIntDecoder); | 48 std::unique_ptr<CJBig2_ArithIntDecoder> IARDY(new CJBig2_ArithIntDecoder); |
49 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAEX(new CJBig2_ArithIntDecoder); | 49 std::unique_ptr<CJBig2_ArithIntDecoder> IAEX(new CJBig2_ArithIntDecoder); |
50 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADT(new CJBig2_ArithIntDecoder); | 50 std::unique_ptr<CJBig2_ArithIntDecoder> IADT(new CJBig2_ArithIntDecoder); |
51 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAFS(new CJBig2_ArithIntDecoder); | 51 std::unique_ptr<CJBig2_ArithIntDecoder> IAFS(new CJBig2_ArithIntDecoder); |
52 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADS(new CJBig2_ArithIntDecoder); | 52 std::unique_ptr<CJBig2_ArithIntDecoder> IADS(new CJBig2_ArithIntDecoder); |
53 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAIT(new CJBig2_ArithIntDecoder); | 53 std::unique_ptr<CJBig2_ArithIntDecoder> IAIT(new CJBig2_ArithIntDecoder); |
54 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARI(new CJBig2_ArithIntDecoder); | 54 std::unique_ptr<CJBig2_ArithIntDecoder> IARI(new CJBig2_ArithIntDecoder); |
55 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDW(new CJBig2_ArithIntDecoder); | 55 std::unique_ptr<CJBig2_ArithIntDecoder> IARDW(new CJBig2_ArithIntDecoder); |
56 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDH(new CJBig2_ArithIntDecoder); | 56 std::unique_ptr<CJBig2_ArithIntDecoder> IARDH(new CJBig2_ArithIntDecoder); |
57 nTmp = 0; | 57 nTmp = 0; |
58 while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { | 58 while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { |
59 nTmp++; | 59 nTmp++; |
60 } | 60 } |
61 IAID.reset(new CJBig2_ArithIaidDecoder((uint8_t)nTmp)); | 61 IAID.reset(new CJBig2_ArithIaidDecoder((uint8_t)nTmp)); |
62 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); | 62 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); |
63 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); | 63 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
64 | 64 |
65 HCHEIGHT = 0; | 65 HCHEIGHT = 0; |
66 NSYMSDECODED = 0; | 66 NSYMSDECODED = 0; |
(...skipping 18 matching lines...) Expand all Loading... |
85 goto failed; | 85 goto failed; |
86 | 86 |
87 if (HCHEIGHT == 0 || SYMWIDTH == 0) { | 87 if (HCHEIGHT == 0 || SYMWIDTH == 0) { |
88 TOTWIDTH = TOTWIDTH + SYMWIDTH; | 88 TOTWIDTH = TOTWIDTH + SYMWIDTH; |
89 SDNEWSYMS[NSYMSDECODED] = nullptr; | 89 SDNEWSYMS[NSYMSDECODED] = nullptr; |
90 NSYMSDECODED = NSYMSDECODED + 1; | 90 NSYMSDECODED = NSYMSDECODED + 1; |
91 continue; | 91 continue; |
92 } | 92 } |
93 TOTWIDTH = TOTWIDTH + SYMWIDTH; | 93 TOTWIDTH = TOTWIDTH + SYMWIDTH; |
94 if (SDREFAGG == 0) { | 94 if (SDREFAGG == 0) { |
95 nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc()); | 95 std::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc()); |
96 pGRD->MMR = 0; | 96 pGRD->MMR = 0; |
97 pGRD->GBW = SYMWIDTH; | 97 pGRD->GBW = SYMWIDTH; |
98 pGRD->GBH = HCHEIGHT; | 98 pGRD->GBH = HCHEIGHT; |
99 pGRD->GBTEMPLATE = SDTEMPLATE; | 99 pGRD->GBTEMPLATE = SDTEMPLATE; |
100 pGRD->TPGDON = 0; | 100 pGRD->TPGDON = 0; |
101 pGRD->USESKIP = 0; | 101 pGRD->USESKIP = 0; |
102 pGRD->GBAT[0] = SDAT[0]; | 102 pGRD->GBAT[0] = SDAT[0]; |
103 pGRD->GBAT[1] = SDAT[1]; | 103 pGRD->GBAT[1] = SDAT[1]; |
104 pGRD->GBAT[2] = SDAT[2]; | 104 pGRD->GBAT[2] = SDAT[2]; |
105 pGRD->GBAT[3] = SDAT[3]; | 105 pGRD->GBAT[3] = SDAT[3]; |
106 pGRD->GBAT[4] = SDAT[4]; | 106 pGRD->GBAT[4] = SDAT[4]; |
107 pGRD->GBAT[5] = SDAT[5]; | 107 pGRD->GBAT[5] = SDAT[5]; |
108 pGRD->GBAT[6] = SDAT[6]; | 108 pGRD->GBAT[6] = SDAT[6]; |
109 pGRD->GBAT[7] = SDAT[7]; | 109 pGRD->GBAT[7] = SDAT[7]; |
110 BS = pGRD->decode_Arith(pArithDecoder, gbContext->data()); | 110 BS = pGRD->decode_Arith(pArithDecoder, gbContext->data()); |
111 if (!BS) { | 111 if (!BS) { |
112 goto failed; | 112 goto failed; |
113 } | 113 } |
114 } else { | 114 } else { |
115 IAAI->decode(pArithDecoder, (int*)&REFAGGNINST); | 115 IAAI->decode(pArithDecoder, (int*)&REFAGGNINST); |
116 if (REFAGGNINST > 1) { | 116 if (REFAGGNINST > 1) { |
117 nonstd::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc()); | 117 std::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc()); |
118 pDecoder->SBHUFF = SDHUFF; | 118 pDecoder->SBHUFF = SDHUFF; |
119 pDecoder->SBREFINE = 1; | 119 pDecoder->SBREFINE = 1; |
120 pDecoder->SBW = SYMWIDTH; | 120 pDecoder->SBW = SYMWIDTH; |
121 pDecoder->SBH = HCHEIGHT; | 121 pDecoder->SBH = HCHEIGHT; |
122 pDecoder->SBNUMINSTANCES = REFAGGNINST; | 122 pDecoder->SBNUMINSTANCES = REFAGGNINST; |
123 pDecoder->SBSTRIPS = 1; | 123 pDecoder->SBSTRIPS = 1; |
124 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; | 124 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
125 SBNUMSYMS = pDecoder->SBNUMSYMS; | 125 SBNUMSYMS = pDecoder->SBNUMSYMS; |
126 nTmp = 0; | 126 nTmp = 0; |
127 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { | 127 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
128 nTmp++; | 128 nTmp++; |
129 } | 129 } |
130 SBSYMCODELEN = (uint8_t)nTmp; | 130 SBSYMCODELEN = (uint8_t)nTmp; |
131 pDecoder->SBSYMCODELEN = SBSYMCODELEN; | 131 pDecoder->SBSYMCODELEN = SBSYMCODELEN; |
132 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); | 132 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); |
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 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS( | 142 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS(new CJBig2_HuffmanTable( |
143 new CJBig2_HuffmanTable(HuffmanTable_B6, | 143 HuffmanTable_B6, FX_ArraySize(HuffmanTable_B6), |
144 FX_ArraySize(HuffmanTable_B6), | 144 HuffmanTable_HTOOB_B6)); |
145 HuffmanTable_HTOOB_B6)); | 145 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS(new CJBig2_HuffmanTable( |
146 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS( | 146 HuffmanTable_B8, FX_ArraySize(HuffmanTable_B8), |
147 new CJBig2_HuffmanTable(HuffmanTable_B8, | 147 HuffmanTable_HTOOB_B8)); |
148 FX_ArraySize(HuffmanTable_B8), | 148 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT(new CJBig2_HuffmanTable( |
149 HuffmanTable_HTOOB_B8)); | 149 HuffmanTable_B11, FX_ArraySize(HuffmanTable_B11), |
150 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT( | 150 HuffmanTable_HTOOB_B11)); |
151 new CJBig2_HuffmanTable(HuffmanTable_B11, | 151 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( |
152 FX_ArraySize(HuffmanTable_B11), | |
153 HuffmanTable_HTOOB_B11)); | |
154 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( | |
155 new CJBig2_HuffmanTable(HuffmanTable_B15, | 152 new CJBig2_HuffmanTable(HuffmanTable_B15, |
156 FX_ArraySize(HuffmanTable_B15), | 153 FX_ArraySize(HuffmanTable_B15), |
157 HuffmanTable_HTOOB_B15)); | 154 HuffmanTable_HTOOB_B15)); |
158 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( | 155 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( |
159 new CJBig2_HuffmanTable(HuffmanTable_B15, | 156 new CJBig2_HuffmanTable(HuffmanTable_B15, |
160 FX_ArraySize(HuffmanTable_B15), | 157 FX_ArraySize(HuffmanTable_B15), |
161 HuffmanTable_HTOOB_B15)); | 158 HuffmanTable_HTOOB_B15)); |
162 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( | 159 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( |
163 new CJBig2_HuffmanTable(HuffmanTable_B15, | 160 new CJBig2_HuffmanTable(HuffmanTable_B15, |
164 FX_ArraySize(HuffmanTable_B15), | 161 FX_ArraySize(HuffmanTable_B15), |
165 HuffmanTable_HTOOB_B15)); | 162 HuffmanTable_HTOOB_B15)); |
166 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( | 163 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( |
167 new CJBig2_HuffmanTable(HuffmanTable_B15, | 164 new CJBig2_HuffmanTable(HuffmanTable_B15, |
168 FX_ArraySize(HuffmanTable_B15), | 165 FX_ArraySize(HuffmanTable_B15), |
169 HuffmanTable_HTOOB_B15)); | 166 HuffmanTable_HTOOB_B15)); |
170 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( | 167 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( |
171 new CJBig2_HuffmanTable(HuffmanTable_B1, | 168 new CJBig2_HuffmanTable(HuffmanTable_B1, |
172 FX_ArraySize(HuffmanTable_B1), | 169 FX_ArraySize(HuffmanTable_B1), |
173 HuffmanTable_HTOOB_B1)); | 170 HuffmanTable_HTOOB_B1)); |
174 pDecoder->SBHUFFFS = SBHUFFFS.get(); | 171 pDecoder->SBHUFFFS = SBHUFFFS.get(); |
175 pDecoder->SBHUFFDS = SBHUFFDS.get(); | 172 pDecoder->SBHUFFDS = SBHUFFDS.get(); |
176 pDecoder->SBHUFFDT = SBHUFFDT.get(); | 173 pDecoder->SBHUFFDT = SBHUFFDT.get(); |
177 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); | 174 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); |
178 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); | 175 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); |
179 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); | 176 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); |
180 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); | 177 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); |
(...skipping 30 matching lines...) Expand all Loading... |
211 goto failed; | 208 goto failed; |
212 } | 209 } |
213 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); | 210 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); |
214 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 211 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
215 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, | 212 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
216 NSYMSDECODED * sizeof(CJBig2_Image*)); | 213 NSYMSDECODED * sizeof(CJBig2_Image*)); |
217 if (!SBSYMS[IDI]) { | 214 if (!SBSYMS[IDI]) { |
218 FX_Free(SBSYMS); | 215 FX_Free(SBSYMS); |
219 goto failed; | 216 goto failed; |
220 } | 217 } |
221 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc()); | 218 std::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc()); |
222 pGRRD->GRW = SYMWIDTH; | 219 pGRRD->GRW = SYMWIDTH; |
223 pGRRD->GRH = HCHEIGHT; | 220 pGRRD->GRH = HCHEIGHT; |
224 pGRRD->GRTEMPLATE = SDRTEMPLATE; | 221 pGRRD->GRTEMPLATE = SDRTEMPLATE; |
225 pGRRD->GRREFERENCE = SBSYMS[IDI]; | 222 pGRRD->GRREFERENCE = SBSYMS[IDI]; |
226 pGRRD->GRREFERENCEDX = RDXI; | 223 pGRRD->GRREFERENCEDX = RDXI; |
227 pGRRD->GRREFERENCEDY = RDYI; | 224 pGRRD->GRREFERENCEDY = RDYI; |
228 pGRRD->TPGRON = 0; | 225 pGRRD->TPGRON = 0; |
229 pGRRD->GRAT[0] = SDRAT[0]; | 226 pGRRD->GRAT[0] = SDRAT[0]; |
230 pGRRD->GRAT[1] = SDRAT[1]; | 227 pGRRD->GRAT[1] = SDRAT[1]; |
231 pGRRD->GRAT[2] = SDRAT[2]; | 228 pGRRD->GRAT[2] = SDRAT[2]; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 int32_t nVal, nBits; | 305 int32_t nVal, nBits; |
309 FX_DWORD nTmp; | 306 FX_DWORD nTmp; |
310 FX_DWORD SBNUMSYMS; | 307 FX_DWORD SBNUMSYMS; |
311 uint8_t SBSYMCODELEN; | 308 uint8_t SBSYMCODELEN; |
312 JBig2HuffmanCode* SBSYMCODES; | 309 JBig2HuffmanCode* SBSYMCODES; |
313 FX_DWORD IDI; | 310 FX_DWORD IDI; |
314 int32_t RDXI, RDYI; | 311 int32_t RDXI, RDYI; |
315 FX_DWORD BMSIZE; | 312 FX_DWORD BMSIZE; |
316 FX_DWORD stride; | 313 FX_DWORD stride; |
317 CJBig2_Image** SBSYMS; | 314 CJBig2_Image** SBSYMS; |
318 nonstd::unique_ptr<CJBig2_HuffmanDecoder> pHuffmanDecoder( | 315 std::unique_ptr<CJBig2_HuffmanDecoder> pHuffmanDecoder( |
319 new CJBig2_HuffmanDecoder(pStream)); | 316 new CJBig2_HuffmanDecoder(pStream)); |
320 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); | 317 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); |
321 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); | 318 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
322 SDNEWSYMWIDTHS = nullptr; | 319 SDNEWSYMWIDTHS = nullptr; |
323 BHC = nullptr; | 320 BHC = nullptr; |
324 if (SDREFAGG == 0) { | 321 if (SDREFAGG == 0) { |
325 SDNEWSYMWIDTHS = FX_Alloc(FX_DWORD, SDNUMNEWSYMS); | 322 SDNEWSYMWIDTHS = FX_Alloc(FX_DWORD, SDNUMNEWSYMS); |
326 FXSYS_memset(SDNEWSYMWIDTHS, 0, SDNUMNEWSYMS * sizeof(FX_DWORD)); | 323 FXSYS_memset(SDNEWSYMWIDTHS, 0, SDNUMNEWSYMS * sizeof(FX_DWORD)); |
327 } | 324 } |
328 nonstd::unique_ptr<CJBig2_SymbolDict> pDict(new CJBig2_SymbolDict()); | 325 std::unique_ptr<CJBig2_SymbolDict> pDict(new CJBig2_SymbolDict()); |
329 nonstd::unique_ptr<CJBig2_HuffmanTable> pTable; | 326 std::unique_ptr<CJBig2_HuffmanTable> pTable; |
330 | 327 |
331 HCHEIGHT = 0; | 328 HCHEIGHT = 0; |
332 NSYMSDECODED = 0; | 329 NSYMSDECODED = 0; |
333 BS = nullptr; | 330 BS = nullptr; |
334 while (NSYMSDECODED < SDNUMNEWSYMS) { | 331 while (NSYMSDECODED < SDNUMNEWSYMS) { |
335 if (pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { | 332 if (pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { |
336 goto failed; | 333 goto failed; |
337 } | 334 } |
338 HCHEIGHT = HCHEIGHT + HCDH; | 335 HCHEIGHT = HCHEIGHT + HCDH; |
339 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { | 336 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { |
(...skipping 23 matching lines...) Expand all Loading... |
363 } | 360 } |
364 TOTWIDTH = TOTWIDTH + SYMWIDTH; | 361 TOTWIDTH = TOTWIDTH + SYMWIDTH; |
365 } | 362 } |
366 if (SDREFAGG == 1) { | 363 if (SDREFAGG == 1) { |
367 if (pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != | 364 if (pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != |
368 0) { | 365 0) { |
369 goto failed; | 366 goto failed; |
370 } | 367 } |
371 BS = nullptr; | 368 BS = nullptr; |
372 if (REFAGGNINST > 1) { | 369 if (REFAGGNINST > 1) { |
373 nonstd::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc()); | 370 std::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc()); |
374 pDecoder->SBHUFF = SDHUFF; | 371 pDecoder->SBHUFF = SDHUFF; |
375 pDecoder->SBREFINE = 1; | 372 pDecoder->SBREFINE = 1; |
376 pDecoder->SBW = SYMWIDTH; | 373 pDecoder->SBW = SYMWIDTH; |
377 pDecoder->SBH = HCHEIGHT; | 374 pDecoder->SBH = HCHEIGHT; |
378 pDecoder->SBNUMINSTANCES = REFAGGNINST; | 375 pDecoder->SBNUMINSTANCES = REFAGGNINST; |
379 pDecoder->SBSTRIPS = 1; | 376 pDecoder->SBSTRIPS = 1; |
380 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; | 377 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
381 SBNUMSYMS = pDecoder->SBNUMSYMS; | 378 SBNUMSYMS = pDecoder->SBNUMSYMS; |
382 SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS); | 379 SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS); |
383 nTmp = 1; | 380 nTmp = 1; |
384 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { | 381 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
385 nTmp++; | 382 nTmp++; |
386 } | 383 } |
387 for (I = 0; I < SBNUMSYMS; I++) { | 384 for (I = 0; I < SBNUMSYMS; I++) { |
388 SBSYMCODES[I].codelen = nTmp; | 385 SBSYMCODES[I].codelen = nTmp; |
389 SBSYMCODES[I].code = I; | 386 SBSYMCODES[I].code = I; |
390 } | 387 } |
391 pDecoder->SBSYMCODES = SBSYMCODES; | 388 pDecoder->SBSYMCODES = SBSYMCODES; |
392 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); | 389 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); |
393 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 390 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
394 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, | 391 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
395 NSYMSDECODED * sizeof(CJBig2_Image*)); | 392 NSYMSDECODED * sizeof(CJBig2_Image*)); |
396 pDecoder->SBSYMS = SBSYMS; | 393 pDecoder->SBSYMS = SBSYMS; |
397 pDecoder->SBDEFPIXEL = 0; | 394 pDecoder->SBDEFPIXEL = 0; |
398 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; | 395 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
399 pDecoder->TRANSPOSED = 0; | 396 pDecoder->TRANSPOSED = 0; |
400 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; | 397 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
401 pDecoder->SBDSOFFSET = 0; | 398 pDecoder->SBDSOFFSET = 0; |
402 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS( | 399 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS(new CJBig2_HuffmanTable( |
403 new CJBig2_HuffmanTable(HuffmanTable_B6, | 400 HuffmanTable_B6, FX_ArraySize(HuffmanTable_B6), |
404 FX_ArraySize(HuffmanTable_B6), | 401 HuffmanTable_HTOOB_B6)); |
405 HuffmanTable_HTOOB_B6)); | 402 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS(new CJBig2_HuffmanTable( |
406 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS( | 403 HuffmanTable_B8, FX_ArraySize(HuffmanTable_B8), |
407 new CJBig2_HuffmanTable(HuffmanTable_B8, | 404 HuffmanTable_HTOOB_B8)); |
408 FX_ArraySize(HuffmanTable_B8), | 405 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT(new CJBig2_HuffmanTable( |
409 HuffmanTable_HTOOB_B8)); | 406 HuffmanTable_B11, FX_ArraySize(HuffmanTable_B11), |
410 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT( | 407 HuffmanTable_HTOOB_B11)); |
411 new CJBig2_HuffmanTable(HuffmanTable_B11, | 408 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( |
412 FX_ArraySize(HuffmanTable_B11), | |
413 HuffmanTable_HTOOB_B11)); | |
414 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( | |
415 new CJBig2_HuffmanTable(HuffmanTable_B15, | 409 new CJBig2_HuffmanTable(HuffmanTable_B15, |
416 FX_ArraySize(HuffmanTable_B15), | 410 FX_ArraySize(HuffmanTable_B15), |
417 HuffmanTable_HTOOB_B15)); | 411 HuffmanTable_HTOOB_B15)); |
418 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( | 412 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( |
419 new CJBig2_HuffmanTable(HuffmanTable_B15, | 413 new CJBig2_HuffmanTable(HuffmanTable_B15, |
420 FX_ArraySize(HuffmanTable_B15), | 414 FX_ArraySize(HuffmanTable_B15), |
421 HuffmanTable_HTOOB_B15)); | 415 HuffmanTable_HTOOB_B15)); |
422 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( | 416 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( |
423 new CJBig2_HuffmanTable(HuffmanTable_B15, | 417 new CJBig2_HuffmanTable(HuffmanTable_B15, |
424 FX_ArraySize(HuffmanTable_B15), | 418 FX_ArraySize(HuffmanTable_B15), |
425 HuffmanTable_HTOOB_B15)); | 419 HuffmanTable_HTOOB_B15)); |
426 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( | 420 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( |
427 new CJBig2_HuffmanTable(HuffmanTable_B15, | 421 new CJBig2_HuffmanTable(HuffmanTable_B15, |
428 FX_ArraySize(HuffmanTable_B15), | 422 FX_ArraySize(HuffmanTable_B15), |
429 HuffmanTable_HTOOB_B15)); | 423 HuffmanTable_HTOOB_B15)); |
430 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( | 424 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( |
431 new CJBig2_HuffmanTable(HuffmanTable_B1, | 425 new CJBig2_HuffmanTable(HuffmanTable_B1, |
432 FX_ArraySize(HuffmanTable_B1), | 426 FX_ArraySize(HuffmanTable_B1), |
433 HuffmanTable_HTOOB_B1)); | 427 HuffmanTable_HTOOB_B1)); |
434 pDecoder->SBHUFFFS = SBHUFFFS.get(); | 428 pDecoder->SBHUFFFS = SBHUFFFS.get(); |
435 pDecoder->SBHUFFDS = SBHUFFDS.get(); | 429 pDecoder->SBHUFFDS = SBHUFFDS.get(); |
436 pDecoder->SBHUFFDT = SBHUFFDT.get(); | 430 pDecoder->SBHUFFDT = SBHUFFDT.get(); |
437 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); | 431 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); |
438 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); | 432 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); |
439 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); | 433 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); |
440 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); | 434 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 if ((nVal == SBSYMCODES[IDI].code) && | 470 if ((nVal == SBSYMCODES[IDI].code) && |
477 (nBits == SBSYMCODES[IDI].codelen)) { | 471 (nBits == SBSYMCODES[IDI].codelen)) { |
478 break; | 472 break; |
479 } | 473 } |
480 } | 474 } |
481 if (IDI < SBNUMSYMS) { | 475 if (IDI < SBNUMSYMS) { |
482 break; | 476 break; |
483 } | 477 } |
484 } | 478 } |
485 FX_Free(SBSYMCODES); | 479 FX_Free(SBSYMCODES); |
486 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( | 480 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( |
487 new CJBig2_HuffmanTable(HuffmanTable_B15, | 481 new CJBig2_HuffmanTable(HuffmanTable_B15, |
488 FX_ArraySize(HuffmanTable_B15), | 482 FX_ArraySize(HuffmanTable_B15), |
489 HuffmanTable_HTOOB_B15)); | 483 HuffmanTable_HTOOB_B15)); |
490 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( | 484 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( |
491 new CJBig2_HuffmanTable(HuffmanTable_B1, | 485 new CJBig2_HuffmanTable(HuffmanTable_B1, |
492 FX_ArraySize(HuffmanTable_B1), | 486 FX_ArraySize(HuffmanTable_B1), |
493 HuffmanTable_HTOOB_B1)); | 487 HuffmanTable_HTOOB_B1)); |
494 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDXI) != 0) || | 488 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDXI) != 0) || |
495 (pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDYI) != 0) || | 489 (pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDYI) != 0) || |
496 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE.get(), &nVal) != 0)) { | 490 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE.get(), &nVal) != 0)) { |
497 goto failed; | 491 goto failed; |
498 } | 492 } |
499 pStream->alignByte(); | 493 pStream->alignByte(); |
500 nTmp = pStream->getOffset(); | 494 nTmp = pStream->getOffset(); |
501 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); | 495 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); |
502 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 496 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
503 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, | 497 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
504 NSYMSDECODED * sizeof(CJBig2_Image*)); | 498 NSYMSDECODED * sizeof(CJBig2_Image*)); |
505 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc()); | 499 std::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc()); |
506 pGRRD->GRW = SYMWIDTH; | 500 pGRRD->GRW = SYMWIDTH; |
507 pGRRD->GRH = HCHEIGHT; | 501 pGRRD->GRH = HCHEIGHT; |
508 pGRRD->GRTEMPLATE = SDRTEMPLATE; | 502 pGRRD->GRTEMPLATE = SDRTEMPLATE; |
509 pGRRD->GRREFERENCE = SBSYMS[IDI]; | 503 pGRRD->GRREFERENCE = SBSYMS[IDI]; |
510 pGRRD->GRREFERENCEDX = RDXI; | 504 pGRRD->GRREFERENCEDX = RDXI; |
511 pGRRD->GRREFERENCEDY = RDYI; | 505 pGRRD->GRREFERENCEDY = RDYI; |
512 pGRRD->TPGRON = 0; | 506 pGRRD->TPGRON = 0; |
513 pGRRD->GRAT[0] = SDRAT[0]; | 507 pGRRD->GRAT[0] = SDRAT[0]; |
514 pGRRD->GRAT[1] = SDRAT[1]; | 508 pGRRD->GRAT[1] = SDRAT[1]; |
515 pGRRD->GRAT[2] = SDRAT[2]; | 509 pGRRD->GRAT[2] = SDRAT[2]; |
516 pGRRD->GRAT[3] = SDRAT[3]; | 510 pGRRD->GRAT[3] = SDRAT[3]; |
517 nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder( | 511 std::unique_ptr<CJBig2_ArithDecoder> pArithDecoder( |
518 new CJBig2_ArithDecoder(pStream)); | 512 new CJBig2_ArithDecoder(pStream)); |
519 BS = pGRRD->decode(pArithDecoder.get(), grContext->data()); | 513 BS = pGRRD->decode(pArithDecoder.get(), grContext->data()); |
520 if (!BS) { | 514 if (!BS) { |
521 FX_Free(SBSYMS); | 515 FX_Free(SBSYMS); |
522 goto failed; | 516 goto failed; |
523 } | 517 } |
524 pStream->alignByte(); | 518 pStream->alignByte(); |
525 pStream->offset(2); | 519 pStream->offset(2); |
526 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { | 520 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { |
527 delete BS; | 521 delete BS; |
(...skipping 20 matching lines...) Expand all Loading... |
548 BHC = new CJBig2_Image(TOTWIDTH, HCHEIGHT); | 542 BHC = new CJBig2_Image(TOTWIDTH, HCHEIGHT); |
549 for (I = 0; I < HCHEIGHT; I++) { | 543 for (I = 0; I < HCHEIGHT; I++) { |
550 JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, | 544 JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, |
551 pStream->getPointer(), stride); | 545 pStream->getPointer(), stride); |
552 pStream->offset(stride); | 546 pStream->offset(stride); |
553 } | 547 } |
554 } else { | 548 } else { |
555 goto failed; | 549 goto failed; |
556 } | 550 } |
557 } else { | 551 } else { |
558 nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc()); | 552 std::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc()); |
559 pGRD->MMR = 1; | 553 pGRD->MMR = 1; |
560 pGRD->GBW = TOTWIDTH; | 554 pGRD->GBW = TOTWIDTH; |
561 pGRD->GBH = HCHEIGHT; | 555 pGRD->GBH = HCHEIGHT; |
562 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream, nullptr); | 556 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream, nullptr); |
563 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 557 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
564 pGRD->Continue_decode(pPause); | 558 pGRD->Continue_decode(pPause); |
565 } | 559 } |
566 pStream->alignByte(); | 560 pStream->alignByte(); |
567 } | 561 } |
568 nTmp = 0; | 562 nTmp = 0; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 failed: | 615 failed: |
622 for (I = 0; I < NSYMSDECODED; I++) { | 616 for (I = 0; I < NSYMSDECODED; I++) { |
623 delete SDNEWSYMS[I]; | 617 delete SDNEWSYMS[I]; |
624 } | 618 } |
625 FX_Free(SDNEWSYMS); | 619 FX_Free(SDNEWSYMS); |
626 if (SDREFAGG == 0) { | 620 if (SDREFAGG == 0) { |
627 FX_Free(SDNEWSYMWIDTHS); | 621 FX_Free(SDNEWSYMWIDTHS); |
628 } | 622 } |
629 return nullptr; | 623 return nullptr; |
630 } | 624 } |
OLD | NEW |