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

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

Issue 1337823003: Cleanup JBig2_GeneralDecoder.cpp. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: more unique_ptr Created 5 years, 3 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
9 #include "../../../../third_party/base/nonstd_unique_ptr.h"
8 #include "JBig2_ArithDecoder.h" 10 #include "JBig2_ArithDecoder.h"
9 #include "JBig2_ArithIntDecoder.h" 11 #include "JBig2_ArithIntDecoder.h"
10 #include "JBig2_HuffmanDecoder.h" 12 #include "JBig2_HuffmanDecoder.h"
11 #include "JBig2_HuffmanTable.h" 13 #include "JBig2_HuffmanTable.h"
12 #include "JBig2_PatternDict.h" 14 #include "JBig2_PatternDict.h"
13 15
14 extern const JBig2ArithQe QeTable[] = { 16 extern const JBig2ArithQe QeTable[] = {
15 {0x5601, 1, 1, 1}, {0x3401, 2, 6, 0}, {0x1801, 3, 9, 0}, 17 {0x5601, 1, 1, 1}, {0x3401, 2, 6, 0}, {0x1801, 3, 9, 0},
16 {0x0AC1, 4, 12, 0}, {0x0521, 5, 29, 0}, {0x0221, 38, 33, 0}, 18 {0x0AC1, 4, 12, 0}, {0x0521, 5, 29, 0}, {0x0221, 38, 33, 0},
17 {0x5601, 7, 6, 1}, {0x5401, 8, 14, 0}, {0x4801, 9, 14, 0}, 19 {0x5601, 7, 6, 1}, {0x5401, 8, 14, 0}, {0x4801, 9, 14, 0},
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt3( 69 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt3(
68 CJBig2_ArithDecoder* pArithDecoder, 70 CJBig2_ArithDecoder* pArithDecoder,
69 JBig2ArithCtx* gbContext) { 71 JBig2ArithCtx* gbContext) {
70 FX_BOOL LTP, SLTP, bVal; 72 FX_BOOL LTP, SLTP, bVal;
71 FX_DWORD CONTEXT; 73 FX_DWORD CONTEXT;
72 FX_DWORD line1, line2; 74 FX_DWORD line1, line2;
73 uint8_t *pLine, *pLine1, *pLine2, cVal; 75 uint8_t *pLine, *pLine1, *pLine2, cVal;
74 int32_t nStride, nStride2, k; 76 int32_t nStride, nStride2, k;
75 int32_t nLineBytes, nBitsLeft, cc; 77 int32_t nLineBytes, nBitsLeft, cc;
76 LTP = 0; 78 LTP = 0;
77 CJBig2_Image* GBREG = new CJBig2_Image(GBW, GBH); 79 nonstd::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
78 if (GBREG->m_pData == NULL) { 80 if (!GBREG->m_pData)
79 delete GBREG; 81 return nullptr;
80 return NULL; 82
81 }
82 pLine = GBREG->m_pData; 83 pLine = GBREG->m_pData;
83 nStride = GBREG->m_nStride; 84 nStride = GBREG->m_nStride;
84 nStride2 = nStride << 1; 85 nStride2 = nStride << 1;
85 nLineBytes = ((GBW + 7) >> 3) - 1; 86 nLineBytes = ((GBW + 7) >> 3) - 1;
86 nBitsLeft = GBW - (nLineBytes << 3); 87 nBitsLeft = GBW - (nLineBytes << 3);
87 FX_DWORD height = GBH & 0x7fffffff; 88 FX_DWORD height = GBH & 0x7fffffff;
88 for (FX_DWORD h = 0; h < height; h++) { 89 for (FX_DWORD h = 0; h < height; h++) {
89 if (TPGDON) { 90 if (TPGDON) {
90 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); 91 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
91 LTP = LTP ^ SLTP; 92 LTP = LTP ^ SLTP;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 146 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
146 cVal |= bVal << (7 - k); 147 cVal |= bVal << (7 - k);
147 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | 148 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
148 (((line2 >> (7 - k))) & 0x0010)); 149 (((line2 >> (7 - k))) & 0x0010));
149 } 150 }
150 pLine[nLineBytes] = cVal; 151 pLine[nLineBytes] = cVal;
151 } 152 }
152 } 153 }
153 pLine += nStride; 154 pLine += nStride;
154 } 155 }
155 return GBREG; 156 return GBREG.release();
156 } 157 }
158
157 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_unopt( 159 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_unopt(
158 CJBig2_ArithDecoder* pArithDecoder, 160 CJBig2_ArithDecoder* pArithDecoder,
159 JBig2ArithCtx* gbContext) { 161 JBig2ArithCtx* gbContext) {
160 FX_BOOL LTP, SLTP, bVal; 162 FX_BOOL LTP, SLTP, bVal;
161 FX_DWORD CONTEXT; 163 FX_DWORD CONTEXT;
162 FX_DWORD line1, line2, line3; 164 FX_DWORD line1, line2, line3;
163 LTP = 0; 165 LTP = 0;
164 CJBig2_Image* GBREG = new CJBig2_Image(GBW, GBH); 166 nonstd::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
165 GBREG->fill(0); 167 GBREG->fill(0);
166 for (FX_DWORD h = 0; h < GBH; h++) { 168 for (FX_DWORD h = 0; h < GBH; h++) {
167 if (TPGDON) { 169 if (TPGDON) {
168 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); 170 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
169 LTP = LTP ^ SLTP; 171 LTP = LTP ^ SLTP;
170 } 172 }
171 if (LTP == 1) { 173 if (LTP == 1) {
172 GBREG->copyLine(h, h - 1); 174 GBREG->copyLine(h, h - 1);
173 } else { 175 } else {
174 line1 = GBREG->getPixel(1, h - 2); 176 line1 = GBREG->getPixel(1, h - 2);
(...skipping 17 matching lines...) Expand all
192 } 194 }
193 if (bVal) { 195 if (bVal) {
194 GBREG->setPixel(w, h, bVal); 196 GBREG->setPixel(w, h, bVal);
195 } 197 }
196 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; 198 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
197 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; 199 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
198 line3 = ((line3 << 1) | bVal) & 0x0f; 200 line3 = ((line3 << 1) | bVal) & 0x0f;
199 } 201 }
200 } 202 }
201 } 203 }
202 return GBREG; 204 return GBREG.release();
203 } 205 }
206
204 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt3( 207 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt3(
205 CJBig2_ArithDecoder* pArithDecoder, 208 CJBig2_ArithDecoder* pArithDecoder,
206 JBig2ArithCtx* gbContext) { 209 JBig2ArithCtx* gbContext) {
207 FX_BOOL LTP, SLTP, bVal; 210 FX_BOOL LTP, SLTP, bVal;
208 FX_DWORD CONTEXT; 211 FX_DWORD CONTEXT;
209 FX_DWORD line1, line2; 212 FX_DWORD line1, line2;
210 uint8_t *pLine, *pLine1, *pLine2, cVal; 213 uint8_t *pLine, *pLine1, *pLine2, cVal;
211 int32_t nStride, nStride2, k; 214 int32_t nStride, nStride2, k;
212 int32_t nLineBytes, nBitsLeft, cc; 215 int32_t nLineBytes, nBitsLeft, cc;
213 LTP = 0; 216 LTP = 0;
214 CJBig2_Image* GBREG = new CJBig2_Image(GBW, GBH); 217 nonstd::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
215 if (GBREG->m_pData == NULL) { 218 if (!GBREG->m_pData)
216 delete GBREG; 219 return nullptr;
217 return NULL; 220
218 }
219 pLine = GBREG->m_pData; 221 pLine = GBREG->m_pData;
220 nStride = GBREG->m_nStride; 222 nStride = GBREG->m_nStride;
221 nStride2 = nStride << 1; 223 nStride2 = nStride << 1;
222 nLineBytes = ((GBW + 7) >> 3) - 1; 224 nLineBytes = ((GBW + 7) >> 3) - 1;
223 nBitsLeft = GBW - (nLineBytes << 3); 225 nBitsLeft = GBW - (nLineBytes << 3);
224 for (FX_DWORD h = 0; h < GBH; h++) { 226 for (FX_DWORD h = 0; h < GBH; h++) {
225 if (TPGDON) { 227 if (TPGDON) {
226 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); 228 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
227 LTP = LTP ^ SLTP; 229 LTP = LTP ^ SLTP;
228 } 230 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 283 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
282 cVal |= bVal << (7 - k); 284 cVal |= bVal << (7 - k);
283 CONTEXT = 285 CONTEXT =
284 ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008); 286 ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008);
285 } 287 }
286 pLine[nLineBytes] = cVal; 288 pLine[nLineBytes] = cVal;
287 } 289 }
288 } 290 }
289 pLine += nStride; 291 pLine += nStride;
290 } 292 }
291 return GBREG; 293 return GBREG.release();
292 } 294 }
295
293 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_unopt( 296 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_unopt(
294 CJBig2_ArithDecoder* pArithDecoder, 297 CJBig2_ArithDecoder* pArithDecoder,
295 JBig2ArithCtx* gbContext) { 298 JBig2ArithCtx* gbContext) {
296 FX_BOOL LTP, SLTP, bVal; 299 FX_BOOL LTP, SLTP, bVal;
297 FX_DWORD CONTEXT; 300 FX_DWORD CONTEXT;
298 FX_DWORD line1, line2, line3; 301 FX_DWORD line1, line2, line3;
299 LTP = 0; 302 LTP = 0;
300 CJBig2_Image* GBREG = new CJBig2_Image(GBW, GBH); 303 nonstd::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
301 GBREG->fill(0); 304 GBREG->fill(0);
302 for (FX_DWORD h = 0; h < GBH; h++) { 305 for (FX_DWORD h = 0; h < GBH; h++) {
303 if (TPGDON) { 306 if (TPGDON) {
304 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); 307 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
305 LTP = LTP ^ SLTP; 308 LTP = LTP ^ SLTP;
306 } 309 }
307 if (LTP == 1) { 310 if (LTP == 1) {
308 GBREG->copyLine(h, h - 1); 311 GBREG->copyLine(h, h - 1);
309 } else { 312 } else {
310 line1 = GBREG->getPixel(2, h - 2); 313 line1 = GBREG->getPixel(2, h - 2);
(...skipping 15 matching lines...) Expand all
326 } 329 }
327 if (bVal) { 330 if (bVal) {
328 GBREG->setPixel(w, h, bVal); 331 GBREG->setPixel(w, h, bVal);
329 } 332 }
330 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; 333 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
331 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; 334 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
332 line3 = ((line3 << 1) | bVal) & 0x07; 335 line3 = ((line3 << 1) | bVal) & 0x07;
333 } 336 }
334 } 337 }
335 } 338 }
336 return GBREG; 339 return GBREG.release();
337 } 340 }
338 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt3( 341 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt3(
339 CJBig2_ArithDecoder* pArithDecoder, 342 CJBig2_ArithDecoder* pArithDecoder,
340 JBig2ArithCtx* gbContext) { 343 JBig2ArithCtx* gbContext) {
341 FX_BOOL LTP, SLTP, bVal; 344 FX_BOOL LTP, SLTP, bVal;
342 FX_DWORD CONTEXT; 345 FX_DWORD CONTEXT;
343 FX_DWORD line1, line2; 346 FX_DWORD line1, line2;
344 uint8_t *pLine, *pLine1, *pLine2, cVal; 347 uint8_t *pLine, *pLine1, *pLine2, cVal;
345 int32_t nStride, nStride2, k; 348 int32_t nStride, nStride2, k;
346 int32_t nLineBytes, nBitsLeft, cc; 349 int32_t nLineBytes, nBitsLeft, cc;
347 LTP = 0; 350 LTP = 0;
348 CJBig2_Image* GBREG = new CJBig2_Image(GBW, GBH); 351 nonstd::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
349 if (GBREG->m_pData == NULL) { 352 if (!GBREG->m_pData)
350 delete GBREG; 353 return nullptr;
351 return NULL; 354
352 }
353 pLine = GBREG->m_pData; 355 pLine = GBREG->m_pData;
354 nStride = GBREG->m_nStride; 356 nStride = GBREG->m_nStride;
355 nStride2 = nStride << 1; 357 nStride2 = nStride << 1;
356 nLineBytes = ((GBW + 7) >> 3) - 1; 358 nLineBytes = ((GBW + 7) >> 3) - 1;
357 nBitsLeft = GBW - (nLineBytes << 3); 359 nBitsLeft = GBW - (nLineBytes << 3);
358 for (FX_DWORD h = 0; h < GBH; h++) { 360 for (FX_DWORD h = 0; h < GBH; h++) {
359 if (TPGDON) { 361 if (TPGDON) {
360 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); 362 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
361 LTP = LTP ^ SLTP; 363 LTP = LTP ^ SLTP;
362 } 364 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 417 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
416 cVal |= bVal << (7 - k); 418 cVal |= bVal << (7 - k);
417 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | 419 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
418 (((line2 >> (10 - k))) & 0x0004); 420 (((line2 >> (10 - k))) & 0x0004);
419 } 421 }
420 pLine[nLineBytes] = cVal; 422 pLine[nLineBytes] = cVal;
421 } 423 }
422 } 424 }
423 pLine += nStride; 425 pLine += nStride;
424 } 426 }
425 return GBREG; 427 return GBREG.release();
426 } 428 }
429
427 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_unopt( 430 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_unopt(
428 CJBig2_ArithDecoder* pArithDecoder, 431 CJBig2_ArithDecoder* pArithDecoder,
429 JBig2ArithCtx* gbContext) { 432 JBig2ArithCtx* gbContext) {
430 FX_BOOL LTP, SLTP, bVal; 433 FX_BOOL LTP, SLTP, bVal;
431 FX_DWORD CONTEXT; 434 FX_DWORD CONTEXT;
432 FX_DWORD line1, line2, line3; 435 FX_DWORD line1, line2, line3;
433 LTP = 0; 436 LTP = 0;
434 CJBig2_Image* GBREG = new CJBig2_Image(GBW, GBH); 437 nonstd::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
435 GBREG->fill(0); 438 GBREG->fill(0);
436 for (FX_DWORD h = 0; h < GBH; h++) { 439 for (FX_DWORD h = 0; h < GBH; h++) {
437 if (TPGDON) { 440 if (TPGDON) {
438 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); 441 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
439 LTP = LTP ^ SLTP; 442 LTP = LTP ^ SLTP;
440 } 443 }
441 if (LTP == 1) { 444 if (LTP == 1) {
442 GBREG->copyLine(h, h - 1); 445 GBREG->copyLine(h, h - 1);
443 } else { 446 } else {
444 line1 = GBREG->getPixel(1, h - 2); 447 line1 = GBREG->getPixel(1, h - 2);
(...skipping 13 matching lines...) Expand all
458 } 461 }
459 if (bVal) { 462 if (bVal) {
460 GBREG->setPixel(w, h, bVal); 463 GBREG->setPixel(w, h, bVal);
461 } 464 }
462 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; 465 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
463 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f; 466 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;
464 line3 = ((line3 << 1) | bVal) & 0x03; 467 line3 = ((line3 << 1) | bVal) & 0x03;
465 } 468 }
466 } 469 }
467 } 470 }
468 return GBREG; 471 return GBREG.release();
469 } 472 }
473
470 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt3( 474 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt3(
471 CJBig2_ArithDecoder* pArithDecoder, 475 CJBig2_ArithDecoder* pArithDecoder,
472 JBig2ArithCtx* gbContext) { 476 JBig2ArithCtx* gbContext) {
473 FX_BOOL LTP, SLTP, bVal; 477 FX_BOOL LTP, SLTP, bVal;
474 FX_DWORD CONTEXT; 478 FX_DWORD CONTEXT;
475 FX_DWORD line1; 479 FX_DWORD line1;
476 uint8_t *pLine, *pLine1, cVal; 480 uint8_t *pLine, *pLine1, cVal;
477 int32_t nStride, k; 481 int32_t nStride, k;
478 int32_t nLineBytes, nBitsLeft, cc; 482 int32_t nLineBytes, nBitsLeft, cc;
479 LTP = 0; 483 LTP = 0;
480 CJBig2_Image* GBREG = new CJBig2_Image(GBW, GBH); 484 nonstd::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
481 if (GBREG->m_pData == NULL) { 485 if (!GBREG->m_pData)
482 delete GBREG; 486 return nullptr;
483 return NULL; 487
484 }
485 pLine = GBREG->m_pData; 488 pLine = GBREG->m_pData;
486 nStride = GBREG->m_nStride; 489 nStride = GBREG->m_nStride;
487 nLineBytes = ((GBW + 7) >> 3) - 1; 490 nLineBytes = ((GBW + 7) >> 3) - 1;
488 nBitsLeft = GBW - (nLineBytes << 3); 491 nBitsLeft = GBW - (nLineBytes << 3);
489 for (FX_DWORD h = 0; h < GBH; h++) { 492 for (FX_DWORD h = 0; h < GBH; h++) {
490 if (TPGDON) { 493 if (TPGDON) {
491 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); 494 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
492 LTP = LTP ^ SLTP; 495 LTP = LTP ^ SLTP;
493 } 496 }
494 if (LTP == 1) { 497 if (LTP == 1) {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 for (k = 0; k < nBitsLeft; k++) { 536 for (k = 0; k < nBitsLeft; k++) {
534 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 537 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
535 cVal |= bVal << (7 - k); 538 cVal |= bVal << (7 - k);
536 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; 539 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
537 } 540 }
538 pLine[nLineBytes] = cVal; 541 pLine[nLineBytes] = cVal;
539 } 542 }
540 } 543 }
541 pLine += nStride; 544 pLine += nStride;
542 } 545 }
543 return GBREG; 546 return GBREG.release();
544 } 547 }
548
545 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_unopt( 549 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_unopt(
546 CJBig2_ArithDecoder* pArithDecoder, 550 CJBig2_ArithDecoder* pArithDecoder,
547 JBig2ArithCtx* gbContext) { 551 JBig2ArithCtx* gbContext) {
548 FX_BOOL LTP, SLTP, bVal; 552 FX_BOOL LTP, SLTP, bVal;
549 FX_DWORD CONTEXT; 553 FX_DWORD CONTEXT;
550 FX_DWORD line1, line2; 554 FX_DWORD line1, line2;
551 LTP = 0; 555 LTP = 0;
552 CJBig2_Image* GBREG = new CJBig2_Image(GBW, GBH); 556 nonstd::unique_ptr<CJBig2_Image> GBREG(new CJBig2_Image(GBW, GBH));
553 GBREG->fill(0); 557 GBREG->fill(0);
554 for (FX_DWORD h = 0; h < GBH; h++) { 558 for (FX_DWORD h = 0; h < GBH; h++) {
555 if (TPGDON) { 559 if (TPGDON) {
556 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); 560 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
557 LTP = LTP ^ SLTP; 561 LTP = LTP ^ SLTP;
558 } 562 }
559 if (LTP == 1) { 563 if (LTP == 1) {
560 GBREG->copyLine(h, h - 1); 564 GBREG->copyLine(h, h - 1);
561 } else { 565 } else {
562 line1 = GBREG->getPixel(1, h - 1); 566 line1 = GBREG->getPixel(1, h - 1);
563 line1 |= GBREG->getPixel(0, h - 1) << 1; 567 line1 |= GBREG->getPixel(0, h - 1) << 1;
564 line2 = 0; 568 line2 = 0;
565 for (FX_DWORD w = 0; w < GBW; w++) { 569 for (FX_DWORD w = 0; w < GBW; w++) {
566 if (USESKIP && SKIP->getPixel(w, h)) { 570 if (USESKIP && SKIP->getPixel(w, h)) {
567 bVal = 0; 571 bVal = 0;
568 } else { 572 } else {
569 CONTEXT = line2; 573 CONTEXT = line2;
570 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; 574 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
571 CONTEXT |= line1 << 5; 575 CONTEXT |= line1 << 5;
572 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); 576 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
573 } 577 }
574 if (bVal) { 578 if (bVal) {
575 GBREG->setPixel(w, h, bVal); 579 GBREG->setPixel(w, h, bVal);
576 } 580 }
577 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f; 581 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;
578 line2 = ((line2 << 1) | bVal) & 0x0f; 582 line2 = ((line2 << 1) | bVal) & 0x0f;
579 } 583 }
580 } 584 }
581 } 585 }
582 return GBREG; 586 return GBREG.release();
583 } 587 }
588
584 CJBig2_Image* CJBig2_GRRDProc::decode(CJBig2_ArithDecoder* pArithDecoder, 589 CJBig2_Image* CJBig2_GRRDProc::decode(CJBig2_ArithDecoder* pArithDecoder,
585 JBig2ArithCtx* grContext) { 590 JBig2ArithCtx* grContext) {
586 if (GRW == 0 || GRH == 0) { 591 if (GRW == 0 || GRH == 0) {
587 return new CJBig2_Image(GRW, GRH); 592 return new CJBig2_Image(GRW, GRH);
588 } 593 }
589 if (GRTEMPLATE == 0) { 594 if (GRTEMPLATE == 0) {
590 if ((GRAT[0] == (int8_t)-1) && (GRAT[1] == (int8_t)-1) && 595 if ((GRAT[0] == (int8_t)-1) && (GRAT[1] == (int8_t)-1) &&
591 (GRAT[2] == (int8_t)-1) && (GRAT[3] == (int8_t)-1) && 596 (GRAT[2] == (int8_t)-1) && (GRAT[3] == (int8_t)-1) &&
592 (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) { 597 (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
593 return decode_Template0_opt(pArithDecoder, grContext); 598 return decode_Template0_opt(pArithDecoder, grContext);
594 } else { 599 } else {
595 return decode_Template0_unopt(pArithDecoder, grContext); 600 return decode_Template0_unopt(pArithDecoder, grContext);
596 } 601 }
597 } else { 602 } else {
598 if ((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) { 603 if ((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
599 return decode_Template1_opt(pArithDecoder, grContext); 604 return decode_Template1_opt(pArithDecoder, grContext);
600 } else { 605 } else {
601 return decode_Template1_unopt(pArithDecoder, grContext); 606 return decode_Template1_unopt(pArithDecoder, grContext);
602 } 607 }
603 } 608 }
604 } 609 }
610
605 CJBig2_Image* CJBig2_GRRDProc::decode_Template0_unopt( 611 CJBig2_Image* CJBig2_GRRDProc::decode_Template0_unopt(
606 CJBig2_ArithDecoder* pArithDecoder, 612 CJBig2_ArithDecoder* pArithDecoder,
607 JBig2ArithCtx* grContext) { 613 JBig2ArithCtx* grContext) {
608 FX_BOOL LTP, SLTP, bVal; 614 FX_BOOL LTP, SLTP, bVal;
609 FX_DWORD CONTEXT; 615 FX_DWORD CONTEXT;
610 FX_DWORD line1, line2, line3, line4, line5; 616 FX_DWORD line1, line2, line3, line4, line5;
611 LTP = 0; 617 LTP = 0;
612 CJBig2_Image* GRREG = new CJBig2_Image(GRW, GRH); 618 nonstd::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(GRW, GRH));
613 GRREG->fill(0); 619 GRREG->fill(0);
614 for (FX_DWORD h = 0; h < GRH; h++) { 620 for (FX_DWORD h = 0; h < GRH; h++) {
615 if (TPGRON) { 621 if (TPGRON) {
616 SLTP = pArithDecoder->DECODE(&grContext[0x0010]); 622 SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
617 LTP = LTP ^ SLTP; 623 LTP = LTP ^ SLTP;
618 } 624 }
619 if (LTP == 0) { 625 if (LTP == 0) {
620 line1 = GRREG->getPixel(1, h - 1); 626 line1 = GRREG->getPixel(1, h - 1);
621 line1 |= GRREG->getPixel(0, h - 1) << 1; 627 line1 |= GRREG->getPixel(0, h - 1) << 1;
622 line2 = 0; 628 line2 = 0;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 ((line4 << 1) | 713 ((line4 << 1) |
708 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 714 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) &
709 0x07; 715 0x07;
710 line5 = ((line5 << 1) | 716 line5 = ((line5 << 1) |
711 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, 717 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2,
712 h - GRREFERENCEDY + 1)) & 718 h - GRREFERENCEDY + 1)) &
713 0x07; 719 0x07;
714 } 720 }
715 } 721 }
716 } 722 }
717 return GRREG; 723 return GRREG.release();
718 } 724 }
725
719 CJBig2_Image* CJBig2_GRRDProc::decode_Template0_opt( 726 CJBig2_Image* CJBig2_GRRDProc::decode_Template0_opt(
720 CJBig2_ArithDecoder* pArithDecoder, 727 CJBig2_ArithDecoder* pArithDecoder,
721 JBig2ArithCtx* grContext) { 728 JBig2ArithCtx* grContext) {
722 if (!GRREFERENCE->m_pData) 729 if (!GRREFERENCE->m_pData)
723 return nullptr; 730 return nullptr;
724 731
725 FX_BOOL LTP, SLTP, bVal; 732 FX_BOOL LTP, SLTP, bVal;
726 FX_DWORD CONTEXT; 733 FX_DWORD CONTEXT;
727 FX_DWORD line1, line1_r, line2_r, line3_r; 734 FX_DWORD line1, line1_r, line2_r, line3_r;
728 uint8_t *pLine, *pLineR, cVal; 735 uint8_t *pLine, *pLineR, cVal;
729 intptr_t nStride, nStrideR, nOffset; 736 intptr_t nStride, nStrideR, nOffset;
730 int32_t k, nBits; 737 int32_t k, nBits;
731 int32_t GRWR, GRHR; 738 int32_t GRWR, GRHR;
732 int32_t GRW, GRH; 739 int32_t GRW, GRH;
733 GRW = (int32_t)CJBig2_GRRDProc::GRW; 740 GRW = (int32_t)CJBig2_GRRDProc::GRW;
734 GRH = (int32_t)CJBig2_GRRDProc::GRH; 741 GRH = (int32_t)CJBig2_GRRDProc::GRH;
735 LTP = 0; 742 LTP = 0;
736 CJBig2_Image* GRREG = new CJBig2_Image(GRW, GRH); 743 nonstd::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(GRW, GRH));
737 if (GRREG->m_pData == NULL) { 744 if (!GRREG->m_pData)
738 delete GRREG; 745 return nullptr;
739 return NULL; 746
740 }
741 pLine = GRREG->m_pData; 747 pLine = GRREG->m_pData;
742 pLineR = GRREFERENCE->m_pData; 748 pLineR = GRREFERENCE->m_pData;
743 nStride = GRREG->m_nStride; 749 nStride = GRREG->m_nStride;
744 nStrideR = GRREFERENCE->m_nStride; 750 nStrideR = GRREFERENCE->m_nStride;
745 GRWR = (int32_t)GRREFERENCE->m_nWidth; 751 GRWR = (int32_t)GRREFERENCE->m_nWidth;
746 GRHR = (int32_t)GRREFERENCE->m_nHeight; 752 GRHR = (int32_t)GRREFERENCE->m_nHeight;
747 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { 753 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
748 GRREFERENCEDY = 0; 754 GRREFERENCEDY = 0;
749 } 755 }
750 nOffset = -GRREFERENCEDY * nStrideR; 756 nOffset = -GRREFERENCEDY * nStrideR;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 ((line3_r >> (13 - k)) & 0x0001); 850 ((line3_r >> (13 - k)) & 0x0001);
845 } 851 }
846 pLine[w >> 3] = cVal; 852 pLine[w >> 3] = cVal;
847 } 853 }
848 } 854 }
849 pLine += nStride; 855 pLine += nStride;
850 if (h < GRHR + GRREFERENCEDY) { 856 if (h < GRHR + GRREFERENCEDY) {
851 pLineR += nStrideR; 857 pLineR += nStrideR;
852 } 858 }
853 } 859 }
854 return GRREG; 860 return GRREG.release();
855 } 861 }
862
856 CJBig2_Image* CJBig2_GRRDProc::decode_Template1_unopt( 863 CJBig2_Image* CJBig2_GRRDProc::decode_Template1_unopt(
857 CJBig2_ArithDecoder* pArithDecoder, 864 CJBig2_ArithDecoder* pArithDecoder,
858 JBig2ArithCtx* grContext) { 865 JBig2ArithCtx* grContext) {
859 FX_BOOL LTP, SLTP, bVal; 866 FX_BOOL LTP, SLTP, bVal;
860 FX_DWORD CONTEXT; 867 FX_DWORD CONTEXT;
861 FX_DWORD line1, line2, line3, line4, line5; 868 FX_DWORD line1, line2, line3, line4, line5;
862 LTP = 0; 869 LTP = 0;
863 CJBig2_Image* GRREG = new CJBig2_Image(GRW, GRH); 870 nonstd::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(GRW, GRH));
864 GRREG->fill(0); 871 GRREG->fill(0);
865 for (FX_DWORD h = 0; h < GRH; h++) { 872 for (FX_DWORD h = 0; h < GRH; h++) {
866 if (TPGRON) { 873 if (TPGRON) {
867 SLTP = pArithDecoder->DECODE(&grContext[0x0008]); 874 SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
868 LTP = LTP ^ SLTP; 875 LTP = LTP ^ SLTP;
869 } 876 }
870 if (LTP == 0) { 877 if (LTP == 0) {
871 line1 = GRREG->getPixel(1, h - 1); 878 line1 = GRREG->getPixel(1, h - 1);
872 line1 |= GRREG->getPixel(0, h - 1) << 1; 879 line1 |= GRREG->getPixel(0, h - 1) << 1;
873 line1 |= GRREG->getPixel(-1, h - 1) << 2; 880 line1 |= GRREG->getPixel(-1, h - 1) << 2;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
944 ((line4 << 1) | 951 ((line4 << 1) |
945 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 952 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) &
946 0x07; 953 0x07;
947 line5 = ((line5 << 1) | 954 line5 = ((line5 << 1) |
948 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, 955 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2,
949 h - GRREFERENCEDY + 1)) & 956 h - GRREFERENCEDY + 1)) &
950 0x03; 957 0x03;
951 } 958 }
952 } 959 }
953 } 960 }
954 return GRREG; 961 return GRREG.release();
955 } 962 }
963
956 CJBig2_Image* CJBig2_GRRDProc::decode_Template1_opt( 964 CJBig2_Image* CJBig2_GRRDProc::decode_Template1_opt(
957 CJBig2_ArithDecoder* pArithDecoder, 965 CJBig2_ArithDecoder* pArithDecoder,
958 JBig2ArithCtx* grContext) { 966 JBig2ArithCtx* grContext) {
959 if (!GRREFERENCE->m_pData) 967 if (!GRREFERENCE->m_pData)
960 return nullptr; 968 return nullptr;
961 969
962 FX_BOOL LTP, SLTP, bVal; 970 FX_BOOL LTP, SLTP, bVal;
963 FX_DWORD CONTEXT; 971 FX_DWORD CONTEXT;
964 FX_DWORD line1, line1_r, line2_r, line3_r; 972 FX_DWORD line1, line1_r, line2_r, line3_r;
965 uint8_t *pLine, *pLineR, cVal; 973 uint8_t *pLine, *pLineR, cVal;
966 intptr_t nStride, nStrideR, nOffset; 974 intptr_t nStride, nStrideR, nOffset;
967 int32_t k, nBits; 975 int32_t k, nBits;
968 int32_t GRWR, GRHR; 976 int32_t GRWR, GRHR;
969 int32_t GRW, GRH; 977 int32_t GRW, GRH;
970 GRW = (int32_t)CJBig2_GRRDProc::GRW; 978 GRW = (int32_t)CJBig2_GRRDProc::GRW;
971 GRH = (int32_t)CJBig2_GRRDProc::GRH; 979 GRH = (int32_t)CJBig2_GRRDProc::GRH;
972 LTP = 0; 980 LTP = 0;
973 CJBig2_Image* GRREG = new CJBig2_Image(GRW, GRH); 981 nonstd::unique_ptr<CJBig2_Image> GRREG(new CJBig2_Image(GRW, GRH));
974 if (GRREG->m_pData == NULL) { 982 if (!GRREG->m_pData)
975 delete GRREG; 983 return nullptr;
976 return NULL; 984
977 }
978 pLine = GRREG->m_pData; 985 pLine = GRREG->m_pData;
979 pLineR = GRREFERENCE->m_pData; 986 pLineR = GRREFERENCE->m_pData;
980 nStride = GRREG->m_nStride; 987 nStride = GRREG->m_nStride;
981 nStrideR = GRREFERENCE->m_nStride; 988 nStrideR = GRREFERENCE->m_nStride;
982 GRWR = (int32_t)GRREFERENCE->m_nWidth; 989 GRWR = (int32_t)GRREFERENCE->m_nWidth;
983 GRHR = (int32_t)GRREFERENCE->m_nHeight; 990 GRHR = (int32_t)GRREFERENCE->m_nHeight;
984 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { 991 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
985 GRREFERENCEDY = 0; 992 GRREFERENCEDY = 0;
986 } 993 }
987 nOffset = -GRREFERENCEDY * nStrideR; 994 nOffset = -GRREFERENCEDY * nStrideR;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1075 ((line3_r >> (13 - k)) & 0x0001); 1082 ((line3_r >> (13 - k)) & 0x0001);
1076 } 1083 }
1077 pLine[w >> 3] = cVal; 1084 pLine[w >> 3] = cVal;
1078 } 1085 }
1079 } 1086 }
1080 pLine += nStride; 1087 pLine += nStride;
1081 if (h < GRHR + GRREFERENCEDY) { 1088 if (h < GRHR + GRREFERENCEDY) {
1082 pLineR += nStrideR; 1089 pLineR += nStrideR;
1083 } 1090 }
1084 } 1091 }
1085 return GRREG; 1092 return GRREG.release();
1086 } 1093 }
1087 1094
1088 CJBig2_Image* CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream* pStream, 1095 CJBig2_Image* CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream* pStream,
1089 JBig2ArithCtx* grContext) { 1096 JBig2ArithCtx* grContext) {
1090 int32_t STRIPT, FIRSTS; 1097 int32_t STRIPT, FIRSTS;
1091 FX_DWORD NINSTANCES; 1098 FX_DWORD NINSTANCES;
1092 int32_t DT, DFS, CURS; 1099 int32_t DT, DFS, CURS;
1093 uint8_t CURT; 1100 uint8_t CURT;
1094 int32_t SI, TI; 1101 int32_t SI, TI;
1095 FX_DWORD IDI; 1102 FX_DWORD IDI;
1096 CJBig2_Image* IBI; 1103 CJBig2_Image* IBI;
1097 FX_DWORD WI, HI; 1104 FX_DWORD WI, HI;
1098 int32_t IDS; 1105 int32_t IDS;
1099 FX_BOOL RI; 1106 FX_BOOL RI;
1100 int32_t RDWI, RDHI, RDXI, RDYI; 1107 int32_t RDWI, RDHI, RDXI, RDYI;
1101 CJBig2_Image* IBOI; 1108 CJBig2_Image* IBOI;
1102 FX_DWORD WOI, HOI; 1109 FX_DWORD WOI, HOI;
1103 FX_BOOL bFirst; 1110 FX_BOOL bFirst;
1104 FX_DWORD nTmp; 1111 FX_DWORD nTmp;
1105 int32_t nVal, nBits; 1112 int32_t nVal, nBits;
1106 CJBig2_GRRDProc* pGRRD; 1113 nonstd::unique_ptr<CJBig2_HuffmanDecoder> pHuffmanDecoder(
1107 CJBig2_ArithDecoder* pArithDecoder; 1114 new CJBig2_HuffmanDecoder(pStream));
1108 CJBig2_HuffmanDecoder* pHuffmanDecoder = new CJBig2_HuffmanDecoder(pStream); 1115 nonstd::unique_ptr<CJBig2_Image> SBREG(new CJBig2_Image(SBW, SBH));
1109 CJBig2_Image* SBREG = new CJBig2_Image(SBW, SBH);
1110 SBREG->fill(SBDEFPIXEL); 1116 SBREG->fill(SBDEFPIXEL);
1111 if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) { 1117 if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0)
1112 goto failed; 1118 return nullptr;
1113 } 1119
1114 STRIPT *= SBSTRIPS; 1120 STRIPT *= SBSTRIPS;
1115 STRIPT = -STRIPT; 1121 STRIPT = -STRIPT;
1116 FIRSTS = 0; 1122 FIRSTS = 0;
1117 NINSTANCES = 0; 1123 NINSTANCES = 0;
1118 while (NINSTANCES < SBNUMINSTANCES) { 1124 while (NINSTANCES < SBNUMINSTANCES) {
1119 if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) { 1125 if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0)
1120 goto failed; 1126 return nullptr;
1121 } 1127
1122 DT *= SBSTRIPS; 1128 DT *= SBSTRIPS;
1123 STRIPT = STRIPT + DT; 1129 STRIPT = STRIPT + DT;
1124 bFirst = TRUE; 1130 bFirst = TRUE;
1125 for (;;) { 1131 for (;;) {
1126 if (bFirst) { 1132 if (bFirst) {
1127 if (pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) { 1133 if (pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0)
1128 goto failed; 1134 return nullptr;
1129 } 1135
1130 FIRSTS = FIRSTS + DFS; 1136 FIRSTS = FIRSTS + DFS;
1131 CURS = FIRSTS; 1137 CURS = FIRSTS;
1132 bFirst = FALSE; 1138 bFirst = FALSE;
1133 } else { 1139 } else {
1134 nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS); 1140 nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS);
1135 if (nVal == JBIG2_OOB) { 1141 if (nVal == JBIG2_OOB) {
1136 break; 1142 break;
1137 } else if (nVal != 0) { 1143 } else if (nVal != 0) {
1138 goto failed; 1144 return nullptr;
1139 } else { 1145 } else {
1140 CURS = CURS + IDS + SBDSOFFSET; 1146 CURS = CURS + IDS + SBDSOFFSET;
1141 } 1147 }
1142 } 1148 }
1143 if (SBSTRIPS == 1) { 1149 if (SBSTRIPS == 1) {
1144 CURT = 0; 1150 CURT = 0;
1145 } else { 1151 } else {
1146 nTmp = 1; 1152 nTmp = 1;
1147 while ((FX_DWORD)(1 << nTmp) < SBSTRIPS) { 1153 while ((FX_DWORD)(1 << nTmp) < SBSTRIPS) {
1148 nTmp++; 1154 nTmp++;
1149 } 1155 }
1150 if (pStream->readNBits(nTmp, &nVal) != 0) { 1156 if (pStream->readNBits(nTmp, &nVal) != 0)
1151 goto failed; 1157 return nullptr;
1152 } 1158
1153 CURT = nVal; 1159 CURT = nVal;
1154 } 1160 }
1155 TI = STRIPT + CURT; 1161 TI = STRIPT + CURT;
1156 nVal = 0; 1162 nVal = 0;
1157 nBits = 0; 1163 nBits = 0;
1158 for (;;) { 1164 for (;;) {
1159 if (pStream->read1Bit(&nTmp) != 0) { 1165 if (pStream->read1Bit(&nTmp) != 0)
1160 goto failed; 1166 return nullptr;
1161 } 1167
1162 nVal = (nVal << 1) | nTmp; 1168 nVal = (nVal << 1) | nTmp;
1163 nBits++; 1169 nBits++;
1164 for (IDI = 0; IDI < SBNUMSYMS; IDI++) { 1170 for (IDI = 0; IDI < SBNUMSYMS; IDI++) {
1165 if ((nBits == SBSYMCODES[IDI].codelen) && 1171 if ((nBits == SBSYMCODES[IDI].codelen) &&
1166 (nVal == SBSYMCODES[IDI].code)) { 1172 (nVal == SBSYMCODES[IDI].code)) {
1167 break; 1173 break;
1168 } 1174 }
1169 } 1175 }
1170 if (IDI < SBNUMSYMS) { 1176 if (IDI < SBNUMSYMS) {
1171 break; 1177 break;
1172 } 1178 }
1173 } 1179 }
1174 if (SBREFINE == 0) { 1180 if (SBREFINE == 0) {
1175 RI = 0; 1181 RI = 0;
1176 } else { 1182 } else {
1177 if (pStream->read1Bit(&RI) != 0) { 1183 if (pStream->read1Bit(&RI) != 0) {
1178 goto failed; 1184 return nullptr;
1179 } 1185 }
1180 } 1186 }
1181 if (RI == 0) { 1187 if (RI == 0) {
1182 IBI = SBSYMS[IDI]; 1188 IBI = SBSYMS[IDI];
1183 } else { 1189 } else {
1184 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0) || 1190 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0) ||
1185 (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0) || 1191 (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0) ||
1186 (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) || 1192 (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) ||
1187 (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0) || 1193 (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0) ||
1188 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) { 1194 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {
1189 goto failed; 1195 return nullptr;
1190 } 1196 }
1191 pStream->alignByte(); 1197 pStream->alignByte();
1192 nTmp = pStream->getOffset(); 1198 nTmp = pStream->getOffset();
1193 IBOI = SBSYMS[IDI]; 1199 IBOI = SBSYMS[IDI];
1194 if (!IBOI) { 1200 if (!IBOI)
1195 goto failed; 1201 return nullptr;
1196 } 1202
1197 WOI = IBOI->m_nWidth; 1203 WOI = IBOI->m_nWidth;
1198 HOI = IBOI->m_nHeight; 1204 HOI = IBOI->m_nHeight;
1199 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { 1205 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0)
1200 goto failed; 1206 return nullptr;
1201 } 1207
1202 pGRRD = new CJBig2_GRRDProc(); 1208 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc());
1203 pGRRD->GRW = WOI + RDWI; 1209 pGRRD->GRW = WOI + RDWI;
1204 pGRRD->GRH = HOI + RDHI; 1210 pGRRD->GRH = HOI + RDHI;
1205 pGRRD->GRTEMPLATE = SBRTEMPLATE; 1211 pGRRD->GRTEMPLATE = SBRTEMPLATE;
1206 pGRRD->GRREFERENCE = IBOI; 1212 pGRRD->GRREFERENCE = IBOI;
1207 pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI; 1213 pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI;
1208 pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI; 1214 pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI;
1209 pGRRD->TPGRON = 0; 1215 pGRRD->TPGRON = 0;
1210 pGRRD->GRAT[0] = SBRAT[0]; 1216 pGRRD->GRAT[0] = SBRAT[0];
1211 pGRRD->GRAT[1] = SBRAT[1]; 1217 pGRRD->GRAT[1] = SBRAT[1];
1212 pGRRD->GRAT[2] = SBRAT[2]; 1218 pGRRD->GRAT[2] = SBRAT[2];
1213 pGRRD->GRAT[3] = SBRAT[3]; 1219 pGRRD->GRAT[3] = SBRAT[3];
1214 pArithDecoder = new CJBig2_ArithDecoder(pStream); 1220 nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
1215 IBI = pGRRD->decode(pArithDecoder, grContext); 1221 new CJBig2_ArithDecoder(pStream));
1216 if (IBI == NULL) { 1222 IBI = pGRRD->decode(pArithDecoder.get(), grContext);
1217 delete pGRRD; 1223 if (!IBI)
1218 delete pArithDecoder; 1224 return nullptr;
1219 goto failed; 1225
1220 }
1221 delete pArithDecoder;
1222 pStream->alignByte(); 1226 pStream->alignByte();
1223 pStream->offset(2); 1227 pStream->offset(2);
1224 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { 1228 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
1225 delete IBI; 1229 delete IBI;
1226 delete pGRRD; 1230 return nullptr;
1227 goto failed;
1228 } 1231 }
1229 delete pGRRD;
1230 } 1232 }
1231 if (!IBI) { 1233 if (!IBI) {
1232 continue; 1234 continue;
1233 } 1235 }
1234 WI = IBI->m_nWidth; 1236 WI = IBI->m_nWidth;
1235 HI = IBI->m_nHeight; 1237 HI = IBI->m_nHeight;
1236 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) || 1238 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) ||
1237 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { 1239 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
1238 CURS = CURS + WI - 1; 1240 CURS = CURS + WI - 1;
1239 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) || 1241 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) ||
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || 1280 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) ||
1279 (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { 1281 (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
1280 CURS = CURS + WI - 1; 1282 CURS = CURS + WI - 1;
1281 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || 1283 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) ||
1282 (REFCORNER == JBIG2_CORNER_TOPRIGHT))) { 1284 (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {
1283 CURS = CURS + HI - 1; 1285 CURS = CURS + HI - 1;
1284 } 1286 }
1285 NINSTANCES = NINSTANCES + 1; 1287 NINSTANCES = NINSTANCES + 1;
1286 } 1288 }
1287 } 1289 }
1288 delete pHuffmanDecoder; 1290 return SBREG.release();
1289 return SBREG;
1290 failed:
1291 delete pHuffmanDecoder;
1292 delete SBREG;
1293 return NULL;
1294 } 1291 }
1292
1295 CJBig2_Image* CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, 1293 CJBig2_Image* CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
1296 JBig2ArithCtx* grContext, 1294 JBig2ArithCtx* grContext,
1297 JBig2IntDecoderState* pIDS) { 1295 JBig2IntDecoderState* pIDS) {
1298 int32_t STRIPT, FIRSTS; 1296 int32_t STRIPT, FIRSTS;
1299 FX_DWORD NINSTANCES; 1297 FX_DWORD NINSTANCES;
1300 int32_t DT, DFS, CURS; 1298 int32_t DT, DFS, CURS;
1301 int32_t CURT; 1299 int32_t CURT;
1302 int32_t SI, TI; 1300 int32_t SI, TI;
1303 FX_DWORD IDI; 1301 FX_DWORD IDI;
1304 CJBig2_Image* IBI; 1302 CJBig2_Image* IBI;
1305 FX_DWORD WI, HI; 1303 FX_DWORD WI, HI;
1306 int32_t IDS; 1304 int32_t IDS;
1307 int RI; 1305 int RI;
1308 int32_t RDWI, RDHI, RDXI, RDYI; 1306 int32_t RDWI, RDHI, RDXI, RDYI;
1309 CJBig2_Image* IBOI; 1307 CJBig2_Image* IBOI;
1310 FX_DWORD WOI, HOI; 1308 FX_DWORD WOI, HOI;
1311 CJBig2_Image* SBREG;
1312 FX_BOOL bFirst; 1309 FX_BOOL bFirst;
1313 int32_t nRet, nVal; 1310 int32_t nRet, nVal;
1314 int32_t bRetained; 1311 int32_t bRetained;
1315 CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, 1312 CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH,
1316 *IARDX, *IARDY; 1313 *IARDX, *IARDY;
1317 CJBig2_ArithIaidDecoder* IAID; 1314 CJBig2_ArithIaidDecoder* IAID;
1318 CJBig2_GRRDProc* pGRRD;
1319 if (pIDS) { 1315 if (pIDS) {
1320 IADT = pIDS->IADT; 1316 IADT = pIDS->IADT;
1321 IAFS = pIDS->IAFS; 1317 IAFS = pIDS->IAFS;
1322 IADS = pIDS->IADS; 1318 IADS = pIDS->IADS;
1323 IAIT = pIDS->IAIT; 1319 IAIT = pIDS->IAIT;
1324 IARI = pIDS->IARI; 1320 IARI = pIDS->IARI;
1325 IARDW = pIDS->IARDW; 1321 IARDW = pIDS->IARDW;
1326 IARDH = pIDS->IARDH; 1322 IARDH = pIDS->IARDH;
1327 IARDX = pIDS->IARDX; 1323 IARDX = pIDS->IARDX;
1328 IARDY = pIDS->IARDY; 1324 IARDY = pIDS->IARDY;
1329 IAID = pIDS->IAID; 1325 IAID = pIDS->IAID;
1330 bRetained = TRUE; 1326 bRetained = TRUE;
1331 } else { 1327 } else {
1332 IADT = new CJBig2_ArithIntDecoder(); 1328 IADT = new CJBig2_ArithIntDecoder();
1333 IAFS = new CJBig2_ArithIntDecoder(); 1329 IAFS = new CJBig2_ArithIntDecoder();
1334 IADS = new CJBig2_ArithIntDecoder(); 1330 IADS = new CJBig2_ArithIntDecoder();
1335 IAIT = new CJBig2_ArithIntDecoder(); 1331 IAIT = new CJBig2_ArithIntDecoder();
1336 IARI = new CJBig2_ArithIntDecoder(); 1332 IARI = new CJBig2_ArithIntDecoder();
1337 IARDW = new CJBig2_ArithIntDecoder(); 1333 IARDW = new CJBig2_ArithIntDecoder();
1338 IARDH = new CJBig2_ArithIntDecoder(); 1334 IARDH = new CJBig2_ArithIntDecoder();
1339 IARDX = new CJBig2_ArithIntDecoder(); 1335 IARDX = new CJBig2_ArithIntDecoder();
1340 IARDY = new CJBig2_ArithIntDecoder(); 1336 IARDY = new CJBig2_ArithIntDecoder();
1341 IAID = new CJBig2_ArithIaidDecoder(SBSYMCODELEN); 1337 IAID = new CJBig2_ArithIaidDecoder(SBSYMCODELEN);
1342 bRetained = FALSE; 1338 bRetained = FALSE;
1343 } 1339 }
1344 SBREG = new CJBig2_Image(SBW, SBH); 1340 nonstd::unique_ptr<CJBig2_Image> SBREG(new CJBig2_Image(SBW, SBH));
1345 SBREG->fill(SBDEFPIXEL); 1341 SBREG->fill(SBDEFPIXEL);
1346 if (IADT->decode(pArithDecoder, &STRIPT) == -1) { 1342 if (IADT->decode(pArithDecoder, &STRIPT) == -1) {
1347 goto failed; 1343 goto failed;
1348 } 1344 }
1349 STRIPT *= SBSTRIPS; 1345 STRIPT *= SBSTRIPS;
1350 STRIPT = -STRIPT; 1346 STRIPT = -STRIPT;
1351 FIRSTS = 0; 1347 FIRSTS = 0;
1352 NINSTANCES = 0; 1348 NINSTANCES = 0;
1353 while (NINSTANCES < SBNUMINSTANCES) { 1349 while (NINSTANCES < SBNUMINSTANCES) {
1354 if (IADT->decode(pArithDecoder, &DT) == -1) { 1350 if (IADT->decode(pArithDecoder, &DT) == -1) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 (IARDX->decode(pArithDecoder, &RDXI) == -1) || 1408 (IARDX->decode(pArithDecoder, &RDXI) == -1) ||
1413 (IARDY->decode(pArithDecoder, &RDYI) == -1)) { 1409 (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
1414 goto failed; 1410 goto failed;
1415 } 1411 }
1416 IBOI = SBSYMS[IDI]; 1412 IBOI = SBSYMS[IDI];
1417 WOI = IBOI->m_nWidth; 1413 WOI = IBOI->m_nWidth;
1418 HOI = IBOI->m_nHeight; 1414 HOI = IBOI->m_nHeight;
1419 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { 1415 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
1420 goto failed; 1416 goto failed;
1421 } 1417 }
1422 pGRRD = new CJBig2_GRRDProc(); 1418 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc());
1423 pGRRD->GRW = WOI + RDWI; 1419 pGRRD->GRW = WOI + RDWI;
1424 pGRRD->GRH = HOI + RDHI; 1420 pGRRD->GRH = HOI + RDHI;
1425 pGRRD->GRTEMPLATE = SBRTEMPLATE; 1421 pGRRD->GRTEMPLATE = SBRTEMPLATE;
1426 pGRRD->GRREFERENCE = IBOI; 1422 pGRRD->GRREFERENCE = IBOI;
1427 pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI; 1423 pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI;
1428 pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI; 1424 pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI;
1429 pGRRD->TPGRON = 0; 1425 pGRRD->TPGRON = 0;
1430 pGRRD->GRAT[0] = SBRAT[0]; 1426 pGRRD->GRAT[0] = SBRAT[0];
1431 pGRRD->GRAT[1] = SBRAT[1]; 1427 pGRRD->GRAT[1] = SBRAT[1];
1432 pGRRD->GRAT[2] = SBRAT[2]; 1428 pGRRD->GRAT[2] = SBRAT[2];
1433 pGRRD->GRAT[3] = SBRAT[3]; 1429 pGRRD->GRAT[3] = SBRAT[3];
1434 IBI = pGRRD->decode(pArithDecoder, grContext); 1430 IBI = pGRRD->decode(pArithDecoder, grContext);
1435 if (IBI == NULL) { 1431 if (!IBI)
1436 delete pGRRD;
1437 goto failed; 1432 goto failed;
1438 }
1439 delete pGRRD;
1440 } 1433 }
1441 WI = IBI->m_nWidth; 1434 WI = IBI->m_nWidth;
1442 HI = IBI->m_nHeight; 1435 HI = IBI->m_nHeight;
1443 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) || 1436 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) ||
1444 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { 1437 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
1445 CURS = CURS + WI - 1; 1438 CURS = CURS + WI - 1;
1446 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) || 1439 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) ||
1447 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { 1440 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
1448 CURS = CURS + HI - 1; 1441 CURS = CURS + HI - 1;
1449 } 1442 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1497 delete IAFS; 1490 delete IAFS;
1498 delete IADS; 1491 delete IADS;
1499 delete IAIT; 1492 delete IAIT;
1500 delete IARI; 1493 delete IARI;
1501 delete IARDW; 1494 delete IARDW;
1502 delete IARDH; 1495 delete IARDH;
1503 delete IARDX; 1496 delete IARDX;
1504 delete IARDY; 1497 delete IARDY;
1505 delete IAID; 1498 delete IAID;
1506 } 1499 }
1507 return SBREG; 1500 return SBREG.release();
1508 failed: 1501 failed:
1509 if (bRetained == FALSE) { 1502 if (bRetained == FALSE) {
1510 delete IADT; 1503 delete IADT;
1511 delete IAFS; 1504 delete IAFS;
1512 delete IADS; 1505 delete IADS;
1513 delete IAIT; 1506 delete IAIT;
1514 delete IARI; 1507 delete IARI;
1515 delete IARDW; 1508 delete IARDW;
1516 delete IARDH; 1509 delete IARDH;
1517 delete IARDX; 1510 delete IARDX;
1518 delete IARDY; 1511 delete IARDY;
1519 delete IAID; 1512 delete IAID;
1520 } 1513 }
1521 delete SBREG; 1514 return nullptr;
1522 return NULL;
1523 } 1515 }
1516
1524 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith( 1517 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith(
1525 CJBig2_ArithDecoder* pArithDecoder, 1518 CJBig2_ArithDecoder* pArithDecoder,
1526 JBig2ArithCtx* gbContext, 1519 JBig2ArithCtx* gbContext,
1527 JBig2ArithCtx* grContext) { 1520 JBig2ArithCtx* grContext) {
1528 CJBig2_Image** SDNEWSYMS; 1521 CJBig2_Image** SDNEWSYMS;
1529 FX_DWORD HCHEIGHT, NSYMSDECODED; 1522 FX_DWORD HCHEIGHT, NSYMSDECODED;
1530 int32_t HCDH; 1523 int32_t HCDH;
1531 FX_DWORD SYMWIDTH, TOTWIDTH; 1524 FX_DWORD SYMWIDTH, TOTWIDTH;
1532 int32_t DW; 1525 int32_t DW;
1533 CJBig2_Image* BS; 1526 CJBig2_Image* BS;
1534 FX_DWORD I, J, REFAGGNINST; 1527 FX_DWORD I, J, REFAGGNINST;
1535 FX_BOOL* EXFLAGS; 1528 FX_BOOL* EXFLAGS;
1536 FX_DWORD EXINDEX; 1529 FX_DWORD EXINDEX;
1537 FX_BOOL CUREXFLAG; 1530 FX_BOOL CUREXFLAG;
1538 FX_DWORD EXRUNLENGTH; 1531 FX_DWORD EXRUNLENGTH;
1539 int32_t nVal; 1532 int32_t nVal;
1540 FX_DWORD nTmp; 1533 FX_DWORD nTmp;
1541 FX_DWORD SBNUMSYMS; 1534 FX_DWORD SBNUMSYMS;
1542 uint8_t SBSYMCODELEN; 1535 uint8_t SBSYMCODELEN;
1543 FX_DWORD IDI; 1536 FX_DWORD IDI;
1544 int32_t RDXI, RDYI; 1537 int32_t RDXI, RDYI;
1545 CJBig2_Image** SBSYMS; 1538 CJBig2_Image** SBSYMS;
1546 CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, 1539 nonstd::unique_ptr<CJBig2_ArithIaidDecoder> IAID;
1547 *SBHUFFRDX, *SBHUFFRDY, *SBHUFFRSIZE; 1540 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADH(new CJBig2_ArithIntDecoder());
Tom Sepez 2015/09/11 23:41:40 nit: if you lost the () in the new expression, I b
Lei Zhang 2015/09/12 01:19:28 Done.
1548 CJBig2_GRRDProc* pGRRD; 1541 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADW(new CJBig2_ArithIntDecoder());
1549 CJBig2_GRDProc* pGRD; 1542 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAAI(new CJBig2_ArithIntDecoder());
1550 CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX, *IADT, 1543 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDX(
1551 *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH; 1544 new CJBig2_ArithIntDecoder());
1552 CJBig2_ArithIaidDecoder* IAID; 1545 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDY(
1553 CJBig2_SymbolDict* pDict; 1546 new CJBig2_ArithIntDecoder());
1554 IADH = new CJBig2_ArithIntDecoder(); 1547 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAEX(new CJBig2_ArithIntDecoder());
1555 IADW = new CJBig2_ArithIntDecoder(); 1548 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADT(new CJBig2_ArithIntDecoder());
1556 IAAI = new CJBig2_ArithIntDecoder(); 1549 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAFS(new CJBig2_ArithIntDecoder());
1557 IARDX = new CJBig2_ArithIntDecoder(); 1550 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADS(new CJBig2_ArithIntDecoder());
1558 IARDY = new CJBig2_ArithIntDecoder(); 1551 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAIT(new CJBig2_ArithIntDecoder());
1559 IAEX = new CJBig2_ArithIntDecoder(); 1552 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARI(new CJBig2_ArithIntDecoder());
1560 IADT = new CJBig2_ArithIntDecoder(); 1553 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDW(
1561 IAFS = new CJBig2_ArithIntDecoder(); 1554 new CJBig2_ArithIntDecoder());
1562 IADS = new CJBig2_ArithIntDecoder(); 1555 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDH(
1563 IAIT = new CJBig2_ArithIntDecoder(); 1556 new CJBig2_ArithIntDecoder());
1564 IARI = new CJBig2_ArithIntDecoder();
1565 IARDW = new CJBig2_ArithIntDecoder();
1566 IARDH = new CJBig2_ArithIntDecoder();
1567 nTmp = 0; 1557 nTmp = 0;
1568 while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { 1558 while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) {
1569 nTmp++; 1559 nTmp++;
1570 } 1560 }
1571 IAID = new CJBig2_ArithIaidDecoder((uint8_t)nTmp); 1561 IAID.reset(new CJBig2_ArithIaidDecoder((uint8_t)nTmp));
1572 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); 1562 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS);
1573 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); 1563 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*));
1564 nonstd::unique_ptr<CJBig2_SymbolDict> pDict(new CJBig2_SymbolDict());
1565
1574 HCHEIGHT = 0; 1566 HCHEIGHT = 0;
1575 NSYMSDECODED = 0; 1567 NSYMSDECODED = 0;
1576 while (NSYMSDECODED < SDNUMNEWSYMS) { 1568 while (NSYMSDECODED < SDNUMNEWSYMS) {
1577 BS = NULL; 1569 BS = nullptr;
1578 if (IADH->decode(pArithDecoder, &HCDH) == -1) { 1570 if (IADH->decode(pArithDecoder, &HCDH) == -1) {
1579 goto failed; 1571 goto failed;
1580 } 1572 }
1581 HCHEIGHT = HCHEIGHT + HCDH; 1573 HCHEIGHT = HCHEIGHT + HCDH;
1582 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { 1574 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {
1583 goto failed; 1575 goto failed;
1584 } 1576 }
1585 SYMWIDTH = 0; 1577 SYMWIDTH = 0;
1586 TOTWIDTH = 0; 1578 TOTWIDTH = 0;
1587 for (;;) { 1579 for (;;) {
1588 nVal = IADW->decode(pArithDecoder, &DW); 1580 nVal = IADW->decode(pArithDecoder, &DW);
1589 if (nVal == JBIG2_OOB) { 1581 if (nVal == JBIG2_OOB) {
1590 break; 1582 break;
1591 } else if (nVal != 0) { 1583 } else if (nVal != 0) {
1592 goto failed; 1584 goto failed;
1593 } else { 1585 } else {
1594 if (NSYMSDECODED >= SDNUMNEWSYMS) { 1586 if (NSYMSDECODED >= SDNUMNEWSYMS) {
1595 goto failed; 1587 goto failed;
1596 } 1588 }
1597 SYMWIDTH = SYMWIDTH + DW; 1589 SYMWIDTH = SYMWIDTH + DW;
1598 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { 1590 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
1599 goto failed; 1591 goto failed;
1600 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { 1592 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
1601 TOTWIDTH = TOTWIDTH + SYMWIDTH; 1593 TOTWIDTH = TOTWIDTH + SYMWIDTH;
1602 SDNEWSYMS[NSYMSDECODED] = NULL; 1594 SDNEWSYMS[NSYMSDECODED] = nullptr;
1603 NSYMSDECODED = NSYMSDECODED + 1; 1595 NSYMSDECODED = NSYMSDECODED + 1;
1604 continue; 1596 continue;
1605 } 1597 }
1606 TOTWIDTH = TOTWIDTH + SYMWIDTH; 1598 TOTWIDTH = TOTWIDTH + SYMWIDTH;
1607 } 1599 }
1608 if (SDREFAGG == 0) { 1600 if (SDREFAGG == 0) {
1609 pGRD = new CJBig2_GRDProc(); 1601 nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
1610 pGRD->MMR = 0; 1602 pGRD->MMR = 0;
1611 pGRD->GBW = SYMWIDTH; 1603 pGRD->GBW = SYMWIDTH;
1612 pGRD->GBH = HCHEIGHT; 1604 pGRD->GBH = HCHEIGHT;
1613 pGRD->GBTEMPLATE = SDTEMPLATE; 1605 pGRD->GBTEMPLATE = SDTEMPLATE;
1614 pGRD->TPGDON = 0; 1606 pGRD->TPGDON = 0;
1615 pGRD->USESKIP = 0; 1607 pGRD->USESKIP = 0;
1616 pGRD->GBAT[0] = SDAT[0]; 1608 pGRD->GBAT[0] = SDAT[0];
1617 pGRD->GBAT[1] = SDAT[1]; 1609 pGRD->GBAT[1] = SDAT[1];
1618 pGRD->GBAT[2] = SDAT[2]; 1610 pGRD->GBAT[2] = SDAT[2];
1619 pGRD->GBAT[3] = SDAT[3]; 1611 pGRD->GBAT[3] = SDAT[3];
1620 pGRD->GBAT[4] = SDAT[4]; 1612 pGRD->GBAT[4] = SDAT[4];
1621 pGRD->GBAT[5] = SDAT[5]; 1613 pGRD->GBAT[5] = SDAT[5];
1622 pGRD->GBAT[6] = SDAT[6]; 1614 pGRD->GBAT[6] = SDAT[6];
1623 pGRD->GBAT[7] = SDAT[7]; 1615 pGRD->GBAT[7] = SDAT[7];
1624 BS = pGRD->decode_Arith(pArithDecoder, gbContext); 1616 BS = pGRD->decode_Arith(pArithDecoder, gbContext);
1625 if (BS == NULL) { 1617 if (!BS) {
1626 delete pGRD;
1627 goto failed; 1618 goto failed;
1628 } 1619 }
1629 delete pGRD;
1630 } else { 1620 } else {
1631 if (IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) { 1621 if (IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) {
1632 goto failed; 1622 goto failed;
1633 } 1623 }
1634 if (REFAGGNINST > 1) { 1624 if (REFAGGNINST > 1) {
1635 CJBig2_TRDProc* pDecoder; 1625 nonstd::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc());
1636 pDecoder = new CJBig2_TRDProc();
1637 pDecoder->SBHUFF = SDHUFF; 1626 pDecoder->SBHUFF = SDHUFF;
1638 pDecoder->SBREFINE = 1; 1627 pDecoder->SBREFINE = 1;
1639 pDecoder->SBW = SYMWIDTH; 1628 pDecoder->SBW = SYMWIDTH;
1640 pDecoder->SBH = HCHEIGHT; 1629 pDecoder->SBH = HCHEIGHT;
1641 pDecoder->SBNUMINSTANCES = REFAGGNINST; 1630 pDecoder->SBNUMINSTANCES = REFAGGNINST;
1642 pDecoder->SBSTRIPS = 1; 1631 pDecoder->SBSTRIPS = 1;
1643 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; 1632 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
1644 SBNUMSYMS = pDecoder->SBNUMSYMS; 1633 SBNUMSYMS = pDecoder->SBNUMSYMS;
1645 nTmp = 0; 1634 nTmp = 0;
1646 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { 1635 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
1647 nTmp++; 1636 nTmp++;
1648 } 1637 }
1649 SBSYMCODELEN = (uint8_t)nTmp; 1638 SBSYMCODELEN = (uint8_t)nTmp;
1650 pDecoder->SBSYMCODELEN = SBSYMCODELEN; 1639 pDecoder->SBSYMCODELEN = SBSYMCODELEN;
1651 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); 1640 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS);
1652 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); 1641 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
1653 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, 1642 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS,
1654 NSYMSDECODED * sizeof(CJBig2_Image*)); 1643 NSYMSDECODED * sizeof(CJBig2_Image*));
1655 pDecoder->SBSYMS = SBSYMS; 1644 pDecoder->SBSYMS = SBSYMS;
1656 pDecoder->SBDEFPIXEL = 0; 1645 pDecoder->SBDEFPIXEL = 0;
1657 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; 1646 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
1658 pDecoder->TRANSPOSED = 0; 1647 pDecoder->TRANSPOSED = 0;
1659 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; 1648 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
1660 pDecoder->SBDSOFFSET = 0; 1649 pDecoder->SBDSOFFSET = 0;
1661 SBHUFFFS = new CJBig2_HuffmanTable(HuffmanTable_B6, 1650 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS(
1662 FX_ArraySize(HuffmanTable_B6), 1651 new CJBig2_HuffmanTable(HuffmanTable_B6,
1663 HuffmanTable_HTOOB_B6); 1652 FX_ArraySize(HuffmanTable_B6),
1664 SBHUFFDS = new CJBig2_HuffmanTable(HuffmanTable_B8, 1653 HuffmanTable_HTOOB_B6));
1665 FX_ArraySize(HuffmanTable_B8), 1654 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS(
1666 HuffmanTable_HTOOB_B8); 1655 new CJBig2_HuffmanTable(HuffmanTable_B8,
1667 SBHUFFDT = new CJBig2_HuffmanTable(HuffmanTable_B11, 1656 FX_ArraySize(HuffmanTable_B8),
1668 FX_ArraySize(HuffmanTable_B11), 1657 HuffmanTable_HTOOB_B8));
1669 HuffmanTable_HTOOB_B11); 1658 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT(
1670 SBHUFFRDW = new CJBig2_HuffmanTable(HuffmanTable_B15, 1659 new CJBig2_HuffmanTable(HuffmanTable_B11,
1671 FX_ArraySize(HuffmanTable_B15), 1660 FX_ArraySize(HuffmanTable_B11),
1672 HuffmanTable_HTOOB_B15); 1661 HuffmanTable_HTOOB_B11));
1673 SBHUFFRDH = new CJBig2_HuffmanTable(HuffmanTable_B15, 1662 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW(
1674 FX_ArraySize(HuffmanTable_B15), 1663 new CJBig2_HuffmanTable(HuffmanTable_B15,
1675 HuffmanTable_HTOOB_B15); 1664 FX_ArraySize(HuffmanTable_B15),
1676 SBHUFFRDX = new CJBig2_HuffmanTable(HuffmanTable_B15, 1665 HuffmanTable_HTOOB_B15));
1677 FX_ArraySize(HuffmanTable_B15), 1666 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH(
1678 HuffmanTable_HTOOB_B15); 1667 new CJBig2_HuffmanTable(HuffmanTable_B15,
1679 SBHUFFRDY = new CJBig2_HuffmanTable(HuffmanTable_B15, 1668 FX_ArraySize(HuffmanTable_B15),
1680 FX_ArraySize(HuffmanTable_B15), 1669 HuffmanTable_HTOOB_B15));
1681 HuffmanTable_HTOOB_B15); 1670 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX(
1682 SBHUFFRSIZE = new CJBig2_HuffmanTable(HuffmanTable_B1, 1671 new CJBig2_HuffmanTable(HuffmanTable_B15,
1683 FX_ArraySize(HuffmanTable_B1), 1672 FX_ArraySize(HuffmanTable_B15),
1684 HuffmanTable_HTOOB_B1); 1673 HuffmanTable_HTOOB_B15));
1685 pDecoder->SBHUFFFS = SBHUFFFS; 1674 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY(
1686 pDecoder->SBHUFFDS = SBHUFFDS; 1675 new CJBig2_HuffmanTable(HuffmanTable_B15,
1687 pDecoder->SBHUFFDT = SBHUFFDT; 1676 FX_ArraySize(HuffmanTable_B15),
1688 pDecoder->SBHUFFRDW = SBHUFFRDW; 1677 HuffmanTable_HTOOB_B15));
1689 pDecoder->SBHUFFRDH = SBHUFFRDH; 1678 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE(
1690 pDecoder->SBHUFFRDX = SBHUFFRDX; 1679 new CJBig2_HuffmanTable(HuffmanTable_B1,
1691 pDecoder->SBHUFFRDY = SBHUFFRDY; 1680 FX_ArraySize(HuffmanTable_B1),
1692 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE; 1681 HuffmanTable_HTOOB_B1));
1682 pDecoder->SBHUFFFS = SBHUFFFS.get();
1683 pDecoder->SBHUFFDS = SBHUFFDS.get();
1684 pDecoder->SBHUFFDT = SBHUFFDT.get();
1685 pDecoder->SBHUFFRDW = SBHUFFRDW.get();
1686 pDecoder->SBHUFFRDH = SBHUFFRDH.get();
1687 pDecoder->SBHUFFRDX = SBHUFFRDX.get();
1688 pDecoder->SBHUFFRDY = SBHUFFRDY.get();
1689 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE.get();
1693 pDecoder->SBRTEMPLATE = SDRTEMPLATE; 1690 pDecoder->SBRTEMPLATE = SDRTEMPLATE;
1694 pDecoder->SBRAT[0] = SDRAT[0]; 1691 pDecoder->SBRAT[0] = SDRAT[0];
1695 pDecoder->SBRAT[1] = SDRAT[1]; 1692 pDecoder->SBRAT[1] = SDRAT[1];
1696 pDecoder->SBRAT[2] = SDRAT[2]; 1693 pDecoder->SBRAT[2] = SDRAT[2];
1697 pDecoder->SBRAT[3] = SDRAT[3]; 1694 pDecoder->SBRAT[3] = SDRAT[3];
1698 JBig2IntDecoderState ids; 1695 JBig2IntDecoderState ids;
1699 ids.IADT = IADT; 1696 ids.IADT = IADT.get();
1700 ids.IAFS = IAFS; 1697 ids.IAFS = IAFS.get();
1701 ids.IADS = IADS; 1698 ids.IADS = IADS.get();
1702 ids.IAIT = IAIT; 1699 ids.IAIT = IAIT.get();
1703 ids.IARI = IARI; 1700 ids.IARI = IARI.get();
1704 ids.IARDW = IARDW; 1701 ids.IARDW = IARDW.get();
1705 ids.IARDH = IARDH; 1702 ids.IARDH = IARDH.get();
1706 ids.IARDX = IARDX; 1703 ids.IARDX = IARDX.get();
1707 ids.IARDY = IARDY; 1704 ids.IARDY = IARDY.get();
1708 ids.IAID = IAID; 1705 ids.IAID = IAID.get();
1709 BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids); 1706 BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids);
1710 if (BS == NULL) { 1707 if (!BS) {
1711 FX_Free(SBSYMS); 1708 FX_Free(SBSYMS);
1712 delete SBHUFFFS;
1713 delete SBHUFFDS;
1714 delete SBHUFFDT;
1715 delete SBHUFFRDW;
1716 delete SBHUFFRDH;
1717 delete SBHUFFRDX;
1718 delete SBHUFFRDY;
1719 delete SBHUFFRSIZE;
1720 delete pDecoder;
1721 goto failed; 1709 goto failed;
1722 } 1710 }
1723 FX_Free(SBSYMS); 1711 FX_Free(SBSYMS);
1724 delete SBHUFFFS;
1725 delete SBHUFFDS;
1726 delete SBHUFFDT;
1727 delete SBHUFFRDW;
1728 delete SBHUFFRDH;
1729 delete SBHUFFRDX;
1730 delete SBHUFFRDY;
1731 delete SBHUFFRSIZE;
1732 delete pDecoder;
1733 } else if (REFAGGNINST == 1) { 1712 } else if (REFAGGNINST == 1) {
1734 SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; 1713 SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
1735 if (IAID->decode(pArithDecoder, (int*)&IDI) == -1) { 1714 if (IAID->decode(pArithDecoder, (int*)&IDI) == -1) {
1736 goto failed; 1715 goto failed;
1737 } 1716 }
1738 if ((IARDX->decode(pArithDecoder, &RDXI) == -1) || 1717 if ((IARDX->decode(pArithDecoder, &RDXI) == -1) ||
1739 (IARDY->decode(pArithDecoder, &RDYI) == -1)) { 1718 (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
1740 goto failed; 1719 goto failed;
1741 } 1720 }
1742 if (IDI >= SBNUMSYMS) { 1721 if (IDI >= SBNUMSYMS) {
1743 goto failed; 1722 goto failed;
1744 } 1723 }
1745 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); 1724 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS);
1746 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); 1725 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
1747 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, 1726 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS,
1748 NSYMSDECODED * sizeof(CJBig2_Image*)); 1727 NSYMSDECODED * sizeof(CJBig2_Image*));
1749 if (!SBSYMS[IDI]) { 1728 if (!SBSYMS[IDI]) {
1750 FX_Free(SBSYMS); 1729 FX_Free(SBSYMS);
1751 goto failed; 1730 goto failed;
1752 } 1731 }
1753 pGRRD = new CJBig2_GRRDProc(); 1732 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc());
1754 pGRRD->GRW = SYMWIDTH; 1733 pGRRD->GRW = SYMWIDTH;
1755 pGRRD->GRH = HCHEIGHT; 1734 pGRRD->GRH = HCHEIGHT;
1756 pGRRD->GRTEMPLATE = SDRTEMPLATE; 1735 pGRRD->GRTEMPLATE = SDRTEMPLATE;
1757 pGRRD->GRREFERENCE = SBSYMS[IDI]; 1736 pGRRD->GRREFERENCE = SBSYMS[IDI];
1758 pGRRD->GRREFERENCEDX = RDXI; 1737 pGRRD->GRREFERENCEDX = RDXI;
1759 pGRRD->GRREFERENCEDY = RDYI; 1738 pGRRD->GRREFERENCEDY = RDYI;
1760 pGRRD->TPGRON = 0; 1739 pGRRD->TPGRON = 0;
1761 pGRRD->GRAT[0] = SDRAT[0]; 1740 pGRRD->GRAT[0] = SDRAT[0];
1762 pGRRD->GRAT[1] = SDRAT[1]; 1741 pGRRD->GRAT[1] = SDRAT[1];
1763 pGRRD->GRAT[2] = SDRAT[2]; 1742 pGRRD->GRAT[2] = SDRAT[2];
1764 pGRRD->GRAT[3] = SDRAT[3]; 1743 pGRRD->GRAT[3] = SDRAT[3];
1765 BS = pGRRD->decode(pArithDecoder, grContext); 1744 BS = pGRRD->decode(pArithDecoder, grContext);
1766 if (BS == NULL) { 1745 if (!BS) {
1767 FX_Free(SBSYMS); 1746 FX_Free(SBSYMS);
1768 delete pGRRD;
1769 goto failed; 1747 goto failed;
1770 } 1748 }
1771 FX_Free(SBSYMS); 1749 FX_Free(SBSYMS);
1772 delete pGRRD;
1773 } 1750 }
1774 } 1751 }
1775 SDNEWSYMS[NSYMSDECODED] = BS; 1752 SDNEWSYMS[NSYMSDECODED] = BS;
1776 BS = NULL; 1753 BS = nullptr;
1777 NSYMSDECODED = NSYMSDECODED + 1; 1754 NSYMSDECODED = NSYMSDECODED + 1;
1778 } 1755 }
1779 } 1756 }
1780 EXINDEX = 0; 1757 EXINDEX = 0;
1781 CUREXFLAG = 0; 1758 CUREXFLAG = 0;
1782 EXFLAGS = FX_Alloc(FX_BOOL, SDNUMINSYMS + SDNUMNEWSYMS); 1759 EXFLAGS = FX_Alloc(FX_BOOL, SDNUMINSYMS + SDNUMNEWSYMS);
1783 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { 1760 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
1784 if (IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) { 1761 if (IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) {
1785 FX_Free(EXFLAGS); 1762 FX_Free(EXFLAGS);
1786 goto failed; 1763 goto failed;
1787 } 1764 }
1788 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { 1765 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
1789 FX_Free(EXFLAGS); 1766 FX_Free(EXFLAGS);
1790 goto failed; 1767 goto failed;
1791 } 1768 }
1792 if (EXRUNLENGTH != 0) { 1769 if (EXRUNLENGTH != 0) {
1793 for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { 1770 for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
1794 EXFLAGS[I] = CUREXFLAG; 1771 EXFLAGS[I] = CUREXFLAG;
1795 } 1772 }
1796 } 1773 }
1797 EXINDEX = EXINDEX + EXRUNLENGTH; 1774 EXINDEX = EXINDEX + EXRUNLENGTH;
1798 CUREXFLAG = !CUREXFLAG; 1775 CUREXFLAG = !CUREXFLAG;
1799 } 1776 }
1800 pDict = new CJBig2_SymbolDict();
1801 pDict->SDNUMEXSYMS = SDNUMEXSYMS; 1777 pDict->SDNUMEXSYMS = SDNUMEXSYMS;
1802 pDict->SDEXSYMS = FX_Alloc(CJBig2_Image*, SDNUMEXSYMS); 1778 pDict->SDEXSYMS = FX_Alloc(CJBig2_Image*, SDNUMEXSYMS);
1803 I = J = 0; 1779 I = J = 0;
1804 for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { 1780 for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
1805 if (EXFLAGS[I] && J < SDNUMEXSYMS) { 1781 if (EXFLAGS[I] && J < SDNUMEXSYMS) {
1806 if (I < SDNUMINSYMS) { 1782 if (I < SDNUMINSYMS) {
1807 pDict->SDEXSYMS[J] = new CJBig2_Image(*SDINSYMS[I]); 1783 pDict->SDEXSYMS[J] = new CJBig2_Image(*SDINSYMS[I]);
1808 } else { 1784 } else {
1809 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS]; 1785 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
1810 } 1786 }
1811 J = J + 1; 1787 J = J + 1;
1812 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { 1788 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
1813 delete SDNEWSYMS[I - SDNUMINSYMS]; 1789 delete SDNEWSYMS[I - SDNUMINSYMS];
1814 } 1790 }
1815 } 1791 }
1816 if (J < SDNUMEXSYMS) { 1792 if (J < SDNUMEXSYMS) {
1817 pDict->SDNUMEXSYMS = J; 1793 pDict->SDNUMEXSYMS = J;
1818 } 1794 }
1819 FX_Free(EXFLAGS); 1795 FX_Free(EXFLAGS);
1820 FX_Free(SDNEWSYMS); 1796 FX_Free(SDNEWSYMS);
1821 delete IADH; 1797 return pDict.release();
1822 delete IADW;
1823 delete IAAI;
1824 delete IARDX;
1825 delete IARDY;
1826 delete IAEX;
1827 delete IAID;
1828 delete IADT;
1829 delete IAFS;
1830 delete IADS;
1831 delete IAIT;
1832 delete IARI;
1833 delete IARDW;
1834 delete IARDH;
1835 return pDict;
1836 failed: 1798 failed:
1837 for (I = 0; I < NSYMSDECODED; I++) { 1799 for (I = 0; I < NSYMSDECODED; I++) {
1838 if (SDNEWSYMS[I]) { 1800 if (SDNEWSYMS[I]) {
1839 delete SDNEWSYMS[I]; 1801 delete SDNEWSYMS[I];
1840 SDNEWSYMS[I] = NULL; 1802 SDNEWSYMS[I] = nullptr;
1841 } 1803 }
1842 } 1804 }
1843 FX_Free(SDNEWSYMS); 1805 FX_Free(SDNEWSYMS);
1844 delete IADH; 1806 return nullptr;
1845 delete IADW;
1846 delete IAAI;
1847 delete IARDX;
1848 delete IARDY;
1849 delete IAEX;
1850 delete IAID;
1851 delete IADT;
1852 delete IAFS;
1853 delete IADS;
1854 delete IAIT;
1855 delete IARI;
1856 delete IARDW;
1857 delete IARDH;
1858 return NULL;
1859 } 1807 }
1808
1860 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream* pStream, 1809 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream* pStream,
1861 JBig2ArithCtx* gbContext, 1810 JBig2ArithCtx* gbContext,
1862 JBig2ArithCtx* grContext, 1811 JBig2ArithCtx* grContext,
1863 IFX_Pause* pPause) { 1812 IFX_Pause* pPause) {
1864 CJBig2_Image** SDNEWSYMS; 1813 CJBig2_Image** SDNEWSYMS;
1865 FX_DWORD* SDNEWSYMWIDTHS; 1814 FX_DWORD* SDNEWSYMWIDTHS;
1866 FX_DWORD HCHEIGHT, NSYMSDECODED; 1815 FX_DWORD HCHEIGHT, NSYMSDECODED;
1867 int32_t HCDH; 1816 int32_t HCDH;
1868 FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM; 1817 FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;
1869 int32_t DW; 1818 int32_t DW;
1870 CJBig2_Image *BS, *BHC; 1819 CJBig2_Image *BS, *BHC;
1871 FX_DWORD I, J, REFAGGNINST; 1820 FX_DWORD I, J, REFAGGNINST;
1872 FX_BOOL* EXFLAGS; 1821 FX_BOOL* EXFLAGS;
1873 FX_DWORD EXINDEX; 1822 FX_DWORD EXINDEX;
1874 FX_BOOL CUREXFLAG; 1823 FX_BOOL CUREXFLAG;
1875 FX_DWORD EXRUNLENGTH; 1824 FX_DWORD EXRUNLENGTH;
1876 int32_t nVal, nBits; 1825 int32_t nVal, nBits;
1877 FX_DWORD nTmp; 1826 FX_DWORD nTmp;
1878 FX_DWORD SBNUMSYMS; 1827 FX_DWORD SBNUMSYMS;
1879 uint8_t SBSYMCODELEN; 1828 uint8_t SBSYMCODELEN;
1880 JBig2HuffmanCode* SBSYMCODES; 1829 JBig2HuffmanCode* SBSYMCODES;
1881 FX_DWORD IDI; 1830 FX_DWORD IDI;
1882 int32_t RDXI, RDYI; 1831 int32_t RDXI, RDYI;
1883 FX_DWORD BMSIZE; 1832 FX_DWORD BMSIZE;
1884 FX_DWORD stride; 1833 FX_DWORD stride;
1885 CJBig2_Image** SBSYMS; 1834 CJBig2_Image** SBSYMS;
1886 CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, 1835 nonstd::unique_ptr<CJBig2_HuffmanDecoder> pHuffmanDecoder(
1887 *SBHUFFRDX, *SBHUFFRDY, *SBHUFFRSIZE, *pTable; 1836 new CJBig2_HuffmanDecoder(pStream));
1888 CJBig2_HuffmanDecoder* pHuffmanDecoder;
1889 CJBig2_GRRDProc* pGRRD;
1890 CJBig2_ArithDecoder* pArithDecoder;
1891 CJBig2_GRDProc* pGRD;
1892 CJBig2_SymbolDict* pDict;
1893 pHuffmanDecoder = new CJBig2_HuffmanDecoder(pStream);
1894 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); 1837 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS);
1895 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); 1838 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*));
1896 SDNEWSYMWIDTHS = NULL; 1839 SDNEWSYMWIDTHS = nullptr;
1897 BHC = NULL; 1840 BHC = nullptr;
1898 if (SDREFAGG == 0) { 1841 if (SDREFAGG == 0) {
1899 SDNEWSYMWIDTHS = FX_Alloc(FX_DWORD, SDNUMNEWSYMS); 1842 SDNEWSYMWIDTHS = FX_Alloc(FX_DWORD, SDNUMNEWSYMS);
1900 FXSYS_memset(SDNEWSYMWIDTHS, 0, SDNUMNEWSYMS * sizeof(FX_DWORD)); 1843 FXSYS_memset(SDNEWSYMWIDTHS, 0, SDNUMNEWSYMS * sizeof(FX_DWORD));
1901 } 1844 }
1845 nonstd::unique_ptr<CJBig2_SymbolDict> pDict(new CJBig2_SymbolDict());
1846 nonstd::unique_ptr<CJBig2_HuffmanTable> pTable;
1847
1902 HCHEIGHT = 0; 1848 HCHEIGHT = 0;
1903 NSYMSDECODED = 0; 1849 NSYMSDECODED = 0;
1904 BS = NULL; 1850 BS = nullptr;
1905 while (NSYMSDECODED < SDNUMNEWSYMS) { 1851 while (NSYMSDECODED < SDNUMNEWSYMS) {
1906 if (pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { 1852 if (pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) {
1907 goto failed; 1853 goto failed;
1908 } 1854 }
1909 HCHEIGHT = HCHEIGHT + HCDH; 1855 HCHEIGHT = HCHEIGHT + HCDH;
1910 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { 1856 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {
1911 goto failed; 1857 goto failed;
1912 } 1858 }
1913 SYMWIDTH = 0; 1859 SYMWIDTH = 0;
1914 TOTWIDTH = 0; 1860 TOTWIDTH = 0;
1915 HCFIRSTSYM = NSYMSDECODED; 1861 HCFIRSTSYM = NSYMSDECODED;
1916 for (;;) { 1862 for (;;) {
1917 nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW); 1863 nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW);
1918 if (nVal == JBIG2_OOB) { 1864 if (nVal == JBIG2_OOB) {
1919 break; 1865 break;
1920 } else if (nVal != 0) { 1866 } else if (nVal != 0) {
1921 goto failed; 1867 goto failed;
1922 } else { 1868 } else {
1923 if (NSYMSDECODED >= SDNUMNEWSYMS) { 1869 if (NSYMSDECODED >= SDNUMNEWSYMS) {
1924 goto failed; 1870 goto failed;
1925 } 1871 }
1926 SYMWIDTH = SYMWIDTH + DW; 1872 SYMWIDTH = SYMWIDTH + DW;
1927 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { 1873 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
1928 goto failed; 1874 goto failed;
1929 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { 1875 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
1930 TOTWIDTH = TOTWIDTH + SYMWIDTH; 1876 TOTWIDTH = TOTWIDTH + SYMWIDTH;
1931 SDNEWSYMS[NSYMSDECODED] = NULL; 1877 SDNEWSYMS[NSYMSDECODED] = nullptr;
1932 NSYMSDECODED = NSYMSDECODED + 1; 1878 NSYMSDECODED = NSYMSDECODED + 1;
1933 continue; 1879 continue;
1934 } 1880 }
1935 TOTWIDTH = TOTWIDTH + SYMWIDTH; 1881 TOTWIDTH = TOTWIDTH + SYMWIDTH;
1936 } 1882 }
1937 if (SDREFAGG == 1) { 1883 if (SDREFAGG == 1) {
1938 if (pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != 1884 if (pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) !=
1939 0) { 1885 0) {
1940 goto failed; 1886 goto failed;
1941 } 1887 }
1942 BS = NULL; 1888 BS = nullptr;
1943 if (REFAGGNINST > 1) { 1889 if (REFAGGNINST > 1) {
1944 CJBig2_TRDProc* pDecoder = new CJBig2_TRDProc(); 1890 nonstd::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc());
1945 pDecoder->SBHUFF = SDHUFF; 1891 pDecoder->SBHUFF = SDHUFF;
1946 pDecoder->SBREFINE = 1; 1892 pDecoder->SBREFINE = 1;
1947 pDecoder->SBW = SYMWIDTH; 1893 pDecoder->SBW = SYMWIDTH;
1948 pDecoder->SBH = HCHEIGHT; 1894 pDecoder->SBH = HCHEIGHT;
1949 pDecoder->SBNUMINSTANCES = REFAGGNINST; 1895 pDecoder->SBNUMINSTANCES = REFAGGNINST;
1950 pDecoder->SBSTRIPS = 1; 1896 pDecoder->SBSTRIPS = 1;
1951 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; 1897 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
1952 SBNUMSYMS = pDecoder->SBNUMSYMS; 1898 SBNUMSYMS = pDecoder->SBNUMSYMS;
1953 SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS); 1899 SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS);
1954 nTmp = 1; 1900 nTmp = 1;
1955 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { 1901 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
1956 nTmp++; 1902 nTmp++;
1957 } 1903 }
1958 for (I = 0; I < SBNUMSYMS; I++) { 1904 for (I = 0; I < SBNUMSYMS; I++) {
1959 SBSYMCODES[I].codelen = nTmp; 1905 SBSYMCODES[I].codelen = nTmp;
1960 SBSYMCODES[I].code = I; 1906 SBSYMCODES[I].code = I;
1961 } 1907 }
1962 pDecoder->SBSYMCODES = SBSYMCODES; 1908 pDecoder->SBSYMCODES = SBSYMCODES;
1963 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); 1909 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS);
1964 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); 1910 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
1965 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, 1911 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS,
1966 NSYMSDECODED * sizeof(CJBig2_Image*)); 1912 NSYMSDECODED * sizeof(CJBig2_Image*));
1967 pDecoder->SBSYMS = SBSYMS; 1913 pDecoder->SBSYMS = SBSYMS;
1968 pDecoder->SBDEFPIXEL = 0; 1914 pDecoder->SBDEFPIXEL = 0;
1969 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; 1915 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
1970 pDecoder->TRANSPOSED = 0; 1916 pDecoder->TRANSPOSED = 0;
1971 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; 1917 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
1972 pDecoder->SBDSOFFSET = 0; 1918 pDecoder->SBDSOFFSET = 0;
1973 SBHUFFFS = new CJBig2_HuffmanTable(HuffmanTable_B6, 1919 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS(
1974 FX_ArraySize(HuffmanTable_B6), 1920 new CJBig2_HuffmanTable(HuffmanTable_B6,
1975 HuffmanTable_HTOOB_B6); 1921 FX_ArraySize(HuffmanTable_B6),
1976 SBHUFFDS = new CJBig2_HuffmanTable(HuffmanTable_B8, 1922 HuffmanTable_HTOOB_B6));
1977 FX_ArraySize(HuffmanTable_B8), 1923 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS(
1978 HuffmanTable_HTOOB_B8); 1924 new CJBig2_HuffmanTable(HuffmanTable_B8,
1979 SBHUFFDT = new CJBig2_HuffmanTable(HuffmanTable_B11, 1925 FX_ArraySize(HuffmanTable_B8),
1980 FX_ArraySize(HuffmanTable_B11), 1926 HuffmanTable_HTOOB_B8));
1981 HuffmanTable_HTOOB_B11); 1927 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT(
1982 SBHUFFRDW = new CJBig2_HuffmanTable(HuffmanTable_B15, 1928 new CJBig2_HuffmanTable(HuffmanTable_B11,
1983 FX_ArraySize(HuffmanTable_B15), 1929 FX_ArraySize(HuffmanTable_B11),
1984 HuffmanTable_HTOOB_B15); 1930 HuffmanTable_HTOOB_B11));
1985 SBHUFFRDH = new CJBig2_HuffmanTable(HuffmanTable_B15, 1931 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW(
1986 FX_ArraySize(HuffmanTable_B15), 1932 new CJBig2_HuffmanTable(HuffmanTable_B15,
1987 HuffmanTable_HTOOB_B15); 1933 FX_ArraySize(HuffmanTable_B15),
1988 SBHUFFRDX = new CJBig2_HuffmanTable(HuffmanTable_B15, 1934 HuffmanTable_HTOOB_B15));
1989 FX_ArraySize(HuffmanTable_B15), 1935 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH(
1990 HuffmanTable_HTOOB_B15); 1936 new CJBig2_HuffmanTable(HuffmanTable_B15,
1991 SBHUFFRDY = new CJBig2_HuffmanTable(HuffmanTable_B15, 1937 FX_ArraySize(HuffmanTable_B15),
1992 FX_ArraySize(HuffmanTable_B15), 1938 HuffmanTable_HTOOB_B15));
1993 HuffmanTable_HTOOB_B15); 1939 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX(
1994 SBHUFFRSIZE = new CJBig2_HuffmanTable(HuffmanTable_B1, 1940 new CJBig2_HuffmanTable(HuffmanTable_B15,
1995 FX_ArraySize(HuffmanTable_B1), 1941 FX_ArraySize(HuffmanTable_B15),
1996 HuffmanTable_HTOOB_B1); 1942 HuffmanTable_HTOOB_B15));
1997 pDecoder->SBHUFFFS = SBHUFFFS; 1943 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY(
1998 pDecoder->SBHUFFDS = SBHUFFDS; 1944 new CJBig2_HuffmanTable(HuffmanTable_B15,
1999 pDecoder->SBHUFFDT = SBHUFFDT; 1945 FX_ArraySize(HuffmanTable_B15),
2000 pDecoder->SBHUFFRDW = SBHUFFRDW; 1946 HuffmanTable_HTOOB_B15));
2001 pDecoder->SBHUFFRDH = SBHUFFRDH; 1947 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE(
2002 pDecoder->SBHUFFRDX = SBHUFFRDX; 1948 new CJBig2_HuffmanTable(HuffmanTable_B1,
2003 pDecoder->SBHUFFRDY = SBHUFFRDY; 1949 FX_ArraySize(HuffmanTable_B1),
2004 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE; 1950 HuffmanTable_HTOOB_B1));
1951 pDecoder->SBHUFFFS = SBHUFFFS.get();
1952 pDecoder->SBHUFFDS = SBHUFFDS.get();
1953 pDecoder->SBHUFFDT = SBHUFFDT.get();
1954 pDecoder->SBHUFFRDW = SBHUFFRDW.get();
1955 pDecoder->SBHUFFRDH = SBHUFFRDH.get();
1956 pDecoder->SBHUFFRDX = SBHUFFRDX.get();
1957 pDecoder->SBHUFFRDY = SBHUFFRDY.get();
1958 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE.get();
2005 pDecoder->SBRTEMPLATE = SDRTEMPLATE; 1959 pDecoder->SBRTEMPLATE = SDRTEMPLATE;
2006 pDecoder->SBRAT[0] = SDRAT[0]; 1960 pDecoder->SBRAT[0] = SDRAT[0];
2007 pDecoder->SBRAT[1] = SDRAT[1]; 1961 pDecoder->SBRAT[1] = SDRAT[1];
2008 pDecoder->SBRAT[2] = SDRAT[2]; 1962 pDecoder->SBRAT[2] = SDRAT[2];
2009 pDecoder->SBRAT[3] = SDRAT[3]; 1963 pDecoder->SBRAT[3] = SDRAT[3];
2010 BS = pDecoder->decode_Huffman(pStream, grContext); 1964 BS = pDecoder->decode_Huffman(pStream, grContext);
2011 if (BS == NULL) { 1965 if (!BS) {
2012 FX_Free(SBSYMCODES); 1966 FX_Free(SBSYMCODES);
2013 FX_Free(SBSYMS); 1967 FX_Free(SBSYMS);
2014 delete SBHUFFFS;
2015 delete SBHUFFDS;
2016 delete SBHUFFDT;
2017 delete SBHUFFRDW;
2018 delete SBHUFFRDH;
2019 delete SBHUFFRDX;
2020 delete SBHUFFRDY;
2021 delete SBHUFFRSIZE;
2022 delete pDecoder;
2023 goto failed; 1968 goto failed;
2024 } 1969 }
2025 FX_Free(SBSYMCODES); 1970 FX_Free(SBSYMCODES);
2026 FX_Free(SBSYMS); 1971 FX_Free(SBSYMS);
2027 delete SBHUFFFS;
2028 delete SBHUFFDS;
2029 delete SBHUFFDT;
2030 delete SBHUFFRDW;
2031 delete SBHUFFRDH;
2032 delete SBHUFFRDX;
2033 delete SBHUFFRDY;
2034 delete SBHUFFRSIZE;
2035 delete pDecoder;
2036 } else if (REFAGGNINST == 1) { 1972 } else if (REFAGGNINST == 1) {
2037 SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS; 1973 SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS;
2038 nTmp = 1; 1974 nTmp = 1;
2039 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { 1975 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
2040 nTmp++; 1976 nTmp++;
2041 } 1977 }
2042 SBSYMCODELEN = (uint8_t)nTmp; 1978 SBSYMCODELEN = (uint8_t)nTmp;
2043 SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS); 1979 SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS);
2044 for (I = 0; I < SBNUMSYMS; I++) { 1980 for (I = 0; I < SBNUMSYMS; I++) {
2045 SBSYMCODES[I].codelen = SBSYMCODELEN; 1981 SBSYMCODES[I].codelen = SBSYMCODELEN;
(...skipping 11 matching lines...) Expand all
2057 if ((nVal == SBSYMCODES[IDI].code) && 1993 if ((nVal == SBSYMCODES[IDI].code) &&
2058 (nBits == SBSYMCODES[IDI].codelen)) { 1994 (nBits == SBSYMCODES[IDI].codelen)) {
2059 break; 1995 break;
2060 } 1996 }
2061 } 1997 }
2062 if (IDI < SBNUMSYMS) { 1998 if (IDI < SBNUMSYMS) {
2063 break; 1999 break;
2064 } 2000 }
2065 } 2001 }
2066 FX_Free(SBSYMCODES); 2002 FX_Free(SBSYMCODES);
2067 SBHUFFRDX = new CJBig2_HuffmanTable(HuffmanTable_B15, 2003 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX(
2068 FX_ArraySize(HuffmanTable_B15), 2004 new CJBig2_HuffmanTable(HuffmanTable_B15,
2069 HuffmanTable_HTOOB_B15); 2005 FX_ArraySize(HuffmanTable_B15),
2070 SBHUFFRSIZE = new CJBig2_HuffmanTable(HuffmanTable_B1, 2006 HuffmanTable_HTOOB_B15));
2071 FX_ArraySize(HuffmanTable_B1), 2007 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE(
2072 HuffmanTable_HTOOB_B1); 2008 new CJBig2_HuffmanTable(HuffmanTable_B1,
2073 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) || 2009 FX_ArraySize(HuffmanTable_B1),
2074 (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0) || 2010 HuffmanTable_HTOOB_B1));
2075 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) { 2011 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDXI) != 0) ||
2076 delete SBHUFFRDX; 2012 (pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDYI) != 0) ||
2077 delete SBHUFFRSIZE; 2013 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE.get(), &nVal) != 0)) {
2078 goto failed; 2014 goto failed;
2079 } 2015 }
2080 delete SBHUFFRDX;
2081 delete SBHUFFRSIZE;
2082 pStream->alignByte(); 2016 pStream->alignByte();
2083 nTmp = pStream->getOffset(); 2017 nTmp = pStream->getOffset();
2084 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); 2018 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS);
2085 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); 2019 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
2086 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, 2020 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS,
2087 NSYMSDECODED * sizeof(CJBig2_Image*)); 2021 NSYMSDECODED * sizeof(CJBig2_Image*));
2088 pGRRD = new CJBig2_GRRDProc(); 2022 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc());
2089 pGRRD->GRW = SYMWIDTH; 2023 pGRRD->GRW = SYMWIDTH;
2090 pGRRD->GRH = HCHEIGHT; 2024 pGRRD->GRH = HCHEIGHT;
2091 pGRRD->GRTEMPLATE = SDRTEMPLATE; 2025 pGRRD->GRTEMPLATE = SDRTEMPLATE;
2092 pGRRD->GRREFERENCE = SBSYMS[IDI]; 2026 pGRRD->GRREFERENCE = SBSYMS[IDI];
2093 pGRRD->GRREFERENCEDX = RDXI; 2027 pGRRD->GRREFERENCEDX = RDXI;
2094 pGRRD->GRREFERENCEDY = RDYI; 2028 pGRRD->GRREFERENCEDY = RDYI;
2095 pGRRD->TPGRON = 0; 2029 pGRRD->TPGRON = 0;
2096 pGRRD->GRAT[0] = SDRAT[0]; 2030 pGRRD->GRAT[0] = SDRAT[0];
2097 pGRRD->GRAT[1] = SDRAT[1]; 2031 pGRRD->GRAT[1] = SDRAT[1];
2098 pGRRD->GRAT[2] = SDRAT[2]; 2032 pGRRD->GRAT[2] = SDRAT[2];
2099 pGRRD->GRAT[3] = SDRAT[3]; 2033 pGRRD->GRAT[3] = SDRAT[3];
2100 pArithDecoder = new CJBig2_ArithDecoder(pStream); 2034 nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
2101 BS = pGRRD->decode(pArithDecoder, grContext); 2035 new CJBig2_ArithDecoder(pStream));
2102 if (BS == NULL) { 2036 BS = pGRRD->decode(pArithDecoder.get(), grContext);
2037 if (!BS) {
2103 FX_Free(SBSYMS); 2038 FX_Free(SBSYMS);
2104 delete pGRRD;
2105 delete pArithDecoder;
2106 goto failed; 2039 goto failed;
2107 } 2040 }
2108 pStream->alignByte(); 2041 pStream->alignByte();
2109 pStream->offset(2); 2042 pStream->offset(2);
2110 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { 2043 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
2111 delete BS; 2044 delete BS;
2112 FX_Free(SBSYMS); 2045 FX_Free(SBSYMS);
2113 delete pGRRD;
2114 delete pArithDecoder;
2115 goto failed; 2046 goto failed;
2116 } 2047 }
2117 FX_Free(SBSYMS); 2048 FX_Free(SBSYMS);
2118 delete pGRRD;
2119 delete pArithDecoder;
2120 } 2049 }
2121 SDNEWSYMS[NSYMSDECODED] = BS; 2050 SDNEWSYMS[NSYMSDECODED] = BS;
2122 } 2051 }
2123 if (SDREFAGG == 0) { 2052 if (SDREFAGG == 0) {
2124 SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH; 2053 SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH;
2125 } 2054 }
2126 NSYMSDECODED = NSYMSDECODED + 1; 2055 NSYMSDECODED = NSYMSDECODED + 1;
2127 } 2056 }
2128 if (SDREFAGG == 0) { 2057 if (SDREFAGG == 0) {
2129 if (pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (int32_t*)&BMSIZE) != 0) { 2058 if (pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (int32_t*)&BMSIZE) != 0) {
2130 goto failed; 2059 goto failed;
2131 } 2060 }
2132 pStream->alignByte(); 2061 pStream->alignByte();
2133 if (BMSIZE == 0) { 2062 if (BMSIZE == 0) {
2134 stride = (TOTWIDTH + 7) >> 3; 2063 stride = (TOTWIDTH + 7) >> 3;
2135 if (pStream->getByteLeft() >= stride * HCHEIGHT) { 2064 if (pStream->getByteLeft() >= stride * HCHEIGHT) {
2136 BHC = new CJBig2_Image(TOTWIDTH, HCHEIGHT); 2065 BHC = new CJBig2_Image(TOTWIDTH, HCHEIGHT);
2137 for (I = 0; I < HCHEIGHT; I++) { 2066 for (I = 0; I < HCHEIGHT; I++) {
2138 JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, 2067 JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride,
2139 pStream->getPointer(), stride); 2068 pStream->getPointer(), stride);
2140 pStream->offset(stride); 2069 pStream->offset(stride);
2141 } 2070 }
2142 } else { 2071 } else {
2143 goto failed; 2072 goto failed;
2144 } 2073 }
2145 } else { 2074 } else {
2146 pGRD = new CJBig2_GRDProc(); 2075 nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
2147 pGRD->MMR = 1; 2076 pGRD->MMR = 1;
2148 pGRD->GBW = TOTWIDTH; 2077 pGRD->GBW = TOTWIDTH;
2149 pGRD->GBH = HCHEIGHT; 2078 pGRD->GBH = HCHEIGHT;
2150 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream); 2079 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream);
2151 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 2080 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
2152 pGRD->Continue_decode(pPause); 2081 pGRD->Continue_decode(pPause);
2153 } 2082 }
2154 delete pGRD;
2155 pStream->alignByte(); 2083 pStream->alignByte();
2156 } 2084 }
2157 nTmp = 0; 2085 nTmp = 0;
2158 if (!BHC) { 2086 if (!BHC) {
2159 continue; 2087 continue;
2160 } 2088 }
2161 for (I = HCFIRSTSYM; I < NSYMSDECODED; I++) { 2089 for (I = HCFIRSTSYM; I < NSYMSDECODED; I++) {
2162 SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT); 2090 SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT);
2163 nTmp += SDNEWSYMWIDTHS[I]; 2091 nTmp += SDNEWSYMWIDTHS[I];
2164 } 2092 }
2165 delete BHC; 2093 delete BHC;
2166 BHC = NULL; 2094 BHC = nullptr;
2167 } 2095 }
2168 } 2096 }
2169 EXINDEX = 0; 2097 EXINDEX = 0;
2170 CUREXFLAG = 0; 2098 CUREXFLAG = 0;
2171 pTable = new CJBig2_HuffmanTable( 2099 pTable.reset(new CJBig2_HuffmanTable(
2172 HuffmanTable_B1, FX_ArraySize(HuffmanTable_B1), HuffmanTable_HTOOB_B1); 2100 HuffmanTable_B1, FX_ArraySize(HuffmanTable_B1), HuffmanTable_HTOOB_B1));
2173 EXFLAGS = FX_Alloc(FX_BOOL, SDNUMINSYMS + SDNUMNEWSYMS); 2101 EXFLAGS = FX_Alloc(FX_BOOL, SDNUMINSYMS + SDNUMNEWSYMS);
2174 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { 2102 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
2175 if (pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) { 2103 if (pHuffmanDecoder->decodeAValue(pTable.get(), (int*)&EXRUNLENGTH) != 0) {
2176 delete pTable;
2177 FX_Free(EXFLAGS); 2104 FX_Free(EXFLAGS);
2178 goto failed; 2105 goto failed;
2179 } 2106 }
2180 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { 2107 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
2181 delete pTable;
2182 FX_Free(EXFLAGS); 2108 FX_Free(EXFLAGS);
2183 goto failed; 2109 goto failed;
2184 } 2110 }
2185 if (EXRUNLENGTH != 0) { 2111 if (EXRUNLENGTH != 0) {
2186 for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { 2112 for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
2187 EXFLAGS[I] = CUREXFLAG; 2113 EXFLAGS[I] = CUREXFLAG;
2188 } 2114 }
2189 } 2115 }
2190 EXINDEX = EXINDEX + EXRUNLENGTH; 2116 EXINDEX = EXINDEX + EXRUNLENGTH;
2191 CUREXFLAG = !CUREXFLAG; 2117 CUREXFLAG = !CUREXFLAG;
2192 } 2118 }
2193 delete pTable;
2194 pDict = new CJBig2_SymbolDict();
2195 pDict->SDNUMEXSYMS = SDNUMEXSYMS; 2119 pDict->SDNUMEXSYMS = SDNUMEXSYMS;
2196 pDict->SDEXSYMS = FX_Alloc(CJBig2_Image*, SDNUMEXSYMS); 2120 pDict->SDEXSYMS = FX_Alloc(CJBig2_Image*, SDNUMEXSYMS);
2197 I = J = 0; 2121 I = J = 0;
2198 for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { 2122 for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
2199 if (EXFLAGS[I] && J < SDNUMEXSYMS) { 2123 if (EXFLAGS[I] && J < SDNUMEXSYMS) {
2200 if (I < SDNUMINSYMS) { 2124 if (I < SDNUMINSYMS) {
2201 pDict->SDEXSYMS[J] = new CJBig2_Image(*SDINSYMS[I]); 2125 pDict->SDEXSYMS[J] = new CJBig2_Image(*SDINSYMS[I]);
2202 } else { 2126 } else {
2203 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS]; 2127 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
2204 } 2128 }
2205 J = J + 1; 2129 J = J + 1;
2206 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { 2130 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
2207 delete SDNEWSYMS[I - SDNUMINSYMS]; 2131 delete SDNEWSYMS[I - SDNUMINSYMS];
2208 } 2132 }
2209 } 2133 }
2210 if (J < SDNUMEXSYMS) { 2134 if (J < SDNUMEXSYMS) {
2211 pDict->SDNUMEXSYMS = J; 2135 pDict->SDNUMEXSYMS = J;
2212 } 2136 }
2213 FX_Free(EXFLAGS); 2137 FX_Free(EXFLAGS);
2214 FX_Free(SDNEWSYMS); 2138 FX_Free(SDNEWSYMS);
2215 if (SDREFAGG == 0) { 2139 if (SDREFAGG == 0) {
2216 FX_Free(SDNEWSYMWIDTHS); 2140 FX_Free(SDNEWSYMWIDTHS);
2217 } 2141 }
2218 delete pHuffmanDecoder; 2142 return pDict.release();
2219 return pDict;
2220 failed: 2143 failed:
2221 for (I = 0; I < NSYMSDECODED; I++) { 2144 for (I = 0; I < NSYMSDECODED; I++) {
2222 delete SDNEWSYMS[I]; 2145 delete SDNEWSYMS[I];
2223 } 2146 }
2224 FX_Free(SDNEWSYMS); 2147 FX_Free(SDNEWSYMS);
2225 if (SDREFAGG == 0) { 2148 if (SDREFAGG == 0) {
2226 FX_Free(SDNEWSYMWIDTHS); 2149 FX_Free(SDNEWSYMWIDTHS);
2227 } 2150 }
2228 delete pHuffmanDecoder; 2151 return nullptr;
2229 return NULL;
2230 } 2152 }
2153
2231 CJBig2_Image* CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, 2154 CJBig2_Image* CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
2232 JBig2ArithCtx* gbContext, 2155 JBig2ArithCtx* gbContext,
2233 IFX_Pause* pPause) { 2156 IFX_Pause* pPause) {
2234 FX_DWORD ng, mg; 2157 FX_DWORD ng, mg;
2235 int32_t x, y; 2158 int32_t x, y;
2236 FX_DWORD HBPP; 2159 FX_DWORD HBPP;
2237 FX_DWORD* GI; 2160 FX_DWORD* GI;
2238 CJBig2_Image* HSKIP = nullptr; 2161 nonstd::unique_ptr<CJBig2_Image> HSKIP;
2239 CJBig2_Image* HTREG = new CJBig2_Image(HBW, HBH); 2162 nonstd::unique_ptr<CJBig2_Image> HTREG(new CJBig2_Image(HBW, HBH));
2240 HTREG->fill(HDEFPIXEL); 2163 HTREG->fill(HDEFPIXEL);
2241 if (HENABLESKIP == 1) { 2164 if (HENABLESKIP == 1) {
2242 HSKIP = new CJBig2_Image(HGW, HGH); 2165 HSKIP.reset(new CJBig2_Image(HGW, HGH));
2243 for (mg = 0; mg < HGH; mg++) { 2166 for (mg = 0; mg < HGH; mg++) {
2244 for (ng = 0; ng < HGW; ng++) { 2167 for (ng = 0; ng < HGW; ng++) {
2245 x = (HGX + mg * HRY + ng * HRX) >> 8; 2168 x = (HGX + mg * HRY + ng * HRX) >> 8;
2246 y = (HGY + mg * HRX - ng * HRY) >> 8; 2169 y = (HGY + mg * HRX - ng * HRY) >> 8;
2247 if ((x + HPW <= 0) | (x >= (int32_t)HBW) | (y + HPH <= 0) | 2170 if ((x + HPW <= 0) | (x >= (int32_t)HBW) | (y + HPH <= 0) |
2248 (y >= (int32_t)HPH)) { 2171 (y >= (int32_t)HPH)) {
2249 HSKIP->setPixel(ng, mg, 1); 2172 HSKIP->setPixel(ng, mg, 1);
2250 } else { 2173 } else {
2251 HSKIP->setPixel(ng, mg, 0); 2174 HSKIP->setPixel(ng, mg, 0);
2252 } 2175 }
2253 } 2176 }
2254 } 2177 }
2255 } 2178 }
2256 HBPP = 1; 2179 HBPP = 1;
2257 while ((FX_DWORD)(1 << HBPP) < HNUMPATS) { 2180 while ((FX_DWORD)(1 << HBPP) < HNUMPATS) {
2258 HBPP++; 2181 HBPP++;
2259 } 2182 }
2260 CJBig2_GSIDProc* pGID = new CJBig2_GSIDProc(); 2183 nonstd::unique_ptr<CJBig2_GSIDProc> pGID(new CJBig2_GSIDProc());
2261 pGID->GSMMR = HMMR; 2184 pGID->GSMMR = HMMR;
2262 pGID->GSW = HGW; 2185 pGID->GSW = HGW;
2263 pGID->GSH = HGH; 2186 pGID->GSH = HGH;
2264 pGID->GSBPP = (uint8_t)HBPP; 2187 pGID->GSBPP = (uint8_t)HBPP;
2265 pGID->GSUSESKIP = HENABLESKIP; 2188 pGID->GSUSESKIP = HENABLESKIP;
2266 pGID->GSKIP = HSKIP; 2189 pGID->GSKIP = HSKIP.get();
2267 pGID->GSTEMPLATE = HTEMPLATE; 2190 pGID->GSTEMPLATE = HTEMPLATE;
2268 GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause); 2191 GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause);
2269 if (GI == NULL) { 2192 if (!GI)
2270 goto failed; 2193 return nullptr;
2271 } 2194
2272 for (mg = 0; mg < HGH; mg++) { 2195 for (mg = 0; mg < HGH; mg++) {
2273 for (ng = 0; ng < HGW; ng++) { 2196 for (ng = 0; ng < HGW; ng++) {
2274 x = (HGX + mg * HRY + ng * HRX) >> 8; 2197 x = (HGX + mg * HRY + ng * HRX) >> 8;
2275 y = (HGY + mg * HRX - ng * HRY) >> 8; 2198 y = (HGY + mg * HRX - ng * HRY) >> 8;
2276 FX_DWORD pat_index = GI[mg * HGW + ng]; 2199 FX_DWORD pat_index = GI[mg * HGW + ng];
2277 if (pat_index >= HNUMPATS) { 2200 if (pat_index >= HNUMPATS) {
2278 pat_index = HNUMPATS - 1; 2201 pat_index = HNUMPATS - 1;
2279 } 2202 }
2280 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); 2203 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
2281 } 2204 }
2282 } 2205 }
2283 FX_Free(GI); 2206 FX_Free(GI);
2284 delete HSKIP; 2207 return HTREG.release();
2285 delete pGID;
2286 return HTREG;
2287 failed:
2288 delete HSKIP;
2289 delete pGID;
2290 delete HTREG;
2291 return NULL;
2292 } 2208 }
2209
2293 CJBig2_Image* CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream* pStream, 2210 CJBig2_Image* CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream* pStream,
2294 IFX_Pause* pPause) { 2211 IFX_Pause* pPause) {
2295 FX_DWORD ng, mg; 2212 FX_DWORD ng, mg;
2296 int32_t x, y; 2213 int32_t x, y;
2297 FX_DWORD* GI; 2214 FX_DWORD* GI;
2298 CJBig2_Image* HTREG = new CJBig2_Image(HBW, HBH); 2215 nonstd::unique_ptr<CJBig2_Image> HTREG(new CJBig2_Image(HBW, HBH));
2299 HTREG->fill(HDEFPIXEL); 2216 HTREG->fill(HDEFPIXEL);
2300 FX_DWORD HBPP = 1; 2217 FX_DWORD HBPP = 1;
2301 while ((FX_DWORD)(1 << HBPP) < HNUMPATS) { 2218 while ((FX_DWORD)(1 << HBPP) < HNUMPATS) {
2302 HBPP++; 2219 HBPP++;
2303 } 2220 }
2304 CJBig2_GSIDProc* pGID = new CJBig2_GSIDProc(); 2221 nonstd::unique_ptr<CJBig2_GSIDProc> pGID(new CJBig2_GSIDProc());
2305 pGID->GSMMR = HMMR; 2222 pGID->GSMMR = HMMR;
2306 pGID->GSW = HGW; 2223 pGID->GSW = HGW;
2307 pGID->GSH = HGH; 2224 pGID->GSH = HGH;
2308 pGID->GSBPP = (uint8_t)HBPP; 2225 pGID->GSBPP = (uint8_t)HBPP;
2309 pGID->GSUSESKIP = 0; 2226 pGID->GSUSESKIP = 0;
2310 GI = pGID->decode_MMR(pStream, pPause); 2227 GI = pGID->decode_MMR(pStream, pPause);
2311 if (GI == NULL) { 2228 if (!GI)
2312 goto failed; 2229 return nullptr;
2313 } 2230
2314 for (mg = 0; mg < HGH; mg++) { 2231 for (mg = 0; mg < HGH; mg++) {
2315 for (ng = 0; ng < HGW; ng++) { 2232 for (ng = 0; ng < HGW; ng++) {
2316 x = (HGX + mg * HRY + ng * HRX) >> 8; 2233 x = (HGX + mg * HRY + ng * HRX) >> 8;
2317 y = (HGY + mg * HRX - ng * HRY) >> 8; 2234 y = (HGY + mg * HRX - ng * HRY) >> 8;
2318 FX_DWORD pat_index = GI[mg * HGW + ng]; 2235 FX_DWORD pat_index = GI[mg * HGW + ng];
2319 if (pat_index >= HNUMPATS) { 2236 if (pat_index >= HNUMPATS) {
2320 pat_index = HNUMPATS - 1; 2237 pat_index = HNUMPATS - 1;
2321 } 2238 }
2322 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); 2239 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
2323 } 2240 }
2324 } 2241 }
2325 FX_Free(GI); 2242 FX_Free(GI);
2326 delete pGID; 2243 return HTREG.release();
2327 return HTREG;
2328 failed:
2329 delete pGID;
2330 delete HTREG;
2331 return NULL;
2332 } 2244 }
2245
2333 CJBig2_PatternDict* CJBig2_PDDProc::decode_Arith( 2246 CJBig2_PatternDict* CJBig2_PDDProc::decode_Arith(
2334 CJBig2_ArithDecoder* pArithDecoder, 2247 CJBig2_ArithDecoder* pArithDecoder,
2335 JBig2ArithCtx* gbContext, 2248 JBig2ArithCtx* gbContext,
2336 IFX_Pause* pPause) { 2249 IFX_Pause* pPause) {
2337 FX_DWORD GRAY; 2250 FX_DWORD GRAY;
2338 CJBig2_Image* BHDC = NULL; 2251 CJBig2_Image* BHDC = nullptr;
2339 CJBig2_PatternDict* pDict = new CJBig2_PatternDict(); 2252 nonstd::unique_ptr<CJBig2_PatternDict> pDict(new CJBig2_PatternDict());
2340 pDict->NUMPATS = GRAYMAX + 1; 2253 pDict->NUMPATS = GRAYMAX + 1;
2341 pDict->HDPATS = FX_Alloc(CJBig2_Image*, pDict->NUMPATS); 2254 pDict->HDPATS = FX_Alloc(CJBig2_Image*, pDict->NUMPATS);
2342 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS); 2255 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS);
2343 CJBig2_GRDProc* pGRD = new CJBig2_GRDProc(); 2256
2257 nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
2344 pGRD->MMR = HDMMR; 2258 pGRD->MMR = HDMMR;
2345 pGRD->GBW = (GRAYMAX + 1) * HDPW; 2259 pGRD->GBW = (GRAYMAX + 1) * HDPW;
2346 pGRD->GBH = HDPH; 2260 pGRD->GBH = HDPH;
2347 pGRD->GBTEMPLATE = HDTEMPLATE; 2261 pGRD->GBTEMPLATE = HDTEMPLATE;
2348 pGRD->TPGDON = 0; 2262 pGRD->TPGDON = 0;
2349 pGRD->USESKIP = 0; 2263 pGRD->USESKIP = 0;
2350 pGRD->GBAT[0] = -(int32_t)HDPW; 2264 pGRD->GBAT[0] = -(int32_t)HDPW;
2351 pGRD->GBAT[1] = 0; 2265 pGRD->GBAT[1] = 0;
2352 if (pGRD->GBTEMPLATE == 0) { 2266 if (pGRD->GBTEMPLATE == 0) {
2353 pGRD->GBAT[2] = -3; 2267 pGRD->GBAT[2] = -3;
2354 pGRD->GBAT[3] = -1; 2268 pGRD->GBAT[3] = -1;
2355 pGRD->GBAT[4] = 2; 2269 pGRD->GBAT[4] = 2;
2356 pGRD->GBAT[5] = -2; 2270 pGRD->GBAT[5] = -2;
2357 pGRD->GBAT[6] = -2; 2271 pGRD->GBAT[6] = -2;
2358 pGRD->GBAT[7] = -2; 2272 pGRD->GBAT[7] = -2;
2359 } 2273 }
2360 FXCODEC_STATUS status = 2274 FXCODEC_STATUS status =
2361 pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext); 2275 pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext);
2362 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 2276 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
2363 pGRD->Continue_decode(pPause); 2277 pGRD->Continue_decode(pPause);
2364 } 2278 }
2365 if (BHDC == NULL) { 2279 if (!BHDC)
2366 delete pGRD; 2280 return nullptr;
2367 goto failed; 2281
2368 }
2369 delete pGRD;
2370 GRAY = 0; 2282 GRAY = 0;
2371 while (GRAY <= GRAYMAX) { 2283 while (GRAY <= GRAYMAX) {
2372 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); 2284 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
2373 GRAY = GRAY + 1; 2285 GRAY = GRAY + 1;
2374 } 2286 }
2375 delete BHDC; 2287 delete BHDC;
2376 return pDict; 2288 return pDict.release();
2377 failed:
2378 delete pDict;
2379 return NULL;
2380 } 2289 }
2381 2290
2382 CJBig2_PatternDict* CJBig2_PDDProc::decode_MMR(CJBig2_BitStream* pStream, 2291 CJBig2_PatternDict* CJBig2_PDDProc::decode_MMR(CJBig2_BitStream* pStream,
2383 IFX_Pause* pPause) { 2292 IFX_Pause* pPause) {
2384 FX_DWORD GRAY; 2293 FX_DWORD GRAY;
2385 CJBig2_Image* BHDC = NULL; 2294 CJBig2_Image* BHDC = nullptr;
2386 CJBig2_PatternDict* pDict = new CJBig2_PatternDict(); 2295 nonstd::unique_ptr<CJBig2_PatternDict> pDict(new CJBig2_PatternDict());
2387 pDict->NUMPATS = GRAYMAX + 1; 2296 pDict->NUMPATS = GRAYMAX + 1;
2388 pDict->HDPATS = FX_Alloc(CJBig2_Image*, pDict->NUMPATS); 2297 pDict->HDPATS = FX_Alloc(CJBig2_Image*, pDict->NUMPATS);
2389 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS); 2298 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS);
2390 CJBig2_GRDProc* pGRD = new CJBig2_GRDProc(); 2299
2300 nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
2391 pGRD->MMR = HDMMR; 2301 pGRD->MMR = HDMMR;
2392 pGRD->GBW = (GRAYMAX + 1) * HDPW; 2302 pGRD->GBW = (GRAYMAX + 1) * HDPW;
2393 pGRD->GBH = HDPH; 2303 pGRD->GBH = HDPH;
2394 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream); 2304 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream);
2395 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 2305 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
2396 pGRD->Continue_decode(pPause); 2306 pGRD->Continue_decode(pPause);
2397 } 2307 }
2398 if (BHDC == NULL) { 2308 if (!BHDC)
2399 delete pGRD; 2309 return nullptr;
2400 goto failed; 2310
2401 }
2402 delete pGRD;
2403 GRAY = 0; 2311 GRAY = 0;
2404 while (GRAY <= GRAYMAX) { 2312 while (GRAY <= GRAYMAX) {
2405 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); 2313 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
2406 GRAY = GRAY + 1; 2314 GRAY = GRAY + 1;
2407 } 2315 }
2408 delete BHDC; 2316 delete BHDC;
2409 return pDict; 2317 return pDict.release();
2410 failed:
2411 delete pDict;
2412 return NULL;
2413 } 2318 }
2319
2414 FX_DWORD* CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, 2320 FX_DWORD* CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
2415 JBig2ArithCtx* gbContext, 2321 JBig2ArithCtx* gbContext,
2416 IFX_Pause* pPause) { 2322 IFX_Pause* pPause) {
2417 CJBig2_Image** GSPLANES; 2323 CJBig2_Image** GSPLANES;
2418 int32_t J, K; 2324 int32_t J, K;
2419 FX_DWORD x, y; 2325 FX_DWORD x, y;
2420 FX_DWORD* GSVALS; 2326 FX_DWORD* GSVALS;
2421 GSPLANES = FX_Alloc(CJBig2_Image*, GSBPP); 2327 GSPLANES = FX_Alloc(CJBig2_Image*, GSBPP);
2422 if (!GSPLANES) {
2423 return NULL;
2424 }
2425 GSVALS = FX_Alloc2D(FX_DWORD, GSW, GSH); 2328 GSVALS = FX_Alloc2D(FX_DWORD, GSW, GSH);
2426 if (!GSVALS) {
2427 FX_Free(GSPLANES);
2428 return NULL;
2429 }
2430 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP); 2329 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP);
2431 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH); 2330 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH);
2432 CJBig2_GRDProc* pGRD = new CJBig2_GRDProc(); 2331
2332 nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
2433 pGRD->MMR = GSMMR; 2333 pGRD->MMR = GSMMR;
2434 pGRD->GBW = GSW; 2334 pGRD->GBW = GSW;
2435 pGRD->GBH = GSH; 2335 pGRD->GBH = GSH;
2436 pGRD->GBTEMPLATE = GSTEMPLATE; 2336 pGRD->GBTEMPLATE = GSTEMPLATE;
2437 pGRD->TPGDON = 0; 2337 pGRD->TPGDON = 0;
2438 pGRD->USESKIP = GSUSESKIP; 2338 pGRD->USESKIP = GSUSESKIP;
2439 pGRD->SKIP = GSKIP; 2339 pGRD->SKIP = GSKIP;
2440 if (GSTEMPLATE <= 1) { 2340 if (GSTEMPLATE <= 1) {
2441 pGRD->GBAT[0] = 3; 2341 pGRD->GBAT[0] = 3;
2442 } else { 2342 } else {
2443 pGRD->GBAT[0] = 2; 2343 pGRD->GBAT[0] = 2;
2444 } 2344 }
2445 pGRD->GBAT[1] = -1; 2345 pGRD->GBAT[1] = -1;
2446 if (pGRD->GBTEMPLATE == 0) { 2346 if (pGRD->GBTEMPLATE == 0) {
2447 pGRD->GBAT[2] = -3; 2347 pGRD->GBAT[2] = -3;
2448 pGRD->GBAT[3] = -1; 2348 pGRD->GBAT[3] = -1;
2449 pGRD->GBAT[4] = 2; 2349 pGRD->GBAT[4] = 2;
2450 pGRD->GBAT[5] = -2; 2350 pGRD->GBAT[5] = -2;
2451 pGRD->GBAT[6] = -2; 2351 pGRD->GBAT[6] = -2;
2452 pGRD->GBAT[7] = -2; 2352 pGRD->GBAT[7] = -2;
2453 } 2353 }
2454 FXCODEC_STATUS status = 2354 FXCODEC_STATUS status =
2455 pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext); 2355 pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext);
2456 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 2356 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
2457 pGRD->Continue_decode(pPause); 2357 pGRD->Continue_decode(pPause);
2458 } 2358 }
2459 if (GSPLANES[GSBPP - 1] == NULL) { 2359 if (!GSPLANES[GSBPP - 1]) {
2460 goto failed; 2360 goto failed;
2461 } 2361 }
2462 J = GSBPP - 2; 2362 J = GSBPP - 2;
2463 while (J >= 0) { 2363 while (J >= 0) {
2464 FXCODEC_STATUS status = 2364 FXCODEC_STATUS status =
2465 pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext); 2365 pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext);
2466 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 2366 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
2467 pGRD->Continue_decode(pPause); 2367 pGRD->Continue_decode(pPause);
2468 } 2368 }
2469 if (GSPLANES[J] == NULL) { 2369 if (!GSPLANES[J]) {
2470 for (K = GSBPP - 1; K > J; K--) { 2370 for (K = GSBPP - 1; K > J; K--) {
2471 delete GSPLANES[K]; 2371 delete GSPLANES[K];
2472 goto failed; 2372 goto failed;
2473 } 2373 }
2474 } 2374 }
2475 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); 2375 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
2476 J = J - 1; 2376 J = J - 1;
2477 } 2377 }
2478 for (y = 0; y < GSH; y++) { 2378 for (y = 0; y < GSH; y++) {
2479 for (x = 0; x < GSW; x++) { 2379 for (x = 0; x < GSW; x++) {
2480 for (J = 0; J < GSBPP; J++) { 2380 for (J = 0; J < GSBPP; J++) {
2481 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J; 2381 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
2482 } 2382 }
2483 } 2383 }
2484 } 2384 }
2485 for (J = 0; J < GSBPP; J++) { 2385 for (J = 0; J < GSBPP; J++) {
2486 delete GSPLANES[J]; 2386 delete GSPLANES[J];
2487 } 2387 }
2488 FX_Free(GSPLANES); 2388 FX_Free(GSPLANES);
2489 delete pGRD;
2490 return GSVALS; 2389 return GSVALS;
2491 failed: 2390 failed:
2492 FX_Free(GSPLANES); 2391 FX_Free(GSPLANES);
2493 delete pGRD;
2494 FX_Free(GSVALS); 2392 FX_Free(GSVALS);
2495 return NULL; 2393 return nullptr;
2496 } 2394 }
2395
2497 FX_DWORD* CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream* pStream, 2396 FX_DWORD* CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream* pStream,
2498 IFX_Pause* pPause) { 2397 IFX_Pause* pPause) {
2499 CJBig2_Image** GSPLANES; 2398 CJBig2_Image** GSPLANES;
2500 int32_t J, K; 2399 int32_t J, K;
2501 FX_DWORD x, y; 2400 FX_DWORD x, y;
2502 FX_DWORD* GSVALS; 2401 FX_DWORD* GSVALS;
2503 GSPLANES = FX_Alloc(CJBig2_Image*, GSBPP); 2402 GSPLANES = FX_Alloc(CJBig2_Image*, GSBPP);
2504 if (!GSPLANES) {
2505 return NULL;
2506 }
2507 GSVALS = FX_Alloc2D(FX_DWORD, GSW, GSH); 2403 GSVALS = FX_Alloc2D(FX_DWORD, GSW, GSH);
2508 if (!GSVALS) {
2509 FX_Free(GSPLANES);
2510 return NULL;
2511 }
2512 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP); 2404 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP);
2513 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH); 2405 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH);
2514 CJBig2_GRDProc* pGRD = new CJBig2_GRDProc(); 2406
2407 nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
2515 pGRD->MMR = GSMMR; 2408 pGRD->MMR = GSMMR;
2516 pGRD->GBW = GSW; 2409 pGRD->GBW = GSW;
2517 pGRD->GBH = GSH; 2410 pGRD->GBH = GSH;
2518 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream); 2411 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream);
2519 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 2412 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
2520 pGRD->Continue_decode(pPause); 2413 pGRD->Continue_decode(pPause);
2521 } 2414 }
2522 if (GSPLANES[GSBPP - 1] == NULL) { 2415 if (!GSPLANES[GSBPP - 1]) {
2523 goto failed; 2416 goto failed;
2524 } 2417 }
2525 pStream->alignByte(); 2418 pStream->alignByte();
2526 pStream->offset(3); 2419 pStream->offset(3);
2527 J = GSBPP - 2; 2420 J = GSBPP - 2;
2528 while (J >= 0) { 2421 while (J >= 0) {
2529 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream); 2422 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream);
2530 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 2423 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
2531 pGRD->Continue_decode(pPause); 2424 pGRD->Continue_decode(pPause);
2532 } 2425 }
2533 if (GSPLANES[J] == NULL) { 2426 if (!GSPLANES[J]) {
2534 for (K = GSBPP - 1; K > J; K--) { 2427 for (K = GSBPP - 1; K > J; K--) {
2535 delete GSPLANES[K]; 2428 delete GSPLANES[K];
2536 goto failed; 2429 goto failed;
2537 } 2430 }
2538 } 2431 }
2539 pStream->alignByte(); 2432 pStream->alignByte();
2540 pStream->offset(3); 2433 pStream->offset(3);
2541 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); 2434 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
2542 J = J - 1; 2435 J = J - 1;
2543 } 2436 }
2544 for (y = 0; y < GSH; y++) { 2437 for (y = 0; y < GSH; y++) {
2545 for (x = 0; x < GSW; x++) { 2438 for (x = 0; x < GSW; x++) {
2546 for (J = 0; J < GSBPP; J++) { 2439 for (J = 0; J < GSBPP; J++) {
2547 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J; 2440 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
2548 } 2441 }
2549 } 2442 }
2550 } 2443 }
2551 for (J = 0; J < GSBPP; J++) { 2444 for (J = 0; J < GSBPP; J++) {
2552 delete GSPLANES[J]; 2445 delete GSPLANES[J];
2553 } 2446 }
2554 FX_Free(GSPLANES); 2447 FX_Free(GSPLANES);
2555 delete pGRD;
2556 return GSVALS; 2448 return GSVALS;
2557 failed: 2449 failed:
2558 FX_Free(GSPLANES); 2450 FX_Free(GSPLANES);
2559 delete pGRD;
2560 FX_Free(GSVALS); 2451 FX_Free(GSVALS);
2561 return NULL; 2452 return nullptr;
2562 } 2453 }
2454
2563 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith( 2455 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith(
2564 CJBig2_Image** pImage, 2456 CJBig2_Image** pImage,
2565 CJBig2_ArithDecoder* pArithDecoder, 2457 CJBig2_ArithDecoder* pArithDecoder,
2566 JBig2ArithCtx* gbContext, 2458 JBig2ArithCtx* gbContext,
2567 IFX_Pause* pPause) { 2459 IFX_Pause* pPause) {
2568 if (GBW == 0 || GBH == 0) { 2460 if (GBW == 0 || GBH == 0) {
2569 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 2461 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
2570 return FXCODEC_STATUS_DECODE_FINISH; 2462 return FXCODEC_STATUS_DECODE_FINISH;
2571 } 2463 }
2572 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; 2464 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
2573 m_pPause = pPause; 2465 m_pPause = pPause;
2574 if (!*pImage) 2466 if (!*pImage)
2575 *pImage = new CJBig2_Image(GBW, GBH); 2467 *pImage = new CJBig2_Image(GBW, GBH);
2576 if ((*pImage)->m_pData == NULL) { 2468 if (!(*pImage)->m_pData) {
2577 delete *pImage; 2469 delete *pImage;
2578 *pImage = NULL; 2470 *pImage = nullptr;
2579 m_ProssiveStatus = FXCODEC_STATUS_ERROR; 2471 m_ProssiveStatus = FXCODEC_STATUS_ERROR;
2580 return FXCODEC_STATUS_ERROR; 2472 return FXCODEC_STATUS_ERROR;
2581 } 2473 }
2582 m_DecodeType = 1; 2474 m_DecodeType = 1;
2583 m_pImage = pImage; 2475 m_pImage = pImage;
2584 (*m_pImage)->fill(0); 2476 (*m_pImage)->fill(0);
2585 m_pArithDecoder = pArithDecoder; 2477 m_pArithDecoder = pArithDecoder;
2586 m_gbContext = gbContext; 2478 m_gbContext = gbContext;
2587 LTP = 0; 2479 LTP = 0;
2588 m_pLine = NULL; 2480 m_pLine = nullptr;
2589 m_loopIndex = 0; 2481 m_loopIndex = 0;
2590 return decode_Arith(pPause); 2482 return decode_Arith(pPause);
2591 } 2483 }
2484
2592 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause) { 2485 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause) {
2593 int iline = m_loopIndex; 2486 int iline = m_loopIndex;
2594 CJBig2_Image* pImage = *m_pImage; 2487 CJBig2_Image* pImage = *m_pImage;
2595 if (GBTEMPLATE == 0) { 2488 if (GBTEMPLATE == 0) {
2596 if ((GBAT[0] == 3) && (GBAT[1] == (int8_t)-1) && (GBAT[2] == (int8_t)-3) && 2489 if ((GBAT[0] == 3) && (GBAT[1] == (int8_t)-1) && (GBAT[2] == (int8_t)-3) &&
2597 (GBAT[3] == (int8_t)-1) && (GBAT[4] == 2) && (GBAT[5] == (int8_t)-2) && 2490 (GBAT[3] == (int8_t)-1) && (GBAT[4] == 2) && (GBAT[5] == (int8_t)-2) &&
2598 (GBAT[6] == (int8_t)-2) && (GBAT[7] == (int8_t)-2)) { 2491 (GBAT[6] == (int8_t)-2) && (GBAT[7] == (int8_t)-2)) {
2599 m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder, 2492 m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder,
2600 m_gbContext, pPause); 2493 m_gbContext, pPause);
2601 } else { 2494 } else {
(...skipping 27 matching lines...) Expand all
2629 } 2522 }
2630 m_ReplaceRect.left = 0; 2523 m_ReplaceRect.left = 0;
2631 m_ReplaceRect.right = pImage->m_nWidth; 2524 m_ReplaceRect.right = pImage->m_nWidth;
2632 m_ReplaceRect.top = iline; 2525 m_ReplaceRect.top = iline;
2633 m_ReplaceRect.bottom = m_loopIndex; 2526 m_ReplaceRect.bottom = m_loopIndex;
2634 if (m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) { 2527 if (m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) {
2635 m_loopIndex = 0; 2528 m_loopIndex = 0;
2636 } 2529 }
2637 return m_ProssiveStatus; 2530 return m_ProssiveStatus;
2638 } 2531 }
2532
2639 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, 2533 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage,
2640 CJBig2_BitStream* pStream, 2534 CJBig2_BitStream* pStream,
2641 IFX_Pause* pPause) { 2535 IFX_Pause* pPause) {
2642 int bitpos, i; 2536 int bitpos, i;
2643 *pImage = new CJBig2_Image(GBW, GBH); 2537 *pImage = new CJBig2_Image(GBW, GBH);
2644 if ((*pImage)->m_pData == NULL) { 2538 if (!(*pImage)->m_pData) {
2645 delete (*pImage); 2539 delete (*pImage);
2646 (*pImage) = NULL; 2540 (*pImage) = nullptr;
2647 m_ProssiveStatus = FXCODEC_STATUS_ERROR; 2541 m_ProssiveStatus = FXCODEC_STATUS_ERROR;
2648 return m_ProssiveStatus; 2542 return m_ProssiveStatus;
2649 } 2543 }
2650 bitpos = (int)pStream->getBitPos(); 2544 bitpos = (int)pStream->getBitPos();
2651 _FaxG4Decode(pStream->getBuf(), pStream->getLength(), &bitpos, 2545 _FaxG4Decode(pStream->getBuf(), pStream->getLength(), &bitpos,
2652 (*pImage)->m_pData, GBW, GBH, (*pImage)->m_nStride); 2546 (*pImage)->m_pData, GBW, GBH, (*pImage)->m_nStride);
2653 pStream->setBitPos(bitpos); 2547 pStream->setBitPos(bitpos);
2654 for (i = 0; (FX_DWORD)i < (*pImage)->m_nStride * GBH; i++) { 2548 for (i = 0; (FX_DWORD)i < (*pImage)->m_nStride * GBH; i++) {
2655 (*pImage)->m_pData[i] = ~(*pImage)->m_pData[i]; 2549 (*pImage)->m_pData[i] = ~(*pImage)->m_pData[i];
2656 } 2550 }
(...skipping 17 matching lines...) Expand all
2674 CJBig2_Image* pImage, 2568 CJBig2_Image* pImage,
2675 CJBig2_ArithDecoder* pArithDecoder, 2569 CJBig2_ArithDecoder* pArithDecoder,
2676 JBig2ArithCtx* gbContext, 2570 JBig2ArithCtx* gbContext,
2677 IFX_Pause* pPause) { 2571 IFX_Pause* pPause) {
2678 FX_BOOL SLTP, bVal; 2572 FX_BOOL SLTP, bVal;
2679 FX_DWORD CONTEXT; 2573 FX_DWORD CONTEXT;
2680 FX_DWORD line1, line2; 2574 FX_DWORD line1, line2;
2681 uint8_t *pLine1, *pLine2, cVal; 2575 uint8_t *pLine1, *pLine2, cVal;
2682 int32_t nStride, nStride2, k; 2576 int32_t nStride, nStride2, k;
2683 int32_t nLineBytes, nBitsLeft, cc; 2577 int32_t nLineBytes, nBitsLeft, cc;
2684 if (m_pLine == NULL) { 2578 if (!m_pLine) {
2685 m_pLine = pImage->m_pData; 2579 m_pLine = pImage->m_pData;
2686 } 2580 }
2687 nStride = pImage->m_nStride; 2581 nStride = pImage->m_nStride;
2688 nStride2 = nStride << 1; 2582 nStride2 = nStride << 1;
2689 nLineBytes = ((GBW + 7) >> 3) - 1; 2583 nLineBytes = ((GBW + 7) >> 3) - 1;
2690 nBitsLeft = GBW - (nLineBytes << 3); 2584 nBitsLeft = GBW - (nLineBytes << 3);
2691 FX_DWORD height = GBH & 0x7fffffff; 2585 FX_DWORD height = GBH & 0x7fffffff;
2692 for (; m_loopIndex < height; m_loopIndex++) { 2586 for (; m_loopIndex < height; m_loopIndex++) {
2693 if (TPGDON) { 2587 if (TPGDON) {
2694 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); 2588 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
2757 m_pLine += nStride; 2651 m_pLine += nStride;
2758 if (pPause && pPause->NeedToPauseNow()) { 2652 if (pPause && pPause->NeedToPauseNow()) {
2759 m_loopIndex++; 2653 m_loopIndex++;
2760 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 2654 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
2761 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 2655 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
2762 } 2656 }
2763 } 2657 }
2764 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 2658 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
2765 return FXCODEC_STATUS_DECODE_FINISH; 2659 return FXCODEC_STATUS_DECODE_FINISH;
2766 } 2660 }
2661
2767 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt( 2662 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt(
2768 CJBig2_Image* pImage, 2663 CJBig2_Image* pImage,
2769 CJBig2_ArithDecoder* pArithDecoder, 2664 CJBig2_ArithDecoder* pArithDecoder,
2770 JBig2ArithCtx* gbContext, 2665 JBig2ArithCtx* gbContext,
2771 IFX_Pause* pPause) { 2666 IFX_Pause* pPause) {
2772 FX_BOOL SLTP, bVal; 2667 FX_BOOL SLTP, bVal;
2773 FX_DWORD CONTEXT; 2668 FX_DWORD CONTEXT;
2774 FX_DWORD line1, line2, line3; 2669 FX_DWORD line1, line2, line3;
2775 for (; m_loopIndex < GBH; m_loopIndex++) { 2670 for (; m_loopIndex < GBH; m_loopIndex++) {
2776 if (TPGDON) { 2671 if (TPGDON) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2811 } 2706 }
2812 if (pPause && pPause->NeedToPauseNow()) { 2707 if (pPause && pPause->NeedToPauseNow()) {
2813 m_loopIndex++; 2708 m_loopIndex++;
2814 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 2709 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
2815 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 2710 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
2816 } 2711 }
2817 } 2712 }
2818 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 2713 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
2819 return FXCODEC_STATUS_DECODE_FINISH; 2714 return FXCODEC_STATUS_DECODE_FINISH;
2820 } 2715 }
2716
2821 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3( 2717 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3(
2822 CJBig2_Image* pImage, 2718 CJBig2_Image* pImage,
2823 CJBig2_ArithDecoder* pArithDecoder, 2719 CJBig2_ArithDecoder* pArithDecoder,
2824 JBig2ArithCtx* gbContext, 2720 JBig2ArithCtx* gbContext,
2825 IFX_Pause* pPause) { 2721 IFX_Pause* pPause) {
2826 FX_BOOL SLTP, bVal; 2722 FX_BOOL SLTP, bVal;
2827 FX_DWORD CONTEXT; 2723 FX_DWORD CONTEXT;
2828 FX_DWORD line1, line2; 2724 FX_DWORD line1, line2;
2829 uint8_t *pLine1, *pLine2, cVal; 2725 uint8_t *pLine1, *pLine2, cVal;
2830 int32_t nStride, nStride2, k; 2726 int32_t nStride, nStride2, k;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2904 m_pLine += nStride; 2800 m_pLine += nStride;
2905 if (pPause && pPause->NeedToPauseNow()) { 2801 if (pPause && pPause->NeedToPauseNow()) {
2906 m_loopIndex++; 2802 m_loopIndex++;
2907 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 2803 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
2908 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 2804 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
2909 } 2805 }
2910 } 2806 }
2911 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 2807 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
2912 return FXCODEC_STATUS_DECODE_FINISH; 2808 return FXCODEC_STATUS_DECODE_FINISH;
2913 } 2809 }
2810
2914 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt( 2811 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt(
2915 CJBig2_Image* pImage, 2812 CJBig2_Image* pImage,
2916 CJBig2_ArithDecoder* pArithDecoder, 2813 CJBig2_ArithDecoder* pArithDecoder,
2917 JBig2ArithCtx* gbContext, 2814 JBig2ArithCtx* gbContext,
2918 IFX_Pause* pPause) { 2815 IFX_Pause* pPause) {
2919 FX_BOOL SLTP, bVal; 2816 FX_BOOL SLTP, bVal;
2920 FX_DWORD CONTEXT; 2817 FX_DWORD CONTEXT;
2921 FX_DWORD line1, line2, line3; 2818 FX_DWORD line1, line2, line3;
2922 for (FX_DWORD h = 0; h < GBH; h++) { 2819 for (FX_DWORD h = 0; h < GBH; h++) {
2923 if (TPGDON) { 2820 if (TPGDON) {
(...skipping 30 matching lines...) Expand all
2954 } 2851 }
2955 if (pPause && pPause->NeedToPauseNow()) { 2852 if (pPause && pPause->NeedToPauseNow()) {
2956 m_loopIndex++; 2853 m_loopIndex++;
2957 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 2854 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
2958 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 2855 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
2959 } 2856 }
2960 } 2857 }
2961 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 2858 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
2962 return FXCODEC_STATUS_DECODE_FINISH; 2859 return FXCODEC_STATUS_DECODE_FINISH;
2963 } 2860 }
2861
2964 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3( 2862 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3(
2965 CJBig2_Image* pImage, 2863 CJBig2_Image* pImage,
2966 CJBig2_ArithDecoder* pArithDecoder, 2864 CJBig2_ArithDecoder* pArithDecoder,
2967 JBig2ArithCtx* gbContext, 2865 JBig2ArithCtx* gbContext,
2968 IFX_Pause* pPause) { 2866 IFX_Pause* pPause) {
2969 FX_BOOL SLTP, bVal; 2867 FX_BOOL SLTP, bVal;
2970 FX_DWORD CONTEXT; 2868 FX_DWORD CONTEXT;
2971 FX_DWORD line1, line2; 2869 FX_DWORD line1, line2;
2972 uint8_t *pLine1, *pLine2, cVal; 2870 uint8_t *pLine1, *pLine2, cVal;
2973 int32_t nStride, nStride2, k; 2871 int32_t nStride, nStride2, k;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
3047 m_pLine += nStride; 2945 m_pLine += nStride;
3048 if (pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) { 2946 if (pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) {
3049 m_loopIndex++; 2947 m_loopIndex++;
3050 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 2948 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
3051 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 2949 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
3052 } 2950 }
3053 } 2951 }
3054 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 2952 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3055 return FXCODEC_STATUS_DECODE_FINISH; 2953 return FXCODEC_STATUS_DECODE_FINISH;
3056 } 2954 }
2955
3057 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt( 2956 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt(
3058 CJBig2_Image* pImage, 2957 CJBig2_Image* pImage,
3059 CJBig2_ArithDecoder* pArithDecoder, 2958 CJBig2_ArithDecoder* pArithDecoder,
3060 JBig2ArithCtx* gbContext, 2959 JBig2ArithCtx* gbContext,
3061 IFX_Pause* pPause) { 2960 IFX_Pause* pPause) {
3062 FX_BOOL SLTP, bVal; 2961 FX_BOOL SLTP, bVal;
3063 FX_DWORD CONTEXT; 2962 FX_DWORD CONTEXT;
3064 FX_DWORD line1, line2, line3; 2963 FX_DWORD line1, line2, line3;
3065 for (; m_loopIndex < GBH; m_loopIndex++) { 2964 for (; m_loopIndex < GBH; m_loopIndex++) {
3066 if (TPGDON) { 2965 if (TPGDON) {
(...skipping 30 matching lines...) Expand all
3097 } 2996 }
3098 if (pPause && pPause->NeedToPauseNow()) { 2997 if (pPause && pPause->NeedToPauseNow()) {
3099 m_loopIndex++; 2998 m_loopIndex++;
3100 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 2999 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
3101 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 3000 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
3102 } 3001 }
3103 } 3002 }
3104 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 3003 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3105 return FXCODEC_STATUS_DECODE_FINISH; 3004 return FXCODEC_STATUS_DECODE_FINISH;
3106 } 3005 }
3006
3107 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3( 3007 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3(
3108 CJBig2_Image* pImage, 3008 CJBig2_Image* pImage,
3109 CJBig2_ArithDecoder* pArithDecoder, 3009 CJBig2_ArithDecoder* pArithDecoder,
3110 JBig2ArithCtx* gbContext, 3010 JBig2ArithCtx* gbContext,
3111 IFX_Pause* pPause) { 3011 IFX_Pause* pPause) {
3112 FX_BOOL SLTP, bVal; 3012 FX_BOOL SLTP, bVal;
3113 FX_DWORD CONTEXT; 3013 FX_DWORD CONTEXT;
3114 FX_DWORD line1; 3014 FX_DWORD line1;
3115 uint8_t *pLine1, cVal; 3015 uint8_t *pLine1, cVal;
3116 int32_t nStride, k; 3016 int32_t nStride, k;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
3176 m_pLine += nStride; 3076 m_pLine += nStride;
3177 if (pPause && pPause->NeedToPauseNow()) { 3077 if (pPause && pPause->NeedToPauseNow()) {
3178 m_loopIndex++; 3078 m_loopIndex++;
3179 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 3079 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
3180 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 3080 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
3181 } 3081 }
3182 } 3082 }
3183 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 3083 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3184 return FXCODEC_STATUS_DECODE_FINISH; 3084 return FXCODEC_STATUS_DECODE_FINISH;
3185 } 3085 }
3086
3186 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt( 3087 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt(
3187 CJBig2_Image* pImage, 3088 CJBig2_Image* pImage,
3188 CJBig2_ArithDecoder* pArithDecoder, 3089 CJBig2_ArithDecoder* pArithDecoder,
3189 JBig2ArithCtx* gbContext, 3090 JBig2ArithCtx* gbContext,
3190 IFX_Pause* pPause) { 3091 IFX_Pause* pPause) {
3191 FX_BOOL SLTP, bVal; 3092 FX_BOOL SLTP, bVal;
3192 FX_DWORD CONTEXT; 3093 FX_DWORD CONTEXT;
3193 FX_DWORD line1, line2; 3094 FX_DWORD line1, line2;
3194 for (; m_loopIndex < GBH; m_loopIndex++) { 3095 for (; m_loopIndex < GBH; m_loopIndex++) {
3195 if (TPGDON) { 3096 if (TPGDON) {
(...skipping 25 matching lines...) Expand all
3221 } 3122 }
3222 if (pPause && pPause->NeedToPauseNow()) { 3123 if (pPause && pPause->NeedToPauseNow()) {
3223 m_loopIndex++; 3124 m_loopIndex++;
3224 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 3125 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
3225 return FXCODEC_STATUS_DECODE_TOBECONTINUE; 3126 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
3226 } 3127 }
3227 } 3128 }
3228 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; 3129 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
3229 return FXCODEC_STATUS_DECODE_FINISH; 3130 return FXCODEC_STATUS_DECODE_FINISH;
3230 } 3131 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698