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

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

Issue 1265503005: clang-format all pdfium code. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: sigh Created 5 years, 4 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_GeneralDecoder.h" 7 #include "JBig2_GeneralDecoder.h"
8 #include "JBig2_ArithDecoder.h" 8 #include "JBig2_ArithDecoder.h"
9 #include "JBig2_ArithIntDecoder.h" 9 #include "JBig2_ArithIntDecoder.h"
10 #include "JBig2_HuffmanDecoder.h" 10 #include "JBig2_HuffmanDecoder.h"
11 #include "JBig2_HuffmanTable.h" 11 #include "JBig2_HuffmanTable.h"
12 #include "JBig2_PatternDict.h" 12 #include "JBig2_PatternDict.h"
13 13
14 extern const JBig2ArithQe QeTable[] = { 14 extern const JBig2ArithQe QeTable[] = {
15 { 0x5601, 1, 1, 1 }, 15 {0x5601, 1, 1, 1}, {0x3401, 2, 6, 0}, {0x1801, 3, 9, 0},
16 { 0x3401, 2, 6, 0 }, 16 {0x0AC1, 4, 12, 0}, {0x0521, 5, 29, 0}, {0x0221, 38, 33, 0},
17 { 0x1801, 3, 9, 0 }, 17 {0x5601, 7, 6, 1}, {0x5401, 8, 14, 0}, {0x4801, 9, 14, 0},
18 { 0x0AC1, 4, 12, 0 }, 18 {0x3801, 10, 14, 0}, {0x3001, 11, 17, 0}, {0x2401, 12, 18, 0},
19 { 0x0521, 5, 29, 0 }, 19 {0x1C01, 13, 20, 0}, {0x1601, 29, 21, 0}, {0x5601, 15, 14, 1},
20 { 0x0221, 38, 33, 0 }, 20 {0x5401, 16, 14, 0}, {0x5101, 17, 15, 0}, {0x4801, 18, 16, 0},
21 { 0x5601, 7, 6, 1 }, 21 {0x3801, 19, 17, 0}, {0x3401, 20, 18, 0}, {0x3001, 21, 19, 0},
22 { 0x5401, 8, 14, 0 }, 22 {0x2801, 22, 19, 0}, {0x2401, 23, 20, 0}, {0x2201, 24, 21, 0},
23 { 0x4801, 9, 14, 0 }, 23 {0x1C01, 25, 22, 0}, {0x1801, 26, 23, 0}, {0x1601, 27, 24, 0},
24 { 0x3801, 10, 14, 0 }, 24 {0x1401, 28, 25, 0}, {0x1201, 29, 26, 0}, {0x1101, 30, 27, 0},
25 { 0x3001, 11, 17, 0 }, 25 {0x0AC1, 31, 28, 0}, {0x09C1, 32, 29, 0}, {0x08A1, 33, 30, 0},
26 { 0x2401, 12, 18, 0 }, 26 {0x0521, 34, 31, 0}, {0x0441, 35, 32, 0}, {0x02A1, 36, 33, 0},
27 { 0x1C01, 13, 20, 0 }, 27 {0x0221, 37, 34, 0}, {0x0141, 38, 35, 0}, {0x0111, 39, 36, 0},
28 { 0x1601, 29, 21, 0 }, 28 {0x0085, 40, 37, 0}, {0x0049, 41, 38, 0}, {0x0025, 42, 39, 0},
29 { 0x5601, 15, 14, 1 }, 29 {0x0015, 43, 40, 0}, {0x0009, 44, 41, 0}, {0x0005, 45, 42, 0},
30 { 0x5401, 16, 14, 0 }, 30 {0x0001, 45, 43, 0}, {0x5601, 46, 46, 0}};
31 { 0x5101, 17, 15, 0 },
32 { 0x4801, 18, 16, 0 },
33 { 0x3801, 19, 17, 0 },
34 { 0x3401, 20, 18, 0 },
35 { 0x3001, 21, 19, 0 },
36 { 0x2801, 22, 19, 0 },
37 { 0x2401, 23, 20, 0 },
38 { 0x2201, 24, 21, 0 },
39 { 0x1C01, 25, 22, 0 },
40 { 0x1801, 26, 23, 0 },
41 { 0x1601, 27, 24, 0 },
42 { 0x1401, 28, 25, 0 },
43 { 0x1201, 29, 26, 0 },
44 { 0x1101, 30, 27, 0 },
45 { 0x0AC1, 31, 28, 0 },
46 { 0x09C1, 32, 29, 0 },
47 { 0x08A1, 33, 30, 0 },
48 { 0x0521, 34, 31, 0 },
49 { 0x0441, 35, 32, 0 },
50 { 0x02A1, 36, 33, 0 },
51 { 0x0221, 37, 34, 0 },
52 { 0x0141, 38, 35, 0 },
53 { 0x0111, 39, 36, 0 },
54 { 0x0085, 40, 37, 0 },
55 { 0x0049, 41, 38, 0 },
56 { 0x0025, 42, 39, 0 },
57 { 0x0015, 43, 40, 0 },
58 { 0x0009, 44, 41, 0 },
59 { 0x0005, 45, 42, 0 },
60 { 0x0001, 45, 43, 0 },
61 { 0x5601, 46, 46, 0 }
62 };
63 31
64 extern const unsigned int JBIG2_QE_NUM = sizeof(QeTable) / sizeof(JBig2ArithQe); 32 extern const unsigned int JBIG2_QE_NUM = sizeof(QeTable) / sizeof(JBig2ArithQe);
65 33
66 CJBig2_Image *CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, J Big2ArithCtx *gbContext) 34 CJBig2_Image* CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
67 { 35 JBig2ArithCtx* gbContext) {
68 if (GBW == 0 || GBH == 0) { 36 if (GBW == 0 || GBH == 0) {
69 CJBig2_Image* pImage; 37 CJBig2_Image* pImage;
70 JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH)); 38 JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));
71 return pImage; 39 return pImage;
72 } 40 }
73 if(GBTEMPLATE == 0) { 41 if (GBTEMPLATE == 0) {
74 if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1) 42 if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1) &&
75 && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1) 43 (GBAT[2] == (signed char)-3) && (GBAT[3] == (signed char)-1) &&
76 && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2) 44 (GBAT[4] == 2) && (GBAT[5] == (signed char)-2) &&
77 && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) { 45 (GBAT[6] == (signed char)-2) && (GBAT[7] == (signed char)-2)) {
78 return decode_Arith_Template0_opt3(pArithDecoder, gbContext); 46 return decode_Arith_Template0_opt3(pArithDecoder, gbContext);
47 } else {
48 return decode_Arith_Template0_unopt(pArithDecoder, gbContext);
49 }
50 } else if (GBTEMPLATE == 1) {
51 if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1)) {
52 return decode_Arith_Template1_opt3(pArithDecoder, gbContext);
53 } else {
54 return decode_Arith_Template1_unopt(pArithDecoder, gbContext);
55 }
56 } else if (GBTEMPLATE == 2) {
57 if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) {
58 return decode_Arith_Template2_opt3(pArithDecoder, gbContext);
59 } else {
60 return decode_Arith_Template2_unopt(pArithDecoder, gbContext);
61 }
62 } else {
63 if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) {
64 return decode_Arith_Template3_opt3(pArithDecoder, gbContext);
65 } else {
66 return decode_Arith_Template3_unopt(pArithDecoder, gbContext);
67 }
68 }
69 }
70 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt(
71 CJBig2_ArithDecoder* pArithDecoder,
72 JBig2ArithCtx* gbContext) {
73 FX_BOOL LTP, SLTP, bVal;
74 FX_DWORD CONTEXT;
75 CJBig2_Image* GBREG;
76 FX_DWORD line1, line2, line3;
77 LTP = 0;
78 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
79 GBREG->fill(0);
80 for (FX_DWORD h = 0; h < GBH; h++) {
81 if (TPGDON) {
82 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
83 LTP = LTP ^ SLTP;
84 }
85 if (LTP == 1) {
86 GBREG->copyLine(h, h - 1);
87 } else {
88 line1 = GBREG->getPixel(2, h - 2);
89 line1 |= GBREG->getPixel(1, h - 2) << 1;
90 line1 |= GBREG->getPixel(0, h - 2) << 2;
91 line2 = GBREG->getPixel(3, h - 1);
92 line2 |= GBREG->getPixel(2, h - 1) << 1;
93 line2 |= GBREG->getPixel(1, h - 1) << 2;
94 line2 |= GBREG->getPixel(0, h - 1) << 3;
95 line3 = 0;
96 for (FX_DWORD w = 0; w < GBW; w++) {
97 if (USESKIP && SKIP->getPixel(w, h)) {
98 bVal = 0;
79 } else { 99 } else {
80 return decode_Arith_Template0_unopt(pArithDecoder, gbContext); 100 CONTEXT = line3;
81 } 101 CONTEXT |= line2 << 4;
82 } else if(GBTEMPLATE == 1) { 102 CONTEXT |= line1 << 11;
83 if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) { 103 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
84 return decode_Arith_Template1_opt3(pArithDecoder, gbContext); 104 }
105 if (bVal) {
106 GBREG->setPixel(w, h, bVal);
107 }
108 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f;
109 line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f;
110 line3 = ((line3 << 1) | bVal) & 0x0f;
111 }
112 }
113 }
114 return GBREG;
115 }
116 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt2(
117 CJBig2_ArithDecoder* pArithDecoder,
118 JBig2ArithCtx* gbContext) {
119 FX_BOOL LTP, SLTP, bVal;
120 FX_DWORD CONTEXT;
121 CJBig2_Image* GBREG;
122 FX_DWORD line1, line2;
123 uint8_t *pLine, cVal;
124 intptr_t nStride, nStride2;
125 int32_t nBits, k;
126 LTP = 0;
127 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
128 if (GBREG->m_pData == NULL) {
129 delete GBREG;
130 m_pModule->JBig2_Error(
131 "Generic region decoding procedure: Create Image Failed with width = "
132 "%d, height = %d\n",
133 GBW, GBH);
134 return NULL;
135 }
136 pLine = GBREG->m_pData;
137 nStride = GBREG->m_nStride;
138 nStride2 = nStride << 1;
139 for (FX_DWORD h = 0; h < GBH; h++) {
140 if (TPGDON) {
141 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
142 LTP = LTP ^ SLTP;
143 }
144 if (LTP == 1) {
145 GBREG->copyLine(h, h - 1);
146 } else {
147 line1 = (h > 1) ? pLine[-nStride2] << 6 : 0;
148 line2 = (h > 0) ? pLine[-nStride] : 0;
149 CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0);
150 for (FX_DWORD w = 0; w < GBW; w += 8) {
151 if (w + 8 < GBW) {
152 nBits = 8;
153 if (h > 1) {
154 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 6);
155 }
156 if (h > 0) {
157 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
158 }
85 } else { 159 } else {
86 return decode_Arith_Template1_unopt(pArithDecoder, gbContext); 160 nBits = GBW - w;
87 } 161 if (h > 1) {
88 } else if(GBTEMPLATE == 2) { 162 line1 <<= 8;
89 if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) { 163 }
90 return decode_Arith_Template2_opt3(pArithDecoder, gbContext); 164 if (h > 0) {
165 line2 <<= 8;
166 }
167 }
168 cVal = 0;
169 for (k = 0; k < nBits; k++) {
170 if (USESKIP && SKIP->getPixel(w, h)) {
171 bVal = 0;
172 } else {
173 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
174 }
175 cVal |= bVal << (7 - k);
176 CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal |
177 ((line1 >> (7 - k)) & 0x0800) |
178 ((line2 >> (7 - k)) & 0x0010);
179 }
180 pLine[w >> 3] = cVal;
181 }
182 }
183 pLine += nStride;
184 }
185 return GBREG;
186 }
187 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt3(
188 CJBig2_ArithDecoder* pArithDecoder,
189 JBig2ArithCtx* gbContext) {
190 FX_BOOL LTP, SLTP, bVal;
191 FX_DWORD CONTEXT;
192 CJBig2_Image* GBREG;
193 FX_DWORD line1, line2;
194 uint8_t *pLine, *pLine1, *pLine2, cVal;
195 int32_t nStride, nStride2, k;
196 int32_t nLineBytes, nBitsLeft, cc;
197 LTP = 0;
198 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
199 if (GBREG->m_pData == NULL) {
200 delete GBREG;
201 m_pModule->JBig2_Error(
202 "Generic region decoding procedure: Create Image Failed with width = "
203 "%d, height = %d\n",
204 GBW, GBH);
205 return NULL;
206 }
207 pLine = GBREG->m_pData;
208 nStride = GBREG->m_nStride;
209 nStride2 = nStride << 1;
210 nLineBytes = ((GBW + 7) >> 3) - 1;
211 nBitsLeft = GBW - (nLineBytes << 3);
212 FX_DWORD height = GBH & 0x7fffffff;
213 for (FX_DWORD h = 0; h < height; h++) {
214 if (TPGDON) {
215 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
216 LTP = LTP ^ SLTP;
217 }
218 if (LTP == 1) {
219 GBREG->copyLine(h, h - 1);
220 } else {
221 if (h > 1) {
222 pLine1 = pLine - nStride2;
223 pLine2 = pLine - nStride;
224 line1 = (*pLine1++) << 6;
225 line2 = *pLine2++;
226 CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));
227 for (cc = 0; cc < nLineBytes; cc++) {
228 line1 = (line1 << 8) | ((*pLine1++) << 6);
229 line2 = (line2 << 8) | (*pLine2++);
230 cVal = 0;
231 for (k = 7; k >= 0; k--) {
232 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
233 cVal |= bVal << k;
234 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
235 ((line1 >> k) & 0x0800) | ((line2 >> k) & 0x0010));
236 }
237 pLine[cc] = cVal;
238 }
239 line1 <<= 8;
240 line2 <<= 8;
241 cVal = 0;
242 for (k = 0; k < nBitsLeft; k++) {
243 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
244 cVal |= bVal << (7 - k);
245 CONTEXT =
246 (((CONTEXT & 0x7bf7) << 1) | bVal |
247 ((line1 >> (7 - k)) & 0x0800) | ((line2 >> (7 - k)) & 0x0010));
248 }
249 pLine[nLineBytes] = cVal;
250 } else {
251 pLine2 = pLine - nStride;
252 line2 = (h & 1) ? (*pLine2++) : 0;
253 CONTEXT = (line2 & 0x07f0);
254 for (cc = 0; cc < nLineBytes; cc++) {
255 if (h & 1) {
256 line2 = (line2 << 8) | (*pLine2++);
257 }
258 cVal = 0;
259 for (k = 7; k >= 0; k--) {
260 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
261 cVal |= bVal << k;
262 CONTEXT =
263 (((CONTEXT & 0x7bf7) << 1) | bVal | ((line2 >> k) & 0x0010));
264 }
265 pLine[cc] = cVal;
266 }
267 line2 <<= 8;
268 cVal = 0;
269 for (k = 0; k < nBitsLeft; k++) {
270 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
271 cVal |= bVal << (7 - k);
272 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
273 (((line2 >> (7 - k))) & 0x0010));
274 }
275 pLine[nLineBytes] = cVal;
276 }
277 }
278 pLine += nStride;
279 }
280 return GBREG;
281 }
282 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_unopt(
283 CJBig2_ArithDecoder* pArithDecoder,
284 JBig2ArithCtx* gbContext) {
285 FX_BOOL LTP, SLTP, bVal;
286 FX_DWORD CONTEXT;
287 CJBig2_Image* GBREG;
288 FX_DWORD line1, line2, line3;
289 LTP = 0;
290 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
291 GBREG->fill(0);
292 for (FX_DWORD h = 0; h < GBH; h++) {
293 if (TPGDON) {
294 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
295 LTP = LTP ^ SLTP;
296 }
297 if (LTP == 1) {
298 GBREG->copyLine(h, h - 1);
299 } else {
300 line1 = GBREG->getPixel(1, h - 2);
301 line1 |= GBREG->getPixel(0, h - 2) << 1;
302 line2 = GBREG->getPixel(2, h - 1);
303 line2 |= GBREG->getPixel(1, h - 1) << 1;
304 line2 |= GBREG->getPixel(0, h - 1) << 2;
305 line3 = 0;
306 for (FX_DWORD w = 0; w < GBW; w++) {
307 if (USESKIP && SKIP->getPixel(w, h)) {
308 bVal = 0;
91 } else { 309 } else {
92 return decode_Arith_Template2_unopt(pArithDecoder, gbContext); 310 CONTEXT = line3;
93 } 311 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
94 } else { 312 CONTEXT |= line2 << 5;
95 if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) { 313 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
96 return decode_Arith_Template3_opt3(pArithDecoder, gbContext); 314 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
315 CONTEXT |= line1 << 12;
316 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
317 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
318 }
319 if (bVal) {
320 GBREG->setPixel(w, h, bVal);
321 }
322 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
323 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
324 line3 = ((line3 << 1) | bVal) & 0x0f;
325 }
326 }
327 }
328 return GBREG;
329 }
330 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt(
331 CJBig2_ArithDecoder* pArithDecoder,
332 JBig2ArithCtx* gbContext) {
333 FX_BOOL LTP, SLTP, bVal;
334 FX_DWORD CONTEXT;
335 CJBig2_Image* GBREG;
336 FX_DWORD line1, line2, line3;
337 LTP = 0;
338 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
339 GBREG->fill(0);
340 for (FX_DWORD h = 0; h < GBH; h++) {
341 if (TPGDON) {
342 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
343 LTP = LTP ^ SLTP;
344 }
345 if (LTP == 1) {
346 GBREG->copyLine(h, h - 1);
347 } else {
348 line1 = GBREG->getPixel(2, h - 2);
349 line1 |= GBREG->getPixel(1, h - 2) << 1;
350 line1 |= GBREG->getPixel(0, h - 2) << 2;
351 line2 = GBREG->getPixel(3, h - 1);
352 line2 |= GBREG->getPixel(2, h - 1) << 1;
353 line2 |= GBREG->getPixel(1, h - 1) << 2;
354 line2 |= GBREG->getPixel(0, h - 1) << 3;
355 line3 = 0;
356 for (FX_DWORD w = 0; w < GBW; w++) {
357 if (USESKIP && SKIP->getPixel(w, h)) {
358 bVal = 0;
97 } else { 359 } else {
98 return decode_Arith_Template3_unopt(pArithDecoder, gbContext); 360 CONTEXT = line3;
99 } 361 CONTEXT |= line2 << 3;
100 } 362 CONTEXT |= line1 << 9;
101 } 363 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
102 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt(CJBig2_ArithDecoder *pA rithDecoder, JBig2ArithCtx *gbContext) 364 }
103 { 365 if (bVal) {
104 FX_BOOL LTP, SLTP, bVal; 366 GBREG->setPixel(w, h, bVal);
105 FX_DWORD CONTEXT; 367 }
106 CJBig2_Image *GBREG; 368 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
107 FX_DWORD line1, line2, line3; 369 line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f;
108 LTP = 0; 370 line3 = ((line3 << 1) | bVal) & 0x07;
109 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); 371 }
110 GBREG->fill(0); 372 }
111 for(FX_DWORD h = 0; h < GBH; h++) { 373 }
112 if(TPGDON) { 374 return GBREG;
113 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); 375 }
114 LTP = LTP ^ SLTP; 376 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt2(
115 } 377 CJBig2_ArithDecoder* pArithDecoder,
116 if(LTP == 1) { 378 JBig2ArithCtx* gbContext) {
117 GBREG->copyLine(h, h - 1); 379 FX_BOOL LTP, SLTP, bVal;
380 FX_DWORD CONTEXT;
381 CJBig2_Image* GBREG;
382 FX_DWORD line1, line2;
383 uint8_t *pLine, cVal;
384 intptr_t nStride, nStride2;
385 int32_t nBits, k;
386 LTP = 0;
387 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
388 if (GBREG->m_pData == NULL) {
389 delete GBREG;
390 m_pModule->JBig2_Error(
391 "Generic region decoding procedure: Create Image Failed with width = "
392 "%d, height = %d\n",
393 GBW, GBH);
394 return NULL;
395 }
396 pLine = GBREG->m_pData;
397 nStride = GBREG->m_nStride;
398 nStride2 = nStride << 1;
399 for (FX_DWORD h = 0; h < GBH; h++) {
400 if (TPGDON) {
401 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
402 LTP = LTP ^ SLTP;
403 }
404 if (LTP == 1) {
405 GBREG->copyLine(h, h - 1);
406 } else {
407 line1 = (h > 1) ? pLine[-nStride2] << 4 : 0;
408 line2 = (h > 0) ? pLine[-nStride] : 0;
409 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
410 for (FX_DWORD w = 0; w < GBW; w += 8) {
411 if (w + 8 < GBW) {
412 nBits = 8;
413 if (h > 1) {
414 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 4);
415 }
416 if (h > 0) {
417 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
418 }
118 } else { 419 } else {
119 line1 = GBREG->getPixel(2, h - 2); 420 nBits = GBW - w;
120 line1 |= GBREG->getPixel(1, h - 2) << 1; 421 if (h > 1) {
121 line1 |= GBREG->getPixel(0, h - 2) << 2; 422 line1 <<= 8;
122 line2 = GBREG->getPixel(3, h - 1); 423 }
123 line2 |= GBREG->getPixel(2, h - 1) << 1; 424 if (h > 0) {
124 line2 |= GBREG->getPixel(1, h - 1) << 2; 425 line2 <<= 8;
125 line2 |= GBREG->getPixel(0, h - 1) << 3; 426 }
126 line3 = 0; 427 }
127 for(FX_DWORD w = 0; w < GBW; w++) { 428 cVal = 0;
128 if(USESKIP && SKIP->getPixel(w, h)) { 429 for (k = 0; k < nBits; k++) {
129 bVal = 0; 430 if (USESKIP && SKIP->getPixel(w, h)) {
130 } else { 431 bVal = 0;
131 CONTEXT = line3; 432 } else {
132 CONTEXT |= line2 << 4; 433 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
133 CONTEXT |= line1 << 11; 434 }
134 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 435 cVal |= bVal << (7 - k);
135 } 436 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
136 if(bVal) { 437 ((line1 >> (7 - k)) & 0x0200) |
137 GBREG->setPixel(w, h, bVal); 438 ((line2 >> (8 - k)) & 0x0008);
138 } 439 }
139 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f; 440 pLine[w >> 3] = cVal;
140 line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f; 441 }
141 line3 = ((line3 << 1) | bVal) & 0x0f; 442 }
443 pLine += nStride;
444 }
445 return GBREG;
446 }
447 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt3(
448 CJBig2_ArithDecoder* pArithDecoder,
449 JBig2ArithCtx* gbContext) {
450 FX_BOOL LTP, SLTP, bVal;
451 FX_DWORD CONTEXT;
452 CJBig2_Image* GBREG;
453 FX_DWORD line1, line2;
454 uint8_t *pLine, *pLine1, *pLine2, cVal;
455 int32_t nStride, nStride2, k;
456 int32_t nLineBytes, nBitsLeft, cc;
457 LTP = 0;
458 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
459 if (GBREG->m_pData == NULL) {
460 delete GBREG;
461 m_pModule->JBig2_Error(
462 "Generic region decoding procedure: Create Image Failed with width = "
463 "%d, height = %d\n",
464 GBW, GBH);
465 return NULL;
466 }
467 pLine = GBREG->m_pData;
468 nStride = GBREG->m_nStride;
469 nStride2 = nStride << 1;
470 nLineBytes = ((GBW + 7) >> 3) - 1;
471 nBitsLeft = GBW - (nLineBytes << 3);
472 for (FX_DWORD h = 0; h < GBH; h++) {
473 if (TPGDON) {
474 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
475 LTP = LTP ^ SLTP;
476 }
477 if (LTP == 1) {
478 GBREG->copyLine(h, h - 1);
479 } else {
480 if (h > 1) {
481 pLine1 = pLine - nStride2;
482 pLine2 = pLine - nStride;
483 line1 = (*pLine1++) << 4;
484 line2 = *pLine2++;
485 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
486 for (cc = 0; cc < nLineBytes; cc++) {
487 line1 = (line1 << 8) | ((*pLine1++) << 4);
488 line2 = (line2 << 8) | (*pLine2++);
489 cVal = 0;
490 for (k = 7; k >= 0; k--) {
491 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
492 cVal |= bVal << k;
493 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
494 ((line1 >> k) & 0x0200) | ((line2 >> (k + 1)) & 0x0008);
495 }
496 pLine[cc] = cVal;
497 }
498 line1 <<= 8;
499 line2 <<= 8;
500 cVal = 0;
501 for (k = 0; k < nBitsLeft; k++) {
502 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
503 cVal |= bVal << (7 - k);
504 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
505 ((line1 >> (7 - k)) & 0x0200) |
506 ((line2 >> (8 - k)) & 0x0008);
507 }
508 pLine[nLineBytes] = cVal;
509 } else {
510 pLine2 = pLine - nStride;
511 line2 = (h & 1) ? (*pLine2++) : 0;
512 CONTEXT = (line2 >> 1) & 0x01f8;
513 for (cc = 0; cc < nLineBytes; cc++) {
514 if (h & 1) {
515 line2 = (line2 << 8) | (*pLine2++);
516 }
517 cVal = 0;
518 for (k = 7; k >= 0; k--) {
519 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
520 cVal |= bVal << k;
521 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
522 ((line2 >> (k + 1)) & 0x0008);
523 }
524 pLine[cc] = cVal;
525 }
526 line2 <<= 8;
527 cVal = 0;
528 for (k = 0; k < nBitsLeft; k++) {
529 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
530 cVal |= bVal << (7 - k);
531 CONTEXT =
532 ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008);
533 }
534 pLine[nLineBytes] = cVal;
535 }
536 }
537 pLine += nStride;
538 }
539 return GBREG;
540 }
541 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_unopt(
542 CJBig2_ArithDecoder* pArithDecoder,
543 JBig2ArithCtx* gbContext) {
544 FX_BOOL LTP, SLTP, bVal;
545 FX_DWORD CONTEXT;
546 CJBig2_Image* GBREG;
547 FX_DWORD line1, line2, line3;
548 LTP = 0;
549 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
550 GBREG->fill(0);
551 for (FX_DWORD h = 0; h < GBH; h++) {
552 if (TPGDON) {
553 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
554 LTP = LTP ^ SLTP;
555 }
556 if (LTP == 1) {
557 GBREG->copyLine(h, h - 1);
558 } else {
559 line1 = GBREG->getPixel(2, h - 2);
560 line1 |= GBREG->getPixel(1, h - 2) << 1;
561 line1 |= GBREG->getPixel(0, h - 2) << 2;
562 line2 = GBREG->getPixel(2, h - 1);
563 line2 |= GBREG->getPixel(1, h - 1) << 1;
564 line2 |= GBREG->getPixel(0, h - 1) << 2;
565 line3 = 0;
566 for (FX_DWORD w = 0; w < GBW; w++) {
567 if (USESKIP && SKIP->getPixel(w, h)) {
568 bVal = 0;
569 } else {
570 CONTEXT = line3;
571 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
572 CONTEXT |= line2 << 4;
573 CONTEXT |= line1 << 9;
574 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
575 }
576 if (bVal) {
577 GBREG->setPixel(w, h, bVal);
578 }
579 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
580 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
581 line3 = ((line3 << 1) | bVal) & 0x07;
582 }
583 }
584 }
585 return GBREG;
586 }
587 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt(
588 CJBig2_ArithDecoder* pArithDecoder,
589 JBig2ArithCtx* gbContext) {
590 FX_BOOL LTP, SLTP, bVal;
591 FX_DWORD CONTEXT;
592 CJBig2_Image* GBREG;
593 FX_DWORD line1, line2, line3;
594 LTP = 0;
595 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
596 GBREG->fill(0);
597 for (FX_DWORD h = 0; h < GBH; h++) {
598 if (TPGDON) {
599 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
600 LTP = LTP ^ SLTP;
601 }
602 if (LTP == 1) {
603 GBREG->copyLine(h, h - 1);
604 } else {
605 line1 = GBREG->getPixel(1, h - 2);
606 line1 |= GBREG->getPixel(0, h - 2) << 1;
607 line2 = GBREG->getPixel(2, h - 1);
608 line2 |= GBREG->getPixel(1, h - 1) << 1;
609 line2 |= GBREG->getPixel(0, h - 1) << 2;
610 line3 = 0;
611 for (FX_DWORD w = 0; w < GBW; w++) {
612 if (USESKIP && SKIP->getPixel(w, h)) {
613 bVal = 0;
614 } else {
615 CONTEXT = line3;
616 CONTEXT |= line2 << 2;
617 CONTEXT |= line1 << 7;
618 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
619 }
620 if (bVal) {
621 GBREG->setPixel(w, h, bVal);
622 }
623 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
624 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
625 line3 = ((line3 << 1) | bVal) & 0x03;
626 }
627 }
628 }
629 return GBREG;
630 }
631 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt2(
632 CJBig2_ArithDecoder* pArithDecoder,
633 JBig2ArithCtx* gbContext) {
634 FX_BOOL LTP, SLTP, bVal;
635 FX_DWORD CONTEXT;
636 CJBig2_Image* GBREG;
637 FX_DWORD line1, line2;
638 uint8_t *pLine, cVal;
639 intptr_t nStride, nStride2;
640 int32_t nBits, k;
641 LTP = 0;
642 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
643 if (GBREG->m_pData == NULL) {
644 delete GBREG;
645 m_pModule->JBig2_Error(
646 "Generic region decoding procedure: Create Image Failed with width = "
647 "%d, height = %d\n",
648 GBW, GBH);
649 return NULL;
650 }
651 pLine = GBREG->m_pData;
652 nStride = GBREG->m_nStride;
653 nStride2 = nStride << 1;
654 for (FX_DWORD h = 0; h < GBH; h++) {
655 if (TPGDON) {
656 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
657 LTP = LTP ^ SLTP;
658 }
659 if (LTP == 1) {
660 GBREG->copyLine(h, h - 1);
661 } else {
662 line1 = (h > 1) ? pLine[-nStride2] << 1 : 0;
663 line2 = (h > 0) ? pLine[-nStride] : 0;
664 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
665 for (FX_DWORD w = 0; w < GBW; w += 8) {
666 if (w + 8 < GBW) {
667 nBits = 8;
668 if (h > 1) {
669 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 1);
670 }
671 if (h > 0) {
672 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
673 }
674 } else {
675 nBits = GBW - w;
676 if (h > 1) {
677 line1 <<= 8;
678 }
679 if (h > 0) {
680 line2 <<= 8;
681 }
682 }
683 cVal = 0;
684 for (k = 0; k < nBits; k++) {
685 if (USESKIP && SKIP->getPixel(w, h)) {
686 bVal = 0;
687 } else {
688 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
689 }
690 cVal |= bVal << (7 - k);
691 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
692 ((line1 >> (7 - k)) & 0x0080) |
693 ((line2 >> (10 - k)) & 0x0004);
694 }
695 pLine[w >> 3] = cVal;
696 }
697 }
698 pLine += nStride;
699 }
700 return GBREG;
701 }
702 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt3(
703 CJBig2_ArithDecoder* pArithDecoder,
704 JBig2ArithCtx* gbContext) {
705 FX_BOOL LTP, SLTP, bVal;
706 FX_DWORD CONTEXT;
707 CJBig2_Image* GBREG;
708 FX_DWORD line1, line2;
709 uint8_t *pLine, *pLine1, *pLine2, cVal;
710 int32_t nStride, nStride2, k;
711 int32_t nLineBytes, nBitsLeft, cc;
712 LTP = 0;
713 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
714 if (GBREG->m_pData == NULL) {
715 delete GBREG;
716 m_pModule->JBig2_Error(
717 "Generic region decoding procedure: Create Image Failed with width = "
718 "%d, height = %d\n",
719 GBW, GBH);
720 return NULL;
721 }
722 pLine = GBREG->m_pData;
723 nStride = GBREG->m_nStride;
724 nStride2 = nStride << 1;
725 nLineBytes = ((GBW + 7) >> 3) - 1;
726 nBitsLeft = GBW - (nLineBytes << 3);
727 for (FX_DWORD h = 0; h < GBH; h++) {
728 if (TPGDON) {
729 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
730 LTP = LTP ^ SLTP;
731 }
732 if (LTP == 1) {
733 GBREG->copyLine(h, h - 1);
734 } else {
735 if (h > 1) {
736 pLine1 = pLine - nStride2;
737 pLine2 = pLine - nStride;
738 line1 = (*pLine1++) << 1;
739 line2 = *pLine2++;
740 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
741 for (cc = 0; cc < nLineBytes; cc++) {
742 line1 = (line1 << 8) | ((*pLine1++) << 1);
743 line2 = (line2 << 8) | (*pLine2++);
744 cVal = 0;
745 for (k = 7; k >= 0; k--) {
746 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
747 cVal |= bVal << k;
748 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
749 ((line1 >> k) & 0x0080) | ((line2 >> (k + 3)) & 0x0004);
750 }
751 pLine[cc] = cVal;
752 }
753 line1 <<= 8;
754 line2 <<= 8;
755 cVal = 0;
756 for (k = 0; k < nBitsLeft; k++) {
757 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
758 cVal |= bVal << (7 - k);
759 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
760 ((line1 >> (7 - k)) & 0x0080) |
761 ((line2 >> (10 - k)) & 0x0004);
762 }
763 pLine[nLineBytes] = cVal;
764 } else {
765 pLine2 = pLine - nStride;
766 line2 = (h & 1) ? (*pLine2++) : 0;
767 CONTEXT = (line2 >> 3) & 0x007c;
768 for (cc = 0; cc < nLineBytes; cc++) {
769 if (h & 1) {
770 line2 = (line2 << 8) | (*pLine2++);
771 }
772 cVal = 0;
773 for (k = 7; k >= 0; k--) {
774 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
775 cVal |= bVal << k;
776 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
777 ((line2 >> (k + 3)) & 0x0004);
778 }
779 pLine[cc] = cVal;
780 }
781 line2 <<= 8;
782 cVal = 0;
783 for (k = 0; k < nBitsLeft; k++) {
784 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
785 cVal |= bVal << (7 - k);
786 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
787 (((line2 >> (10 - k))) & 0x0004);
788 }
789 pLine[nLineBytes] = cVal;
790 }
791 }
792 pLine += nStride;
793 }
794 return GBREG;
795 }
796 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_unopt(
797 CJBig2_ArithDecoder* pArithDecoder,
798 JBig2ArithCtx* gbContext) {
799 FX_BOOL LTP, SLTP, bVal;
800 FX_DWORD CONTEXT;
801 CJBig2_Image* GBREG;
802 FX_DWORD line1, line2, line3;
803 LTP = 0;
804 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
805 GBREG->fill(0);
806 for (FX_DWORD h = 0; h < GBH; h++) {
807 if (TPGDON) {
808 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
809 LTP = LTP ^ SLTP;
810 }
811 if (LTP == 1) {
812 GBREG->copyLine(h, h - 1);
813 } else {
814 line1 = GBREG->getPixel(1, h - 2);
815 line1 |= GBREG->getPixel(0, h - 2) << 1;
816 line2 = GBREG->getPixel(1, h - 1);
817 line2 |= GBREG->getPixel(0, h - 1) << 1;
818 line3 = 0;
819 for (FX_DWORD w = 0; w < GBW; w++) {
820 if (USESKIP && SKIP->getPixel(w, h)) {
821 bVal = 0;
822 } else {
823 CONTEXT = line3;
824 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
825 CONTEXT |= line2 << 3;
826 CONTEXT |= line1 << 7;
827 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
828 }
829 if (bVal) {
830 GBREG->setPixel(w, h, bVal);
831 }
832 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
833 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;
834 line3 = ((line3 << 1) | bVal) & 0x03;
835 }
836 }
837 }
838 return GBREG;
839 }
840 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt(
841 CJBig2_ArithDecoder* pArithDecoder,
842 JBig2ArithCtx* gbContext) {
843 FX_BOOL LTP, SLTP, bVal;
844 FX_DWORD CONTEXT;
845 CJBig2_Image* GBREG;
846 FX_DWORD line1, line2;
847 LTP = 0;
848 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
849 GBREG->fill(0);
850 for (FX_DWORD h = 0; h < GBH; h++) {
851 if (TPGDON) {
852 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
853 LTP = LTP ^ SLTP;
854 }
855 if (LTP == 1) {
856 GBREG->copyLine(h, h - 1);
857 } else {
858 line1 = GBREG->getPixel(2, h - 1);
859 line1 |= GBREG->getPixel(1, h - 1) << 1;
860 line1 |= GBREG->getPixel(0, h - 1) << 2;
861 line2 = 0;
862 for (FX_DWORD w = 0; w < GBW; w++) {
863 if (USESKIP && SKIP->getPixel(w, h)) {
864 bVal = 0;
865 } else {
866 CONTEXT = line2;
867 CONTEXT |= line1 << 4;
868 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
869 }
870 if (bVal) {
871 GBREG->setPixel(w, h, bVal);
872 }
873 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f;
874 line2 = ((line2 << 1) | bVal) & 0x0f;
875 }
876 }
877 }
878 return GBREG;
879 }
880 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt2(
881 CJBig2_ArithDecoder* pArithDecoder,
882 JBig2ArithCtx* gbContext) {
883 FX_BOOL LTP, SLTP, bVal;
884 FX_DWORD CONTEXT;
885 CJBig2_Image* GBREG;
886 FX_DWORD line1;
887 uint8_t *pLine, cVal;
888 intptr_t nStride;
889 int32_t nBits, k;
890 LTP = 0;
891 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
892 if (GBREG->m_pData == NULL) {
893 delete GBREG;
894 m_pModule->JBig2_Error(
895 "Generic region decoding procedure: Create Image Failed with width = "
896 "%d, height = %d\n",
897 GBW, GBH);
898 return NULL;
899 }
900 pLine = GBREG->m_pData;
901 nStride = GBREG->m_nStride;
902 for (FX_DWORD h = 0; h < GBH; h++) {
903 if (TPGDON) {
904 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
905 LTP = LTP ^ SLTP;
906 }
907 if (LTP == 1) {
908 GBREG->copyLine(h, h - 1);
909 } else {
910 line1 = (h > 0) ? pLine[-nStride] : 0;
911 CONTEXT = (line1 >> 1) & 0x03f0;
912 for (FX_DWORD w = 0; w < GBW; w += 8) {
913 if (w + 8 < GBW) {
914 nBits = 8;
915 if (h > 0) {
916 line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]);
917 }
918 } else {
919 nBits = GBW - w;
920 if (h > 0) {
921 line1 <<= 8;
922 }
923 }
924 cVal = 0;
925 for (k = 0; k < nBits; k++) {
926 if (USESKIP && SKIP->getPixel(w, h)) {
927 bVal = 0;
928 } else {
929 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
930 }
931 cVal |= bVal << (7 - k);
932 CONTEXT =
933 ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010);
934 }
935 pLine[w >> 3] = cVal;
936 }
937 }
938 pLine += nStride;
939 }
940 return GBREG;
941 }
942 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt3(
943 CJBig2_ArithDecoder* pArithDecoder,
944 JBig2ArithCtx* gbContext) {
945 FX_BOOL LTP, SLTP, bVal;
946 FX_DWORD CONTEXT;
947 CJBig2_Image* GBREG;
948 FX_DWORD line1;
949 uint8_t *pLine, *pLine1, cVal;
950 int32_t nStride, k;
951 int32_t nLineBytes, nBitsLeft, cc;
952 LTP = 0;
953 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
954 if (GBREG->m_pData == NULL) {
955 delete GBREG;
956 m_pModule->JBig2_Error(
957 "Generic region decoding procedure: Create Image Failed with width = "
958 "%d, height = %d\n",
959 GBW, GBH);
960 return NULL;
961 }
962 pLine = GBREG->m_pData;
963 nStride = GBREG->m_nStride;
964 nLineBytes = ((GBW + 7) >> 3) - 1;
965 nBitsLeft = GBW - (nLineBytes << 3);
966 for (FX_DWORD h = 0; h < GBH; h++) {
967 if (TPGDON) {
968 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
969 LTP = LTP ^ SLTP;
970 }
971 if (LTP == 1) {
972 GBREG->copyLine(h, h - 1);
973 } else {
974 if (h > 0) {
975 pLine1 = pLine - nStride;
976 line1 = *pLine1++;
977 CONTEXT = (line1 >> 1) & 0x03f0;
978 for (cc = 0; cc < nLineBytes; cc++) {
979 line1 = (line1 << 8) | (*pLine1++);
980 cVal = 0;
981 for (k = 7; k >= 0; k--) {
982 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
983 cVal |= bVal << k;
984 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal |
985 ((line1 >> (k + 1)) & 0x0010);
986 }
987 pLine[cc] = cVal;
988 }
989 line1 <<= 8;
990 cVal = 0;
991 for (k = 0; k < nBitsLeft; k++) {
992 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
993 cVal |= bVal << (7 - k);
994 CONTEXT =
995 ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010);
996 }
997 pLine[nLineBytes] = cVal;
998 } else {
999 CONTEXT = 0;
1000 for (cc = 0; cc < nLineBytes; cc++) {
1001 cVal = 0;
1002 for (k = 7; k >= 0; k--) {
1003 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1004 cVal |= bVal << k;
1005 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
1006 }
1007 pLine[cc] = cVal;
1008 }
1009 cVal = 0;
1010 for (k = 0; k < nBitsLeft; k++) {
1011 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1012 cVal |= bVal << (7 - k);
1013 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
1014 }
1015 pLine[nLineBytes] = cVal;
1016 }
1017 }
1018 pLine += nStride;
1019 }
1020 return GBREG;
1021 }
1022 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_unopt(
1023 CJBig2_ArithDecoder* pArithDecoder,
1024 JBig2ArithCtx* gbContext) {
1025 FX_BOOL LTP, SLTP, bVal;
1026 FX_DWORD CONTEXT;
1027 CJBig2_Image* GBREG;
1028 FX_DWORD line1, line2;
1029 LTP = 0;
1030 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
1031 GBREG->fill(0);
1032 for (FX_DWORD h = 0; h < GBH; h++) {
1033 if (TPGDON) {
1034 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
1035 LTP = LTP ^ SLTP;
1036 }
1037 if (LTP == 1) {
1038 GBREG->copyLine(h, h - 1);
1039 } else {
1040 line1 = GBREG->getPixel(1, h - 1);
1041 line1 |= GBREG->getPixel(0, h - 1) << 1;
1042 line2 = 0;
1043 for (FX_DWORD w = 0; w < GBW; w++) {
1044 if (USESKIP && SKIP->getPixel(w, h)) {
1045 bVal = 0;
1046 } else {
1047 CONTEXT = line2;
1048 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
1049 CONTEXT |= line1 << 5;
1050 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1051 }
1052 if (bVal) {
1053 GBREG->setPixel(w, h, bVal);
1054 }
1055 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;
1056 line2 = ((line2 << 1) | bVal) & 0x0f;
1057 }
1058 }
1059 }
1060 return GBREG;
1061 }
1062 CJBig2_Image* CJBig2_GRDProc::decode_Arith_V2(
1063 CJBig2_ArithDecoder* pArithDecoder,
1064 JBig2ArithCtx* gbContext) {
1065 FX_BOOL LTP, SLTP, bVal;
1066 FX_DWORD CONTEXT;
1067 CJBig2_Image* GBREG;
1068 FX_DWORD line1, line2, line3;
1069 LTP = 0;
1070 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
1071 GBREG->fill(0);
1072 for (FX_DWORD h = 0; h < GBH; h++) {
1073 if (TPGDON) {
1074 switch (GBTEMPLATE) {
1075 case 0:
1076 CONTEXT = 0x9b25;
1077 break;
1078 case 1:
1079 CONTEXT = 0x0795;
1080 break;
1081 case 2:
1082 CONTEXT = 0x00e5;
1083 break;
1084 case 3:
1085 CONTEXT = 0x0195;
1086 break;
1087 }
1088 SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1089 LTP = LTP ^ SLTP;
1090 }
1091 if (LTP == 1) {
1092 GBREG->copyLine(h, h - 1);
1093 } else {
1094 switch (GBTEMPLATE) {
1095 case 0: {
1096 line1 = GBREG->getPixel(1, h - 2);
1097 line1 |= GBREG->getPixel(0, h - 2) << 1;
1098 line2 = GBREG->getPixel(2, h - 1);
1099 line2 |= GBREG->getPixel(1, h - 1) << 1;
1100 line2 |= GBREG->getPixel(0, h - 1) << 2;
1101 line3 = 0;
1102 for (FX_DWORD w = 0; w < GBW; w++) {
1103 if (USESKIP && SKIP->getPixel(w, h)) {
1104 bVal = 0;
1105 } else {
1106 CONTEXT = line3;
1107 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
1108 CONTEXT |= line2 << 5;
1109 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
1110 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
1111 CONTEXT |= line1 << 12;
1112 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
1113 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
142 } 1114 }
143 } 1115 if (bVal) {
144 } 1116 GBREG->setPixel(w, h, bVal);
145 return GBREG; 1117 }
146 } 1118 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
147 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt2(CJBig2_ArithDecoder *p ArithDecoder, JBig2ArithCtx *gbContext) 1119 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
148 { 1120 line3 = ((line3 << 1) | bVal) & 0x0f;
149 FX_BOOL LTP, SLTP, bVal; 1121 }
150 FX_DWORD CONTEXT; 1122 } break;
151 CJBig2_Image *GBREG; 1123 case 1: {
152 FX_DWORD line1, line2; 1124 line1 = GBREG->getPixel(2, h - 2);
153 uint8_t *pLine, cVal; 1125 line1 |= GBREG->getPixel(1, h - 2) << 1;
154 intptr_t nStride, nStride2; 1126 line1 |= GBREG->getPixel(0, h - 2) << 2;
155 int32_t nBits, k; 1127 line2 = GBREG->getPixel(2, h - 1);
156 LTP = 0; 1128 line2 |= GBREG->getPixel(1, h - 1) << 1;
157 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); 1129 line2 |= GBREG->getPixel(0, h - 1) << 2;
158 if (GBREG->m_pData == NULL) { 1130 line3 = 0;
159 delete GBREG; 1131 for (FX_DWORD w = 0; w < GBW; w++) {
160 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); 1132 if (USESKIP && SKIP->getPixel(w, h)) {
161 return NULL; 1133 bVal = 0;
162 } 1134 } else {
163 pLine = GBREG->m_pData; 1135 CONTEXT = line3;
164 nStride = GBREG->m_nStride; 1136 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
165 nStride2 = nStride << 1; 1137 CONTEXT |= line2 << 4;
166 for(FX_DWORD h = 0; h < GBH; h++) { 1138 CONTEXT |= line1 << 9;
167 if(TPGDON) { 1139 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
168 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); 1140 }
169 LTP = LTP ^ SLTP; 1141 if (bVal) {
170 } 1142 GBREG->setPixel(w, h, bVal);
171 if(LTP == 1) { 1143 }
172 GBREG->copyLine(h, h - 1); 1144 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
1145 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
1146 line3 = ((line3 << 1) | bVal) & 0x07;
1147 }
1148 } break;
1149 case 2: {
1150 line1 = GBREG->getPixel(1, h - 2);
1151 line1 |= GBREG->getPixel(0, h - 2) << 1;
1152 line2 = GBREG->getPixel(1, h - 1);
1153 line2 |= GBREG->getPixel(0, h - 1) << 1;
1154 line3 = 0;
1155 for (FX_DWORD w = 0; w < GBW; w++) {
1156 if (USESKIP && SKIP->getPixel(w, h)) {
1157 bVal = 0;
1158 } else {
1159 CONTEXT = line3;
1160 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
1161 CONTEXT |= line2 << 3;
1162 CONTEXT |= line1 << 7;
1163 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1164 }
1165 if (bVal) {
1166 GBREG->setPixel(w, h, bVal);
1167 }
1168 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
1169 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;
1170 line3 = ((line3 << 1) | bVal) & 0x03;
1171 }
1172 } break;
1173 case 3: {
1174 line1 = GBREG->getPixel(1, h - 1);
1175 line1 |= GBREG->getPixel(0, h - 1) << 1;
1176 line2 = 0;
1177 for (FX_DWORD w = 0; w < GBW; w++) {
1178 if (USESKIP && SKIP->getPixel(w, h)) {
1179 bVal = 0;
1180 } else {
1181 CONTEXT = line2;
1182 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
1183 CONTEXT |= line1 << 5;
1184 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1185 }
1186 if (bVal) {
1187 GBREG->setPixel(w, h, bVal);
1188 }
1189 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;
1190 line2 = ((line2 << 1) | bVal) & 0x0f;
1191 }
1192 } break;
1193 }
1194 }
1195 }
1196 return GBREG;
1197 }
1198 CJBig2_Image* CJBig2_GRDProc::decode_Arith_V1(
1199 CJBig2_ArithDecoder* pArithDecoder,
1200 JBig2ArithCtx* gbContext) {
1201 FX_BOOL LTP, SLTP, bVal;
1202 FX_DWORD CONTEXT = 0;
1203 CJBig2_Image* GBREG;
1204 LTP = 0;
1205 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
1206 GBREG->fill(0);
1207 for (FX_DWORD h = 0; h < GBH; h++) {
1208 if (TPGDON) {
1209 switch (GBTEMPLATE) {
1210 case 0:
1211 CONTEXT = 0x9b25;
1212 break;
1213 case 1:
1214 CONTEXT = 0x0795;
1215 break;
1216 case 2:
1217 CONTEXT = 0x00e5;
1218 break;
1219 case 3:
1220 CONTEXT = 0x0195;
1221 break;
1222 }
1223 SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1224 LTP = LTP ^ SLTP;
1225 }
1226 if (LTP == 1) {
1227 for (FX_DWORD w = 0; w < GBW; w++) {
1228 GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1));
1229 }
1230 } else {
1231 for (FX_DWORD w = 0; w < GBW; w++) {
1232 if (USESKIP && SKIP->getPixel(w, h)) {
1233 GBREG->setPixel(w, h, 0);
173 } else { 1234 } else {
174 line1 = (h > 1) ? pLine[-nStride2] << 6 : 0; 1235 CONTEXT = 0;
175 line2 = (h > 0) ? pLine[-nStride] : 0; 1236 switch (GBTEMPLATE) {
176 CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0); 1237 case 0:
177 for(FX_DWORD w = 0; w < GBW; w += 8) { 1238 CONTEXT |= GBREG->getPixel(w - 1, h);
178 if(w + 8 < GBW) { 1239 CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
179 nBits = 8; 1240 CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
180 if(h > 1) { 1241 CONTEXT |= GBREG->getPixel(w - 4, h) << 3;
181 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 6); 1242 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
182 } 1243 CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5;
183 if(h > 0) { 1244 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6;
184 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); 1245 CONTEXT |= GBREG->getPixel(w, h - 1) << 7;
185 } 1246 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8;
186 } else { 1247 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9;
187 nBits = GBW - w; 1248 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
188 if(h > 1) { 1249 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
189 line1 <<= 8; 1250 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12;
190 } 1251 CONTEXT |= GBREG->getPixel(w, h - 2) << 13;
191 if(h > 0) { 1252 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14;
192 line2 <<= 8; 1253 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
193 } 1254 break;
194 } 1255 case 1:
195 cVal = 0; 1256 CONTEXT |= GBREG->getPixel(w - 1, h);
196 for(k = 0; k < nBits; k++) { 1257 CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
197 if(USESKIP && SKIP->getPixel(w, h)) { 1258 CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
198 bVal = 0; 1259 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
199 } else { 1260 CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4;
200 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 1261 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;
201 } 1262 CONTEXT |= GBREG->getPixel(w, h - 1) << 6;
202 cVal |= bVal << (7 - k); 1263 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;
203 CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal 1264 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;
204 | ((line1 >> (7 - k)) & 0x0800) 1265 CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9;
205 | ((line2 >> (7 - k)) & 0x0010); 1266 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10;
206 } 1267 CONTEXT |= GBREG->getPixel(w, h - 2) << 11;
207 pLine[w >> 3] = cVal; 1268 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12;
208 } 1269 break;
209 } 1270 case 2:
210 pLine += nStride; 1271 CONTEXT |= GBREG->getPixel(w - 1, h);
211 } 1272 CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
212 return GBREG; 1273 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
213 } 1274 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3;
214 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_ArithDecoder *p ArithDecoder, JBig2ArithCtx *gbContext) 1275 CONTEXT |= GBREG->getPixel(w, h - 1) << 4;
215 { 1276 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5;
216 FX_BOOL LTP, SLTP, bVal; 1277 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6;
217 FX_DWORD CONTEXT; 1278 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7;
218 CJBig2_Image *GBREG; 1279 CONTEXT |= GBREG->getPixel(w, h - 2) << 8;
219 FX_DWORD line1, line2; 1280 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9;
220 uint8_t *pLine, *pLine1, *pLine2, cVal; 1281 break;
221 int32_t nStride, nStride2, k; 1282 case 3:
222 int32_t nLineBytes, nBitsLeft, cc; 1283 CONTEXT |= GBREG->getPixel(w - 1, h);
223 LTP = 0; 1284 CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
224 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); 1285 CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
225 if (GBREG->m_pData == NULL) { 1286 CONTEXT |= GBREG->getPixel(w - 4, h) << 3;
226 delete GBREG; 1287 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
227 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); 1288 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;
228 return NULL; 1289 CONTEXT |= GBREG->getPixel(w, h - 1) << 6;
229 } 1290 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;
230 pLine = GBREG->m_pData; 1291 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;
231 nStride = GBREG->m_nStride; 1292 CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9;
232 nStride2 = nStride << 1; 1293 break;
233 nLineBytes = ((GBW + 7) >> 3) - 1; 1294 }
234 nBitsLeft = GBW - (nLineBytes << 3); 1295 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
235 FX_DWORD height = GBH & 0x7fffffff; 1296 GBREG->setPixel(w, h, bVal);
236 for(FX_DWORD h = 0; h < height; h++) { 1297 }
237 if(TPGDON) { 1298 }
238 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); 1299 }
239 LTP = LTP ^ SLTP; 1300 }
240 } 1301 return GBREG;
241 if(LTP == 1) { 1302 }
242 GBREG->copyLine(h, h - 1); 1303 CJBig2_Image* CJBig2_GRDProc::decode_MMR(CJBig2_BitStream* pStream) {
1304 int bitpos, i;
1305 CJBig2_Image* pImage;
1306 JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));
1307 if (pImage->m_pData == NULL) {
1308 delete pImage;
1309 m_pModule->JBig2_Error(
1310 "Generic region decoding procedure: Create Image Failed with width = "
1311 "%d, height = %d\n",
1312 GBW, GBH);
1313 return NULL;
1314 }
1315 bitpos = (int)pStream->getBitPos();
1316 _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos,
1317 pImage->m_pData, GBW, GBH, pImage->m_nStride);
1318 pStream->setBitPos(bitpos);
1319 for (i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) {
1320 pImage->m_pData[i] = ~pImage->m_pData[i];
1321 }
1322 return pImage;
1323 }
1324 CJBig2_Image* CJBig2_GRRDProc::decode(CJBig2_ArithDecoder* pArithDecoder,
1325 JBig2ArithCtx* grContext) {
1326 if (GRW == 0 || GRH == 0) {
1327 CJBig2_Image* pImage;
1328 JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH));
1329 return pImage;
1330 }
1331 if (GRTEMPLATE == 0) {
1332 if ((GRAT[0] == (signed char)-1) && (GRAT[1] == (signed char)-1) &&
1333 (GRAT[2] == (signed char)-1) && (GRAT[3] == (signed char)-1) &&
1334 (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
1335 return decode_Template0_opt(pArithDecoder, grContext);
1336 } else {
1337 return decode_Template0_unopt(pArithDecoder, grContext);
1338 }
1339 } else {
1340 if ((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
1341 return decode_Template1_opt(pArithDecoder, grContext);
1342 } else {
1343 return decode_Template1_unopt(pArithDecoder, grContext);
1344 }
1345 }
1346 }
1347 CJBig2_Image* CJBig2_GRRDProc::decode_Template0_unopt(
1348 CJBig2_ArithDecoder* pArithDecoder,
1349 JBig2ArithCtx* grContext) {
1350 FX_BOOL LTP, SLTP, bVal;
1351 FX_DWORD CONTEXT;
1352 CJBig2_Image* GRREG;
1353 FX_DWORD line1, line2, line3, line4, line5;
1354 LTP = 0;
1355 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
1356 GRREG->fill(0);
1357 for (FX_DWORD h = 0; h < GRH; h++) {
1358 if (TPGRON) {
1359 SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
1360 LTP = LTP ^ SLTP;
1361 }
1362 if (LTP == 0) {
1363 line1 = GRREG->getPixel(1, h - 1);
1364 line1 |= GRREG->getPixel(0, h - 1) << 1;
1365 line2 = 0;
1366 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);
1367 line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1)
1368 << 1;
1369 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
1370 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
1371 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY)
1372 << 2;
1373 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1374 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1)
1375 << 1;
1376 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1)
1377 << 2;
1378 for (FX_DWORD w = 0; w < GRW; w++) {
1379 CONTEXT = line5;
1380 CONTEXT |= line4 << 3;
1381 CONTEXT |= line3 << 6;
1382 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2],
1383 h - GRREFERENCEDY + GRAT[3])
1384 << 8;
1385 CONTEXT |= line2 << 9;
1386 CONTEXT |= line1 << 10;
1387 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
1388 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1389 GRREG->setPixel(w, h, bVal);
1390 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;
1391 line2 = ((line2 << 1) | bVal) & 0x01;
1392 line3 = ((line3 << 1) |
1393 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2,
1394 h - GRREFERENCEDY - 1)) &
1395 0x03;
1396 line4 =
1397 ((line4 << 1) |
1398 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) &
1399 0x07;
1400 line5 = ((line5 << 1) |
1401 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2,
1402 h - GRREFERENCEDY + 1)) &
1403 0x07;
1404 }
1405 } else {
1406 line1 = GRREG->getPixel(1, h - 1);
1407 line1 |= GRREG->getPixel(0, h - 1) << 1;
1408 line2 = 0;
1409 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);
1410 line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1)
1411 << 1;
1412 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
1413 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
1414 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY)
1415 << 2;
1416 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1417 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1)
1418 << 1;
1419 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1)
1420 << 2;
1421 for (FX_DWORD w = 0; w < GRW; w++) {
1422 bVal = GRREFERENCE->getPixel(w, h);
1423 if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) &&
1424 (bVal == GRREFERENCE->getPixel(w, h - 1)) &&
1425 (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) &&
1426 (bVal == GRREFERENCE->getPixel(w - 1, h)) &&
1427 (bVal == GRREFERENCE->getPixel(w + 1, h)) &&
1428 (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) &&
1429 (bVal == GRREFERENCE->getPixel(w, h + 1)) &&
1430 (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {
1431 CONTEXT = line5;
1432 CONTEXT |= line4 << 3;
1433 CONTEXT |= line3 << 6;
1434 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2],
1435 h - GRREFERENCEDY + GRAT[3])
1436 << 8;
1437 CONTEXT |= line2 << 9;
1438 CONTEXT |= line1 << 10;
1439 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
1440 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1441 }
1442 GRREG->setPixel(w, h, bVal);
1443 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;
1444 line2 = ((line2 << 1) | bVal) & 0x01;
1445 line3 = ((line3 << 1) |
1446 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2,
1447 h - GRREFERENCEDY - 1)) &
1448 0x03;
1449 line4 =
1450 ((line4 << 1) |
1451 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) &
1452 0x07;
1453 line5 = ((line5 << 1) |
1454 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2,
1455 h - GRREFERENCEDY + 1)) &
1456 0x07;
1457 }
1458 }
1459 }
1460 return GRREG;
1461 }
1462 CJBig2_Image* CJBig2_GRRDProc::decode_Template0_opt(
1463 CJBig2_ArithDecoder* pArithDecoder,
1464 JBig2ArithCtx* grContext) {
1465 FX_BOOL LTP, SLTP, bVal;
1466 FX_DWORD CONTEXT;
1467 CJBig2_Image* GRREG;
1468 FX_DWORD line1, line1_r, line2_r, line3_r;
1469 uint8_t *pLine, *pLineR, cVal;
1470 intptr_t nStride, nStrideR, nOffset;
1471 int32_t k, nBits;
1472 int32_t GRWR, GRHR;
1473 int32_t GRW, GRH;
1474 GRW = (int32_t)CJBig2_GRRDProc::GRW;
1475 GRH = (int32_t)CJBig2_GRRDProc::GRH;
1476 LTP = 0;
1477 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
1478 if (GRREG->m_pData == NULL) {
1479 delete GRREG;
1480 m_pModule->JBig2_Error(
1481 "Generic refinement region decoding procedure: Create Image Failed "
1482 "with width = %d, height = %d\n",
1483 GRW, GRH);
1484 return NULL;
1485 }
1486 pLine = GRREG->m_pData;
1487 pLineR = GRREFERENCE->m_pData;
1488 nStride = GRREG->m_nStride;
1489 nStrideR = GRREFERENCE->m_nStride;
1490 GRWR = (int32_t)GRREFERENCE->m_nWidth;
1491 GRHR = (int32_t)GRREFERENCE->m_nHeight;
1492 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
1493 GRREFERENCEDY = 0;
1494 }
1495 nOffset = -GRREFERENCEDY * nStrideR;
1496 for (int32_t h = 0; h < GRH; h++) {
1497 if (TPGRON) {
1498 SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
1499 LTP = LTP ^ SLTP;
1500 }
1501 line1 = (h > 0) ? pLine[-nStride] << 4 : 0;
1502 int32_t reference_h = h - GRREFERENCEDY;
1503 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
1504 FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
1505 FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);
1506 line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;
1507 line2_r = line2_r_ok ? pLineR[nOffset] : 0;
1508 line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;
1509 if (LTP == 0) {
1510 CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) |
1511 ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);
1512 for (int32_t w = 0; w < GRW; w += 8) {
1513 nBits = GRW - w > 8 ? 8 : GRW - w;
1514 if (h > 0)
1515 line1 = (line1 << 8) |
1516 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);
1517 if (h > GRHR + GRREFERENCEDY + 1) {
1518 line1_r = 0;
1519 line2_r = 0;
1520 line3_r = 0;
243 } else { 1521 } else {
244 if(h > 1) { 1522 if (line1_r_ok)
245 pLine1 = pLine - nStride2; 1523 line1_r =
246 pLine2 = pLine - nStride; 1524 (line1_r << 8) |
247 line1 = (*pLine1++) << 6; 1525 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
248 line2 = *pLine2++; 1526 if (line2_r_ok)
249 CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); 1527 line2_r = (line2_r << 8) |
250 for(cc = 0; cc < nLineBytes; cc++) { 1528 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
251 line1 = (line1 << 8) | ((*pLine1++) << 6); 1529 if (line3_r_ok)
252 line2 = (line2 << 8) | (*pLine2++); 1530 line3_r =
253 cVal = 0; 1531 (line3_r << 8) |
254 for(k = 7; k >= 0; k--) { 1532 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
255 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 1533 else {
256 cVal |= bVal << k; 1534 line3_r = 0;
257 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal 1535 }
258 | ((line1 >> k) & 0x0800) 1536 }
259 | ((line2 >> k) & 0x0010)); 1537 cVal = 0;
260 } 1538 for (k = 0; k < nBits; k++) {
261 pLine[cc] = cVal; 1539 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
262 } 1540 cVal |= bVal << (7 - k);
263 line1 <<= 8; 1541 CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |
264 line2 <<= 8; 1542 ((line1 >> (7 - k)) & 0x0400) |
265 cVal = 0; 1543 ((line1_r >> (7 - k)) & 0x0040) |
266 for(k = 0; k < nBitsLeft; k++) { 1544 ((line2_r >> (10 - k)) & 0x0008) |
267 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 1545 ((line3_r >> (13 - k)) & 0x0001);
268 cVal |= bVal << (7 - k); 1546 }
269 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal 1547 pLine[w >> 3] = cVal;
270 | ((line1 >> (7 - k)) & 0x0800) 1548 }
271 | ((line2 >> (7 - k)) & 0x0010)); 1549 } else {
272 } 1550 CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) |
273 pLine[nLineBytes] = cVal; 1551 ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);
274 } else { 1552 for (int32_t w = 0; w < GRW; w += 8) {
275 pLine2 = pLine - nStride; 1553 nBits = GRW - w > 8 ? 8 : GRW - w;
276 line2 = (h & 1) ? (*pLine2++) : 0; 1554 if (h > 0)
277 CONTEXT = (line2 & 0x07f0); 1555 line1 = (line1 << 8) |
278 for(cc = 0; cc < nLineBytes; cc++) { 1556 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);
279 if(h & 1) { 1557 if (line1_r_ok)
280 line2 = (line2 << 8) | (*pLine2++); 1558 line1_r =
281 } 1559 (line1_r << 8) |
282 cVal = 0; 1560 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
283 for(k = 7; k >= 0; k--) { 1561 if (line2_r_ok)
284 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 1562 line2_r = (line2_r << 8) |
285 cVal |= bVal << k; 1563 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
286 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal 1564 if (line3_r_ok)
287 | ((line2 >> k) & 0x0010)); 1565 line3_r =
288 } 1566 (line3_r << 8) |
289 pLine[cc] = cVal; 1567 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
290 } 1568 else {
291 line2 <<= 8; 1569 line3_r = 0;
292 cVal = 0; 1570 }
293 for(k = 0; k < nBitsLeft; k++) { 1571 cVal = 0;
294 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 1572 for (k = 0; k < nBits; k++) {
295 cVal |= bVal << (7 - k); 1573 bVal = GRREFERENCE->getPixel(w + k, h);
296 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal 1574 if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1)) &&
297 | (((line2 >> (7 - k))) & 0x0010)); 1575 (bVal == GRREFERENCE->getPixel(w + k, h - 1)) &&
298 } 1576 (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) &&
299 pLine[nLineBytes] = cVal; 1577 (bVal == GRREFERENCE->getPixel(w + k - 1, h)) &&
300 } 1578 (bVal == GRREFERENCE->getPixel(w + k + 1, h)) &&
301 } 1579 (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) &&
302 pLine += nStride; 1580 (bVal == GRREFERENCE->getPixel(w + k, h + 1)) &&
303 } 1581 (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {
304 return GBREG; 1582 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
305 } 1583 }
306 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_ArithDecoder * pArithDecoder, JBig2ArithCtx *gbContext) 1584 cVal |= bVal << (7 - k);
307 { 1585 CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |
308 FX_BOOL LTP, SLTP, bVal; 1586 ((line1 >> (7 - k)) & 0x0400) |
309 FX_DWORD CONTEXT; 1587 ((line1_r >> (7 - k)) & 0x0040) |
310 CJBig2_Image *GBREG; 1588 ((line2_r >> (10 - k)) & 0x0008) |
311 FX_DWORD line1, line2, line3; 1589 ((line3_r >> (13 - k)) & 0x0001);
312 LTP = 0; 1590 }
313 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); 1591 pLine[w >> 3] = cVal;
314 GBREG->fill(0); 1592 }
315 for(FX_DWORD h = 0; h < GBH; h++) { 1593 }
316 if(TPGDON) { 1594 pLine += nStride;
317 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); 1595 if (h < GRHR + GRREFERENCEDY) {
318 LTP = LTP ^ SLTP; 1596 pLineR += nStrideR;
319 } 1597 }
320 if(LTP == 1) { 1598 }
321 GBREG->copyLine(h, h - 1); 1599 return GRREG;
1600 }
1601 CJBig2_Image* CJBig2_GRRDProc::decode_Template1_unopt(
1602 CJBig2_ArithDecoder* pArithDecoder,
1603 JBig2ArithCtx* grContext) {
1604 FX_BOOL LTP, SLTP, bVal;
1605 FX_DWORD CONTEXT;
1606 CJBig2_Image* GRREG;
1607 FX_DWORD line1, line2, line3, line4, line5;
1608 LTP = 0;
1609 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
1610 GRREG->fill(0);
1611 for (FX_DWORD h = 0; h < GRH; h++) {
1612 if (TPGRON) {
1613 SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
1614 LTP = LTP ^ SLTP;
1615 }
1616 if (LTP == 0) {
1617 line1 = GRREG->getPixel(1, h - 1);
1618 line1 |= GRREG->getPixel(0, h - 1) << 1;
1619 line1 |= GRREG->getPixel(-1, h - 1) << 2;
1620 line2 = 0;
1621 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);
1622 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
1623 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
1624 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY)
1625 << 2;
1626 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1627 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1)
1628 << 1;
1629 for (FX_DWORD w = 0; w < GRW; w++) {
1630 CONTEXT = line5;
1631 CONTEXT |= line4 << 2;
1632 CONTEXT |= line3 << 5;
1633 CONTEXT |= line2 << 6;
1634 CONTEXT |= line1 << 7;
1635 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1636 GRREG->setPixel(w, h, bVal);
1637 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;
1638 line2 = ((line2 << 1) | bVal) & 0x01;
1639 line3 = ((line3 << 1) |
1640 GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
1641 h - GRREFERENCEDY - 1)) &
1642 0x01;
1643 line4 =
1644 ((line4 << 1) |
1645 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) &
1646 0x07;
1647 line5 = ((line5 << 1) |
1648 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2,
1649 h - GRREFERENCEDY + 1)) &
1650 0x03;
1651 }
1652 } else {
1653 line1 = GRREG->getPixel(1, h - 1);
1654 line1 |= GRREG->getPixel(0, h - 1) << 1;
1655 line1 |= GRREG->getPixel(-1, h - 1) << 2;
1656 line2 = 0;
1657 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);
1658 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
1659 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
1660 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY)
1661 << 2;
1662 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1663 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1)
1664 << 1;
1665 for (FX_DWORD w = 0; w < GRW; w++) {
1666 bVal = GRREFERENCE->getPixel(w, h);
1667 if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) &&
1668 (bVal == GRREFERENCE->getPixel(w, h - 1)) &&
1669 (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) &&
1670 (bVal == GRREFERENCE->getPixel(w - 1, h)) &&
1671 (bVal == GRREFERENCE->getPixel(w + 1, h)) &&
1672 (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) &&
1673 (bVal == GRREFERENCE->getPixel(w, h + 1)) &&
1674 (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {
1675 CONTEXT = line5;
1676 CONTEXT |= line4 << 2;
1677 CONTEXT |= line3 << 5;
1678 CONTEXT |= line2 << 6;
1679 CONTEXT |= line1 << 7;
1680 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1681 }
1682 GRREG->setPixel(w, h, bVal);
1683 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;
1684 line2 = ((line2 << 1) | bVal) & 0x01;
1685 line3 = ((line3 << 1) |
1686 GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
1687 h - GRREFERENCEDY - 1)) &
1688 0x01;
1689 line4 =
1690 ((line4 << 1) |
1691 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) &
1692 0x07;
1693 line5 = ((line5 << 1) |
1694 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2,
1695 h - GRREFERENCEDY + 1)) &
1696 0x03;
1697 }
1698 }
1699 }
1700 return GRREG;
1701 }
1702 CJBig2_Image* CJBig2_GRRDProc::decode_Template1_opt(
1703 CJBig2_ArithDecoder* pArithDecoder,
1704 JBig2ArithCtx* grContext) {
1705 FX_BOOL LTP, SLTP, bVal;
1706 FX_DWORD CONTEXT;
1707 CJBig2_Image* GRREG;
1708 FX_DWORD line1, line1_r, line2_r, line3_r;
1709 uint8_t *pLine, *pLineR, cVal;
1710 intptr_t nStride, nStrideR, nOffset;
1711 int32_t k, nBits;
1712 int32_t GRWR, GRHR;
1713 int32_t GRW, GRH;
1714 GRW = (int32_t)CJBig2_GRRDProc::GRW;
1715 GRH = (int32_t)CJBig2_GRRDProc::GRH;
1716 LTP = 0;
1717 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
1718 if (GRREG->m_pData == NULL) {
1719 delete GRREG;
1720 m_pModule->JBig2_Error(
1721 "Generic refinement region decoding procedure: Create Image Failed "
1722 "with width = %d, height = %d\n",
1723 GRW, GRH);
1724 return NULL;
1725 }
1726 pLine = GRREG->m_pData;
1727 pLineR = GRREFERENCE->m_pData;
1728 nStride = GRREG->m_nStride;
1729 nStrideR = GRREFERENCE->m_nStride;
1730 GRWR = (int32_t)GRREFERENCE->m_nWidth;
1731 GRHR = (int32_t)GRREFERENCE->m_nHeight;
1732 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
1733 GRREFERENCEDY = 0;
1734 }
1735 nOffset = -GRREFERENCEDY * nStrideR;
1736 for (int32_t h = 0; h < GRH; h++) {
1737 if (TPGRON) {
1738 SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
1739 LTP = LTP ^ SLTP;
1740 }
1741 line1 = (h > 0) ? pLine[-nStride] << 1 : 0;
1742 int32_t reference_h = h - GRREFERENCEDY;
1743 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
1744 FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
1745 FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);
1746 line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;
1747 line2_r = line2_r_ok ? pLineR[nOffset] : 0;
1748 line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;
1749 if (LTP == 0) {
1750 CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) |
1751 ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);
1752 for (int32_t w = 0; w < GRW; w += 8) {
1753 nBits = GRW - w > 8 ? 8 : GRW - w;
1754 if (h > 0)
1755 line1 = (line1 << 8) |
1756 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);
1757 if (line1_r_ok)
1758 line1_r =
1759 (line1_r << 8) |
1760 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
1761 if (line2_r_ok)
1762 line2_r = (line2_r << 8) |
1763 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
1764 if (line3_r_ok)
1765 line3_r =
1766 (line3_r << 8) |
1767 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
1768 else {
1769 line3_r = 0;
1770 }
1771 cVal = 0;
1772 for (k = 0; k < nBits; k++) {
1773 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1774 cVal |= bVal << (7 - k);
1775 CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |
1776 ((line1 >> (7 - k)) & 0x0080) |
1777 ((line1_r >> (9 - k)) & 0x0020) |
1778 ((line2_r >> (11 - k)) & 0x0004) |
1779 ((line3_r >> (13 - k)) & 0x0001);
1780 }
1781 pLine[w >> 3] = cVal;
1782 }
1783 } else {
1784 CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) |
1785 ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);
1786 for (int32_t w = 0; w < GRW; w += 8) {
1787 nBits = GRW - w > 8 ? 8 : GRW - w;
1788 if (h > 0)
1789 line1 = (line1 << 8) |
1790 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);
1791 if (line1_r_ok)
1792 line1_r =
1793 (line1_r << 8) |
1794 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
1795 if (line2_r_ok)
1796 line2_r = (line2_r << 8) |
1797 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
1798 if (line3_r_ok)
1799 line3_r =
1800 (line3_r << 8) |
1801 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
1802 else {
1803 line3_r = 0;
1804 }
1805 cVal = 0;
1806 for (k = 0; k < nBits; k++) {
1807 bVal = GRREFERENCE->getPixel(w + k, h);
1808 if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1)) &&
1809 (bVal == GRREFERENCE->getPixel(w + k, h - 1)) &&
1810 (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) &&
1811 (bVal == GRREFERENCE->getPixel(w + k - 1, h)) &&
1812 (bVal == GRREFERENCE->getPixel(w + k + 1, h)) &&
1813 (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) &&
1814 (bVal == GRREFERENCE->getPixel(w + k, h + 1)) &&
1815 (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {
1816 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1817 }
1818 cVal |= bVal << (7 - k);
1819 CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |
1820 ((line1 >> (7 - k)) & 0x0080) |
1821 ((line1_r >> (9 - k)) & 0x0020) |
1822 ((line2_r >> (11 - k)) & 0x0004) |
1823 ((line3_r >> (13 - k)) & 0x0001);
1824 }
1825 pLine[w >> 3] = cVal;
1826 }
1827 }
1828 pLine += nStride;
1829 if (h < GRHR + GRREFERENCEDY) {
1830 pLineR += nStrideR;
1831 }
1832 }
1833 return GRREG;
1834 }
1835 CJBig2_Image* CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder* pArithDecoder,
1836 JBig2ArithCtx* grContext) {
1837 FX_BOOL LTP, SLTP, bVal;
1838 FX_BOOL TPGRPIX, TPGRVAL;
1839 FX_DWORD CONTEXT;
1840 CJBig2_Image* GRREG;
1841 LTP = 0;
1842 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
1843 GRREG->fill(0);
1844 for (FX_DWORD h = 0; h < GRH; h++) {
1845 if (TPGRON) {
1846 switch (GRTEMPLATE) {
1847 case 0:
1848 CONTEXT = 0x0010;
1849 break;
1850 case 1:
1851 CONTEXT = 0x0008;
1852 break;
1853 }
1854 SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]);
1855 LTP = LTP ^ SLTP;
1856 }
1857 if (LTP == 0) {
1858 for (FX_DWORD w = 0; w < GRW; w++) {
1859 CONTEXT = 0;
1860 switch (GRTEMPLATE) {
1861 case 0:
1862 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
1863 h - GRREFERENCEDY + 1);
1864 CONTEXT |=
1865 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1)
1866 << 1;
1867 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1,
1868 h - GRREFERENCEDY + 1)
1869 << 2;
1870 CONTEXT |=
1871 GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY)
1872 << 3;
1873 CONTEXT |=
1874 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY)
1875 << 4;
1876 CONTEXT |=
1877 GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY)
1878 << 5;
1879 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
1880 h - GRREFERENCEDY - 1)
1881 << 6;
1882 CONTEXT |=
1883 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1)
1884 << 7;
1885 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2],
1886 h - GRREFERENCEDY + GRAT[3])
1887 << 8;
1888 CONTEXT |= GRREG->getPixel(w - 1, h) << 9;
1889 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;
1890 CONTEXT |= GRREG->getPixel(w, h - 1) << 11;
1891 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
1892 break;
1893 case 1:
1894 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
1895 h - GRREFERENCEDY + 1);
1896 CONTEXT |=
1897 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1)
1898 << 1;
1899 CONTEXT |=
1900 GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY)
1901 << 2;
1902 CONTEXT |=
1903 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY)
1904 << 3;
1905 CONTEXT |=
1906 GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY)
1907 << 4;
1908 CONTEXT |=
1909 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1)
1910 << 5;
1911 CONTEXT |= GRREG->getPixel(w - 1, h) << 6;
1912 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;
1913 CONTEXT |= GRREG->getPixel(w, h - 1) << 8;
1914 CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;
1915 break;
1916 }
1917 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1918 GRREG->setPixel(w, h, bVal);
1919 }
1920 } else {
1921 for (FX_DWORD w = 0; w < GRW; w++) {
1922 bVal = GRREFERENCE->getPixel(w, h);
1923 if (TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) &&
1924 (bVal == GRREFERENCE->getPixel(w, h - 1)) &&
1925 (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) &&
1926 (bVal == GRREFERENCE->getPixel(w - 1, h)) &&
1927 (bVal == GRREFERENCE->getPixel(w + 1, h)) &&
1928 (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) &&
1929 (bVal == GRREFERENCE->getPixel(w, h + 1)) &&
1930 (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) {
1931 TPGRPIX = 1;
1932 TPGRVAL = bVal;
322 } else { 1933 } else {
323 line1 = GBREG->getPixel(1, h - 2); 1934 TPGRPIX = 0;
324 line1 |= GBREG->getPixel(0, h - 2) << 1; 1935 }
325 line2 = GBREG->getPixel(2, h - 1); 1936 if (TPGRPIX) {
326 line2 |= GBREG->getPixel(1, h - 1) << 1; 1937 GRREG->setPixel(w, h, TPGRVAL);
327 line2 |= GBREG->getPixel(0, h - 1) << 2;
328 line3 = 0;
329 for(FX_DWORD w = 0; w < GBW; w++) {
330 if(USESKIP && SKIP->getPixel(w, h)) {
331 bVal = 0;
332 } else {
333 CONTEXT = line3;
334 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
335 CONTEXT |= line2 << 5;
336 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
337 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
338 CONTEXT |= line1 << 12;
339 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
340 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
341 }
342 if(bVal) {
343 GBREG->setPixel(w, h, bVal);
344 }
345 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
346 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
347 line3 = ((line3 << 1) | bVal) & 0x0f;
348 }
349 }
350 }
351 return GBREG;
352 }
353 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt(CJBig2_ArithDecoder *pA rithDecoder, JBig2ArithCtx *gbContext)
354 {
355 FX_BOOL LTP, SLTP, bVal;
356 FX_DWORD CONTEXT;
357 CJBig2_Image *GBREG;
358 FX_DWORD line1, line2, line3;
359 LTP = 0;
360 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
361 GBREG->fill(0);
362 for(FX_DWORD h = 0; h < GBH; h++) {
363 if(TPGDON) {
364 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
365 LTP = LTP ^ SLTP;
366 }
367 if(LTP == 1) {
368 GBREG->copyLine(h, h - 1);
369 } else { 1938 } else {
370 line1 = GBREG->getPixel(2, h - 2); 1939 CONTEXT = 0;
371 line1 |= GBREG->getPixel(1, h - 2) << 1; 1940 switch (GRTEMPLATE) {
372 line1 |= GBREG->getPixel(0, h - 2) << 2; 1941 case 0:
373 line2 = GBREG->getPixel(3, h - 1); 1942 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
374 line2 |= GBREG->getPixel(2, h - 1) << 1; 1943 h - GRREFERENCEDY + 1);
375 line2 |= GBREG->getPixel(1, h - 1) << 2; 1944 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX,
376 line2 |= GBREG->getPixel(0, h - 1) << 3; 1945 h - GRREFERENCEDY + 1)
377 line3 = 0; 1946 << 1;
378 for(FX_DWORD w = 0; w < GBW; w++) { 1947 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1,
379 if(USESKIP && SKIP->getPixel(w, h)) { 1948 h - GRREFERENCEDY + 1)
380 bVal = 0; 1949 << 2;
381 } else { 1950 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
382 CONTEXT = line3; 1951 h - GRREFERENCEDY)
383 CONTEXT |= line2 << 3; 1952 << 3;
384 CONTEXT |= line1 << 9; 1953 CONTEXT |=
385 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 1954 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY)
386 } 1955 << 4;
387 if(bVal) { 1956 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1,
388 GBREG->setPixel(w, h, bVal); 1957 h - GRREFERENCEDY)
389 } 1958 << 5;
390 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; 1959 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
391 line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f; 1960 h - GRREFERENCEDY - 1)
392 line3 = ((line3 << 1) | bVal) & 0x07; 1961 << 6;
393 } 1962 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX,
394 } 1963 h - GRREFERENCEDY - 1)
395 } 1964 << 7;
396 return GBREG; 1965 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2],
397 } 1966 h - GRREFERENCEDY + GRAT[3])
398 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt2(CJBig2_ArithDecoder *p ArithDecoder, JBig2ArithCtx *gbContext) 1967 << 8;
399 { 1968 CONTEXT |= GRREG->getPixel(w - 1, h) << 9;
400 FX_BOOL LTP, SLTP, bVal; 1969 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;
401 FX_DWORD CONTEXT; 1970 CONTEXT |= GRREG->getPixel(w, h - 1) << 11;
402 CJBig2_Image *GBREG; 1971 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
403 FX_DWORD line1, line2; 1972 break;
404 uint8_t *pLine, cVal; 1973 case 1:
405 intptr_t nStride, nStride2; 1974 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
406 int32_t nBits, k; 1975 h - GRREFERENCEDY + 1);
407 LTP = 0; 1976 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX,
408 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); 1977 h - GRREFERENCEDY + 1)
409 if (GBREG->m_pData == NULL) { 1978 << 1;
410 delete GBREG; 1979 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
411 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); 1980 h - GRREFERENCEDY)
412 return NULL; 1981 << 2;
413 } 1982 CONTEXT |=
414 pLine = GBREG->m_pData; 1983 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY)
415 nStride = GBREG->m_nStride; 1984 << 3;
416 nStride2 = nStride << 1; 1985 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1,
417 for(FX_DWORD h = 0; h < GBH; h++) { 1986 h - GRREFERENCEDY)
418 if(TPGDON) { 1987 << 4;
419 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); 1988 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX,
420 LTP = LTP ^ SLTP; 1989 h - GRREFERENCEDY - 1)
421 } 1990 << 5;
422 if(LTP == 1) { 1991 CONTEXT |= GRREG->getPixel(w - 1, h) << 6;
423 GBREG->copyLine(h, h - 1); 1992 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;
1993 CONTEXT |= GRREG->getPixel(w, h - 1) << 8;
1994 CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;
1995 break;
1996 }
1997 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1998 GRREG->setPixel(w, h, bVal);
1999 }
2000 }
2001 }
2002 }
2003 return GRREG;
2004 }
2005 CJBig2_Image* CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream* pStream,
2006 JBig2ArithCtx* grContext) {
2007 int32_t STRIPT, FIRSTS;
2008 FX_DWORD NINSTANCES;
2009 int32_t DT, DFS, CURS;
2010 uint8_t CURT;
2011 int32_t SI, TI;
2012 FX_DWORD IDI;
2013 CJBig2_Image* IBI;
2014 FX_DWORD WI, HI;
2015 int32_t IDS;
2016 FX_BOOL RI;
2017 int32_t RDWI, RDHI, RDXI, RDYI;
2018 CJBig2_Image* IBOI;
2019 FX_DWORD WOI, HOI;
2020 CJBig2_Image* SBREG;
2021 FX_BOOL bFirst;
2022 FX_DWORD nTmp;
2023 int32_t nVal, nBits;
2024 CJBig2_HuffmanDecoder* pHuffmanDecoder;
2025 CJBig2_GRRDProc* pGRRD;
2026 CJBig2_ArithDecoder* pArithDecoder;
2027 JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));
2028 JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));
2029 SBREG->fill(SBDEFPIXEL);
2030 if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) {
2031 m_pModule->JBig2_Error(
2032 "text region decoding procedure (huffman): too short.");
2033 goto failed;
2034 }
2035 STRIPT *= SBSTRIPS;
2036 STRIPT = -STRIPT;
2037 FIRSTS = 0;
2038 NINSTANCES = 0;
2039 while (NINSTANCES < SBNUMINSTANCES) {
2040 if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) {
2041 m_pModule->JBig2_Error(
2042 "text region decoding procedure (huffman): too short.");
2043 goto failed;
2044 }
2045 DT *= SBSTRIPS;
2046 STRIPT = STRIPT + DT;
2047 bFirst = TRUE;
2048 for (;;) {
2049 if (bFirst) {
2050 if (pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) {
2051 m_pModule->JBig2_Error(
2052 "text region decoding procedure (huffman): too short.");
2053 goto failed;
2054 }
2055 FIRSTS = FIRSTS + DFS;
2056 CURS = FIRSTS;
2057 bFirst = FALSE;
2058 } else {
2059 nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS);
2060 if (nVal == JBIG2_OOB) {
2061 break;
2062 } else if (nVal != 0) {
2063 m_pModule->JBig2_Error(
2064 "text region decoding procedure (huffman): too short.");
2065 goto failed;
424 } else { 2066 } else {
425 line1 = (h > 1) ? pLine[-nStride2] << 4 : 0; 2067 CURS = CURS + IDS + SBDSOFFSET;
426 line2 = (h > 0) ? pLine[-nStride] : 0; 2068 }
427 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); 2069 }
428 for(FX_DWORD w = 0; w < GBW; w += 8) { 2070 if (SBSTRIPS == 1) {
429 if(w + 8 < GBW) { 2071 CURT = 0;
430 nBits = 8; 2072 } else {
431 if(h > 1) { 2073 nTmp = 1;
432 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 4); 2074 while ((FX_DWORD)(1 << nTmp) < SBSTRIPS) {
433 } 2075 nTmp++;
434 if(h > 0) { 2076 }
435 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); 2077 if (pStream->readNBits(nTmp, &nVal) != 0) {
436 } 2078 m_pModule->JBig2_Error(
437 } else { 2079 "text region decoding procedure (huffman): too short.");
438 nBits = GBW - w; 2080 goto failed;
439 if(h > 1) { 2081 }
440 line1 <<= 8; 2082 CURT = nVal;
441 } 2083 }
442 if(h > 0) { 2084 TI = STRIPT + CURT;
443 line2 <<= 8; 2085 nVal = 0;
444 } 2086 nBits = 0;
445 } 2087 for (;;) {
446 cVal = 0; 2088 if (pStream->read1Bit(&nTmp) != 0) {
447 for(k = 0; k < nBits; k++) { 2089 m_pModule->JBig2_Error(
448 if(USESKIP && SKIP->getPixel(w, h)) { 2090 "text region decoding procedure (huffman): too short.");
449 bVal = 0; 2091 goto failed;
450 } else { 2092 }
451 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 2093 nVal = (nVal << 1) | nTmp;
452 } 2094 nBits++;
453 cVal |= bVal << (7 - k); 2095 for (IDI = 0; IDI < SBNUMSYMS; IDI++) {
454 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal 2096 if ((nBits == SBSYMCODES[IDI].codelen) &&
455 | ((line1 >> (7 - k)) & 0x0200) 2097 (nVal == SBSYMCODES[IDI].code)) {
456 | ((line2 >> (8 - k)) & 0x0008); 2098 break;
457 } 2099 }
458 pLine[w >> 3] = cVal; 2100 }
459 } 2101 if (IDI < SBNUMSYMS) {
460 } 2102 break;
461 pLine += nStride; 2103 }
462 } 2104 }
463 return GBREG; 2105 if (SBREFINE == 0) {
464 } 2106 RI = 0;
465 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_ArithDecoder *p ArithDecoder, JBig2ArithCtx *gbContext) 2107 } else {
466 { 2108 if (pStream->read1Bit(&RI) != 0) {
467 FX_BOOL LTP, SLTP, bVal; 2109 m_pModule->JBig2_Error(
468 FX_DWORD CONTEXT; 2110 "text region decoding procedure (huffman): too short.");
469 CJBig2_Image *GBREG; 2111 goto failed;
470 FX_DWORD line1, line2; 2112 }
471 uint8_t *pLine, *pLine1, *pLine2, cVal; 2113 }
472 int32_t nStride, nStride2, k; 2114 if (RI == 0) {
473 int32_t nLineBytes, nBitsLeft, cc; 2115 IBI = SBSYMS[IDI];
474 LTP = 0; 2116 } else {
475 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); 2117 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0) ||
476 if (GBREG->m_pData == NULL) { 2118 (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0) ||
477 delete GBREG; 2119 (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) ||
478 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); 2120 (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0) ||
479 return NULL; 2121 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {
480 } 2122 m_pModule->JBig2_Error(
481 pLine = GBREG->m_pData; 2123 "text region decoding procedure (huffman): too short.");
482 nStride = GBREG->m_nStride; 2124 goto failed;
483 nStride2 = nStride << 1; 2125 }
484 nLineBytes = ((GBW + 7) >> 3) - 1; 2126 pStream->alignByte();
485 nBitsLeft = GBW - (nLineBytes << 3); 2127 nTmp = pStream->getOffset();
486 for(FX_DWORD h = 0; h < GBH; h++) { 2128 IBOI = SBSYMS[IDI];
487 if(TPGDON) { 2129 if (!IBOI) {
488 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); 2130 goto failed;
489 LTP = LTP ^ SLTP; 2131 }
490 } 2132 WOI = IBOI->m_nWidth;
491 if(LTP == 1) { 2133 HOI = IBOI->m_nHeight;
492 GBREG->copyLine(h, h - 1); 2134 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
493 } else { 2135 m_pModule->JBig2_Error(
494 if(h > 1) { 2136 "text region decoding procedure (huffman): Invalid RDWI or RDHI "
495 pLine1 = pLine - nStride2; 2137 "value.");
496 pLine2 = pLine - nStride; 2138 goto failed;
497 line1 = (*pLine1++) << 4; 2139 }
498 line2 = *pLine2++; 2140 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
499 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); 2141 pGRRD->GRW = WOI + RDWI;
500 for(cc = 0; cc < nLineBytes; cc++) { 2142 pGRRD->GRH = HOI + RDHI;
501 line1 = (line1 << 8) | ((*pLine1++) << 4); 2143 pGRRD->GRTEMPLATE = SBRTEMPLATE;
502 line2 = (line2 << 8) | (*pLine2++); 2144 pGRRD->GRREFERENCE = IBOI;
503 cVal = 0; 2145 pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI;
504 for(k = 7; k >= 0; k--) { 2146 pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI;
505 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 2147 pGRRD->TPGRON = 0;
506 cVal |= bVal << k; 2148 pGRRD->GRAT[0] = SBRAT[0];
507 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal 2149 pGRRD->GRAT[1] = SBRAT[1];
508 | ((line1 >> k) & 0x0200) 2150 pGRRD->GRAT[2] = SBRAT[2];
509 | ((line2 >> (k + 1)) & 0x0008); 2151 pGRRD->GRAT[3] = SBRAT[3];
510 } 2152 JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));
511 pLine[cc] = cVal; 2153 IBI = pGRRD->decode(pArithDecoder, grContext);
512 } 2154 if (IBI == NULL) {
513 line1 <<= 8; 2155 delete pGRRD;
514 line2 <<= 8; 2156 delete pArithDecoder;
515 cVal = 0; 2157 goto failed;
516 for(k = 0; k < nBitsLeft; k++) { 2158 }
517 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 2159 delete pArithDecoder;
518 cVal |= bVal << (7 - k); 2160 pStream->alignByte();
519 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal 2161 pStream->offset(2);
520 | ((line1 >> (7 - k)) & 0x0200) 2162 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
521 | ((line2 >> (8 - k)) & 0x0008); 2163 delete IBI;
522 } 2164 delete pGRRD;
523 pLine[nLineBytes] = cVal; 2165 m_pModule->JBig2_Error(
524 } else { 2166 "text region decoding procedure (huffman):"
525 pLine2 = pLine - nStride; 2167 "bytes processed by generic refinement region decoding procedure "
526 line2 = (h & 1) ? (*pLine2++) : 0; 2168 "doesn't equal SBHUFFRSIZE.");
527 CONTEXT = (line2 >> 1) & 0x01f8; 2169 goto failed;
528 for(cc = 0; cc < nLineBytes; cc++) { 2170 }
529 if(h & 1) { 2171 delete pGRRD;
530 line2 = (line2 << 8) | (*pLine2++); 2172 }
531 } 2173 if (!IBI) {
532 cVal = 0; 2174 continue;
533 for(k = 7; k >= 0; k--) { 2175 }
534 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 2176 WI = IBI->m_nWidth;
535 cVal |= bVal << k; 2177 HI = IBI->m_nHeight;
536 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal 2178 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) ||
537 | ((line2 >> (k + 1)) & 0x0008); 2179 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
538 } 2180 CURS = CURS + WI - 1;
539 pLine[cc] = cVal; 2181 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) ||
540 } 2182 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
541 line2 <<= 8; 2183 CURS = CURS + HI - 1;
542 cVal = 0; 2184 }
543 for(k = 0; k < nBitsLeft; k++) { 2185 SI = CURS;
544 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 2186 if (TRANSPOSED == 0) {
545 cVal |= bVal << (7 - k); 2187 switch (REFCORNER) {
546 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal 2188 case JBIG2_CORNER_TOPLEFT:
547 | ((line2 >> (8 - k)) & 0x0008); 2189 SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);
548 } 2190 break;
549 pLine[nLineBytes] = cVal; 2191 case JBIG2_CORNER_TOPRIGHT:
550 } 2192 SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);
551 } 2193 break;
552 pLine += nStride; 2194 case JBIG2_CORNER_BOTTOMLEFT:
553 } 2195 SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);
554 return GBREG; 2196 break;
555 } 2197 case JBIG2_CORNER_BOTTOMRIGHT:
556 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_ArithDecoder * pArithDecoder, JBig2ArithCtx *gbContext) 2198 SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);
557 { 2199 break;
558 FX_BOOL LTP, SLTP, bVal; 2200 }
559 FX_DWORD CONTEXT; 2201 } else {
560 CJBig2_Image *GBREG; 2202 switch (REFCORNER) {
561 FX_DWORD line1, line2, line3; 2203 case JBIG2_CORNER_TOPLEFT:
562 LTP = 0; 2204 SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);
563 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); 2205 break;
564 GBREG->fill(0); 2206 case JBIG2_CORNER_TOPRIGHT:
565 for(FX_DWORD h = 0; h < GBH; h++) { 2207 SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);
566 if(TPGDON) { 2208 break;
567 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); 2209 case JBIG2_CORNER_BOTTOMLEFT:
568 LTP = LTP ^ SLTP; 2210 SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);
569 } 2211 break;
570 if(LTP == 1) { 2212 case JBIG2_CORNER_BOTTOMRIGHT:
571 GBREG->copyLine(h, h - 1); 2213 SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);
572 } else { 2214 break;
573 line1 = GBREG->getPixel(2, h - 2); 2215 }
574 line1 |= GBREG->getPixel(1, h - 2) << 1; 2216 }
575 line1 |= GBREG->getPixel(0, h - 2) << 2; 2217 if (RI != 0) {
576 line2 = GBREG->getPixel(2, h - 1); 2218 delete IBI;
577 line2 |= GBREG->getPixel(1, h - 1) << 1; 2219 }
578 line2 |= GBREG->getPixel(0, h - 1) << 2; 2220 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) ||
579 line3 = 0; 2221 (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
580 for(FX_DWORD w = 0; w < GBW; w++) { 2222 CURS = CURS + WI - 1;
581 if(USESKIP && SKIP->getPixel(w, h)) { 2223 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) ||
582 bVal = 0; 2224 (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {
583 } else { 2225 CURS = CURS + HI - 1;
584 CONTEXT = line3; 2226 }
585 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; 2227 NINSTANCES = NINSTANCES + 1;
586 CONTEXT |= line2 << 4; 2228 }
587 CONTEXT |= line1 << 9; 2229 }
588 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 2230 delete pHuffmanDecoder;
589 } 2231 return SBREG;
590 if(bVal) {
591 GBREG->setPixel(w, h, bVal);
592 }
593 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
594 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
595 line3 = ((line3 << 1) | bVal) & 0x07;
596 }
597 }
598 }
599 return GBREG;
600 }
601 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt(CJBig2_ArithDecoder *pA rithDecoder, JBig2ArithCtx *gbContext)
602 {
603 FX_BOOL LTP, SLTP, bVal;
604 FX_DWORD CONTEXT;
605 CJBig2_Image *GBREG;
606 FX_DWORD line1, line2, line3;
607 LTP = 0;
608 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
609 GBREG->fill(0);
610 for(FX_DWORD h = 0; h < GBH; h++) {
611 if(TPGDON) {
612 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
613 LTP = LTP ^ SLTP;
614 }
615 if(LTP == 1) {
616 GBREG->copyLine(h, h - 1);
617 } else {
618 line1 = GBREG->getPixel(1, h - 2);
619 line1 |= GBREG->getPixel(0, h - 2) << 1;
620 line2 = GBREG->getPixel(2, h - 1);
621 line2 |= GBREG->getPixel(1, h - 1) << 1;
622 line2 |= GBREG->getPixel(0, h - 1) << 2;
623 line3 = 0;
624 for(FX_DWORD w = 0; w < GBW; w++) {
625 if(USESKIP && SKIP->getPixel(w, h)) {
626 bVal = 0;
627 } else {
628 CONTEXT = line3;
629 CONTEXT |= line2 << 2;
630 CONTEXT |= line1 << 7;
631 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
632 }
633 if(bVal) {
634 GBREG->setPixel(w, h, bVal);
635 }
636 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
637 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
638 line3 = ((line3 << 1) | bVal) & 0x03;
639 }
640 }
641 }
642 return GBREG;
643 }
644 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt2(CJBig2_ArithDecoder *p ArithDecoder, JBig2ArithCtx *gbContext)
645 {
646 FX_BOOL LTP, SLTP, bVal;
647 FX_DWORD CONTEXT;
648 CJBig2_Image *GBREG;
649 FX_DWORD line1, line2;
650 uint8_t *pLine, cVal;
651 intptr_t nStride, nStride2;
652 int32_t nBits, k;
653 LTP = 0;
654 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
655 if (GBREG->m_pData == NULL) {
656 delete GBREG;
657 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
658 return NULL;
659 }
660 pLine = GBREG->m_pData;
661 nStride = GBREG->m_nStride;
662 nStride2 = nStride << 1;
663 for(FX_DWORD h = 0; h < GBH; h++) {
664 if(TPGDON) {
665 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
666 LTP = LTP ^ SLTP;
667 }
668 if(LTP == 1) {
669 GBREG->copyLine(h, h - 1);
670 } else {
671 line1 = (h > 1) ? pLine[-nStride2] << 1 : 0;
672 line2 = (h > 0) ? pLine[-nStride] : 0;
673 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
674 for(FX_DWORD w = 0; w < GBW; w += 8) {
675 if(w + 8 < GBW) {
676 nBits = 8;
677 if(h > 1) {
678 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 1);
679 }
680 if(h > 0) {
681 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
682 }
683 } else {
684 nBits = GBW - w;
685 if(h > 1) {
686 line1 <<= 8;
687 }
688 if(h > 0) {
689 line2 <<= 8;
690 }
691 }
692 cVal = 0;
693 for(k = 0; k < nBits; k++) {
694 if(USESKIP && SKIP->getPixel(w, h)) {
695 bVal = 0;
696 } else {
697 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
698 }
699 cVal |= bVal << (7 - k);
700 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
701 | ((line1 >> (7 - k)) & 0x0080)
702 | ((line2 >> (10 - k)) & 0x0004);
703 }
704 pLine[w >> 3] = cVal;
705 }
706 }
707 pLine += nStride;
708 }
709 return GBREG;
710 }
711 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_ArithDecoder *p ArithDecoder, JBig2ArithCtx *gbContext)
712 {
713 FX_BOOL LTP, SLTP, bVal;
714 FX_DWORD CONTEXT;
715 CJBig2_Image *GBREG;
716 FX_DWORD line1, line2;
717 uint8_t *pLine, *pLine1, *pLine2, cVal;
718 int32_t nStride, nStride2, k;
719 int32_t nLineBytes, nBitsLeft, cc;
720 LTP = 0;
721 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
722 if (GBREG->m_pData == NULL) {
723 delete GBREG;
724 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
725 return NULL;
726 }
727 pLine = GBREG->m_pData;
728 nStride = GBREG->m_nStride;
729 nStride2 = nStride << 1;
730 nLineBytes = ((GBW + 7) >> 3) - 1;
731 nBitsLeft = GBW - (nLineBytes << 3);
732 for(FX_DWORD h = 0; h < GBH; h++) {
733 if(TPGDON) {
734 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
735 LTP = LTP ^ SLTP;
736 }
737 if(LTP == 1) {
738 GBREG->copyLine(h, h - 1);
739 } else {
740 if(h > 1) {
741 pLine1 = pLine - nStride2;
742 pLine2 = pLine - nStride;
743 line1 = (*pLine1++) << 1;
744 line2 = *pLine2++;
745 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
746 for(cc = 0; cc < nLineBytes; cc++) {
747 line1 = (line1 << 8) | ((*pLine1++) << 1);
748 line2 = (line2 << 8) | (*pLine2++);
749 cVal = 0;
750 for(k = 7; k >= 0; k--) {
751 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
752 cVal |= bVal << k;
753 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
754 | ((line1 >> k) & 0x0080)
755 | ((line2 >> (k + 3)) & 0x0004);
756 }
757 pLine[cc] = cVal;
758 }
759 line1 <<= 8;
760 line2 <<= 8;
761 cVal = 0;
762 for(k = 0; k < nBitsLeft; k++) {
763 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
764 cVal |= bVal << (7 - k);
765 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
766 | ((line1 >> (7 - k)) & 0x0080)
767 | ((line2 >> (10 - k)) & 0x0004);
768 }
769 pLine[nLineBytes] = cVal;
770 } else {
771 pLine2 = pLine - nStride;
772 line2 = (h & 1) ? (*pLine2++) : 0;
773 CONTEXT = (line2 >> 3) & 0x007c;
774 for(cc = 0; cc < nLineBytes; cc++) {
775 if(h & 1) {
776 line2 = (line2 << 8) | (*pLine2++);
777 }
778 cVal = 0;
779 for(k = 7; k >= 0; k--) {
780 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
781 cVal |= bVal << k;
782 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
783 | ((line2 >> (k + 3)) & 0x0004);
784 }
785 pLine[cc] = cVal;
786 }
787 line2 <<= 8;
788 cVal = 0;
789 for(k = 0; k < nBitsLeft; k++) {
790 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
791 cVal |= bVal << (7 - k);
792 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
793 | (((line2 >> (10 - k))) & 0x0004);
794 }
795 pLine[nLineBytes] = cVal;
796 }
797 }
798 pLine += nStride;
799 }
800 return GBREG;
801 }
802 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_ArithDecoder * pArithDecoder, JBig2ArithCtx *gbContext)
803 {
804 FX_BOOL LTP, SLTP, bVal;
805 FX_DWORD CONTEXT;
806 CJBig2_Image *GBREG;
807 FX_DWORD line1, line2, line3;
808 LTP = 0;
809 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
810 GBREG->fill(0);
811 for(FX_DWORD h = 0; h < GBH; h++) {
812 if(TPGDON) {
813 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
814 LTP = LTP ^ SLTP;
815 }
816 if(LTP == 1) {
817 GBREG->copyLine(h, h - 1);
818 } else {
819 line1 = GBREG->getPixel(1, h - 2);
820 line1 |= GBREG->getPixel(0, h - 2) << 1;
821 line2 = GBREG->getPixel(1, h - 1);
822 line2 |= GBREG->getPixel(0, h - 1) << 1;
823 line3 = 0;
824 for(FX_DWORD w = 0; w < GBW; w++) {
825 if(USESKIP && SKIP->getPixel(w, h)) {
826 bVal = 0;
827 } else {
828 CONTEXT = line3;
829 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
830 CONTEXT |= line2 << 3;
831 CONTEXT |= line1 << 7;
832 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
833 }
834 if(bVal) {
835 GBREG->setPixel(w, h, bVal);
836 }
837 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
838 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;
839 line3 = ((line3 << 1) | bVal) & 0x03;
840 }
841 }
842 }
843 return GBREG;
844 }
845 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt(CJBig2_ArithDecoder *pA rithDecoder, JBig2ArithCtx *gbContext)
846 {
847 FX_BOOL LTP, SLTP, bVal;
848 FX_DWORD CONTEXT;
849 CJBig2_Image *GBREG;
850 FX_DWORD line1, line2;
851 LTP = 0;
852 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
853 GBREG->fill(0);
854 for(FX_DWORD h = 0; h < GBH; h++) {
855 if(TPGDON) {
856 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
857 LTP = LTP ^ SLTP;
858 }
859 if(LTP == 1) {
860 GBREG->copyLine(h, h - 1);
861 } else {
862 line1 = GBREG->getPixel(2, h - 1);
863 line1 |= GBREG->getPixel(1, h - 1) << 1;
864 line1 |= GBREG->getPixel(0, h - 1) << 2;
865 line2 = 0;
866 for(FX_DWORD w = 0; w < GBW; w++) {
867 if(USESKIP && SKIP->getPixel(w, h)) {
868 bVal = 0;
869 } else {
870 CONTEXT = line2;
871 CONTEXT |= line1 << 4;
872 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
873 }
874 if(bVal) {
875 GBREG->setPixel(w, h, bVal);
876 }
877 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f;
878 line2 = ((line2 << 1) | bVal) & 0x0f;
879 }
880 }
881 }
882 return GBREG;
883 }
884 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt2(CJBig2_ArithDecoder *p ArithDecoder, JBig2ArithCtx *gbContext)
885 {
886 FX_BOOL LTP, SLTP, bVal;
887 FX_DWORD CONTEXT;
888 CJBig2_Image *GBREG;
889 FX_DWORD line1;
890 uint8_t *pLine, cVal;
891 intptr_t nStride;
892 int32_t nBits, k;
893 LTP = 0;
894 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
895 if (GBREG->m_pData == NULL) {
896 delete GBREG;
897 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
898 return NULL;
899 }
900 pLine = GBREG->m_pData;
901 nStride = GBREG->m_nStride;
902 for(FX_DWORD h = 0; h < GBH; h++) {
903 if(TPGDON) {
904 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
905 LTP = LTP ^ SLTP;
906 }
907 if(LTP == 1) {
908 GBREG->copyLine(h, h - 1);
909 } else {
910 line1 = (h > 0) ? pLine[-nStride] : 0;
911 CONTEXT = (line1 >> 1) & 0x03f0;
912 for(FX_DWORD w = 0; w < GBW; w += 8) {
913 if(w + 8 < GBW) {
914 nBits = 8;
915 if(h > 0) {
916 line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]);
917 }
918 } else {
919 nBits = GBW - w;
920 if(h > 0) {
921 line1 <<= 8;
922 }
923 }
924 cVal = 0;
925 for(k = 0; k < nBits; k++) {
926 if(USESKIP && SKIP->getPixel(w, h)) {
927 bVal = 0;
928 } else {
929 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
930 }
931 cVal |= bVal << (7 - k);
932 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
933 | ((line1 >> (8 - k)) & 0x0010);
934 }
935 pLine[w >> 3] = cVal;
936 }
937 }
938 pLine += nStride;
939 }
940 return GBREG;
941 }
942 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_ArithDecoder *p ArithDecoder, JBig2ArithCtx *gbContext)
943 {
944 FX_BOOL LTP, SLTP, bVal;
945 FX_DWORD CONTEXT;
946 CJBig2_Image *GBREG;
947 FX_DWORD line1;
948 uint8_t *pLine, *pLine1, cVal;
949 int32_t nStride, k;
950 int32_t nLineBytes, nBitsLeft, cc;
951 LTP = 0;
952 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
953 if (GBREG->m_pData == NULL) {
954 delete GBREG;
955 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
956 return NULL;
957 }
958 pLine = GBREG->m_pData;
959 nStride = GBREG->m_nStride;
960 nLineBytes = ((GBW + 7) >> 3) - 1;
961 nBitsLeft = GBW - (nLineBytes << 3);
962 for(FX_DWORD h = 0; h < GBH; h++) {
963 if(TPGDON) {
964 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
965 LTP = LTP ^ SLTP;
966 }
967 if(LTP == 1) {
968 GBREG->copyLine(h, h - 1);
969 } else {
970 if(h > 0) {
971 pLine1 = pLine - nStride;
972 line1 = *pLine1++;
973 CONTEXT = (line1 >> 1) & 0x03f0;
974 for(cc = 0; cc < nLineBytes; cc++) {
975 line1 = (line1 << 8) | (*pLine1++);
976 cVal = 0;
977 for(k = 7; k >= 0; k--) {
978 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
979 cVal |= bVal << k;
980 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
981 | ((line1 >> (k + 1)) & 0x0010);
982 }
983 pLine[cc] = cVal;
984 }
985 line1 <<= 8;
986 cVal = 0;
987 for(k = 0; k < nBitsLeft; k++) {
988 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
989 cVal |= bVal << (7 - k);
990 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
991 | ((line1 >> (8 - k)) & 0x0010);
992 }
993 pLine[nLineBytes] = cVal;
994 } else {
995 CONTEXT = 0;
996 for(cc = 0; cc < nLineBytes; cc++) {
997 cVal = 0;
998 for(k = 7; k >= 0; k--) {
999 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1000 cVal |= bVal << k;
1001 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
1002 }
1003 pLine[cc] = cVal;
1004 }
1005 cVal = 0;
1006 for(k = 0; k < nBitsLeft; k++) {
1007 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1008 cVal |= bVal << (7 - k);
1009 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
1010 }
1011 pLine[nLineBytes] = cVal;
1012 }
1013 }
1014 pLine += nStride;
1015 }
1016 return GBREG;
1017 }
1018 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_ArithDecoder * pArithDecoder, JBig2ArithCtx *gbContext)
1019 {
1020 FX_BOOL LTP, SLTP, bVal;
1021 FX_DWORD CONTEXT;
1022 CJBig2_Image *GBREG;
1023 FX_DWORD line1, line2;
1024 LTP = 0;
1025 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
1026 GBREG->fill(0);
1027 for(FX_DWORD h = 0; h < GBH; h++) {
1028 if(TPGDON) {
1029 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
1030 LTP = LTP ^ SLTP;
1031 }
1032 if(LTP == 1) {
1033 GBREG->copyLine(h, h - 1);
1034 } else {
1035 line1 = GBREG->getPixel(1, h - 1);
1036 line1 |= GBREG->getPixel(0, h - 1) << 1;
1037 line2 = 0;
1038 for(FX_DWORD w = 0; w < GBW; w++) {
1039 if(USESKIP && SKIP->getPixel(w, h)) {
1040 bVal = 0;
1041 } else {
1042 CONTEXT = line2;
1043 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
1044 CONTEXT |= line1 << 5;
1045 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1046 }
1047 if(bVal) {
1048 GBREG->setPixel(w, h, bVal);
1049 }
1050 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;
1051 line2 = ((line2 << 1) | bVal) & 0x0f;
1052 }
1053 }
1054 }
1055 return GBREG;
1056 }
1057 CJBig2_Image *CJBig2_GRDProc::decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder , JBig2ArithCtx *gbContext)
1058 {
1059 FX_BOOL LTP, SLTP, bVal;
1060 FX_DWORD CONTEXT;
1061 CJBig2_Image *GBREG;
1062 FX_DWORD line1, line2, line3;
1063 LTP = 0;
1064 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
1065 GBREG->fill(0);
1066 for(FX_DWORD h = 0; h < GBH; h++) {
1067 if(TPGDON) {
1068 switch(GBTEMPLATE) {
1069 case 0:
1070 CONTEXT = 0x9b25;
1071 break;
1072 case 1:
1073 CONTEXT = 0x0795;
1074 break;
1075 case 2:
1076 CONTEXT = 0x00e5;
1077 break;
1078 case 3:
1079 CONTEXT = 0x0195;
1080 break;
1081 }
1082 SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1083 LTP = LTP ^ SLTP;
1084 }
1085 if(LTP == 1) {
1086 GBREG->copyLine(h, h - 1);
1087 } else {
1088 switch(GBTEMPLATE) {
1089 case 0: {
1090 line1 = GBREG->getPixel(1, h - 2);
1091 line1 |= GBREG->getPixel(0, h - 2) << 1;
1092 line2 = GBREG->getPixel(2, h - 1);
1093 line2 |= GBREG->getPixel(1, h - 1) << 1;
1094 line2 |= GBREG->getPixel(0, h - 1) << 2;
1095 line3 = 0;
1096 for(FX_DWORD w = 0; w < GBW; w++) {
1097 if(USESKIP && SKIP->getPixel(w, h)) {
1098 bVal = 0;
1099 } else {
1100 CONTEXT = line3;
1101 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT [1]) << 4;
1102 CONTEXT |= line2 << 5;
1103 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT [3]) << 10;
1104 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT [5]) << 11;
1105 CONTEXT |= line1 << 12;
1106 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT [7]) << 15;
1107 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT] );
1108 }
1109 if(bVal) {
1110 GBREG->setPixel(w, h, bVal);
1111 }
1112 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2 )) & 0x07;
1113 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1 )) & 0x1f;
1114 line3 = ((line3 << 1) | bVal) & 0x0f;
1115 }
1116 }
1117 break;
1118 case 1: {
1119 line1 = GBREG->getPixel(2, h - 2);
1120 line1 |= GBREG->getPixel(1, h - 2) << 1;
1121 line1 |= GBREG->getPixel(0, h - 2) << 2;
1122 line2 = GBREG->getPixel(2, h - 1);
1123 line2 |= GBREG->getPixel(1, h - 1) << 1;
1124 line2 |= GBREG->getPixel(0, h - 1) << 2;
1125 line3 = 0;
1126 for(FX_DWORD w = 0; w < GBW; w++) {
1127 if(USESKIP && SKIP->getPixel(w, h)) {
1128 bVal = 0;
1129 } else {
1130 CONTEXT = line3;
1131 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT [1]) << 3;
1132 CONTEXT |= line2 << 4;
1133 CONTEXT |= line1 << 9;
1134 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT] );
1135 }
1136 if(bVal) {
1137 GBREG->setPixel(w, h, bVal);
1138 }
1139 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2 )) & 0x0f;
1140 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1 )) & 0x1f;
1141 line3 = ((line3 << 1) | bVal) & 0x07;
1142 }
1143 }
1144 break;
1145 case 2: {
1146 line1 = GBREG->getPixel(1, h - 2);
1147 line1 |= GBREG->getPixel(0, h - 2) << 1;
1148 line2 = GBREG->getPixel(1, h - 1);
1149 line2 |= GBREG->getPixel(0, h - 1) << 1;
1150 line3 = 0;
1151 for(FX_DWORD w = 0; w < GBW; w++) {
1152 if(USESKIP && SKIP->getPixel(w, h)) {
1153 bVal = 0;
1154 } else {
1155 CONTEXT = line3;
1156 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT [1]) << 2;
1157 CONTEXT |= line2 << 3;
1158 CONTEXT |= line1 << 7;
1159 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT] );
1160 }
1161 if(bVal) {
1162 GBREG->setPixel(w, h, bVal);
1163 }
1164 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2 )) & 0x07;
1165 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1 )) & 0x0f;
1166 line3 = ((line3 << 1) | bVal) & 0x03;
1167 }
1168 }
1169 break;
1170 case 3: {
1171 line1 = GBREG->getPixel(1, h - 1);
1172 line1 |= GBREG->getPixel(0, h - 1) << 1;
1173 line2 = 0;
1174 for(FX_DWORD w = 0; w < GBW; w++) {
1175 if(USESKIP && SKIP->getPixel(w, h)) {
1176 bVal = 0;
1177 } else {
1178 CONTEXT = line2;
1179 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT [1]) << 4;
1180 CONTEXT |= line1 << 5;
1181 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT] );
1182 }
1183 if(bVal) {
1184 GBREG->setPixel(w, h, bVal);
1185 }
1186 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1 )) & 0x1f;
1187 line2 = ((line2 << 1) | bVal) & 0x0f;
1188 }
1189 }
1190 break;
1191 }
1192 }
1193 }
1194 return GBREG;
1195 }
1196 CJBig2_Image *CJBig2_GRDProc::decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder , JBig2ArithCtx *gbContext)
1197 {
1198 FX_BOOL LTP, SLTP, bVal;
1199 FX_DWORD CONTEXT = 0;
1200 CJBig2_Image *GBREG;
1201 LTP = 0;
1202 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
1203 GBREG->fill(0);
1204 for(FX_DWORD h = 0; h < GBH; h++) {
1205 if(TPGDON) {
1206 switch(GBTEMPLATE) {
1207 case 0:
1208 CONTEXT = 0x9b25;
1209 break;
1210 case 1:
1211 CONTEXT = 0x0795;
1212 break;
1213 case 2:
1214 CONTEXT = 0x00e5;
1215 break;
1216 case 3:
1217 CONTEXT = 0x0195;
1218 break;
1219 }
1220 SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1221 LTP = LTP ^ SLTP;
1222 }
1223 if(LTP == 1) {
1224 for(FX_DWORD w = 0; w < GBW; w++) {
1225 GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1));
1226 }
1227 } else {
1228 for(FX_DWORD w = 0; w < GBW; w++) {
1229 if(USESKIP && SKIP->getPixel(w, h)) {
1230 GBREG->setPixel(w, h, 0);
1231 } else {
1232 CONTEXT = 0;
1233 switch(GBTEMPLATE) {
1234 case 0:
1235 CONTEXT |= GBREG->getPixel(w - 1, h);
1236 CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
1237 CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
1238 CONTEXT |= GBREG->getPixel(w - 4, h) << 3;
1239 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
1240 CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5;
1241 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6;
1242 CONTEXT |= GBREG->getPixel(w, h - 1) << 7;
1243 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8;
1244 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9;
1245 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
1246 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
1247 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12;
1248 CONTEXT |= GBREG->getPixel(w, h - 2) << 13;
1249 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14;
1250 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
1251 break;
1252 case 1:
1253 CONTEXT |= GBREG->getPixel(w - 1, h);
1254 CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
1255 CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
1256 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
1257 CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4;
1258 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;
1259 CONTEXT |= GBREG->getPixel(w, h - 1) << 6;
1260 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;
1261 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;
1262 CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9;
1263 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10;
1264 CONTEXT |= GBREG->getPixel(w, h - 2) << 11;
1265 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12;
1266 break;
1267 case 2:
1268 CONTEXT |= GBREG->getPixel(w - 1, h);
1269 CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
1270 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
1271 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3;
1272 CONTEXT |= GBREG->getPixel(w, h - 1) << 4;
1273 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5;
1274 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6;
1275 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7;
1276 CONTEXT |= GBREG->getPixel(w, h - 2) << 8;
1277 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9;
1278 break;
1279 case 3:
1280 CONTEXT |= GBREG->getPixel(w - 1, h);
1281 CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
1282 CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
1283 CONTEXT |= GBREG->getPixel(w - 4, h) << 3;
1284 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
1285 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;
1286 CONTEXT |= GBREG->getPixel(w, h - 1) << 6;
1287 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;
1288 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;
1289 CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9;
1290 break;
1291 }
1292 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
1293 GBREG->setPixel(w, h, bVal);
1294 }
1295 }
1296 }
1297 }
1298 return GBREG;
1299 }
1300 CJBig2_Image *CJBig2_GRDProc::decode_MMR(CJBig2_BitStream *pStream)
1301 {
1302 int bitpos, i;
1303 CJBig2_Image *pImage;
1304 JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));
1305 if (pImage->m_pData == NULL) {
1306 delete pImage;
1307 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
1308 return NULL;
1309 }
1310 bitpos = (int)pStream->getBitPos();
1311 _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, pI mage->m_pData, GBW, GBH, pImage->m_nStride);
1312 pStream->setBitPos(bitpos);
1313 for(i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) {
1314 pImage->m_pData[i] = ~pImage->m_pData[i];
1315 }
1316 return pImage;
1317 }
1318 CJBig2_Image *CJBig2_GRRDProc::decode(CJBig2_ArithDecoder *pArithDecoder, JBig2A rithCtx *grContext)
1319 {
1320 if (GRW == 0 || GRH == 0) {
1321 CJBig2_Image* pImage;
1322 JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH));
1323 return pImage;
1324 }
1325 if(GRTEMPLATE == 0) {
1326 if((GRAT[0] == (signed char) - 1) && (GRAT[1] == (signed char) - 1)
1327 && (GRAT[2] == (signed char) - 1) && (GRAT[3] == (signed char) - 1)
1328 && (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWid th)) {
1329 return decode_Template0_opt(pArithDecoder, grContext);
1330 } else {
1331 return decode_Template0_unopt(pArithDecoder, grContext);
1332 }
1333 } else {
1334 if((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
1335 return decode_Template1_opt(pArithDecoder, grContext);
1336 } else {
1337 return decode_Template1_unopt(pArithDecoder, grContext);
1338 }
1339 }
1340 }
1341 CJBig2_Image *CJBig2_GRRDProc::decode_Template0_unopt(CJBig2_ArithDecoder *pArit hDecoder, JBig2ArithCtx *grContext)
1342 {
1343 FX_BOOL LTP, SLTP, bVal;
1344 FX_DWORD CONTEXT;
1345 CJBig2_Image *GRREG;
1346 FX_DWORD line1, line2, line3, line4, line5;
1347 LTP = 0;
1348 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
1349 GRREG->fill(0);
1350 for(FX_DWORD h = 0; h < GRH; h++) {
1351 if(TPGRON) {
1352 SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
1353 LTP = LTP ^ SLTP;
1354 }
1355 if(LTP == 0) {
1356 line1 = GRREG->getPixel(1, h - 1);
1357 line1 |= GRREG->getPixel(0, h - 1) << 1;
1358 line2 = 0;
1359 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);
1360 line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1 ) << 1;
1361 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY) ;
1362 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
1363 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY ) << 2;
1364 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1365 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1 ) << 1;
1366 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
1367 for(FX_DWORD w = 0; w < GRW; w++) {
1368 CONTEXT = line5;
1369 CONTEXT |= line4 << 3;
1370 CONTEXT |= line3 << 6;
1371 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
1372 CONTEXT |= line2 << 9;
1373 CONTEXT |= line1 << 10;
1374 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
1375 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1376 GRREG->setPixel(w, h, bVal);
1377 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;
1378 line2 = ((line2 << 1) | bVal) & 0x01;
1379 line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;
1380 line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
1381 line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;
1382 }
1383 } else {
1384 line1 = GRREG->getPixel(1, h - 1);
1385 line1 |= GRREG->getPixel(0, h - 1) << 1;
1386 line2 = 0;
1387 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);
1388 line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1 ) << 1;
1389 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY) ;
1390 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
1391 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY ) << 2;
1392 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1393 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1 ) << 1;
1394 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
1395 for(FX_DWORD w = 0; w < GRW; w++) {
1396 bVal = GRREFERENCE->getPixel(w, h);
1397 if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
1398 && (bVal == GRREFERENCE->getPixel(w, h - 1))
1399 && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
1400 && (bVal == GRREFERENCE->getPixel(w - 1, h))
1401 && (bVal == GRREFERENCE->getPixel(w + 1, h))
1402 && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
1403 && (bVal == GRREFERENCE->getPixel(w, h + 1))
1404 && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {
1405 CONTEXT = line5;
1406 CONTEXT |= line4 << 3;
1407 CONTEXT |= line3 << 6;
1408 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2] , h - GRREFERENCEDY + GRAT[3]) << 8;
1409 CONTEXT |= line2 << 9;
1410 CONTEXT |= line1 << 10;
1411 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
1412 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1413 }
1414 GRREG->setPixel(w, h, bVal);
1415 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;
1416 line2 = ((line2 << 1) | bVal) & 0x01;
1417 line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;
1418 line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
1419 line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;
1420 }
1421 }
1422 }
1423 return GRREG;
1424 }
1425 CJBig2_Image *CJBig2_GRRDProc::decode_Template0_opt(CJBig2_ArithDecoder *pArithD ecoder, JBig2ArithCtx *grContext)
1426 {
1427 FX_BOOL LTP, SLTP, bVal;
1428 FX_DWORD CONTEXT;
1429 CJBig2_Image *GRREG;
1430 FX_DWORD line1, line1_r, line2_r, line3_r;
1431 uint8_t *pLine, *pLineR, cVal;
1432 intptr_t nStride, nStrideR, nOffset;
1433 int32_t k, nBits;
1434 int32_t GRWR, GRHR;
1435 int32_t GRW, GRH;
1436 GRW = (int32_t)CJBig2_GRRDProc::GRW;
1437 GRH = (int32_t)CJBig2_GRRDProc::GRH;
1438 LTP = 0;
1439 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
1440 if (GRREG->m_pData == NULL) {
1441 delete GRREG;
1442 m_pModule->JBig2_Error("Generic refinement region decoding procedure: Cr eate Image Failed with width = %d, height = %d\n", GRW, GRH);
1443 return NULL;
1444 }
1445 pLine = GRREG->m_pData;
1446 pLineR = GRREFERENCE->m_pData;
1447 nStride = GRREG->m_nStride;
1448 nStrideR = GRREFERENCE->m_nStride;
1449 GRWR = (int32_t)GRREFERENCE->m_nWidth;
1450 GRHR = (int32_t)GRREFERENCE->m_nHeight;
1451 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
1452 GRREFERENCEDY = 0;
1453 }
1454 nOffset = -GRREFERENCEDY * nStrideR;
1455 for (int32_t h = 0; h < GRH; h++) {
1456 if(TPGRON) {
1457 SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
1458 LTP = LTP ^ SLTP;
1459 }
1460 line1 = (h > 0) ? pLine[-nStride] << 4 : 0;
1461 int32_t reference_h = h - GRREFERENCEDY;
1462 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
1463 FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
1464 FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);
1465 line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;
1466 line2_r = line2_r_ok ? pLineR[nOffset] : 0;
1467 line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;
1468 if(LTP == 0) {
1469 CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)
1470 | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);
1471 for (int32_t w = 0; w < GRW; w += 8) {
1472 nBits = GRW - w > 8 ? 8 : GRW - w;
1473 if (h > 0)
1474 line1 = (line1 << 8) |
1475 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);
1476 if (h > GRHR + GRREFERENCEDY + 1) {
1477 line1_r = 0;
1478 line2_r = 0;
1479 line3_r = 0;
1480 } else {
1481 if(line1_r_ok)
1482 line1_r = (line1_r << 8) |
1483 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
1484 if(line2_r_ok)
1485 line2_r = (line2_r << 8) |
1486 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
1487 if(line3_r_ok)
1488 line3_r = (line3_r << 8) |
1489 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
1490 else {
1491 line3_r = 0;
1492 }
1493 }
1494 cVal = 0;
1495 for (k = 0; k < nBits; k++) {
1496 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1497 cVal |= bVal << (7 - k);
1498 CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |
1499 ((line1 >> (7 - k)) & 0x0400) |
1500 ((line1_r >> (7 - k)) & 0x0040) |
1501 ((line2_r >> (10 - k)) & 0x0008) |
1502 ((line3_r >> (13 - k)) & 0x0001);
1503 }
1504 pLine[w >> 3] = cVal;
1505 }
1506 } else {
1507 CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)
1508 | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);
1509 for (int32_t w = 0; w < GRW; w += 8) {
1510 nBits = GRW - w > 8 ? 8 : GRW - w;
1511 if (h > 0)
1512 line1 = (line1 << 8) |
1513 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);
1514 if(line1_r_ok)
1515 line1_r = (line1_r << 8) |
1516 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
1517 if(line2_r_ok)
1518 line2_r = (line2_r << 8) |
1519 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0 );
1520 if(line3_r_ok)
1521 line3_r = (line3_r << 8) |
1522 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
1523 else {
1524 line3_r = 0;
1525 }
1526 cVal = 0;
1527 for (k = 0; k < nBits; k++) {
1528 bVal = GRREFERENCE->getPixel(w + k, h);
1529 if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))
1530 && (bVal == GRREFERENCE->getPixel(w + k, h - 1))
1531 && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))
1532 && (bVal == GRREFERENCE->getPixel(w + k - 1, h))
1533 && (bVal == GRREFERENCE->getPixel(w + k + 1, h))
1534 && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))
1535 && (bVal == GRREFERENCE->getPixel(w + k, h + 1))
1536 && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)) )) {
1537 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1538 }
1539 cVal |= bVal << (7 - k);
1540 CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |
1541 ((line1 >> (7 - k)) & 0x0400) |
1542 ((line1_r >> (7 - k)) & 0x0040) |
1543 ((line2_r >> (10 - k)) & 0x0008) |
1544 ((line3_r >> (13 - k)) & 0x0001);
1545 }
1546 pLine[w >> 3] = cVal;
1547 }
1548 }
1549 pLine += nStride;
1550 if (h < GRHR + GRREFERENCEDY) {
1551 pLineR += nStrideR;
1552 }
1553 }
1554 return GRREG;
1555 }
1556 CJBig2_Image *CJBig2_GRRDProc::decode_Template1_unopt(CJBig2_ArithDecoder *pArit hDecoder, JBig2ArithCtx *grContext)
1557 {
1558 FX_BOOL LTP, SLTP, bVal;
1559 FX_DWORD CONTEXT;
1560 CJBig2_Image *GRREG;
1561 FX_DWORD line1, line2, line3, line4, line5;
1562 LTP = 0;
1563 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
1564 GRREG->fill(0);
1565 for(FX_DWORD h = 0; h < GRH; h++) {
1566 if(TPGRON) {
1567 SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
1568 LTP = LTP ^ SLTP;
1569 }
1570 if(LTP == 0) {
1571 line1 = GRREG->getPixel(1, h - 1);
1572 line1 |= GRREG->getPixel(0, h - 1) << 1;
1573 line1 |= GRREG->getPixel(-1, h - 1) << 2;
1574 line2 = 0;
1575 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) ;
1576 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY) ;
1577 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
1578 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY ) << 2;
1579 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1580 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1 ) << 1;
1581 for(FX_DWORD w = 0; w < GRW; w++) {
1582 CONTEXT = line5;
1583 CONTEXT |= line4 << 2;
1584 CONTEXT |= line3 << 5;
1585 CONTEXT |= line2 << 6;
1586 CONTEXT |= line1 << 7;
1587 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1588 GRREG->setPixel(w, h, bVal);
1589 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;
1590 line2 = ((line2 << 1) | bVal) & 0x01;
1591 line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;
1592 line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
1593 line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;
1594 }
1595 } else {
1596 line1 = GRREG->getPixel(1, h - 1);
1597 line1 |= GRREG->getPixel(0, h - 1) << 1;
1598 line1 |= GRREG->getPixel(-1, h - 1) << 2;
1599 line2 = 0;
1600 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) ;
1601 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY) ;
1602 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
1603 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY ) << 2;
1604 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1605 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1 ) << 1;
1606 for(FX_DWORD w = 0; w < GRW; w++) {
1607 bVal = GRREFERENCE->getPixel(w, h);
1608 if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
1609 && (bVal == GRREFERENCE->getPixel(w, h - 1))
1610 && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
1611 && (bVal == GRREFERENCE->getPixel(w - 1, h))
1612 && (bVal == GRREFERENCE->getPixel(w + 1, h))
1613 && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
1614 && (bVal == GRREFERENCE->getPixel(w, h + 1))
1615 && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {
1616 CONTEXT = line5;
1617 CONTEXT |= line4 << 2;
1618 CONTEXT |= line3 << 5;
1619 CONTEXT |= line2 << 6;
1620 CONTEXT |= line1 << 7;
1621 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1622 }
1623 GRREG->setPixel(w, h, bVal);
1624 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;
1625 line2 = ((line2 << 1) | bVal) & 0x01;
1626 line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;
1627 line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
1628 line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;
1629 }
1630 }
1631 }
1632 return GRREG;
1633 }
1634 CJBig2_Image *CJBig2_GRRDProc::decode_Template1_opt(CJBig2_ArithDecoder *pArithD ecoder, JBig2ArithCtx *grContext)
1635 {
1636 FX_BOOL LTP, SLTP, bVal;
1637 FX_DWORD CONTEXT;
1638 CJBig2_Image *GRREG;
1639 FX_DWORD line1, line1_r, line2_r, line3_r;
1640 uint8_t *pLine, *pLineR, cVal;
1641 intptr_t nStride, nStrideR, nOffset;
1642 int32_t k, nBits;
1643 int32_t GRWR, GRHR;
1644 int32_t GRW, GRH;
1645 GRW = (int32_t)CJBig2_GRRDProc::GRW;
1646 GRH = (int32_t)CJBig2_GRRDProc::GRH;
1647 LTP = 0;
1648 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
1649 if (GRREG->m_pData == NULL) {
1650 delete GRREG;
1651 m_pModule->JBig2_Error("Generic refinement region decoding procedure: Cr eate Image Failed with width = %d, height = %d\n", GRW, GRH);
1652 return NULL;
1653 }
1654 pLine = GRREG->m_pData;
1655 pLineR = GRREFERENCE->m_pData;
1656 nStride = GRREG->m_nStride;
1657 nStrideR = GRREFERENCE->m_nStride;
1658 GRWR = (int32_t)GRREFERENCE->m_nWidth;
1659 GRHR = (int32_t)GRREFERENCE->m_nHeight;
1660 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
1661 GRREFERENCEDY = 0;
1662 }
1663 nOffset = -GRREFERENCEDY * nStrideR;
1664 for (int32_t h = 0; h < GRH; h++) {
1665 if(TPGRON) {
1666 SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
1667 LTP = LTP ^ SLTP;
1668 }
1669 line1 = (h > 0) ? pLine[-nStride] << 1 : 0;
1670 int32_t reference_h = h - GRREFERENCEDY;
1671 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
1672 FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
1673 FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);
1674 line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;
1675 line2_r = line2_r_ok ? pLineR[nOffset] : 0;
1676 line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;
1677 if(LTP == 0) {
1678 CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)
1679 | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);
1680 for (int32_t w = 0; w < GRW; w += 8) {
1681 nBits = GRW - w > 8 ? 8 : GRW - w;
1682 if (h > 0)
1683 line1 = (line1 << 8) |
1684 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);
1685 if(line1_r_ok)
1686 line1_r = (line1_r << 8) |
1687 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
1688 if(line2_r_ok)
1689 line2_r = (line2_r << 8) |
1690 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0 );
1691 if(line3_r_ok)
1692 line3_r = (line3_r << 8) |
1693 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
1694 else {
1695 line3_r = 0;
1696 }
1697 cVal = 0;
1698 for (k = 0; k < nBits; k++) {
1699 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1700 cVal |= bVal << (7 - k);
1701 CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |
1702 ((line1 >> (7 - k)) & 0x0080) |
1703 ((line1_r >> (9 - k)) & 0x0020) |
1704 ((line2_r >> (11 - k)) & 0x0004) |
1705 ((line3_r >> (13 - k)) & 0x0001);
1706 }
1707 pLine[w >> 3] = cVal;
1708 }
1709 } else {
1710 CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)
1711 | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);
1712 for (int32_t w = 0; w < GRW; w += 8) {
1713 nBits = GRW - w > 8 ? 8 : GRW - w;
1714 if (h > 0)
1715 line1 = (line1 << 8) |
1716 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);
1717 if(line1_r_ok)
1718 line1_r = (line1_r << 8) |
1719 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
1720 if(line2_r_ok)
1721 line2_r = (line2_r << 8) |
1722 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0 );
1723 if(line3_r_ok)
1724 line3_r = (line3_r << 8) |
1725 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
1726 else {
1727 line3_r = 0;
1728 }
1729 cVal = 0;
1730 for (k = 0; k < nBits; k++) {
1731 bVal = GRREFERENCE->getPixel(w + k, h);
1732 if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))
1733 && (bVal == GRREFERENCE->getPixel(w + k, h - 1))
1734 && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))
1735 && (bVal == GRREFERENCE->getPixel(w + k - 1, h))
1736 && (bVal == GRREFERENCE->getPixel(w + k + 1, h))
1737 && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))
1738 && (bVal == GRREFERENCE->getPixel(w + k, h + 1))
1739 && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)) )) {
1740 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1741 }
1742 cVal |= bVal << (7 - k);
1743 CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |
1744 ((line1 >> (7 - k)) & 0x0080) |
1745 ((line1_r >> (9 - k)) & 0x0020) |
1746 ((line2_r >> (11 - k)) & 0x0004) |
1747 ((line3_r >> (13 - k)) & 0x0001);
1748 }
1749 pLine[w >> 3] = cVal;
1750 }
1751 }
1752 pLine += nStride;
1753 if (h < GRHR + GRREFERENCEDY) {
1754 pLineR += nStrideR;
1755 }
1756 }
1757 return GRREG;
1758 }
1759 CJBig2_Image *CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBi g2ArithCtx *grContext)
1760 {
1761 FX_BOOL LTP, SLTP, bVal;
1762 FX_BOOL TPGRPIX, TPGRVAL;
1763 FX_DWORD CONTEXT;
1764 CJBig2_Image *GRREG;
1765 LTP = 0;
1766 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
1767 GRREG->fill(0);
1768 for(FX_DWORD h = 0; h < GRH; h++) {
1769 if(TPGRON) {
1770 switch(GRTEMPLATE) {
1771 case 0:
1772 CONTEXT = 0x0010;
1773 break;
1774 case 1:
1775 CONTEXT = 0x0008;
1776 break;
1777 }
1778 SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]);
1779 LTP = LTP ^ SLTP;
1780 }
1781 if(LTP == 0) {
1782 for(FX_DWORD w = 0; w < GRW; w++) {
1783 CONTEXT = 0;
1784 switch(GRTEMPLATE) {
1785 case 0:
1786 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1787 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
1788 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
1789 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;
1790 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;
1791 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;
1792 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;
1793 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;
1794 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRA T[2], h - GRREFERENCEDY + GRAT[3]) << 8;
1795 CONTEXT |= GRREG->getPixel(w - 1, h) << 9;
1796 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;
1797 CONTEXT |= GRREG->getPixel(w, h - 1) << 11;
1798 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
1799 break;
1800 case 1:
1801 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1802 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
1803 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;
1804 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;
1805 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;
1806 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;
1807 CONTEXT |= GRREG->getPixel(w - 1, h) << 6;
1808 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;
1809 CONTEXT |= GRREG->getPixel(w, h - 1) << 8;
1810 CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;
1811 break;
1812 }
1813 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1814 GRREG->setPixel(w, h, bVal);
1815 }
1816 } else {
1817 for(FX_DWORD w = 0; w < GRW; w++) {
1818 bVal = GRREFERENCE->getPixel(w, h);
1819 if(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
1820 && (bVal == GRREFERENCE->getPixel(w, h - 1))
1821 && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
1822 && (bVal == GRREFERENCE->getPixel(w - 1, h))
1823 && (bVal == GRREFERENCE->getPixel(w + 1, h))
1824 && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
1825 && (bVal == GRREFERENCE->getPixel(w, h + 1))
1826 && (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) {
1827 TPGRPIX = 1;
1828 TPGRVAL = bVal;
1829 } else {
1830 TPGRPIX = 0;
1831 }
1832 if(TPGRPIX) {
1833 GRREG->setPixel(w, h, TPGRVAL);
1834 } else {
1835 CONTEXT = 0;
1836 switch(GRTEMPLATE) {
1837 case 0:
1838 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1839 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
1840 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
1841 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;
1842 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;
1843 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;
1844 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;
1845 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;
1846 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
1847 CONTEXT |= GRREG->getPixel(w - 1, h) << 9;
1848 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;
1849 CONTEXT |= GRREG->getPixel(w, h - 1) << 11;
1850 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
1851 break;
1852 case 1:
1853 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
1854 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
1855 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;
1856 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;
1857 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;
1858 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;
1859 CONTEXT |= GRREG->getPixel(w - 1, h) << 6;
1860 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;
1861 CONTEXT |= GRREG->getPixel(w, h - 1) << 8;
1862 CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;
1863 break;
1864 }
1865 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
1866 GRREG->setPixel(w, h, bVal);
1867 }
1868 }
1869 }
1870 }
1871 return GRREG;
1872 }
1873 CJBig2_Image *CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream *pStream, JBig2Ari thCtx *grContext)
1874 {
1875 int32_t STRIPT, FIRSTS;
1876 FX_DWORD NINSTANCES;
1877 int32_t DT, DFS, CURS;
1878 uint8_t CURT;
1879 int32_t SI, TI;
1880 FX_DWORD IDI;
1881 CJBig2_Image *IBI;
1882 FX_DWORD WI, HI;
1883 int32_t IDS;
1884 FX_BOOL RI;
1885 int32_t RDWI, RDHI, RDXI, RDYI;
1886 CJBig2_Image *IBOI;
1887 FX_DWORD WOI, HOI;
1888 CJBig2_Image *SBREG;
1889 FX_BOOL bFirst;
1890 FX_DWORD nTmp;
1891 int32_t nVal, nBits;
1892 CJBig2_HuffmanDecoder *pHuffmanDecoder;
1893 CJBig2_GRRDProc *pGRRD;
1894 CJBig2_ArithDecoder *pArithDecoder;
1895 JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));
1896 JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));
1897 SBREG->fill(SBDEFPIXEL);
1898 if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) {
1899 m_pModule->JBig2_Error("text region decoding procedure (huffman): too sh ort.");
1900 goto failed;
1901 }
1902 STRIPT *= SBSTRIPS;
1903 STRIPT = -STRIPT;
1904 FIRSTS = 0;
1905 NINSTANCES = 0;
1906 while(NINSTANCES < SBNUMINSTANCES) {
1907 if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) {
1908 m_pModule->JBig2_Error("text region decoding procedure (huffman): to o short.");
1909 goto failed;
1910 }
1911 DT *= SBSTRIPS;
1912 STRIPT = STRIPT + DT;
1913 bFirst = TRUE;
1914 for(;;) {
1915 if(bFirst) {
1916 if(pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) {
1917 m_pModule->JBig2_Error("text region decoding procedure (huff man): too short.");
1918 goto failed;
1919 }
1920 FIRSTS = FIRSTS + DFS;
1921 CURS = FIRSTS;
1922 bFirst = FALSE;
1923 } else {
1924 nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS);
1925 if(nVal == JBIG2_OOB) {
1926 break;
1927 } else if(nVal != 0) {
1928 m_pModule->JBig2_Error("text region decoding procedure (huff man): too short.");
1929 goto failed;
1930 } else {
1931 CURS = CURS + IDS + SBDSOFFSET;
1932 }
1933 }
1934 if(SBSTRIPS == 1) {
1935 CURT = 0;
1936 } else {
1937 nTmp = 1;
1938 while((FX_DWORD)(1 << nTmp) < SBSTRIPS) {
1939 nTmp ++;
1940 }
1941 if(pStream->readNBits(nTmp, &nVal) != 0) {
1942 m_pModule->JBig2_Error("text region decoding procedure (huff man): too short.");
1943 goto failed;
1944 }
1945 CURT = nVal;
1946 }
1947 TI = STRIPT + CURT;
1948 nVal = 0;
1949 nBits = 0;
1950 for(;;) {
1951 if(pStream->read1Bit(&nTmp) != 0) {
1952 m_pModule->JBig2_Error("text region decoding procedure (huff man): too short.");
1953 goto failed;
1954 }
1955 nVal = (nVal << 1) | nTmp;
1956 nBits ++;
1957 for(IDI = 0; IDI < SBNUMSYMS; IDI++) {
1958 if((nBits == SBSYMCODES[IDI].codelen) && (nVal == SBSYMCODES [IDI].code)) {
1959 break;
1960 }
1961 }
1962 if(IDI < SBNUMSYMS) {
1963 break;
1964 }
1965 }
1966 if(SBREFINE == 0) {
1967 RI = 0;
1968 } else {
1969 if(pStream->read1Bit(&RI) != 0) {
1970 m_pModule->JBig2_Error("text region decoding procedure (huff man): too short.");
1971 goto failed;
1972 }
1973 }
1974 if(RI == 0) {
1975 IBI = SBSYMS[IDI];
1976 } else {
1977 if((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0)
1978 || (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0 )
1979 || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0 )
1980 || (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0 )
1981 || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {
1982 m_pModule->JBig2_Error("text region decoding procedure (huff man): too short.");
1983 goto failed;
1984 }
1985 pStream->alignByte();
1986 nTmp = pStream->getOffset();
1987 IBOI = SBSYMS[IDI];
1988 if (!IBOI) {
1989 goto failed;
1990 }
1991 WOI = IBOI->m_nWidth;
1992 HOI = IBOI->m_nHeight;
1993 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
1994 m_pModule->JBig2_Error("text region decoding procedure (huff man): Invalid RDWI or RDHI value.");
1995 goto failed;
1996 }
1997 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
1998 pGRRD->GRW = WOI + RDWI;
1999 pGRRD->GRH = HOI + RDHI;
2000 pGRRD->GRTEMPLATE = SBRTEMPLATE;
2001 pGRRD->GRREFERENCE = IBOI;
2002 pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI;
2003 pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI;
2004 pGRRD->TPGRON = 0;
2005 pGRRD->GRAT[0] = SBRAT[0];
2006 pGRRD->GRAT[1] = SBRAT[1];
2007 pGRRD->GRAT[2] = SBRAT[2];
2008 pGRRD->GRAT[3] = SBRAT[3];
2009 JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));
2010 IBI = pGRRD->decode(pArithDecoder, grContext);
2011 if(IBI == NULL) {
2012 delete pGRRD;
2013 delete pArithDecoder;
2014 goto failed;
2015 }
2016 delete pArithDecoder;
2017 pStream->alignByte();
2018 pStream->offset(2);
2019 if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
2020 delete IBI;
2021 delete pGRRD;
2022 m_pModule->JBig2_Error("text region decoding procedure (huff man):"
2023 "bytes processed by generic refinemen t region decoding procedure doesn't equal SBHUFFRSIZE.");
2024 goto failed;
2025 }
2026 delete pGRRD;
2027 }
2028 if (!IBI) {
2029 continue;
2030 }
2031 WI = IBI->m_nWidth;
2032 HI = IBI->m_nHeight;
2033 if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)
2034 || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
2035 CURS = CURS + WI - 1;
2036 } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)
2037 || (REFCORNER == JBIG2_CORNER_BOTTOMRI GHT))) {
2038 CURS = CURS + HI - 1;
2039 }
2040 SI = CURS;
2041 if(TRANSPOSED == 0) {
2042 switch(REFCORNER) {
2043 case JBIG2_CORNER_TOPLEFT:
2044 SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);
2045 break;
2046 case JBIG2_CORNER_TOPRIGHT:
2047 SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);
2048 break;
2049 case JBIG2_CORNER_BOTTOMLEFT:
2050 SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);
2051 break;
2052 case JBIG2_CORNER_BOTTOMRIGHT:
2053 SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMB OP);
2054 break;
2055 }
2056 } else {
2057 switch(REFCORNER) {
2058 case JBIG2_CORNER_TOPLEFT:
2059 SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);
2060 break;
2061 case JBIG2_CORNER_TOPRIGHT:
2062 SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);
2063 break;
2064 case JBIG2_CORNER_BOTTOMLEFT:
2065 SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);
2066 break;
2067 case JBIG2_CORNER_BOTTOMRIGHT:
2068 SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMB OP);
2069 break;
2070 }
2071 }
2072 if(RI != 0) {
2073 delete IBI;
2074 }
2075 if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
2076 || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
2077 CURS = CURS + WI - 1;
2078 } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
2079 || (REFCORNER == JBIG2_CORNER_TOPRIGHT ))) {
2080 CURS = CURS + HI - 1;
2081 }
2082 NINSTANCES = NINSTANCES + 1;
2083 }
2084 }
2085 delete pHuffmanDecoder;
2086 return SBREG;
2087 failed: 2232 failed:
2088 delete pHuffmanDecoder; 2233 delete pHuffmanDecoder;
2089 delete SBREG; 2234 delete SBREG;
2090 return NULL; 2235 return NULL;
2091 } 2236 }
2092 CJBig2_Image *CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, J Big2ArithCtx *grContext, 2237 CJBig2_Image* CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
2093 JBig2IntDecoderState *pIDS) 2238 JBig2ArithCtx* grContext,
2094 { 2239 JBig2IntDecoderState* pIDS) {
2095 int32_t STRIPT, FIRSTS; 2240 int32_t STRIPT, FIRSTS;
2096 FX_DWORD NINSTANCES; 2241 FX_DWORD NINSTANCES;
2097 int32_t DT, DFS, CURS; 2242 int32_t DT, DFS, CURS;
2098 int32_t CURT; 2243 int32_t CURT;
2099 int32_t SI, TI; 2244 int32_t SI, TI;
2100 FX_DWORD IDI; 2245 FX_DWORD IDI;
2101 CJBig2_Image *IBI; 2246 CJBig2_Image* IBI;
2102 FX_DWORD WI, HI; 2247 FX_DWORD WI, HI;
2103 int32_t IDS; 2248 int32_t IDS;
2104 int RI; 2249 int RI;
2105 int32_t RDWI, RDHI, RDXI, RDYI; 2250 int32_t RDWI, RDHI, RDXI, RDYI;
2106 CJBig2_Image *IBOI; 2251 CJBig2_Image* IBOI;
2107 FX_DWORD WOI, HOI; 2252 FX_DWORD WOI, HOI;
2108 CJBig2_Image *SBREG; 2253 CJBig2_Image* SBREG;
2109 FX_BOOL bFirst; 2254 FX_BOOL bFirst;
2110 int32_t nRet, nVal; 2255 int32_t nRet, nVal;
2111 int32_t bRetained; 2256 int32_t bRetained;
2112 CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, *I ARDX, *IARDY; 2257 CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH,
2113 CJBig2_ArithIaidDecoder *IAID; 2258 *IARDX, *IARDY;
2114 CJBig2_GRRDProc *pGRRD; 2259 CJBig2_ArithIaidDecoder* IAID;
2115 if(pIDS) { 2260 CJBig2_GRRDProc* pGRRD;
2116 IADT = pIDS->IADT; 2261 if (pIDS) {
2117 IAFS = pIDS->IAFS; 2262 IADT = pIDS->IADT;
2118 IADS = pIDS->IADS; 2263 IAFS = pIDS->IAFS;
2119 IAIT = pIDS->IAIT; 2264 IADS = pIDS->IADS;
2120 IARI = pIDS->IARI; 2265 IAIT = pIDS->IAIT;
2121 IARDW = pIDS->IARDW; 2266 IARI = pIDS->IARI;
2122 IARDH = pIDS->IARDH; 2267 IARDW = pIDS->IARDW;
2123 IARDX = pIDS->IARDX; 2268 IARDH = pIDS->IARDH;
2124 IARDY = pIDS->IARDY; 2269 IARDX = pIDS->IARDX;
2125 IAID = pIDS->IAID; 2270 IARDY = pIDS->IARDY;
2126 bRetained = TRUE; 2271 IAID = pIDS->IAID;
2127 } else { 2272 bRetained = TRUE;
2128 JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder()); 2273 } else {
2129 JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());
2130 JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());
2131 JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());
2132 JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());
2133 JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());
2134 JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());
2135 JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());
2136 JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());
2137 JBIG2_ALLOC(IAID , CJBig2_ArithIaidDecoder(SBSYMCODELEN));
2138 bRetained = FALSE;
2139 }
2140 JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));
2141 SBREG->fill(SBDEFPIXEL);
2142 if(IADT->decode(pArithDecoder, &STRIPT) == -1) {
2143 m_pModule->JBig2_Error("text region decoding procedure (arith): too shor t.");
2144 goto failed;
2145 }
2146 STRIPT *= SBSTRIPS;
2147 STRIPT = -STRIPT;
2148 FIRSTS = 0;
2149 NINSTANCES = 0;
2150 while(NINSTANCES < SBNUMINSTANCES) {
2151 if(IADT->decode(pArithDecoder, &DT) == -1) {
2152 m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
2153 goto failed;
2154 }
2155 DT *= SBSTRIPS;
2156 STRIPT = STRIPT + DT;
2157 bFirst = TRUE;
2158 for(;;) {
2159 if(bFirst) {
2160 if(IAFS->decode(pArithDecoder, &DFS) == -1) {
2161 m_pModule->JBig2_Error("text region decoding procedure (arit h): too short.");
2162 goto failed;
2163 }
2164 FIRSTS = FIRSTS + DFS;
2165 CURS = FIRSTS;
2166 bFirst = FALSE;
2167 } else {
2168 nRet = IADS->decode(pArithDecoder, &IDS);
2169 if(nRet == JBIG2_OOB) {
2170 break;
2171 } else if(nRet != 0) {
2172 m_pModule->JBig2_Error("text region decoding procedure (arit h): too short.");
2173 goto failed;
2174 } else {
2175 CURS = CURS + IDS + SBDSOFFSET;
2176 }
2177 }
2178 if (NINSTANCES >= SBNUMINSTANCES) {
2179 break;
2180 }
2181 if(SBSTRIPS == 1) {
2182 CURT = 0;
2183 } else {
2184 if(IAIT->decode(pArithDecoder, &nVal) == -1) {
2185 m_pModule->JBig2_Error("text region decoding procedure (arit h): too short.");
2186 goto failed;
2187 }
2188 CURT = nVal;
2189 }
2190 TI = STRIPT + CURT;
2191 if(IAID->decode(pArithDecoder, &nVal) == -1) {
2192 m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
2193 goto failed;
2194 }
2195 IDI = nVal;
2196 if(IDI >= SBNUMSYMS) {
2197 m_pModule->JBig2_Error("text region decoding procedure (arith): symbol id out of range.(%d/%d)",
2198 IDI, SBNUMSYMS);
2199 goto failed;
2200 }
2201 if(SBREFINE == 0) {
2202 RI = 0;
2203 } else {
2204 if(IARI->decode(pArithDecoder, &RI) == -1) {
2205 m_pModule->JBig2_Error("text region decoding procedure (arit h): too short.");
2206 goto failed;
2207 }
2208 }
2209 if (!SBSYMS[IDI]) {
2210 goto failed;
2211 }
2212 if(RI == 0) {
2213 IBI = SBSYMS[IDI];
2214 } else {
2215 if((IARDW->decode(pArithDecoder, &RDWI) == -1)
2216 || (IARDH->decode(pArithDecoder, &RDHI) == -1)
2217 || (IARDX->decode(pArithDecoder, &RDXI) == -1)
2218 || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
2219 m_pModule->JBig2_Error("text region decoding procedure (arit h): too short.");
2220 goto failed;
2221 }
2222 IBOI = SBSYMS[IDI];
2223 WOI = IBOI->m_nWidth;
2224 HOI = IBOI->m_nHeight;
2225 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
2226 m_pModule->JBig2_Error("text region decoding procedure (arit h): Invalid RDWI or RDHI value.");
2227 goto failed;
2228 }
2229 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
2230 pGRRD->GRW = WOI + RDWI;
2231 pGRRD->GRH = HOI + RDHI;
2232 pGRRD->GRTEMPLATE = SBRTEMPLATE;
2233 pGRRD->GRREFERENCE = IBOI;
2234 pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI;
2235 pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI;
2236 pGRRD->TPGRON = 0;
2237 pGRRD->GRAT[0] = SBRAT[0];
2238 pGRRD->GRAT[1] = SBRAT[1];
2239 pGRRD->GRAT[2] = SBRAT[2];
2240 pGRRD->GRAT[3] = SBRAT[3];
2241 IBI = pGRRD->decode(pArithDecoder, grContext);
2242 if(IBI == NULL) {
2243 delete pGRRD;
2244 goto failed;
2245 }
2246 delete pGRRD;
2247 }
2248 WI = IBI->m_nWidth;
2249 HI = IBI->m_nHeight;
2250 if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)
2251 || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
2252 CURS = CURS + WI - 1;
2253 } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)
2254 || (REFCORNER == JBIG2_CORNER_BOTTOMRI GHT))) {
2255 CURS = CURS + HI - 1;
2256 }
2257 SI = CURS;
2258 if(TRANSPOSED == 0) {
2259 switch(REFCORNER) {
2260 case JBIG2_CORNER_TOPLEFT:
2261 SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);
2262 break;
2263 case JBIG2_CORNER_TOPRIGHT:
2264 SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);
2265 break;
2266 case JBIG2_CORNER_BOTTOMLEFT:
2267 SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);
2268 break;
2269 case JBIG2_CORNER_BOTTOMRIGHT:
2270 SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMB OP);
2271 break;
2272 }
2273 } else {
2274 switch(REFCORNER) {
2275 case JBIG2_CORNER_TOPLEFT:
2276 SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);
2277 break;
2278 case JBIG2_CORNER_TOPRIGHT:
2279 SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);
2280 break;
2281 case JBIG2_CORNER_BOTTOMLEFT:
2282 SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);
2283 break;
2284 case JBIG2_CORNER_BOTTOMRIGHT:
2285 SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMB OP);
2286 break;
2287 }
2288 }
2289 if(RI != 0) {
2290 delete IBI;
2291 }
2292 if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
2293 || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
2294 CURS = CURS + WI - 1;
2295 } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
2296 || (REFCORNER == JBIG2_CORNER_TOPRIGHT ))) {
2297 CURS = CURS + HI - 1;
2298 }
2299 NINSTANCES = NINSTANCES + 1;
2300 }
2301 }
2302 if(bRetained == FALSE) {
2303 delete IADT;
2304 delete IAFS;
2305 delete IADS;
2306 delete IAIT;
2307 delete IARI;
2308 delete IARDW;
2309 delete IARDH;
2310 delete IARDX;
2311 delete IARDY;
2312 delete IAID;
2313 }
2314 return SBREG;
2315 failed:
2316 if(bRetained == FALSE) {
2317 delete IADT;
2318 delete IAFS;
2319 delete IADS;
2320 delete IAIT;
2321 delete IARI;
2322 delete IARDW;
2323 delete IARDH;
2324 delete IARDX;
2325 delete IARDY;
2326 delete IAID;
2327 }
2328 delete SBREG;
2329 return NULL;
2330 }
2331 CJBig2_SymbolDict *CJBig2_SDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecod er,
2332 JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext)
2333 {
2334 CJBig2_Image **SDNEWSYMS;
2335 FX_DWORD HCHEIGHT, NSYMSDECODED;
2336 int32_t HCDH;
2337 FX_DWORD SYMWIDTH, TOTWIDTH;
2338 int32_t DW;
2339 CJBig2_Image *BS;
2340 FX_DWORD I, J, REFAGGNINST;
2341 FX_BOOL *EXFLAGS;
2342 FX_DWORD EXINDEX;
2343 FX_BOOL CUREXFLAG;
2344 FX_DWORD EXRUNLENGTH;
2345 int32_t nVal;
2346 FX_DWORD nTmp;
2347 FX_DWORD SBNUMSYMS;
2348 uint8_t SBSYMCODELEN;
2349 FX_DWORD IDI;
2350 int32_t RDXI, RDYI;
2351 CJBig2_Image **SBSYMS;
2352 CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,
2353 *SBHUFFRSIZE;
2354 CJBig2_GRRDProc *pGRRD;
2355 CJBig2_GRDProc *pGRD;
2356 CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX,
2357 *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH;
2358 CJBig2_ArithIaidDecoder *IAID;
2359 CJBig2_SymbolDict *pDict;
2360 JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder());
2361 JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder());
2362 JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder());
2363 JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());
2364 JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());
2365 JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder());
2366 JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder()); 2274 JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());
2367 JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder()); 2275 JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());
2368 JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder()); 2276 JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());
2369 JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder()); 2277 JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());
2370 JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder()); 2278 JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());
2371 JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder()); 2279 JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());
2372 JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder()); 2280 JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());
2373 nTmp = 0; 2281 JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());
2374 while((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { 2282 JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());
2375 nTmp ++; 2283 JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder(SBSYMCODELEN));
2284 bRetained = FALSE;
2285 }
2286 JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));
2287 SBREG->fill(SBDEFPIXEL);
2288 if (IADT->decode(pArithDecoder, &STRIPT) == -1) {
2289 m_pModule->JBig2_Error(
2290 "text region decoding procedure (arith): too short.");
2291 goto failed;
2292 }
2293 STRIPT *= SBSTRIPS;
2294 STRIPT = -STRIPT;
2295 FIRSTS = 0;
2296 NINSTANCES = 0;
2297 while (NINSTANCES < SBNUMINSTANCES) {
2298 if (IADT->decode(pArithDecoder, &DT) == -1) {
2299 m_pModule->JBig2_Error(
2300 "text region decoding procedure (arith): too short.");
2301 goto failed;
2376 } 2302 }
2377 JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((uint8_t)nTmp)); 2303 DT *= SBSTRIPS;
2378 SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJ Big2_Image*)); 2304 STRIPT = STRIPT + DT;
2379 FXSYS_memset(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*)); 2305 bFirst = TRUE;
2380 HCHEIGHT = 0; 2306 for (;;) {
2381 NSYMSDECODED = 0; 2307 if (bFirst) {
2382 while(NSYMSDECODED < SDNUMNEWSYMS) { 2308 if (IAFS->decode(pArithDecoder, &DFS) == -1) {
2383 BS = NULL; 2309 m_pModule->JBig2_Error(
2384 if(IADH->decode(pArithDecoder, &HCDH) == -1) { 2310 "text region decoding procedure (arith): too short.");
2385 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith) : too short."); 2311 goto failed;
2386 goto failed;
2387 } 2312 }
2388 HCHEIGHT = HCHEIGHT + HCDH; 2313 FIRSTS = FIRSTS + DFS;
2389 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { 2314 CURS = FIRSTS;
2390 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith) : invalid HCHEIGHT value."); 2315 bFirst = FALSE;
2391 goto failed; 2316 } else {
2317 nRet = IADS->decode(pArithDecoder, &IDS);
2318 if (nRet == JBIG2_OOB) {
2319 break;
2320 } else if (nRet != 0) {
2321 m_pModule->JBig2_Error(
2322 "text region decoding procedure (arith): too short.");
2323 goto failed;
2324 } else {
2325 CURS = CURS + IDS + SBDSOFFSET;
2392 } 2326 }
2393 SYMWIDTH = 0; 2327 }
2394 TOTWIDTH = 0; 2328 if (NINSTANCES >= SBNUMINSTANCES) {
2395 for(;;) { 2329 break;
2396 nVal = IADW->decode(pArithDecoder, &DW); 2330 }
2397 if(nVal == JBIG2_OOB) { 2331 if (SBSTRIPS == 1) {
2398 break; 2332 CURT = 0;
2399 } else if(nVal != 0) { 2333 } else {
2400 m_pModule->JBig2_Error("symbol dictionary decoding procedure (ar ith): too short."); 2334 if (IAIT->decode(pArithDecoder, &nVal) == -1) {
2401 goto failed; 2335 m_pModule->JBig2_Error(
2402 } else { 2336 "text region decoding procedure (arith): too short.");
2403 if (NSYMSDECODED >= SDNUMNEWSYMS) { 2337 goto failed;
2404 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): NSYMSDECODED >= SDNUMNEWSYMS.");
2405 goto failed;
2406 }
2407 SYMWIDTH = SYMWIDTH + DW;
2408 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
2409 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid SYMWIDTH value.");
2410 goto failed;
2411 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
2412 TOTWIDTH = TOTWIDTH + SYMWIDTH;
2413 SDNEWSYMS[NSYMSDECODED] = NULL;
2414 NSYMSDECODED = NSYMSDECODED + 1;
2415 continue;
2416 }
2417 TOTWIDTH = TOTWIDTH + SYMWIDTH;
2418 }
2419 if(SDREFAGG == 0) {
2420 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
2421 pGRD->MMR = 0;
2422 pGRD->GBW = SYMWIDTH;
2423 pGRD->GBH = HCHEIGHT;
2424 pGRD->GBTEMPLATE = SDTEMPLATE;
2425 pGRD->TPGDON = 0;
2426 pGRD->USESKIP = 0;
2427 pGRD->GBAT[0] = SDAT[0];
2428 pGRD->GBAT[1] = SDAT[1];
2429 pGRD->GBAT[2] = SDAT[2];
2430 pGRD->GBAT[3] = SDAT[3];
2431 pGRD->GBAT[4] = SDAT[4];
2432 pGRD->GBAT[5] = SDAT[5];
2433 pGRD->GBAT[6] = SDAT[6];
2434 pGRD->GBAT[7] = SDAT[7];
2435 BS = pGRD->decode_Arith(pArithDecoder, gbContext);
2436 if(BS == NULL) {
2437 delete pGRD;
2438 goto failed;
2439 }
2440 delete pGRD;
2441 } else {
2442 if(IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) {
2443 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
2444 goto failed;
2445 }
2446 if(REFAGGNINST > 1) {
2447 CJBig2_TRDProc *pDecoder;
2448 JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());
2449 pDecoder->SBHUFF = SDHUFF;
2450 pDecoder->SBREFINE = 1;
2451 pDecoder->SBW = SYMWIDTH;
2452 pDecoder->SBH = HCHEIGHT;
2453 pDecoder->SBNUMINSTANCES = REFAGGNINST;
2454 pDecoder->SBSTRIPS = 1;
2455 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
2456 SBNUMSYMS = pDecoder->SBNUMSYMS;
2457 nTmp = 0;
2458 while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
2459 nTmp ++;
2460 }
2461 SBSYMCODELEN = (uint8_t)nTmp;
2462 pDecoder->SBSYMCODELEN = SBSYMCODELEN;
2463 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
2464 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_I mage*));
2465 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
2466 pDecoder->SBSYMS = SBSYMS;
2467 pDecoder->SBDEFPIXEL = 0;
2468 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
2469 pDecoder->TRANSPOSED = 0;
2470 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
2471 pDecoder->SBDSOFFSET = 0;
2472 JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,
2473 sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine) , HuffmanTable_HTOOB_B6));
2474 JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,
2475 sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine) , HuffmanTable_HTOOB_B8));
2476 JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,
2477 sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B11));
2478 JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,
2479 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B15));
2480 JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,
2481 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B15));
2482 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
2483 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B15));
2484 JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,
2485 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B15));
2486 JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1 ,
2487 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine) , HuffmanTable_HTOOB_B1));
2488 pDecoder->SBHUFFFS = SBHUFFFS;
2489 pDecoder->SBHUFFDS = SBHUFFDS;
2490 pDecoder->SBHUFFDT = SBHUFFDT;
2491 pDecoder->SBHUFFRDW = SBHUFFRDW;
2492 pDecoder->SBHUFFRDH = SBHUFFRDH;
2493 pDecoder->SBHUFFRDX = SBHUFFRDX;
2494 pDecoder->SBHUFFRDY = SBHUFFRDY;
2495 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;
2496 pDecoder->SBRTEMPLATE = SDRTEMPLATE;
2497 pDecoder->SBRAT[0] = SDRAT[0];
2498 pDecoder->SBRAT[1] = SDRAT[1];
2499 pDecoder->SBRAT[2] = SDRAT[2];
2500 pDecoder->SBRAT[3] = SDRAT[3];
2501 JBig2IntDecoderState ids;
2502 ids.IADT = IADT;
2503 ids.IAFS = IAFS;
2504 ids.IADS = IADS;
2505 ids.IAIT = IAIT;
2506 ids.IARI = IARI;
2507 ids.IARDW = IARDW;
2508 ids.IARDH = IARDH;
2509 ids.IARDX = IARDX;
2510 ids.IARDY = IARDY;
2511 ids.IAID = IAID;
2512 BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids);
2513 if(BS == NULL) {
2514 m_pModule->JBig2_Free(SBSYMS);
2515 delete SBHUFFFS;
2516 delete SBHUFFDS;
2517 delete SBHUFFDT;
2518 delete SBHUFFRDW;
2519 delete SBHUFFRDH;
2520 delete SBHUFFRDX;
2521 delete SBHUFFRDY;
2522 delete SBHUFFRSIZE;
2523 delete pDecoder;
2524 goto failed;
2525 }
2526 m_pModule->JBig2_Free(SBSYMS);
2527 delete SBHUFFFS;
2528 delete SBHUFFDS;
2529 delete SBHUFFDT;
2530 delete SBHUFFRDW;
2531 delete SBHUFFRDH;
2532 delete SBHUFFRDX;
2533 delete SBHUFFRDY;
2534 delete SBHUFFRSIZE;
2535 delete pDecoder;
2536 } else if(REFAGGNINST == 1) {
2537 SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
2538 if(IAID->decode(pArithDecoder, (int*)&IDI) == -1) {
2539 m_pModule->JBig2_Error("symbol dictionary decoding proce dure (arith): too short.");
2540 goto failed;
2541 }
2542 if((IARDX->decode(pArithDecoder, &RDXI) == -1)
2543 || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
2544 m_pModule->JBig2_Error("symbol dictionary decoding proce dure (arith): too short.");
2545 goto failed;
2546 }
2547 if (IDI >= SBNUMSYMS) {
2548 m_pModule->JBig2_Error("symbol dictionary decoding proce dure (arith):"
2549 " refinement references unknown s ymbol %d", IDI);
2550 goto failed;
2551 }
2552 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
2553 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_I mage*));
2554 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
2555 if (!SBSYMS[IDI]) {
2556 m_pModule->JBig2_Free(SBSYMS);
2557 goto failed;
2558 }
2559 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
2560 pGRRD->GRW = SYMWIDTH;
2561 pGRRD->GRH = HCHEIGHT;
2562 pGRRD->GRTEMPLATE = SDRTEMPLATE;
2563 pGRRD->GRREFERENCE = SBSYMS[IDI];
2564 pGRRD->GRREFERENCEDX = RDXI;
2565 pGRRD->GRREFERENCEDY = RDYI;
2566 pGRRD->TPGRON = 0;
2567 pGRRD->GRAT[0] = SDRAT[0];
2568 pGRRD->GRAT[1] = SDRAT[1];
2569 pGRRD->GRAT[2] = SDRAT[2];
2570 pGRRD->GRAT[3] = SDRAT[3];
2571 BS = pGRRD->decode(pArithDecoder, grContext);
2572 if(BS == NULL) {
2573 m_pModule->JBig2_Free(SBSYMS);
2574 delete pGRRD;
2575 goto failed;
2576 }
2577 m_pModule->JBig2_Free(SBSYMS);
2578 delete pGRRD;
2579 }
2580 }
2581 SDNEWSYMS[NSYMSDECODED] = BS;
2582 BS = NULL;
2583 NSYMSDECODED = NSYMSDECODED + 1;
2584 } 2338 }
2339 CURT = nVal;
2340 }
2341 TI = STRIPT + CURT;
2342 if (IAID->decode(pArithDecoder, &nVal) == -1) {
2343 m_pModule->JBig2_Error(
2344 "text region decoding procedure (arith): too short.");
2345 goto failed;
2346 }
2347 IDI = nVal;
2348 if (IDI >= SBNUMSYMS) {
2349 m_pModule->JBig2_Error(
2350 "text region decoding procedure (arith): symbol id out of "
2351 "range.(%d/%d)",
2352 IDI, SBNUMSYMS);
2353 goto failed;
2354 }
2355 if (SBREFINE == 0) {
2356 RI = 0;
2357 } else {
2358 if (IARI->decode(pArithDecoder, &RI) == -1) {
2359 m_pModule->JBig2_Error(
2360 "text region decoding procedure (arith): too short.");
2361 goto failed;
2362 }
2363 }
2364 if (!SBSYMS[IDI]) {
2365 goto failed;
2366 }
2367 if (RI == 0) {
2368 IBI = SBSYMS[IDI];
2369 } else {
2370 if ((IARDW->decode(pArithDecoder, &RDWI) == -1) ||
2371 (IARDH->decode(pArithDecoder, &RDHI) == -1) ||
2372 (IARDX->decode(pArithDecoder, &RDXI) == -1) ||
2373 (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
2374 m_pModule->JBig2_Error(
2375 "text region decoding procedure (arith): too short.");
2376 goto failed;
2377 }
2378 IBOI = SBSYMS[IDI];
2379 WOI = IBOI->m_nWidth;
2380 HOI = IBOI->m_nHeight;
2381 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
2382 m_pModule->JBig2_Error(
2383 "text region decoding procedure (arith): Invalid RDWI or RDHI "
2384 "value.");
2385 goto failed;
2386 }
2387 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
2388 pGRRD->GRW = WOI + RDWI;
2389 pGRRD->GRH = HOI + RDHI;
2390 pGRRD->GRTEMPLATE = SBRTEMPLATE;
2391 pGRRD->GRREFERENCE = IBOI;
2392 pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI;
2393 pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI;
2394 pGRRD->TPGRON = 0;
2395 pGRRD->GRAT[0] = SBRAT[0];
2396 pGRRD->GRAT[1] = SBRAT[1];
2397 pGRRD->GRAT[2] = SBRAT[2];
2398 pGRRD->GRAT[3] = SBRAT[3];
2399 IBI = pGRRD->decode(pArithDecoder, grContext);
2400 if (IBI == NULL) {
2401 delete pGRRD;
2402 goto failed;
2403 }
2404 delete pGRRD;
2405 }
2406 WI = IBI->m_nWidth;
2407 HI = IBI->m_nHeight;
2408 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) ||
2409 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
2410 CURS = CURS + WI - 1;
2411 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) ||
2412 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
2413 CURS = CURS + HI - 1;
2414 }
2415 SI = CURS;
2416 if (TRANSPOSED == 0) {
2417 switch (REFCORNER) {
2418 case JBIG2_CORNER_TOPLEFT:
2419 SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);
2420 break;
2421 case JBIG2_CORNER_TOPRIGHT:
2422 SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);
2423 break;
2424 case JBIG2_CORNER_BOTTOMLEFT:
2425 SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);
2426 break;
2427 case JBIG2_CORNER_BOTTOMRIGHT:
2428 SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);
2429 break;
2430 }
2431 } else {
2432 switch (REFCORNER) {
2433 case JBIG2_CORNER_TOPLEFT:
2434 SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);
2435 break;
2436 case JBIG2_CORNER_TOPRIGHT:
2437 SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);
2438 break;
2439 case JBIG2_CORNER_BOTTOMLEFT:
2440 SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);
2441 break;
2442 case JBIG2_CORNER_BOTTOMRIGHT:
2443 SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);
2444 break;
2445 }
2446 }
2447 if (RI != 0) {
2448 delete IBI;
2449 }
2450 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) ||
2451 (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
2452 CURS = CURS + WI - 1;
2453 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) ||
2454 (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {
2455 CURS = CURS + HI - 1;
2456 }
2457 NINSTANCES = NINSTANCES + 1;
2585 } 2458 }
2586 EXINDEX = 0; 2459 }
2587 CUREXFLAG = 0; 2460 if (bRetained == FALSE) {
2588 EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));
2589 while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
2590 if(IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) {
2591 m_pModule->JBig2_Free(EXFLAGS);
2592 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith) : too short.");
2593 goto failed;
2594 }
2595 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
2596 m_pModule->JBig2_Free(EXFLAGS);
2597 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith) : Invalid EXRUNLENGTH value.");
2598 goto failed;
2599 }
2600 if(EXRUNLENGTH != 0) {
2601 for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
2602 EXFLAGS[I] = CUREXFLAG;
2603 }
2604 }
2605 EXINDEX = EXINDEX + EXRUNLENGTH;
2606 CUREXFLAG = !CUREXFLAG;
2607 }
2608 JBIG2_ALLOC(pDict, CJBig2_SymbolDict());
2609 pDict->SDNUMEXSYMS = SDNUMEXSYMS;
2610 pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Ima ge*), SDNUMEXSYMS);
2611 I = J = 0;
2612 for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
2613 if(EXFLAGS[I] && J < SDNUMEXSYMS) {
2614 if(I < SDNUMINSYMS) {
2615 JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));
2616 } else {
2617 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
2618 }
2619 J = J + 1;
2620 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
2621 delete SDNEWSYMS[I - SDNUMINSYMS];
2622 }
2623 }
2624 if (J < SDNUMEXSYMS) {
2625 pDict->SDNUMEXSYMS = J;
2626 }
2627 m_pModule->JBig2_Free(EXFLAGS);
2628 m_pModule->JBig2_Free(SDNEWSYMS);
2629 delete IADH;
2630 delete IADW;
2631 delete IAAI;
2632 delete IARDX;
2633 delete IARDY;
2634 delete IAEX;
2635 delete IAID;
2636 delete IADT; 2461 delete IADT;
2637 delete IAFS; 2462 delete IAFS;
2638 delete IADS; 2463 delete IADS;
2639 delete IAIT; 2464 delete IAIT;
2640 delete IARI; 2465 delete IARI;
2641 delete IARDW; 2466 delete IARDW;
2642 delete IARDH; 2467 delete IARDH;
2643 return pDict;
2644 failed:
2645 for(I = 0; I < NSYMSDECODED; I++) {
2646 if (SDNEWSYMS[I]) {
2647 delete SDNEWSYMS[I];
2648 SDNEWSYMS[I] = NULL;
2649 }
2650 }
2651 m_pModule->JBig2_Free(SDNEWSYMS);
2652 delete IADH;
2653 delete IADW;
2654 delete IAAI;
2655 delete IARDX; 2468 delete IARDX;
2656 delete IARDY; 2469 delete IARDY;
2657 delete IAEX;
2658 delete IAID; 2470 delete IAID;
2471 }
2472 return SBREG;
2473 failed:
2474 if (bRetained == FALSE) {
2659 delete IADT; 2475 delete IADT;
2660 delete IAFS; 2476 delete IAFS;
2661 delete IADS; 2477 delete IADS;
2662 delete IAIT; 2478 delete IAIT;
2663 delete IARI; 2479 delete IARI;
2664 delete IARDW; 2480 delete IARDW;
2665 delete IARDH; 2481 delete IARDH;
2482 delete IARDX;
2483 delete IARDY;
2484 delete IAID;
2485 }
2486 delete SBREG;
2487 return NULL;
2488 }
2489 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith(
2490 CJBig2_ArithDecoder* pArithDecoder,
2491 JBig2ArithCtx* gbContext,
2492 JBig2ArithCtx* grContext) {
2493 CJBig2_Image** SDNEWSYMS;
2494 FX_DWORD HCHEIGHT, NSYMSDECODED;
2495 int32_t HCDH;
2496 FX_DWORD SYMWIDTH, TOTWIDTH;
2497 int32_t DW;
2498 CJBig2_Image* BS;
2499 FX_DWORD I, J, REFAGGNINST;
2500 FX_BOOL* EXFLAGS;
2501 FX_DWORD EXINDEX;
2502 FX_BOOL CUREXFLAG;
2503 FX_DWORD EXRUNLENGTH;
2504 int32_t nVal;
2505 FX_DWORD nTmp;
2506 FX_DWORD SBNUMSYMS;
2507 uint8_t SBSYMCODELEN;
2508 FX_DWORD IDI;
2509 int32_t RDXI, RDYI;
2510 CJBig2_Image** SBSYMS;
2511 CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH,
2512 *SBHUFFRDX, *SBHUFFRDY, *SBHUFFRSIZE;
2513 CJBig2_GRRDProc* pGRRD;
2514 CJBig2_GRDProc* pGRD;
2515 CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX, *IADT,
2516 *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH;
2517 CJBig2_ArithIaidDecoder* IAID;
2518 CJBig2_SymbolDict* pDict;
2519 JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder());
2520 JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder());
2521 JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder());
2522 JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());
2523 JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());
2524 JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder());
2525 JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());
2526 JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());
2527 JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());
2528 JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());
2529 JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());
2530 JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());
2531 JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());
2532 nTmp = 0;
2533 while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) {
2534 nTmp++;
2535 }
2536 JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((uint8_t)nTmp));
2537 SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS,
2538 sizeof(CJBig2_Image*));
2539 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*));
2540 HCHEIGHT = 0;
2541 NSYMSDECODED = 0;
2542 while (NSYMSDECODED < SDNUMNEWSYMS) {
2543 BS = NULL;
2544 if (IADH->decode(pArithDecoder, &HCDH) == -1) {
2545 m_pModule->JBig2_Error(
2546 "symbol dictionary decoding procedure (arith): too short.");
2547 goto failed;
2548 }
2549 HCHEIGHT = HCHEIGHT + HCDH;
2550 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {
2551 m_pModule->JBig2_Error(
2552 "symbol dictionary decoding procedure (arith): invalid HCHEIGHT "
2553 "value.");
2554 goto failed;
2555 }
2556 SYMWIDTH = 0;
2557 TOTWIDTH = 0;
2558 for (;;) {
2559 nVal = IADW->decode(pArithDecoder, &DW);
2560 if (nVal == JBIG2_OOB) {
2561 break;
2562 } else if (nVal != 0) {
2563 m_pModule->JBig2_Error(
2564 "symbol dictionary decoding procedure (arith): too short.");
2565 goto failed;
2566 } else {
2567 if (NSYMSDECODED >= SDNUMNEWSYMS) {
2568 m_pModule->JBig2_Error(
2569 "symbol dictionary decoding procedure (arith): NSYMSDECODED >= "
2570 "SDNUMNEWSYMS.");
2571 goto failed;
2572 }
2573 SYMWIDTH = SYMWIDTH + DW;
2574 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
2575 m_pModule->JBig2_Error(
2576 "symbol dictionary decoding procedure (arith): invalid SYMWIDTH "
2577 "value.");
2578 goto failed;
2579 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
2580 TOTWIDTH = TOTWIDTH + SYMWIDTH;
2581 SDNEWSYMS[NSYMSDECODED] = NULL;
2582 NSYMSDECODED = NSYMSDECODED + 1;
2583 continue;
2584 }
2585 TOTWIDTH = TOTWIDTH + SYMWIDTH;
2586 }
2587 if (SDREFAGG == 0) {
2588 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
2589 pGRD->MMR = 0;
2590 pGRD->GBW = SYMWIDTH;
2591 pGRD->GBH = HCHEIGHT;
2592 pGRD->GBTEMPLATE = SDTEMPLATE;
2593 pGRD->TPGDON = 0;
2594 pGRD->USESKIP = 0;
2595 pGRD->GBAT[0] = SDAT[0];
2596 pGRD->GBAT[1] = SDAT[1];
2597 pGRD->GBAT[2] = SDAT[2];
2598 pGRD->GBAT[3] = SDAT[3];
2599 pGRD->GBAT[4] = SDAT[4];
2600 pGRD->GBAT[5] = SDAT[5];
2601 pGRD->GBAT[6] = SDAT[6];
2602 pGRD->GBAT[7] = SDAT[7];
2603 BS = pGRD->decode_Arith(pArithDecoder, gbContext);
2604 if (BS == NULL) {
2605 delete pGRD;
2606 goto failed;
2607 }
2608 delete pGRD;
2609 } else {
2610 if (IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) {
2611 m_pModule->JBig2_Error(
2612 "symbol dictionary decoding procedure (arith): too short.");
2613 goto failed;
2614 }
2615 if (REFAGGNINST > 1) {
2616 CJBig2_TRDProc* pDecoder;
2617 JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());
2618 pDecoder->SBHUFF = SDHUFF;
2619 pDecoder->SBREFINE = 1;
2620 pDecoder->SBW = SYMWIDTH;
2621 pDecoder->SBH = HCHEIGHT;
2622 pDecoder->SBNUMINSTANCES = REFAGGNINST;
2623 pDecoder->SBSTRIPS = 1;
2624 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
2625 SBNUMSYMS = pDecoder->SBNUMSYMS;
2626 nTmp = 0;
2627 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
2628 nTmp++;
2629 }
2630 SBSYMCODELEN = (uint8_t)nTmp;
2631 pDecoder->SBSYMCODELEN = SBSYMCODELEN;
2632 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
2633 SBNUMSYMS, sizeof(CJBig2_Image*));
2634 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
2635 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS,
2636 NSYMSDECODED * sizeof(CJBig2_Image*));
2637 pDecoder->SBSYMS = SBSYMS;
2638 pDecoder->SBDEFPIXEL = 0;
2639 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
2640 pDecoder->TRANSPOSED = 0;
2641 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
2642 pDecoder->SBDSOFFSET = 0;
2643 JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,
2644 sizeof(HuffmanTable_B6) /
2645 sizeof(JBig2TableLine),
2646 HuffmanTable_HTOOB_B6));
2647 JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,
2648 sizeof(HuffmanTable_B8) /
2649 sizeof(JBig2TableLine),
2650 HuffmanTable_HTOOB_B8));
2651 JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,
2652 sizeof(HuffmanTable_B11) /
2653 sizeof(JBig2TableLine),
2654 HuffmanTable_HTOOB_B11));
2655 JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,
2656 sizeof(HuffmanTable_B15) /
2657 sizeof(JBig2TableLine),
2658 HuffmanTable_HTOOB_B15));
2659 JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,
2660 sizeof(HuffmanTable_B15) /
2661 sizeof(JBig2TableLine),
2662 HuffmanTable_HTOOB_B15));
2663 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
2664 sizeof(HuffmanTable_B15) /
2665 sizeof(JBig2TableLine),
2666 HuffmanTable_HTOOB_B15));
2667 JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,
2668 sizeof(HuffmanTable_B15) /
2669 sizeof(JBig2TableLine),
2670 HuffmanTable_HTOOB_B15));
2671 JBIG2_ALLOC(SBHUFFRSIZE,
2672 CJBig2_HuffmanTable(
2673 HuffmanTable_B1,
2674 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine),
2675 HuffmanTable_HTOOB_B1));
2676 pDecoder->SBHUFFFS = SBHUFFFS;
2677 pDecoder->SBHUFFDS = SBHUFFDS;
2678 pDecoder->SBHUFFDT = SBHUFFDT;
2679 pDecoder->SBHUFFRDW = SBHUFFRDW;
2680 pDecoder->SBHUFFRDH = SBHUFFRDH;
2681 pDecoder->SBHUFFRDX = SBHUFFRDX;
2682 pDecoder->SBHUFFRDY = SBHUFFRDY;
2683 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;
2684 pDecoder->SBRTEMPLATE = SDRTEMPLATE;
2685 pDecoder->SBRAT[0] = SDRAT[0];
2686 pDecoder->SBRAT[1] = SDRAT[1];
2687 pDecoder->SBRAT[2] = SDRAT[2];
2688 pDecoder->SBRAT[3] = SDRAT[3];
2689 JBig2IntDecoderState ids;
2690 ids.IADT = IADT;
2691 ids.IAFS = IAFS;
2692 ids.IADS = IADS;
2693 ids.IAIT = IAIT;
2694 ids.IARI = IARI;
2695 ids.IARDW = IARDW;
2696 ids.IARDH = IARDH;
2697 ids.IARDX = IARDX;
2698 ids.IARDY = IARDY;
2699 ids.IAID = IAID;
2700 BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids);
2701 if (BS == NULL) {
2702 m_pModule->JBig2_Free(SBSYMS);
2703 delete SBHUFFFS;
2704 delete SBHUFFDS;
2705 delete SBHUFFDT;
2706 delete SBHUFFRDW;
2707 delete SBHUFFRDH;
2708 delete SBHUFFRDX;
2709 delete SBHUFFRDY;
2710 delete SBHUFFRSIZE;
2711 delete pDecoder;
2712 goto failed;
2713 }
2714 m_pModule->JBig2_Free(SBSYMS);
2715 delete SBHUFFFS;
2716 delete SBHUFFDS;
2717 delete SBHUFFDT;
2718 delete SBHUFFRDW;
2719 delete SBHUFFRDH;
2720 delete SBHUFFRDX;
2721 delete SBHUFFRDY;
2722 delete SBHUFFRSIZE;
2723 delete pDecoder;
2724 } else if (REFAGGNINST == 1) {
2725 SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
2726 if (IAID->decode(pArithDecoder, (int*)&IDI) == -1) {
2727 m_pModule->JBig2_Error(
2728 "symbol dictionary decoding procedure (arith): too short.");
2729 goto failed;
2730 }
2731 if ((IARDX->decode(pArithDecoder, &RDXI) == -1) ||
2732 (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
2733 m_pModule->JBig2_Error(
2734 "symbol dictionary decoding procedure (arith): too short.");
2735 goto failed;
2736 }
2737 if (IDI >= SBNUMSYMS) {
2738 m_pModule->JBig2_Error(
2739 "symbol dictionary decoding procedure (arith):"
2740 " refinement references unknown symbol %d",
2741 IDI);
2742 goto failed;
2743 }
2744 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
2745 SBNUMSYMS, sizeof(CJBig2_Image*));
2746 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
2747 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS,
2748 NSYMSDECODED * sizeof(CJBig2_Image*));
2749 if (!SBSYMS[IDI]) {
2750 m_pModule->JBig2_Free(SBSYMS);
2751 goto failed;
2752 }
2753 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
2754 pGRRD->GRW = SYMWIDTH;
2755 pGRRD->GRH = HCHEIGHT;
2756 pGRRD->GRTEMPLATE = SDRTEMPLATE;
2757 pGRRD->GRREFERENCE = SBSYMS[IDI];
2758 pGRRD->GRREFERENCEDX = RDXI;
2759 pGRRD->GRREFERENCEDY = RDYI;
2760 pGRRD->TPGRON = 0;
2761 pGRRD->GRAT[0] = SDRAT[0];
2762 pGRRD->GRAT[1] = SDRAT[1];
2763 pGRRD->GRAT[2] = SDRAT[2];
2764 pGRRD->GRAT[3] = SDRAT[3];
2765 BS = pGRRD->decode(pArithDecoder, grContext);
2766 if (BS == NULL) {
2767 m_pModule->JBig2_Free(SBSYMS);
2768 delete pGRRD;
2769 goto failed;
2770 }
2771 m_pModule->JBig2_Free(SBSYMS);
2772 delete pGRRD;
2773 }
2774 }
2775 SDNEWSYMS[NSYMSDECODED] = BS;
2776 BS = NULL;
2777 NSYMSDECODED = NSYMSDECODED + 1;
2778 }
2779 }
2780 EXINDEX = 0;
2781 CUREXFLAG = 0;
2782 EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL),
2783 (SDNUMINSYMS + SDNUMNEWSYMS));
2784 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
2785 if (IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) {
2786 m_pModule->JBig2_Free(EXFLAGS);
2787 m_pModule->JBig2_Error(
2788 "symbol dictionary decoding procedure (arith): too short.");
2789 goto failed;
2790 }
2791 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
2792 m_pModule->JBig2_Free(EXFLAGS);
2793 m_pModule->JBig2_Error(
2794 "symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH "
2795 "value.");
2796 goto failed;
2797 }
2798 if (EXRUNLENGTH != 0) {
2799 for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
2800 EXFLAGS[I] = CUREXFLAG;
2801 }
2802 }
2803 EXINDEX = EXINDEX + EXRUNLENGTH;
2804 CUREXFLAG = !CUREXFLAG;
2805 }
2806 JBIG2_ALLOC(pDict, CJBig2_SymbolDict());
2807 pDict->SDNUMEXSYMS = SDNUMEXSYMS;
2808 pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
2809 sizeof(CJBig2_Image*), SDNUMEXSYMS);
2810 I = J = 0;
2811 for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
2812 if (EXFLAGS[I] && J < SDNUMEXSYMS) {
2813 if (I < SDNUMINSYMS) {
2814 JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));
2815 } else {
2816 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
2817 }
2818 J = J + 1;
2819 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
2820 delete SDNEWSYMS[I - SDNUMINSYMS];
2821 }
2822 }
2823 if (J < SDNUMEXSYMS) {
2824 pDict->SDNUMEXSYMS = J;
2825 }
2826 m_pModule->JBig2_Free(EXFLAGS);
2827 m_pModule->JBig2_Free(SDNEWSYMS);
2828 delete IADH;
2829 delete IADW;
2830 delete IAAI;
2831 delete IARDX;
2832 delete IARDY;
2833 delete IAEX;
2834 delete IAID;
2835 delete IADT;
2836 delete IAFS;
2837 delete IADS;
2838 delete IAIT;
2839 delete IARI;
2840 delete IARDW;
2841 delete IARDH;
2842 return pDict;
2843 failed:
2844 for (I = 0; I < NSYMSDECODED; I++) {
2845 if (SDNEWSYMS[I]) {
2846 delete SDNEWSYMS[I];
2847 SDNEWSYMS[I] = NULL;
2848 }
2849 }
2850 m_pModule->JBig2_Free(SDNEWSYMS);
2851 delete IADH;
2852 delete IADW;
2853 delete IAAI;
2854 delete IARDX;
2855 delete IARDY;
2856 delete IAEX;
2857 delete IAID;
2858 delete IADT;
2859 delete IAFS;
2860 delete IADS;
2861 delete IAIT;
2862 delete IARI;
2863 delete IARDW;
2864 delete IARDH;
2865 return NULL;
2866 }
2867 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream* pStream,
2868 JBig2ArithCtx* gbContext,
2869 JBig2ArithCtx* grContext,
2870 IFX_Pause* pPause) {
2871 CJBig2_Image** SDNEWSYMS;
2872 FX_DWORD* SDNEWSYMWIDTHS;
2873 FX_DWORD HCHEIGHT, NSYMSDECODED;
2874 int32_t HCDH;
2875 FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;
2876 int32_t DW;
2877 CJBig2_Image *BS, *BHC;
2878 FX_DWORD I, J, REFAGGNINST;
2879 FX_BOOL* EXFLAGS;
2880 FX_DWORD EXINDEX;
2881 FX_BOOL CUREXFLAG;
2882 FX_DWORD EXRUNLENGTH;
2883 int32_t nVal, nBits;
2884 FX_DWORD nTmp;
2885 FX_DWORD SBNUMSYMS;
2886 uint8_t SBSYMCODELEN;
2887 JBig2HuffmanCode* SBSYMCODES;
2888 FX_DWORD IDI;
2889 int32_t RDXI, RDYI;
2890 FX_DWORD BMSIZE;
2891 FX_DWORD stride;
2892 CJBig2_Image** SBSYMS;
2893 CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH,
2894 *SBHUFFRDX, *SBHUFFRDY, *SBHUFFRSIZE, *pTable;
2895 CJBig2_HuffmanDecoder* pHuffmanDecoder;
2896 CJBig2_GRRDProc* pGRRD;
2897 CJBig2_ArithDecoder* pArithDecoder;
2898 CJBig2_GRDProc* pGRD;
2899 CJBig2_SymbolDict* pDict;
2900 JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));
2901 SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS,
2902 sizeof(CJBig2_Image*));
2903 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*));
2904 SDNEWSYMWIDTHS = NULL;
2905 BHC = NULL;
2906 if (SDREFAGG == 0) {
2907 SDNEWSYMWIDTHS =
2908 (FX_DWORD*)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(FX_DWORD));
2909 FXSYS_memset(SDNEWSYMWIDTHS, 0, SDNUMNEWSYMS * sizeof(FX_DWORD));
2910 }
2911 HCHEIGHT = 0;
2912 NSYMSDECODED = 0;
2913 BS = NULL;
2914 while (NSYMSDECODED < SDNUMNEWSYMS) {
2915 if (pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) {
2916 m_pModule->JBig2_Error(
2917 "symbol dictionary decoding procedure (huffman): too short.");
2918 goto failed;
2919 }
2920 HCHEIGHT = HCHEIGHT + HCDH;
2921 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {
2922 m_pModule->JBig2_Error(
2923 "symbol dictionary decoding procedure (huffman): invalid HCHEIGHT "
2924 "value.");
2925 goto failed;
2926 }
2927 SYMWIDTH = 0;
2928 TOTWIDTH = 0;
2929 HCFIRSTSYM = NSYMSDECODED;
2930 for (;;) {
2931 nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW);
2932 if (nVal == JBIG2_OOB) {
2933 break;
2934 } else if (nVal != 0) {
2935 m_pModule->JBig2_Error(
2936 "symbol dictionary decoding procedure (huffman): too short.");
2937 goto failed;
2938 } else {
2939 if (NSYMSDECODED >= SDNUMNEWSYMS) {
2940 m_pModule->JBig2_Error(
2941 "symbol dictionary decoding procedure (huffman): NSYMSDECODED >= "
2942 "SDNUMNEWSYMS.");
2943 goto failed;
2944 }
2945 SYMWIDTH = SYMWIDTH + DW;
2946 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
2947 m_pModule->JBig2_Error(
2948 "symbol dictionary decoding procedure (huffman): invalid "
2949 "SYMWIDTH value.");
2950 goto failed;
2951 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
2952 TOTWIDTH = TOTWIDTH + SYMWIDTH;
2953 SDNEWSYMS[NSYMSDECODED] = NULL;
2954 NSYMSDECODED = NSYMSDECODED + 1;
2955 continue;
2956 }
2957 TOTWIDTH = TOTWIDTH + SYMWIDTH;
2958 }
2959 if (SDREFAGG == 1) {
2960 if (pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) !=
2961 0) {
2962 m_pModule->JBig2_Error(
2963 "symbol dictionary decoding procedure (huffman): too short.");
2964 goto failed;
2965 }
2966 BS = NULL;
2967 if (REFAGGNINST > 1) {
2968 CJBig2_TRDProc* pDecoder;
2969 JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());
2970 pDecoder->SBHUFF = SDHUFF;
2971 pDecoder->SBREFINE = 1;
2972 pDecoder->SBW = SYMWIDTH;
2973 pDecoder->SBH = HCHEIGHT;
2974 pDecoder->SBNUMINSTANCES = REFAGGNINST;
2975 pDecoder->SBSTRIPS = 1;
2976 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
2977 SBNUMSYMS = pDecoder->SBNUMSYMS;
2978 SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(
2979 SBNUMSYMS, sizeof(JBig2HuffmanCode));
2980 nTmp = 1;
2981 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
2982 nTmp++;
2983 }
2984 for (I = 0; I < SBNUMSYMS; I++) {
2985 SBSYMCODES[I].codelen = nTmp;
2986 SBSYMCODES[I].code = I;
2987 }
2988 pDecoder->SBSYMCODES = SBSYMCODES;
2989 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
2990 SBNUMSYMS, sizeof(CJBig2_Image*));
2991 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
2992 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS,
2993 NSYMSDECODED * sizeof(CJBig2_Image*));
2994 pDecoder->SBSYMS = SBSYMS;
2995 pDecoder->SBDEFPIXEL = 0;
2996 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
2997 pDecoder->TRANSPOSED = 0;
2998 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
2999 pDecoder->SBDSOFFSET = 0;
3000 JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,
3001 sizeof(HuffmanTable_B6) /
3002 sizeof(JBig2TableLine),
3003 HuffmanTable_HTOOB_B6));
3004 JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,
3005 sizeof(HuffmanTable_B8) /
3006 sizeof(JBig2TableLine),
3007 HuffmanTable_HTOOB_B8));
3008 JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,
3009 sizeof(HuffmanTable_B11) /
3010 sizeof(JBig2TableLine),
3011 HuffmanTable_HTOOB_B11));
3012 JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,
3013 sizeof(HuffmanTable_B15) /
3014 sizeof(JBig2TableLine),
3015 HuffmanTable_HTOOB_B15));
3016 JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,
3017 sizeof(HuffmanTable_B15) /
3018 sizeof(JBig2TableLine),
3019 HuffmanTable_HTOOB_B15));
3020 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
3021 sizeof(HuffmanTable_B15) /
3022 sizeof(JBig2TableLine),
3023 HuffmanTable_HTOOB_B15));
3024 JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,
3025 sizeof(HuffmanTable_B15) /
3026 sizeof(JBig2TableLine),
3027 HuffmanTable_HTOOB_B15));
3028 JBIG2_ALLOC(SBHUFFRSIZE,
3029 CJBig2_HuffmanTable(
3030 HuffmanTable_B1,
3031 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine),
3032 HuffmanTable_HTOOB_B1));
3033 pDecoder->SBHUFFFS = SBHUFFFS;
3034 pDecoder->SBHUFFDS = SBHUFFDS;
3035 pDecoder->SBHUFFDT = SBHUFFDT;
3036 pDecoder->SBHUFFRDW = SBHUFFRDW;
3037 pDecoder->SBHUFFRDH = SBHUFFRDH;
3038 pDecoder->SBHUFFRDX = SBHUFFRDX;
3039 pDecoder->SBHUFFRDY = SBHUFFRDY;
3040 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;
3041 pDecoder->SBRTEMPLATE = SDRTEMPLATE;
3042 pDecoder->SBRAT[0] = SDRAT[0];
3043 pDecoder->SBRAT[1] = SDRAT[1];
3044 pDecoder->SBRAT[2] = SDRAT[2];
3045 pDecoder->SBRAT[3] = SDRAT[3];
3046 BS = pDecoder->decode_Huffman(pStream, grContext);
3047 if (BS == NULL) {
3048 m_pModule->JBig2_Free(SBSYMCODES);
3049 m_pModule->JBig2_Free(SBSYMS);
3050 delete SBHUFFFS;
3051 delete SBHUFFDS;
3052 delete SBHUFFDT;
3053 delete SBHUFFRDW;
3054 delete SBHUFFRDH;
3055 delete SBHUFFRDX;
3056 delete SBHUFFRDY;
3057 delete SBHUFFRSIZE;
3058 delete pDecoder;
3059 goto failed;
3060 }
3061 m_pModule->JBig2_Free(SBSYMCODES);
3062 m_pModule->JBig2_Free(SBSYMS);
3063 delete SBHUFFFS;
3064 delete SBHUFFDS;
3065 delete SBHUFFDT;
3066 delete SBHUFFRDW;
3067 delete SBHUFFRDH;
3068 delete SBHUFFRDX;
3069 delete SBHUFFRDY;
3070 delete SBHUFFRSIZE;
3071 delete pDecoder;
3072 } else if (REFAGGNINST == 1) {
3073 SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS;
3074 nTmp = 1;
3075 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
3076 nTmp++;
3077 }
3078 SBSYMCODELEN = (uint8_t)nTmp;
3079 SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(
3080 SBNUMSYMS, sizeof(JBig2HuffmanCode));
3081 for (I = 0; I < SBNUMSYMS; I++) {
3082 SBSYMCODES[I].codelen = SBSYMCODELEN;
3083 SBSYMCODES[I].code = I;
3084 }
3085 nVal = 0;
3086 nBits = 0;
3087 for (;;) {
3088 if (pStream->read1Bit(&nTmp) != 0) {
3089 m_pModule->JBig2_Free(SBSYMCODES);
3090 m_pModule->JBig2_Error(
3091 "symbol dictionary decoding procedure (huffman): too short.");
3092 goto failed;
3093 }
3094 nVal = (nVal << 1) | nTmp;
3095 for (IDI = 0; IDI < SBNUMSYMS; IDI++) {
3096 if ((nVal == SBSYMCODES[IDI].code) &&
3097 (nBits == SBSYMCODES[IDI].codelen)) {
3098 break;
3099 }
3100 }
3101 if (IDI < SBNUMSYMS) {
3102 break;
3103 }
3104 }
3105 m_pModule->JBig2_Free(SBSYMCODES);
3106 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
3107 sizeof(HuffmanTable_B15) /
3108 sizeof(JBig2TableLine),
3109 HuffmanTable_HTOOB_B15));
3110 JBIG2_ALLOC(SBHUFFRSIZE,
3111 CJBig2_HuffmanTable(
3112 HuffmanTable_B1,
3113 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine),
3114 HuffmanTable_HTOOB_B1));
3115 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) ||
3116 (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0) ||
3117 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {
3118 delete SBHUFFRDX;
3119 delete SBHUFFRSIZE;
3120 m_pModule->JBig2_Error(
3121 "symbol dictionary decoding procedure (huffman): too short.");
3122 goto failed;
3123 }
3124 delete SBHUFFRDX;
3125 delete SBHUFFRSIZE;
3126 pStream->alignByte();
3127 nTmp = pStream->getOffset();
3128 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
3129 SBNUMSYMS, sizeof(CJBig2_Image*));
3130 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
3131 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS,
3132 NSYMSDECODED * sizeof(CJBig2_Image*));
3133 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
3134 pGRRD->GRW = SYMWIDTH;
3135 pGRRD->GRH = HCHEIGHT;
3136 pGRRD->GRTEMPLATE = SDRTEMPLATE;
3137 pGRRD->GRREFERENCE = SBSYMS[IDI];
3138 pGRRD->GRREFERENCEDX = RDXI;
3139 pGRRD->GRREFERENCEDY = RDYI;
3140 pGRRD->TPGRON = 0;
3141 pGRRD->GRAT[0] = SDRAT[0];
3142 pGRRD->GRAT[1] = SDRAT[1];
3143 pGRRD->GRAT[2] = SDRAT[2];
3144 pGRRD->GRAT[3] = SDRAT[3];
3145 JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));
3146 BS = pGRRD->decode(pArithDecoder, grContext);
3147 if (BS == NULL) {
3148 m_pModule->JBig2_Free(SBSYMS);
3149 delete pGRRD;
3150 delete pArithDecoder;
3151 goto failed;
3152 }
3153 pStream->alignByte();
3154 pStream->offset(2);
3155 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
3156 delete BS;
3157 m_pModule->JBig2_Free(SBSYMS);
3158 delete pGRRD;
3159 delete pArithDecoder;
3160 m_pModule->JBig2_Error(
3161 "symbol dictionary decoding procedure (huffman):"
3162 "bytes processed by generic refinement region decoding "
3163 "procedure doesn't equal SBHUFFRSIZE.");
3164 goto failed;
3165 }
3166 m_pModule->JBig2_Free(SBSYMS);
3167 delete pGRRD;
3168 delete pArithDecoder;
3169 }
3170 SDNEWSYMS[NSYMSDECODED] = BS;
3171 }
3172 if (SDREFAGG == 0) {
3173 SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH;
3174 }
3175 NSYMSDECODED = NSYMSDECODED + 1;
3176 }
3177 if (SDREFAGG == 0) {
3178 if (pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (int32_t*)&BMSIZE) != 0) {
3179 m_pModule->JBig2_Error(
3180 "symbol dictionary decoding procedure (huffman): too short.");
3181 goto failed;
3182 }
3183 pStream->alignByte();
3184 if (BMSIZE == 0) {
3185 stride = (TOTWIDTH + 7) >> 3;
3186 if (pStream->getByteLeft() >= stride * HCHEIGHT) {
3187 JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT));
3188 for (I = 0; I < HCHEIGHT; I++) {
3189 JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride,
3190 pStream->getPointer(), stride);
3191 pStream->offset(stride);
3192 }
3193 } else {
3194 m_pModule->JBig2_Error(
3195 "symbol dictionary decoding procedure (huffman): too short.");
3196 goto failed;
3197 }
3198 } else {
3199 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
3200 pGRD->MMR = 1;
3201 pGRD->GBW = TOTWIDTH;
3202 pGRD->GBH = HCHEIGHT;
3203 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream);
3204 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3205 pGRD->Continue_decode(pPause);
3206 }
3207 delete pGRD;
3208 pStream->alignByte();
3209 }
3210 nTmp = 0;
3211 if (!BHC) {
3212 continue;
3213 }
3214 for (I = HCFIRSTSYM; I < NSYMSDECODED; I++) {
3215 SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT);
3216 nTmp += SDNEWSYMWIDTHS[I];
3217 }
3218 delete BHC;
3219 BHC = NULL;
3220 }
3221 }
3222 EXINDEX = 0;
3223 CUREXFLAG = 0;
3224 JBIG2_ALLOC(pTable, CJBig2_HuffmanTable(
3225 HuffmanTable_B1,
3226 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine),
3227 HuffmanTable_HTOOB_B1));
3228 EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL),
3229 (SDNUMINSYMS + SDNUMNEWSYMS));
3230 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
3231 if (pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) {
3232 delete pTable;
3233 m_pModule->JBig2_Free(EXFLAGS);
3234 m_pModule->JBig2_Error(
3235 "symbol dictionary decoding procedure (huffman): too short.");
3236 goto failed;
3237 }
3238 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
3239 delete pTable;
3240 m_pModule->JBig2_Free(EXFLAGS);
3241 m_pModule->JBig2_Error(
3242 "symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH "
3243 "value.");
3244 goto failed;
3245 }
3246 if (EXRUNLENGTH != 0) {
3247 for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
3248 EXFLAGS[I] = CUREXFLAG;
3249 }
3250 }
3251 EXINDEX = EXINDEX + EXRUNLENGTH;
3252 CUREXFLAG = !CUREXFLAG;
3253 }
3254 delete pTable;
3255 JBIG2_ALLOC(pDict, CJBig2_SymbolDict());
3256 pDict->SDNUMEXSYMS = SDNUMEXSYMS;
3257 pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
3258 sizeof(CJBig2_Image*), SDNUMEXSYMS);
3259 I = J = 0;
3260 for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
3261 if (EXFLAGS[I] && J < SDNUMEXSYMS) {
3262 if (I < SDNUMINSYMS) {
3263 JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));
3264 } else {
3265 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
3266 }
3267 J = J + 1;
3268 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
3269 delete SDNEWSYMS[I - SDNUMINSYMS];
3270 }
3271 }
3272 if (J < SDNUMEXSYMS) {
3273 pDict->SDNUMEXSYMS = J;
3274 }
3275 m_pModule->JBig2_Free(EXFLAGS);
3276 m_pModule->JBig2_Free(SDNEWSYMS);
3277 if (SDREFAGG == 0) {
3278 m_pModule->JBig2_Free(SDNEWSYMWIDTHS);
3279 }
3280 delete pHuffmanDecoder;
3281 return pDict;
3282 failed:
3283 for (I = 0; I < NSYMSDECODED; I++) {
3284 delete SDNEWSYMS[I];
3285 }
3286 m_pModule->JBig2_Free(SDNEWSYMS);
3287 if (SDREFAGG == 0) {
3288 m_pModule->JBig2_Free(SDNEWSYMWIDTHS);
3289 }
3290 delete pHuffmanDecoder;
3291 return NULL;
3292 }
3293 CJBig2_Image* CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
3294 JBig2ArithCtx* gbContext,
3295 IFX_Pause* pPause) {
3296 FX_DWORD ng, mg;
3297 int32_t x, y;
3298 CJBig2_Image* HSKIP;
3299 FX_DWORD HBPP;
3300 FX_DWORD* GI;
3301 CJBig2_Image* HTREG;
3302 CJBig2_GSIDProc* pGID;
3303 JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));
3304 HTREG->fill(HDEFPIXEL);
3305 HSKIP = NULL;
3306 if (HENABLESKIP == 1) {
3307 JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH));
3308 for (mg = 0; mg < HGH; mg++) {
3309 for (ng = 0; ng < HGW; ng++) {
3310 x = (HGX + mg * HRY + ng * HRX) >> 8;
3311 y = (HGY + mg * HRX - ng * HRY) >> 8;
3312 if ((x + HPW <= 0) | (x >= (int32_t)HBW) | (y + HPH <= 0) |
3313 (y >= (int32_t)HPH)) {
3314 HSKIP->setPixel(ng, mg, 1);
3315 } else {
3316 HSKIP->setPixel(ng, mg, 0);
3317 }
3318 }
3319 }
3320 }
3321 HBPP = 1;
3322 while ((FX_DWORD)(1 << HBPP) < HNUMPATS) {
3323 HBPP++;
3324 }
3325 JBIG2_ALLOC(pGID, CJBig2_GSIDProc());
3326 pGID->GSMMR = HMMR;
3327 pGID->GSW = HGW;
3328 pGID->GSH = HGH;
3329 pGID->GSBPP = (uint8_t)HBPP;
3330 pGID->GSUSESKIP = HENABLESKIP;
3331 pGID->GSKIP = HSKIP;
3332 pGID->GSTEMPLATE = HTEMPLATE;
3333 GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause);
3334 if (GI == NULL) {
3335 goto failed;
3336 }
3337 for (mg = 0; mg < HGH; mg++) {
3338 for (ng = 0; ng < HGW; ng++) {
3339 x = (HGX + mg * HRY + ng * HRX) >> 8;
3340 y = (HGY + mg * HRX - ng * HRY) >> 8;
3341 FX_DWORD pat_index = GI[mg * HGW + ng];
3342 if (pat_index >= HNUMPATS) {
3343 pat_index = HNUMPATS - 1;
3344 }
3345 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
3346 }
3347 }
3348 m_pModule->JBig2_Free(GI);
3349 delete HSKIP;
3350 delete pGID;
3351 return HTREG;
3352 failed:
3353 delete HSKIP;
3354 delete pGID;
3355 delete HTREG;
3356 return NULL;
3357 }
3358 CJBig2_Image* CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream* pStream,
3359 IFX_Pause* pPause) {
3360 FX_DWORD ng, mg;
3361 int32_t x, y;
3362 FX_DWORD HBPP;
3363 FX_DWORD* GI;
3364 CJBig2_Image* HTREG;
3365 CJBig2_GSIDProc* pGID;
3366 JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));
3367 HTREG->fill(HDEFPIXEL);
3368 HBPP = 1;
3369 while ((FX_DWORD)(1 << HBPP) < HNUMPATS) {
3370 HBPP++;
3371 }
3372 JBIG2_ALLOC(pGID, CJBig2_GSIDProc());
3373 pGID->GSMMR = HMMR;
3374 pGID->GSW = HGW;
3375 pGID->GSH = HGH;
3376 pGID->GSBPP = (uint8_t)HBPP;
3377 pGID->GSUSESKIP = 0;
3378 GI = pGID->decode_MMR(pStream, pPause);
3379 if (GI == NULL) {
3380 goto failed;
3381 }
3382 for (mg = 0; mg < HGH; mg++) {
3383 for (ng = 0; ng < HGW; ng++) {
3384 x = (HGX + mg * HRY + ng * HRX) >> 8;
3385 y = (HGY + mg * HRX - ng * HRY) >> 8;
3386 FX_DWORD pat_index = GI[mg * HGW + ng];
3387 if (pat_index >= HNUMPATS) {
3388 pat_index = HNUMPATS - 1;
3389 }
3390 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
3391 }
3392 }
3393 m_pModule->JBig2_Free(GI);
3394 delete pGID;
3395 return HTREG;
3396 failed:
3397 delete pGID;
3398 delete HTREG;
3399 return NULL;
3400 }
3401 CJBig2_PatternDict* CJBig2_PDDProc::decode_Arith(
3402 CJBig2_ArithDecoder* pArithDecoder,
3403 JBig2ArithCtx* gbContext,
3404 IFX_Pause* pPause) {
3405 FX_DWORD GRAY;
3406 CJBig2_Image* BHDC = NULL;
3407 CJBig2_PatternDict* pDict;
3408 CJBig2_GRDProc* pGRD;
3409 JBIG2_ALLOC(pDict, CJBig2_PatternDict());
3410 pDict->NUMPATS = GRAYMAX + 1;
3411 pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
3412 sizeof(CJBig2_Image*), pDict->NUMPATS);
3413 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS);
3414 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
3415 pGRD->MMR = HDMMR;
3416 pGRD->GBW = (GRAYMAX + 1) * HDPW;
3417 pGRD->GBH = HDPH;
3418 pGRD->GBTEMPLATE = HDTEMPLATE;
3419 pGRD->TPGDON = 0;
3420 pGRD->USESKIP = 0;
3421 pGRD->GBAT[0] = -(int32_t)HDPW;
3422 pGRD->GBAT[1] = 0;
3423 if (pGRD->GBTEMPLATE == 0) {
3424 pGRD->GBAT[2] = -3;
3425 pGRD->GBAT[3] = -1;
3426 pGRD->GBAT[4] = 2;
3427 pGRD->GBAT[5] = -2;
3428 pGRD->GBAT[6] = -2;
3429 pGRD->GBAT[7] = -2;
3430 }
3431 FXCODEC_STATUS status =
3432 pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext);
3433 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3434 pGRD->Continue_decode(pPause);
3435 }
3436 if (BHDC == NULL) {
3437 delete pGRD;
3438 goto failed;
3439 }
3440 delete pGRD;
3441 GRAY = 0;
3442 while (GRAY <= GRAYMAX) {
3443 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
3444 GRAY = GRAY + 1;
3445 }
3446 delete BHDC;
3447 return pDict;
3448 failed:
3449 delete pDict;
3450 return NULL;
3451 }
3452
3453 CJBig2_PatternDict* CJBig2_PDDProc::decode_MMR(CJBig2_BitStream* pStream,
3454 IFX_Pause* pPause) {
3455 FX_DWORD GRAY;
3456 CJBig2_Image* BHDC = NULL;
3457 CJBig2_PatternDict* pDict;
3458 CJBig2_GRDProc* pGRD;
3459 JBIG2_ALLOC(pDict, CJBig2_PatternDict());
3460 pDict->NUMPATS = GRAYMAX + 1;
3461 pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
3462 sizeof(CJBig2_Image*), pDict->NUMPATS);
3463 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS);
3464 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
3465 pGRD->MMR = HDMMR;
3466 pGRD->GBW = (GRAYMAX + 1) * HDPW;
3467 pGRD->GBH = HDPH;
3468 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream);
3469 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3470 pGRD->Continue_decode(pPause);
3471 }
3472 if (BHDC == NULL) {
3473 delete pGRD;
3474 goto failed;
3475 }
3476 delete pGRD;
3477 GRAY = 0;
3478 while (GRAY <= GRAYMAX) {
3479 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
3480 GRAY = GRAY + 1;
3481 }
3482 delete BHDC;
3483 return pDict;
3484 failed:
3485 delete pDict;
3486 return NULL;
3487 }
3488 FX_DWORD* CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
3489 JBig2ArithCtx* gbContext,
3490 IFX_Pause* pPause) {
3491 CJBig2_Image** GSPLANES;
3492 int32_t J, K;
3493 FX_DWORD x, y;
3494 FX_DWORD* GSVALS;
3495 CJBig2_GRDProc* pGRD;
3496 GSPLANES =
3497 (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);
3498 if (!GSPLANES) {
2666 return NULL; 3499 return NULL;
2667 } 3500 }
2668 CJBig2_SymbolDict *CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream *pStream, 3501 GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);
2669 JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause) 3502 if (!GSVALS) {
2670 { 3503 m_pModule->JBig2_Free(GSPLANES);
2671 CJBig2_Image **SDNEWSYMS; 3504 return NULL;
2672 FX_DWORD *SDNEWSYMWIDTHS; 3505 }
2673 FX_DWORD HCHEIGHT, NSYMSDECODED; 3506 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP);
2674 int32_t HCDH; 3507 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH);
2675 FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM; 3508 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
2676 int32_t DW; 3509 pGRD->MMR = GSMMR;
2677 CJBig2_Image *BS, *BHC; 3510 pGRD->GBW = GSW;
2678 FX_DWORD I, J, REFAGGNINST; 3511 pGRD->GBH = GSH;
2679 FX_BOOL *EXFLAGS; 3512 pGRD->GBTEMPLATE = GSTEMPLATE;
2680 FX_DWORD EXINDEX; 3513 pGRD->TPGDON = 0;
2681 FX_BOOL CUREXFLAG; 3514 pGRD->USESKIP = GSUSESKIP;
2682 FX_DWORD EXRUNLENGTH; 3515 pGRD->SKIP = GSKIP;
2683 int32_t nVal, nBits; 3516 if (GSTEMPLATE <= 1) {
2684 FX_DWORD nTmp; 3517 pGRD->GBAT[0] = 3;
2685 FX_DWORD SBNUMSYMS; 3518 } else {
2686 uint8_t SBSYMCODELEN; 3519 pGRD->GBAT[0] = 2;
2687 JBig2HuffmanCode *SBSYMCODES; 3520 }
2688 FX_DWORD IDI; 3521 pGRD->GBAT[1] = -1;
2689 int32_t RDXI, RDYI; 3522 if (pGRD->GBTEMPLATE == 0) {
2690 FX_DWORD BMSIZE; 3523 pGRD->GBAT[2] = -3;
2691 FX_DWORD stride; 3524 pGRD->GBAT[3] = -1;
2692 CJBig2_Image **SBSYMS; 3525 pGRD->GBAT[4] = 2;
2693 CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY, 3526 pGRD->GBAT[5] = -2;
2694 *SBHUFFRSIZE, *pTable; 3527 pGRD->GBAT[6] = -2;
2695 CJBig2_HuffmanDecoder *pHuffmanDecoder; 3528 pGRD->GBAT[7] = -2;
2696 CJBig2_GRRDProc *pGRRD; 3529 }
2697 CJBig2_ArithDecoder *pArithDecoder; 3530 FXCODEC_STATUS status =
2698 CJBig2_GRDProc *pGRD; 3531 pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext);
2699 CJBig2_SymbolDict *pDict; 3532 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
2700 JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream)); 3533 pGRD->Continue_decode(pPause);
2701 SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJ Big2_Image*)); 3534 }
2702 FXSYS_memset(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*)); 3535 if (GSPLANES[GSBPP - 1] == NULL) {
2703 SDNEWSYMWIDTHS = NULL; 3536 goto failed;
2704 BHC = NULL; 3537 }
2705 if(SDREFAGG == 0) { 3538 J = GSBPP - 2;
2706 SDNEWSYMWIDTHS = (FX_DWORD *)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, size of(FX_DWORD)); 3539 while (J >= 0) {
2707 FXSYS_memset(SDNEWSYMWIDTHS, 0 , SDNUMNEWSYMS * sizeof(FX_DWORD)); 3540 FXCODEC_STATUS status =
2708 } 3541 pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext);
2709 HCHEIGHT = 0; 3542 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
2710 NSYMSDECODED = 0; 3543 pGRD->Continue_decode(pPause);
2711 BS = NULL; 3544 }
2712 while(NSYMSDECODED < SDNUMNEWSYMS) { 3545 if (GSPLANES[J] == NULL) {
2713 if(pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { 3546 for (K = GSBPP - 1; K > J; K--) {
2714 m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffma n): too short."); 3547 delete GSPLANES[K];
2715 goto failed; 3548 goto failed;
2716 } 3549 }
2717 HCHEIGHT = HCHEIGHT + HCDH; 3550 }
2718 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { 3551 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
2719 m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffma n): invalid HCHEIGHT value."); 3552 J = J - 1;
2720 goto failed; 3553 }
2721 } 3554 for (y = 0; y < GSH; y++) {
2722 SYMWIDTH = 0; 3555 for (x = 0; x < GSW; x++) {
2723 TOTWIDTH = 0; 3556 for (J = 0; J < GSBPP; J++) {
2724 HCFIRSTSYM = NSYMSDECODED; 3557 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
2725 for(;;) { 3558 }
2726 nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW); 3559 }
2727 if(nVal == JBIG2_OOB) { 3560 }
2728 break; 3561 for (J = 0; J < GSBPP; J++) {
2729 } else if(nVal != 0) { 3562 delete GSPLANES[J];
2730 m_pModule->JBig2_Error("symbol dictionary decoding procedure (hu ffman): too short."); 3563 }
2731 goto failed; 3564 m_pModule->JBig2_Free(GSPLANES);
2732 } else { 3565 delete pGRD;
2733 if (NSYMSDECODED >= SDNUMNEWSYMS) { 3566 return GSVALS;
2734 m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): NSYMSDECODED >= SDNUMNEWSYMS.");
2735 goto failed;
2736 }
2737 SYMWIDTH = SYMWIDTH + DW;
2738 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
2739 m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid SYMWIDTH value.");
2740 goto failed;
2741 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
2742 TOTWIDTH = TOTWIDTH + SYMWIDTH;
2743 SDNEWSYMS[NSYMSDECODED] = NULL;
2744 NSYMSDECODED = NSYMSDECODED + 1;
2745 continue;
2746 }
2747 TOTWIDTH = TOTWIDTH + SYMWIDTH;
2748 }
2749 if(SDREFAGG == 1) {
2750 if(pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNIN ST) != 0) {
2751 m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
2752 goto failed;
2753 }
2754 BS = NULL;
2755 if(REFAGGNINST > 1) {
2756 CJBig2_TRDProc *pDecoder;
2757 JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());
2758 pDecoder->SBHUFF = SDHUFF;
2759 pDecoder->SBREFINE = 1;
2760 pDecoder->SBW = SYMWIDTH;
2761 pDecoder->SBH = HCHEIGHT;
2762 pDecoder->SBNUMINSTANCES = REFAGGNINST;
2763 pDecoder->SBSTRIPS = 1;
2764 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
2765 SBNUMSYMS = pDecoder->SBNUMSYMS;
2766 SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBN UMSYMS, sizeof(JBig2HuffmanCode));
2767 nTmp = 1;
2768 while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
2769 nTmp ++;
2770 }
2771 for(I = 0; I < SBNUMSYMS; I++) {
2772 SBSYMCODES[I].codelen = nTmp;
2773 SBSYMCODES[I].code = I;
2774 }
2775 pDecoder->SBSYMCODES = SBSYMCODES;
2776 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
2777 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_I mage*));
2778 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
2779 pDecoder->SBSYMS = SBSYMS;
2780 pDecoder->SBDEFPIXEL = 0;
2781 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
2782 pDecoder->TRANSPOSED = 0;
2783 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
2784 pDecoder->SBDSOFFSET = 0;
2785 JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,
2786 sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine) , HuffmanTable_HTOOB_B6));
2787 JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,
2788 sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine) , HuffmanTable_HTOOB_B8));
2789 JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,
2790 sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B11));
2791 JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,
2792 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B15));
2793 JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,
2794 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B15));
2795 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
2796 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B15));
2797 JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,
2798 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B15));
2799 JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1 ,
2800 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine) , HuffmanTable_HTOOB_B1));
2801 pDecoder->SBHUFFFS = SBHUFFFS;
2802 pDecoder->SBHUFFDS = SBHUFFDS;
2803 pDecoder->SBHUFFDT = SBHUFFDT;
2804 pDecoder->SBHUFFRDW = SBHUFFRDW;
2805 pDecoder->SBHUFFRDH = SBHUFFRDH;
2806 pDecoder->SBHUFFRDX = SBHUFFRDX;
2807 pDecoder->SBHUFFRDY = SBHUFFRDY;
2808 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;
2809 pDecoder->SBRTEMPLATE = SDRTEMPLATE;
2810 pDecoder->SBRAT[0] = SDRAT[0];
2811 pDecoder->SBRAT[1] = SDRAT[1];
2812 pDecoder->SBRAT[2] = SDRAT[2];
2813 pDecoder->SBRAT[3] = SDRAT[3];
2814 BS = pDecoder->decode_Huffman(pStream, grContext);
2815 if(BS == NULL) {
2816 m_pModule->JBig2_Free(SBSYMCODES);
2817 m_pModule->JBig2_Free(SBSYMS);
2818 delete SBHUFFFS;
2819 delete SBHUFFDS;
2820 delete SBHUFFDT;
2821 delete SBHUFFRDW;
2822 delete SBHUFFRDH;
2823 delete SBHUFFRDX;
2824 delete SBHUFFRDY;
2825 delete SBHUFFRSIZE;
2826 delete pDecoder;
2827 goto failed;
2828 }
2829 m_pModule->JBig2_Free(SBSYMCODES);
2830 m_pModule->JBig2_Free(SBSYMS);
2831 delete SBHUFFFS;
2832 delete SBHUFFDS;
2833 delete SBHUFFDT;
2834 delete SBHUFFRDW;
2835 delete SBHUFFRDH;
2836 delete SBHUFFRDX;
2837 delete SBHUFFRDY;
2838 delete SBHUFFRSIZE;
2839 delete pDecoder;
2840 } else if(REFAGGNINST == 1) {
2841 SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS;
2842 nTmp = 1;
2843 while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
2844 nTmp ++;
2845 }
2846 SBSYMCODELEN = (uint8_t)nTmp;
2847 SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBN UMSYMS, sizeof(JBig2HuffmanCode));
2848 for(I = 0; I < SBNUMSYMS; I++) {
2849 SBSYMCODES[I].codelen = SBSYMCODELEN;
2850 SBSYMCODES[I].code = I;
2851 }
2852 nVal = 0;
2853 nBits = 0;
2854 for(;;) {
2855 if(pStream->read1Bit(&nTmp) != 0) {
2856 m_pModule->JBig2_Free(SBSYMCODES);
2857 m_pModule->JBig2_Error("symbol dictionary decoding p rocedure (huffman): too short.");
2858 goto failed;
2859 }
2860 nVal = (nVal << 1) | nTmp;
2861 for(IDI = 0; IDI < SBNUMSYMS; IDI++) {
2862 if((nVal == SBSYMCODES[IDI].code)
2863 && (nBits == SBSYMCODES[IDI].codelen)) {
2864 break;
2865 }
2866 }
2867 if(IDI < SBNUMSYMS) {
2868 break;
2869 }
2870 }
2871 m_pModule->JBig2_Free(SBSYMCODES);
2872 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
2873 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine ), HuffmanTable_HTOOB_B15));
2874 JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1 ,
2875 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine) , HuffmanTable_HTOOB_B1));
2876 if((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)
2877 || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0)
2878 || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal ) != 0)) {
2879 delete SBHUFFRDX;
2880 delete SBHUFFRSIZE;
2881 m_pModule->JBig2_Error("symbol dictionary decoding proce dure (huffman): too short.");
2882 goto failed;
2883 }
2884 delete SBHUFFRDX;
2885 delete SBHUFFRSIZE;
2886 pStream->alignByte();
2887 nTmp = pStream->getOffset();
2888 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
2889 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_I mage*));
2890 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
2891 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
2892 pGRRD->GRW = SYMWIDTH;
2893 pGRRD->GRH = HCHEIGHT;
2894 pGRRD->GRTEMPLATE = SDRTEMPLATE;
2895 pGRRD->GRREFERENCE = SBSYMS[IDI];
2896 pGRRD->GRREFERENCEDX = RDXI;
2897 pGRRD->GRREFERENCEDY = RDYI;
2898 pGRRD->TPGRON = 0;
2899 pGRRD->GRAT[0] = SDRAT[0];
2900 pGRRD->GRAT[1] = SDRAT[1];
2901 pGRRD->GRAT[2] = SDRAT[2];
2902 pGRRD->GRAT[3] = SDRAT[3];
2903 JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));
2904 BS = pGRRD->decode(pArithDecoder, grContext);
2905 if(BS == NULL) {
2906 m_pModule->JBig2_Free(SBSYMS);
2907 delete pGRRD;
2908 delete pArithDecoder;
2909 goto failed;
2910 }
2911 pStream->alignByte();
2912 pStream->offset(2);
2913 if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
2914 delete BS;
2915 m_pModule->JBig2_Free(SBSYMS);
2916 delete pGRRD;
2917 delete pArithDecoder;
2918 m_pModule->JBig2_Error("symbol dictionary decoding proce dure (huffman):"
2919 "bytes processed by generic refin ement region decoding procedure doesn't equal SBHUFFRSIZE.");
2920 goto failed;
2921 }
2922 m_pModule->JBig2_Free(SBSYMS);
2923 delete pGRRD;
2924 delete pArithDecoder;
2925 }
2926 SDNEWSYMS[NSYMSDECODED] = BS;
2927 }
2928 if(SDREFAGG == 0) {
2929 SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH;
2930 }
2931 NSYMSDECODED = NSYMSDECODED + 1;
2932 }
2933 if(SDREFAGG == 0) {
2934 if(pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (int32_t*)&BMSIZE) != 0) {
2935 m_pModule->JBig2_Error("symbol dictionary decoding procedure (hu ffman): too short.");
2936 goto failed;
2937 }
2938 pStream->alignByte();
2939 if(BMSIZE == 0) {
2940 stride = (TOTWIDTH + 7) >> 3;
2941 if(pStream->getByteLeft() >= stride * HCHEIGHT) {
2942 JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT));
2943 for(I = 0; I < HCHEIGHT; I ++) {
2944 JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, pStream- >getPointer(), stride);
2945 pStream->offset(stride);
2946 }
2947 } else {
2948 m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
2949 goto failed;
2950 }
2951 } else {
2952 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
2953 pGRD->MMR = 1;
2954 pGRD->GBW = TOTWIDTH;
2955 pGRD->GBH = HCHEIGHT;
2956 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream);
2957 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
2958 pGRD->Continue_decode(pPause);
2959 }
2960 delete pGRD;
2961 pStream->alignByte();
2962 }
2963 nTmp = 0;
2964 if (!BHC) {
2965 continue;
2966 }
2967 for(I = HCFIRSTSYM; I < NSYMSDECODED; I++) {
2968 SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGH T);
2969 nTmp += SDNEWSYMWIDTHS[I];
2970 }
2971 delete BHC;
2972 BHC = NULL;
2973 }
2974 }
2975 EXINDEX = 0;
2976 CUREXFLAG = 0;
2977 JBIG2_ALLOC(pTable, CJBig2_HuffmanTable(HuffmanTable_B1,
2978 sizeof(HuffmanTable_B1) / sizeof(JBi g2TableLine), HuffmanTable_HTOOB_B1));
2979 EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));
2980 while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
2981 if(pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) {
2982 delete pTable;
2983 m_pModule->JBig2_Free(EXFLAGS);
2984 m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffma n): too short.");
2985 goto failed;
2986 }
2987 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
2988 delete pTable;
2989 m_pModule->JBig2_Free(EXFLAGS);
2990 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith) : Invalid EXRUNLENGTH value.");
2991 goto failed;
2992 }
2993 if(EXRUNLENGTH != 0) {
2994 for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
2995 EXFLAGS[I] = CUREXFLAG;
2996 }
2997 }
2998 EXINDEX = EXINDEX + EXRUNLENGTH;
2999 CUREXFLAG = !CUREXFLAG;
3000 }
3001 delete pTable;
3002 JBIG2_ALLOC(pDict, CJBig2_SymbolDict());
3003 pDict->SDNUMEXSYMS = SDNUMEXSYMS;
3004 pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Ima ge*), SDNUMEXSYMS);
3005 I = J = 0;
3006 for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
3007 if(EXFLAGS[I] && J < SDNUMEXSYMS) {
3008 if(I < SDNUMINSYMS) {
3009 JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));
3010 } else {
3011 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
3012 }
3013 J = J + 1;
3014 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
3015 delete SDNEWSYMS[I - SDNUMINSYMS];
3016 }
3017 }
3018 if (J < SDNUMEXSYMS) {
3019 pDict->SDNUMEXSYMS = J;
3020 }
3021 m_pModule->JBig2_Free(EXFLAGS);
3022 m_pModule->JBig2_Free(SDNEWSYMS);
3023 if(SDREFAGG == 0) {
3024 m_pModule->JBig2_Free(SDNEWSYMWIDTHS);
3025 }
3026 delete pHuffmanDecoder;
3027 return pDict;
3028 failed: 3567 failed:
3029 for(I = 0; I < NSYMSDECODED; I++) { 3568 m_pModule->JBig2_Free(GSPLANES);
3030 delete SDNEWSYMS[I]; 3569 delete pGRD;
3031 } 3570 m_pModule->JBig2_Free(GSVALS);
3032 m_pModule->JBig2_Free(SDNEWSYMS); 3571 return NULL;
3033 if(SDREFAGG == 0) { 3572 }
3034 m_pModule->JBig2_Free(SDNEWSYMWIDTHS); 3573 FX_DWORD* CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream* pStream,
3035 } 3574 IFX_Pause* pPause) {
3036 delete pHuffmanDecoder; 3575 CJBig2_Image** GSPLANES;
3576 int32_t J, K;
3577 FX_DWORD x, y;
3578 FX_DWORD* GSVALS;
3579 CJBig2_GRDProc* pGRD;
3580 GSPLANES =
3581 (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);
3582 if (!GSPLANES) {
3037 return NULL; 3583 return NULL;
3038 } 3584 }
3039 CJBig2_Image *CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, 3585 GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);
3040 JBig2ArithCtx *gbContext, IFX_Pause* pPause) 3586 if (!GSVALS) {
3041 { 3587 if (GSPLANES) {
3042 FX_DWORD ng, mg; 3588 m_pModule->JBig2_Free(GSPLANES);
3043 int32_t x, y; 3589 }
3044 CJBig2_Image *HSKIP; 3590 return NULL;
3045 FX_DWORD HBPP; 3591 }
3046 FX_DWORD *GI; 3592 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP);
3047 CJBig2_Image *HTREG; 3593 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH);
3048 CJBig2_GSIDProc *pGID; 3594 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
3049 JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH)); 3595 pGRD->MMR = GSMMR;
3050 HTREG->fill(HDEFPIXEL); 3596 pGRD->GBW = GSW;
3051 HSKIP = NULL; 3597 pGRD->GBH = GSH;
3052 if(HENABLESKIP == 1) { 3598 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream);
3053 JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH)); 3599 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3054 for(mg = 0; mg < HGH; mg++) { 3600 pGRD->Continue_decode(pPause);
3055 for(ng = 0; ng < HGW; ng++) { 3601 }
3056 x = (HGX + mg * HRY + ng * HRX) >> 8; 3602 if (GSPLANES[GSBPP - 1] == NULL) {
3057 y = (HGY + mg * HRX - ng * HRY) >> 8; 3603 goto failed;
3058 if((x + HPW <= 0) | (x >= (int32_t)HBW) 3604 }
3059 | (y + HPH <= 0) | (y >= (int32_t)HPH)) { 3605 pStream->alignByte();
3060 HSKIP->setPixel(ng, mg, 1); 3606 pStream->offset(3);
3061 } else { 3607 J = GSBPP - 2;
3062 HSKIP->setPixel(ng, mg, 0); 3608 while (J >= 0) {
3063 } 3609 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream);
3064 } 3610 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3065 } 3611 pGRD->Continue_decode(pPause);
3066 } 3612 }
3067 HBPP = 1; 3613 if (GSPLANES[J] == NULL) {
3068 while((FX_DWORD)(1 << HBPP) < HNUMPATS) { 3614 for (K = GSBPP - 1; K > J; K--) {
3069 HBPP ++; 3615 delete GSPLANES[K];
3070 }
3071 JBIG2_ALLOC(pGID, CJBig2_GSIDProc());
3072 pGID->GSMMR = HMMR;
3073 pGID->GSW = HGW;
3074 pGID->GSH = HGH;
3075 pGID->GSBPP = (uint8_t)HBPP;
3076 pGID->GSUSESKIP = HENABLESKIP;
3077 pGID->GSKIP = HSKIP;
3078 pGID->GSTEMPLATE = HTEMPLATE;
3079 GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause);
3080 if(GI == NULL) {
3081 goto failed; 3616 goto failed;
3082 } 3617 }
3083 for(mg = 0; mg < HGH; mg++) {
3084 for(ng = 0; ng < HGW; ng++) {
3085 x = (HGX + mg * HRY + ng * HRX) >> 8;
3086 y = (HGY + mg * HRX - ng * HRY) >> 8;
3087 FX_DWORD pat_index = GI[mg * HGW + ng];
3088 if (pat_index >= HNUMPATS) {
3089 pat_index = HNUMPATS - 1;
3090 }
3091 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
3092 }
3093 }
3094 m_pModule->JBig2_Free(GI);
3095 delete HSKIP;
3096 delete pGID;
3097 return HTREG;
3098 failed:
3099 delete HSKIP;
3100 delete pGID;
3101 delete HTREG;
3102 return NULL;
3103 }
3104 CJBig2_Image *CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)
3105 {
3106 FX_DWORD ng, mg;
3107 int32_t x, y;
3108 FX_DWORD HBPP;
3109 FX_DWORD *GI;
3110 CJBig2_Image *HTREG;
3111 CJBig2_GSIDProc *pGID;
3112 JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));
3113 HTREG->fill(HDEFPIXEL);
3114 HBPP = 1;
3115 while((FX_DWORD)(1 << HBPP) < HNUMPATS) {
3116 HBPP ++;
3117 }
3118 JBIG2_ALLOC(pGID, CJBig2_GSIDProc());
3119 pGID->GSMMR = HMMR;
3120 pGID->GSW = HGW;
3121 pGID->GSH = HGH;
3122 pGID->GSBPP = (uint8_t)HBPP;
3123 pGID->GSUSESKIP = 0;
3124 GI = pGID->decode_MMR(pStream, pPause);
3125 if(GI == NULL) {
3126 goto failed;
3127 }
3128 for(mg = 0; mg < HGH; mg++) {
3129 for(ng = 0; ng < HGW; ng++) {
3130 x = (HGX + mg * HRY + ng * HRX) >> 8;
3131 y = (HGY + mg * HRX - ng * HRY) >> 8;
3132 FX_DWORD pat_index = GI[mg * HGW + ng];
3133 if (pat_index >= HNUMPATS) {
3134 pat_index = HNUMPATS - 1;
3135 }
3136 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
3137 }
3138 }
3139 m_pModule->JBig2_Free(GI);
3140 delete pGID;
3141 return HTREG;
3142 failed:
3143 delete pGID;
3144 delete HTREG;
3145 return NULL;
3146 }
3147 CJBig2_PatternDict *CJBig2_PDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDeco der,
3148 JBig2ArithCtx *gbContext, IFX_Pause* pPause)
3149 {
3150 FX_DWORD GRAY;
3151 CJBig2_Image *BHDC = NULL;
3152 CJBig2_PatternDict *pDict;
3153 CJBig2_GRDProc *pGRD;
3154 JBIG2_ALLOC(pDict, CJBig2_PatternDict());
3155 pDict->NUMPATS = GRAYMAX + 1;
3156 pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image *), pDict->NUMPATS);
3157 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);
3158 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
3159 pGRD->MMR = HDMMR;
3160 pGRD->GBW = (GRAYMAX + 1) * HDPW;
3161 pGRD->GBH = HDPH;
3162 pGRD->GBTEMPLATE = HDTEMPLATE;
3163 pGRD->TPGDON = 0;
3164 pGRD->USESKIP = 0;
3165 pGRD->GBAT[0] = -(int32_t)HDPW;
3166 pGRD->GBAT[1] = 0;
3167 if(pGRD->GBTEMPLATE == 0) {
3168 pGRD->GBAT[2] = -3;
3169 pGRD->GBAT[3] = -1;
3170 pGRD->GBAT[4] = 2;
3171 pGRD->GBAT[5] = -2;
3172 pGRD->GBAT[6] = -2;
3173 pGRD->GBAT[7] = -2;
3174 }
3175 FXCODEC_STATUS status = pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbCon text);
3176 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3177 pGRD->Continue_decode(pPause);
3178 }
3179 if(BHDC == NULL) {
3180 delete pGRD;
3181 goto failed;
3182 }
3183 delete pGRD;
3184 GRAY = 0;
3185 while(GRAY <= GRAYMAX) {
3186 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
3187 GRAY = GRAY + 1;
3188 }
3189 delete BHDC;
3190 return pDict;
3191 failed:
3192 delete pDict;
3193 return NULL;
3194 }
3195
3196 CJBig2_PatternDict *CJBig2_PDDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pa use* pPause)
3197 {
3198 FX_DWORD GRAY;
3199 CJBig2_Image *BHDC = NULL;
3200 CJBig2_PatternDict *pDict;
3201 CJBig2_GRDProc *pGRD;
3202 JBIG2_ALLOC(pDict, CJBig2_PatternDict());
3203 pDict->NUMPATS = GRAYMAX + 1;
3204 pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image *), pDict->NUMPATS);
3205 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);
3206 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
3207 pGRD->MMR = HDMMR;
3208 pGRD->GBW = (GRAYMAX + 1) * HDPW;
3209 pGRD->GBH = HDPH;
3210 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream);
3211 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3212 pGRD->Continue_decode(pPause);
3213 }
3214 if(BHDC == NULL) {
3215 delete pGRD;
3216 goto failed;
3217 }
3218 delete pGRD;
3219 GRAY = 0;
3220 while(GRAY <= GRAYMAX) {
3221 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
3222 GRAY = GRAY + 1;
3223 }
3224 delete BHDC;
3225 return pDict;
3226 failed:
3227 delete pDict;
3228 return NULL;
3229 }
3230 FX_DWORD *CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
3231 JBig2ArithCtx *gbContext, IFX_Pause* pPa use)
3232 {
3233 CJBig2_Image **GSPLANES;
3234 int32_t J, K;
3235 FX_DWORD x, y;
3236 FX_DWORD *GSVALS;
3237 CJBig2_GRDProc *pGRD;
3238 GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);
3239 if (!GSPLANES) {
3240 return NULL;
3241 }
3242 GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);
3243 if (!GSVALS) {
3244 m_pModule->JBig2_Free(GSPLANES);
3245 return NULL;
3246 }
3247 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);
3248 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);
3249 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
3250 pGRD->MMR = GSMMR;
3251 pGRD->GBW = GSW;
3252 pGRD->GBH = GSH;
3253 pGRD->GBTEMPLATE = GSTEMPLATE;
3254 pGRD->TPGDON = 0;
3255 pGRD->USESKIP = GSUSESKIP;
3256 pGRD->SKIP = GSKIP;
3257 if(GSTEMPLATE <= 1) {
3258 pGRD->GBAT[0] = 3;
3259 } else {
3260 pGRD->GBAT[0] = 2;
3261 }
3262 pGRD->GBAT[1] = -1;
3263 if(pGRD->GBTEMPLATE == 0) {
3264 pGRD->GBAT[2] = -3;
3265 pGRD->GBAT[3] = -1;
3266 pGRD->GBAT[4] = 2;
3267 pGRD->GBAT[5] = -2;
3268 pGRD->GBAT[6] = -2;
3269 pGRD->GBAT[7] = -2;
3270 }
3271 FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArit hDecoder, gbContext);
3272 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3273 pGRD->Continue_decode(pPause);
3274 }
3275 if(GSPLANES[GSBPP - 1] == NULL) {
3276 goto failed;
3277 }
3278 J = GSBPP - 2;
3279 while(J >= 0) {
3280 FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[J], pArithDec oder, gbContext);
3281 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3282 pGRD->Continue_decode(pPause);
3283 }
3284 if(GSPLANES[J] == NULL) {
3285 for(K = GSBPP - 1; K > J; K--) {
3286 delete GSPLANES[K];
3287 goto failed;
3288 }
3289 }
3290 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
3291 J = J - 1;
3292 }
3293 for(y = 0; y < GSH; y++) {
3294 for(x = 0; x < GSW; x++) {
3295 for(J = 0; J < GSBPP; J++) {
3296 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
3297 }
3298 }
3299 }
3300 for(J = 0; J < GSBPP; J++) {
3301 delete GSPLANES[J];
3302 }
3303 m_pModule->JBig2_Free(GSPLANES);
3304 delete pGRD;
3305 return GSVALS;
3306 failed:
3307 m_pModule->JBig2_Free(GSPLANES);
3308 delete pGRD;
3309 m_pModule->JBig2_Free(GSVALS);
3310 return NULL;
3311 }
3312 FX_DWORD *CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPau se)
3313 {
3314 CJBig2_Image **GSPLANES;
3315 int32_t J, K;
3316 FX_DWORD x, y;
3317 FX_DWORD *GSVALS;
3318 CJBig2_GRDProc *pGRD;
3319 GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);
3320 if (!GSPLANES) {
3321 return NULL;
3322 }
3323 GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);
3324 if (!GSVALS) {
3325 if (GSPLANES) {
3326 m_pModule->JBig2_Free(GSPLANES);
3327 }
3328 return NULL;
3329 }
3330 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);
3331 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);
3332 JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
3333 pGRD->MMR = GSMMR;
3334 pGRD->GBW = GSW;
3335 pGRD->GBH = GSH;
3336 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream );
3337 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3338 pGRD->Continue_decode(pPause);
3339 }
3340 if(GSPLANES[GSBPP - 1] == NULL) {
3341 goto failed;
3342 } 3618 }
3343 pStream->alignByte(); 3619 pStream->alignByte();
3344 pStream->offset(3); 3620 pStream->offset(3);
3345 J = GSBPP - 2; 3621 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
3346 while(J >= 0) { 3622 J = J - 1;
3347 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream); 3623 }
3348 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 3624 for (y = 0; y < GSH; y++) {
3349 pGRD->Continue_decode(pPause); 3625 for (x = 0; x < GSW; x++) {
3350 } 3626 for (J = 0; J < GSBPP; J++) {
3351 if(GSPLANES[J] == NULL) { 3627 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
3352 for(K = GSBPP - 1; K > J; K--) { 3628 }
3353 delete GSPLANES[K]; 3629 }
3354 goto failed; 3630 }
3355 } 3631 for (J = 0; J < GSBPP; J++) {
3356 } 3632 delete GSPLANES[J];
3357 pStream->alignByte(); 3633 }
3358 pStream->offset(3); 3634 m_pModule->JBig2_Free(GSPLANES);
3359 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); 3635 delete pGRD;
3360 J = J - 1; 3636 return GSVALS;
3361 }
3362 for(y = 0; y < GSH; y++) {
3363 for(x = 0; x < GSW; x++) {
3364 for(J = 0; J < GSBPP; J++) {
3365 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
3366 }
3367 }
3368 }
3369 for(J = 0; J < GSBPP; J++) {
3370 delete GSPLANES[J];
3371 }
3372 m_pModule->JBig2_Free(GSPLANES);
3373 delete pGRD;
3374 return GSVALS;
3375 failed: 3637 failed:
3376 m_pModule->JBig2_Free(GSPLANES); 3638 m_pModule->JBig2_Free(GSPLANES);
3377 delete pGRD; 3639 delete pGRD;
3378 m_pModule->JBig2_Free(GSVALS); 3640 m_pModule->JBig2_Free(GSVALS);
3379 return NULL; 3641 return NULL;
3380 } 3642 }
3381 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) 3643 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith(
3382 { 3644 CJBig2_Image** pImage,
3383 if (GBW == 0 || GBH == 0) { 3645 CJBig2_ArithDecoder* pArithDecoder,
3384 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 3646 JBig2ArithCtx* gbContext,
3385 return FXCODEC_STATUS_DECODE_FINISH; 3647 IFX_Pause* pPause) {
3386 } 3648 if (GBW == 0 || GBH == 0) {
3387 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
3388 m_pPause = pPause;
3389 if(*pImage == NULL) {
3390 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
3391 }
3392 if ((*pImage)->m_pData == NULL) {
3393 delete *pImage;
3394 *pImage = NULL;
3395 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
3396 m_ProssiveStatus = FXCODEC_STATUS_ERROR;
3397 return FXCODEC_STATUS_ERROR;
3398 }
3399 m_DecodeType = 1;
3400 m_pImage = pImage;
3401 (*m_pImage)->fill(0);
3402 m_pArithDecoder = pArithDecoder;
3403 m_gbContext = gbContext;
3404 LTP = 0;
3405 m_pLine = NULL;
3406 m_loopIndex = 0;
3407 return decode_Arith(pPause);
3408 }
3409 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause)
3410 {
3411 int iline = m_loopIndex;
3412 CJBig2_Image* pImage = *m_pImage;
3413 if(GBTEMPLATE == 0) {
3414 if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)
3415 && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)
3416 && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)
3417 && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {
3418 m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecod er, m_gbContext, pPause);
3419 } else {
3420 m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDeco der, m_gbContext, pPause);
3421 }
3422 } else if(GBTEMPLATE == 1) {
3423 if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {
3424 m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecod er, m_gbContext, pPause);
3425 } else {
3426 m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDeco der, m_gbContext, pPause);
3427 }
3428 } else if(GBTEMPLATE == 2) {
3429 if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
3430 m_ProssiveStatus = decode_Arith_Template2_opt3(pImage, m_pArithDeco der, m_gbContext, pPause);
3431 } else {
3432 m_ProssiveStatus = decode_Arith_Template2_unopt(pImage, m_pArithDec oder, m_gbContext, pPause);
3433 }
3434 } else {
3435 if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
3436 m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecod er, m_gbContext, pPause);
3437 } else {
3438 m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDeco der, m_gbContext, pPause);
3439 }
3440 }
3441 m_ReplaceRect.left = 0;
3442 m_ReplaceRect.right = pImage->m_nWidth;
3443 m_ReplaceRect.top = iline;
3444 m_ReplaceRect.bottom = m_loopIndex;
3445 if(m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) {
3446 m_loopIndex = 0;
3447 }
3448 return m_ProssiveStatus;
3449 }
3450 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2(CJBig2_Image** pImage, CJBi g2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
3451 {
3452 if(GBW == 0 || GBH == 0) {
3453 * pImage = NULL;
3454 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3455 return FXCODEC_STATUS_DECODE_FINISH;
3456 }
3457 if(*pImage == NULL) {
3458 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
3459 }
3460 if ((*pImage)->m_pData == NULL) {
3461 delete *pImage;
3462 *pImage = NULL;
3463 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
3464 m_ProssiveStatus = FXCODEC_STATUS_ERROR;
3465 return FXCODEC_STATUS_ERROR;
3466 }
3467 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
3468 m_DecodeType = 2;
3469 m_pPause = pPause;
3470 m_pImage = pImage;
3471 (*m_pImage)->fill(0);
3472 LTP = 0;
3473 m_loopIndex = 0;
3474 m_pArithDecoder = pArithDecoder;
3475 m_gbContext = gbContext;
3476 return decode_Arith_V2(pPause);
3477 }
3478 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause)
3479 {
3480 FX_BOOL SLTP, bVal;
3481 FX_DWORD CONTEXT;
3482 CJBig2_Image *GBREG = *m_pImage;
3483 FX_DWORD line1, line2, line3;
3484 LTP = 0;
3485 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
3486 GBREG->fill(0);
3487 for(; m_loopIndex < GBH; m_loopIndex++) {
3488 if(TPGDON) {
3489 switch(GBTEMPLATE) {
3490 case 0:
3491 CONTEXT = 0x9b25;
3492 break;
3493 case 1:
3494 CONTEXT = 0x0795;
3495 break;
3496 case 2:
3497 CONTEXT = 0x00e5;
3498 break;
3499 case 3:
3500 CONTEXT = 0x0195;
3501 break;
3502 }
3503 SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
3504 LTP = LTP ^ SLTP;
3505 }
3506 if(LTP == 1) {
3507 GBREG->copyLine(m_loopIndex, m_loopIndex - 1);
3508 } else {
3509 switch(GBTEMPLATE) {
3510 case 0: {
3511 line1 = GBREG->getPixel(1, m_loopIndex - 2);
3512 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;
3513 line2 = GBREG->getPixel(2, m_loopIndex - 1);
3514 line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;
3515 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;
3516 line3 = 0;
3517 for(FX_DWORD w = 0; w < GBW; w++) {
3518 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
3519 bVal = 0;
3520 } else {
3521 CONTEXT = line3;
3522 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIn dex + GBAT[1]) << 4;
3523 CONTEXT |= line2 << 5;
3524 CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIn dex + GBAT[3]) << 10;
3525 CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIn dex + GBAT[5]) << 11;
3526 CONTEXT |= line1 << 12;
3527 CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIn dex + GBAT[7]) << 15;
3528 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONT EXT]);
3529 }
3530 if(bVal) {
3531 GBREG->setPixel(w, m_loopIndex, bVal);
3532 }
3533 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loo pIndex - 2)) & 0x07;
3534 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loo pIndex - 1)) & 0x1f;
3535 line3 = ((line3 << 1) | bVal) & 0x0f;
3536 }
3537 }
3538 break;
3539 case 1: {
3540 line1 = GBREG->getPixel(2, m_loopIndex - 2);
3541 line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1;
3542 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2;
3543 line2 = GBREG->getPixel(2, m_loopIndex - 1);
3544 line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;
3545 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;
3546 line3 = 0;
3547 for(FX_DWORD w = 0; w < GBW; w++) {
3548 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
3549 bVal = 0;
3550 } else {
3551 CONTEXT = line3;
3552 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIn dex + GBAT[1]) << 3;
3553 CONTEXT |= line2 << 4;
3554 CONTEXT |= line1 << 9;
3555 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONT EXT]);
3556 }
3557 if(bVal) {
3558 GBREG->setPixel(w, m_loopIndex, bVal);
3559 }
3560 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, m_loo pIndex - 2)) & 0x0f;
3561 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loo pIndex - 1)) & 0x1f;
3562 line3 = ((line3 << 1) | bVal) & 0x07;
3563 }
3564 }
3565 break;
3566 case 2: {
3567 line1 = GBREG->getPixel(1, m_loopIndex - 2);
3568 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;
3569 line2 = GBREG->getPixel(1, m_loopIndex - 1);
3570 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;
3571 line3 = 0;
3572 for(FX_DWORD w = 0; w < GBW; w++) {
3573 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
3574 bVal = 0;
3575 } else {
3576 CONTEXT = line3;
3577 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIn dex + GBAT[1]) << 2;
3578 CONTEXT |= line2 << 3;
3579 CONTEXT |= line1 << 7;
3580 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONT EXT]);
3581 }
3582 if(bVal) {
3583 GBREG->setPixel(w, m_loopIndex, bVal);
3584 }
3585 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loo pIndex - 2)) & 0x07;
3586 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, m_loo pIndex - 1)) & 0x0f;
3587 line3 = ((line3 << 1) | bVal) & 0x03;
3588 }
3589 }
3590 break;
3591 case 3: {
3592 line1 = GBREG->getPixel(1, m_loopIndex - 1);
3593 line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;
3594 line2 = 0;
3595 for(FX_DWORD w = 0; w < GBW; w++) {
3596 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
3597 bVal = 0;
3598 } else {
3599 CONTEXT = line2;
3600 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIn dex + GBAT[1]) << 4;
3601 CONTEXT |= line1 << 5;
3602 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONT EXT]);
3603 }
3604 if(bVal) {
3605 GBREG->setPixel(w, m_loopIndex, bVal);
3606 }
3607 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loo pIndex - 1)) & 0x1f;
3608 line2 = ((line2 << 1) | bVal) & 0x0f;
3609 }
3610 }
3611 break;
3612 }
3613 }
3614 if(pPause && pPause->NeedToPauseNow()) {
3615 m_loopIndex ++;
3616 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
3617 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
3618 }
3619 }
3620 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 3649 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3621 return FXCODEC_STATUS_DECODE_FINISH; 3650 return FXCODEC_STATUS_DECODE_FINISH;
3622 } 3651 }
3623 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1(CJBig2_Image** pImage, CJBi g2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) 3652 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
3624 { 3653 m_pPause = pPause;
3625 if(GBW == 0 || GBH == 0) { 3654 if (*pImage == NULL) {
3626 * pImage = NULL; 3655 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
3627 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 3656 }
3628 return FXCODEC_STATUS_DECODE_FINISH; 3657 if ((*pImage)->m_pData == NULL) {
3629 } 3658 delete *pImage;
3630 if(*pImage == NULL) { 3659 *pImage = NULL;
3631 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); 3660 m_pModule->JBig2_Error(
3632 } 3661 "Generic region decoding procedure: Create Image Failed with width = "
3633 if ((*pImage)->m_pData == NULL) { 3662 "%d, height = %d\n",
3634 delete *pImage; 3663 GBW, GBH);
3635 *pImage = NULL; 3664 m_ProssiveStatus = FXCODEC_STATUS_ERROR;
3636 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); 3665 return FXCODEC_STATUS_ERROR;
3637 m_ProssiveStatus = FXCODEC_STATUS_ERROR; 3666 }
3638 return FXCODEC_STATUS_ERROR; 3667 m_DecodeType = 1;
3639 } 3668 m_pImage = pImage;
3640 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; 3669 (*m_pImage)->fill(0);
3641 m_pPause = pPause; 3670 m_pArithDecoder = pArithDecoder;
3642 m_pImage = pImage; 3671 m_gbContext = gbContext;
3643 m_DecodeType = 3; 3672 LTP = 0;
3644 (*m_pImage)->fill(0); 3673 m_pLine = NULL;
3645 LTP = 0; 3674 m_loopIndex = 0;
3675 return decode_Arith(pPause);
3676 }
3677 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause) {
3678 int iline = m_loopIndex;
3679 CJBig2_Image* pImage = *m_pImage;
3680 if (GBTEMPLATE == 0) {
3681 if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1) &&
3682 (GBAT[2] == (signed char)-3) && (GBAT[3] == (signed char)-1) &&
3683 (GBAT[4] == 2) && (GBAT[5] == (signed char)-2) &&
3684 (GBAT[6] == (signed char)-2) && (GBAT[7] == (signed char)-2)) {
3685 m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder,
3686 m_gbContext, pPause);
3687 } else {
3688 m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDecoder,
3689 m_gbContext, pPause);
3690 }
3691 } else if (GBTEMPLATE == 1) {
3692 if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1)) {
3693 m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecoder,
3694 m_gbContext, pPause);
3695 } else {
3696 m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDecoder,
3697 m_gbContext, pPause);
3698 }
3699 } else if (GBTEMPLATE == 2) {
3700 if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) {
3701 m_ProssiveStatus = decode_Arith_Template2_opt3(pImage, m_pArithDecoder,
3702 m_gbContext, pPause);
3703 } else {
3704 m_ProssiveStatus = decode_Arith_Template2_unopt(pImage, m_pArithDecoder,
3705 m_gbContext, pPause);
3706 }
3707 } else {
3708 if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) {
3709 m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecoder,
3710 m_gbContext, pPause);
3711 } else {
3712 m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDecoder,
3713 m_gbContext, pPause);
3714 }
3715 }
3716 m_ReplaceRect.left = 0;
3717 m_ReplaceRect.right = pImage->m_nWidth;
3718 m_ReplaceRect.top = iline;
3719 m_ReplaceRect.bottom = m_loopIndex;
3720 if (m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) {
3646 m_loopIndex = 0; 3721 m_loopIndex = 0;
3647 m_pArithDecoder = pArithDecoder; 3722 }
3648 m_gbContext = gbContext; 3723 return m_ProssiveStatus;
3649 return decode_Arith_V1(pPause); 3724 }
3650 } 3725 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2(
3651 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause) 3726 CJBig2_Image** pImage,
3652 { 3727 CJBig2_ArithDecoder* pArithDecoder,
3653 FX_BOOL SLTP, bVal; 3728 JBig2ArithCtx* gbContext,
3654 FX_DWORD CONTEXT = 0; 3729 IFX_Pause* pPause) {
3655 CJBig2_Image *GBREG = (*m_pImage); 3730 if (GBW == 0 || GBH == 0) {
3656 for(; m_loopIndex < GBH; m_loopIndex++) { 3731 *pImage = NULL;
3657 if(TPGDON) {
3658 switch(GBTEMPLATE) {
3659 case 0:
3660 CONTEXT = 0x9b25;
3661 break;
3662 case 1:
3663 CONTEXT = 0x0795;
3664 break;
3665 case 2:
3666 CONTEXT = 0x00e5;
3667 break;
3668 case 3:
3669 CONTEXT = 0x0195;
3670 break;
3671 }
3672 SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
3673 LTP = LTP ^ SLTP;
3674 }
3675 if(LTP == 1) {
3676 for(FX_DWORD w = 0; w < GBW; w++) {
3677 GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex - 1));
3678 }
3679 } else {
3680 for(FX_DWORD w = 0; w < GBW; w++) {
3681 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
3682 GBREG->setPixel(w, m_loopIndex, 0);
3683 } else {
3684 CONTEXT = 0;
3685 switch(GBTEMPLATE) {
3686 case 0:
3687 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
3688 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
3689 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
3690 CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;
3691 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
3692 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) < < 5;
3693 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) < < 6;
3694 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7;
3695 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) < < 8;
3696 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) < < 9;
3697 CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
3698 CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
3699 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) < < 12;
3700 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13 ;
3701 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) < < 14;
3702 CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
3703 break;
3704 case 1:
3705 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
3706 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
3707 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
3708 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;
3709 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) < < 4;
3710 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) < < 5;
3711 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;
3712 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) < < 7;
3713 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) < < 8;
3714 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) < < 9;
3715 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) < < 10;
3716 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11 ;
3717 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) < < 12;
3718 break;
3719 case 2:
3720 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
3721 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
3722 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
3723 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) < < 3;
3724 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4;
3725 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) < < 5;
3726 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) < < 6;
3727 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) < < 7;
3728 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8;
3729 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) < < 9;
3730 break;
3731 case 3:
3732 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
3733 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
3734 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
3735 CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;
3736 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
3737 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) < < 5;
3738 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;
3739 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) < < 7;
3740 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) < < 8;
3741 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) < < 9;
3742 break;
3743 }
3744 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
3745 GBREG->setPixel(w, m_loopIndex, bVal);
3746 }
3747 }
3748 }
3749 if(pPause && pPause->NeedToPauseNow()) {
3750 m_loopIndex ++;
3751 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
3752 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
3753 }
3754 }
3755 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 3732 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3756 return FXCODEC_STATUS_DECODE_FINISH; 3733 return FXCODEC_STATUS_DECODE_FINISH;
3757 } 3734 }
3758 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, CJBig2_Bi tStream *pStream, IFX_Pause* pPause) 3735 if (*pImage == NULL) {
3759 { 3736 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
3760 int bitpos, i; 3737 }
3761 JBIG2_ALLOC((* pImage), CJBig2_Image(GBW, GBH)); 3738 if ((*pImage)->m_pData == NULL) {
3762 if ((* pImage)->m_pData == NULL) { 3739 delete *pImage;
3763 delete (* pImage); 3740 *pImage = NULL;
3764 (* pImage) = NULL; 3741 m_pModule->JBig2_Error(
3765 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); 3742 "Generic region decoding procedure: Create Image Failed with width = "
3766 m_ProssiveStatus = FXCODEC_STATUS_ERROR; 3743 "%d, height = %d\n",
3767 return m_ProssiveStatus; 3744 GBW, GBH);
3768 } 3745 m_ProssiveStatus = FXCODEC_STATUS_ERROR;
3769 bitpos = (int)pStream->getBitPos(); 3746 return FXCODEC_STATUS_ERROR;
3770 _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, (* pImage)->m_pData, GBW, GBH, (* pImage)->m_nStride); 3747 }
3771 pStream->setBitPos(bitpos); 3748 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
3772 for(i = 0; (FX_DWORD)i < (* pImage)->m_nStride * GBH; i++) { 3749 m_DecodeType = 2;
3773 (* pImage)->m_pData[i] = ~(* pImage)->m_pData[i]; 3750 m_pPause = pPause;
3774 } 3751 m_pImage = pImage;
3752 (*m_pImage)->fill(0);
3753 LTP = 0;
3754 m_loopIndex = 0;
3755 m_pArithDecoder = pArithDecoder;
3756 m_gbContext = gbContext;
3757 return decode_Arith_V2(pPause);
3758 }
3759 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause) {
3760 FX_BOOL SLTP, bVal;
3761 FX_DWORD CONTEXT;
3762 CJBig2_Image* GBREG = *m_pImage;
3763 FX_DWORD line1, line2, line3;
3764 LTP = 0;
3765 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
3766 GBREG->fill(0);
3767 for (; m_loopIndex < GBH; m_loopIndex++) {
3768 if (TPGDON) {
3769 switch (GBTEMPLATE) {
3770 case 0:
3771 CONTEXT = 0x9b25;
3772 break;
3773 case 1:
3774 CONTEXT = 0x0795;
3775 break;
3776 case 2:
3777 CONTEXT = 0x00e5;
3778 break;
3779 case 3:
3780 CONTEXT = 0x0195;
3781 break;
3782 }
3783 SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
3784 LTP = LTP ^ SLTP;
3785 }
3786 if (LTP == 1) {
3787 GBREG->copyLine(m_loopIndex, m_loopIndex - 1);
3788 } else {
3789 switch (GBTEMPLATE) {
3790 case 0: {
3791 line1 = GBREG->getPixel(1, m_loopIndex - 2);
3792 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;
3793 line2 = GBREG->getPixel(2, m_loopIndex - 1);
3794 line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;
3795 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;
3796 line3 = 0;
3797 for (FX_DWORD w = 0; w < GBW; w++) {
3798 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) {
3799 bVal = 0;
3800 } else {
3801 CONTEXT = line3;
3802 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1])
3803 << 4;
3804 CONTEXT |= line2 << 5;
3805 CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3])
3806 << 10;
3807 CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5])
3808 << 11;
3809 CONTEXT |= line1 << 12;
3810 CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7])
3811 << 15;
3812 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
3813 }
3814 if (bVal) {
3815 GBREG->setPixel(w, m_loopIndex, bVal);
3816 }
3817 line1 =
3818 ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
3819 line2 =
3820 ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
3821 line3 = ((line3 << 1) | bVal) & 0x0f;
3822 }
3823 } break;
3824 case 1: {
3825 line1 = GBREG->getPixel(2, m_loopIndex - 2);
3826 line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1;
3827 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2;
3828 line2 = GBREG->getPixel(2, m_loopIndex - 1);
3829 line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;
3830 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;
3831 line3 = 0;
3832 for (FX_DWORD w = 0; w < GBW; w++) {
3833 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) {
3834 bVal = 0;
3835 } else {
3836 CONTEXT = line3;
3837 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1])
3838 << 3;
3839 CONTEXT |= line2 << 4;
3840 CONTEXT |= line1 << 9;
3841 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
3842 }
3843 if (bVal) {
3844 GBREG->setPixel(w, m_loopIndex, bVal);
3845 }
3846 line1 =
3847 ((line1 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 2)) & 0x0f;
3848 line2 =
3849 ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
3850 line3 = ((line3 << 1) | bVal) & 0x07;
3851 }
3852 } break;
3853 case 2: {
3854 line1 = GBREG->getPixel(1, m_loopIndex - 2);
3855 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;
3856 line2 = GBREG->getPixel(1, m_loopIndex - 1);
3857 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;
3858 line3 = 0;
3859 for (FX_DWORD w = 0; w < GBW; w++) {
3860 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) {
3861 bVal = 0;
3862 } else {
3863 CONTEXT = line3;
3864 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1])
3865 << 2;
3866 CONTEXT |= line2 << 3;
3867 CONTEXT |= line1 << 7;
3868 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
3869 }
3870 if (bVal) {
3871 GBREG->setPixel(w, m_loopIndex, bVal);
3872 }
3873 line1 =
3874 ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
3875 line2 =
3876 ((line2 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;
3877 line3 = ((line3 << 1) | bVal) & 0x03;
3878 }
3879 } break;
3880 case 3: {
3881 line1 = GBREG->getPixel(1, m_loopIndex - 1);
3882 line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;
3883 line2 = 0;
3884 for (FX_DWORD w = 0; w < GBW; w++) {
3885 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) {
3886 bVal = 0;
3887 } else {
3888 CONTEXT = line2;
3889 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1])
3890 << 4;
3891 CONTEXT |= line1 << 5;
3892 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
3893 }
3894 if (bVal) {
3895 GBREG->setPixel(w, m_loopIndex, bVal);
3896 }
3897 line1 =
3898 ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;
3899 line2 = ((line2 << 1) | bVal) & 0x0f;
3900 }
3901 } break;
3902 }
3903 }
3904 if (pPause && pPause->NeedToPauseNow()) {
3905 m_loopIndex++;
3906 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
3907 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
3908 }
3909 }
3910 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3911 return FXCODEC_STATUS_DECODE_FINISH;
3912 }
3913 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1(
3914 CJBig2_Image** pImage,
3915 CJBig2_ArithDecoder* pArithDecoder,
3916 JBig2ArithCtx* gbContext,
3917 IFX_Pause* pPause) {
3918 if (GBW == 0 || GBH == 0) {
3919 *pImage = NULL;
3775 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 3920 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3776 return m_ProssiveStatus; 3921 return FXCODEC_STATUS_DECODE_FINISH;
3777 } 3922 }
3778 FXCODEC_STATUS CJBig2_GRDProc::decode_MMR() 3923 if (*pImage == NULL) {
3779 { 3924 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
3780 return m_ProssiveStatus; 3925 }
3781 } 3926 if ((*pImage)->m_pData == NULL) {
3782 FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause) 3927 delete *pImage;
3783 { 3928 *pImage = NULL;
3784 if(m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) { 3929 m_pModule->JBig2_Error(
3785 return m_ProssiveStatus; 3930 "Generic region decoding procedure: Create Image Failed with width = "
3786 } 3931 "%d, height = %d\n",
3787 switch (m_DecodeType) { 3932 GBW, GBH);
3933 m_ProssiveStatus = FXCODEC_STATUS_ERROR;
3934 return FXCODEC_STATUS_ERROR;
3935 }
3936 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
3937 m_pPause = pPause;
3938 m_pImage = pImage;
3939 m_DecodeType = 3;
3940 (*m_pImage)->fill(0);
3941 LTP = 0;
3942 m_loopIndex = 0;
3943 m_pArithDecoder = pArithDecoder;
3944 m_gbContext = gbContext;
3945 return decode_Arith_V1(pPause);
3946 }
3947 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause) {
3948 FX_BOOL SLTP, bVal;
3949 FX_DWORD CONTEXT = 0;
3950 CJBig2_Image* GBREG = (*m_pImage);
3951 for (; m_loopIndex < GBH; m_loopIndex++) {
3952 if (TPGDON) {
3953 switch (GBTEMPLATE) {
3954 case 0:
3955 CONTEXT = 0x9b25;
3956 break;
3788 case 1: 3957 case 1:
3789 return decode_Arith(pPause); 3958 CONTEXT = 0x0795;
3959 break;
3790 case 2: 3960 case 2:
3791 return decode_Arith_V2(pPause); 3961 CONTEXT = 0x00e5;
3962 break;
3792 case 3: 3963 case 3:
3793 return decode_Arith_V1(pPause); 3964 CONTEXT = 0x0195;
3794 case 4: 3965 break;
3795 return decode_MMR(); 3966 }
3796 } 3967 SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
3968 LTP = LTP ^ SLTP;
3969 }
3970 if (LTP == 1) {
3971 for (FX_DWORD w = 0; w < GBW; w++) {
3972 GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex - 1));
3973 }
3974 } else {
3975 for (FX_DWORD w = 0; w < GBW; w++) {
3976 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) {
3977 GBREG->setPixel(w, m_loopIndex, 0);
3978 } else {
3979 CONTEXT = 0;
3980 switch (GBTEMPLATE) {
3981 case 0:
3982 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
3983 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
3984 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
3985 CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;
3986 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1])
3987 << 4;
3988 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 5;
3989 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 6;
3990 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7;
3991 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 8;
3992 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 9;
3993 CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3])
3994 << 10;
3995 CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5])
3996 << 11;
3997 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 12;
3998 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13;
3999 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 14;
4000 CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7])
4001 << 15;
4002 break;
4003 case 1:
4004 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
4005 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
4006 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
4007 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1])
4008 << 3;
4009 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 4;
4010 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;
4011 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;
4012 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;
4013 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;
4014 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) << 9;
4015 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 10;
4016 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11;
4017 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 12;
4018 break;
4019 case 2:
4020 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
4021 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
4022 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1])
4023 << 2;
4024 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 3;
4025 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4;
4026 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 5;
4027 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 6;
4028 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 7;
4029 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8;
4030 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 9;
4031 break;
4032 case 3:
4033 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
4034 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
4035 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
4036 CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;
4037 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1])
4038 << 4;
4039 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;
4040 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;
4041 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;
4042 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;
4043 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) << 9;
4044 break;
4045 }
4046 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
4047 GBREG->setPixel(w, m_loopIndex, bVal);
4048 }
4049 }
4050 }
4051 if (pPause && pPause->NeedToPauseNow()) {
4052 m_loopIndex++;
4053 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4054 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4055 }
4056 }
4057 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4058 return FXCODEC_STATUS_DECODE_FINISH;
4059 }
4060 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage,
4061 CJBig2_BitStream* pStream,
4062 IFX_Pause* pPause) {
4063 int bitpos, i;
4064 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
4065 if ((*pImage)->m_pData == NULL) {
4066 delete (*pImage);
4067 (*pImage) = NULL;
4068 m_pModule->JBig2_Error(
4069 "Generic region decoding procedure: Create Image Failed with width = "
4070 "%d, height = %d\n",
4071 GBW, GBH);
3797 m_ProssiveStatus = FXCODEC_STATUS_ERROR; 4072 m_ProssiveStatus = FXCODEC_STATUS_ERROR;
3798 return m_ProssiveStatus; 4073 return m_ProssiveStatus;
3799 } 4074 }
3800 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause ) 4075 bitpos = (int)pStream->getBitPos();
3801 { 4076 _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos,
3802 FX_BOOL SLTP, bVal; 4077 (*pImage)->m_pData, GBW, GBH, (*pImage)->m_nStride);
3803 FX_DWORD CONTEXT; 4078 pStream->setBitPos(bitpos);
3804 FX_DWORD line1, line2; 4079 for (i = 0; (FX_DWORD)i < (*pImage)->m_nStride * GBH; i++) {
3805 uint8_t *pLine1, *pLine2, cVal; 4080 (*pImage)->m_pData[i] = ~(*pImage)->m_pData[i];
3806 int32_t nStride, nStride2, k; 4081 }
3807 int32_t nLineBytes, nBitsLeft, cc; 4082 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3808 if(m_pLine == NULL) { 4083 return m_ProssiveStatus;
3809 m_pLine = pImage->m_pData; 4084 }
3810 } 4085 FXCODEC_STATUS CJBig2_GRDProc::decode_MMR() {
3811 nStride = pImage->m_nStride; 4086 return m_ProssiveStatus;
3812 nStride2 = nStride << 1; 4087 }
3813 nLineBytes = ((GBW + 7) >> 3) - 1; 4088 FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause) {
3814 nBitsLeft = GBW - (nLineBytes << 3); 4089 if (m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) {
3815 FX_DWORD height = GBH & 0x7fffffff; 4090 return m_ProssiveStatus;
3816 for(; m_loopIndex < height; m_loopIndex++) { 4091 }
3817 if(TPGDON) { 4092 switch (m_DecodeType) {
3818 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); 4093 case 1:
3819 LTP = LTP ^ SLTP; 4094 return decode_Arith(pPause);
3820 } 4095 case 2:
3821 if(LTP == 1) { 4096 return decode_Arith_V2(pPause);
3822 pImage->copyLine(m_loopIndex, m_loopIndex - 1); 4097 case 3:
4098 return decode_Arith_V1(pPause);
4099 case 4:
4100 return decode_MMR();
4101 }
4102 m_ProssiveStatus = FXCODEC_STATUS_ERROR;
4103 return m_ProssiveStatus;
4104 }
4105 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3(
4106 CJBig2_Image* pImage,
4107 CJBig2_ArithDecoder* pArithDecoder,
4108 JBig2ArithCtx* gbContext,
4109 IFX_Pause* pPause) {
4110 FX_BOOL SLTP, bVal;
4111 FX_DWORD CONTEXT;
4112 FX_DWORD line1, line2;
4113 uint8_t *pLine1, *pLine2, cVal;
4114 int32_t nStride, nStride2, k;
4115 int32_t nLineBytes, nBitsLeft, cc;
4116 if (m_pLine == NULL) {
4117 m_pLine = pImage->m_pData;
4118 }
4119 nStride = pImage->m_nStride;
4120 nStride2 = nStride << 1;
4121 nLineBytes = ((GBW + 7) >> 3) - 1;
4122 nBitsLeft = GBW - (nLineBytes << 3);
4123 FX_DWORD height = GBH & 0x7fffffff;
4124 for (; m_loopIndex < height; m_loopIndex++) {
4125 if (TPGDON) {
4126 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
4127 LTP = LTP ^ SLTP;
4128 }
4129 if (LTP == 1) {
4130 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
4131 } else {
4132 if (m_loopIndex > 1) {
4133 pLine1 = m_pLine - nStride2;
4134 pLine2 = m_pLine - nStride;
4135 line1 = (*pLine1++) << 6;
4136 line2 = *pLine2++;
4137 CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));
4138 for (cc = 0; cc < nLineBytes; cc++) {
4139 line1 = (line1 << 8) | ((*pLine1++) << 6);
4140 line2 = (line2 << 8) | (*pLine2++);
4141 cVal = 0;
4142 for (k = 7; k >= 0; k--) {
4143 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4144 cVal |= bVal << k;
4145 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
4146 ((line1 >> k) & 0x0800) | ((line2 >> k) & 0x0010));
4147 }
4148 m_pLine[cc] = cVal;
4149 }
4150 line1 <<= 8;
4151 line2 <<= 8;
4152 cVal = 0;
4153 for (k = 0; k < nBitsLeft; k++) {
4154 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4155 cVal |= bVal << (7 - k);
4156 CONTEXT =
4157 (((CONTEXT & 0x7bf7) << 1) | bVal |
4158 ((line1 >> (7 - k)) & 0x0800) | ((line2 >> (7 - k)) & 0x0010));
4159 }
4160 m_pLine[nLineBytes] = cVal;
4161 } else {
4162 pLine2 = m_pLine - nStride;
4163 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
4164 CONTEXT = (line2 & 0x07f0);
4165 for (cc = 0; cc < nLineBytes; cc++) {
4166 if (m_loopIndex & 1) {
4167 line2 = (line2 << 8) | (*pLine2++);
4168 }
4169 cVal = 0;
4170 for (k = 7; k >= 0; k--) {
4171 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4172 cVal |= bVal << k;
4173 CONTEXT =
4174 (((CONTEXT & 0x7bf7) << 1) | bVal | ((line2 >> k) & 0x0010));
4175 }
4176 m_pLine[cc] = cVal;
4177 }
4178 line2 <<= 8;
4179 cVal = 0;
4180 for (k = 0; k < nBitsLeft; k++) {
4181 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4182 cVal |= bVal << (7 - k);
4183 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
4184 ((line2 >> (7 - k)) & 0x0010));
4185 }
4186 m_pLine[nLineBytes] = cVal;
4187 }
4188 }
4189 m_pLine += nStride;
4190 if (pPause && pPause->NeedToPauseNow()) {
4191 m_loopIndex++;
4192 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4193 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4194 }
4195 }
4196 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4197 return FXCODEC_STATUS_DECODE_FINISH;
4198 }
4199 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt(
4200 CJBig2_Image* pImage,
4201 CJBig2_ArithDecoder* pArithDecoder,
4202 JBig2ArithCtx* gbContext,
4203 IFX_Pause* pPause) {
4204 FX_BOOL SLTP, bVal;
4205 FX_DWORD CONTEXT;
4206 FX_DWORD line1, line2, line3;
4207 for (; m_loopIndex < GBH; m_loopIndex++) {
4208 if (TPGDON) {
4209 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
4210 LTP = LTP ^ SLTP;
4211 }
4212 if (LTP == 1) {
4213 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
4214 } else {
4215 line1 = pImage->getPixel(1, m_loopIndex - 2);
4216 line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;
4217 line2 = pImage->getPixel(2, m_loopIndex - 1);
4218 line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1;
4219 line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2;
4220 line3 = 0;
4221 for (FX_DWORD w = 0; w < GBW; w++) {
4222 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) {
4223 bVal = 0;
3823 } else { 4224 } else {
3824 if(m_loopIndex > 1) { 4225 CONTEXT = line3;
3825 pLine1 = m_pLine - nStride2; 4226 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
3826 pLine2 = m_pLine - nStride; 4227 CONTEXT |= line2 << 5;
3827 line1 = (*pLine1++) << 6; 4228 CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
3828 line2 = *pLine2++; 4229 CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
3829 CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); 4230 CONTEXT |= line1 << 12;
3830 for(cc = 0; cc < nLineBytes; cc++) { 4231 CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
3831 line1 = (line1 << 8) | ((*pLine1++) << 6); 4232 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
3832 line2 = (line2 << 8) | (*pLine2++); 4233 }
3833 cVal = 0; 4234 if (bVal) {
3834 for(k = 7; k >= 0; k--) { 4235 pImage->setPixel(w, m_loopIndex, bVal);
3835 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 4236 }
3836 cVal |= bVal << k; 4237 line1 =
3837 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal 4238 ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
3838 | ((line1 >> k) & 0x0800) 4239 line2 =
3839 | ((line2 >> k) & 0x0010)); 4240 ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
3840 } 4241 line3 = ((line3 << 1) | bVal) & 0x0f;
3841 m_pLine[cc] = cVal; 4242 }
3842 } 4243 }
3843 line1 <<= 8; 4244 if (pPause && pPause->NeedToPauseNow()) {
3844 line2 <<= 8; 4245 m_loopIndex++;
3845 cVal = 0; 4246 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
3846 for(k = 0; k < nBitsLeft; k++) { 4247 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
3847 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 4248 }
3848 cVal |= bVal << (7 - k); 4249 }
3849 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal 4250 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3850 | ((line1 >> (7 - k)) & 0x0800) 4251 return FXCODEC_STATUS_DECODE_FINISH;
3851 | ((line2 >> (7 - k)) & 0x0010)); 4252 }
3852 } 4253 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3(
3853 m_pLine[nLineBytes] = cVal; 4254 CJBig2_Image* pImage,
3854 } else { 4255 CJBig2_ArithDecoder* pArithDecoder,
3855 pLine2 = m_pLine - nStride; 4256 JBig2ArithCtx* gbContext,
3856 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; 4257 IFX_Pause* pPause) {
3857 CONTEXT = (line2 & 0x07f0); 4258 FX_BOOL SLTP, bVal;
3858 for(cc = 0; cc < nLineBytes; cc++) { 4259 FX_DWORD CONTEXT;
3859 if(m_loopIndex & 1) { 4260 FX_DWORD line1, line2;
3860 line2 = (line2 << 8) | (*pLine2++); 4261 uint8_t *pLine1, *pLine2, cVal;
3861 } 4262 int32_t nStride, nStride2, k;
3862 cVal = 0; 4263 int32_t nLineBytes, nBitsLeft, cc;
3863 for(k = 7; k >= 0; k--) { 4264 if (!m_pLine) {
3864 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 4265 m_pLine = pImage->m_pData;
3865 cVal |= bVal << k; 4266 }
3866 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal 4267 nStride = pImage->m_nStride;
3867 | ((line2 >> k) & 0x0010)); 4268 nStride2 = nStride << 1;
3868 } 4269 nLineBytes = ((GBW + 7) >> 3) - 1;
3869 m_pLine[cc] = cVal; 4270 nBitsLeft = GBW - (nLineBytes << 3);
3870 } 4271 for (; m_loopIndex < GBH; m_loopIndex++) {
3871 line2 <<= 8; 4272 if (TPGDON) {
3872 cVal = 0; 4273 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
3873 for(k = 0; k < nBitsLeft; k++) { 4274 LTP = LTP ^ SLTP;
3874 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 4275 }
3875 cVal |= bVal << (7 - k); 4276 if (LTP == 1) {
3876 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal 4277 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
3877 | ((line2 >> (7 - k)) & 0x0010)); 4278 } else {
3878 } 4279 if (m_loopIndex > 1) {
3879 m_pLine[nLineBytes] = cVal; 4280 pLine1 = m_pLine - nStride2;
3880 } 4281 pLine2 = m_pLine - nStride;
3881 } 4282 line1 = (*pLine1++) << 4;
3882 m_pLine += nStride; 4283 line2 = *pLine2++;
3883 if(pPause && pPause->NeedToPauseNow()) { 4284 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
3884 m_loopIndex++; 4285 for (cc = 0; cc < nLineBytes; cc++) {
3885 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 4286 line1 = (line1 << 8) | ((*pLine1++) << 4);
3886 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 4287 line2 = (line2 << 8) | (*pLine2++);
3887 } 4288 cVal = 0;
3888 } 4289 for (k = 7; k >= 0; k--) {
3889 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 4290 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
3890 return FXCODEC_STATUS_DECODE_FINISH; 4291 cVal |= bVal << k;
3891 } 4292 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
3892 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_Image * pImag e, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPau se) 4293 ((line1 >> k) & 0x0200) | ((line2 >> (k + 1)) & 0x0008);
3893 { 4294 }
3894 FX_BOOL SLTP, bVal; 4295 m_pLine[cc] = cVal;
3895 FX_DWORD CONTEXT; 4296 }
3896 FX_DWORD line1, line2, line3; 4297 line1 <<= 8;
3897 for(; m_loopIndex < GBH; m_loopIndex++) { 4298 line2 <<= 8;
3898 if(TPGDON) { 4299 cVal = 0;
3899 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); 4300 for (k = 0; k < nBitsLeft; k++) {
3900 LTP = LTP ^ SLTP; 4301 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
3901 } 4302 cVal |= bVal << (7 - k);
3902 if(LTP == 1) { 4303 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
3903 pImage->copyLine(m_loopIndex, m_loopIndex - 1); 4304 ((line1 >> (7 - k)) & 0x0200) |
4305 ((line2 >> (8 - k)) & 0x0008);
4306 }
4307 m_pLine[nLineBytes] = cVal;
4308 } else {
4309 pLine2 = m_pLine - nStride;
4310 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
4311 CONTEXT = (line2 >> 1) & 0x01f8;
4312 for (cc = 0; cc < nLineBytes; cc++) {
4313 if (m_loopIndex & 1) {
4314 line2 = (line2 << 8) | (*pLine2++);
4315 }
4316 cVal = 0;
4317 for (k = 7; k >= 0; k--) {
4318 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4319 cVal |= bVal << k;
4320 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
4321 ((line2 >> (k + 1)) & 0x0008);
4322 }
4323 m_pLine[cc] = cVal;
4324 }
4325 line2 <<= 8;
4326 cVal = 0;
4327 for (k = 0; k < nBitsLeft; k++) {
4328 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4329 cVal |= bVal << (7 - k);
4330 CONTEXT =
4331 ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008);
4332 }
4333 m_pLine[nLineBytes] = cVal;
4334 }
4335 }
4336 m_pLine += nStride;
4337 if (pPause && pPause->NeedToPauseNow()) {
4338 m_loopIndex++;
4339 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4340 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4341 }
4342 }
4343 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4344 return FXCODEC_STATUS_DECODE_FINISH;
4345 }
4346 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt(
4347 CJBig2_Image* pImage,
4348 CJBig2_ArithDecoder* pArithDecoder,
4349 JBig2ArithCtx* gbContext,
4350 IFX_Pause* pPause) {
4351 FX_BOOL SLTP, bVal;
4352 FX_DWORD CONTEXT;
4353 FX_DWORD line1, line2, line3;
4354 for (FX_DWORD h = 0; h < GBH; h++) {
4355 if (TPGDON) {
4356 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
4357 LTP = LTP ^ SLTP;
4358 }
4359 if (LTP == 1) {
4360 pImage->copyLine(h, h - 1);
4361 } else {
4362 line1 = pImage->getPixel(2, h - 2);
4363 line1 |= pImage->getPixel(1, h - 2) << 1;
4364 line1 |= pImage->getPixel(0, h - 2) << 2;
4365 line2 = pImage->getPixel(2, h - 1);
4366 line2 |= pImage->getPixel(1, h - 1) << 1;
4367 line2 |= pImage->getPixel(0, h - 1) << 2;
4368 line3 = 0;
4369 for (FX_DWORD w = 0; w < GBW; w++) {
4370 if (USESKIP && SKIP->getPixel(w, h)) {
4371 bVal = 0;
3904 } else { 4372 } else {
3905 line1 = pImage->getPixel(1, m_loopIndex - 2); 4373 CONTEXT = line3;
3906 line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; 4374 CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
3907 line2 = pImage->getPixel(2, m_loopIndex - 1); 4375 CONTEXT |= line2 << 4;
3908 line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1; 4376 CONTEXT |= line1 << 9;
3909 line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2; 4377 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
3910 line3 = 0; 4378 }
3911 for(FX_DWORD w = 0; w < GBW; w++) { 4379 if (bVal) {
3912 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { 4380 pImage->setPixel(w, h, bVal);
3913 bVal = 0; 4381 }
3914 } else { 4382 line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f;
3915 CONTEXT = line3; 4383 line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f;
3916 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[ 1]) << 4; 4384 line3 = ((line3 << 1) | bVal) & 0x07;
3917 CONTEXT |= line2 << 5; 4385 }
3918 CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[ 3]) << 10; 4386 }
3919 CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[ 5]) << 11; 4387 if (pPause && pPause->NeedToPauseNow()) {
3920 CONTEXT |= line1 << 12; 4388 m_loopIndex++;
3921 CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[ 7]) << 15; 4389 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
3922 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 4390 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
3923 } 4391 }
3924 if(bVal) { 4392 }
3925 pImage->setPixel(w, m_loopIndex, bVal); 4393 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3926 } 4394 return FXCODEC_STATUS_DECODE_FINISH;
3927 line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2) ) & 0x07; 4395 }
3928 line2 = ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1) ) & 0x1f; 4396 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3(
3929 line3 = ((line3 << 1) | bVal) & 0x0f; 4397 CJBig2_Image* pImage,
3930 } 4398 CJBig2_ArithDecoder* pArithDecoder,
3931 } 4399 JBig2ArithCtx* gbContext,
3932 if(pPause && pPause->NeedToPauseNow()) { 4400 IFX_Pause* pPause) {
3933 m_loopIndex++; 4401 FX_BOOL SLTP, bVal;
3934 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 4402 FX_DWORD CONTEXT;
3935 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 4403 FX_DWORD line1, line2;
3936 } 4404 uint8_t *pLine1, *pLine2, cVal;
3937 } 4405 int32_t nStride, nStride2, k;
3938 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 4406 int32_t nLineBytes, nBitsLeft, cc;
3939 return FXCODEC_STATUS_DECODE_FINISH; 4407 if (!m_pLine) {
3940 } 4408 m_pLine = pImage->m_pData;
3941 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause ) 4409 }
3942 { 4410 nStride = pImage->m_nStride;
3943 FX_BOOL SLTP, bVal; 4411 nStride2 = nStride << 1;
3944 FX_DWORD CONTEXT; 4412 nLineBytes = ((GBW + 7) >> 3) - 1;
3945 FX_DWORD line1, line2; 4413 nBitsLeft = GBW - (nLineBytes << 3);
3946 uint8_t *pLine1, *pLine2, cVal; 4414 for (; m_loopIndex < GBH; m_loopIndex++) {
3947 int32_t nStride, nStride2, k; 4415 if (TPGDON) {
3948 int32_t nLineBytes, nBitsLeft, cc; 4416 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
3949 if (!m_pLine) { 4417 LTP = LTP ^ SLTP;
3950 m_pLine = pImage->m_pData; 4418 }
3951 } 4419 if (LTP == 1) {
3952 nStride = pImage->m_nStride; 4420 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
3953 nStride2 = nStride << 1; 4421 } else {
3954 nLineBytes = ((GBW + 7) >> 3) - 1; 4422 if (m_loopIndex > 1) {
3955 nBitsLeft = GBW - (nLineBytes << 3); 4423 pLine1 = m_pLine - nStride2;
3956 for(; m_loopIndex < GBH; m_loopIndex++) { 4424 pLine2 = m_pLine - nStride;
3957 if(TPGDON) { 4425 line1 = (*pLine1++) << 1;
3958 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); 4426 line2 = *pLine2++;
3959 LTP = LTP ^ SLTP; 4427 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
3960 } 4428 for (cc = 0; cc < nLineBytes; cc++) {
3961 if(LTP == 1) { 4429 line1 = (line1 << 8) | ((*pLine1++) << 1);
3962 pImage->copyLine(m_loopIndex, m_loopIndex - 1); 4430 line2 = (line2 << 8) | (*pLine2++);
4431 cVal = 0;
4432 for (k = 7; k >= 0; k--) {
4433 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4434 cVal |= bVal << k;
4435 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
4436 ((line1 >> k) & 0x0080) | ((line2 >> (k + 3)) & 0x0004);
4437 }
4438 m_pLine[cc] = cVal;
4439 }
4440 line1 <<= 8;
4441 line2 <<= 8;
4442 cVal = 0;
4443 for (k = 0; k < nBitsLeft; k++) {
4444 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4445 cVal |= bVal << (7 - k);
4446 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
4447 ((line1 >> (7 - k)) & 0x0080) |
4448 ((line2 >> (10 - k)) & 0x0004);
4449 }
4450 m_pLine[nLineBytes] = cVal;
4451 } else {
4452 pLine2 = m_pLine - nStride;
4453 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
4454 CONTEXT = (line2 >> 3) & 0x007c;
4455 for (cc = 0; cc < nLineBytes; cc++) {
4456 if (m_loopIndex & 1) {
4457 line2 = (line2 << 8) | (*pLine2++);
4458 }
4459 cVal = 0;
4460 for (k = 7; k >= 0; k--) {
4461 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4462 cVal |= bVal << k;
4463 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
4464 ((line2 >> (k + 3)) & 0x0004);
4465 }
4466 m_pLine[cc] = cVal;
4467 }
4468 line2 <<= 8;
4469 cVal = 0;
4470 for (k = 0; k < nBitsLeft; k++) {
4471 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4472 cVal |= bVal << (7 - k);
4473 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
4474 (((line2 >> (10 - k))) & 0x0004);
4475 }
4476 m_pLine[nLineBytes] = cVal;
4477 }
4478 }
4479 m_pLine += nStride;
4480 if (pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) {
4481 m_loopIndex++;
4482 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4483 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4484 }
4485 }
4486 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4487 return FXCODEC_STATUS_DECODE_FINISH;
4488 }
4489 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt(
4490 CJBig2_Image* pImage,
4491 CJBig2_ArithDecoder* pArithDecoder,
4492 JBig2ArithCtx* gbContext,
4493 IFX_Pause* pPause) {
4494 FX_BOOL SLTP, bVal;
4495 FX_DWORD CONTEXT;
4496 FX_DWORD line1, line2, line3;
4497 for (; m_loopIndex < GBH; m_loopIndex++) {
4498 if (TPGDON) {
4499 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
4500 LTP = LTP ^ SLTP;
4501 }
4502 if (LTP == 1) {
4503 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
4504 } else {
4505 line1 = pImage->getPixel(1, m_loopIndex - 2);
4506 line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;
4507 line2 = pImage->getPixel(1, m_loopIndex - 1);
4508 line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1;
4509 line3 = 0;
4510 for (FX_DWORD w = 0; w < GBW; w++) {
4511 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) {
4512 bVal = 0;
3963 } else { 4513 } else {
3964 if(m_loopIndex > 1) { 4514 CONTEXT = line3;
3965 pLine1 = m_pLine - nStride2; 4515 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
3966 pLine2 = m_pLine - nStride; 4516 CONTEXT |= line2 << 3;
3967 line1 = (*pLine1++) << 4; 4517 CONTEXT |= line1 << 7;
3968 line2 = *pLine2++; 4518 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
3969 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); 4519 }
3970 for(cc = 0; cc < nLineBytes; cc++) { 4520 if (bVal) {
3971 line1 = (line1 << 8) | ((*pLine1++) << 4); 4521 pImage->setPixel(w, m_loopIndex, bVal);
3972 line2 = (line2 << 8) | (*pLine2++); 4522 }
3973 cVal = 0; 4523 line1 =
3974 for(k = 7; k >= 0; k--) { 4524 ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
3975 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 4525 line2 =
3976 cVal |= bVal << k; 4526 ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;
3977 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal 4527 line3 = ((line3 << 1) | bVal) & 0x03;
3978 | ((line1 >> k) & 0x0200) 4528 }
3979 | ((line2 >> (k + 1)) & 0x0008); 4529 }
3980 } 4530 if (pPause && pPause->NeedToPauseNow()) {
3981 m_pLine[cc] = cVal; 4531 m_loopIndex++;
3982 } 4532 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
3983 line1 <<= 8; 4533 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
3984 line2 <<= 8; 4534 }
3985 cVal = 0; 4535 }
3986 for(k = 0; k < nBitsLeft; k++) { 4536 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3987 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 4537 return FXCODEC_STATUS_DECODE_FINISH;
3988 cVal |= bVal << (7 - k); 4538 }
3989 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal 4539 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3(
3990 | ((line1 >> (7 - k)) & 0x0200) 4540 CJBig2_Image* pImage,
3991 | ((line2 >> (8 - k)) & 0x0008); 4541 CJBig2_ArithDecoder* pArithDecoder,
3992 } 4542 JBig2ArithCtx* gbContext,
3993 m_pLine[nLineBytes] = cVal; 4543 IFX_Pause* pPause) {
3994 } else { 4544 FX_BOOL SLTP, bVal;
3995 pLine2 = m_pLine - nStride; 4545 FX_DWORD CONTEXT;
3996 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; 4546 FX_DWORD line1;
3997 CONTEXT = (line2 >> 1) & 0x01f8; 4547 uint8_t *pLine1, cVal;
3998 for(cc = 0; cc < nLineBytes; cc++) { 4548 int32_t nStride, k;
3999 if(m_loopIndex & 1) { 4549 int32_t nLineBytes, nBitsLeft, cc;
4000 line2 = (line2 << 8) | (*pLine2++); 4550 if (!m_pLine) {
4001 } 4551 m_pLine = pImage->m_pData;
4002 cVal = 0; 4552 }
4003 for(k = 7; k >= 0; k--) { 4553 nStride = pImage->m_nStride;
4004 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 4554 nLineBytes = ((GBW + 7) >> 3) - 1;
4005 cVal |= bVal << k; 4555 nBitsLeft = GBW - (nLineBytes << 3);
4006 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal 4556 for (; m_loopIndex < GBH; m_loopIndex++) {
4007 | ((line2 >> (k + 1)) & 0x0008); 4557 if (TPGDON) {
4008 } 4558 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
4009 m_pLine[cc] = cVal; 4559 LTP = LTP ^ SLTP;
4010 } 4560 }
4011 line2 <<= 8; 4561 if (LTP == 1) {
4012 cVal = 0; 4562 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
4013 for(k = 0; k < nBitsLeft; k++) { 4563 } else {
4014 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 4564 if (m_loopIndex > 0) {
4015 cVal |= bVal << (7 - k); 4565 pLine1 = m_pLine - nStride;
4016 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal 4566 line1 = *pLine1++;
4017 | ((line2 >> (8 - k)) & 0x0008); 4567 CONTEXT = (line1 >> 1) & 0x03f0;
4018 } 4568 for (cc = 0; cc < nLineBytes; cc++) {
4019 m_pLine[nLineBytes] = cVal; 4569 line1 = (line1 << 8) | (*pLine1++);
4020 } 4570 cVal = 0;
4021 } 4571 for (k = 7; k >= 0; k--) {
4022 m_pLine += nStride; 4572 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4023 if(pPause && pPause->NeedToPauseNow()) { 4573 cVal |= bVal << k;
4024 m_loopIndex++; 4574 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal |
4025 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 4575 ((line1 >> (k + 1)) & 0x0010);
4026 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 4576 }
4027 } 4577 m_pLine[cc] = cVal;
4028 } 4578 }
4029 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 4579 line1 <<= 8;
4030 return FXCODEC_STATUS_DECODE_FINISH; 4580 cVal = 0;
4031 } 4581 for (k = 0; k < nBitsLeft; k++) {
4032 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_Image * pImag e, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPau se) 4582 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4033 { 4583 cVal |= bVal << (7 - k);
4034 FX_BOOL SLTP, bVal; 4584 CONTEXT =
4035 FX_DWORD CONTEXT; 4585 ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010);
4036 FX_DWORD line1, line2, line3; 4586 }
4037 for(FX_DWORD h = 0; h < GBH; h++) { 4587 m_pLine[nLineBytes] = cVal;
4038 if(TPGDON) { 4588 } else {
4039 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); 4589 CONTEXT = 0;
4040 LTP = LTP ^ SLTP; 4590 for (cc = 0; cc < nLineBytes; cc++) {
4041 } 4591 cVal = 0;
4042 if(LTP == 1) { 4592 for (k = 7; k >= 0; k--) {
4043 pImage->copyLine(h, h - 1); 4593 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4594 cVal |= bVal << k;
4595 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
4596 }
4597 m_pLine[cc] = cVal;
4598 }
4599 cVal = 0;
4600 for (k = 0; k < nBitsLeft; k++) {
4601 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4602 cVal |= bVal << (7 - k);
4603 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
4604 }
4605 m_pLine[nLineBytes] = cVal;
4606 }
4607 }
4608 m_pLine += nStride;
4609 if (pPause && pPause->NeedToPauseNow()) {
4610 m_loopIndex++;
4611 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4612 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4613 }
4614 }
4615 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4616 return FXCODEC_STATUS_DECODE_FINISH;
4617 }
4618 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt(
4619 CJBig2_Image* pImage,
4620 CJBig2_ArithDecoder* pArithDecoder,
4621 JBig2ArithCtx* gbContext,
4622 IFX_Pause* pPause) {
4623 FX_BOOL SLTP, bVal;
4624 FX_DWORD CONTEXT;
4625 FX_DWORD line1, line2;
4626 for (; m_loopIndex < GBH; m_loopIndex++) {
4627 if (TPGDON) {
4628 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
4629 LTP = LTP ^ SLTP;
4630 }
4631 if (LTP == 1) {
4632 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
4633 } else {
4634 line1 = pImage->getPixel(1, m_loopIndex - 1);
4635 line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1;
4636 line2 = 0;
4637 for (FX_DWORD w = 0; w < GBW; w++) {
4638 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) {
4639 bVal = 0;
4044 } else { 4640 } else {
4045 line1 = pImage->getPixel(2, h - 2); 4641 CONTEXT = line2;
4046 line1 |= pImage->getPixel(1, h - 2) << 1; 4642 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
4047 line1 |= pImage->getPixel(0, h - 2) << 2; 4643 CONTEXT |= line1 << 5;
4048 line2 = pImage->getPixel(2, h - 1); 4644 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4049 line2 |= pImage->getPixel(1, h - 1) << 1; 4645 }
4050 line2 |= pImage->getPixel(0, h - 1) << 2; 4646 if (bVal) {
4051 line3 = 0; 4647 pImage->setPixel(w, m_loopIndex, bVal);
4052 for(FX_DWORD w = 0; w < GBW; w++) { 4648 }
4053 if(USESKIP && SKIP->getPixel(w, h)) { 4649 line1 =
4054 bVal = 0; 4650 ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;
4055 } else { 4651 line2 = ((line2 << 1) | bVal) & 0x0f;
4056 CONTEXT = line3; 4652 }
4057 CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3; 4653 }
4058 CONTEXT |= line2 << 4; 4654 if (pPause && pPause->NeedToPauseNow()) {
4059 CONTEXT |= line1 << 9; 4655 m_loopIndex++;
4060 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 4656 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4061 } 4657 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4062 if(bVal) { 4658 }
4063 pImage->setPixel(w, h, bVal); 4659 }
4064 } 4660 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4065 line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f; 4661 return FXCODEC_STATUS_DECODE_FINISH;
4066 line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f; 4662 }
4067 line3 = ((line3 << 1) | bVal) & 0x07;
4068 }
4069 }
4070 if(pPause && pPause->NeedToPauseNow()) {
4071 m_loopIndex++;
4072 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4073 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4074 }
4075 }
4076 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4077 return FXCODEC_STATUS_DECODE_FINISH;
4078 }
4079 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause )
4080 {
4081 FX_BOOL SLTP, bVal;
4082 FX_DWORD CONTEXT;
4083 FX_DWORD line1, line2;
4084 uint8_t *pLine1, *pLine2, cVal;
4085 int32_t nStride, nStride2, k;
4086 int32_t nLineBytes, nBitsLeft, cc;
4087 if(!m_pLine) {
4088 m_pLine = pImage->m_pData;
4089 }
4090 nStride = pImage->m_nStride;
4091 nStride2 = nStride << 1;
4092 nLineBytes = ((GBW + 7) >> 3) - 1;
4093 nBitsLeft = GBW - (nLineBytes << 3);
4094 for(; m_loopIndex < GBH; m_loopIndex++) {
4095 if(TPGDON) {
4096 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
4097 LTP = LTP ^ SLTP;
4098 }
4099 if(LTP == 1) {
4100 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
4101 } else {
4102 if(m_loopIndex > 1) {
4103 pLine1 = m_pLine - nStride2;
4104 pLine2 = m_pLine - nStride;
4105 line1 = (*pLine1++) << 1;
4106 line2 = *pLine2++;
4107 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
4108 for(cc = 0; cc < nLineBytes; cc++) {
4109 line1 = (line1 << 8) | ((*pLine1++) << 1);
4110 line2 = (line2 << 8) | (*pLine2++);
4111 cVal = 0;
4112 for(k = 7; k >= 0; k--) {
4113 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4114 cVal |= bVal << k;
4115 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
4116 | ((line1 >> k) & 0x0080)
4117 | ((line2 >> (k + 3)) & 0x0004);
4118 }
4119 m_pLine[cc] = cVal;
4120 }
4121 line1 <<= 8;
4122 line2 <<= 8;
4123 cVal = 0;
4124 for(k = 0; k < nBitsLeft; k++) {
4125 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4126 cVal |= bVal << (7 - k);
4127 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
4128 | ((line1 >> (7 - k)) & 0x0080)
4129 | ((line2 >> (10 - k)) & 0x0004);
4130 }
4131 m_pLine[nLineBytes] = cVal;
4132 } else {
4133 pLine2 = m_pLine - nStride;
4134 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
4135 CONTEXT = (line2 >> 3) & 0x007c;
4136 for(cc = 0; cc < nLineBytes; cc++) {
4137 if(m_loopIndex & 1) {
4138 line2 = (line2 << 8) | (*pLine2++);
4139 }
4140 cVal = 0;
4141 for(k = 7; k >= 0; k--) {
4142 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4143 cVal |= bVal << k;
4144 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
4145 | ((line2 >> (k + 3)) & 0x0004);
4146 }
4147 m_pLine[cc] = cVal;
4148 }
4149 line2 <<= 8;
4150 cVal = 0;
4151 for(k = 0; k < nBitsLeft; k++) {
4152 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4153 cVal |= bVal << (7 - k);
4154 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
4155 | (((line2 >> (10 - k))) & 0x0004);
4156 }
4157 m_pLine[nLineBytes] = cVal;
4158 }
4159 }
4160 m_pLine += nStride;
4161 if(pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) {
4162 m_loopIndex++;
4163 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4164 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4165 }
4166 }
4167 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4168 return FXCODEC_STATUS_DECODE_FINISH;
4169 }
4170 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_Image * pImag e, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPau se)
4171 {
4172 FX_BOOL SLTP, bVal;
4173 FX_DWORD CONTEXT;
4174 FX_DWORD line1, line2, line3;
4175 for(; m_loopIndex < GBH; m_loopIndex++) {
4176 if(TPGDON) {
4177 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
4178 LTP = LTP ^ SLTP;
4179 }
4180 if(LTP == 1) {
4181 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
4182 } else {
4183 line1 = pImage->getPixel(1, m_loopIndex - 2);
4184 line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;
4185 line2 = pImage->getPixel(1, m_loopIndex - 1);
4186 line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1;
4187 line3 = 0;
4188 for(FX_DWORD w = 0; w < GBW; w++) {
4189 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
4190 bVal = 0;
4191 } else {
4192 CONTEXT = line3;
4193 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[ 1]) << 2;
4194 CONTEXT |= line2 << 3;
4195 CONTEXT |= line1 << 7;
4196 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4197 }
4198 if(bVal) {
4199 pImage->setPixel(w, m_loopIndex, bVal);
4200 }
4201 line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2) ) & 0x07;
4202 line2 = ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1) ) & 0x0f;
4203 line3 = ((line3 << 1) | bVal) & 0x03;
4204 }
4205 }
4206 if(pPause && pPause->NeedToPauseNow()) {
4207 m_loopIndex++;
4208 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4209 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4210 }
4211 }
4212 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4213 return FXCODEC_STATUS_DECODE_FINISH;
4214 }
4215 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause )
4216 {
4217 FX_BOOL SLTP, bVal;
4218 FX_DWORD CONTEXT;
4219 FX_DWORD line1;
4220 uint8_t *pLine1, cVal;
4221 int32_t nStride, k;
4222 int32_t nLineBytes, nBitsLeft, cc;
4223 if (!m_pLine) {
4224 m_pLine = pImage->m_pData;
4225 }
4226 nStride = pImage->m_nStride;
4227 nLineBytes = ((GBW + 7) >> 3) - 1;
4228 nBitsLeft = GBW - (nLineBytes << 3);
4229 for(; m_loopIndex < GBH; m_loopIndex++) {
4230 if(TPGDON) {
4231 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
4232 LTP = LTP ^ SLTP;
4233 }
4234 if(LTP == 1) {
4235 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
4236 } else {
4237 if(m_loopIndex > 0) {
4238 pLine1 = m_pLine - nStride;
4239 line1 = *pLine1++;
4240 CONTEXT = (line1 >> 1) & 0x03f0;
4241 for(cc = 0; cc < nLineBytes; cc++) {
4242 line1 = (line1 << 8) | (*pLine1++);
4243 cVal = 0;
4244 for(k = 7; k >= 0; k--) {
4245 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4246 cVal |= bVal << k;
4247 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
4248 | ((line1 >> (k + 1)) & 0x0010);
4249 }
4250 m_pLine[cc] = cVal;
4251 }
4252 line1 <<= 8;
4253 cVal = 0;
4254 for(k = 0; k < nBitsLeft; k++) {
4255 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4256 cVal |= bVal << (7 - k);
4257 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
4258 | ((line1 >> (8 - k)) & 0x0010);
4259 }
4260 m_pLine[nLineBytes] = cVal;
4261 } else {
4262 CONTEXT = 0;
4263 for(cc = 0; cc < nLineBytes; cc++) {
4264 cVal = 0;
4265 for(k = 7; k >= 0; k--) {
4266 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4267 cVal |= bVal << k;
4268 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
4269 }
4270 m_pLine[cc] = cVal;
4271 }
4272 cVal = 0;
4273 for(k = 0; k < nBitsLeft; k++) {
4274 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4275 cVal |= bVal << (7 - k);
4276 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
4277 }
4278 m_pLine[nLineBytes] = cVal;
4279 }
4280 }
4281 m_pLine += nStride;
4282 if(pPause && pPause->NeedToPauseNow()) {
4283 m_loopIndex++;
4284 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4285 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4286 }
4287 }
4288 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4289 return FXCODEC_STATUS_DECODE_FINISH;
4290 }
4291 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_Image * pImag e, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPau se)
4292 {
4293 FX_BOOL SLTP, bVal;
4294 FX_DWORD CONTEXT;
4295 FX_DWORD line1, line2;
4296 for(; m_loopIndex < GBH; m_loopIndex++) {
4297 if(TPGDON) {
4298 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
4299 LTP = LTP ^ SLTP;
4300 }
4301 if(LTP == 1) {
4302 pImage->copyLine(m_loopIndex, m_loopIndex - 1);
4303 } else {
4304 line1 = pImage->getPixel(1, m_loopIndex - 1);
4305 line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1;
4306 line2 = 0;
4307 for(FX_DWORD w = 0; w < GBW; w++) {
4308 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
4309 bVal = 0;
4310 } else {
4311 CONTEXT = line2;
4312 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[ 1]) << 4;
4313 CONTEXT |= line1 << 5;
4314 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
4315 }
4316 if(bVal) {
4317 pImage->setPixel(w, m_loopIndex, bVal);
4318 }
4319 line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1) ) & 0x1f;
4320 line2 = ((line2 << 1) | bVal) & 0x0f;
4321 }
4322 }
4323 if(pPause && pPause->NeedToPauseNow()) {
4324 m_loopIndex++;
4325 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
4326 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
4327 }
4328 }
4329 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
4330 return FXCODEC_STATUS_DECODE_FINISH;
4331 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698