OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "JBig2_GeneralDecoder.h" | 7 #include "JBig2_GeneralDecoder.h" |
8 #include "JBig2_ArithDecoder.h" | 8 #include "JBig2_ArithDecoder.h" |
9 #include "JBig2_ArithIntDecoder.h" | 9 #include "JBig2_ArithIntDecoder.h" |
10 #include "JBig2_HuffmanDecoder.h" | 10 #include "JBig2_HuffmanDecoder.h" |
11 #include "JBig2_HuffmanTable.h" | 11 #include "JBig2_HuffmanTable.h" |
12 #include "JBig2_PatternDict.h" | 12 #include "JBig2_PatternDict.h" |
13 | 13 |
14 extern const JBig2ArithQe QeTable[] = { | 14 extern const JBig2ArithQe QeTable[] = { |
15 { 0x5601, 1, 1, 1 }, | 15 {0x5601, 1, 1, 1}, {0x3401, 2, 6, 0}, {0x1801, 3, 9, 0}, |
16 { 0x3401, 2, 6, 0 }, | 16 {0x0AC1, 4, 12, 0}, {0x0521, 5, 29, 0}, {0x0221, 38, 33, 0}, |
17 { 0x1801, 3, 9, 0 }, | 17 {0x5601, 7, 6, 1}, {0x5401, 8, 14, 0}, {0x4801, 9, 14, 0}, |
18 { 0x0AC1, 4, 12, 0 }, | 18 {0x3801, 10, 14, 0}, {0x3001, 11, 17, 0}, {0x2401, 12, 18, 0}, |
19 { 0x0521, 5, 29, 0 }, | 19 {0x1C01, 13, 20, 0}, {0x1601, 29, 21, 0}, {0x5601, 15, 14, 1}, |
20 { 0x0221, 38, 33, 0 }, | 20 {0x5401, 16, 14, 0}, {0x5101, 17, 15, 0}, {0x4801, 18, 16, 0}, |
21 { 0x5601, 7, 6, 1 }, | 21 {0x3801, 19, 17, 0}, {0x3401, 20, 18, 0}, {0x3001, 21, 19, 0}, |
22 { 0x5401, 8, 14, 0 }, | 22 {0x2801, 22, 19, 0}, {0x2401, 23, 20, 0}, {0x2201, 24, 21, 0}, |
23 { 0x4801, 9, 14, 0 }, | 23 {0x1C01, 25, 22, 0}, {0x1801, 26, 23, 0}, {0x1601, 27, 24, 0}, |
24 { 0x3801, 10, 14, 0 }, | 24 {0x1401, 28, 25, 0}, {0x1201, 29, 26, 0}, {0x1101, 30, 27, 0}, |
25 { 0x3001, 11, 17, 0 }, | 25 {0x0AC1, 31, 28, 0}, {0x09C1, 32, 29, 0}, {0x08A1, 33, 30, 0}, |
26 { 0x2401, 12, 18, 0 }, | 26 {0x0521, 34, 31, 0}, {0x0441, 35, 32, 0}, {0x02A1, 36, 33, 0}, |
27 { 0x1C01, 13, 20, 0 }, | 27 {0x0221, 37, 34, 0}, {0x0141, 38, 35, 0}, {0x0111, 39, 36, 0}, |
28 { 0x1601, 29, 21, 0 }, | 28 {0x0085, 40, 37, 0}, {0x0049, 41, 38, 0}, {0x0025, 42, 39, 0}, |
29 { 0x5601, 15, 14, 1 }, | 29 {0x0015, 43, 40, 0}, {0x0009, 44, 41, 0}, {0x0005, 45, 42, 0}, |
30 { 0x5401, 16, 14, 0 }, | 30 {0x0001, 45, 43, 0}, {0x5601, 46, 46, 0}}; |
31 { 0x5101, 17, 15, 0 }, | |
32 { 0x4801, 18, 16, 0 }, | |
33 { 0x3801, 19, 17, 0 }, | |
34 { 0x3401, 20, 18, 0 }, | |
35 { 0x3001, 21, 19, 0 }, | |
36 { 0x2801, 22, 19, 0 }, | |
37 { 0x2401, 23, 20, 0 }, | |
38 { 0x2201, 24, 21, 0 }, | |
39 { 0x1C01, 25, 22, 0 }, | |
40 { 0x1801, 26, 23, 0 }, | |
41 { 0x1601, 27, 24, 0 }, | |
42 { 0x1401, 28, 25, 0 }, | |
43 { 0x1201, 29, 26, 0 }, | |
44 { 0x1101, 30, 27, 0 }, | |
45 { 0x0AC1, 31, 28, 0 }, | |
46 { 0x09C1, 32, 29, 0 }, | |
47 { 0x08A1, 33, 30, 0 }, | |
48 { 0x0521, 34, 31, 0 }, | |
49 { 0x0441, 35, 32, 0 }, | |
50 { 0x02A1, 36, 33, 0 }, | |
51 { 0x0221, 37, 34, 0 }, | |
52 { 0x0141, 38, 35, 0 }, | |
53 { 0x0111, 39, 36, 0 }, | |
54 { 0x0085, 40, 37, 0 }, | |
55 { 0x0049, 41, 38, 0 }, | |
56 { 0x0025, 42, 39, 0 }, | |
57 { 0x0015, 43, 40, 0 }, | |
58 { 0x0009, 44, 41, 0 }, | |
59 { 0x0005, 45, 42, 0 }, | |
60 { 0x0001, 45, 43, 0 }, | |
61 { 0x5601, 46, 46, 0 } | |
62 }; | |
63 | 31 |
64 extern const unsigned int JBIG2_QE_NUM = sizeof(QeTable) / sizeof(JBig2ArithQe); | 32 extern const unsigned int JBIG2_QE_NUM = sizeof(QeTable) / sizeof(JBig2ArithQe); |
65 | 33 |
66 CJBig2_Image *CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, J
Big2ArithCtx *gbContext) | 34 CJBig2_Image* CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, |
67 { | 35 JBig2ArithCtx* gbContext) { |
68 if (GBW == 0 || GBH == 0) { | 36 if (GBW == 0 || GBH == 0) { |
69 CJBig2_Image* pImage; | 37 CJBig2_Image* pImage; |
70 JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH)); | 38 JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH)); |
71 return pImage; | 39 return pImage; |
72 } | 40 } |
73 if(GBTEMPLATE == 0) { | 41 if (GBTEMPLATE == 0) { |
74 if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1) | 42 if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1) && |
75 && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) -
1) | 43 (GBAT[2] == (signed char)-3) && (GBAT[3] == (signed char)-1) && |
76 && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2) | 44 (GBAT[4] == 2) && (GBAT[5] == (signed char)-2) && |
77 && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) -
2)) { | 45 (GBAT[6] == (signed char)-2) && (GBAT[7] == (signed char)-2)) { |
78 return decode_Arith_Template0_opt3(pArithDecoder, gbContext); | 46 return decode_Arith_Template0_opt3(pArithDecoder, gbContext); |
| 47 } else { |
| 48 return decode_Arith_Template0_unopt(pArithDecoder, gbContext); |
| 49 } |
| 50 } else if (GBTEMPLATE == 1) { |
| 51 if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1)) { |
| 52 return decode_Arith_Template1_opt3(pArithDecoder, gbContext); |
| 53 } else { |
| 54 return decode_Arith_Template1_unopt(pArithDecoder, gbContext); |
| 55 } |
| 56 } else if (GBTEMPLATE == 2) { |
| 57 if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) { |
| 58 return decode_Arith_Template2_opt3(pArithDecoder, gbContext); |
| 59 } else { |
| 60 return decode_Arith_Template2_unopt(pArithDecoder, gbContext); |
| 61 } |
| 62 } else { |
| 63 if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) { |
| 64 return decode_Arith_Template3_opt3(pArithDecoder, gbContext); |
| 65 } else { |
| 66 return decode_Arith_Template3_unopt(pArithDecoder, gbContext); |
| 67 } |
| 68 } |
| 69 } |
| 70 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt( |
| 71 CJBig2_ArithDecoder* pArithDecoder, |
| 72 JBig2ArithCtx* gbContext) { |
| 73 FX_BOOL LTP, SLTP, bVal; |
| 74 FX_DWORD CONTEXT; |
| 75 CJBig2_Image* GBREG; |
| 76 FX_DWORD line1, line2, line3; |
| 77 LTP = 0; |
| 78 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 79 GBREG->fill(0); |
| 80 for (FX_DWORD h = 0; h < GBH; h++) { |
| 81 if (TPGDON) { |
| 82 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
| 83 LTP = LTP ^ SLTP; |
| 84 } |
| 85 if (LTP == 1) { |
| 86 GBREG->copyLine(h, h - 1); |
| 87 } else { |
| 88 line1 = GBREG->getPixel(2, h - 2); |
| 89 line1 |= GBREG->getPixel(1, h - 2) << 1; |
| 90 line1 |= GBREG->getPixel(0, h - 2) << 2; |
| 91 line2 = GBREG->getPixel(3, h - 1); |
| 92 line2 |= GBREG->getPixel(2, h - 1) << 1; |
| 93 line2 |= GBREG->getPixel(1, h - 1) << 2; |
| 94 line2 |= GBREG->getPixel(0, h - 1) << 3; |
| 95 line3 = 0; |
| 96 for (FX_DWORD w = 0; w < GBW; w++) { |
| 97 if (USESKIP && SKIP->getPixel(w, h)) { |
| 98 bVal = 0; |
79 } else { | 99 } else { |
80 return decode_Arith_Template0_unopt(pArithDecoder, gbContext); | 100 CONTEXT = line3; |
81 } | 101 CONTEXT |= line2 << 4; |
82 } else if(GBTEMPLATE == 1) { | 102 CONTEXT |= line1 << 11; |
83 if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) { | 103 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
84 return decode_Arith_Template1_opt3(pArithDecoder, gbContext); | 104 } |
| 105 if (bVal) { |
| 106 GBREG->setPixel(w, h, bVal); |
| 107 } |
| 108 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f; |
| 109 line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f; |
| 110 line3 = ((line3 << 1) | bVal) & 0x0f; |
| 111 } |
| 112 } |
| 113 } |
| 114 return GBREG; |
| 115 } |
| 116 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt2( |
| 117 CJBig2_ArithDecoder* pArithDecoder, |
| 118 JBig2ArithCtx* gbContext) { |
| 119 FX_BOOL LTP, SLTP, bVal; |
| 120 FX_DWORD CONTEXT; |
| 121 CJBig2_Image* GBREG; |
| 122 FX_DWORD line1, line2; |
| 123 uint8_t *pLine, cVal; |
| 124 intptr_t nStride, nStride2; |
| 125 int32_t nBits, k; |
| 126 LTP = 0; |
| 127 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 128 if (GBREG->m_pData == NULL) { |
| 129 delete GBREG; |
| 130 m_pModule->JBig2_Error( |
| 131 "Generic region decoding procedure: Create Image Failed with width = " |
| 132 "%d, height = %d\n", |
| 133 GBW, GBH); |
| 134 return NULL; |
| 135 } |
| 136 pLine = GBREG->m_pData; |
| 137 nStride = GBREG->m_nStride; |
| 138 nStride2 = nStride << 1; |
| 139 for (FX_DWORD h = 0; h < GBH; h++) { |
| 140 if (TPGDON) { |
| 141 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
| 142 LTP = LTP ^ SLTP; |
| 143 } |
| 144 if (LTP == 1) { |
| 145 GBREG->copyLine(h, h - 1); |
| 146 } else { |
| 147 line1 = (h > 1) ? pLine[-nStride2] << 6 : 0; |
| 148 line2 = (h > 0) ? pLine[-nStride] : 0; |
| 149 CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0); |
| 150 for (FX_DWORD w = 0; w < GBW; w += 8) { |
| 151 if (w + 8 < GBW) { |
| 152 nBits = 8; |
| 153 if (h > 1) { |
| 154 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 6); |
| 155 } |
| 156 if (h > 0) { |
| 157 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
| 158 } |
85 } else { | 159 } else { |
86 return decode_Arith_Template1_unopt(pArithDecoder, gbContext); | 160 nBits = GBW - w; |
87 } | 161 if (h > 1) { |
88 } else if(GBTEMPLATE == 2) { | 162 line1 <<= 8; |
89 if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) { | 163 } |
90 return decode_Arith_Template2_opt3(pArithDecoder, gbContext); | 164 if (h > 0) { |
| 165 line2 <<= 8; |
| 166 } |
| 167 } |
| 168 cVal = 0; |
| 169 for (k = 0; k < nBits; k++) { |
| 170 if (USESKIP && SKIP->getPixel(w, h)) { |
| 171 bVal = 0; |
| 172 } else { |
| 173 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 174 } |
| 175 cVal |= bVal << (7 - k); |
| 176 CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal | |
| 177 ((line1 >> (7 - k)) & 0x0800) | |
| 178 ((line2 >> (7 - k)) & 0x0010); |
| 179 } |
| 180 pLine[w >> 3] = cVal; |
| 181 } |
| 182 } |
| 183 pLine += nStride; |
| 184 } |
| 185 return GBREG; |
| 186 } |
| 187 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt3( |
| 188 CJBig2_ArithDecoder* pArithDecoder, |
| 189 JBig2ArithCtx* gbContext) { |
| 190 FX_BOOL LTP, SLTP, bVal; |
| 191 FX_DWORD CONTEXT; |
| 192 CJBig2_Image* GBREG; |
| 193 FX_DWORD line1, line2; |
| 194 uint8_t *pLine, *pLine1, *pLine2, cVal; |
| 195 int32_t nStride, nStride2, k; |
| 196 int32_t nLineBytes, nBitsLeft, cc; |
| 197 LTP = 0; |
| 198 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 199 if (GBREG->m_pData == NULL) { |
| 200 delete GBREG; |
| 201 m_pModule->JBig2_Error( |
| 202 "Generic region decoding procedure: Create Image Failed with width = " |
| 203 "%d, height = %d\n", |
| 204 GBW, GBH); |
| 205 return NULL; |
| 206 } |
| 207 pLine = GBREG->m_pData; |
| 208 nStride = GBREG->m_nStride; |
| 209 nStride2 = nStride << 1; |
| 210 nLineBytes = ((GBW + 7) >> 3) - 1; |
| 211 nBitsLeft = GBW - (nLineBytes << 3); |
| 212 FX_DWORD height = GBH & 0x7fffffff; |
| 213 for (FX_DWORD h = 0; h < height; h++) { |
| 214 if (TPGDON) { |
| 215 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
| 216 LTP = LTP ^ SLTP; |
| 217 } |
| 218 if (LTP == 1) { |
| 219 GBREG->copyLine(h, h - 1); |
| 220 } else { |
| 221 if (h > 1) { |
| 222 pLine1 = pLine - nStride2; |
| 223 pLine2 = pLine - nStride; |
| 224 line1 = (*pLine1++) << 6; |
| 225 line2 = *pLine2++; |
| 226 CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); |
| 227 for (cc = 0; cc < nLineBytes; cc++) { |
| 228 line1 = (line1 << 8) | ((*pLine1++) << 6); |
| 229 line2 = (line2 << 8) | (*pLine2++); |
| 230 cVal = 0; |
| 231 for (k = 7; k >= 0; k--) { |
| 232 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 233 cVal |= bVal << k; |
| 234 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | |
| 235 ((line1 >> k) & 0x0800) | ((line2 >> k) & 0x0010)); |
| 236 } |
| 237 pLine[cc] = cVal; |
| 238 } |
| 239 line1 <<= 8; |
| 240 line2 <<= 8; |
| 241 cVal = 0; |
| 242 for (k = 0; k < nBitsLeft; k++) { |
| 243 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 244 cVal |= bVal << (7 - k); |
| 245 CONTEXT = |
| 246 (((CONTEXT & 0x7bf7) << 1) | bVal | |
| 247 ((line1 >> (7 - k)) & 0x0800) | ((line2 >> (7 - k)) & 0x0010)); |
| 248 } |
| 249 pLine[nLineBytes] = cVal; |
| 250 } else { |
| 251 pLine2 = pLine - nStride; |
| 252 line2 = (h & 1) ? (*pLine2++) : 0; |
| 253 CONTEXT = (line2 & 0x07f0); |
| 254 for (cc = 0; cc < nLineBytes; cc++) { |
| 255 if (h & 1) { |
| 256 line2 = (line2 << 8) | (*pLine2++); |
| 257 } |
| 258 cVal = 0; |
| 259 for (k = 7; k >= 0; k--) { |
| 260 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 261 cVal |= bVal << k; |
| 262 CONTEXT = |
| 263 (((CONTEXT & 0x7bf7) << 1) | bVal | ((line2 >> k) & 0x0010)); |
| 264 } |
| 265 pLine[cc] = cVal; |
| 266 } |
| 267 line2 <<= 8; |
| 268 cVal = 0; |
| 269 for (k = 0; k < nBitsLeft; k++) { |
| 270 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 271 cVal |= bVal << (7 - k); |
| 272 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | |
| 273 (((line2 >> (7 - k))) & 0x0010)); |
| 274 } |
| 275 pLine[nLineBytes] = cVal; |
| 276 } |
| 277 } |
| 278 pLine += nStride; |
| 279 } |
| 280 return GBREG; |
| 281 } |
| 282 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_unopt( |
| 283 CJBig2_ArithDecoder* pArithDecoder, |
| 284 JBig2ArithCtx* gbContext) { |
| 285 FX_BOOL LTP, SLTP, bVal; |
| 286 FX_DWORD CONTEXT; |
| 287 CJBig2_Image* GBREG; |
| 288 FX_DWORD line1, line2, line3; |
| 289 LTP = 0; |
| 290 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 291 GBREG->fill(0); |
| 292 for (FX_DWORD h = 0; h < GBH; h++) { |
| 293 if (TPGDON) { |
| 294 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
| 295 LTP = LTP ^ SLTP; |
| 296 } |
| 297 if (LTP == 1) { |
| 298 GBREG->copyLine(h, h - 1); |
| 299 } else { |
| 300 line1 = GBREG->getPixel(1, h - 2); |
| 301 line1 |= GBREG->getPixel(0, h - 2) << 1; |
| 302 line2 = GBREG->getPixel(2, h - 1); |
| 303 line2 |= GBREG->getPixel(1, h - 1) << 1; |
| 304 line2 |= GBREG->getPixel(0, h - 1) << 2; |
| 305 line3 = 0; |
| 306 for (FX_DWORD w = 0; w < GBW; w++) { |
| 307 if (USESKIP && SKIP->getPixel(w, h)) { |
| 308 bVal = 0; |
91 } else { | 309 } else { |
92 return decode_Arith_Template2_unopt(pArithDecoder, gbContext); | 310 CONTEXT = line3; |
93 } | 311 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
94 } else { | 312 CONTEXT |= line2 << 5; |
95 if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) { | 313 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; |
96 return decode_Arith_Template3_opt3(pArithDecoder, gbContext); | 314 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; |
| 315 CONTEXT |= line1 << 12; |
| 316 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; |
| 317 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 318 } |
| 319 if (bVal) { |
| 320 GBREG->setPixel(w, h, bVal); |
| 321 } |
| 322 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
| 323 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
| 324 line3 = ((line3 << 1) | bVal) & 0x0f; |
| 325 } |
| 326 } |
| 327 } |
| 328 return GBREG; |
| 329 } |
| 330 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt( |
| 331 CJBig2_ArithDecoder* pArithDecoder, |
| 332 JBig2ArithCtx* gbContext) { |
| 333 FX_BOOL LTP, SLTP, bVal; |
| 334 FX_DWORD CONTEXT; |
| 335 CJBig2_Image* GBREG; |
| 336 FX_DWORD line1, line2, line3; |
| 337 LTP = 0; |
| 338 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 339 GBREG->fill(0); |
| 340 for (FX_DWORD h = 0; h < GBH; h++) { |
| 341 if (TPGDON) { |
| 342 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
| 343 LTP = LTP ^ SLTP; |
| 344 } |
| 345 if (LTP == 1) { |
| 346 GBREG->copyLine(h, h - 1); |
| 347 } else { |
| 348 line1 = GBREG->getPixel(2, h - 2); |
| 349 line1 |= GBREG->getPixel(1, h - 2) << 1; |
| 350 line1 |= GBREG->getPixel(0, h - 2) << 2; |
| 351 line2 = GBREG->getPixel(3, h - 1); |
| 352 line2 |= GBREG->getPixel(2, h - 1) << 1; |
| 353 line2 |= GBREG->getPixel(1, h - 1) << 2; |
| 354 line2 |= GBREG->getPixel(0, h - 1) << 3; |
| 355 line3 = 0; |
| 356 for (FX_DWORD w = 0; w < GBW; w++) { |
| 357 if (USESKIP && SKIP->getPixel(w, h)) { |
| 358 bVal = 0; |
97 } else { | 359 } else { |
98 return decode_Arith_Template3_unopt(pArithDecoder, gbContext); | 360 CONTEXT = line3; |
99 } | 361 CONTEXT |= line2 << 3; |
100 } | 362 CONTEXT |= line1 << 9; |
101 } | 363 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
102 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt(CJBig2_ArithDecoder *pA
rithDecoder, JBig2ArithCtx *gbContext) | 364 } |
103 { | 365 if (bVal) { |
104 FX_BOOL LTP, SLTP, bVal; | 366 GBREG->setPixel(w, h, bVal); |
105 FX_DWORD CONTEXT; | 367 } |
106 CJBig2_Image *GBREG; | 368 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; |
107 FX_DWORD line1, line2, line3; | 369 line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f; |
108 LTP = 0; | 370 line3 = ((line3 << 1) | bVal) & 0x07; |
109 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | 371 } |
110 GBREG->fill(0); | 372 } |
111 for(FX_DWORD h = 0; h < GBH; h++) { | 373 } |
112 if(TPGDON) { | 374 return GBREG; |
113 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); | 375 } |
114 LTP = LTP ^ SLTP; | 376 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt2( |
115 } | 377 CJBig2_ArithDecoder* pArithDecoder, |
116 if(LTP == 1) { | 378 JBig2ArithCtx* gbContext) { |
117 GBREG->copyLine(h, h - 1); | 379 FX_BOOL LTP, SLTP, bVal; |
| 380 FX_DWORD CONTEXT; |
| 381 CJBig2_Image* GBREG; |
| 382 FX_DWORD line1, line2; |
| 383 uint8_t *pLine, cVal; |
| 384 intptr_t nStride, nStride2; |
| 385 int32_t nBits, k; |
| 386 LTP = 0; |
| 387 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 388 if (GBREG->m_pData == NULL) { |
| 389 delete GBREG; |
| 390 m_pModule->JBig2_Error( |
| 391 "Generic region decoding procedure: Create Image Failed with width = " |
| 392 "%d, height = %d\n", |
| 393 GBW, GBH); |
| 394 return NULL; |
| 395 } |
| 396 pLine = GBREG->m_pData; |
| 397 nStride = GBREG->m_nStride; |
| 398 nStride2 = nStride << 1; |
| 399 for (FX_DWORD h = 0; h < GBH; h++) { |
| 400 if (TPGDON) { |
| 401 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
| 402 LTP = LTP ^ SLTP; |
| 403 } |
| 404 if (LTP == 1) { |
| 405 GBREG->copyLine(h, h - 1); |
| 406 } else { |
| 407 line1 = (h > 1) ? pLine[-nStride2] << 4 : 0; |
| 408 line2 = (h > 0) ? pLine[-nStride] : 0; |
| 409 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); |
| 410 for (FX_DWORD w = 0; w < GBW; w += 8) { |
| 411 if (w + 8 < GBW) { |
| 412 nBits = 8; |
| 413 if (h > 1) { |
| 414 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 4); |
| 415 } |
| 416 if (h > 0) { |
| 417 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
| 418 } |
118 } else { | 419 } else { |
119 line1 = GBREG->getPixel(2, h - 2); | 420 nBits = GBW - w; |
120 line1 |= GBREG->getPixel(1, h - 2) << 1; | 421 if (h > 1) { |
121 line1 |= GBREG->getPixel(0, h - 2) << 2; | 422 line1 <<= 8; |
122 line2 = GBREG->getPixel(3, h - 1); | 423 } |
123 line2 |= GBREG->getPixel(2, h - 1) << 1; | 424 if (h > 0) { |
124 line2 |= GBREG->getPixel(1, h - 1) << 2; | 425 line2 <<= 8; |
125 line2 |= GBREG->getPixel(0, h - 1) << 3; | 426 } |
126 line3 = 0; | 427 } |
127 for(FX_DWORD w = 0; w < GBW; w++) { | 428 cVal = 0; |
128 if(USESKIP && SKIP->getPixel(w, h)) { | 429 for (k = 0; k < nBits; k++) { |
129 bVal = 0; | 430 if (USESKIP && SKIP->getPixel(w, h)) { |
130 } else { | 431 bVal = 0; |
131 CONTEXT = line3; | 432 } else { |
132 CONTEXT |= line2 << 4; | 433 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
133 CONTEXT |= line1 << 11; | 434 } |
134 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 435 cVal |= bVal << (7 - k); |
135 } | 436 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
136 if(bVal) { | 437 ((line1 >> (7 - k)) & 0x0200) | |
137 GBREG->setPixel(w, h, bVal); | 438 ((line2 >> (8 - k)) & 0x0008); |
138 } | 439 } |
139 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f; | 440 pLine[w >> 3] = cVal; |
140 line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f; | 441 } |
141 line3 = ((line3 << 1) | bVal) & 0x0f; | 442 } |
| 443 pLine += nStride; |
| 444 } |
| 445 return GBREG; |
| 446 } |
| 447 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt3( |
| 448 CJBig2_ArithDecoder* pArithDecoder, |
| 449 JBig2ArithCtx* gbContext) { |
| 450 FX_BOOL LTP, SLTP, bVal; |
| 451 FX_DWORD CONTEXT; |
| 452 CJBig2_Image* GBREG; |
| 453 FX_DWORD line1, line2; |
| 454 uint8_t *pLine, *pLine1, *pLine2, cVal; |
| 455 int32_t nStride, nStride2, k; |
| 456 int32_t nLineBytes, nBitsLeft, cc; |
| 457 LTP = 0; |
| 458 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 459 if (GBREG->m_pData == NULL) { |
| 460 delete GBREG; |
| 461 m_pModule->JBig2_Error( |
| 462 "Generic region decoding procedure: Create Image Failed with width = " |
| 463 "%d, height = %d\n", |
| 464 GBW, GBH); |
| 465 return NULL; |
| 466 } |
| 467 pLine = GBREG->m_pData; |
| 468 nStride = GBREG->m_nStride; |
| 469 nStride2 = nStride << 1; |
| 470 nLineBytes = ((GBW + 7) >> 3) - 1; |
| 471 nBitsLeft = GBW - (nLineBytes << 3); |
| 472 for (FX_DWORD h = 0; h < GBH; h++) { |
| 473 if (TPGDON) { |
| 474 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
| 475 LTP = LTP ^ SLTP; |
| 476 } |
| 477 if (LTP == 1) { |
| 478 GBREG->copyLine(h, h - 1); |
| 479 } else { |
| 480 if (h > 1) { |
| 481 pLine1 = pLine - nStride2; |
| 482 pLine2 = pLine - nStride; |
| 483 line1 = (*pLine1++) << 4; |
| 484 line2 = *pLine2++; |
| 485 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); |
| 486 for (cc = 0; cc < nLineBytes; cc++) { |
| 487 line1 = (line1 << 8) | ((*pLine1++) << 4); |
| 488 line2 = (line2 << 8) | (*pLine2++); |
| 489 cVal = 0; |
| 490 for (k = 7; k >= 0; k--) { |
| 491 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 492 cVal |= bVal << k; |
| 493 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
| 494 ((line1 >> k) & 0x0200) | ((line2 >> (k + 1)) & 0x0008); |
| 495 } |
| 496 pLine[cc] = cVal; |
| 497 } |
| 498 line1 <<= 8; |
| 499 line2 <<= 8; |
| 500 cVal = 0; |
| 501 for (k = 0; k < nBitsLeft; k++) { |
| 502 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 503 cVal |= bVal << (7 - k); |
| 504 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
| 505 ((line1 >> (7 - k)) & 0x0200) | |
| 506 ((line2 >> (8 - k)) & 0x0008); |
| 507 } |
| 508 pLine[nLineBytes] = cVal; |
| 509 } else { |
| 510 pLine2 = pLine - nStride; |
| 511 line2 = (h & 1) ? (*pLine2++) : 0; |
| 512 CONTEXT = (line2 >> 1) & 0x01f8; |
| 513 for (cc = 0; cc < nLineBytes; cc++) { |
| 514 if (h & 1) { |
| 515 line2 = (line2 << 8) | (*pLine2++); |
| 516 } |
| 517 cVal = 0; |
| 518 for (k = 7; k >= 0; k--) { |
| 519 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 520 cVal |= bVal << k; |
| 521 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
| 522 ((line2 >> (k + 1)) & 0x0008); |
| 523 } |
| 524 pLine[cc] = cVal; |
| 525 } |
| 526 line2 <<= 8; |
| 527 cVal = 0; |
| 528 for (k = 0; k < nBitsLeft; k++) { |
| 529 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 530 cVal |= bVal << (7 - k); |
| 531 CONTEXT = |
| 532 ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008); |
| 533 } |
| 534 pLine[nLineBytes] = cVal; |
| 535 } |
| 536 } |
| 537 pLine += nStride; |
| 538 } |
| 539 return GBREG; |
| 540 } |
| 541 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_unopt( |
| 542 CJBig2_ArithDecoder* pArithDecoder, |
| 543 JBig2ArithCtx* gbContext) { |
| 544 FX_BOOL LTP, SLTP, bVal; |
| 545 FX_DWORD CONTEXT; |
| 546 CJBig2_Image* GBREG; |
| 547 FX_DWORD line1, line2, line3; |
| 548 LTP = 0; |
| 549 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 550 GBREG->fill(0); |
| 551 for (FX_DWORD h = 0; h < GBH; h++) { |
| 552 if (TPGDON) { |
| 553 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
| 554 LTP = LTP ^ SLTP; |
| 555 } |
| 556 if (LTP == 1) { |
| 557 GBREG->copyLine(h, h - 1); |
| 558 } else { |
| 559 line1 = GBREG->getPixel(2, h - 2); |
| 560 line1 |= GBREG->getPixel(1, h - 2) << 1; |
| 561 line1 |= GBREG->getPixel(0, h - 2) << 2; |
| 562 line2 = GBREG->getPixel(2, h - 1); |
| 563 line2 |= GBREG->getPixel(1, h - 1) << 1; |
| 564 line2 |= GBREG->getPixel(0, h - 1) << 2; |
| 565 line3 = 0; |
| 566 for (FX_DWORD w = 0; w < GBW; w++) { |
| 567 if (USESKIP && SKIP->getPixel(w, h)) { |
| 568 bVal = 0; |
| 569 } else { |
| 570 CONTEXT = line3; |
| 571 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
| 572 CONTEXT |= line2 << 4; |
| 573 CONTEXT |= line1 << 9; |
| 574 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 575 } |
| 576 if (bVal) { |
| 577 GBREG->setPixel(w, h, bVal); |
| 578 } |
| 579 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; |
| 580 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
| 581 line3 = ((line3 << 1) | bVal) & 0x07; |
| 582 } |
| 583 } |
| 584 } |
| 585 return GBREG; |
| 586 } |
| 587 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt( |
| 588 CJBig2_ArithDecoder* pArithDecoder, |
| 589 JBig2ArithCtx* gbContext) { |
| 590 FX_BOOL LTP, SLTP, bVal; |
| 591 FX_DWORD CONTEXT; |
| 592 CJBig2_Image* GBREG; |
| 593 FX_DWORD line1, line2, line3; |
| 594 LTP = 0; |
| 595 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 596 GBREG->fill(0); |
| 597 for (FX_DWORD h = 0; h < GBH; h++) { |
| 598 if (TPGDON) { |
| 599 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
| 600 LTP = LTP ^ SLTP; |
| 601 } |
| 602 if (LTP == 1) { |
| 603 GBREG->copyLine(h, h - 1); |
| 604 } else { |
| 605 line1 = GBREG->getPixel(1, h - 2); |
| 606 line1 |= GBREG->getPixel(0, h - 2) << 1; |
| 607 line2 = GBREG->getPixel(2, h - 1); |
| 608 line2 |= GBREG->getPixel(1, h - 1) << 1; |
| 609 line2 |= GBREG->getPixel(0, h - 1) << 2; |
| 610 line3 = 0; |
| 611 for (FX_DWORD w = 0; w < GBW; w++) { |
| 612 if (USESKIP && SKIP->getPixel(w, h)) { |
| 613 bVal = 0; |
| 614 } else { |
| 615 CONTEXT = line3; |
| 616 CONTEXT |= line2 << 2; |
| 617 CONTEXT |= line1 << 7; |
| 618 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 619 } |
| 620 if (bVal) { |
| 621 GBREG->setPixel(w, h, bVal); |
| 622 } |
| 623 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
| 624 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
| 625 line3 = ((line3 << 1) | bVal) & 0x03; |
| 626 } |
| 627 } |
| 628 } |
| 629 return GBREG; |
| 630 } |
| 631 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt2( |
| 632 CJBig2_ArithDecoder* pArithDecoder, |
| 633 JBig2ArithCtx* gbContext) { |
| 634 FX_BOOL LTP, SLTP, bVal; |
| 635 FX_DWORD CONTEXT; |
| 636 CJBig2_Image* GBREG; |
| 637 FX_DWORD line1, line2; |
| 638 uint8_t *pLine, cVal; |
| 639 intptr_t nStride, nStride2; |
| 640 int32_t nBits, k; |
| 641 LTP = 0; |
| 642 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 643 if (GBREG->m_pData == NULL) { |
| 644 delete GBREG; |
| 645 m_pModule->JBig2_Error( |
| 646 "Generic region decoding procedure: Create Image Failed with width = " |
| 647 "%d, height = %d\n", |
| 648 GBW, GBH); |
| 649 return NULL; |
| 650 } |
| 651 pLine = GBREG->m_pData; |
| 652 nStride = GBREG->m_nStride; |
| 653 nStride2 = nStride << 1; |
| 654 for (FX_DWORD h = 0; h < GBH; h++) { |
| 655 if (TPGDON) { |
| 656 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
| 657 LTP = LTP ^ SLTP; |
| 658 } |
| 659 if (LTP == 1) { |
| 660 GBREG->copyLine(h, h - 1); |
| 661 } else { |
| 662 line1 = (h > 1) ? pLine[-nStride2] << 1 : 0; |
| 663 line2 = (h > 0) ? pLine[-nStride] : 0; |
| 664 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); |
| 665 for (FX_DWORD w = 0; w < GBW; w += 8) { |
| 666 if (w + 8 < GBW) { |
| 667 nBits = 8; |
| 668 if (h > 1) { |
| 669 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 1); |
| 670 } |
| 671 if (h > 0) { |
| 672 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
| 673 } |
| 674 } else { |
| 675 nBits = GBW - w; |
| 676 if (h > 1) { |
| 677 line1 <<= 8; |
| 678 } |
| 679 if (h > 0) { |
| 680 line2 <<= 8; |
| 681 } |
| 682 } |
| 683 cVal = 0; |
| 684 for (k = 0; k < nBits; k++) { |
| 685 if (USESKIP && SKIP->getPixel(w, h)) { |
| 686 bVal = 0; |
| 687 } else { |
| 688 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 689 } |
| 690 cVal |= bVal << (7 - k); |
| 691 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
| 692 ((line1 >> (7 - k)) & 0x0080) | |
| 693 ((line2 >> (10 - k)) & 0x0004); |
| 694 } |
| 695 pLine[w >> 3] = cVal; |
| 696 } |
| 697 } |
| 698 pLine += nStride; |
| 699 } |
| 700 return GBREG; |
| 701 } |
| 702 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt3( |
| 703 CJBig2_ArithDecoder* pArithDecoder, |
| 704 JBig2ArithCtx* gbContext) { |
| 705 FX_BOOL LTP, SLTP, bVal; |
| 706 FX_DWORD CONTEXT; |
| 707 CJBig2_Image* GBREG; |
| 708 FX_DWORD line1, line2; |
| 709 uint8_t *pLine, *pLine1, *pLine2, cVal; |
| 710 int32_t nStride, nStride2, k; |
| 711 int32_t nLineBytes, nBitsLeft, cc; |
| 712 LTP = 0; |
| 713 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 714 if (GBREG->m_pData == NULL) { |
| 715 delete GBREG; |
| 716 m_pModule->JBig2_Error( |
| 717 "Generic region decoding procedure: Create Image Failed with width = " |
| 718 "%d, height = %d\n", |
| 719 GBW, GBH); |
| 720 return NULL; |
| 721 } |
| 722 pLine = GBREG->m_pData; |
| 723 nStride = GBREG->m_nStride; |
| 724 nStride2 = nStride << 1; |
| 725 nLineBytes = ((GBW + 7) >> 3) - 1; |
| 726 nBitsLeft = GBW - (nLineBytes << 3); |
| 727 for (FX_DWORD h = 0; h < GBH; h++) { |
| 728 if (TPGDON) { |
| 729 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
| 730 LTP = LTP ^ SLTP; |
| 731 } |
| 732 if (LTP == 1) { |
| 733 GBREG->copyLine(h, h - 1); |
| 734 } else { |
| 735 if (h > 1) { |
| 736 pLine1 = pLine - nStride2; |
| 737 pLine2 = pLine - nStride; |
| 738 line1 = (*pLine1++) << 1; |
| 739 line2 = *pLine2++; |
| 740 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); |
| 741 for (cc = 0; cc < nLineBytes; cc++) { |
| 742 line1 = (line1 << 8) | ((*pLine1++) << 1); |
| 743 line2 = (line2 << 8) | (*pLine2++); |
| 744 cVal = 0; |
| 745 for (k = 7; k >= 0; k--) { |
| 746 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 747 cVal |= bVal << k; |
| 748 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
| 749 ((line1 >> k) & 0x0080) | ((line2 >> (k + 3)) & 0x0004); |
| 750 } |
| 751 pLine[cc] = cVal; |
| 752 } |
| 753 line1 <<= 8; |
| 754 line2 <<= 8; |
| 755 cVal = 0; |
| 756 for (k = 0; k < nBitsLeft; k++) { |
| 757 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 758 cVal |= bVal << (7 - k); |
| 759 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
| 760 ((line1 >> (7 - k)) & 0x0080) | |
| 761 ((line2 >> (10 - k)) & 0x0004); |
| 762 } |
| 763 pLine[nLineBytes] = cVal; |
| 764 } else { |
| 765 pLine2 = pLine - nStride; |
| 766 line2 = (h & 1) ? (*pLine2++) : 0; |
| 767 CONTEXT = (line2 >> 3) & 0x007c; |
| 768 for (cc = 0; cc < nLineBytes; cc++) { |
| 769 if (h & 1) { |
| 770 line2 = (line2 << 8) | (*pLine2++); |
| 771 } |
| 772 cVal = 0; |
| 773 for (k = 7; k >= 0; k--) { |
| 774 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 775 cVal |= bVal << k; |
| 776 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
| 777 ((line2 >> (k + 3)) & 0x0004); |
| 778 } |
| 779 pLine[cc] = cVal; |
| 780 } |
| 781 line2 <<= 8; |
| 782 cVal = 0; |
| 783 for (k = 0; k < nBitsLeft; k++) { |
| 784 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 785 cVal |= bVal << (7 - k); |
| 786 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
| 787 (((line2 >> (10 - k))) & 0x0004); |
| 788 } |
| 789 pLine[nLineBytes] = cVal; |
| 790 } |
| 791 } |
| 792 pLine += nStride; |
| 793 } |
| 794 return GBREG; |
| 795 } |
| 796 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_unopt( |
| 797 CJBig2_ArithDecoder* pArithDecoder, |
| 798 JBig2ArithCtx* gbContext) { |
| 799 FX_BOOL LTP, SLTP, bVal; |
| 800 FX_DWORD CONTEXT; |
| 801 CJBig2_Image* GBREG; |
| 802 FX_DWORD line1, line2, line3; |
| 803 LTP = 0; |
| 804 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 805 GBREG->fill(0); |
| 806 for (FX_DWORD h = 0; h < GBH; h++) { |
| 807 if (TPGDON) { |
| 808 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
| 809 LTP = LTP ^ SLTP; |
| 810 } |
| 811 if (LTP == 1) { |
| 812 GBREG->copyLine(h, h - 1); |
| 813 } else { |
| 814 line1 = GBREG->getPixel(1, h - 2); |
| 815 line1 |= GBREG->getPixel(0, h - 2) << 1; |
| 816 line2 = GBREG->getPixel(1, h - 1); |
| 817 line2 |= GBREG->getPixel(0, h - 1) << 1; |
| 818 line3 = 0; |
| 819 for (FX_DWORD w = 0; w < GBW; w++) { |
| 820 if (USESKIP && SKIP->getPixel(w, h)) { |
| 821 bVal = 0; |
| 822 } else { |
| 823 CONTEXT = line3; |
| 824 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; |
| 825 CONTEXT |= line2 << 3; |
| 826 CONTEXT |= line1 << 7; |
| 827 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 828 } |
| 829 if (bVal) { |
| 830 GBREG->setPixel(w, h, bVal); |
| 831 } |
| 832 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
| 833 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f; |
| 834 line3 = ((line3 << 1) | bVal) & 0x03; |
| 835 } |
| 836 } |
| 837 } |
| 838 return GBREG; |
| 839 } |
| 840 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt( |
| 841 CJBig2_ArithDecoder* pArithDecoder, |
| 842 JBig2ArithCtx* gbContext) { |
| 843 FX_BOOL LTP, SLTP, bVal; |
| 844 FX_DWORD CONTEXT; |
| 845 CJBig2_Image* GBREG; |
| 846 FX_DWORD line1, line2; |
| 847 LTP = 0; |
| 848 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 849 GBREG->fill(0); |
| 850 for (FX_DWORD h = 0; h < GBH; h++) { |
| 851 if (TPGDON) { |
| 852 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
| 853 LTP = LTP ^ SLTP; |
| 854 } |
| 855 if (LTP == 1) { |
| 856 GBREG->copyLine(h, h - 1); |
| 857 } else { |
| 858 line1 = GBREG->getPixel(2, h - 1); |
| 859 line1 |= GBREG->getPixel(1, h - 1) << 1; |
| 860 line1 |= GBREG->getPixel(0, h - 1) << 2; |
| 861 line2 = 0; |
| 862 for (FX_DWORD w = 0; w < GBW; w++) { |
| 863 if (USESKIP && SKIP->getPixel(w, h)) { |
| 864 bVal = 0; |
| 865 } else { |
| 866 CONTEXT = line2; |
| 867 CONTEXT |= line1 << 4; |
| 868 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 869 } |
| 870 if (bVal) { |
| 871 GBREG->setPixel(w, h, bVal); |
| 872 } |
| 873 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f; |
| 874 line2 = ((line2 << 1) | bVal) & 0x0f; |
| 875 } |
| 876 } |
| 877 } |
| 878 return GBREG; |
| 879 } |
| 880 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt2( |
| 881 CJBig2_ArithDecoder* pArithDecoder, |
| 882 JBig2ArithCtx* gbContext) { |
| 883 FX_BOOL LTP, SLTP, bVal; |
| 884 FX_DWORD CONTEXT; |
| 885 CJBig2_Image* GBREG; |
| 886 FX_DWORD line1; |
| 887 uint8_t *pLine, cVal; |
| 888 intptr_t nStride; |
| 889 int32_t nBits, k; |
| 890 LTP = 0; |
| 891 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 892 if (GBREG->m_pData == NULL) { |
| 893 delete GBREG; |
| 894 m_pModule->JBig2_Error( |
| 895 "Generic region decoding procedure: Create Image Failed with width = " |
| 896 "%d, height = %d\n", |
| 897 GBW, GBH); |
| 898 return NULL; |
| 899 } |
| 900 pLine = GBREG->m_pData; |
| 901 nStride = GBREG->m_nStride; |
| 902 for (FX_DWORD h = 0; h < GBH; h++) { |
| 903 if (TPGDON) { |
| 904 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
| 905 LTP = LTP ^ SLTP; |
| 906 } |
| 907 if (LTP == 1) { |
| 908 GBREG->copyLine(h, h - 1); |
| 909 } else { |
| 910 line1 = (h > 0) ? pLine[-nStride] : 0; |
| 911 CONTEXT = (line1 >> 1) & 0x03f0; |
| 912 for (FX_DWORD w = 0; w < GBW; w += 8) { |
| 913 if (w + 8 < GBW) { |
| 914 nBits = 8; |
| 915 if (h > 0) { |
| 916 line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
| 917 } |
| 918 } else { |
| 919 nBits = GBW - w; |
| 920 if (h > 0) { |
| 921 line1 <<= 8; |
| 922 } |
| 923 } |
| 924 cVal = 0; |
| 925 for (k = 0; k < nBits; k++) { |
| 926 if (USESKIP && SKIP->getPixel(w, h)) { |
| 927 bVal = 0; |
| 928 } else { |
| 929 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 930 } |
| 931 cVal |= bVal << (7 - k); |
| 932 CONTEXT = |
| 933 ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010); |
| 934 } |
| 935 pLine[w >> 3] = cVal; |
| 936 } |
| 937 } |
| 938 pLine += nStride; |
| 939 } |
| 940 return GBREG; |
| 941 } |
| 942 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt3( |
| 943 CJBig2_ArithDecoder* pArithDecoder, |
| 944 JBig2ArithCtx* gbContext) { |
| 945 FX_BOOL LTP, SLTP, bVal; |
| 946 FX_DWORD CONTEXT; |
| 947 CJBig2_Image* GBREG; |
| 948 FX_DWORD line1; |
| 949 uint8_t *pLine, *pLine1, cVal; |
| 950 int32_t nStride, k; |
| 951 int32_t nLineBytes, nBitsLeft, cc; |
| 952 LTP = 0; |
| 953 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 954 if (GBREG->m_pData == NULL) { |
| 955 delete GBREG; |
| 956 m_pModule->JBig2_Error( |
| 957 "Generic region decoding procedure: Create Image Failed with width = " |
| 958 "%d, height = %d\n", |
| 959 GBW, GBH); |
| 960 return NULL; |
| 961 } |
| 962 pLine = GBREG->m_pData; |
| 963 nStride = GBREG->m_nStride; |
| 964 nLineBytes = ((GBW + 7) >> 3) - 1; |
| 965 nBitsLeft = GBW - (nLineBytes << 3); |
| 966 for (FX_DWORD h = 0; h < GBH; h++) { |
| 967 if (TPGDON) { |
| 968 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
| 969 LTP = LTP ^ SLTP; |
| 970 } |
| 971 if (LTP == 1) { |
| 972 GBREG->copyLine(h, h - 1); |
| 973 } else { |
| 974 if (h > 0) { |
| 975 pLine1 = pLine - nStride; |
| 976 line1 = *pLine1++; |
| 977 CONTEXT = (line1 >> 1) & 0x03f0; |
| 978 for (cc = 0; cc < nLineBytes; cc++) { |
| 979 line1 = (line1 << 8) | (*pLine1++); |
| 980 cVal = 0; |
| 981 for (k = 7; k >= 0; k--) { |
| 982 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 983 cVal |= bVal << k; |
| 984 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | |
| 985 ((line1 >> (k + 1)) & 0x0010); |
| 986 } |
| 987 pLine[cc] = cVal; |
| 988 } |
| 989 line1 <<= 8; |
| 990 cVal = 0; |
| 991 for (k = 0; k < nBitsLeft; k++) { |
| 992 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 993 cVal |= bVal << (7 - k); |
| 994 CONTEXT = |
| 995 ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010); |
| 996 } |
| 997 pLine[nLineBytes] = cVal; |
| 998 } else { |
| 999 CONTEXT = 0; |
| 1000 for (cc = 0; cc < nLineBytes; cc++) { |
| 1001 cVal = 0; |
| 1002 for (k = 7; k >= 0; k--) { |
| 1003 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 1004 cVal |= bVal << k; |
| 1005 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
| 1006 } |
| 1007 pLine[cc] = cVal; |
| 1008 } |
| 1009 cVal = 0; |
| 1010 for (k = 0; k < nBitsLeft; k++) { |
| 1011 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 1012 cVal |= bVal << (7 - k); |
| 1013 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
| 1014 } |
| 1015 pLine[nLineBytes] = cVal; |
| 1016 } |
| 1017 } |
| 1018 pLine += nStride; |
| 1019 } |
| 1020 return GBREG; |
| 1021 } |
| 1022 CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_unopt( |
| 1023 CJBig2_ArithDecoder* pArithDecoder, |
| 1024 JBig2ArithCtx* gbContext) { |
| 1025 FX_BOOL LTP, SLTP, bVal; |
| 1026 FX_DWORD CONTEXT; |
| 1027 CJBig2_Image* GBREG; |
| 1028 FX_DWORD line1, line2; |
| 1029 LTP = 0; |
| 1030 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 1031 GBREG->fill(0); |
| 1032 for (FX_DWORD h = 0; h < GBH; h++) { |
| 1033 if (TPGDON) { |
| 1034 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
| 1035 LTP = LTP ^ SLTP; |
| 1036 } |
| 1037 if (LTP == 1) { |
| 1038 GBREG->copyLine(h, h - 1); |
| 1039 } else { |
| 1040 line1 = GBREG->getPixel(1, h - 1); |
| 1041 line1 |= GBREG->getPixel(0, h - 1) << 1; |
| 1042 line2 = 0; |
| 1043 for (FX_DWORD w = 0; w < GBW; w++) { |
| 1044 if (USESKIP && SKIP->getPixel(w, h)) { |
| 1045 bVal = 0; |
| 1046 } else { |
| 1047 CONTEXT = line2; |
| 1048 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
| 1049 CONTEXT |= line1 << 5; |
| 1050 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 1051 } |
| 1052 if (bVal) { |
| 1053 GBREG->setPixel(w, h, bVal); |
| 1054 } |
| 1055 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f; |
| 1056 line2 = ((line2 << 1) | bVal) & 0x0f; |
| 1057 } |
| 1058 } |
| 1059 } |
| 1060 return GBREG; |
| 1061 } |
| 1062 CJBig2_Image* CJBig2_GRDProc::decode_Arith_V2( |
| 1063 CJBig2_ArithDecoder* pArithDecoder, |
| 1064 JBig2ArithCtx* gbContext) { |
| 1065 FX_BOOL LTP, SLTP, bVal; |
| 1066 FX_DWORD CONTEXT; |
| 1067 CJBig2_Image* GBREG; |
| 1068 FX_DWORD line1, line2, line3; |
| 1069 LTP = 0; |
| 1070 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 1071 GBREG->fill(0); |
| 1072 for (FX_DWORD h = 0; h < GBH; h++) { |
| 1073 if (TPGDON) { |
| 1074 switch (GBTEMPLATE) { |
| 1075 case 0: |
| 1076 CONTEXT = 0x9b25; |
| 1077 break; |
| 1078 case 1: |
| 1079 CONTEXT = 0x0795; |
| 1080 break; |
| 1081 case 2: |
| 1082 CONTEXT = 0x00e5; |
| 1083 break; |
| 1084 case 3: |
| 1085 CONTEXT = 0x0195; |
| 1086 break; |
| 1087 } |
| 1088 SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 1089 LTP = LTP ^ SLTP; |
| 1090 } |
| 1091 if (LTP == 1) { |
| 1092 GBREG->copyLine(h, h - 1); |
| 1093 } else { |
| 1094 switch (GBTEMPLATE) { |
| 1095 case 0: { |
| 1096 line1 = GBREG->getPixel(1, h - 2); |
| 1097 line1 |= GBREG->getPixel(0, h - 2) << 1; |
| 1098 line2 = GBREG->getPixel(2, h - 1); |
| 1099 line2 |= GBREG->getPixel(1, h - 1) << 1; |
| 1100 line2 |= GBREG->getPixel(0, h - 1) << 2; |
| 1101 line3 = 0; |
| 1102 for (FX_DWORD w = 0; w < GBW; w++) { |
| 1103 if (USESKIP && SKIP->getPixel(w, h)) { |
| 1104 bVal = 0; |
| 1105 } else { |
| 1106 CONTEXT = line3; |
| 1107 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
| 1108 CONTEXT |= line2 << 5; |
| 1109 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; |
| 1110 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; |
| 1111 CONTEXT |= line1 << 12; |
| 1112 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; |
| 1113 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
142 } | 1114 } |
143 } | 1115 if (bVal) { |
144 } | 1116 GBREG->setPixel(w, h, bVal); |
145 return GBREG; | 1117 } |
146 } | 1118 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
147 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt2(CJBig2_ArithDecoder *p
ArithDecoder, JBig2ArithCtx *gbContext) | 1119 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
148 { | 1120 line3 = ((line3 << 1) | bVal) & 0x0f; |
149 FX_BOOL LTP, SLTP, bVal; | 1121 } |
150 FX_DWORD CONTEXT; | 1122 } break; |
151 CJBig2_Image *GBREG; | 1123 case 1: { |
152 FX_DWORD line1, line2; | 1124 line1 = GBREG->getPixel(2, h - 2); |
153 uint8_t *pLine, cVal; | 1125 line1 |= GBREG->getPixel(1, h - 2) << 1; |
154 intptr_t nStride, nStride2; | 1126 line1 |= GBREG->getPixel(0, h - 2) << 2; |
155 int32_t nBits, k; | 1127 line2 = GBREG->getPixel(2, h - 1); |
156 LTP = 0; | 1128 line2 |= GBREG->getPixel(1, h - 1) << 1; |
157 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | 1129 line2 |= GBREG->getPixel(0, h - 1) << 2; |
158 if (GBREG->m_pData == NULL) { | 1130 line3 = 0; |
159 delete GBREG; | 1131 for (FX_DWORD w = 0; w < GBW; w++) { |
160 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | 1132 if (USESKIP && SKIP->getPixel(w, h)) { |
161 return NULL; | 1133 bVal = 0; |
162 } | 1134 } else { |
163 pLine = GBREG->m_pData; | 1135 CONTEXT = line3; |
164 nStride = GBREG->m_nStride; | 1136 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
165 nStride2 = nStride << 1; | 1137 CONTEXT |= line2 << 4; |
166 for(FX_DWORD h = 0; h < GBH; h++) { | 1138 CONTEXT |= line1 << 9; |
167 if(TPGDON) { | 1139 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
168 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); | 1140 } |
169 LTP = LTP ^ SLTP; | 1141 if (bVal) { |
170 } | 1142 GBREG->setPixel(w, h, bVal); |
171 if(LTP == 1) { | 1143 } |
172 GBREG->copyLine(h, h - 1); | 1144 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; |
| 1145 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
| 1146 line3 = ((line3 << 1) | bVal) & 0x07; |
| 1147 } |
| 1148 } break; |
| 1149 case 2: { |
| 1150 line1 = GBREG->getPixel(1, h - 2); |
| 1151 line1 |= GBREG->getPixel(0, h - 2) << 1; |
| 1152 line2 = GBREG->getPixel(1, h - 1); |
| 1153 line2 |= GBREG->getPixel(0, h - 1) << 1; |
| 1154 line3 = 0; |
| 1155 for (FX_DWORD w = 0; w < GBW; w++) { |
| 1156 if (USESKIP && SKIP->getPixel(w, h)) { |
| 1157 bVal = 0; |
| 1158 } else { |
| 1159 CONTEXT = line3; |
| 1160 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; |
| 1161 CONTEXT |= line2 << 3; |
| 1162 CONTEXT |= line1 << 7; |
| 1163 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 1164 } |
| 1165 if (bVal) { |
| 1166 GBREG->setPixel(w, h, bVal); |
| 1167 } |
| 1168 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
| 1169 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f; |
| 1170 line3 = ((line3 << 1) | bVal) & 0x03; |
| 1171 } |
| 1172 } break; |
| 1173 case 3: { |
| 1174 line1 = GBREG->getPixel(1, h - 1); |
| 1175 line1 |= GBREG->getPixel(0, h - 1) << 1; |
| 1176 line2 = 0; |
| 1177 for (FX_DWORD w = 0; w < GBW; w++) { |
| 1178 if (USESKIP && SKIP->getPixel(w, h)) { |
| 1179 bVal = 0; |
| 1180 } else { |
| 1181 CONTEXT = line2; |
| 1182 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
| 1183 CONTEXT |= line1 << 5; |
| 1184 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 1185 } |
| 1186 if (bVal) { |
| 1187 GBREG->setPixel(w, h, bVal); |
| 1188 } |
| 1189 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f; |
| 1190 line2 = ((line2 << 1) | bVal) & 0x0f; |
| 1191 } |
| 1192 } break; |
| 1193 } |
| 1194 } |
| 1195 } |
| 1196 return GBREG; |
| 1197 } |
| 1198 CJBig2_Image* CJBig2_GRDProc::decode_Arith_V1( |
| 1199 CJBig2_ArithDecoder* pArithDecoder, |
| 1200 JBig2ArithCtx* gbContext) { |
| 1201 FX_BOOL LTP, SLTP, bVal; |
| 1202 FX_DWORD CONTEXT = 0; |
| 1203 CJBig2_Image* GBREG; |
| 1204 LTP = 0; |
| 1205 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 1206 GBREG->fill(0); |
| 1207 for (FX_DWORD h = 0; h < GBH; h++) { |
| 1208 if (TPGDON) { |
| 1209 switch (GBTEMPLATE) { |
| 1210 case 0: |
| 1211 CONTEXT = 0x9b25; |
| 1212 break; |
| 1213 case 1: |
| 1214 CONTEXT = 0x0795; |
| 1215 break; |
| 1216 case 2: |
| 1217 CONTEXT = 0x00e5; |
| 1218 break; |
| 1219 case 3: |
| 1220 CONTEXT = 0x0195; |
| 1221 break; |
| 1222 } |
| 1223 SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 1224 LTP = LTP ^ SLTP; |
| 1225 } |
| 1226 if (LTP == 1) { |
| 1227 for (FX_DWORD w = 0; w < GBW; w++) { |
| 1228 GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1)); |
| 1229 } |
| 1230 } else { |
| 1231 for (FX_DWORD w = 0; w < GBW; w++) { |
| 1232 if (USESKIP && SKIP->getPixel(w, h)) { |
| 1233 GBREG->setPixel(w, h, 0); |
173 } else { | 1234 } else { |
174 line1 = (h > 1) ? pLine[-nStride2] << 6 : 0; | 1235 CONTEXT = 0; |
175 line2 = (h > 0) ? pLine[-nStride] : 0; | 1236 switch (GBTEMPLATE) { |
176 CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0); | 1237 case 0: |
177 for(FX_DWORD w = 0; w < GBW; w += 8) { | 1238 CONTEXT |= GBREG->getPixel(w - 1, h); |
178 if(w + 8 < GBW) { | 1239 CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
179 nBits = 8; | 1240 CONTEXT |= GBREG->getPixel(w - 3, h) << 2; |
180 if(h > 1) { | 1241 CONTEXT |= GBREG->getPixel(w - 4, h) << 3; |
181 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1]
<< 6); | 1242 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
182 } | 1243 CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5; |
183 if(h > 0) { | 1244 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6; |
184 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); | 1245 CONTEXT |= GBREG->getPixel(w, h - 1) << 7; |
185 } | 1246 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8; |
186 } else { | 1247 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9; |
187 nBits = GBW - w; | 1248 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; |
188 if(h > 1) { | 1249 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; |
189 line1 <<= 8; | 1250 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12; |
190 } | 1251 CONTEXT |= GBREG->getPixel(w, h - 2) << 13; |
191 if(h > 0) { | 1252 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14; |
192 line2 <<= 8; | 1253 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; |
193 } | 1254 break; |
194 } | 1255 case 1: |
195 cVal = 0; | 1256 CONTEXT |= GBREG->getPixel(w - 1, h); |
196 for(k = 0; k < nBits; k++) { | 1257 CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
197 if(USESKIP && SKIP->getPixel(w, h)) { | 1258 CONTEXT |= GBREG->getPixel(w - 3, h) << 2; |
198 bVal = 0; | 1259 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
199 } else { | 1260 CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4; |
200 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 1261 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5; |
201 } | 1262 CONTEXT |= GBREG->getPixel(w, h - 1) << 6; |
202 cVal |= bVal << (7 - k); | 1263 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7; |
203 CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal | 1264 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8; |
204 | ((line1 >> (7 - k)) & 0x0800) | 1265 CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9; |
205 | ((line2 >> (7 - k)) & 0x0010); | 1266 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10; |
206 } | 1267 CONTEXT |= GBREG->getPixel(w, h - 2) << 11; |
207 pLine[w >> 3] = cVal; | 1268 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12; |
208 } | 1269 break; |
209 } | 1270 case 2: |
210 pLine += nStride; | 1271 CONTEXT |= GBREG->getPixel(w - 1, h); |
211 } | 1272 CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
212 return GBREG; | 1273 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; |
213 } | 1274 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3; |
214 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_ArithDecoder *p
ArithDecoder, JBig2ArithCtx *gbContext) | 1275 CONTEXT |= GBREG->getPixel(w, h - 1) << 4; |
215 { | 1276 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5; |
216 FX_BOOL LTP, SLTP, bVal; | 1277 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6; |
217 FX_DWORD CONTEXT; | 1278 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7; |
218 CJBig2_Image *GBREG; | 1279 CONTEXT |= GBREG->getPixel(w, h - 2) << 8; |
219 FX_DWORD line1, line2; | 1280 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9; |
220 uint8_t *pLine, *pLine1, *pLine2, cVal; | 1281 break; |
221 int32_t nStride, nStride2, k; | 1282 case 3: |
222 int32_t nLineBytes, nBitsLeft, cc; | 1283 CONTEXT |= GBREG->getPixel(w - 1, h); |
223 LTP = 0; | 1284 CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
224 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | 1285 CONTEXT |= GBREG->getPixel(w - 3, h) << 2; |
225 if (GBREG->m_pData == NULL) { | 1286 CONTEXT |= GBREG->getPixel(w - 4, h) << 3; |
226 delete GBREG; | 1287 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
227 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | 1288 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5; |
228 return NULL; | 1289 CONTEXT |= GBREG->getPixel(w, h - 1) << 6; |
229 } | 1290 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7; |
230 pLine = GBREG->m_pData; | 1291 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8; |
231 nStride = GBREG->m_nStride; | 1292 CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9; |
232 nStride2 = nStride << 1; | 1293 break; |
233 nLineBytes = ((GBW + 7) >> 3) - 1; | 1294 } |
234 nBitsLeft = GBW - (nLineBytes << 3); | 1295 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
235 FX_DWORD height = GBH & 0x7fffffff; | 1296 GBREG->setPixel(w, h, bVal); |
236 for(FX_DWORD h = 0; h < height; h++) { | 1297 } |
237 if(TPGDON) { | 1298 } |
238 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); | 1299 } |
239 LTP = LTP ^ SLTP; | 1300 } |
240 } | 1301 return GBREG; |
241 if(LTP == 1) { | 1302 } |
242 GBREG->copyLine(h, h - 1); | 1303 CJBig2_Image* CJBig2_GRDProc::decode_MMR(CJBig2_BitStream* pStream) { |
| 1304 int bitpos, i; |
| 1305 CJBig2_Image* pImage; |
| 1306 JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH)); |
| 1307 if (pImage->m_pData == NULL) { |
| 1308 delete pImage; |
| 1309 m_pModule->JBig2_Error( |
| 1310 "Generic region decoding procedure: Create Image Failed with width = " |
| 1311 "%d, height = %d\n", |
| 1312 GBW, GBH); |
| 1313 return NULL; |
| 1314 } |
| 1315 bitpos = (int)pStream->getBitPos(); |
| 1316 _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, |
| 1317 pImage->m_pData, GBW, GBH, pImage->m_nStride); |
| 1318 pStream->setBitPos(bitpos); |
| 1319 for (i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) { |
| 1320 pImage->m_pData[i] = ~pImage->m_pData[i]; |
| 1321 } |
| 1322 return pImage; |
| 1323 } |
| 1324 CJBig2_Image* CJBig2_GRRDProc::decode(CJBig2_ArithDecoder* pArithDecoder, |
| 1325 JBig2ArithCtx* grContext) { |
| 1326 if (GRW == 0 || GRH == 0) { |
| 1327 CJBig2_Image* pImage; |
| 1328 JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH)); |
| 1329 return pImage; |
| 1330 } |
| 1331 if (GRTEMPLATE == 0) { |
| 1332 if ((GRAT[0] == (signed char)-1) && (GRAT[1] == (signed char)-1) && |
| 1333 (GRAT[2] == (signed char)-1) && (GRAT[3] == (signed char)-1) && |
| 1334 (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) { |
| 1335 return decode_Template0_opt(pArithDecoder, grContext); |
| 1336 } else { |
| 1337 return decode_Template0_unopt(pArithDecoder, grContext); |
| 1338 } |
| 1339 } else { |
| 1340 if ((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) { |
| 1341 return decode_Template1_opt(pArithDecoder, grContext); |
| 1342 } else { |
| 1343 return decode_Template1_unopt(pArithDecoder, grContext); |
| 1344 } |
| 1345 } |
| 1346 } |
| 1347 CJBig2_Image* CJBig2_GRRDProc::decode_Template0_unopt( |
| 1348 CJBig2_ArithDecoder* pArithDecoder, |
| 1349 JBig2ArithCtx* grContext) { |
| 1350 FX_BOOL LTP, SLTP, bVal; |
| 1351 FX_DWORD CONTEXT; |
| 1352 CJBig2_Image* GRREG; |
| 1353 FX_DWORD line1, line2, line3, line4, line5; |
| 1354 LTP = 0; |
| 1355 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
| 1356 GRREG->fill(0); |
| 1357 for (FX_DWORD h = 0; h < GRH; h++) { |
| 1358 if (TPGRON) { |
| 1359 SLTP = pArithDecoder->DECODE(&grContext[0x0010]); |
| 1360 LTP = LTP ^ SLTP; |
| 1361 } |
| 1362 if (LTP == 0) { |
| 1363 line1 = GRREG->getPixel(1, h - 1); |
| 1364 line1 |= GRREG->getPixel(0, h - 1) << 1; |
| 1365 line2 = 0; |
| 1366 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1); |
| 1367 line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) |
| 1368 << 1; |
| 1369 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
| 1370 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
| 1371 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) |
| 1372 << 2; |
| 1373 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
| 1374 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) |
| 1375 << 1; |
| 1376 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) |
| 1377 << 2; |
| 1378 for (FX_DWORD w = 0; w < GRW; w++) { |
| 1379 CONTEXT = line5; |
| 1380 CONTEXT |= line4 << 3; |
| 1381 CONTEXT |= line3 << 6; |
| 1382 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], |
| 1383 h - GRREFERENCEDY + GRAT[3]) |
| 1384 << 8; |
| 1385 CONTEXT |= line2 << 9; |
| 1386 CONTEXT |= line1 << 10; |
| 1387 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
| 1388 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
| 1389 GRREG->setPixel(w, h, bVal); |
| 1390 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03; |
| 1391 line2 = ((line2 << 1) | bVal) & 0x01; |
| 1392 line3 = ((line3 << 1) | |
| 1393 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
| 1394 h - GRREFERENCEDY - 1)) & |
| 1395 0x03; |
| 1396 line4 = |
| 1397 ((line4 << 1) | |
| 1398 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & |
| 1399 0x07; |
| 1400 line5 = ((line5 << 1) | |
| 1401 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
| 1402 h - GRREFERENCEDY + 1)) & |
| 1403 0x07; |
| 1404 } |
| 1405 } else { |
| 1406 line1 = GRREG->getPixel(1, h - 1); |
| 1407 line1 |= GRREG->getPixel(0, h - 1) << 1; |
| 1408 line2 = 0; |
| 1409 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1); |
| 1410 line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) |
| 1411 << 1; |
| 1412 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
| 1413 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
| 1414 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) |
| 1415 << 2; |
| 1416 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
| 1417 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) |
| 1418 << 1; |
| 1419 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) |
| 1420 << 2; |
| 1421 for (FX_DWORD w = 0; w < GRW; w++) { |
| 1422 bVal = GRREFERENCE->getPixel(w, h); |
| 1423 if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) && |
| 1424 (bVal == GRREFERENCE->getPixel(w, h - 1)) && |
| 1425 (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) && |
| 1426 (bVal == GRREFERENCE->getPixel(w - 1, h)) && |
| 1427 (bVal == GRREFERENCE->getPixel(w + 1, h)) && |
| 1428 (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) && |
| 1429 (bVal == GRREFERENCE->getPixel(w, h + 1)) && |
| 1430 (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) { |
| 1431 CONTEXT = line5; |
| 1432 CONTEXT |= line4 << 3; |
| 1433 CONTEXT |= line3 << 6; |
| 1434 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], |
| 1435 h - GRREFERENCEDY + GRAT[3]) |
| 1436 << 8; |
| 1437 CONTEXT |= line2 << 9; |
| 1438 CONTEXT |= line1 << 10; |
| 1439 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
| 1440 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
| 1441 } |
| 1442 GRREG->setPixel(w, h, bVal); |
| 1443 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03; |
| 1444 line2 = ((line2 << 1) | bVal) & 0x01; |
| 1445 line3 = ((line3 << 1) | |
| 1446 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
| 1447 h - GRREFERENCEDY - 1)) & |
| 1448 0x03; |
| 1449 line4 = |
| 1450 ((line4 << 1) | |
| 1451 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & |
| 1452 0x07; |
| 1453 line5 = ((line5 << 1) | |
| 1454 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
| 1455 h - GRREFERENCEDY + 1)) & |
| 1456 0x07; |
| 1457 } |
| 1458 } |
| 1459 } |
| 1460 return GRREG; |
| 1461 } |
| 1462 CJBig2_Image* CJBig2_GRRDProc::decode_Template0_opt( |
| 1463 CJBig2_ArithDecoder* pArithDecoder, |
| 1464 JBig2ArithCtx* grContext) { |
| 1465 FX_BOOL LTP, SLTP, bVal; |
| 1466 FX_DWORD CONTEXT; |
| 1467 CJBig2_Image* GRREG; |
| 1468 FX_DWORD line1, line1_r, line2_r, line3_r; |
| 1469 uint8_t *pLine, *pLineR, cVal; |
| 1470 intptr_t nStride, nStrideR, nOffset; |
| 1471 int32_t k, nBits; |
| 1472 int32_t GRWR, GRHR; |
| 1473 int32_t GRW, GRH; |
| 1474 GRW = (int32_t)CJBig2_GRRDProc::GRW; |
| 1475 GRH = (int32_t)CJBig2_GRRDProc::GRH; |
| 1476 LTP = 0; |
| 1477 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
| 1478 if (GRREG->m_pData == NULL) { |
| 1479 delete GRREG; |
| 1480 m_pModule->JBig2_Error( |
| 1481 "Generic refinement region decoding procedure: Create Image Failed " |
| 1482 "with width = %d, height = %d\n", |
| 1483 GRW, GRH); |
| 1484 return NULL; |
| 1485 } |
| 1486 pLine = GRREG->m_pData; |
| 1487 pLineR = GRREFERENCE->m_pData; |
| 1488 nStride = GRREG->m_nStride; |
| 1489 nStrideR = GRREFERENCE->m_nStride; |
| 1490 GRWR = (int32_t)GRREFERENCE->m_nWidth; |
| 1491 GRHR = (int32_t)GRREFERENCE->m_nHeight; |
| 1492 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { |
| 1493 GRREFERENCEDY = 0; |
| 1494 } |
| 1495 nOffset = -GRREFERENCEDY * nStrideR; |
| 1496 for (int32_t h = 0; h < GRH; h++) { |
| 1497 if (TPGRON) { |
| 1498 SLTP = pArithDecoder->DECODE(&grContext[0x0010]); |
| 1499 LTP = LTP ^ SLTP; |
| 1500 } |
| 1501 line1 = (h > 0) ? pLine[-nStride] << 4 : 0; |
| 1502 int32_t reference_h = h - GRREFERENCEDY; |
| 1503 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); |
| 1504 FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR); |
| 1505 FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1); |
| 1506 line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0; |
| 1507 line2_r = line2_r_ok ? pLineR[nOffset] : 0; |
| 1508 line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0; |
| 1509 if (LTP == 0) { |
| 1510 CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) | |
| 1511 ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007); |
| 1512 for (int32_t w = 0; w < GRW; w += 8) { |
| 1513 nBits = GRW - w > 8 ? 8 : GRW - w; |
| 1514 if (h > 0) |
| 1515 line1 = (line1 << 8) | |
| 1516 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0); |
| 1517 if (h > GRHR + GRREFERENCEDY + 1) { |
| 1518 line1_r = 0; |
| 1519 line2_r = 0; |
| 1520 line3_r = 0; |
243 } else { | 1521 } else { |
244 if(h > 1) { | 1522 if (line1_r_ok) |
245 pLine1 = pLine - nStride2; | 1523 line1_r = |
246 pLine2 = pLine - nStride; | 1524 (line1_r << 8) | |
247 line1 = (*pLine1++) << 6; | 1525 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
248 line2 = *pLine2++; | 1526 if (line2_r_ok) |
249 CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); | 1527 line2_r = (line2_r << 8) | |
250 for(cc = 0; cc < nLineBytes; cc++) { | 1528 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
251 line1 = (line1 << 8) | ((*pLine1++) << 6); | 1529 if (line3_r_ok) |
252 line2 = (line2 << 8) | (*pLine2++); | 1530 line3_r = |
253 cVal = 0; | 1531 (line3_r << 8) | |
254 for(k = 7; k >= 0; k--) { | 1532 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
255 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 1533 else { |
256 cVal |= bVal << k; | 1534 line3_r = 0; |
257 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | 1535 } |
258 | ((line1 >> k) & 0x0800) | 1536 } |
259 | ((line2 >> k) & 0x0010)); | 1537 cVal = 0; |
260 } | 1538 for (k = 0; k < nBits; k++) { |
261 pLine[cc] = cVal; | 1539 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
262 } | 1540 cVal |= bVal << (7 - k); |
263 line1 <<= 8; | 1541 CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) | |
264 line2 <<= 8; | 1542 ((line1 >> (7 - k)) & 0x0400) | |
265 cVal = 0; | 1543 ((line1_r >> (7 - k)) & 0x0040) | |
266 for(k = 0; k < nBitsLeft; k++) { | 1544 ((line2_r >> (10 - k)) & 0x0008) | |
267 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 1545 ((line3_r >> (13 - k)) & 0x0001); |
268 cVal |= bVal << (7 - k); | 1546 } |
269 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | 1547 pLine[w >> 3] = cVal; |
270 | ((line1 >> (7 - k)) & 0x0800) | 1548 } |
271 | ((line2 >> (7 - k)) & 0x0010)); | 1549 } else { |
272 } | 1550 CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) | |
273 pLine[nLineBytes] = cVal; | 1551 ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007); |
274 } else { | 1552 for (int32_t w = 0; w < GRW; w += 8) { |
275 pLine2 = pLine - nStride; | 1553 nBits = GRW - w > 8 ? 8 : GRW - w; |
276 line2 = (h & 1) ? (*pLine2++) : 0; | 1554 if (h > 0) |
277 CONTEXT = (line2 & 0x07f0); | 1555 line1 = (line1 << 8) | |
278 for(cc = 0; cc < nLineBytes; cc++) { | 1556 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0); |
279 if(h & 1) { | 1557 if (line1_r_ok) |
280 line2 = (line2 << 8) | (*pLine2++); | 1558 line1_r = |
281 } | 1559 (line1_r << 8) | |
282 cVal = 0; | 1560 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
283 for(k = 7; k >= 0; k--) { | 1561 if (line2_r_ok) |
284 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 1562 line2_r = (line2_r << 8) | |
285 cVal |= bVal << k; | 1563 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
286 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | 1564 if (line3_r_ok) |
287 | ((line2 >> k) & 0x0010)); | 1565 line3_r = |
288 } | 1566 (line3_r << 8) | |
289 pLine[cc] = cVal; | 1567 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
290 } | 1568 else { |
291 line2 <<= 8; | 1569 line3_r = 0; |
292 cVal = 0; | 1570 } |
293 for(k = 0; k < nBitsLeft; k++) { | 1571 cVal = 0; |
294 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 1572 for (k = 0; k < nBits; k++) { |
295 cVal |= bVal << (7 - k); | 1573 bVal = GRREFERENCE->getPixel(w + k, h); |
296 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | 1574 if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1)) && |
297 | (((line2 >> (7 - k))) & 0x0010)); | 1575 (bVal == GRREFERENCE->getPixel(w + k, h - 1)) && |
298 } | 1576 (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) && |
299 pLine[nLineBytes] = cVal; | 1577 (bVal == GRREFERENCE->getPixel(w + k - 1, h)) && |
300 } | 1578 (bVal == GRREFERENCE->getPixel(w + k + 1, h)) && |
301 } | 1579 (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) && |
302 pLine += nStride; | 1580 (bVal == GRREFERENCE->getPixel(w + k, h + 1)) && |
303 } | 1581 (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) { |
304 return GBREG; | 1582 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
305 } | 1583 } |
306 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_ArithDecoder *
pArithDecoder, JBig2ArithCtx *gbContext) | 1584 cVal |= bVal << (7 - k); |
307 { | 1585 CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) | |
308 FX_BOOL LTP, SLTP, bVal; | 1586 ((line1 >> (7 - k)) & 0x0400) | |
309 FX_DWORD CONTEXT; | 1587 ((line1_r >> (7 - k)) & 0x0040) | |
310 CJBig2_Image *GBREG; | 1588 ((line2_r >> (10 - k)) & 0x0008) | |
311 FX_DWORD line1, line2, line3; | 1589 ((line3_r >> (13 - k)) & 0x0001); |
312 LTP = 0; | 1590 } |
313 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | 1591 pLine[w >> 3] = cVal; |
314 GBREG->fill(0); | 1592 } |
315 for(FX_DWORD h = 0; h < GBH; h++) { | 1593 } |
316 if(TPGDON) { | 1594 pLine += nStride; |
317 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); | 1595 if (h < GRHR + GRREFERENCEDY) { |
318 LTP = LTP ^ SLTP; | 1596 pLineR += nStrideR; |
319 } | 1597 } |
320 if(LTP == 1) { | 1598 } |
321 GBREG->copyLine(h, h - 1); | 1599 return GRREG; |
| 1600 } |
| 1601 CJBig2_Image* CJBig2_GRRDProc::decode_Template1_unopt( |
| 1602 CJBig2_ArithDecoder* pArithDecoder, |
| 1603 JBig2ArithCtx* grContext) { |
| 1604 FX_BOOL LTP, SLTP, bVal; |
| 1605 FX_DWORD CONTEXT; |
| 1606 CJBig2_Image* GRREG; |
| 1607 FX_DWORD line1, line2, line3, line4, line5; |
| 1608 LTP = 0; |
| 1609 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
| 1610 GRREG->fill(0); |
| 1611 for (FX_DWORD h = 0; h < GRH; h++) { |
| 1612 if (TPGRON) { |
| 1613 SLTP = pArithDecoder->DECODE(&grContext[0x0008]); |
| 1614 LTP = LTP ^ SLTP; |
| 1615 } |
| 1616 if (LTP == 0) { |
| 1617 line1 = GRREG->getPixel(1, h - 1); |
| 1618 line1 |= GRREG->getPixel(0, h - 1) << 1; |
| 1619 line1 |= GRREG->getPixel(-1, h - 1) << 2; |
| 1620 line2 = 0; |
| 1621 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1); |
| 1622 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
| 1623 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
| 1624 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) |
| 1625 << 2; |
| 1626 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
| 1627 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) |
| 1628 << 1; |
| 1629 for (FX_DWORD w = 0; w < GRW; w++) { |
| 1630 CONTEXT = line5; |
| 1631 CONTEXT |= line4 << 2; |
| 1632 CONTEXT |= line3 << 5; |
| 1633 CONTEXT |= line2 << 6; |
| 1634 CONTEXT |= line1 << 7; |
| 1635 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
| 1636 GRREG->setPixel(w, h, bVal); |
| 1637 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07; |
| 1638 line2 = ((line2 << 1) | bVal) & 0x01; |
| 1639 line3 = ((line3 << 1) | |
| 1640 GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
| 1641 h - GRREFERENCEDY - 1)) & |
| 1642 0x01; |
| 1643 line4 = |
| 1644 ((line4 << 1) | |
| 1645 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & |
| 1646 0x07; |
| 1647 line5 = ((line5 << 1) | |
| 1648 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
| 1649 h - GRREFERENCEDY + 1)) & |
| 1650 0x03; |
| 1651 } |
| 1652 } else { |
| 1653 line1 = GRREG->getPixel(1, h - 1); |
| 1654 line1 |= GRREG->getPixel(0, h - 1) << 1; |
| 1655 line1 |= GRREG->getPixel(-1, h - 1) << 2; |
| 1656 line2 = 0; |
| 1657 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1); |
| 1658 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
| 1659 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
| 1660 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) |
| 1661 << 2; |
| 1662 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
| 1663 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) |
| 1664 << 1; |
| 1665 for (FX_DWORD w = 0; w < GRW; w++) { |
| 1666 bVal = GRREFERENCE->getPixel(w, h); |
| 1667 if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) && |
| 1668 (bVal == GRREFERENCE->getPixel(w, h - 1)) && |
| 1669 (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) && |
| 1670 (bVal == GRREFERENCE->getPixel(w - 1, h)) && |
| 1671 (bVal == GRREFERENCE->getPixel(w + 1, h)) && |
| 1672 (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) && |
| 1673 (bVal == GRREFERENCE->getPixel(w, h + 1)) && |
| 1674 (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) { |
| 1675 CONTEXT = line5; |
| 1676 CONTEXT |= line4 << 2; |
| 1677 CONTEXT |= line3 << 5; |
| 1678 CONTEXT |= line2 << 6; |
| 1679 CONTEXT |= line1 << 7; |
| 1680 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
| 1681 } |
| 1682 GRREG->setPixel(w, h, bVal); |
| 1683 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07; |
| 1684 line2 = ((line2 << 1) | bVal) & 0x01; |
| 1685 line3 = ((line3 << 1) | |
| 1686 GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
| 1687 h - GRREFERENCEDY - 1)) & |
| 1688 0x01; |
| 1689 line4 = |
| 1690 ((line4 << 1) | |
| 1691 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & |
| 1692 0x07; |
| 1693 line5 = ((line5 << 1) | |
| 1694 GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
| 1695 h - GRREFERENCEDY + 1)) & |
| 1696 0x03; |
| 1697 } |
| 1698 } |
| 1699 } |
| 1700 return GRREG; |
| 1701 } |
| 1702 CJBig2_Image* CJBig2_GRRDProc::decode_Template1_opt( |
| 1703 CJBig2_ArithDecoder* pArithDecoder, |
| 1704 JBig2ArithCtx* grContext) { |
| 1705 FX_BOOL LTP, SLTP, bVal; |
| 1706 FX_DWORD CONTEXT; |
| 1707 CJBig2_Image* GRREG; |
| 1708 FX_DWORD line1, line1_r, line2_r, line3_r; |
| 1709 uint8_t *pLine, *pLineR, cVal; |
| 1710 intptr_t nStride, nStrideR, nOffset; |
| 1711 int32_t k, nBits; |
| 1712 int32_t GRWR, GRHR; |
| 1713 int32_t GRW, GRH; |
| 1714 GRW = (int32_t)CJBig2_GRRDProc::GRW; |
| 1715 GRH = (int32_t)CJBig2_GRRDProc::GRH; |
| 1716 LTP = 0; |
| 1717 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
| 1718 if (GRREG->m_pData == NULL) { |
| 1719 delete GRREG; |
| 1720 m_pModule->JBig2_Error( |
| 1721 "Generic refinement region decoding procedure: Create Image Failed " |
| 1722 "with width = %d, height = %d\n", |
| 1723 GRW, GRH); |
| 1724 return NULL; |
| 1725 } |
| 1726 pLine = GRREG->m_pData; |
| 1727 pLineR = GRREFERENCE->m_pData; |
| 1728 nStride = GRREG->m_nStride; |
| 1729 nStrideR = GRREFERENCE->m_nStride; |
| 1730 GRWR = (int32_t)GRREFERENCE->m_nWidth; |
| 1731 GRHR = (int32_t)GRREFERENCE->m_nHeight; |
| 1732 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { |
| 1733 GRREFERENCEDY = 0; |
| 1734 } |
| 1735 nOffset = -GRREFERENCEDY * nStrideR; |
| 1736 for (int32_t h = 0; h < GRH; h++) { |
| 1737 if (TPGRON) { |
| 1738 SLTP = pArithDecoder->DECODE(&grContext[0x0008]); |
| 1739 LTP = LTP ^ SLTP; |
| 1740 } |
| 1741 line1 = (h > 0) ? pLine[-nStride] << 1 : 0; |
| 1742 int32_t reference_h = h - GRREFERENCEDY; |
| 1743 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); |
| 1744 FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR); |
| 1745 FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1); |
| 1746 line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0; |
| 1747 line2_r = line2_r_ok ? pLineR[nOffset] : 0; |
| 1748 line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0; |
| 1749 if (LTP == 0) { |
| 1750 CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) | |
| 1751 ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003); |
| 1752 for (int32_t w = 0; w < GRW; w += 8) { |
| 1753 nBits = GRW - w > 8 ? 8 : GRW - w; |
| 1754 if (h > 0) |
| 1755 line1 = (line1 << 8) | |
| 1756 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0); |
| 1757 if (line1_r_ok) |
| 1758 line1_r = |
| 1759 (line1_r << 8) | |
| 1760 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
| 1761 if (line2_r_ok) |
| 1762 line2_r = (line2_r << 8) | |
| 1763 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
| 1764 if (line3_r_ok) |
| 1765 line3_r = |
| 1766 (line3_r << 8) | |
| 1767 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
| 1768 else { |
| 1769 line3_r = 0; |
| 1770 } |
| 1771 cVal = 0; |
| 1772 for (k = 0; k < nBits; k++) { |
| 1773 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
| 1774 cVal |= bVal << (7 - k); |
| 1775 CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) | |
| 1776 ((line1 >> (7 - k)) & 0x0080) | |
| 1777 ((line1_r >> (9 - k)) & 0x0020) | |
| 1778 ((line2_r >> (11 - k)) & 0x0004) | |
| 1779 ((line3_r >> (13 - k)) & 0x0001); |
| 1780 } |
| 1781 pLine[w >> 3] = cVal; |
| 1782 } |
| 1783 } else { |
| 1784 CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) | |
| 1785 ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003); |
| 1786 for (int32_t w = 0; w < GRW; w += 8) { |
| 1787 nBits = GRW - w > 8 ? 8 : GRW - w; |
| 1788 if (h > 0) |
| 1789 line1 = (line1 << 8) | |
| 1790 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0); |
| 1791 if (line1_r_ok) |
| 1792 line1_r = |
| 1793 (line1_r << 8) | |
| 1794 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
| 1795 if (line2_r_ok) |
| 1796 line2_r = (line2_r << 8) | |
| 1797 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
| 1798 if (line3_r_ok) |
| 1799 line3_r = |
| 1800 (line3_r << 8) | |
| 1801 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
| 1802 else { |
| 1803 line3_r = 0; |
| 1804 } |
| 1805 cVal = 0; |
| 1806 for (k = 0; k < nBits; k++) { |
| 1807 bVal = GRREFERENCE->getPixel(w + k, h); |
| 1808 if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1)) && |
| 1809 (bVal == GRREFERENCE->getPixel(w + k, h - 1)) && |
| 1810 (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) && |
| 1811 (bVal == GRREFERENCE->getPixel(w + k - 1, h)) && |
| 1812 (bVal == GRREFERENCE->getPixel(w + k + 1, h)) && |
| 1813 (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) && |
| 1814 (bVal == GRREFERENCE->getPixel(w + k, h + 1)) && |
| 1815 (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) { |
| 1816 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
| 1817 } |
| 1818 cVal |= bVal << (7 - k); |
| 1819 CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) | |
| 1820 ((line1 >> (7 - k)) & 0x0080) | |
| 1821 ((line1_r >> (9 - k)) & 0x0020) | |
| 1822 ((line2_r >> (11 - k)) & 0x0004) | |
| 1823 ((line3_r >> (13 - k)) & 0x0001); |
| 1824 } |
| 1825 pLine[w >> 3] = cVal; |
| 1826 } |
| 1827 } |
| 1828 pLine += nStride; |
| 1829 if (h < GRHR + GRREFERENCEDY) { |
| 1830 pLineR += nStrideR; |
| 1831 } |
| 1832 } |
| 1833 return GRREG; |
| 1834 } |
| 1835 CJBig2_Image* CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder* pArithDecoder, |
| 1836 JBig2ArithCtx* grContext) { |
| 1837 FX_BOOL LTP, SLTP, bVal; |
| 1838 FX_BOOL TPGRPIX, TPGRVAL; |
| 1839 FX_DWORD CONTEXT; |
| 1840 CJBig2_Image* GRREG; |
| 1841 LTP = 0; |
| 1842 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
| 1843 GRREG->fill(0); |
| 1844 for (FX_DWORD h = 0; h < GRH; h++) { |
| 1845 if (TPGRON) { |
| 1846 switch (GRTEMPLATE) { |
| 1847 case 0: |
| 1848 CONTEXT = 0x0010; |
| 1849 break; |
| 1850 case 1: |
| 1851 CONTEXT = 0x0008; |
| 1852 break; |
| 1853 } |
| 1854 SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]); |
| 1855 LTP = LTP ^ SLTP; |
| 1856 } |
| 1857 if (LTP == 0) { |
| 1858 for (FX_DWORD w = 0; w < GRW; w++) { |
| 1859 CONTEXT = 0; |
| 1860 switch (GRTEMPLATE) { |
| 1861 case 0: |
| 1862 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
| 1863 h - GRREFERENCEDY + 1); |
| 1864 CONTEXT |= |
| 1865 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) |
| 1866 << 1; |
| 1867 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, |
| 1868 h - GRREFERENCEDY + 1) |
| 1869 << 2; |
| 1870 CONTEXT |= |
| 1871 GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) |
| 1872 << 3; |
| 1873 CONTEXT |= |
| 1874 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) |
| 1875 << 4; |
| 1876 CONTEXT |= |
| 1877 GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) |
| 1878 << 5; |
| 1879 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
| 1880 h - GRREFERENCEDY - 1) |
| 1881 << 6; |
| 1882 CONTEXT |= |
| 1883 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) |
| 1884 << 7; |
| 1885 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], |
| 1886 h - GRREFERENCEDY + GRAT[3]) |
| 1887 << 8; |
| 1888 CONTEXT |= GRREG->getPixel(w - 1, h) << 9; |
| 1889 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10; |
| 1890 CONTEXT |= GRREG->getPixel(w, h - 1) << 11; |
| 1891 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
| 1892 break; |
| 1893 case 1: |
| 1894 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
| 1895 h - GRREFERENCEDY + 1); |
| 1896 CONTEXT |= |
| 1897 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) |
| 1898 << 1; |
| 1899 CONTEXT |= |
| 1900 GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) |
| 1901 << 2; |
| 1902 CONTEXT |= |
| 1903 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) |
| 1904 << 3; |
| 1905 CONTEXT |= |
| 1906 GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) |
| 1907 << 4; |
| 1908 CONTEXT |= |
| 1909 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) |
| 1910 << 5; |
| 1911 CONTEXT |= GRREG->getPixel(w - 1, h) << 6; |
| 1912 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7; |
| 1913 CONTEXT |= GRREG->getPixel(w, h - 1) << 8; |
| 1914 CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9; |
| 1915 break; |
| 1916 } |
| 1917 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
| 1918 GRREG->setPixel(w, h, bVal); |
| 1919 } |
| 1920 } else { |
| 1921 for (FX_DWORD w = 0; w < GRW; w++) { |
| 1922 bVal = GRREFERENCE->getPixel(w, h); |
| 1923 if (TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) && |
| 1924 (bVal == GRREFERENCE->getPixel(w, h - 1)) && |
| 1925 (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) && |
| 1926 (bVal == GRREFERENCE->getPixel(w - 1, h)) && |
| 1927 (bVal == GRREFERENCE->getPixel(w + 1, h)) && |
| 1928 (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) && |
| 1929 (bVal == GRREFERENCE->getPixel(w, h + 1)) && |
| 1930 (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) { |
| 1931 TPGRPIX = 1; |
| 1932 TPGRVAL = bVal; |
322 } else { | 1933 } else { |
323 line1 = GBREG->getPixel(1, h - 2); | 1934 TPGRPIX = 0; |
324 line1 |= GBREG->getPixel(0, h - 2) << 1; | 1935 } |
325 line2 = GBREG->getPixel(2, h - 1); | 1936 if (TPGRPIX) { |
326 line2 |= GBREG->getPixel(1, h - 1) << 1; | 1937 GRREG->setPixel(w, h, TPGRVAL); |
327 line2 |= GBREG->getPixel(0, h - 1) << 2; | |
328 line3 = 0; | |
329 for(FX_DWORD w = 0; w < GBW; w++) { | |
330 if(USESKIP && SKIP->getPixel(w, h)) { | |
331 bVal = 0; | |
332 } else { | |
333 CONTEXT = line3; | |
334 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; | |
335 CONTEXT |= line2 << 5; | |
336 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; | |
337 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; | |
338 CONTEXT |= line1 << 12; | |
339 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; | |
340 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
341 } | |
342 if(bVal) { | |
343 GBREG->setPixel(w, h, bVal); | |
344 } | |
345 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; | |
346 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; | |
347 line3 = ((line3 << 1) | bVal) & 0x0f; | |
348 } | |
349 } | |
350 } | |
351 return GBREG; | |
352 } | |
353 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt(CJBig2_ArithDecoder *pA
rithDecoder, JBig2ArithCtx *gbContext) | |
354 { | |
355 FX_BOOL LTP, SLTP, bVal; | |
356 FX_DWORD CONTEXT; | |
357 CJBig2_Image *GBREG; | |
358 FX_DWORD line1, line2, line3; | |
359 LTP = 0; | |
360 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
361 GBREG->fill(0); | |
362 for(FX_DWORD h = 0; h < GBH; h++) { | |
363 if(TPGDON) { | |
364 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); | |
365 LTP = LTP ^ SLTP; | |
366 } | |
367 if(LTP == 1) { | |
368 GBREG->copyLine(h, h - 1); | |
369 } else { | 1938 } else { |
370 line1 = GBREG->getPixel(2, h - 2); | 1939 CONTEXT = 0; |
371 line1 |= GBREG->getPixel(1, h - 2) << 1; | 1940 switch (GRTEMPLATE) { |
372 line1 |= GBREG->getPixel(0, h - 2) << 2; | 1941 case 0: |
373 line2 = GBREG->getPixel(3, h - 1); | 1942 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
374 line2 |= GBREG->getPixel(2, h - 1) << 1; | 1943 h - GRREFERENCEDY + 1); |
375 line2 |= GBREG->getPixel(1, h - 1) << 2; | 1944 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, |
376 line2 |= GBREG->getPixel(0, h - 1) << 3; | 1945 h - GRREFERENCEDY + 1) |
377 line3 = 0; | 1946 << 1; |
378 for(FX_DWORD w = 0; w < GBW; w++) { | 1947 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, |
379 if(USESKIP && SKIP->getPixel(w, h)) { | 1948 h - GRREFERENCEDY + 1) |
380 bVal = 0; | 1949 << 2; |
381 } else { | 1950 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
382 CONTEXT = line3; | 1951 h - GRREFERENCEDY) |
383 CONTEXT |= line2 << 3; | 1952 << 3; |
384 CONTEXT |= line1 << 9; | 1953 CONTEXT |= |
385 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 1954 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) |
386 } | 1955 << 4; |
387 if(bVal) { | 1956 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, |
388 GBREG->setPixel(w, h, bVal); | 1957 h - GRREFERENCEDY) |
389 } | 1958 << 5; |
390 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; | 1959 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
391 line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f; | 1960 h - GRREFERENCEDY - 1) |
392 line3 = ((line3 << 1) | bVal) & 0x07; | 1961 << 6; |
393 } | 1962 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, |
394 } | 1963 h - GRREFERENCEDY - 1) |
395 } | 1964 << 7; |
396 return GBREG; | 1965 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], |
397 } | 1966 h - GRREFERENCEDY + GRAT[3]) |
398 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt2(CJBig2_ArithDecoder *p
ArithDecoder, JBig2ArithCtx *gbContext) | 1967 << 8; |
399 { | 1968 CONTEXT |= GRREG->getPixel(w - 1, h) << 9; |
400 FX_BOOL LTP, SLTP, bVal; | 1969 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10; |
401 FX_DWORD CONTEXT; | 1970 CONTEXT |= GRREG->getPixel(w, h - 1) << 11; |
402 CJBig2_Image *GBREG; | 1971 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
403 FX_DWORD line1, line2; | 1972 break; |
404 uint8_t *pLine, cVal; | 1973 case 1: |
405 intptr_t nStride, nStride2; | 1974 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
406 int32_t nBits, k; | 1975 h - GRREFERENCEDY + 1); |
407 LTP = 0; | 1976 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, |
408 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | 1977 h - GRREFERENCEDY + 1) |
409 if (GBREG->m_pData == NULL) { | 1978 << 1; |
410 delete GBREG; | 1979 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
411 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | 1980 h - GRREFERENCEDY) |
412 return NULL; | 1981 << 2; |
413 } | 1982 CONTEXT |= |
414 pLine = GBREG->m_pData; | 1983 GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) |
415 nStride = GBREG->m_nStride; | 1984 << 3; |
416 nStride2 = nStride << 1; | 1985 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, |
417 for(FX_DWORD h = 0; h < GBH; h++) { | 1986 h - GRREFERENCEDY) |
418 if(TPGDON) { | 1987 << 4; |
419 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); | 1988 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, |
420 LTP = LTP ^ SLTP; | 1989 h - GRREFERENCEDY - 1) |
421 } | 1990 << 5; |
422 if(LTP == 1) { | 1991 CONTEXT |= GRREG->getPixel(w - 1, h) << 6; |
423 GBREG->copyLine(h, h - 1); | 1992 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7; |
| 1993 CONTEXT |= GRREG->getPixel(w, h - 1) << 8; |
| 1994 CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9; |
| 1995 break; |
| 1996 } |
| 1997 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
| 1998 GRREG->setPixel(w, h, bVal); |
| 1999 } |
| 2000 } |
| 2001 } |
| 2002 } |
| 2003 return GRREG; |
| 2004 } |
| 2005 CJBig2_Image* CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream* pStream, |
| 2006 JBig2ArithCtx* grContext) { |
| 2007 int32_t STRIPT, FIRSTS; |
| 2008 FX_DWORD NINSTANCES; |
| 2009 int32_t DT, DFS, CURS; |
| 2010 uint8_t CURT; |
| 2011 int32_t SI, TI; |
| 2012 FX_DWORD IDI; |
| 2013 CJBig2_Image* IBI; |
| 2014 FX_DWORD WI, HI; |
| 2015 int32_t IDS; |
| 2016 FX_BOOL RI; |
| 2017 int32_t RDWI, RDHI, RDXI, RDYI; |
| 2018 CJBig2_Image* IBOI; |
| 2019 FX_DWORD WOI, HOI; |
| 2020 CJBig2_Image* SBREG; |
| 2021 FX_BOOL bFirst; |
| 2022 FX_DWORD nTmp; |
| 2023 int32_t nVal, nBits; |
| 2024 CJBig2_HuffmanDecoder* pHuffmanDecoder; |
| 2025 CJBig2_GRRDProc* pGRRD; |
| 2026 CJBig2_ArithDecoder* pArithDecoder; |
| 2027 JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream)); |
| 2028 JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH)); |
| 2029 SBREG->fill(SBDEFPIXEL); |
| 2030 if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) { |
| 2031 m_pModule->JBig2_Error( |
| 2032 "text region decoding procedure (huffman): too short."); |
| 2033 goto failed; |
| 2034 } |
| 2035 STRIPT *= SBSTRIPS; |
| 2036 STRIPT = -STRIPT; |
| 2037 FIRSTS = 0; |
| 2038 NINSTANCES = 0; |
| 2039 while (NINSTANCES < SBNUMINSTANCES) { |
| 2040 if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) { |
| 2041 m_pModule->JBig2_Error( |
| 2042 "text region decoding procedure (huffman): too short."); |
| 2043 goto failed; |
| 2044 } |
| 2045 DT *= SBSTRIPS; |
| 2046 STRIPT = STRIPT + DT; |
| 2047 bFirst = TRUE; |
| 2048 for (;;) { |
| 2049 if (bFirst) { |
| 2050 if (pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) { |
| 2051 m_pModule->JBig2_Error( |
| 2052 "text region decoding procedure (huffman): too short."); |
| 2053 goto failed; |
| 2054 } |
| 2055 FIRSTS = FIRSTS + DFS; |
| 2056 CURS = FIRSTS; |
| 2057 bFirst = FALSE; |
| 2058 } else { |
| 2059 nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS); |
| 2060 if (nVal == JBIG2_OOB) { |
| 2061 break; |
| 2062 } else if (nVal != 0) { |
| 2063 m_pModule->JBig2_Error( |
| 2064 "text region decoding procedure (huffman): too short."); |
| 2065 goto failed; |
424 } else { | 2066 } else { |
425 line1 = (h > 1) ? pLine[-nStride2] << 4 : 0; | 2067 CURS = CURS + IDS + SBDSOFFSET; |
426 line2 = (h > 0) ? pLine[-nStride] : 0; | 2068 } |
427 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); | 2069 } |
428 for(FX_DWORD w = 0; w < GBW; w += 8) { | 2070 if (SBSTRIPS == 1) { |
429 if(w + 8 < GBW) { | 2071 CURT = 0; |
430 nBits = 8; | 2072 } else { |
431 if(h > 1) { | 2073 nTmp = 1; |
432 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1]
<< 4); | 2074 while ((FX_DWORD)(1 << nTmp) < SBSTRIPS) { |
433 } | 2075 nTmp++; |
434 if(h > 0) { | 2076 } |
435 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); | 2077 if (pStream->readNBits(nTmp, &nVal) != 0) { |
436 } | 2078 m_pModule->JBig2_Error( |
437 } else { | 2079 "text region decoding procedure (huffman): too short."); |
438 nBits = GBW - w; | 2080 goto failed; |
439 if(h > 1) { | 2081 } |
440 line1 <<= 8; | 2082 CURT = nVal; |
441 } | 2083 } |
442 if(h > 0) { | 2084 TI = STRIPT + CURT; |
443 line2 <<= 8; | 2085 nVal = 0; |
444 } | 2086 nBits = 0; |
445 } | 2087 for (;;) { |
446 cVal = 0; | 2088 if (pStream->read1Bit(&nTmp) != 0) { |
447 for(k = 0; k < nBits; k++) { | 2089 m_pModule->JBig2_Error( |
448 if(USESKIP && SKIP->getPixel(w, h)) { | 2090 "text region decoding procedure (huffman): too short."); |
449 bVal = 0; | 2091 goto failed; |
450 } else { | 2092 } |
451 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 2093 nVal = (nVal << 1) | nTmp; |
452 } | 2094 nBits++; |
453 cVal |= bVal << (7 - k); | 2095 for (IDI = 0; IDI < SBNUMSYMS; IDI++) { |
454 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | 2096 if ((nBits == SBSYMCODES[IDI].codelen) && |
455 | ((line1 >> (7 - k)) & 0x0200) | 2097 (nVal == SBSYMCODES[IDI].code)) { |
456 | ((line2 >> (8 - k)) & 0x0008); | 2098 break; |
457 } | 2099 } |
458 pLine[w >> 3] = cVal; | 2100 } |
459 } | 2101 if (IDI < SBNUMSYMS) { |
460 } | 2102 break; |
461 pLine += nStride; | 2103 } |
462 } | 2104 } |
463 return GBREG; | 2105 if (SBREFINE == 0) { |
464 } | 2106 RI = 0; |
465 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_ArithDecoder *p
ArithDecoder, JBig2ArithCtx *gbContext) | 2107 } else { |
466 { | 2108 if (pStream->read1Bit(&RI) != 0) { |
467 FX_BOOL LTP, SLTP, bVal; | 2109 m_pModule->JBig2_Error( |
468 FX_DWORD CONTEXT; | 2110 "text region decoding procedure (huffman): too short."); |
469 CJBig2_Image *GBREG; | 2111 goto failed; |
470 FX_DWORD line1, line2; | 2112 } |
471 uint8_t *pLine, *pLine1, *pLine2, cVal; | 2113 } |
472 int32_t nStride, nStride2, k; | 2114 if (RI == 0) { |
473 int32_t nLineBytes, nBitsLeft, cc; | 2115 IBI = SBSYMS[IDI]; |
474 LTP = 0; | 2116 } else { |
475 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | 2117 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0) || |
476 if (GBREG->m_pData == NULL) { | 2118 (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0) || |
477 delete GBREG; | 2119 (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) || |
478 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | 2120 (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0) || |
479 return NULL; | 2121 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) { |
480 } | 2122 m_pModule->JBig2_Error( |
481 pLine = GBREG->m_pData; | 2123 "text region decoding procedure (huffman): too short."); |
482 nStride = GBREG->m_nStride; | 2124 goto failed; |
483 nStride2 = nStride << 1; | 2125 } |
484 nLineBytes = ((GBW + 7) >> 3) - 1; | 2126 pStream->alignByte(); |
485 nBitsLeft = GBW - (nLineBytes << 3); | 2127 nTmp = pStream->getOffset(); |
486 for(FX_DWORD h = 0; h < GBH; h++) { | 2128 IBOI = SBSYMS[IDI]; |
487 if(TPGDON) { | 2129 if (!IBOI) { |
488 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); | 2130 goto failed; |
489 LTP = LTP ^ SLTP; | 2131 } |
490 } | 2132 WOI = IBOI->m_nWidth; |
491 if(LTP == 1) { | 2133 HOI = IBOI->m_nHeight; |
492 GBREG->copyLine(h, h - 1); | 2134 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { |
493 } else { | 2135 m_pModule->JBig2_Error( |
494 if(h > 1) { | 2136 "text region decoding procedure (huffman): Invalid RDWI or RDHI " |
495 pLine1 = pLine - nStride2; | 2137 "value."); |
496 pLine2 = pLine - nStride; | 2138 goto failed; |
497 line1 = (*pLine1++) << 4; | 2139 } |
498 line2 = *pLine2++; | 2140 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
499 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); | 2141 pGRRD->GRW = WOI + RDWI; |
500 for(cc = 0; cc < nLineBytes; cc++) { | 2142 pGRRD->GRH = HOI + RDHI; |
501 line1 = (line1 << 8) | ((*pLine1++) << 4); | 2143 pGRRD->GRTEMPLATE = SBRTEMPLATE; |
502 line2 = (line2 << 8) | (*pLine2++); | 2144 pGRRD->GRREFERENCE = IBOI; |
503 cVal = 0; | 2145 pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI; |
504 for(k = 7; k >= 0; k--) { | 2146 pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI; |
505 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 2147 pGRRD->TPGRON = 0; |
506 cVal |= bVal << k; | 2148 pGRRD->GRAT[0] = SBRAT[0]; |
507 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | 2149 pGRRD->GRAT[1] = SBRAT[1]; |
508 | ((line1 >> k) & 0x0200) | 2150 pGRRD->GRAT[2] = SBRAT[2]; |
509 | ((line2 >> (k + 1)) & 0x0008); | 2151 pGRRD->GRAT[3] = SBRAT[3]; |
510 } | 2152 JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream)); |
511 pLine[cc] = cVal; | 2153 IBI = pGRRD->decode(pArithDecoder, grContext); |
512 } | 2154 if (IBI == NULL) { |
513 line1 <<= 8; | 2155 delete pGRRD; |
514 line2 <<= 8; | 2156 delete pArithDecoder; |
515 cVal = 0; | 2157 goto failed; |
516 for(k = 0; k < nBitsLeft; k++) { | 2158 } |
517 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 2159 delete pArithDecoder; |
518 cVal |= bVal << (7 - k); | 2160 pStream->alignByte(); |
519 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | 2161 pStream->offset(2); |
520 | ((line1 >> (7 - k)) & 0x0200) | 2162 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { |
521 | ((line2 >> (8 - k)) & 0x0008); | 2163 delete IBI; |
522 } | 2164 delete pGRRD; |
523 pLine[nLineBytes] = cVal; | 2165 m_pModule->JBig2_Error( |
524 } else { | 2166 "text region decoding procedure (huffman):" |
525 pLine2 = pLine - nStride; | 2167 "bytes processed by generic refinement region decoding procedure " |
526 line2 = (h & 1) ? (*pLine2++) : 0; | 2168 "doesn't equal SBHUFFRSIZE."); |
527 CONTEXT = (line2 >> 1) & 0x01f8; | 2169 goto failed; |
528 for(cc = 0; cc < nLineBytes; cc++) { | 2170 } |
529 if(h & 1) { | 2171 delete pGRRD; |
530 line2 = (line2 << 8) | (*pLine2++); | 2172 } |
531 } | 2173 if (!IBI) { |
532 cVal = 0; | 2174 continue; |
533 for(k = 7; k >= 0; k--) { | 2175 } |
534 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 2176 WI = IBI->m_nWidth; |
535 cVal |= bVal << k; | 2177 HI = IBI->m_nHeight; |
536 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | 2178 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) || |
537 | ((line2 >> (k + 1)) & 0x0008); | 2179 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
538 } | 2180 CURS = CURS + WI - 1; |
539 pLine[cc] = cVal; | 2181 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) || |
540 } | 2182 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
541 line2 <<= 8; | 2183 CURS = CURS + HI - 1; |
542 cVal = 0; | 2184 } |
543 for(k = 0; k < nBitsLeft; k++) { | 2185 SI = CURS; |
544 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 2186 if (TRANSPOSED == 0) { |
545 cVal |= bVal << (7 - k); | 2187 switch (REFCORNER) { |
546 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | 2188 case JBIG2_CORNER_TOPLEFT: |
547 | ((line2 >> (8 - k)) & 0x0008); | 2189 SBREG->composeFrom(SI, TI, IBI, SBCOMBOP); |
548 } | 2190 break; |
549 pLine[nLineBytes] = cVal; | 2191 case JBIG2_CORNER_TOPRIGHT: |
550 } | 2192 SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP); |
551 } | 2193 break; |
552 pLine += nStride; | 2194 case JBIG2_CORNER_BOTTOMLEFT: |
553 } | 2195 SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP); |
554 return GBREG; | 2196 break; |
555 } | 2197 case JBIG2_CORNER_BOTTOMRIGHT: |
556 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_ArithDecoder *
pArithDecoder, JBig2ArithCtx *gbContext) | 2198 SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP); |
557 { | 2199 break; |
558 FX_BOOL LTP, SLTP, bVal; | 2200 } |
559 FX_DWORD CONTEXT; | 2201 } else { |
560 CJBig2_Image *GBREG; | 2202 switch (REFCORNER) { |
561 FX_DWORD line1, line2, line3; | 2203 case JBIG2_CORNER_TOPLEFT: |
562 LTP = 0; | 2204 SBREG->composeFrom(TI, SI, IBI, SBCOMBOP); |
563 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | 2205 break; |
564 GBREG->fill(0); | 2206 case JBIG2_CORNER_TOPRIGHT: |
565 for(FX_DWORD h = 0; h < GBH; h++) { | 2207 SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP); |
566 if(TPGDON) { | 2208 break; |
567 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); | 2209 case JBIG2_CORNER_BOTTOMLEFT: |
568 LTP = LTP ^ SLTP; | 2210 SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP); |
569 } | 2211 break; |
570 if(LTP == 1) { | 2212 case JBIG2_CORNER_BOTTOMRIGHT: |
571 GBREG->copyLine(h, h - 1); | 2213 SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP); |
572 } else { | 2214 break; |
573 line1 = GBREG->getPixel(2, h - 2); | 2215 } |
574 line1 |= GBREG->getPixel(1, h - 2) << 1; | 2216 } |
575 line1 |= GBREG->getPixel(0, h - 2) << 2; | 2217 if (RI != 0) { |
576 line2 = GBREG->getPixel(2, h - 1); | 2218 delete IBI; |
577 line2 |= GBREG->getPixel(1, h - 1) << 1; | 2219 } |
578 line2 |= GBREG->getPixel(0, h - 1) << 2; | 2220 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || |
579 line3 = 0; | 2221 (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { |
580 for(FX_DWORD w = 0; w < GBW; w++) { | 2222 CURS = CURS + WI - 1; |
581 if(USESKIP && SKIP->getPixel(w, h)) { | 2223 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || |
582 bVal = 0; | 2224 (REFCORNER == JBIG2_CORNER_TOPRIGHT))) { |
583 } else { | 2225 CURS = CURS + HI - 1; |
584 CONTEXT = line3; | 2226 } |
585 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; | 2227 NINSTANCES = NINSTANCES + 1; |
586 CONTEXT |= line2 << 4; | 2228 } |
587 CONTEXT |= line1 << 9; | 2229 } |
588 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 2230 delete pHuffmanDecoder; |
589 } | 2231 return SBREG; |
590 if(bVal) { | |
591 GBREG->setPixel(w, h, bVal); | |
592 } | |
593 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; | |
594 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; | |
595 line3 = ((line3 << 1) | bVal) & 0x07; | |
596 } | |
597 } | |
598 } | |
599 return GBREG; | |
600 } | |
601 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt(CJBig2_ArithDecoder *pA
rithDecoder, JBig2ArithCtx *gbContext) | |
602 { | |
603 FX_BOOL LTP, SLTP, bVal; | |
604 FX_DWORD CONTEXT; | |
605 CJBig2_Image *GBREG; | |
606 FX_DWORD line1, line2, line3; | |
607 LTP = 0; | |
608 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
609 GBREG->fill(0); | |
610 for(FX_DWORD h = 0; h < GBH; h++) { | |
611 if(TPGDON) { | |
612 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); | |
613 LTP = LTP ^ SLTP; | |
614 } | |
615 if(LTP == 1) { | |
616 GBREG->copyLine(h, h - 1); | |
617 } else { | |
618 line1 = GBREG->getPixel(1, h - 2); | |
619 line1 |= GBREG->getPixel(0, h - 2) << 1; | |
620 line2 = GBREG->getPixel(2, h - 1); | |
621 line2 |= GBREG->getPixel(1, h - 1) << 1; | |
622 line2 |= GBREG->getPixel(0, h - 1) << 2; | |
623 line3 = 0; | |
624 for(FX_DWORD w = 0; w < GBW; w++) { | |
625 if(USESKIP && SKIP->getPixel(w, h)) { | |
626 bVal = 0; | |
627 } else { | |
628 CONTEXT = line3; | |
629 CONTEXT |= line2 << 2; | |
630 CONTEXT |= line1 << 7; | |
631 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
632 } | |
633 if(bVal) { | |
634 GBREG->setPixel(w, h, bVal); | |
635 } | |
636 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; | |
637 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; | |
638 line3 = ((line3 << 1) | bVal) & 0x03; | |
639 } | |
640 } | |
641 } | |
642 return GBREG; | |
643 } | |
644 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt2(CJBig2_ArithDecoder *p
ArithDecoder, JBig2ArithCtx *gbContext) | |
645 { | |
646 FX_BOOL LTP, SLTP, bVal; | |
647 FX_DWORD CONTEXT; | |
648 CJBig2_Image *GBREG; | |
649 FX_DWORD line1, line2; | |
650 uint8_t *pLine, cVal; | |
651 intptr_t nStride, nStride2; | |
652 int32_t nBits, k; | |
653 LTP = 0; | |
654 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
655 if (GBREG->m_pData == NULL) { | |
656 delete GBREG; | |
657 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | |
658 return NULL; | |
659 } | |
660 pLine = GBREG->m_pData; | |
661 nStride = GBREG->m_nStride; | |
662 nStride2 = nStride << 1; | |
663 for(FX_DWORD h = 0; h < GBH; h++) { | |
664 if(TPGDON) { | |
665 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); | |
666 LTP = LTP ^ SLTP; | |
667 } | |
668 if(LTP == 1) { | |
669 GBREG->copyLine(h, h - 1); | |
670 } else { | |
671 line1 = (h > 1) ? pLine[-nStride2] << 1 : 0; | |
672 line2 = (h > 0) ? pLine[-nStride] : 0; | |
673 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); | |
674 for(FX_DWORD w = 0; w < GBW; w += 8) { | |
675 if(w + 8 < GBW) { | |
676 nBits = 8; | |
677 if(h > 1) { | |
678 line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1]
<< 1); | |
679 } | |
680 if(h > 0) { | |
681 line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); | |
682 } | |
683 } else { | |
684 nBits = GBW - w; | |
685 if(h > 1) { | |
686 line1 <<= 8; | |
687 } | |
688 if(h > 0) { | |
689 line2 <<= 8; | |
690 } | |
691 } | |
692 cVal = 0; | |
693 for(k = 0; k < nBits; k++) { | |
694 if(USESKIP && SKIP->getPixel(w, h)) { | |
695 bVal = 0; | |
696 } else { | |
697 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
698 } | |
699 cVal |= bVal << (7 - k); | |
700 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
701 | ((line1 >> (7 - k)) & 0x0080) | |
702 | ((line2 >> (10 - k)) & 0x0004); | |
703 } | |
704 pLine[w >> 3] = cVal; | |
705 } | |
706 } | |
707 pLine += nStride; | |
708 } | |
709 return GBREG; | |
710 } | |
711 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_ArithDecoder *p
ArithDecoder, JBig2ArithCtx *gbContext) | |
712 { | |
713 FX_BOOL LTP, SLTP, bVal; | |
714 FX_DWORD CONTEXT; | |
715 CJBig2_Image *GBREG; | |
716 FX_DWORD line1, line2; | |
717 uint8_t *pLine, *pLine1, *pLine2, cVal; | |
718 int32_t nStride, nStride2, k; | |
719 int32_t nLineBytes, nBitsLeft, cc; | |
720 LTP = 0; | |
721 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
722 if (GBREG->m_pData == NULL) { | |
723 delete GBREG; | |
724 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | |
725 return NULL; | |
726 } | |
727 pLine = GBREG->m_pData; | |
728 nStride = GBREG->m_nStride; | |
729 nStride2 = nStride << 1; | |
730 nLineBytes = ((GBW + 7) >> 3) - 1; | |
731 nBitsLeft = GBW - (nLineBytes << 3); | |
732 for(FX_DWORD h = 0; h < GBH; h++) { | |
733 if(TPGDON) { | |
734 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); | |
735 LTP = LTP ^ SLTP; | |
736 } | |
737 if(LTP == 1) { | |
738 GBREG->copyLine(h, h - 1); | |
739 } else { | |
740 if(h > 1) { | |
741 pLine1 = pLine - nStride2; | |
742 pLine2 = pLine - nStride; | |
743 line1 = (*pLine1++) << 1; | |
744 line2 = *pLine2++; | |
745 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); | |
746 for(cc = 0; cc < nLineBytes; cc++) { | |
747 line1 = (line1 << 8) | ((*pLine1++) << 1); | |
748 line2 = (line2 << 8) | (*pLine2++); | |
749 cVal = 0; | |
750 for(k = 7; k >= 0; k--) { | |
751 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
752 cVal |= bVal << k; | |
753 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
754 | ((line1 >> k) & 0x0080) | |
755 | ((line2 >> (k + 3)) & 0x0004); | |
756 } | |
757 pLine[cc] = cVal; | |
758 } | |
759 line1 <<= 8; | |
760 line2 <<= 8; | |
761 cVal = 0; | |
762 for(k = 0; k < nBitsLeft; k++) { | |
763 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
764 cVal |= bVal << (7 - k); | |
765 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
766 | ((line1 >> (7 - k)) & 0x0080) | |
767 | ((line2 >> (10 - k)) & 0x0004); | |
768 } | |
769 pLine[nLineBytes] = cVal; | |
770 } else { | |
771 pLine2 = pLine - nStride; | |
772 line2 = (h & 1) ? (*pLine2++) : 0; | |
773 CONTEXT = (line2 >> 3) & 0x007c; | |
774 for(cc = 0; cc < nLineBytes; cc++) { | |
775 if(h & 1) { | |
776 line2 = (line2 << 8) | (*pLine2++); | |
777 } | |
778 cVal = 0; | |
779 for(k = 7; k >= 0; k--) { | |
780 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
781 cVal |= bVal << k; | |
782 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
783 | ((line2 >> (k + 3)) & 0x0004); | |
784 } | |
785 pLine[cc] = cVal; | |
786 } | |
787 line2 <<= 8; | |
788 cVal = 0; | |
789 for(k = 0; k < nBitsLeft; k++) { | |
790 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
791 cVal |= bVal << (7 - k); | |
792 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
793 | (((line2 >> (10 - k))) & 0x0004); | |
794 } | |
795 pLine[nLineBytes] = cVal; | |
796 } | |
797 } | |
798 pLine += nStride; | |
799 } | |
800 return GBREG; | |
801 } | |
802 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_ArithDecoder *
pArithDecoder, JBig2ArithCtx *gbContext) | |
803 { | |
804 FX_BOOL LTP, SLTP, bVal; | |
805 FX_DWORD CONTEXT; | |
806 CJBig2_Image *GBREG; | |
807 FX_DWORD line1, line2, line3; | |
808 LTP = 0; | |
809 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
810 GBREG->fill(0); | |
811 for(FX_DWORD h = 0; h < GBH; h++) { | |
812 if(TPGDON) { | |
813 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); | |
814 LTP = LTP ^ SLTP; | |
815 } | |
816 if(LTP == 1) { | |
817 GBREG->copyLine(h, h - 1); | |
818 } else { | |
819 line1 = GBREG->getPixel(1, h - 2); | |
820 line1 |= GBREG->getPixel(0, h - 2) << 1; | |
821 line2 = GBREG->getPixel(1, h - 1); | |
822 line2 |= GBREG->getPixel(0, h - 1) << 1; | |
823 line3 = 0; | |
824 for(FX_DWORD w = 0; w < GBW; w++) { | |
825 if(USESKIP && SKIP->getPixel(w, h)) { | |
826 bVal = 0; | |
827 } else { | |
828 CONTEXT = line3; | |
829 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; | |
830 CONTEXT |= line2 << 3; | |
831 CONTEXT |= line1 << 7; | |
832 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
833 } | |
834 if(bVal) { | |
835 GBREG->setPixel(w, h, bVal); | |
836 } | |
837 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; | |
838 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f; | |
839 line3 = ((line3 << 1) | bVal) & 0x03; | |
840 } | |
841 } | |
842 } | |
843 return GBREG; | |
844 } | |
845 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt(CJBig2_ArithDecoder *pA
rithDecoder, JBig2ArithCtx *gbContext) | |
846 { | |
847 FX_BOOL LTP, SLTP, bVal; | |
848 FX_DWORD CONTEXT; | |
849 CJBig2_Image *GBREG; | |
850 FX_DWORD line1, line2; | |
851 LTP = 0; | |
852 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
853 GBREG->fill(0); | |
854 for(FX_DWORD h = 0; h < GBH; h++) { | |
855 if(TPGDON) { | |
856 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); | |
857 LTP = LTP ^ SLTP; | |
858 } | |
859 if(LTP == 1) { | |
860 GBREG->copyLine(h, h - 1); | |
861 } else { | |
862 line1 = GBREG->getPixel(2, h - 1); | |
863 line1 |= GBREG->getPixel(1, h - 1) << 1; | |
864 line1 |= GBREG->getPixel(0, h - 1) << 2; | |
865 line2 = 0; | |
866 for(FX_DWORD w = 0; w < GBW; w++) { | |
867 if(USESKIP && SKIP->getPixel(w, h)) { | |
868 bVal = 0; | |
869 } else { | |
870 CONTEXT = line2; | |
871 CONTEXT |= line1 << 4; | |
872 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
873 } | |
874 if(bVal) { | |
875 GBREG->setPixel(w, h, bVal); | |
876 } | |
877 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f; | |
878 line2 = ((line2 << 1) | bVal) & 0x0f; | |
879 } | |
880 } | |
881 } | |
882 return GBREG; | |
883 } | |
884 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt2(CJBig2_ArithDecoder *p
ArithDecoder, JBig2ArithCtx *gbContext) | |
885 { | |
886 FX_BOOL LTP, SLTP, bVal; | |
887 FX_DWORD CONTEXT; | |
888 CJBig2_Image *GBREG; | |
889 FX_DWORD line1; | |
890 uint8_t *pLine, cVal; | |
891 intptr_t nStride; | |
892 int32_t nBits, k; | |
893 LTP = 0; | |
894 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
895 if (GBREG->m_pData == NULL) { | |
896 delete GBREG; | |
897 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | |
898 return NULL; | |
899 } | |
900 pLine = GBREG->m_pData; | |
901 nStride = GBREG->m_nStride; | |
902 for(FX_DWORD h = 0; h < GBH; h++) { | |
903 if(TPGDON) { | |
904 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); | |
905 LTP = LTP ^ SLTP; | |
906 } | |
907 if(LTP == 1) { | |
908 GBREG->copyLine(h, h - 1); | |
909 } else { | |
910 line1 = (h > 0) ? pLine[-nStride] : 0; | |
911 CONTEXT = (line1 >> 1) & 0x03f0; | |
912 for(FX_DWORD w = 0; w < GBW; w += 8) { | |
913 if(w + 8 < GBW) { | |
914 nBits = 8; | |
915 if(h > 0) { | |
916 line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]); | |
917 } | |
918 } else { | |
919 nBits = GBW - w; | |
920 if(h > 0) { | |
921 line1 <<= 8; | |
922 } | |
923 } | |
924 cVal = 0; | |
925 for(k = 0; k < nBits; k++) { | |
926 if(USESKIP && SKIP->getPixel(w, h)) { | |
927 bVal = 0; | |
928 } else { | |
929 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
930 } | |
931 cVal |= bVal << (7 - k); | |
932 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | |
933 | ((line1 >> (8 - k)) & 0x0010); | |
934 } | |
935 pLine[w >> 3] = cVal; | |
936 } | |
937 } | |
938 pLine += nStride; | |
939 } | |
940 return GBREG; | |
941 } | |
942 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_ArithDecoder *p
ArithDecoder, JBig2ArithCtx *gbContext) | |
943 { | |
944 FX_BOOL LTP, SLTP, bVal; | |
945 FX_DWORD CONTEXT; | |
946 CJBig2_Image *GBREG; | |
947 FX_DWORD line1; | |
948 uint8_t *pLine, *pLine1, cVal; | |
949 int32_t nStride, k; | |
950 int32_t nLineBytes, nBitsLeft, cc; | |
951 LTP = 0; | |
952 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
953 if (GBREG->m_pData == NULL) { | |
954 delete GBREG; | |
955 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | |
956 return NULL; | |
957 } | |
958 pLine = GBREG->m_pData; | |
959 nStride = GBREG->m_nStride; | |
960 nLineBytes = ((GBW + 7) >> 3) - 1; | |
961 nBitsLeft = GBW - (nLineBytes << 3); | |
962 for(FX_DWORD h = 0; h < GBH; h++) { | |
963 if(TPGDON) { | |
964 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); | |
965 LTP = LTP ^ SLTP; | |
966 } | |
967 if(LTP == 1) { | |
968 GBREG->copyLine(h, h - 1); | |
969 } else { | |
970 if(h > 0) { | |
971 pLine1 = pLine - nStride; | |
972 line1 = *pLine1++; | |
973 CONTEXT = (line1 >> 1) & 0x03f0; | |
974 for(cc = 0; cc < nLineBytes; cc++) { | |
975 line1 = (line1 << 8) | (*pLine1++); | |
976 cVal = 0; | |
977 for(k = 7; k >= 0; k--) { | |
978 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
979 cVal |= bVal << k; | |
980 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | |
981 | ((line1 >> (k + 1)) & 0x0010); | |
982 } | |
983 pLine[cc] = cVal; | |
984 } | |
985 line1 <<= 8; | |
986 cVal = 0; | |
987 for(k = 0; k < nBitsLeft; k++) { | |
988 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
989 cVal |= bVal << (7 - k); | |
990 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | |
991 | ((line1 >> (8 - k)) & 0x0010); | |
992 } | |
993 pLine[nLineBytes] = cVal; | |
994 } else { | |
995 CONTEXT = 0; | |
996 for(cc = 0; cc < nLineBytes; cc++) { | |
997 cVal = 0; | |
998 for(k = 7; k >= 0; k--) { | |
999 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
1000 cVal |= bVal << k; | |
1001 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; | |
1002 } | |
1003 pLine[cc] = cVal; | |
1004 } | |
1005 cVal = 0; | |
1006 for(k = 0; k < nBitsLeft; k++) { | |
1007 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
1008 cVal |= bVal << (7 - k); | |
1009 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; | |
1010 } | |
1011 pLine[nLineBytes] = cVal; | |
1012 } | |
1013 } | |
1014 pLine += nStride; | |
1015 } | |
1016 return GBREG; | |
1017 } | |
1018 CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_ArithDecoder *
pArithDecoder, JBig2ArithCtx *gbContext) | |
1019 { | |
1020 FX_BOOL LTP, SLTP, bVal; | |
1021 FX_DWORD CONTEXT; | |
1022 CJBig2_Image *GBREG; | |
1023 FX_DWORD line1, line2; | |
1024 LTP = 0; | |
1025 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
1026 GBREG->fill(0); | |
1027 for(FX_DWORD h = 0; h < GBH; h++) { | |
1028 if(TPGDON) { | |
1029 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); | |
1030 LTP = LTP ^ SLTP; | |
1031 } | |
1032 if(LTP == 1) { | |
1033 GBREG->copyLine(h, h - 1); | |
1034 } else { | |
1035 line1 = GBREG->getPixel(1, h - 1); | |
1036 line1 |= GBREG->getPixel(0, h - 1) << 1; | |
1037 line2 = 0; | |
1038 for(FX_DWORD w = 0; w < GBW; w++) { | |
1039 if(USESKIP && SKIP->getPixel(w, h)) { | |
1040 bVal = 0; | |
1041 } else { | |
1042 CONTEXT = line2; | |
1043 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; | |
1044 CONTEXT |= line1 << 5; | |
1045 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
1046 } | |
1047 if(bVal) { | |
1048 GBREG->setPixel(w, h, bVal); | |
1049 } | |
1050 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f; | |
1051 line2 = ((line2 << 1) | bVal) & 0x0f; | |
1052 } | |
1053 } | |
1054 } | |
1055 return GBREG; | |
1056 } | |
1057 CJBig2_Image *CJBig2_GRDProc::decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder
, JBig2ArithCtx *gbContext) | |
1058 { | |
1059 FX_BOOL LTP, SLTP, bVal; | |
1060 FX_DWORD CONTEXT; | |
1061 CJBig2_Image *GBREG; | |
1062 FX_DWORD line1, line2, line3; | |
1063 LTP = 0; | |
1064 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
1065 GBREG->fill(0); | |
1066 for(FX_DWORD h = 0; h < GBH; h++) { | |
1067 if(TPGDON) { | |
1068 switch(GBTEMPLATE) { | |
1069 case 0: | |
1070 CONTEXT = 0x9b25; | |
1071 break; | |
1072 case 1: | |
1073 CONTEXT = 0x0795; | |
1074 break; | |
1075 case 2: | |
1076 CONTEXT = 0x00e5; | |
1077 break; | |
1078 case 3: | |
1079 CONTEXT = 0x0195; | |
1080 break; | |
1081 } | |
1082 SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
1083 LTP = LTP ^ SLTP; | |
1084 } | |
1085 if(LTP == 1) { | |
1086 GBREG->copyLine(h, h - 1); | |
1087 } else { | |
1088 switch(GBTEMPLATE) { | |
1089 case 0: { | |
1090 line1 = GBREG->getPixel(1, h - 2); | |
1091 line1 |= GBREG->getPixel(0, h - 2) << 1; | |
1092 line2 = GBREG->getPixel(2, h - 1); | |
1093 line2 |= GBREG->getPixel(1, h - 1) << 1; | |
1094 line2 |= GBREG->getPixel(0, h - 1) << 2; | |
1095 line3 = 0; | |
1096 for(FX_DWORD w = 0; w < GBW; w++) { | |
1097 if(USESKIP && SKIP->getPixel(w, h)) { | |
1098 bVal = 0; | |
1099 } else { | |
1100 CONTEXT = line3; | |
1101 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT
[1]) << 4; | |
1102 CONTEXT |= line2 << 5; | |
1103 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT
[3]) << 10; | |
1104 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT
[5]) << 11; | |
1105 CONTEXT |= line1 << 12; | |
1106 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT
[7]) << 15; | |
1107 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]
); | |
1108 } | |
1109 if(bVal) { | |
1110 GBREG->setPixel(w, h, bVal); | |
1111 } | |
1112 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2
)) & 0x07; | |
1113 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1
)) & 0x1f; | |
1114 line3 = ((line3 << 1) | bVal) & 0x0f; | |
1115 } | |
1116 } | |
1117 break; | |
1118 case 1: { | |
1119 line1 = GBREG->getPixel(2, h - 2); | |
1120 line1 |= GBREG->getPixel(1, h - 2) << 1; | |
1121 line1 |= GBREG->getPixel(0, h - 2) << 2; | |
1122 line2 = GBREG->getPixel(2, h - 1); | |
1123 line2 |= GBREG->getPixel(1, h - 1) << 1; | |
1124 line2 |= GBREG->getPixel(0, h - 1) << 2; | |
1125 line3 = 0; | |
1126 for(FX_DWORD w = 0; w < GBW; w++) { | |
1127 if(USESKIP && SKIP->getPixel(w, h)) { | |
1128 bVal = 0; | |
1129 } else { | |
1130 CONTEXT = line3; | |
1131 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT
[1]) << 3; | |
1132 CONTEXT |= line2 << 4; | |
1133 CONTEXT |= line1 << 9; | |
1134 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]
); | |
1135 } | |
1136 if(bVal) { | |
1137 GBREG->setPixel(w, h, bVal); | |
1138 } | |
1139 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2
)) & 0x0f; | |
1140 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1
)) & 0x1f; | |
1141 line3 = ((line3 << 1) | bVal) & 0x07; | |
1142 } | |
1143 } | |
1144 break; | |
1145 case 2: { | |
1146 line1 = GBREG->getPixel(1, h - 2); | |
1147 line1 |= GBREG->getPixel(0, h - 2) << 1; | |
1148 line2 = GBREG->getPixel(1, h - 1); | |
1149 line2 |= GBREG->getPixel(0, h - 1) << 1; | |
1150 line3 = 0; | |
1151 for(FX_DWORD w = 0; w < GBW; w++) { | |
1152 if(USESKIP && SKIP->getPixel(w, h)) { | |
1153 bVal = 0; | |
1154 } else { | |
1155 CONTEXT = line3; | |
1156 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT
[1]) << 2; | |
1157 CONTEXT |= line2 << 3; | |
1158 CONTEXT |= line1 << 7; | |
1159 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]
); | |
1160 } | |
1161 if(bVal) { | |
1162 GBREG->setPixel(w, h, bVal); | |
1163 } | |
1164 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2
)) & 0x07; | |
1165 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1
)) & 0x0f; | |
1166 line3 = ((line3 << 1) | bVal) & 0x03; | |
1167 } | |
1168 } | |
1169 break; | |
1170 case 3: { | |
1171 line1 = GBREG->getPixel(1, h - 1); | |
1172 line1 |= GBREG->getPixel(0, h - 1) << 1; | |
1173 line2 = 0; | |
1174 for(FX_DWORD w = 0; w < GBW; w++) { | |
1175 if(USESKIP && SKIP->getPixel(w, h)) { | |
1176 bVal = 0; | |
1177 } else { | |
1178 CONTEXT = line2; | |
1179 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT
[1]) << 4; | |
1180 CONTEXT |= line1 << 5; | |
1181 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]
); | |
1182 } | |
1183 if(bVal) { | |
1184 GBREG->setPixel(w, h, bVal); | |
1185 } | |
1186 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1
)) & 0x1f; | |
1187 line2 = ((line2 << 1) | bVal) & 0x0f; | |
1188 } | |
1189 } | |
1190 break; | |
1191 } | |
1192 } | |
1193 } | |
1194 return GBREG; | |
1195 } | |
1196 CJBig2_Image *CJBig2_GRDProc::decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder
, JBig2ArithCtx *gbContext) | |
1197 { | |
1198 FX_BOOL LTP, SLTP, bVal; | |
1199 FX_DWORD CONTEXT = 0; | |
1200 CJBig2_Image *GBREG; | |
1201 LTP = 0; | |
1202 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
1203 GBREG->fill(0); | |
1204 for(FX_DWORD h = 0; h < GBH; h++) { | |
1205 if(TPGDON) { | |
1206 switch(GBTEMPLATE) { | |
1207 case 0: | |
1208 CONTEXT = 0x9b25; | |
1209 break; | |
1210 case 1: | |
1211 CONTEXT = 0x0795; | |
1212 break; | |
1213 case 2: | |
1214 CONTEXT = 0x00e5; | |
1215 break; | |
1216 case 3: | |
1217 CONTEXT = 0x0195; | |
1218 break; | |
1219 } | |
1220 SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
1221 LTP = LTP ^ SLTP; | |
1222 } | |
1223 if(LTP == 1) { | |
1224 for(FX_DWORD w = 0; w < GBW; w++) { | |
1225 GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1)); | |
1226 } | |
1227 } else { | |
1228 for(FX_DWORD w = 0; w < GBW; w++) { | |
1229 if(USESKIP && SKIP->getPixel(w, h)) { | |
1230 GBREG->setPixel(w, h, 0); | |
1231 } else { | |
1232 CONTEXT = 0; | |
1233 switch(GBTEMPLATE) { | |
1234 case 0: | |
1235 CONTEXT |= GBREG->getPixel(w - 1, h); | |
1236 CONTEXT |= GBREG->getPixel(w - 2, h) << 1; | |
1237 CONTEXT |= GBREG->getPixel(w - 3, h) << 2; | |
1238 CONTEXT |= GBREG->getPixel(w - 4, h) << 3; | |
1239 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1])
<< 4; | |
1240 CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5; | |
1241 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6; | |
1242 CONTEXT |= GBREG->getPixel(w, h - 1) << 7; | |
1243 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8; | |
1244 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9; | |
1245 CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3])
<< 10; | |
1246 CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5])
<< 11; | |
1247 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12; | |
1248 CONTEXT |= GBREG->getPixel(w, h - 2) << 13; | |
1249 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14; | |
1250 CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7])
<< 15; | |
1251 break; | |
1252 case 1: | |
1253 CONTEXT |= GBREG->getPixel(w - 1, h); | |
1254 CONTEXT |= GBREG->getPixel(w - 2, h) << 1; | |
1255 CONTEXT |= GBREG->getPixel(w - 3, h) << 2; | |
1256 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1])
<< 3; | |
1257 CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4; | |
1258 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5; | |
1259 CONTEXT |= GBREG->getPixel(w, h - 1) << 6; | |
1260 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7; | |
1261 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8; | |
1262 CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9; | |
1263 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10; | |
1264 CONTEXT |= GBREG->getPixel(w, h - 2) << 11; | |
1265 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12; | |
1266 break; | |
1267 case 2: | |
1268 CONTEXT |= GBREG->getPixel(w - 1, h); | |
1269 CONTEXT |= GBREG->getPixel(w - 2, h) << 1; | |
1270 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1])
<< 2; | |
1271 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3; | |
1272 CONTEXT |= GBREG->getPixel(w, h - 1) << 4; | |
1273 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5; | |
1274 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6; | |
1275 CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7; | |
1276 CONTEXT |= GBREG->getPixel(w, h - 2) << 8; | |
1277 CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9; | |
1278 break; | |
1279 case 3: | |
1280 CONTEXT |= GBREG->getPixel(w - 1, h); | |
1281 CONTEXT |= GBREG->getPixel(w - 2, h) << 1; | |
1282 CONTEXT |= GBREG->getPixel(w - 3, h) << 2; | |
1283 CONTEXT |= GBREG->getPixel(w - 4, h) << 3; | |
1284 CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1])
<< 4; | |
1285 CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5; | |
1286 CONTEXT |= GBREG->getPixel(w, h - 1) << 6; | |
1287 CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7; | |
1288 CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8; | |
1289 CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9; | |
1290 break; | |
1291 } | |
1292 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
1293 GBREG->setPixel(w, h, bVal); | |
1294 } | |
1295 } | |
1296 } | |
1297 } | |
1298 return GBREG; | |
1299 } | |
1300 CJBig2_Image *CJBig2_GRDProc::decode_MMR(CJBig2_BitStream *pStream) | |
1301 { | |
1302 int bitpos, i; | |
1303 CJBig2_Image *pImage; | |
1304 JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH)); | |
1305 if (pImage->m_pData == NULL) { | |
1306 delete pImage; | |
1307 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | |
1308 return NULL; | |
1309 } | |
1310 bitpos = (int)pStream->getBitPos(); | |
1311 _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, pI
mage->m_pData, GBW, GBH, pImage->m_nStride); | |
1312 pStream->setBitPos(bitpos); | |
1313 for(i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) { | |
1314 pImage->m_pData[i] = ~pImage->m_pData[i]; | |
1315 } | |
1316 return pImage; | |
1317 } | |
1318 CJBig2_Image *CJBig2_GRRDProc::decode(CJBig2_ArithDecoder *pArithDecoder, JBig2A
rithCtx *grContext) | |
1319 { | |
1320 if (GRW == 0 || GRH == 0) { | |
1321 CJBig2_Image* pImage; | |
1322 JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH)); | |
1323 return pImage; | |
1324 } | |
1325 if(GRTEMPLATE == 0) { | |
1326 if((GRAT[0] == (signed char) - 1) && (GRAT[1] == (signed char) - 1) | |
1327 && (GRAT[2] == (signed char) - 1) && (GRAT[3] == (signed char) -
1) | |
1328 && (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWid
th)) { | |
1329 return decode_Template0_opt(pArithDecoder, grContext); | |
1330 } else { | |
1331 return decode_Template0_unopt(pArithDecoder, grContext); | |
1332 } | |
1333 } else { | |
1334 if((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) { | |
1335 return decode_Template1_opt(pArithDecoder, grContext); | |
1336 } else { | |
1337 return decode_Template1_unopt(pArithDecoder, grContext); | |
1338 } | |
1339 } | |
1340 } | |
1341 CJBig2_Image *CJBig2_GRRDProc::decode_Template0_unopt(CJBig2_ArithDecoder *pArit
hDecoder, JBig2ArithCtx *grContext) | |
1342 { | |
1343 FX_BOOL LTP, SLTP, bVal; | |
1344 FX_DWORD CONTEXT; | |
1345 CJBig2_Image *GRREG; | |
1346 FX_DWORD line1, line2, line3, line4, line5; | |
1347 LTP = 0; | |
1348 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); | |
1349 GRREG->fill(0); | |
1350 for(FX_DWORD h = 0; h < GRH; h++) { | |
1351 if(TPGRON) { | |
1352 SLTP = pArithDecoder->DECODE(&grContext[0x0010]); | |
1353 LTP = LTP ^ SLTP; | |
1354 } | |
1355 if(LTP == 0) { | |
1356 line1 = GRREG->getPixel(1, h - 1); | |
1357 line1 |= GRREG->getPixel(0, h - 1) << 1; | |
1358 line2 = 0; | |
1359 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY
- 1); | |
1360 line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1
) << 1; | |
1361 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY)
; | |
1362 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) <<
1; | |
1363 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY
) << 2; | |
1364 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY
+ 1); | |
1365 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1
) << 1; | |
1366 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY
+ 1) << 2; | |
1367 for(FX_DWORD w = 0; w < GRW; w++) { | |
1368 CONTEXT = line5; | |
1369 CONTEXT |= line4 << 3; | |
1370 CONTEXT |= line3 << 6; | |
1371 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h
- GRREFERENCEDY + GRAT[3]) << 8; | |
1372 CONTEXT |= line2 << 9; | |
1373 CONTEXT |= line1 << 10; | |
1374 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; | |
1375 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1376 GRREG->setPixel(w, h, bVal); | |
1377 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03; | |
1378 line2 = ((line2 << 1) | bVal) & 0x01; | |
1379 line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 2, h - GRREFERENCEDY - 1)) & 0x03; | |
1380 line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 2, h - GRREFERENCEDY)) & 0x07; | |
1381 line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 2, h - GRREFERENCEDY + 1)) & 0x07; | |
1382 } | |
1383 } else { | |
1384 line1 = GRREG->getPixel(1, h - 1); | |
1385 line1 |= GRREG->getPixel(0, h - 1) << 1; | |
1386 line2 = 0; | |
1387 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY
- 1); | |
1388 line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1
) << 1; | |
1389 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY)
; | |
1390 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) <<
1; | |
1391 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY
) << 2; | |
1392 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY
+ 1); | |
1393 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1
) << 1; | |
1394 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY
+ 1) << 2; | |
1395 for(FX_DWORD w = 0; w < GRW; w++) { | |
1396 bVal = GRREFERENCE->getPixel(w, h); | |
1397 if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) | |
1398 && (bVal == GRREFERENCE->getPixel(w, h - 1)) | |
1399 && (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) | |
1400 && (bVal == GRREFERENCE->getPixel(w - 1, h)) | |
1401 && (bVal == GRREFERENCE->getPixel(w + 1, h)) | |
1402 && (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) | |
1403 && (bVal == GRREFERENCE->getPixel(w, h + 1)) | |
1404 && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) { | |
1405 CONTEXT = line5; | |
1406 CONTEXT |= line4 << 3; | |
1407 CONTEXT |= line3 << 6; | |
1408 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2]
, h - GRREFERENCEDY + GRAT[3]) << 8; | |
1409 CONTEXT |= line2 << 9; | |
1410 CONTEXT |= line1 << 10; | |
1411 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; | |
1412 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1413 } | |
1414 GRREG->setPixel(w, h, bVal); | |
1415 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03; | |
1416 line2 = ((line2 << 1) | bVal) & 0x01; | |
1417 line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 2, h - GRREFERENCEDY - 1)) & 0x03; | |
1418 line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 2, h - GRREFERENCEDY)) & 0x07; | |
1419 line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 2, h - GRREFERENCEDY + 1)) & 0x07; | |
1420 } | |
1421 } | |
1422 } | |
1423 return GRREG; | |
1424 } | |
1425 CJBig2_Image *CJBig2_GRRDProc::decode_Template0_opt(CJBig2_ArithDecoder *pArithD
ecoder, JBig2ArithCtx *grContext) | |
1426 { | |
1427 FX_BOOL LTP, SLTP, bVal; | |
1428 FX_DWORD CONTEXT; | |
1429 CJBig2_Image *GRREG; | |
1430 FX_DWORD line1, line1_r, line2_r, line3_r; | |
1431 uint8_t *pLine, *pLineR, cVal; | |
1432 intptr_t nStride, nStrideR, nOffset; | |
1433 int32_t k, nBits; | |
1434 int32_t GRWR, GRHR; | |
1435 int32_t GRW, GRH; | |
1436 GRW = (int32_t)CJBig2_GRRDProc::GRW; | |
1437 GRH = (int32_t)CJBig2_GRRDProc::GRH; | |
1438 LTP = 0; | |
1439 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); | |
1440 if (GRREG->m_pData == NULL) { | |
1441 delete GRREG; | |
1442 m_pModule->JBig2_Error("Generic refinement region decoding procedure: Cr
eate Image Failed with width = %d, height = %d\n", GRW, GRH); | |
1443 return NULL; | |
1444 } | |
1445 pLine = GRREG->m_pData; | |
1446 pLineR = GRREFERENCE->m_pData; | |
1447 nStride = GRREG->m_nStride; | |
1448 nStrideR = GRREFERENCE->m_nStride; | |
1449 GRWR = (int32_t)GRREFERENCE->m_nWidth; | |
1450 GRHR = (int32_t)GRREFERENCE->m_nHeight; | |
1451 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { | |
1452 GRREFERENCEDY = 0; | |
1453 } | |
1454 nOffset = -GRREFERENCEDY * nStrideR; | |
1455 for (int32_t h = 0; h < GRH; h++) { | |
1456 if(TPGRON) { | |
1457 SLTP = pArithDecoder->DECODE(&grContext[0x0010]); | |
1458 LTP = LTP ^ SLTP; | |
1459 } | |
1460 line1 = (h > 0) ? pLine[-nStride] << 4 : 0; | |
1461 int32_t reference_h = h - GRREFERENCEDY; | |
1462 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); | |
1463 FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR); | |
1464 FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1); | |
1465 line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0; | |
1466 line2_r = line2_r_ok ? pLineR[nOffset] : 0; | |
1467 line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0; | |
1468 if(LTP == 0) { | |
1469 CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) | |
1470 | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007); | |
1471 for (int32_t w = 0; w < GRW; w += 8) { | |
1472 nBits = GRW - w > 8 ? 8 : GRW - w; | |
1473 if (h > 0) | |
1474 line1 = (line1 << 8) | | |
1475 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 :
0); | |
1476 if (h > GRHR + GRREFERENCEDY + 1) { | |
1477 line1_r = 0; | |
1478 line2_r = 0; | |
1479 line3_r = 0; | |
1480 } else { | |
1481 if(line1_r_ok) | |
1482 line1_r = (line1_r << 8) | | |
1483 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w
>> 3) + 1] : 0); | |
1484 if(line2_r_ok) | |
1485 line2_r = (line2_r << 8) | | |
1486 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1]
: 0); | |
1487 if(line3_r_ok) | |
1488 line3_r = (line3_r << 8) | | |
1489 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w
>> 3) + 1] : 0); | |
1490 else { | |
1491 line3_r = 0; | |
1492 } | |
1493 } | |
1494 cVal = 0; | |
1495 for (k = 0; k < nBits; k++) { | |
1496 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1497 cVal |= bVal << (7 - k); | |
1498 CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) | | |
1499 ((line1 >> (7 - k)) & 0x0400) | | |
1500 ((line1_r >> (7 - k)) & 0x0040) | | |
1501 ((line2_r >> (10 - k)) & 0x0008) | | |
1502 ((line3_r >> (13 - k)) & 0x0001); | |
1503 } | |
1504 pLine[w >> 3] = cVal; | |
1505 } | |
1506 } else { | |
1507 CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) | |
1508 | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007); | |
1509 for (int32_t w = 0; w < GRW; w += 8) { | |
1510 nBits = GRW - w > 8 ? 8 : GRW - w; | |
1511 if (h > 0) | |
1512 line1 = (line1 << 8) | | |
1513 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 :
0); | |
1514 if(line1_r_ok) | |
1515 line1_r = (line1_r << 8) | | |
1516 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >>
3) + 1] : 0); | |
1517 if(line2_r_ok) | |
1518 line2_r = (line2_r << 8) | | |
1519 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0
); | |
1520 if(line3_r_ok) | |
1521 line3_r = (line3_r << 8) | | |
1522 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >>
3) + 1] : 0); | |
1523 else { | |
1524 line3_r = 0; | |
1525 } | |
1526 cVal = 0; | |
1527 for (k = 0; k < nBits; k++) { | |
1528 bVal = GRREFERENCE->getPixel(w + k, h); | |
1529 if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h -
1)) | |
1530 && (bVal == GRREFERENCE->getPixel(w + k, h - 1)) | |
1531 && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) | |
1532 && (bVal == GRREFERENCE->getPixel(w + k - 1, h)) | |
1533 && (bVal == GRREFERENCE->getPixel(w + k + 1, h)) | |
1534 && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) | |
1535 && (bVal == GRREFERENCE->getPixel(w + k, h + 1)) | |
1536 && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1))
)) { | |
1537 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1538 } | |
1539 cVal |= bVal << (7 - k); | |
1540 CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) | | |
1541 ((line1 >> (7 - k)) & 0x0400) | | |
1542 ((line1_r >> (7 - k)) & 0x0040) | | |
1543 ((line2_r >> (10 - k)) & 0x0008) | | |
1544 ((line3_r >> (13 - k)) & 0x0001); | |
1545 } | |
1546 pLine[w >> 3] = cVal; | |
1547 } | |
1548 } | |
1549 pLine += nStride; | |
1550 if (h < GRHR + GRREFERENCEDY) { | |
1551 pLineR += nStrideR; | |
1552 } | |
1553 } | |
1554 return GRREG; | |
1555 } | |
1556 CJBig2_Image *CJBig2_GRRDProc::decode_Template1_unopt(CJBig2_ArithDecoder *pArit
hDecoder, JBig2ArithCtx *grContext) | |
1557 { | |
1558 FX_BOOL LTP, SLTP, bVal; | |
1559 FX_DWORD CONTEXT; | |
1560 CJBig2_Image *GRREG; | |
1561 FX_DWORD line1, line2, line3, line4, line5; | |
1562 LTP = 0; | |
1563 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); | |
1564 GRREG->fill(0); | |
1565 for(FX_DWORD h = 0; h < GRH; h++) { | |
1566 if(TPGRON) { | |
1567 SLTP = pArithDecoder->DECODE(&grContext[0x0008]); | |
1568 LTP = LTP ^ SLTP; | |
1569 } | |
1570 if(LTP == 0) { | |
1571 line1 = GRREG->getPixel(1, h - 1); | |
1572 line1 |= GRREG->getPixel(0, h - 1) << 1; | |
1573 line1 |= GRREG->getPixel(-1, h - 1) << 2; | |
1574 line2 = 0; | |
1575 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1)
; | |
1576 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY)
; | |
1577 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) <<
1; | |
1578 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY
) << 2; | |
1579 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY
+ 1); | |
1580 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1
) << 1; | |
1581 for(FX_DWORD w = 0; w < GRW; w++) { | |
1582 CONTEXT = line5; | |
1583 CONTEXT |= line4 << 2; | |
1584 CONTEXT |= line3 << 5; | |
1585 CONTEXT |= line2 << 6; | |
1586 CONTEXT |= line1 << 7; | |
1587 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1588 GRREG->setPixel(w, h, bVal); | |
1589 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07; | |
1590 line2 = ((line2 << 1) | bVal) & 0x01; | |
1591 line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 1, h - GRREFERENCEDY - 1)) & 0x01; | |
1592 line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 2, h - GRREFERENCEDY)) & 0x07; | |
1593 line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 2, h - GRREFERENCEDY + 1)) & 0x03; | |
1594 } | |
1595 } else { | |
1596 line1 = GRREG->getPixel(1, h - 1); | |
1597 line1 |= GRREG->getPixel(0, h - 1) << 1; | |
1598 line1 |= GRREG->getPixel(-1, h - 1) << 2; | |
1599 line2 = 0; | |
1600 line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1)
; | |
1601 line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY)
; | |
1602 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) <<
1; | |
1603 line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY
) << 2; | |
1604 line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY
+ 1); | |
1605 line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1
) << 1; | |
1606 for(FX_DWORD w = 0; w < GRW; w++) { | |
1607 bVal = GRREFERENCE->getPixel(w, h); | |
1608 if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) | |
1609 && (bVal == GRREFERENCE->getPixel(w, h - 1)) | |
1610 && (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) | |
1611 && (bVal == GRREFERENCE->getPixel(w - 1, h)) | |
1612 && (bVal == GRREFERENCE->getPixel(w + 1, h)) | |
1613 && (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) | |
1614 && (bVal == GRREFERENCE->getPixel(w, h + 1)) | |
1615 && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) { | |
1616 CONTEXT = line5; | |
1617 CONTEXT |= line4 << 2; | |
1618 CONTEXT |= line3 << 5; | |
1619 CONTEXT |= line2 << 6; | |
1620 CONTEXT |= line1 << 7; | |
1621 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1622 } | |
1623 GRREG->setPixel(w, h, bVal); | |
1624 line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07; | |
1625 line2 = ((line2 << 1) | bVal) & 0x01; | |
1626 line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 1, h - GRREFERENCEDY - 1)) & 0x01; | |
1627 line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 2, h - GRREFERENCEDY)) & 0x07; | |
1628 line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX
+ 2, h - GRREFERENCEDY + 1)) & 0x03; | |
1629 } | |
1630 } | |
1631 } | |
1632 return GRREG; | |
1633 } | |
1634 CJBig2_Image *CJBig2_GRRDProc::decode_Template1_opt(CJBig2_ArithDecoder *pArithD
ecoder, JBig2ArithCtx *grContext) | |
1635 { | |
1636 FX_BOOL LTP, SLTP, bVal; | |
1637 FX_DWORD CONTEXT; | |
1638 CJBig2_Image *GRREG; | |
1639 FX_DWORD line1, line1_r, line2_r, line3_r; | |
1640 uint8_t *pLine, *pLineR, cVal; | |
1641 intptr_t nStride, nStrideR, nOffset; | |
1642 int32_t k, nBits; | |
1643 int32_t GRWR, GRHR; | |
1644 int32_t GRW, GRH; | |
1645 GRW = (int32_t)CJBig2_GRRDProc::GRW; | |
1646 GRH = (int32_t)CJBig2_GRRDProc::GRH; | |
1647 LTP = 0; | |
1648 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); | |
1649 if (GRREG->m_pData == NULL) { | |
1650 delete GRREG; | |
1651 m_pModule->JBig2_Error("Generic refinement region decoding procedure: Cr
eate Image Failed with width = %d, height = %d\n", GRW, GRH); | |
1652 return NULL; | |
1653 } | |
1654 pLine = GRREG->m_pData; | |
1655 pLineR = GRREFERENCE->m_pData; | |
1656 nStride = GRREG->m_nStride; | |
1657 nStrideR = GRREFERENCE->m_nStride; | |
1658 GRWR = (int32_t)GRREFERENCE->m_nWidth; | |
1659 GRHR = (int32_t)GRREFERENCE->m_nHeight; | |
1660 if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { | |
1661 GRREFERENCEDY = 0; | |
1662 } | |
1663 nOffset = -GRREFERENCEDY * nStrideR; | |
1664 for (int32_t h = 0; h < GRH; h++) { | |
1665 if(TPGRON) { | |
1666 SLTP = pArithDecoder->DECODE(&grContext[0x0008]); | |
1667 LTP = LTP ^ SLTP; | |
1668 } | |
1669 line1 = (h > 0) ? pLine[-nStride] << 1 : 0; | |
1670 int32_t reference_h = h - GRREFERENCEDY; | |
1671 FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); | |
1672 FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR); | |
1673 FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1); | |
1674 line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0; | |
1675 line2_r = line2_r_ok ? pLineR[nOffset] : 0; | |
1676 line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0; | |
1677 if(LTP == 0) { | |
1678 CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) | |
1679 | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003); | |
1680 for (int32_t w = 0; w < GRW; w += 8) { | |
1681 nBits = GRW - w > 8 ? 8 : GRW - w; | |
1682 if (h > 0) | |
1683 line1 = (line1 << 8) | | |
1684 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 :
0); | |
1685 if(line1_r_ok) | |
1686 line1_r = (line1_r << 8) | | |
1687 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >>
3) + 1] : 0); | |
1688 if(line2_r_ok) | |
1689 line2_r = (line2_r << 8) | | |
1690 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0
); | |
1691 if(line3_r_ok) | |
1692 line3_r = (line3_r << 8) | | |
1693 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >>
3) + 1] : 0); | |
1694 else { | |
1695 line3_r = 0; | |
1696 } | |
1697 cVal = 0; | |
1698 for (k = 0; k < nBits; k++) { | |
1699 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1700 cVal |= bVal << (7 - k); | |
1701 CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) | | |
1702 ((line1 >> (7 - k)) & 0x0080) | | |
1703 ((line1_r >> (9 - k)) & 0x0020) | | |
1704 ((line2_r >> (11 - k)) & 0x0004) | | |
1705 ((line3_r >> (13 - k)) & 0x0001); | |
1706 } | |
1707 pLine[w >> 3] = cVal; | |
1708 } | |
1709 } else { | |
1710 CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) | |
1711 | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003); | |
1712 for (int32_t w = 0; w < GRW; w += 8) { | |
1713 nBits = GRW - w > 8 ? 8 : GRW - w; | |
1714 if (h > 0) | |
1715 line1 = (line1 << 8) | | |
1716 (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 :
0); | |
1717 if(line1_r_ok) | |
1718 line1_r = (line1_r << 8) | | |
1719 (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >>
3) + 1] : 0); | |
1720 if(line2_r_ok) | |
1721 line2_r = (line2_r << 8) | | |
1722 (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0
); | |
1723 if(line3_r_ok) | |
1724 line3_r = (line3_r << 8) | | |
1725 (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >>
3) + 1] : 0); | |
1726 else { | |
1727 line3_r = 0; | |
1728 } | |
1729 cVal = 0; | |
1730 for (k = 0; k < nBits; k++) { | |
1731 bVal = GRREFERENCE->getPixel(w + k, h); | |
1732 if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h -
1)) | |
1733 && (bVal == GRREFERENCE->getPixel(w + k, h - 1)) | |
1734 && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) | |
1735 && (bVal == GRREFERENCE->getPixel(w + k - 1, h)) | |
1736 && (bVal == GRREFERENCE->getPixel(w + k + 1, h)) | |
1737 && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) | |
1738 && (bVal == GRREFERENCE->getPixel(w + k, h + 1)) | |
1739 && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1))
)) { | |
1740 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1741 } | |
1742 cVal |= bVal << (7 - k); | |
1743 CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) | | |
1744 ((line1 >> (7 - k)) & 0x0080) | | |
1745 ((line1_r >> (9 - k)) & 0x0020) | | |
1746 ((line2_r >> (11 - k)) & 0x0004) | | |
1747 ((line3_r >> (13 - k)) & 0x0001); | |
1748 } | |
1749 pLine[w >> 3] = cVal; | |
1750 } | |
1751 } | |
1752 pLine += nStride; | |
1753 if (h < GRHR + GRREFERENCEDY) { | |
1754 pLineR += nStrideR; | |
1755 } | |
1756 } | |
1757 return GRREG; | |
1758 } | |
1759 CJBig2_Image *CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBi
g2ArithCtx *grContext) | |
1760 { | |
1761 FX_BOOL LTP, SLTP, bVal; | |
1762 FX_BOOL TPGRPIX, TPGRVAL; | |
1763 FX_DWORD CONTEXT; | |
1764 CJBig2_Image *GRREG; | |
1765 LTP = 0; | |
1766 JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); | |
1767 GRREG->fill(0); | |
1768 for(FX_DWORD h = 0; h < GRH; h++) { | |
1769 if(TPGRON) { | |
1770 switch(GRTEMPLATE) { | |
1771 case 0: | |
1772 CONTEXT = 0x0010; | |
1773 break; | |
1774 case 1: | |
1775 CONTEXT = 0x0008; | |
1776 break; | |
1777 } | |
1778 SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1779 LTP = LTP ^ SLTP; | |
1780 } | |
1781 if(LTP == 0) { | |
1782 for(FX_DWORD w = 0; w < GRW; w++) { | |
1783 CONTEXT = 0; | |
1784 switch(GRTEMPLATE) { | |
1785 case 0: | |
1786 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
h - GRREFERENCEDY + 1); | |
1787 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h -
GRREFERENCEDY + 1) << 1; | |
1788 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1,
h - GRREFERENCEDY + 1) << 2; | |
1789 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
h - GRREFERENCEDY) << 3; | |
1790 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h -
GRREFERENCEDY) << 4; | |
1791 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1,
h - GRREFERENCEDY) << 5; | |
1792 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
h - GRREFERENCEDY - 1) << 6; | |
1793 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h -
GRREFERENCEDY - 1) << 7; | |
1794 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRA
T[2], h - GRREFERENCEDY + GRAT[3]) << 8; | |
1795 CONTEXT |= GRREG->getPixel(w - 1, h) << 9; | |
1796 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10; | |
1797 CONTEXT |= GRREG->getPixel(w, h - 1) << 11; | |
1798 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) <<
12; | |
1799 break; | |
1800 case 1: | |
1801 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
h - GRREFERENCEDY + 1); | |
1802 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h -
GRREFERENCEDY + 1) << 1; | |
1803 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1,
h - GRREFERENCEDY) << 2; | |
1804 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h -
GRREFERENCEDY) << 3; | |
1805 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1,
h - GRREFERENCEDY) << 4; | |
1806 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h -
GRREFERENCEDY - 1) << 5; | |
1807 CONTEXT |= GRREG->getPixel(w - 1, h) << 6; | |
1808 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7; | |
1809 CONTEXT |= GRREG->getPixel(w, h - 1) << 8; | |
1810 CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9; | |
1811 break; | |
1812 } | |
1813 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1814 GRREG->setPixel(w, h, bVal); | |
1815 } | |
1816 } else { | |
1817 for(FX_DWORD w = 0; w < GRW; w++) { | |
1818 bVal = GRREFERENCE->getPixel(w, h); | |
1819 if(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) | |
1820 && (bVal == GRREFERENCE->getPixel(w, h - 1)) | |
1821 && (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) | |
1822 && (bVal == GRREFERENCE->getPixel(w - 1, h)) | |
1823 && (bVal == GRREFERENCE->getPixel(w + 1, h)) | |
1824 && (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) | |
1825 && (bVal == GRREFERENCE->getPixel(w, h + 1)) | |
1826 && (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) { | |
1827 TPGRPIX = 1; | |
1828 TPGRVAL = bVal; | |
1829 } else { | |
1830 TPGRPIX = 0; | |
1831 } | |
1832 if(TPGRPIX) { | |
1833 GRREG->setPixel(w, h, TPGRVAL); | |
1834 } else { | |
1835 CONTEXT = 0; | |
1836 switch(GRTEMPLATE) { | |
1837 case 0: | |
1838 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX +
1, h - GRREFERENCEDY + 1); | |
1839 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX,
h - GRREFERENCEDY + 1) << 1; | |
1840 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX -
1, h - GRREFERENCEDY + 1) << 2; | |
1841 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX +
1, h - GRREFERENCEDY) << 3; | |
1842 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX,
h - GRREFERENCEDY) << 4; | |
1843 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX -
1, h - GRREFERENCEDY) << 5; | |
1844 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX +
1, h - GRREFERENCEDY - 1) << 6; | |
1845 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX,
h - GRREFERENCEDY - 1) << 7; | |
1846 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX +
GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8; | |
1847 CONTEXT |= GRREG->getPixel(w - 1, h) << 9; | |
1848 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10; | |
1849 CONTEXT |= GRREG->getPixel(w, h - 1) << 11; | |
1850 CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1])
<< 12; | |
1851 break; | |
1852 case 1: | |
1853 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX +
1, h - GRREFERENCEDY + 1); | |
1854 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX,
h - GRREFERENCEDY + 1) << 1; | |
1855 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX +
1, h - GRREFERENCEDY) << 2; | |
1856 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX,
h - GRREFERENCEDY) << 3; | |
1857 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX -
1, h - GRREFERENCEDY) << 4; | |
1858 CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX,
h - GRREFERENCEDY - 1) << 5; | |
1859 CONTEXT |= GRREG->getPixel(w - 1, h) << 6; | |
1860 CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7; | |
1861 CONTEXT |= GRREG->getPixel(w, h - 1) << 8; | |
1862 CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9; | |
1863 break; | |
1864 } | |
1865 bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); | |
1866 GRREG->setPixel(w, h, bVal); | |
1867 } | |
1868 } | |
1869 } | |
1870 } | |
1871 return GRREG; | |
1872 } | |
1873 CJBig2_Image *CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream *pStream, JBig2Ari
thCtx *grContext) | |
1874 { | |
1875 int32_t STRIPT, FIRSTS; | |
1876 FX_DWORD NINSTANCES; | |
1877 int32_t DT, DFS, CURS; | |
1878 uint8_t CURT; | |
1879 int32_t SI, TI; | |
1880 FX_DWORD IDI; | |
1881 CJBig2_Image *IBI; | |
1882 FX_DWORD WI, HI; | |
1883 int32_t IDS; | |
1884 FX_BOOL RI; | |
1885 int32_t RDWI, RDHI, RDXI, RDYI; | |
1886 CJBig2_Image *IBOI; | |
1887 FX_DWORD WOI, HOI; | |
1888 CJBig2_Image *SBREG; | |
1889 FX_BOOL bFirst; | |
1890 FX_DWORD nTmp; | |
1891 int32_t nVal, nBits; | |
1892 CJBig2_HuffmanDecoder *pHuffmanDecoder; | |
1893 CJBig2_GRRDProc *pGRRD; | |
1894 CJBig2_ArithDecoder *pArithDecoder; | |
1895 JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream)); | |
1896 JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH)); | |
1897 SBREG->fill(SBDEFPIXEL); | |
1898 if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) { | |
1899 m_pModule->JBig2_Error("text region decoding procedure (huffman): too sh
ort."); | |
1900 goto failed; | |
1901 } | |
1902 STRIPT *= SBSTRIPS; | |
1903 STRIPT = -STRIPT; | |
1904 FIRSTS = 0; | |
1905 NINSTANCES = 0; | |
1906 while(NINSTANCES < SBNUMINSTANCES) { | |
1907 if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) { | |
1908 m_pModule->JBig2_Error("text region decoding procedure (huffman): to
o short."); | |
1909 goto failed; | |
1910 } | |
1911 DT *= SBSTRIPS; | |
1912 STRIPT = STRIPT + DT; | |
1913 bFirst = TRUE; | |
1914 for(;;) { | |
1915 if(bFirst) { | |
1916 if(pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) { | |
1917 m_pModule->JBig2_Error("text region decoding procedure (huff
man): too short."); | |
1918 goto failed; | |
1919 } | |
1920 FIRSTS = FIRSTS + DFS; | |
1921 CURS = FIRSTS; | |
1922 bFirst = FALSE; | |
1923 } else { | |
1924 nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS); | |
1925 if(nVal == JBIG2_OOB) { | |
1926 break; | |
1927 } else if(nVal != 0) { | |
1928 m_pModule->JBig2_Error("text region decoding procedure (huff
man): too short."); | |
1929 goto failed; | |
1930 } else { | |
1931 CURS = CURS + IDS + SBDSOFFSET; | |
1932 } | |
1933 } | |
1934 if(SBSTRIPS == 1) { | |
1935 CURT = 0; | |
1936 } else { | |
1937 nTmp = 1; | |
1938 while((FX_DWORD)(1 << nTmp) < SBSTRIPS) { | |
1939 nTmp ++; | |
1940 } | |
1941 if(pStream->readNBits(nTmp, &nVal) != 0) { | |
1942 m_pModule->JBig2_Error("text region decoding procedure (huff
man): too short."); | |
1943 goto failed; | |
1944 } | |
1945 CURT = nVal; | |
1946 } | |
1947 TI = STRIPT + CURT; | |
1948 nVal = 0; | |
1949 nBits = 0; | |
1950 for(;;) { | |
1951 if(pStream->read1Bit(&nTmp) != 0) { | |
1952 m_pModule->JBig2_Error("text region decoding procedure (huff
man): too short."); | |
1953 goto failed; | |
1954 } | |
1955 nVal = (nVal << 1) | nTmp; | |
1956 nBits ++; | |
1957 for(IDI = 0; IDI < SBNUMSYMS; IDI++) { | |
1958 if((nBits == SBSYMCODES[IDI].codelen) && (nVal == SBSYMCODES
[IDI].code)) { | |
1959 break; | |
1960 } | |
1961 } | |
1962 if(IDI < SBNUMSYMS) { | |
1963 break; | |
1964 } | |
1965 } | |
1966 if(SBREFINE == 0) { | |
1967 RI = 0; | |
1968 } else { | |
1969 if(pStream->read1Bit(&RI) != 0) { | |
1970 m_pModule->JBig2_Error("text region decoding procedure (huff
man): too short."); | |
1971 goto failed; | |
1972 } | |
1973 } | |
1974 if(RI == 0) { | |
1975 IBI = SBSYMS[IDI]; | |
1976 } else { | |
1977 if((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0) | |
1978 || (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0
) | |
1979 || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0
) | |
1980 || (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0
) | |
1981 || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) !=
0)) { | |
1982 m_pModule->JBig2_Error("text region decoding procedure (huff
man): too short."); | |
1983 goto failed; | |
1984 } | |
1985 pStream->alignByte(); | |
1986 nTmp = pStream->getOffset(); | |
1987 IBOI = SBSYMS[IDI]; | |
1988 if (!IBOI) { | |
1989 goto failed; | |
1990 } | |
1991 WOI = IBOI->m_nWidth; | |
1992 HOI = IBOI->m_nHeight; | |
1993 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { | |
1994 m_pModule->JBig2_Error("text region decoding procedure (huff
man): Invalid RDWI or RDHI value."); | |
1995 goto failed; | |
1996 } | |
1997 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); | |
1998 pGRRD->GRW = WOI + RDWI; | |
1999 pGRRD->GRH = HOI + RDHI; | |
2000 pGRRD->GRTEMPLATE = SBRTEMPLATE; | |
2001 pGRRD->GRREFERENCE = IBOI; | |
2002 pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI; | |
2003 pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI; | |
2004 pGRRD->TPGRON = 0; | |
2005 pGRRD->GRAT[0] = SBRAT[0]; | |
2006 pGRRD->GRAT[1] = SBRAT[1]; | |
2007 pGRRD->GRAT[2] = SBRAT[2]; | |
2008 pGRRD->GRAT[3] = SBRAT[3]; | |
2009 JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream)); | |
2010 IBI = pGRRD->decode(pArithDecoder, grContext); | |
2011 if(IBI == NULL) { | |
2012 delete pGRRD; | |
2013 delete pArithDecoder; | |
2014 goto failed; | |
2015 } | |
2016 delete pArithDecoder; | |
2017 pStream->alignByte(); | |
2018 pStream->offset(2); | |
2019 if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { | |
2020 delete IBI; | |
2021 delete pGRRD; | |
2022 m_pModule->JBig2_Error("text region decoding procedure (huff
man):" | |
2023 "bytes processed by generic refinemen
t region decoding procedure doesn't equal SBHUFFRSIZE."); | |
2024 goto failed; | |
2025 } | |
2026 delete pGRRD; | |
2027 } | |
2028 if (!IBI) { | |
2029 continue; | |
2030 } | |
2031 WI = IBI->m_nWidth; | |
2032 HI = IBI->m_nHeight; | |
2033 if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) | |
2034 || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT)))
{ | |
2035 CURS = CURS + WI - 1; | |
2036 } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) | |
2037 || (REFCORNER == JBIG2_CORNER_BOTTOMRI
GHT))) { | |
2038 CURS = CURS + HI - 1; | |
2039 } | |
2040 SI = CURS; | |
2041 if(TRANSPOSED == 0) { | |
2042 switch(REFCORNER) { | |
2043 case JBIG2_CORNER_TOPLEFT: | |
2044 SBREG->composeFrom(SI, TI, IBI, SBCOMBOP); | |
2045 break; | |
2046 case JBIG2_CORNER_TOPRIGHT: | |
2047 SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP); | |
2048 break; | |
2049 case JBIG2_CORNER_BOTTOMLEFT: | |
2050 SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP); | |
2051 break; | |
2052 case JBIG2_CORNER_BOTTOMRIGHT: | |
2053 SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMB
OP); | |
2054 break; | |
2055 } | |
2056 } else { | |
2057 switch(REFCORNER) { | |
2058 case JBIG2_CORNER_TOPLEFT: | |
2059 SBREG->composeFrom(TI, SI, IBI, SBCOMBOP); | |
2060 break; | |
2061 case JBIG2_CORNER_TOPRIGHT: | |
2062 SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP); | |
2063 break; | |
2064 case JBIG2_CORNER_BOTTOMLEFT: | |
2065 SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP); | |
2066 break; | |
2067 case JBIG2_CORNER_BOTTOMRIGHT: | |
2068 SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMB
OP); | |
2069 break; | |
2070 } | |
2071 } | |
2072 if(RI != 0) { | |
2073 delete IBI; | |
2074 } | |
2075 if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) | |
2076 || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { | |
2077 CURS = CURS + WI - 1; | |
2078 } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) | |
2079 || (REFCORNER == JBIG2_CORNER_TOPRIGHT
))) { | |
2080 CURS = CURS + HI - 1; | |
2081 } | |
2082 NINSTANCES = NINSTANCES + 1; | |
2083 } | |
2084 } | |
2085 delete pHuffmanDecoder; | |
2086 return SBREG; | |
2087 failed: | 2232 failed: |
2088 delete pHuffmanDecoder; | 2233 delete pHuffmanDecoder; |
2089 delete SBREG; | 2234 delete SBREG; |
2090 return NULL; | 2235 return NULL; |
2091 } | 2236 } |
2092 CJBig2_Image *CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, J
Big2ArithCtx *grContext, | 2237 CJBig2_Image* CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, |
2093 JBig2IntDecoderState *pIDS) | 2238 JBig2ArithCtx* grContext, |
2094 { | 2239 JBig2IntDecoderState* pIDS) { |
2095 int32_t STRIPT, FIRSTS; | 2240 int32_t STRIPT, FIRSTS; |
2096 FX_DWORD NINSTANCES; | 2241 FX_DWORD NINSTANCES; |
2097 int32_t DT, DFS, CURS; | 2242 int32_t DT, DFS, CURS; |
2098 int32_t CURT; | 2243 int32_t CURT; |
2099 int32_t SI, TI; | 2244 int32_t SI, TI; |
2100 FX_DWORD IDI; | 2245 FX_DWORD IDI; |
2101 CJBig2_Image *IBI; | 2246 CJBig2_Image* IBI; |
2102 FX_DWORD WI, HI; | 2247 FX_DWORD WI, HI; |
2103 int32_t IDS; | 2248 int32_t IDS; |
2104 int RI; | 2249 int RI; |
2105 int32_t RDWI, RDHI, RDXI, RDYI; | 2250 int32_t RDWI, RDHI, RDXI, RDYI; |
2106 CJBig2_Image *IBOI; | 2251 CJBig2_Image* IBOI; |
2107 FX_DWORD WOI, HOI; | 2252 FX_DWORD WOI, HOI; |
2108 CJBig2_Image *SBREG; | 2253 CJBig2_Image* SBREG; |
2109 FX_BOOL bFirst; | 2254 FX_BOOL bFirst; |
2110 int32_t nRet, nVal; | 2255 int32_t nRet, nVal; |
2111 int32_t bRetained; | 2256 int32_t bRetained; |
2112 CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, *I
ARDX, *IARDY; | 2257 CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, |
2113 CJBig2_ArithIaidDecoder *IAID; | 2258 *IARDX, *IARDY; |
2114 CJBig2_GRRDProc *pGRRD; | 2259 CJBig2_ArithIaidDecoder* IAID; |
2115 if(pIDS) { | 2260 CJBig2_GRRDProc* pGRRD; |
2116 IADT = pIDS->IADT; | 2261 if (pIDS) { |
2117 IAFS = pIDS->IAFS; | 2262 IADT = pIDS->IADT; |
2118 IADS = pIDS->IADS; | 2263 IAFS = pIDS->IAFS; |
2119 IAIT = pIDS->IAIT; | 2264 IADS = pIDS->IADS; |
2120 IARI = pIDS->IARI; | 2265 IAIT = pIDS->IAIT; |
2121 IARDW = pIDS->IARDW; | 2266 IARI = pIDS->IARI; |
2122 IARDH = pIDS->IARDH; | 2267 IARDW = pIDS->IARDW; |
2123 IARDX = pIDS->IARDX; | 2268 IARDH = pIDS->IARDH; |
2124 IARDY = pIDS->IARDY; | 2269 IARDX = pIDS->IARDX; |
2125 IAID = pIDS->IAID; | 2270 IARDY = pIDS->IARDY; |
2126 bRetained = TRUE; | 2271 IAID = pIDS->IAID; |
2127 } else { | 2272 bRetained = TRUE; |
2128 JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder()); | 2273 } else { |
2129 JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder()); | |
2130 JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder()); | |
2131 JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder()); | |
2132 JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder()); | |
2133 JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder()); | |
2134 JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder()); | |
2135 JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder()); | |
2136 JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder()); | |
2137 JBIG2_ALLOC(IAID , CJBig2_ArithIaidDecoder(SBSYMCODELEN)); | |
2138 bRetained = FALSE; | |
2139 } | |
2140 JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH)); | |
2141 SBREG->fill(SBDEFPIXEL); | |
2142 if(IADT->decode(pArithDecoder, &STRIPT) == -1) { | |
2143 m_pModule->JBig2_Error("text region decoding procedure (arith): too shor
t."); | |
2144 goto failed; | |
2145 } | |
2146 STRIPT *= SBSTRIPS; | |
2147 STRIPT = -STRIPT; | |
2148 FIRSTS = 0; | |
2149 NINSTANCES = 0; | |
2150 while(NINSTANCES < SBNUMINSTANCES) { | |
2151 if(IADT->decode(pArithDecoder, &DT) == -1) { | |
2152 m_pModule->JBig2_Error("text region decoding procedure (arith): too
short."); | |
2153 goto failed; | |
2154 } | |
2155 DT *= SBSTRIPS; | |
2156 STRIPT = STRIPT + DT; | |
2157 bFirst = TRUE; | |
2158 for(;;) { | |
2159 if(bFirst) { | |
2160 if(IAFS->decode(pArithDecoder, &DFS) == -1) { | |
2161 m_pModule->JBig2_Error("text region decoding procedure (arit
h): too short."); | |
2162 goto failed; | |
2163 } | |
2164 FIRSTS = FIRSTS + DFS; | |
2165 CURS = FIRSTS; | |
2166 bFirst = FALSE; | |
2167 } else { | |
2168 nRet = IADS->decode(pArithDecoder, &IDS); | |
2169 if(nRet == JBIG2_OOB) { | |
2170 break; | |
2171 } else if(nRet != 0) { | |
2172 m_pModule->JBig2_Error("text region decoding procedure (arit
h): too short."); | |
2173 goto failed; | |
2174 } else { | |
2175 CURS = CURS + IDS + SBDSOFFSET; | |
2176 } | |
2177 } | |
2178 if (NINSTANCES >= SBNUMINSTANCES) { | |
2179 break; | |
2180 } | |
2181 if(SBSTRIPS == 1) { | |
2182 CURT = 0; | |
2183 } else { | |
2184 if(IAIT->decode(pArithDecoder, &nVal) == -1) { | |
2185 m_pModule->JBig2_Error("text region decoding procedure (arit
h): too short."); | |
2186 goto failed; | |
2187 } | |
2188 CURT = nVal; | |
2189 } | |
2190 TI = STRIPT + CURT; | |
2191 if(IAID->decode(pArithDecoder, &nVal) == -1) { | |
2192 m_pModule->JBig2_Error("text region decoding procedure (arith):
too short."); | |
2193 goto failed; | |
2194 } | |
2195 IDI = nVal; | |
2196 if(IDI >= SBNUMSYMS) { | |
2197 m_pModule->JBig2_Error("text region decoding procedure (arith):
symbol id out of range.(%d/%d)", | |
2198 IDI, SBNUMSYMS); | |
2199 goto failed; | |
2200 } | |
2201 if(SBREFINE == 0) { | |
2202 RI = 0; | |
2203 } else { | |
2204 if(IARI->decode(pArithDecoder, &RI) == -1) { | |
2205 m_pModule->JBig2_Error("text region decoding procedure (arit
h): too short."); | |
2206 goto failed; | |
2207 } | |
2208 } | |
2209 if (!SBSYMS[IDI]) { | |
2210 goto failed; | |
2211 } | |
2212 if(RI == 0) { | |
2213 IBI = SBSYMS[IDI]; | |
2214 } else { | |
2215 if((IARDW->decode(pArithDecoder, &RDWI) == -1) | |
2216 || (IARDH->decode(pArithDecoder, &RDHI) == -1) | |
2217 || (IARDX->decode(pArithDecoder, &RDXI) == -1) | |
2218 || (IARDY->decode(pArithDecoder, &RDYI) == -1)) { | |
2219 m_pModule->JBig2_Error("text region decoding procedure (arit
h): too short."); | |
2220 goto failed; | |
2221 } | |
2222 IBOI = SBSYMS[IDI]; | |
2223 WOI = IBOI->m_nWidth; | |
2224 HOI = IBOI->m_nHeight; | |
2225 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { | |
2226 m_pModule->JBig2_Error("text region decoding procedure (arit
h): Invalid RDWI or RDHI value."); | |
2227 goto failed; | |
2228 } | |
2229 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); | |
2230 pGRRD->GRW = WOI + RDWI; | |
2231 pGRRD->GRH = HOI + RDHI; | |
2232 pGRRD->GRTEMPLATE = SBRTEMPLATE; | |
2233 pGRRD->GRREFERENCE = IBOI; | |
2234 pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI; | |
2235 pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI; | |
2236 pGRRD->TPGRON = 0; | |
2237 pGRRD->GRAT[0] = SBRAT[0]; | |
2238 pGRRD->GRAT[1] = SBRAT[1]; | |
2239 pGRRD->GRAT[2] = SBRAT[2]; | |
2240 pGRRD->GRAT[3] = SBRAT[3]; | |
2241 IBI = pGRRD->decode(pArithDecoder, grContext); | |
2242 if(IBI == NULL) { | |
2243 delete pGRRD; | |
2244 goto failed; | |
2245 } | |
2246 delete pGRRD; | |
2247 } | |
2248 WI = IBI->m_nWidth; | |
2249 HI = IBI->m_nHeight; | |
2250 if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) | |
2251 || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT)))
{ | |
2252 CURS = CURS + WI - 1; | |
2253 } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) | |
2254 || (REFCORNER == JBIG2_CORNER_BOTTOMRI
GHT))) { | |
2255 CURS = CURS + HI - 1; | |
2256 } | |
2257 SI = CURS; | |
2258 if(TRANSPOSED == 0) { | |
2259 switch(REFCORNER) { | |
2260 case JBIG2_CORNER_TOPLEFT: | |
2261 SBREG->composeFrom(SI, TI, IBI, SBCOMBOP); | |
2262 break; | |
2263 case JBIG2_CORNER_TOPRIGHT: | |
2264 SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP); | |
2265 break; | |
2266 case JBIG2_CORNER_BOTTOMLEFT: | |
2267 SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP); | |
2268 break; | |
2269 case JBIG2_CORNER_BOTTOMRIGHT: | |
2270 SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMB
OP); | |
2271 break; | |
2272 } | |
2273 } else { | |
2274 switch(REFCORNER) { | |
2275 case JBIG2_CORNER_TOPLEFT: | |
2276 SBREG->composeFrom(TI, SI, IBI, SBCOMBOP); | |
2277 break; | |
2278 case JBIG2_CORNER_TOPRIGHT: | |
2279 SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP); | |
2280 break; | |
2281 case JBIG2_CORNER_BOTTOMLEFT: | |
2282 SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP); | |
2283 break; | |
2284 case JBIG2_CORNER_BOTTOMRIGHT: | |
2285 SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMB
OP); | |
2286 break; | |
2287 } | |
2288 } | |
2289 if(RI != 0) { | |
2290 delete IBI; | |
2291 } | |
2292 if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) | |
2293 || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { | |
2294 CURS = CURS + WI - 1; | |
2295 } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) | |
2296 || (REFCORNER == JBIG2_CORNER_TOPRIGHT
))) { | |
2297 CURS = CURS + HI - 1; | |
2298 } | |
2299 NINSTANCES = NINSTANCES + 1; | |
2300 } | |
2301 } | |
2302 if(bRetained == FALSE) { | |
2303 delete IADT; | |
2304 delete IAFS; | |
2305 delete IADS; | |
2306 delete IAIT; | |
2307 delete IARI; | |
2308 delete IARDW; | |
2309 delete IARDH; | |
2310 delete IARDX; | |
2311 delete IARDY; | |
2312 delete IAID; | |
2313 } | |
2314 return SBREG; | |
2315 failed: | |
2316 if(bRetained == FALSE) { | |
2317 delete IADT; | |
2318 delete IAFS; | |
2319 delete IADS; | |
2320 delete IAIT; | |
2321 delete IARI; | |
2322 delete IARDW; | |
2323 delete IARDH; | |
2324 delete IARDX; | |
2325 delete IARDY; | |
2326 delete IAID; | |
2327 } | |
2328 delete SBREG; | |
2329 return NULL; | |
2330 } | |
2331 CJBig2_SymbolDict *CJBig2_SDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecod
er, | |
2332 JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext) | |
2333 { | |
2334 CJBig2_Image **SDNEWSYMS; | |
2335 FX_DWORD HCHEIGHT, NSYMSDECODED; | |
2336 int32_t HCDH; | |
2337 FX_DWORD SYMWIDTH, TOTWIDTH; | |
2338 int32_t DW; | |
2339 CJBig2_Image *BS; | |
2340 FX_DWORD I, J, REFAGGNINST; | |
2341 FX_BOOL *EXFLAGS; | |
2342 FX_DWORD EXINDEX; | |
2343 FX_BOOL CUREXFLAG; | |
2344 FX_DWORD EXRUNLENGTH; | |
2345 int32_t nVal; | |
2346 FX_DWORD nTmp; | |
2347 FX_DWORD SBNUMSYMS; | |
2348 uint8_t SBSYMCODELEN; | |
2349 FX_DWORD IDI; | |
2350 int32_t RDXI, RDYI; | |
2351 CJBig2_Image **SBSYMS; | |
2352 CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH,
*SBHUFFRDX, *SBHUFFRDY, | |
2353 *SBHUFFRSIZE; | |
2354 CJBig2_GRRDProc *pGRRD; | |
2355 CJBig2_GRDProc *pGRD; | |
2356 CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX, | |
2357 *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH; | |
2358 CJBig2_ArithIaidDecoder *IAID; | |
2359 CJBig2_SymbolDict *pDict; | |
2360 JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder()); | |
2361 JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder()); | |
2362 JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder()); | |
2363 JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder()); | |
2364 JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder()); | |
2365 JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder()); | |
2366 JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder()); | 2274 JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder()); |
2367 JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder()); | 2275 JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder()); |
2368 JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder()); | 2276 JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder()); |
2369 JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder()); | 2277 JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder()); |
2370 JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder()); | 2278 JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder()); |
2371 JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder()); | 2279 JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder()); |
2372 JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder()); | 2280 JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder()); |
2373 nTmp = 0; | 2281 JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder()); |
2374 while((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { | 2282 JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder()); |
2375 nTmp ++; | 2283 JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder(SBSYMCODELEN)); |
| 2284 bRetained = FALSE; |
| 2285 } |
| 2286 JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH)); |
| 2287 SBREG->fill(SBDEFPIXEL); |
| 2288 if (IADT->decode(pArithDecoder, &STRIPT) == -1) { |
| 2289 m_pModule->JBig2_Error( |
| 2290 "text region decoding procedure (arith): too short."); |
| 2291 goto failed; |
| 2292 } |
| 2293 STRIPT *= SBSTRIPS; |
| 2294 STRIPT = -STRIPT; |
| 2295 FIRSTS = 0; |
| 2296 NINSTANCES = 0; |
| 2297 while (NINSTANCES < SBNUMINSTANCES) { |
| 2298 if (IADT->decode(pArithDecoder, &DT) == -1) { |
| 2299 m_pModule->JBig2_Error( |
| 2300 "text region decoding procedure (arith): too short."); |
| 2301 goto failed; |
2376 } | 2302 } |
2377 JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((uint8_t)nTmp)); | 2303 DT *= SBSTRIPS; |
2378 SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJ
Big2_Image*)); | 2304 STRIPT = STRIPT + DT; |
2379 FXSYS_memset(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*)); | 2305 bFirst = TRUE; |
2380 HCHEIGHT = 0; | 2306 for (;;) { |
2381 NSYMSDECODED = 0; | 2307 if (bFirst) { |
2382 while(NSYMSDECODED < SDNUMNEWSYMS) { | 2308 if (IAFS->decode(pArithDecoder, &DFS) == -1) { |
2383 BS = NULL; | 2309 m_pModule->JBig2_Error( |
2384 if(IADH->decode(pArithDecoder, &HCDH) == -1) { | 2310 "text region decoding procedure (arith): too short."); |
2385 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith)
: too short."); | 2311 goto failed; |
2386 goto failed; | |
2387 } | 2312 } |
2388 HCHEIGHT = HCHEIGHT + HCDH; | 2313 FIRSTS = FIRSTS + DFS; |
2389 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { | 2314 CURS = FIRSTS; |
2390 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith)
: invalid HCHEIGHT value."); | 2315 bFirst = FALSE; |
2391 goto failed; | 2316 } else { |
| 2317 nRet = IADS->decode(pArithDecoder, &IDS); |
| 2318 if (nRet == JBIG2_OOB) { |
| 2319 break; |
| 2320 } else if (nRet != 0) { |
| 2321 m_pModule->JBig2_Error( |
| 2322 "text region decoding procedure (arith): too short."); |
| 2323 goto failed; |
| 2324 } else { |
| 2325 CURS = CURS + IDS + SBDSOFFSET; |
2392 } | 2326 } |
2393 SYMWIDTH = 0; | 2327 } |
2394 TOTWIDTH = 0; | 2328 if (NINSTANCES >= SBNUMINSTANCES) { |
2395 for(;;) { | 2329 break; |
2396 nVal = IADW->decode(pArithDecoder, &DW); | 2330 } |
2397 if(nVal == JBIG2_OOB) { | 2331 if (SBSTRIPS == 1) { |
2398 break; | 2332 CURT = 0; |
2399 } else if(nVal != 0) { | 2333 } else { |
2400 m_pModule->JBig2_Error("symbol dictionary decoding procedure (ar
ith): too short."); | 2334 if (IAIT->decode(pArithDecoder, &nVal) == -1) { |
2401 goto failed; | 2335 m_pModule->JBig2_Error( |
2402 } else { | 2336 "text region decoding procedure (arith): too short."); |
2403 if (NSYMSDECODED >= SDNUMNEWSYMS) { | 2337 goto failed; |
2404 m_pModule->JBig2_Error("symbol dictionary decoding procedure
(arith): NSYMSDECODED >= SDNUMNEWSYMS."); | |
2405 goto failed; | |
2406 } | |
2407 SYMWIDTH = SYMWIDTH + DW; | |
2408 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { | |
2409 m_pModule->JBig2_Error("symbol dictionary decoding procedure
(arith): invalid SYMWIDTH value."); | |
2410 goto failed; | |
2411 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { | |
2412 TOTWIDTH = TOTWIDTH + SYMWIDTH; | |
2413 SDNEWSYMS[NSYMSDECODED] = NULL; | |
2414 NSYMSDECODED = NSYMSDECODED + 1; | |
2415 continue; | |
2416 } | |
2417 TOTWIDTH = TOTWIDTH + SYMWIDTH; | |
2418 } | |
2419 if(SDREFAGG == 0) { | |
2420 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); | |
2421 pGRD->MMR = 0; | |
2422 pGRD->GBW = SYMWIDTH; | |
2423 pGRD->GBH = HCHEIGHT; | |
2424 pGRD->GBTEMPLATE = SDTEMPLATE; | |
2425 pGRD->TPGDON = 0; | |
2426 pGRD->USESKIP = 0; | |
2427 pGRD->GBAT[0] = SDAT[0]; | |
2428 pGRD->GBAT[1] = SDAT[1]; | |
2429 pGRD->GBAT[2] = SDAT[2]; | |
2430 pGRD->GBAT[3] = SDAT[3]; | |
2431 pGRD->GBAT[4] = SDAT[4]; | |
2432 pGRD->GBAT[5] = SDAT[5]; | |
2433 pGRD->GBAT[6] = SDAT[6]; | |
2434 pGRD->GBAT[7] = SDAT[7]; | |
2435 BS = pGRD->decode_Arith(pArithDecoder, gbContext); | |
2436 if(BS == NULL) { | |
2437 delete pGRD; | |
2438 goto failed; | |
2439 } | |
2440 delete pGRD; | |
2441 } else { | |
2442 if(IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) { | |
2443 m_pModule->JBig2_Error("symbol dictionary decoding procedure
(arith): too short."); | |
2444 goto failed; | |
2445 } | |
2446 if(REFAGGNINST > 1) { | |
2447 CJBig2_TRDProc *pDecoder; | |
2448 JBIG2_ALLOC(pDecoder, CJBig2_TRDProc()); | |
2449 pDecoder->SBHUFF = SDHUFF; | |
2450 pDecoder->SBREFINE = 1; | |
2451 pDecoder->SBW = SYMWIDTH; | |
2452 pDecoder->SBH = HCHEIGHT; | |
2453 pDecoder->SBNUMINSTANCES = REFAGGNINST; | |
2454 pDecoder->SBSTRIPS = 1; | |
2455 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; | |
2456 SBNUMSYMS = pDecoder->SBNUMSYMS; | |
2457 nTmp = 0; | |
2458 while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { | |
2459 nTmp ++; | |
2460 } | |
2461 SBSYMCODELEN = (uint8_t)nTmp; | |
2462 pDecoder->SBSYMCODELEN = SBSYMCODELEN; | |
2463 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS,
sizeof(CJBig2_Image*)); | |
2464 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_I
mage*)); | |
2465 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED *
sizeof(CJBig2_Image*)); | |
2466 pDecoder->SBSYMS = SBSYMS; | |
2467 pDecoder->SBDEFPIXEL = 0; | |
2468 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; | |
2469 pDecoder->TRANSPOSED = 0; | |
2470 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; | |
2471 pDecoder->SBDSOFFSET = 0; | |
2472 JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6, | |
2473 sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine)
, HuffmanTable_HTOOB_B6)); | |
2474 JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8, | |
2475 sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine)
, HuffmanTable_HTOOB_B8)); | |
2476 JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11, | |
2477 sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B11)); | |
2478 JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15, | |
2479 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B15)); | |
2480 JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15, | |
2481 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B15)); | |
2482 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, | |
2483 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B15)); | |
2484 JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15, | |
2485 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B15)); | |
2486 JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1
, | |
2487 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine)
, HuffmanTable_HTOOB_B1)); | |
2488 pDecoder->SBHUFFFS = SBHUFFFS; | |
2489 pDecoder->SBHUFFDS = SBHUFFDS; | |
2490 pDecoder->SBHUFFDT = SBHUFFDT; | |
2491 pDecoder->SBHUFFRDW = SBHUFFRDW; | |
2492 pDecoder->SBHUFFRDH = SBHUFFRDH; | |
2493 pDecoder->SBHUFFRDX = SBHUFFRDX; | |
2494 pDecoder->SBHUFFRDY = SBHUFFRDY; | |
2495 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE; | |
2496 pDecoder->SBRTEMPLATE = SDRTEMPLATE; | |
2497 pDecoder->SBRAT[0] = SDRAT[0]; | |
2498 pDecoder->SBRAT[1] = SDRAT[1]; | |
2499 pDecoder->SBRAT[2] = SDRAT[2]; | |
2500 pDecoder->SBRAT[3] = SDRAT[3]; | |
2501 JBig2IntDecoderState ids; | |
2502 ids.IADT = IADT; | |
2503 ids.IAFS = IAFS; | |
2504 ids.IADS = IADS; | |
2505 ids.IAIT = IAIT; | |
2506 ids.IARI = IARI; | |
2507 ids.IARDW = IARDW; | |
2508 ids.IARDH = IARDH; | |
2509 ids.IARDX = IARDX; | |
2510 ids.IARDY = IARDY; | |
2511 ids.IAID = IAID; | |
2512 BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids); | |
2513 if(BS == NULL) { | |
2514 m_pModule->JBig2_Free(SBSYMS); | |
2515 delete SBHUFFFS; | |
2516 delete SBHUFFDS; | |
2517 delete SBHUFFDT; | |
2518 delete SBHUFFRDW; | |
2519 delete SBHUFFRDH; | |
2520 delete SBHUFFRDX; | |
2521 delete SBHUFFRDY; | |
2522 delete SBHUFFRSIZE; | |
2523 delete pDecoder; | |
2524 goto failed; | |
2525 } | |
2526 m_pModule->JBig2_Free(SBSYMS); | |
2527 delete SBHUFFFS; | |
2528 delete SBHUFFDS; | |
2529 delete SBHUFFDT; | |
2530 delete SBHUFFRDW; | |
2531 delete SBHUFFRDH; | |
2532 delete SBHUFFRDX; | |
2533 delete SBHUFFRDY; | |
2534 delete SBHUFFRSIZE; | |
2535 delete pDecoder; | |
2536 } else if(REFAGGNINST == 1) { | |
2537 SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; | |
2538 if(IAID->decode(pArithDecoder, (int*)&IDI) == -1) { | |
2539 m_pModule->JBig2_Error("symbol dictionary decoding proce
dure (arith): too short."); | |
2540 goto failed; | |
2541 } | |
2542 if((IARDX->decode(pArithDecoder, &RDXI) == -1) | |
2543 || (IARDY->decode(pArithDecoder, &RDYI) == -1)) { | |
2544 m_pModule->JBig2_Error("symbol dictionary decoding proce
dure (arith): too short."); | |
2545 goto failed; | |
2546 } | |
2547 if (IDI >= SBNUMSYMS) { | |
2548 m_pModule->JBig2_Error("symbol dictionary decoding proce
dure (arith):" | |
2549 " refinement references unknown s
ymbol %d", IDI); | |
2550 goto failed; | |
2551 } | |
2552 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS,
sizeof(CJBig2_Image*)); | |
2553 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_I
mage*)); | |
2554 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED *
sizeof(CJBig2_Image*)); | |
2555 if (!SBSYMS[IDI]) { | |
2556 m_pModule->JBig2_Free(SBSYMS); | |
2557 goto failed; | |
2558 } | |
2559 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); | |
2560 pGRRD->GRW = SYMWIDTH; | |
2561 pGRRD->GRH = HCHEIGHT; | |
2562 pGRRD->GRTEMPLATE = SDRTEMPLATE; | |
2563 pGRRD->GRREFERENCE = SBSYMS[IDI]; | |
2564 pGRRD->GRREFERENCEDX = RDXI; | |
2565 pGRRD->GRREFERENCEDY = RDYI; | |
2566 pGRRD->TPGRON = 0; | |
2567 pGRRD->GRAT[0] = SDRAT[0]; | |
2568 pGRRD->GRAT[1] = SDRAT[1]; | |
2569 pGRRD->GRAT[2] = SDRAT[2]; | |
2570 pGRRD->GRAT[3] = SDRAT[3]; | |
2571 BS = pGRRD->decode(pArithDecoder, grContext); | |
2572 if(BS == NULL) { | |
2573 m_pModule->JBig2_Free(SBSYMS); | |
2574 delete pGRRD; | |
2575 goto failed; | |
2576 } | |
2577 m_pModule->JBig2_Free(SBSYMS); | |
2578 delete pGRRD; | |
2579 } | |
2580 } | |
2581 SDNEWSYMS[NSYMSDECODED] = BS; | |
2582 BS = NULL; | |
2583 NSYMSDECODED = NSYMSDECODED + 1; | |
2584 } | 2338 } |
| 2339 CURT = nVal; |
| 2340 } |
| 2341 TI = STRIPT + CURT; |
| 2342 if (IAID->decode(pArithDecoder, &nVal) == -1) { |
| 2343 m_pModule->JBig2_Error( |
| 2344 "text region decoding procedure (arith): too short."); |
| 2345 goto failed; |
| 2346 } |
| 2347 IDI = nVal; |
| 2348 if (IDI >= SBNUMSYMS) { |
| 2349 m_pModule->JBig2_Error( |
| 2350 "text region decoding procedure (arith): symbol id out of " |
| 2351 "range.(%d/%d)", |
| 2352 IDI, SBNUMSYMS); |
| 2353 goto failed; |
| 2354 } |
| 2355 if (SBREFINE == 0) { |
| 2356 RI = 0; |
| 2357 } else { |
| 2358 if (IARI->decode(pArithDecoder, &RI) == -1) { |
| 2359 m_pModule->JBig2_Error( |
| 2360 "text region decoding procedure (arith): too short."); |
| 2361 goto failed; |
| 2362 } |
| 2363 } |
| 2364 if (!SBSYMS[IDI]) { |
| 2365 goto failed; |
| 2366 } |
| 2367 if (RI == 0) { |
| 2368 IBI = SBSYMS[IDI]; |
| 2369 } else { |
| 2370 if ((IARDW->decode(pArithDecoder, &RDWI) == -1) || |
| 2371 (IARDH->decode(pArithDecoder, &RDHI) == -1) || |
| 2372 (IARDX->decode(pArithDecoder, &RDXI) == -1) || |
| 2373 (IARDY->decode(pArithDecoder, &RDYI) == -1)) { |
| 2374 m_pModule->JBig2_Error( |
| 2375 "text region decoding procedure (arith): too short."); |
| 2376 goto failed; |
| 2377 } |
| 2378 IBOI = SBSYMS[IDI]; |
| 2379 WOI = IBOI->m_nWidth; |
| 2380 HOI = IBOI->m_nHeight; |
| 2381 if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { |
| 2382 m_pModule->JBig2_Error( |
| 2383 "text region decoding procedure (arith): Invalid RDWI or RDHI " |
| 2384 "value."); |
| 2385 goto failed; |
| 2386 } |
| 2387 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
| 2388 pGRRD->GRW = WOI + RDWI; |
| 2389 pGRRD->GRH = HOI + RDHI; |
| 2390 pGRRD->GRTEMPLATE = SBRTEMPLATE; |
| 2391 pGRRD->GRREFERENCE = IBOI; |
| 2392 pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI; |
| 2393 pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI; |
| 2394 pGRRD->TPGRON = 0; |
| 2395 pGRRD->GRAT[0] = SBRAT[0]; |
| 2396 pGRRD->GRAT[1] = SBRAT[1]; |
| 2397 pGRRD->GRAT[2] = SBRAT[2]; |
| 2398 pGRRD->GRAT[3] = SBRAT[3]; |
| 2399 IBI = pGRRD->decode(pArithDecoder, grContext); |
| 2400 if (IBI == NULL) { |
| 2401 delete pGRRD; |
| 2402 goto failed; |
| 2403 } |
| 2404 delete pGRRD; |
| 2405 } |
| 2406 WI = IBI->m_nWidth; |
| 2407 HI = IBI->m_nHeight; |
| 2408 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) || |
| 2409 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
| 2410 CURS = CURS + WI - 1; |
| 2411 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) || |
| 2412 (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
| 2413 CURS = CURS + HI - 1; |
| 2414 } |
| 2415 SI = CURS; |
| 2416 if (TRANSPOSED == 0) { |
| 2417 switch (REFCORNER) { |
| 2418 case JBIG2_CORNER_TOPLEFT: |
| 2419 SBREG->composeFrom(SI, TI, IBI, SBCOMBOP); |
| 2420 break; |
| 2421 case JBIG2_CORNER_TOPRIGHT: |
| 2422 SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP); |
| 2423 break; |
| 2424 case JBIG2_CORNER_BOTTOMLEFT: |
| 2425 SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP); |
| 2426 break; |
| 2427 case JBIG2_CORNER_BOTTOMRIGHT: |
| 2428 SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP); |
| 2429 break; |
| 2430 } |
| 2431 } else { |
| 2432 switch (REFCORNER) { |
| 2433 case JBIG2_CORNER_TOPLEFT: |
| 2434 SBREG->composeFrom(TI, SI, IBI, SBCOMBOP); |
| 2435 break; |
| 2436 case JBIG2_CORNER_TOPRIGHT: |
| 2437 SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP); |
| 2438 break; |
| 2439 case JBIG2_CORNER_BOTTOMLEFT: |
| 2440 SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP); |
| 2441 break; |
| 2442 case JBIG2_CORNER_BOTTOMRIGHT: |
| 2443 SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP); |
| 2444 break; |
| 2445 } |
| 2446 } |
| 2447 if (RI != 0) { |
| 2448 delete IBI; |
| 2449 } |
| 2450 if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || |
| 2451 (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { |
| 2452 CURS = CURS + WI - 1; |
| 2453 } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || |
| 2454 (REFCORNER == JBIG2_CORNER_TOPRIGHT))) { |
| 2455 CURS = CURS + HI - 1; |
| 2456 } |
| 2457 NINSTANCES = NINSTANCES + 1; |
2585 } | 2458 } |
2586 EXINDEX = 0; | 2459 } |
2587 CUREXFLAG = 0; | 2460 if (bRetained == FALSE) { |
2588 EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS +
SDNUMNEWSYMS)); | |
2589 while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { | |
2590 if(IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) { | |
2591 m_pModule->JBig2_Free(EXFLAGS); | |
2592 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith)
: too short."); | |
2593 goto failed; | |
2594 } | |
2595 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { | |
2596 m_pModule->JBig2_Free(EXFLAGS); | |
2597 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith)
: Invalid EXRUNLENGTH value."); | |
2598 goto failed; | |
2599 } | |
2600 if(EXRUNLENGTH != 0) { | |
2601 for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { | |
2602 EXFLAGS[I] = CUREXFLAG; | |
2603 } | |
2604 } | |
2605 EXINDEX = EXINDEX + EXRUNLENGTH; | |
2606 CUREXFLAG = !CUREXFLAG; | |
2607 } | |
2608 JBIG2_ALLOC(pDict, CJBig2_SymbolDict()); | |
2609 pDict->SDNUMEXSYMS = SDNUMEXSYMS; | |
2610 pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Ima
ge*), SDNUMEXSYMS); | |
2611 I = J = 0; | |
2612 for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { | |
2613 if(EXFLAGS[I] && J < SDNUMEXSYMS) { | |
2614 if(I < SDNUMINSYMS) { | |
2615 JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I])); | |
2616 } else { | |
2617 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS]; | |
2618 } | |
2619 J = J + 1; | |
2620 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { | |
2621 delete SDNEWSYMS[I - SDNUMINSYMS]; | |
2622 } | |
2623 } | |
2624 if (J < SDNUMEXSYMS) { | |
2625 pDict->SDNUMEXSYMS = J; | |
2626 } | |
2627 m_pModule->JBig2_Free(EXFLAGS); | |
2628 m_pModule->JBig2_Free(SDNEWSYMS); | |
2629 delete IADH; | |
2630 delete IADW; | |
2631 delete IAAI; | |
2632 delete IARDX; | |
2633 delete IARDY; | |
2634 delete IAEX; | |
2635 delete IAID; | |
2636 delete IADT; | 2461 delete IADT; |
2637 delete IAFS; | 2462 delete IAFS; |
2638 delete IADS; | 2463 delete IADS; |
2639 delete IAIT; | 2464 delete IAIT; |
2640 delete IARI; | 2465 delete IARI; |
2641 delete IARDW; | 2466 delete IARDW; |
2642 delete IARDH; | 2467 delete IARDH; |
2643 return pDict; | |
2644 failed: | |
2645 for(I = 0; I < NSYMSDECODED; I++) { | |
2646 if (SDNEWSYMS[I]) { | |
2647 delete SDNEWSYMS[I]; | |
2648 SDNEWSYMS[I] = NULL; | |
2649 } | |
2650 } | |
2651 m_pModule->JBig2_Free(SDNEWSYMS); | |
2652 delete IADH; | |
2653 delete IADW; | |
2654 delete IAAI; | |
2655 delete IARDX; | 2468 delete IARDX; |
2656 delete IARDY; | 2469 delete IARDY; |
2657 delete IAEX; | |
2658 delete IAID; | 2470 delete IAID; |
| 2471 } |
| 2472 return SBREG; |
| 2473 failed: |
| 2474 if (bRetained == FALSE) { |
2659 delete IADT; | 2475 delete IADT; |
2660 delete IAFS; | 2476 delete IAFS; |
2661 delete IADS; | 2477 delete IADS; |
2662 delete IAIT; | 2478 delete IAIT; |
2663 delete IARI; | 2479 delete IARI; |
2664 delete IARDW; | 2480 delete IARDW; |
2665 delete IARDH; | 2481 delete IARDH; |
| 2482 delete IARDX; |
| 2483 delete IARDY; |
| 2484 delete IAID; |
| 2485 } |
| 2486 delete SBREG; |
| 2487 return NULL; |
| 2488 } |
| 2489 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith( |
| 2490 CJBig2_ArithDecoder* pArithDecoder, |
| 2491 JBig2ArithCtx* gbContext, |
| 2492 JBig2ArithCtx* grContext) { |
| 2493 CJBig2_Image** SDNEWSYMS; |
| 2494 FX_DWORD HCHEIGHT, NSYMSDECODED; |
| 2495 int32_t HCDH; |
| 2496 FX_DWORD SYMWIDTH, TOTWIDTH; |
| 2497 int32_t DW; |
| 2498 CJBig2_Image* BS; |
| 2499 FX_DWORD I, J, REFAGGNINST; |
| 2500 FX_BOOL* EXFLAGS; |
| 2501 FX_DWORD EXINDEX; |
| 2502 FX_BOOL CUREXFLAG; |
| 2503 FX_DWORD EXRUNLENGTH; |
| 2504 int32_t nVal; |
| 2505 FX_DWORD nTmp; |
| 2506 FX_DWORD SBNUMSYMS; |
| 2507 uint8_t SBSYMCODELEN; |
| 2508 FX_DWORD IDI; |
| 2509 int32_t RDXI, RDYI; |
| 2510 CJBig2_Image** SBSYMS; |
| 2511 CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, |
| 2512 *SBHUFFRDX, *SBHUFFRDY, *SBHUFFRSIZE; |
| 2513 CJBig2_GRRDProc* pGRRD; |
| 2514 CJBig2_GRDProc* pGRD; |
| 2515 CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX, *IADT, |
| 2516 *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH; |
| 2517 CJBig2_ArithIaidDecoder* IAID; |
| 2518 CJBig2_SymbolDict* pDict; |
| 2519 JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder()); |
| 2520 JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder()); |
| 2521 JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder()); |
| 2522 JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder()); |
| 2523 JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder()); |
| 2524 JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder()); |
| 2525 JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder()); |
| 2526 JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder()); |
| 2527 JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder()); |
| 2528 JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder()); |
| 2529 JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder()); |
| 2530 JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder()); |
| 2531 JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder()); |
| 2532 nTmp = 0; |
| 2533 while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { |
| 2534 nTmp++; |
| 2535 } |
| 2536 JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((uint8_t)nTmp)); |
| 2537 SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, |
| 2538 sizeof(CJBig2_Image*)); |
| 2539 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
| 2540 HCHEIGHT = 0; |
| 2541 NSYMSDECODED = 0; |
| 2542 while (NSYMSDECODED < SDNUMNEWSYMS) { |
| 2543 BS = NULL; |
| 2544 if (IADH->decode(pArithDecoder, &HCDH) == -1) { |
| 2545 m_pModule->JBig2_Error( |
| 2546 "symbol dictionary decoding procedure (arith): too short."); |
| 2547 goto failed; |
| 2548 } |
| 2549 HCHEIGHT = HCHEIGHT + HCDH; |
| 2550 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { |
| 2551 m_pModule->JBig2_Error( |
| 2552 "symbol dictionary decoding procedure (arith): invalid HCHEIGHT " |
| 2553 "value."); |
| 2554 goto failed; |
| 2555 } |
| 2556 SYMWIDTH = 0; |
| 2557 TOTWIDTH = 0; |
| 2558 for (;;) { |
| 2559 nVal = IADW->decode(pArithDecoder, &DW); |
| 2560 if (nVal == JBIG2_OOB) { |
| 2561 break; |
| 2562 } else if (nVal != 0) { |
| 2563 m_pModule->JBig2_Error( |
| 2564 "symbol dictionary decoding procedure (arith): too short."); |
| 2565 goto failed; |
| 2566 } else { |
| 2567 if (NSYMSDECODED >= SDNUMNEWSYMS) { |
| 2568 m_pModule->JBig2_Error( |
| 2569 "symbol dictionary decoding procedure (arith): NSYMSDECODED >= " |
| 2570 "SDNUMNEWSYMS."); |
| 2571 goto failed; |
| 2572 } |
| 2573 SYMWIDTH = SYMWIDTH + DW; |
| 2574 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { |
| 2575 m_pModule->JBig2_Error( |
| 2576 "symbol dictionary decoding procedure (arith): invalid SYMWIDTH " |
| 2577 "value."); |
| 2578 goto failed; |
| 2579 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { |
| 2580 TOTWIDTH = TOTWIDTH + SYMWIDTH; |
| 2581 SDNEWSYMS[NSYMSDECODED] = NULL; |
| 2582 NSYMSDECODED = NSYMSDECODED + 1; |
| 2583 continue; |
| 2584 } |
| 2585 TOTWIDTH = TOTWIDTH + SYMWIDTH; |
| 2586 } |
| 2587 if (SDREFAGG == 0) { |
| 2588 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
| 2589 pGRD->MMR = 0; |
| 2590 pGRD->GBW = SYMWIDTH; |
| 2591 pGRD->GBH = HCHEIGHT; |
| 2592 pGRD->GBTEMPLATE = SDTEMPLATE; |
| 2593 pGRD->TPGDON = 0; |
| 2594 pGRD->USESKIP = 0; |
| 2595 pGRD->GBAT[0] = SDAT[0]; |
| 2596 pGRD->GBAT[1] = SDAT[1]; |
| 2597 pGRD->GBAT[2] = SDAT[2]; |
| 2598 pGRD->GBAT[3] = SDAT[3]; |
| 2599 pGRD->GBAT[4] = SDAT[4]; |
| 2600 pGRD->GBAT[5] = SDAT[5]; |
| 2601 pGRD->GBAT[6] = SDAT[6]; |
| 2602 pGRD->GBAT[7] = SDAT[7]; |
| 2603 BS = pGRD->decode_Arith(pArithDecoder, gbContext); |
| 2604 if (BS == NULL) { |
| 2605 delete pGRD; |
| 2606 goto failed; |
| 2607 } |
| 2608 delete pGRD; |
| 2609 } else { |
| 2610 if (IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) { |
| 2611 m_pModule->JBig2_Error( |
| 2612 "symbol dictionary decoding procedure (arith): too short."); |
| 2613 goto failed; |
| 2614 } |
| 2615 if (REFAGGNINST > 1) { |
| 2616 CJBig2_TRDProc* pDecoder; |
| 2617 JBIG2_ALLOC(pDecoder, CJBig2_TRDProc()); |
| 2618 pDecoder->SBHUFF = SDHUFF; |
| 2619 pDecoder->SBREFINE = 1; |
| 2620 pDecoder->SBW = SYMWIDTH; |
| 2621 pDecoder->SBH = HCHEIGHT; |
| 2622 pDecoder->SBNUMINSTANCES = REFAGGNINST; |
| 2623 pDecoder->SBSTRIPS = 1; |
| 2624 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
| 2625 SBNUMSYMS = pDecoder->SBNUMSYMS; |
| 2626 nTmp = 0; |
| 2627 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
| 2628 nTmp++; |
| 2629 } |
| 2630 SBSYMCODELEN = (uint8_t)nTmp; |
| 2631 pDecoder->SBSYMCODELEN = SBSYMCODELEN; |
| 2632 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
| 2633 SBNUMSYMS, sizeof(CJBig2_Image*)); |
| 2634 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| 2635 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
| 2636 NSYMSDECODED * sizeof(CJBig2_Image*)); |
| 2637 pDecoder->SBSYMS = SBSYMS; |
| 2638 pDecoder->SBDEFPIXEL = 0; |
| 2639 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
| 2640 pDecoder->TRANSPOSED = 0; |
| 2641 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
| 2642 pDecoder->SBDSOFFSET = 0; |
| 2643 JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6, |
| 2644 sizeof(HuffmanTable_B6) / |
| 2645 sizeof(JBig2TableLine), |
| 2646 HuffmanTable_HTOOB_B6)); |
| 2647 JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8, |
| 2648 sizeof(HuffmanTable_B8) / |
| 2649 sizeof(JBig2TableLine), |
| 2650 HuffmanTable_HTOOB_B8)); |
| 2651 JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11, |
| 2652 sizeof(HuffmanTable_B11) / |
| 2653 sizeof(JBig2TableLine), |
| 2654 HuffmanTable_HTOOB_B11)); |
| 2655 JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15, |
| 2656 sizeof(HuffmanTable_B15) / |
| 2657 sizeof(JBig2TableLine), |
| 2658 HuffmanTable_HTOOB_B15)); |
| 2659 JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15, |
| 2660 sizeof(HuffmanTable_B15) / |
| 2661 sizeof(JBig2TableLine), |
| 2662 HuffmanTable_HTOOB_B15)); |
| 2663 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, |
| 2664 sizeof(HuffmanTable_B15) / |
| 2665 sizeof(JBig2TableLine), |
| 2666 HuffmanTable_HTOOB_B15)); |
| 2667 JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15, |
| 2668 sizeof(HuffmanTable_B15) / |
| 2669 sizeof(JBig2TableLine), |
| 2670 HuffmanTable_HTOOB_B15)); |
| 2671 JBIG2_ALLOC(SBHUFFRSIZE, |
| 2672 CJBig2_HuffmanTable( |
| 2673 HuffmanTable_B1, |
| 2674 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), |
| 2675 HuffmanTable_HTOOB_B1)); |
| 2676 pDecoder->SBHUFFFS = SBHUFFFS; |
| 2677 pDecoder->SBHUFFDS = SBHUFFDS; |
| 2678 pDecoder->SBHUFFDT = SBHUFFDT; |
| 2679 pDecoder->SBHUFFRDW = SBHUFFRDW; |
| 2680 pDecoder->SBHUFFRDH = SBHUFFRDH; |
| 2681 pDecoder->SBHUFFRDX = SBHUFFRDX; |
| 2682 pDecoder->SBHUFFRDY = SBHUFFRDY; |
| 2683 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE; |
| 2684 pDecoder->SBRTEMPLATE = SDRTEMPLATE; |
| 2685 pDecoder->SBRAT[0] = SDRAT[0]; |
| 2686 pDecoder->SBRAT[1] = SDRAT[1]; |
| 2687 pDecoder->SBRAT[2] = SDRAT[2]; |
| 2688 pDecoder->SBRAT[3] = SDRAT[3]; |
| 2689 JBig2IntDecoderState ids; |
| 2690 ids.IADT = IADT; |
| 2691 ids.IAFS = IAFS; |
| 2692 ids.IADS = IADS; |
| 2693 ids.IAIT = IAIT; |
| 2694 ids.IARI = IARI; |
| 2695 ids.IARDW = IARDW; |
| 2696 ids.IARDH = IARDH; |
| 2697 ids.IARDX = IARDX; |
| 2698 ids.IARDY = IARDY; |
| 2699 ids.IAID = IAID; |
| 2700 BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids); |
| 2701 if (BS == NULL) { |
| 2702 m_pModule->JBig2_Free(SBSYMS); |
| 2703 delete SBHUFFFS; |
| 2704 delete SBHUFFDS; |
| 2705 delete SBHUFFDT; |
| 2706 delete SBHUFFRDW; |
| 2707 delete SBHUFFRDH; |
| 2708 delete SBHUFFRDX; |
| 2709 delete SBHUFFRDY; |
| 2710 delete SBHUFFRSIZE; |
| 2711 delete pDecoder; |
| 2712 goto failed; |
| 2713 } |
| 2714 m_pModule->JBig2_Free(SBSYMS); |
| 2715 delete SBHUFFFS; |
| 2716 delete SBHUFFDS; |
| 2717 delete SBHUFFDT; |
| 2718 delete SBHUFFRDW; |
| 2719 delete SBHUFFRDH; |
| 2720 delete SBHUFFRDX; |
| 2721 delete SBHUFFRDY; |
| 2722 delete SBHUFFRSIZE; |
| 2723 delete pDecoder; |
| 2724 } else if (REFAGGNINST == 1) { |
| 2725 SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
| 2726 if (IAID->decode(pArithDecoder, (int*)&IDI) == -1) { |
| 2727 m_pModule->JBig2_Error( |
| 2728 "symbol dictionary decoding procedure (arith): too short."); |
| 2729 goto failed; |
| 2730 } |
| 2731 if ((IARDX->decode(pArithDecoder, &RDXI) == -1) || |
| 2732 (IARDY->decode(pArithDecoder, &RDYI) == -1)) { |
| 2733 m_pModule->JBig2_Error( |
| 2734 "symbol dictionary decoding procedure (arith): too short."); |
| 2735 goto failed; |
| 2736 } |
| 2737 if (IDI >= SBNUMSYMS) { |
| 2738 m_pModule->JBig2_Error( |
| 2739 "symbol dictionary decoding procedure (arith):" |
| 2740 " refinement references unknown symbol %d", |
| 2741 IDI); |
| 2742 goto failed; |
| 2743 } |
| 2744 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
| 2745 SBNUMSYMS, sizeof(CJBig2_Image*)); |
| 2746 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| 2747 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
| 2748 NSYMSDECODED * sizeof(CJBig2_Image*)); |
| 2749 if (!SBSYMS[IDI]) { |
| 2750 m_pModule->JBig2_Free(SBSYMS); |
| 2751 goto failed; |
| 2752 } |
| 2753 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
| 2754 pGRRD->GRW = SYMWIDTH; |
| 2755 pGRRD->GRH = HCHEIGHT; |
| 2756 pGRRD->GRTEMPLATE = SDRTEMPLATE; |
| 2757 pGRRD->GRREFERENCE = SBSYMS[IDI]; |
| 2758 pGRRD->GRREFERENCEDX = RDXI; |
| 2759 pGRRD->GRREFERENCEDY = RDYI; |
| 2760 pGRRD->TPGRON = 0; |
| 2761 pGRRD->GRAT[0] = SDRAT[0]; |
| 2762 pGRRD->GRAT[1] = SDRAT[1]; |
| 2763 pGRRD->GRAT[2] = SDRAT[2]; |
| 2764 pGRRD->GRAT[3] = SDRAT[3]; |
| 2765 BS = pGRRD->decode(pArithDecoder, grContext); |
| 2766 if (BS == NULL) { |
| 2767 m_pModule->JBig2_Free(SBSYMS); |
| 2768 delete pGRRD; |
| 2769 goto failed; |
| 2770 } |
| 2771 m_pModule->JBig2_Free(SBSYMS); |
| 2772 delete pGRRD; |
| 2773 } |
| 2774 } |
| 2775 SDNEWSYMS[NSYMSDECODED] = BS; |
| 2776 BS = NULL; |
| 2777 NSYMSDECODED = NSYMSDECODED + 1; |
| 2778 } |
| 2779 } |
| 2780 EXINDEX = 0; |
| 2781 CUREXFLAG = 0; |
| 2782 EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), |
| 2783 (SDNUMINSYMS + SDNUMNEWSYMS)); |
| 2784 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { |
| 2785 if (IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) { |
| 2786 m_pModule->JBig2_Free(EXFLAGS); |
| 2787 m_pModule->JBig2_Error( |
| 2788 "symbol dictionary decoding procedure (arith): too short."); |
| 2789 goto failed; |
| 2790 } |
| 2791 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { |
| 2792 m_pModule->JBig2_Free(EXFLAGS); |
| 2793 m_pModule->JBig2_Error( |
| 2794 "symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH " |
| 2795 "value."); |
| 2796 goto failed; |
| 2797 } |
| 2798 if (EXRUNLENGTH != 0) { |
| 2799 for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { |
| 2800 EXFLAGS[I] = CUREXFLAG; |
| 2801 } |
| 2802 } |
| 2803 EXINDEX = EXINDEX + EXRUNLENGTH; |
| 2804 CUREXFLAG = !CUREXFLAG; |
| 2805 } |
| 2806 JBIG2_ALLOC(pDict, CJBig2_SymbolDict()); |
| 2807 pDict->SDNUMEXSYMS = SDNUMEXSYMS; |
| 2808 pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
| 2809 sizeof(CJBig2_Image*), SDNUMEXSYMS); |
| 2810 I = J = 0; |
| 2811 for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { |
| 2812 if (EXFLAGS[I] && J < SDNUMEXSYMS) { |
| 2813 if (I < SDNUMINSYMS) { |
| 2814 JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I])); |
| 2815 } else { |
| 2816 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS]; |
| 2817 } |
| 2818 J = J + 1; |
| 2819 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { |
| 2820 delete SDNEWSYMS[I - SDNUMINSYMS]; |
| 2821 } |
| 2822 } |
| 2823 if (J < SDNUMEXSYMS) { |
| 2824 pDict->SDNUMEXSYMS = J; |
| 2825 } |
| 2826 m_pModule->JBig2_Free(EXFLAGS); |
| 2827 m_pModule->JBig2_Free(SDNEWSYMS); |
| 2828 delete IADH; |
| 2829 delete IADW; |
| 2830 delete IAAI; |
| 2831 delete IARDX; |
| 2832 delete IARDY; |
| 2833 delete IAEX; |
| 2834 delete IAID; |
| 2835 delete IADT; |
| 2836 delete IAFS; |
| 2837 delete IADS; |
| 2838 delete IAIT; |
| 2839 delete IARI; |
| 2840 delete IARDW; |
| 2841 delete IARDH; |
| 2842 return pDict; |
| 2843 failed: |
| 2844 for (I = 0; I < NSYMSDECODED; I++) { |
| 2845 if (SDNEWSYMS[I]) { |
| 2846 delete SDNEWSYMS[I]; |
| 2847 SDNEWSYMS[I] = NULL; |
| 2848 } |
| 2849 } |
| 2850 m_pModule->JBig2_Free(SDNEWSYMS); |
| 2851 delete IADH; |
| 2852 delete IADW; |
| 2853 delete IAAI; |
| 2854 delete IARDX; |
| 2855 delete IARDY; |
| 2856 delete IAEX; |
| 2857 delete IAID; |
| 2858 delete IADT; |
| 2859 delete IAFS; |
| 2860 delete IADS; |
| 2861 delete IAIT; |
| 2862 delete IARI; |
| 2863 delete IARDW; |
| 2864 delete IARDH; |
| 2865 return NULL; |
| 2866 } |
| 2867 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream* pStream, |
| 2868 JBig2ArithCtx* gbContext, |
| 2869 JBig2ArithCtx* grContext, |
| 2870 IFX_Pause* pPause) { |
| 2871 CJBig2_Image** SDNEWSYMS; |
| 2872 FX_DWORD* SDNEWSYMWIDTHS; |
| 2873 FX_DWORD HCHEIGHT, NSYMSDECODED; |
| 2874 int32_t HCDH; |
| 2875 FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM; |
| 2876 int32_t DW; |
| 2877 CJBig2_Image *BS, *BHC; |
| 2878 FX_DWORD I, J, REFAGGNINST; |
| 2879 FX_BOOL* EXFLAGS; |
| 2880 FX_DWORD EXINDEX; |
| 2881 FX_BOOL CUREXFLAG; |
| 2882 FX_DWORD EXRUNLENGTH; |
| 2883 int32_t nVal, nBits; |
| 2884 FX_DWORD nTmp; |
| 2885 FX_DWORD SBNUMSYMS; |
| 2886 uint8_t SBSYMCODELEN; |
| 2887 JBig2HuffmanCode* SBSYMCODES; |
| 2888 FX_DWORD IDI; |
| 2889 int32_t RDXI, RDYI; |
| 2890 FX_DWORD BMSIZE; |
| 2891 FX_DWORD stride; |
| 2892 CJBig2_Image** SBSYMS; |
| 2893 CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, |
| 2894 *SBHUFFRDX, *SBHUFFRDY, *SBHUFFRSIZE, *pTable; |
| 2895 CJBig2_HuffmanDecoder* pHuffmanDecoder; |
| 2896 CJBig2_GRRDProc* pGRRD; |
| 2897 CJBig2_ArithDecoder* pArithDecoder; |
| 2898 CJBig2_GRDProc* pGRD; |
| 2899 CJBig2_SymbolDict* pDict; |
| 2900 JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream)); |
| 2901 SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, |
| 2902 sizeof(CJBig2_Image*)); |
| 2903 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
| 2904 SDNEWSYMWIDTHS = NULL; |
| 2905 BHC = NULL; |
| 2906 if (SDREFAGG == 0) { |
| 2907 SDNEWSYMWIDTHS = |
| 2908 (FX_DWORD*)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(FX_DWORD)); |
| 2909 FXSYS_memset(SDNEWSYMWIDTHS, 0, SDNUMNEWSYMS * sizeof(FX_DWORD)); |
| 2910 } |
| 2911 HCHEIGHT = 0; |
| 2912 NSYMSDECODED = 0; |
| 2913 BS = NULL; |
| 2914 while (NSYMSDECODED < SDNUMNEWSYMS) { |
| 2915 if (pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { |
| 2916 m_pModule->JBig2_Error( |
| 2917 "symbol dictionary decoding procedure (huffman): too short."); |
| 2918 goto failed; |
| 2919 } |
| 2920 HCHEIGHT = HCHEIGHT + HCDH; |
| 2921 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { |
| 2922 m_pModule->JBig2_Error( |
| 2923 "symbol dictionary decoding procedure (huffman): invalid HCHEIGHT " |
| 2924 "value."); |
| 2925 goto failed; |
| 2926 } |
| 2927 SYMWIDTH = 0; |
| 2928 TOTWIDTH = 0; |
| 2929 HCFIRSTSYM = NSYMSDECODED; |
| 2930 for (;;) { |
| 2931 nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW); |
| 2932 if (nVal == JBIG2_OOB) { |
| 2933 break; |
| 2934 } else if (nVal != 0) { |
| 2935 m_pModule->JBig2_Error( |
| 2936 "symbol dictionary decoding procedure (huffman): too short."); |
| 2937 goto failed; |
| 2938 } else { |
| 2939 if (NSYMSDECODED >= SDNUMNEWSYMS) { |
| 2940 m_pModule->JBig2_Error( |
| 2941 "symbol dictionary decoding procedure (huffman): NSYMSDECODED >= " |
| 2942 "SDNUMNEWSYMS."); |
| 2943 goto failed; |
| 2944 } |
| 2945 SYMWIDTH = SYMWIDTH + DW; |
| 2946 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { |
| 2947 m_pModule->JBig2_Error( |
| 2948 "symbol dictionary decoding procedure (huffman): invalid " |
| 2949 "SYMWIDTH value."); |
| 2950 goto failed; |
| 2951 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { |
| 2952 TOTWIDTH = TOTWIDTH + SYMWIDTH; |
| 2953 SDNEWSYMS[NSYMSDECODED] = NULL; |
| 2954 NSYMSDECODED = NSYMSDECODED + 1; |
| 2955 continue; |
| 2956 } |
| 2957 TOTWIDTH = TOTWIDTH + SYMWIDTH; |
| 2958 } |
| 2959 if (SDREFAGG == 1) { |
| 2960 if (pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != |
| 2961 0) { |
| 2962 m_pModule->JBig2_Error( |
| 2963 "symbol dictionary decoding procedure (huffman): too short."); |
| 2964 goto failed; |
| 2965 } |
| 2966 BS = NULL; |
| 2967 if (REFAGGNINST > 1) { |
| 2968 CJBig2_TRDProc* pDecoder; |
| 2969 JBIG2_ALLOC(pDecoder, CJBig2_TRDProc()); |
| 2970 pDecoder->SBHUFF = SDHUFF; |
| 2971 pDecoder->SBREFINE = 1; |
| 2972 pDecoder->SBW = SYMWIDTH; |
| 2973 pDecoder->SBH = HCHEIGHT; |
| 2974 pDecoder->SBNUMINSTANCES = REFAGGNINST; |
| 2975 pDecoder->SBSTRIPS = 1; |
| 2976 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
| 2977 SBNUMSYMS = pDecoder->SBNUMSYMS; |
| 2978 SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2( |
| 2979 SBNUMSYMS, sizeof(JBig2HuffmanCode)); |
| 2980 nTmp = 1; |
| 2981 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
| 2982 nTmp++; |
| 2983 } |
| 2984 for (I = 0; I < SBNUMSYMS; I++) { |
| 2985 SBSYMCODES[I].codelen = nTmp; |
| 2986 SBSYMCODES[I].code = I; |
| 2987 } |
| 2988 pDecoder->SBSYMCODES = SBSYMCODES; |
| 2989 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
| 2990 SBNUMSYMS, sizeof(CJBig2_Image*)); |
| 2991 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| 2992 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
| 2993 NSYMSDECODED * sizeof(CJBig2_Image*)); |
| 2994 pDecoder->SBSYMS = SBSYMS; |
| 2995 pDecoder->SBDEFPIXEL = 0; |
| 2996 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
| 2997 pDecoder->TRANSPOSED = 0; |
| 2998 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
| 2999 pDecoder->SBDSOFFSET = 0; |
| 3000 JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6, |
| 3001 sizeof(HuffmanTable_B6) / |
| 3002 sizeof(JBig2TableLine), |
| 3003 HuffmanTable_HTOOB_B6)); |
| 3004 JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8, |
| 3005 sizeof(HuffmanTable_B8) / |
| 3006 sizeof(JBig2TableLine), |
| 3007 HuffmanTable_HTOOB_B8)); |
| 3008 JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11, |
| 3009 sizeof(HuffmanTable_B11) / |
| 3010 sizeof(JBig2TableLine), |
| 3011 HuffmanTable_HTOOB_B11)); |
| 3012 JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15, |
| 3013 sizeof(HuffmanTable_B15) / |
| 3014 sizeof(JBig2TableLine), |
| 3015 HuffmanTable_HTOOB_B15)); |
| 3016 JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15, |
| 3017 sizeof(HuffmanTable_B15) / |
| 3018 sizeof(JBig2TableLine), |
| 3019 HuffmanTable_HTOOB_B15)); |
| 3020 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, |
| 3021 sizeof(HuffmanTable_B15) / |
| 3022 sizeof(JBig2TableLine), |
| 3023 HuffmanTable_HTOOB_B15)); |
| 3024 JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15, |
| 3025 sizeof(HuffmanTable_B15) / |
| 3026 sizeof(JBig2TableLine), |
| 3027 HuffmanTable_HTOOB_B15)); |
| 3028 JBIG2_ALLOC(SBHUFFRSIZE, |
| 3029 CJBig2_HuffmanTable( |
| 3030 HuffmanTable_B1, |
| 3031 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), |
| 3032 HuffmanTable_HTOOB_B1)); |
| 3033 pDecoder->SBHUFFFS = SBHUFFFS; |
| 3034 pDecoder->SBHUFFDS = SBHUFFDS; |
| 3035 pDecoder->SBHUFFDT = SBHUFFDT; |
| 3036 pDecoder->SBHUFFRDW = SBHUFFRDW; |
| 3037 pDecoder->SBHUFFRDH = SBHUFFRDH; |
| 3038 pDecoder->SBHUFFRDX = SBHUFFRDX; |
| 3039 pDecoder->SBHUFFRDY = SBHUFFRDY; |
| 3040 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE; |
| 3041 pDecoder->SBRTEMPLATE = SDRTEMPLATE; |
| 3042 pDecoder->SBRAT[0] = SDRAT[0]; |
| 3043 pDecoder->SBRAT[1] = SDRAT[1]; |
| 3044 pDecoder->SBRAT[2] = SDRAT[2]; |
| 3045 pDecoder->SBRAT[3] = SDRAT[3]; |
| 3046 BS = pDecoder->decode_Huffman(pStream, grContext); |
| 3047 if (BS == NULL) { |
| 3048 m_pModule->JBig2_Free(SBSYMCODES); |
| 3049 m_pModule->JBig2_Free(SBSYMS); |
| 3050 delete SBHUFFFS; |
| 3051 delete SBHUFFDS; |
| 3052 delete SBHUFFDT; |
| 3053 delete SBHUFFRDW; |
| 3054 delete SBHUFFRDH; |
| 3055 delete SBHUFFRDX; |
| 3056 delete SBHUFFRDY; |
| 3057 delete SBHUFFRSIZE; |
| 3058 delete pDecoder; |
| 3059 goto failed; |
| 3060 } |
| 3061 m_pModule->JBig2_Free(SBSYMCODES); |
| 3062 m_pModule->JBig2_Free(SBSYMS); |
| 3063 delete SBHUFFFS; |
| 3064 delete SBHUFFDS; |
| 3065 delete SBHUFFDT; |
| 3066 delete SBHUFFRDW; |
| 3067 delete SBHUFFRDH; |
| 3068 delete SBHUFFRDX; |
| 3069 delete SBHUFFRDY; |
| 3070 delete SBHUFFRSIZE; |
| 3071 delete pDecoder; |
| 3072 } else if (REFAGGNINST == 1) { |
| 3073 SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS; |
| 3074 nTmp = 1; |
| 3075 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
| 3076 nTmp++; |
| 3077 } |
| 3078 SBSYMCODELEN = (uint8_t)nTmp; |
| 3079 SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2( |
| 3080 SBNUMSYMS, sizeof(JBig2HuffmanCode)); |
| 3081 for (I = 0; I < SBNUMSYMS; I++) { |
| 3082 SBSYMCODES[I].codelen = SBSYMCODELEN; |
| 3083 SBSYMCODES[I].code = I; |
| 3084 } |
| 3085 nVal = 0; |
| 3086 nBits = 0; |
| 3087 for (;;) { |
| 3088 if (pStream->read1Bit(&nTmp) != 0) { |
| 3089 m_pModule->JBig2_Free(SBSYMCODES); |
| 3090 m_pModule->JBig2_Error( |
| 3091 "symbol dictionary decoding procedure (huffman): too short."); |
| 3092 goto failed; |
| 3093 } |
| 3094 nVal = (nVal << 1) | nTmp; |
| 3095 for (IDI = 0; IDI < SBNUMSYMS; IDI++) { |
| 3096 if ((nVal == SBSYMCODES[IDI].code) && |
| 3097 (nBits == SBSYMCODES[IDI].codelen)) { |
| 3098 break; |
| 3099 } |
| 3100 } |
| 3101 if (IDI < SBNUMSYMS) { |
| 3102 break; |
| 3103 } |
| 3104 } |
| 3105 m_pModule->JBig2_Free(SBSYMCODES); |
| 3106 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, |
| 3107 sizeof(HuffmanTable_B15) / |
| 3108 sizeof(JBig2TableLine), |
| 3109 HuffmanTable_HTOOB_B15)); |
| 3110 JBIG2_ALLOC(SBHUFFRSIZE, |
| 3111 CJBig2_HuffmanTable( |
| 3112 HuffmanTable_B1, |
| 3113 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), |
| 3114 HuffmanTable_HTOOB_B1)); |
| 3115 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) || |
| 3116 (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0) || |
| 3117 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) { |
| 3118 delete SBHUFFRDX; |
| 3119 delete SBHUFFRSIZE; |
| 3120 m_pModule->JBig2_Error( |
| 3121 "symbol dictionary decoding procedure (huffman): too short."); |
| 3122 goto failed; |
| 3123 } |
| 3124 delete SBHUFFRDX; |
| 3125 delete SBHUFFRSIZE; |
| 3126 pStream->alignByte(); |
| 3127 nTmp = pStream->getOffset(); |
| 3128 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
| 3129 SBNUMSYMS, sizeof(CJBig2_Image*)); |
| 3130 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| 3131 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
| 3132 NSYMSDECODED * sizeof(CJBig2_Image*)); |
| 3133 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
| 3134 pGRRD->GRW = SYMWIDTH; |
| 3135 pGRRD->GRH = HCHEIGHT; |
| 3136 pGRRD->GRTEMPLATE = SDRTEMPLATE; |
| 3137 pGRRD->GRREFERENCE = SBSYMS[IDI]; |
| 3138 pGRRD->GRREFERENCEDX = RDXI; |
| 3139 pGRRD->GRREFERENCEDY = RDYI; |
| 3140 pGRRD->TPGRON = 0; |
| 3141 pGRRD->GRAT[0] = SDRAT[0]; |
| 3142 pGRRD->GRAT[1] = SDRAT[1]; |
| 3143 pGRRD->GRAT[2] = SDRAT[2]; |
| 3144 pGRRD->GRAT[3] = SDRAT[3]; |
| 3145 JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream)); |
| 3146 BS = pGRRD->decode(pArithDecoder, grContext); |
| 3147 if (BS == NULL) { |
| 3148 m_pModule->JBig2_Free(SBSYMS); |
| 3149 delete pGRRD; |
| 3150 delete pArithDecoder; |
| 3151 goto failed; |
| 3152 } |
| 3153 pStream->alignByte(); |
| 3154 pStream->offset(2); |
| 3155 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { |
| 3156 delete BS; |
| 3157 m_pModule->JBig2_Free(SBSYMS); |
| 3158 delete pGRRD; |
| 3159 delete pArithDecoder; |
| 3160 m_pModule->JBig2_Error( |
| 3161 "symbol dictionary decoding procedure (huffman):" |
| 3162 "bytes processed by generic refinement region decoding " |
| 3163 "procedure doesn't equal SBHUFFRSIZE."); |
| 3164 goto failed; |
| 3165 } |
| 3166 m_pModule->JBig2_Free(SBSYMS); |
| 3167 delete pGRRD; |
| 3168 delete pArithDecoder; |
| 3169 } |
| 3170 SDNEWSYMS[NSYMSDECODED] = BS; |
| 3171 } |
| 3172 if (SDREFAGG == 0) { |
| 3173 SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH; |
| 3174 } |
| 3175 NSYMSDECODED = NSYMSDECODED + 1; |
| 3176 } |
| 3177 if (SDREFAGG == 0) { |
| 3178 if (pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (int32_t*)&BMSIZE) != 0) { |
| 3179 m_pModule->JBig2_Error( |
| 3180 "symbol dictionary decoding procedure (huffman): too short."); |
| 3181 goto failed; |
| 3182 } |
| 3183 pStream->alignByte(); |
| 3184 if (BMSIZE == 0) { |
| 3185 stride = (TOTWIDTH + 7) >> 3; |
| 3186 if (pStream->getByteLeft() >= stride * HCHEIGHT) { |
| 3187 JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT)); |
| 3188 for (I = 0; I < HCHEIGHT; I++) { |
| 3189 JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, |
| 3190 pStream->getPointer(), stride); |
| 3191 pStream->offset(stride); |
| 3192 } |
| 3193 } else { |
| 3194 m_pModule->JBig2_Error( |
| 3195 "symbol dictionary decoding procedure (huffman): too short."); |
| 3196 goto failed; |
| 3197 } |
| 3198 } else { |
| 3199 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
| 3200 pGRD->MMR = 1; |
| 3201 pGRD->GBW = TOTWIDTH; |
| 3202 pGRD->GBH = HCHEIGHT; |
| 3203 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream); |
| 3204 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
| 3205 pGRD->Continue_decode(pPause); |
| 3206 } |
| 3207 delete pGRD; |
| 3208 pStream->alignByte(); |
| 3209 } |
| 3210 nTmp = 0; |
| 3211 if (!BHC) { |
| 3212 continue; |
| 3213 } |
| 3214 for (I = HCFIRSTSYM; I < NSYMSDECODED; I++) { |
| 3215 SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT); |
| 3216 nTmp += SDNEWSYMWIDTHS[I]; |
| 3217 } |
| 3218 delete BHC; |
| 3219 BHC = NULL; |
| 3220 } |
| 3221 } |
| 3222 EXINDEX = 0; |
| 3223 CUREXFLAG = 0; |
| 3224 JBIG2_ALLOC(pTable, CJBig2_HuffmanTable( |
| 3225 HuffmanTable_B1, |
| 3226 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), |
| 3227 HuffmanTable_HTOOB_B1)); |
| 3228 EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), |
| 3229 (SDNUMINSYMS + SDNUMNEWSYMS)); |
| 3230 while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { |
| 3231 if (pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) { |
| 3232 delete pTable; |
| 3233 m_pModule->JBig2_Free(EXFLAGS); |
| 3234 m_pModule->JBig2_Error( |
| 3235 "symbol dictionary decoding procedure (huffman): too short."); |
| 3236 goto failed; |
| 3237 } |
| 3238 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { |
| 3239 delete pTable; |
| 3240 m_pModule->JBig2_Free(EXFLAGS); |
| 3241 m_pModule->JBig2_Error( |
| 3242 "symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH " |
| 3243 "value."); |
| 3244 goto failed; |
| 3245 } |
| 3246 if (EXRUNLENGTH != 0) { |
| 3247 for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { |
| 3248 EXFLAGS[I] = CUREXFLAG; |
| 3249 } |
| 3250 } |
| 3251 EXINDEX = EXINDEX + EXRUNLENGTH; |
| 3252 CUREXFLAG = !CUREXFLAG; |
| 3253 } |
| 3254 delete pTable; |
| 3255 JBIG2_ALLOC(pDict, CJBig2_SymbolDict()); |
| 3256 pDict->SDNUMEXSYMS = SDNUMEXSYMS; |
| 3257 pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
| 3258 sizeof(CJBig2_Image*), SDNUMEXSYMS); |
| 3259 I = J = 0; |
| 3260 for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { |
| 3261 if (EXFLAGS[I] && J < SDNUMEXSYMS) { |
| 3262 if (I < SDNUMINSYMS) { |
| 3263 JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I])); |
| 3264 } else { |
| 3265 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS]; |
| 3266 } |
| 3267 J = J + 1; |
| 3268 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { |
| 3269 delete SDNEWSYMS[I - SDNUMINSYMS]; |
| 3270 } |
| 3271 } |
| 3272 if (J < SDNUMEXSYMS) { |
| 3273 pDict->SDNUMEXSYMS = J; |
| 3274 } |
| 3275 m_pModule->JBig2_Free(EXFLAGS); |
| 3276 m_pModule->JBig2_Free(SDNEWSYMS); |
| 3277 if (SDREFAGG == 0) { |
| 3278 m_pModule->JBig2_Free(SDNEWSYMWIDTHS); |
| 3279 } |
| 3280 delete pHuffmanDecoder; |
| 3281 return pDict; |
| 3282 failed: |
| 3283 for (I = 0; I < NSYMSDECODED; I++) { |
| 3284 delete SDNEWSYMS[I]; |
| 3285 } |
| 3286 m_pModule->JBig2_Free(SDNEWSYMS); |
| 3287 if (SDREFAGG == 0) { |
| 3288 m_pModule->JBig2_Free(SDNEWSYMWIDTHS); |
| 3289 } |
| 3290 delete pHuffmanDecoder; |
| 3291 return NULL; |
| 3292 } |
| 3293 CJBig2_Image* CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, |
| 3294 JBig2ArithCtx* gbContext, |
| 3295 IFX_Pause* pPause) { |
| 3296 FX_DWORD ng, mg; |
| 3297 int32_t x, y; |
| 3298 CJBig2_Image* HSKIP; |
| 3299 FX_DWORD HBPP; |
| 3300 FX_DWORD* GI; |
| 3301 CJBig2_Image* HTREG; |
| 3302 CJBig2_GSIDProc* pGID; |
| 3303 JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH)); |
| 3304 HTREG->fill(HDEFPIXEL); |
| 3305 HSKIP = NULL; |
| 3306 if (HENABLESKIP == 1) { |
| 3307 JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH)); |
| 3308 for (mg = 0; mg < HGH; mg++) { |
| 3309 for (ng = 0; ng < HGW; ng++) { |
| 3310 x = (HGX + mg * HRY + ng * HRX) >> 8; |
| 3311 y = (HGY + mg * HRX - ng * HRY) >> 8; |
| 3312 if ((x + HPW <= 0) | (x >= (int32_t)HBW) | (y + HPH <= 0) | |
| 3313 (y >= (int32_t)HPH)) { |
| 3314 HSKIP->setPixel(ng, mg, 1); |
| 3315 } else { |
| 3316 HSKIP->setPixel(ng, mg, 0); |
| 3317 } |
| 3318 } |
| 3319 } |
| 3320 } |
| 3321 HBPP = 1; |
| 3322 while ((FX_DWORD)(1 << HBPP) < HNUMPATS) { |
| 3323 HBPP++; |
| 3324 } |
| 3325 JBIG2_ALLOC(pGID, CJBig2_GSIDProc()); |
| 3326 pGID->GSMMR = HMMR; |
| 3327 pGID->GSW = HGW; |
| 3328 pGID->GSH = HGH; |
| 3329 pGID->GSBPP = (uint8_t)HBPP; |
| 3330 pGID->GSUSESKIP = HENABLESKIP; |
| 3331 pGID->GSKIP = HSKIP; |
| 3332 pGID->GSTEMPLATE = HTEMPLATE; |
| 3333 GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause); |
| 3334 if (GI == NULL) { |
| 3335 goto failed; |
| 3336 } |
| 3337 for (mg = 0; mg < HGH; mg++) { |
| 3338 for (ng = 0; ng < HGW; ng++) { |
| 3339 x = (HGX + mg * HRY + ng * HRX) >> 8; |
| 3340 y = (HGY + mg * HRX - ng * HRY) >> 8; |
| 3341 FX_DWORD pat_index = GI[mg * HGW + ng]; |
| 3342 if (pat_index >= HNUMPATS) { |
| 3343 pat_index = HNUMPATS - 1; |
| 3344 } |
| 3345 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); |
| 3346 } |
| 3347 } |
| 3348 m_pModule->JBig2_Free(GI); |
| 3349 delete HSKIP; |
| 3350 delete pGID; |
| 3351 return HTREG; |
| 3352 failed: |
| 3353 delete HSKIP; |
| 3354 delete pGID; |
| 3355 delete HTREG; |
| 3356 return NULL; |
| 3357 } |
| 3358 CJBig2_Image* CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream* pStream, |
| 3359 IFX_Pause* pPause) { |
| 3360 FX_DWORD ng, mg; |
| 3361 int32_t x, y; |
| 3362 FX_DWORD HBPP; |
| 3363 FX_DWORD* GI; |
| 3364 CJBig2_Image* HTREG; |
| 3365 CJBig2_GSIDProc* pGID; |
| 3366 JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH)); |
| 3367 HTREG->fill(HDEFPIXEL); |
| 3368 HBPP = 1; |
| 3369 while ((FX_DWORD)(1 << HBPP) < HNUMPATS) { |
| 3370 HBPP++; |
| 3371 } |
| 3372 JBIG2_ALLOC(pGID, CJBig2_GSIDProc()); |
| 3373 pGID->GSMMR = HMMR; |
| 3374 pGID->GSW = HGW; |
| 3375 pGID->GSH = HGH; |
| 3376 pGID->GSBPP = (uint8_t)HBPP; |
| 3377 pGID->GSUSESKIP = 0; |
| 3378 GI = pGID->decode_MMR(pStream, pPause); |
| 3379 if (GI == NULL) { |
| 3380 goto failed; |
| 3381 } |
| 3382 for (mg = 0; mg < HGH; mg++) { |
| 3383 for (ng = 0; ng < HGW; ng++) { |
| 3384 x = (HGX + mg * HRY + ng * HRX) >> 8; |
| 3385 y = (HGY + mg * HRX - ng * HRY) >> 8; |
| 3386 FX_DWORD pat_index = GI[mg * HGW + ng]; |
| 3387 if (pat_index >= HNUMPATS) { |
| 3388 pat_index = HNUMPATS - 1; |
| 3389 } |
| 3390 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); |
| 3391 } |
| 3392 } |
| 3393 m_pModule->JBig2_Free(GI); |
| 3394 delete pGID; |
| 3395 return HTREG; |
| 3396 failed: |
| 3397 delete pGID; |
| 3398 delete HTREG; |
| 3399 return NULL; |
| 3400 } |
| 3401 CJBig2_PatternDict* CJBig2_PDDProc::decode_Arith( |
| 3402 CJBig2_ArithDecoder* pArithDecoder, |
| 3403 JBig2ArithCtx* gbContext, |
| 3404 IFX_Pause* pPause) { |
| 3405 FX_DWORD GRAY; |
| 3406 CJBig2_Image* BHDC = NULL; |
| 3407 CJBig2_PatternDict* pDict; |
| 3408 CJBig2_GRDProc* pGRD; |
| 3409 JBIG2_ALLOC(pDict, CJBig2_PatternDict()); |
| 3410 pDict->NUMPATS = GRAYMAX + 1; |
| 3411 pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
| 3412 sizeof(CJBig2_Image*), pDict->NUMPATS); |
| 3413 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS); |
| 3414 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
| 3415 pGRD->MMR = HDMMR; |
| 3416 pGRD->GBW = (GRAYMAX + 1) * HDPW; |
| 3417 pGRD->GBH = HDPH; |
| 3418 pGRD->GBTEMPLATE = HDTEMPLATE; |
| 3419 pGRD->TPGDON = 0; |
| 3420 pGRD->USESKIP = 0; |
| 3421 pGRD->GBAT[0] = -(int32_t)HDPW; |
| 3422 pGRD->GBAT[1] = 0; |
| 3423 if (pGRD->GBTEMPLATE == 0) { |
| 3424 pGRD->GBAT[2] = -3; |
| 3425 pGRD->GBAT[3] = -1; |
| 3426 pGRD->GBAT[4] = 2; |
| 3427 pGRD->GBAT[5] = -2; |
| 3428 pGRD->GBAT[6] = -2; |
| 3429 pGRD->GBAT[7] = -2; |
| 3430 } |
| 3431 FXCODEC_STATUS status = |
| 3432 pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext); |
| 3433 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
| 3434 pGRD->Continue_decode(pPause); |
| 3435 } |
| 3436 if (BHDC == NULL) { |
| 3437 delete pGRD; |
| 3438 goto failed; |
| 3439 } |
| 3440 delete pGRD; |
| 3441 GRAY = 0; |
| 3442 while (GRAY <= GRAYMAX) { |
| 3443 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); |
| 3444 GRAY = GRAY + 1; |
| 3445 } |
| 3446 delete BHDC; |
| 3447 return pDict; |
| 3448 failed: |
| 3449 delete pDict; |
| 3450 return NULL; |
| 3451 } |
| 3452 |
| 3453 CJBig2_PatternDict* CJBig2_PDDProc::decode_MMR(CJBig2_BitStream* pStream, |
| 3454 IFX_Pause* pPause) { |
| 3455 FX_DWORD GRAY; |
| 3456 CJBig2_Image* BHDC = NULL; |
| 3457 CJBig2_PatternDict* pDict; |
| 3458 CJBig2_GRDProc* pGRD; |
| 3459 JBIG2_ALLOC(pDict, CJBig2_PatternDict()); |
| 3460 pDict->NUMPATS = GRAYMAX + 1; |
| 3461 pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
| 3462 sizeof(CJBig2_Image*), pDict->NUMPATS); |
| 3463 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS); |
| 3464 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
| 3465 pGRD->MMR = HDMMR; |
| 3466 pGRD->GBW = (GRAYMAX + 1) * HDPW; |
| 3467 pGRD->GBH = HDPH; |
| 3468 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream); |
| 3469 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
| 3470 pGRD->Continue_decode(pPause); |
| 3471 } |
| 3472 if (BHDC == NULL) { |
| 3473 delete pGRD; |
| 3474 goto failed; |
| 3475 } |
| 3476 delete pGRD; |
| 3477 GRAY = 0; |
| 3478 while (GRAY <= GRAYMAX) { |
| 3479 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); |
| 3480 GRAY = GRAY + 1; |
| 3481 } |
| 3482 delete BHDC; |
| 3483 return pDict; |
| 3484 failed: |
| 3485 delete pDict; |
| 3486 return NULL; |
| 3487 } |
| 3488 FX_DWORD* CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, |
| 3489 JBig2ArithCtx* gbContext, |
| 3490 IFX_Pause* pPause) { |
| 3491 CJBig2_Image** GSPLANES; |
| 3492 int32_t J, K; |
| 3493 FX_DWORD x, y; |
| 3494 FX_DWORD* GSVALS; |
| 3495 CJBig2_GRDProc* pGRD; |
| 3496 GSPLANES = |
| 3497 (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP); |
| 3498 if (!GSPLANES) { |
2666 return NULL; | 3499 return NULL; |
2667 } | 3500 } |
2668 CJBig2_SymbolDict *CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream *pStream, | 3501 GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH); |
2669 JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause) | 3502 if (!GSVALS) { |
2670 { | 3503 m_pModule->JBig2_Free(GSPLANES); |
2671 CJBig2_Image **SDNEWSYMS; | 3504 return NULL; |
2672 FX_DWORD *SDNEWSYMWIDTHS; | 3505 } |
2673 FX_DWORD HCHEIGHT, NSYMSDECODED; | 3506 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP); |
2674 int32_t HCDH; | 3507 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH); |
2675 FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM; | 3508 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
2676 int32_t DW; | 3509 pGRD->MMR = GSMMR; |
2677 CJBig2_Image *BS, *BHC; | 3510 pGRD->GBW = GSW; |
2678 FX_DWORD I, J, REFAGGNINST; | 3511 pGRD->GBH = GSH; |
2679 FX_BOOL *EXFLAGS; | 3512 pGRD->GBTEMPLATE = GSTEMPLATE; |
2680 FX_DWORD EXINDEX; | 3513 pGRD->TPGDON = 0; |
2681 FX_BOOL CUREXFLAG; | 3514 pGRD->USESKIP = GSUSESKIP; |
2682 FX_DWORD EXRUNLENGTH; | 3515 pGRD->SKIP = GSKIP; |
2683 int32_t nVal, nBits; | 3516 if (GSTEMPLATE <= 1) { |
2684 FX_DWORD nTmp; | 3517 pGRD->GBAT[0] = 3; |
2685 FX_DWORD SBNUMSYMS; | 3518 } else { |
2686 uint8_t SBSYMCODELEN; | 3519 pGRD->GBAT[0] = 2; |
2687 JBig2HuffmanCode *SBSYMCODES; | 3520 } |
2688 FX_DWORD IDI; | 3521 pGRD->GBAT[1] = -1; |
2689 int32_t RDXI, RDYI; | 3522 if (pGRD->GBTEMPLATE == 0) { |
2690 FX_DWORD BMSIZE; | 3523 pGRD->GBAT[2] = -3; |
2691 FX_DWORD stride; | 3524 pGRD->GBAT[3] = -1; |
2692 CJBig2_Image **SBSYMS; | 3525 pGRD->GBAT[4] = 2; |
2693 CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH,
*SBHUFFRDX, *SBHUFFRDY, | 3526 pGRD->GBAT[5] = -2; |
2694 *SBHUFFRSIZE, *pTable; | 3527 pGRD->GBAT[6] = -2; |
2695 CJBig2_HuffmanDecoder *pHuffmanDecoder; | 3528 pGRD->GBAT[7] = -2; |
2696 CJBig2_GRRDProc *pGRRD; | 3529 } |
2697 CJBig2_ArithDecoder *pArithDecoder; | 3530 FXCODEC_STATUS status = |
2698 CJBig2_GRDProc *pGRD; | 3531 pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext); |
2699 CJBig2_SymbolDict *pDict; | 3532 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
2700 JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream)); | 3533 pGRD->Continue_decode(pPause); |
2701 SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJ
Big2_Image*)); | 3534 } |
2702 FXSYS_memset(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*)); | 3535 if (GSPLANES[GSBPP - 1] == NULL) { |
2703 SDNEWSYMWIDTHS = NULL; | 3536 goto failed; |
2704 BHC = NULL; | 3537 } |
2705 if(SDREFAGG == 0) { | 3538 J = GSBPP - 2; |
2706 SDNEWSYMWIDTHS = (FX_DWORD *)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, size
of(FX_DWORD)); | 3539 while (J >= 0) { |
2707 FXSYS_memset(SDNEWSYMWIDTHS, 0 , SDNUMNEWSYMS * sizeof(FX_DWORD)); | 3540 FXCODEC_STATUS status = |
2708 } | 3541 pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext); |
2709 HCHEIGHT = 0; | 3542 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
2710 NSYMSDECODED = 0; | 3543 pGRD->Continue_decode(pPause); |
2711 BS = NULL; | 3544 } |
2712 while(NSYMSDECODED < SDNUMNEWSYMS) { | 3545 if (GSPLANES[J] == NULL) { |
2713 if(pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { | 3546 for (K = GSBPP - 1; K > J; K--) { |
2714 m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffma
n): too short."); | 3547 delete GSPLANES[K]; |
2715 goto failed; | 3548 goto failed; |
2716 } | 3549 } |
2717 HCHEIGHT = HCHEIGHT + HCDH; | 3550 } |
2718 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { | 3551 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); |
2719 m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffma
n): invalid HCHEIGHT value."); | 3552 J = J - 1; |
2720 goto failed; | 3553 } |
2721 } | 3554 for (y = 0; y < GSH; y++) { |
2722 SYMWIDTH = 0; | 3555 for (x = 0; x < GSW; x++) { |
2723 TOTWIDTH = 0; | 3556 for (J = 0; J < GSBPP; J++) { |
2724 HCFIRSTSYM = NSYMSDECODED; | 3557 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J; |
2725 for(;;) { | 3558 } |
2726 nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW); | 3559 } |
2727 if(nVal == JBIG2_OOB) { | 3560 } |
2728 break; | 3561 for (J = 0; J < GSBPP; J++) { |
2729 } else if(nVal != 0) { | 3562 delete GSPLANES[J]; |
2730 m_pModule->JBig2_Error("symbol dictionary decoding procedure (hu
ffman): too short."); | 3563 } |
2731 goto failed; | 3564 m_pModule->JBig2_Free(GSPLANES); |
2732 } else { | 3565 delete pGRD; |
2733 if (NSYMSDECODED >= SDNUMNEWSYMS) { | 3566 return GSVALS; |
2734 m_pModule->JBig2_Error("symbol dictionary decoding procedure
(huffman): NSYMSDECODED >= SDNUMNEWSYMS."); | |
2735 goto failed; | |
2736 } | |
2737 SYMWIDTH = SYMWIDTH + DW; | |
2738 if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { | |
2739 m_pModule->JBig2_Error("symbol dictionary decoding procedure
(huffman): invalid SYMWIDTH value."); | |
2740 goto failed; | |
2741 } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { | |
2742 TOTWIDTH = TOTWIDTH + SYMWIDTH; | |
2743 SDNEWSYMS[NSYMSDECODED] = NULL; | |
2744 NSYMSDECODED = NSYMSDECODED + 1; | |
2745 continue; | |
2746 } | |
2747 TOTWIDTH = TOTWIDTH + SYMWIDTH; | |
2748 } | |
2749 if(SDREFAGG == 1) { | |
2750 if(pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNIN
ST) != 0) { | |
2751 m_pModule->JBig2_Error("symbol dictionary decoding procedure
(huffman): too short."); | |
2752 goto failed; | |
2753 } | |
2754 BS = NULL; | |
2755 if(REFAGGNINST > 1) { | |
2756 CJBig2_TRDProc *pDecoder; | |
2757 JBIG2_ALLOC(pDecoder, CJBig2_TRDProc()); | |
2758 pDecoder->SBHUFF = SDHUFF; | |
2759 pDecoder->SBREFINE = 1; | |
2760 pDecoder->SBW = SYMWIDTH; | |
2761 pDecoder->SBH = HCHEIGHT; | |
2762 pDecoder->SBNUMINSTANCES = REFAGGNINST; | |
2763 pDecoder->SBSTRIPS = 1; | |
2764 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; | |
2765 SBNUMSYMS = pDecoder->SBNUMSYMS; | |
2766 SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBN
UMSYMS, sizeof(JBig2HuffmanCode)); | |
2767 nTmp = 1; | |
2768 while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { | |
2769 nTmp ++; | |
2770 } | |
2771 for(I = 0; I < SBNUMSYMS; I++) { | |
2772 SBSYMCODES[I].codelen = nTmp; | |
2773 SBSYMCODES[I].code = I; | |
2774 } | |
2775 pDecoder->SBSYMCODES = SBSYMCODES; | |
2776 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS,
sizeof(CJBig2_Image*)); | |
2777 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_I
mage*)); | |
2778 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED *
sizeof(CJBig2_Image*)); | |
2779 pDecoder->SBSYMS = SBSYMS; | |
2780 pDecoder->SBDEFPIXEL = 0; | |
2781 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; | |
2782 pDecoder->TRANSPOSED = 0; | |
2783 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; | |
2784 pDecoder->SBDSOFFSET = 0; | |
2785 JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6, | |
2786 sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine)
, HuffmanTable_HTOOB_B6)); | |
2787 JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8, | |
2788 sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine)
, HuffmanTable_HTOOB_B8)); | |
2789 JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11, | |
2790 sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B11)); | |
2791 JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15, | |
2792 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B15)); | |
2793 JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15, | |
2794 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B15)); | |
2795 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, | |
2796 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B15)); | |
2797 JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15, | |
2798 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B15)); | |
2799 JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1
, | |
2800 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine)
, HuffmanTable_HTOOB_B1)); | |
2801 pDecoder->SBHUFFFS = SBHUFFFS; | |
2802 pDecoder->SBHUFFDS = SBHUFFDS; | |
2803 pDecoder->SBHUFFDT = SBHUFFDT; | |
2804 pDecoder->SBHUFFRDW = SBHUFFRDW; | |
2805 pDecoder->SBHUFFRDH = SBHUFFRDH; | |
2806 pDecoder->SBHUFFRDX = SBHUFFRDX; | |
2807 pDecoder->SBHUFFRDY = SBHUFFRDY; | |
2808 pDecoder->SBHUFFRSIZE = SBHUFFRSIZE; | |
2809 pDecoder->SBRTEMPLATE = SDRTEMPLATE; | |
2810 pDecoder->SBRAT[0] = SDRAT[0]; | |
2811 pDecoder->SBRAT[1] = SDRAT[1]; | |
2812 pDecoder->SBRAT[2] = SDRAT[2]; | |
2813 pDecoder->SBRAT[3] = SDRAT[3]; | |
2814 BS = pDecoder->decode_Huffman(pStream, grContext); | |
2815 if(BS == NULL) { | |
2816 m_pModule->JBig2_Free(SBSYMCODES); | |
2817 m_pModule->JBig2_Free(SBSYMS); | |
2818 delete SBHUFFFS; | |
2819 delete SBHUFFDS; | |
2820 delete SBHUFFDT; | |
2821 delete SBHUFFRDW; | |
2822 delete SBHUFFRDH; | |
2823 delete SBHUFFRDX; | |
2824 delete SBHUFFRDY; | |
2825 delete SBHUFFRSIZE; | |
2826 delete pDecoder; | |
2827 goto failed; | |
2828 } | |
2829 m_pModule->JBig2_Free(SBSYMCODES); | |
2830 m_pModule->JBig2_Free(SBSYMS); | |
2831 delete SBHUFFFS; | |
2832 delete SBHUFFDS; | |
2833 delete SBHUFFDT; | |
2834 delete SBHUFFRDW; | |
2835 delete SBHUFFRDH; | |
2836 delete SBHUFFRDX; | |
2837 delete SBHUFFRDY; | |
2838 delete SBHUFFRSIZE; | |
2839 delete pDecoder; | |
2840 } else if(REFAGGNINST == 1) { | |
2841 SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS; | |
2842 nTmp = 1; | |
2843 while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { | |
2844 nTmp ++; | |
2845 } | |
2846 SBSYMCODELEN = (uint8_t)nTmp; | |
2847 SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBN
UMSYMS, sizeof(JBig2HuffmanCode)); | |
2848 for(I = 0; I < SBNUMSYMS; I++) { | |
2849 SBSYMCODES[I].codelen = SBSYMCODELEN; | |
2850 SBSYMCODES[I].code = I; | |
2851 } | |
2852 nVal = 0; | |
2853 nBits = 0; | |
2854 for(;;) { | |
2855 if(pStream->read1Bit(&nTmp) != 0) { | |
2856 m_pModule->JBig2_Free(SBSYMCODES); | |
2857 m_pModule->JBig2_Error("symbol dictionary decoding p
rocedure (huffman): too short."); | |
2858 goto failed; | |
2859 } | |
2860 nVal = (nVal << 1) | nTmp; | |
2861 for(IDI = 0; IDI < SBNUMSYMS; IDI++) { | |
2862 if((nVal == SBSYMCODES[IDI].code) | |
2863 && (nBits == SBSYMCODES[IDI].codelen)) { | |
2864 break; | |
2865 } | |
2866 } | |
2867 if(IDI < SBNUMSYMS) { | |
2868 break; | |
2869 } | |
2870 } | |
2871 m_pModule->JBig2_Free(SBSYMCODES); | |
2872 JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, | |
2873 sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine
), HuffmanTable_HTOOB_B15)); | |
2874 JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1
, | |
2875 sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine)
, HuffmanTable_HTOOB_B1)); | |
2876 if((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) | |
2877 || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI)
!= 0) | |
2878 || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal
) != 0)) { | |
2879 delete SBHUFFRDX; | |
2880 delete SBHUFFRSIZE; | |
2881 m_pModule->JBig2_Error("symbol dictionary decoding proce
dure (huffman): too short."); | |
2882 goto failed; | |
2883 } | |
2884 delete SBHUFFRDX; | |
2885 delete SBHUFFRSIZE; | |
2886 pStream->alignByte(); | |
2887 nTmp = pStream->getOffset(); | |
2888 SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS,
sizeof(CJBig2_Image*)); | |
2889 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_I
mage*)); | |
2890 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED *
sizeof(CJBig2_Image*)); | |
2891 JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); | |
2892 pGRRD->GRW = SYMWIDTH; | |
2893 pGRRD->GRH = HCHEIGHT; | |
2894 pGRRD->GRTEMPLATE = SDRTEMPLATE; | |
2895 pGRRD->GRREFERENCE = SBSYMS[IDI]; | |
2896 pGRRD->GRREFERENCEDX = RDXI; | |
2897 pGRRD->GRREFERENCEDY = RDYI; | |
2898 pGRRD->TPGRON = 0; | |
2899 pGRRD->GRAT[0] = SDRAT[0]; | |
2900 pGRRD->GRAT[1] = SDRAT[1]; | |
2901 pGRRD->GRAT[2] = SDRAT[2]; | |
2902 pGRRD->GRAT[3] = SDRAT[3]; | |
2903 JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream)); | |
2904 BS = pGRRD->decode(pArithDecoder, grContext); | |
2905 if(BS == NULL) { | |
2906 m_pModule->JBig2_Free(SBSYMS); | |
2907 delete pGRRD; | |
2908 delete pArithDecoder; | |
2909 goto failed; | |
2910 } | |
2911 pStream->alignByte(); | |
2912 pStream->offset(2); | |
2913 if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { | |
2914 delete BS; | |
2915 m_pModule->JBig2_Free(SBSYMS); | |
2916 delete pGRRD; | |
2917 delete pArithDecoder; | |
2918 m_pModule->JBig2_Error("symbol dictionary decoding proce
dure (huffman):" | |
2919 "bytes processed by generic refin
ement region decoding procedure doesn't equal SBHUFFRSIZE."); | |
2920 goto failed; | |
2921 } | |
2922 m_pModule->JBig2_Free(SBSYMS); | |
2923 delete pGRRD; | |
2924 delete pArithDecoder; | |
2925 } | |
2926 SDNEWSYMS[NSYMSDECODED] = BS; | |
2927 } | |
2928 if(SDREFAGG == 0) { | |
2929 SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH; | |
2930 } | |
2931 NSYMSDECODED = NSYMSDECODED + 1; | |
2932 } | |
2933 if(SDREFAGG == 0) { | |
2934 if(pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (int32_t*)&BMSIZE) !=
0) { | |
2935 m_pModule->JBig2_Error("symbol dictionary decoding procedure (hu
ffman): too short."); | |
2936 goto failed; | |
2937 } | |
2938 pStream->alignByte(); | |
2939 if(BMSIZE == 0) { | |
2940 stride = (TOTWIDTH + 7) >> 3; | |
2941 if(pStream->getByteLeft() >= stride * HCHEIGHT) { | |
2942 JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT)); | |
2943 for(I = 0; I < HCHEIGHT; I ++) { | |
2944 JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, pStream-
>getPointer(), stride); | |
2945 pStream->offset(stride); | |
2946 } | |
2947 } else { | |
2948 m_pModule->JBig2_Error("symbol dictionary decoding procedure
(huffman): too short."); | |
2949 goto failed; | |
2950 } | |
2951 } else { | |
2952 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); | |
2953 pGRD->MMR = 1; | |
2954 pGRD->GBW = TOTWIDTH; | |
2955 pGRD->GBH = HCHEIGHT; | |
2956 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream); | |
2957 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | |
2958 pGRD->Continue_decode(pPause); | |
2959 } | |
2960 delete pGRD; | |
2961 pStream->alignByte(); | |
2962 } | |
2963 nTmp = 0; | |
2964 if (!BHC) { | |
2965 continue; | |
2966 } | |
2967 for(I = HCFIRSTSYM; I < NSYMSDECODED; I++) { | |
2968 SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGH
T); | |
2969 nTmp += SDNEWSYMWIDTHS[I]; | |
2970 } | |
2971 delete BHC; | |
2972 BHC = NULL; | |
2973 } | |
2974 } | |
2975 EXINDEX = 0; | |
2976 CUREXFLAG = 0; | |
2977 JBIG2_ALLOC(pTable, CJBig2_HuffmanTable(HuffmanTable_B1, | |
2978 sizeof(HuffmanTable_B1) / sizeof(JBi
g2TableLine), HuffmanTable_HTOOB_B1)); | |
2979 EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS +
SDNUMNEWSYMS)); | |
2980 while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { | |
2981 if(pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) { | |
2982 delete pTable; | |
2983 m_pModule->JBig2_Free(EXFLAGS); | |
2984 m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffma
n): too short."); | |
2985 goto failed; | |
2986 } | |
2987 if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { | |
2988 delete pTable; | |
2989 m_pModule->JBig2_Free(EXFLAGS); | |
2990 m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith)
: Invalid EXRUNLENGTH value."); | |
2991 goto failed; | |
2992 } | |
2993 if(EXRUNLENGTH != 0) { | |
2994 for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { | |
2995 EXFLAGS[I] = CUREXFLAG; | |
2996 } | |
2997 } | |
2998 EXINDEX = EXINDEX + EXRUNLENGTH; | |
2999 CUREXFLAG = !CUREXFLAG; | |
3000 } | |
3001 delete pTable; | |
3002 JBIG2_ALLOC(pDict, CJBig2_SymbolDict()); | |
3003 pDict->SDNUMEXSYMS = SDNUMEXSYMS; | |
3004 pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Ima
ge*), SDNUMEXSYMS); | |
3005 I = J = 0; | |
3006 for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { | |
3007 if(EXFLAGS[I] && J < SDNUMEXSYMS) { | |
3008 if(I < SDNUMINSYMS) { | |
3009 JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I])); | |
3010 } else { | |
3011 pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS]; | |
3012 } | |
3013 J = J + 1; | |
3014 } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { | |
3015 delete SDNEWSYMS[I - SDNUMINSYMS]; | |
3016 } | |
3017 } | |
3018 if (J < SDNUMEXSYMS) { | |
3019 pDict->SDNUMEXSYMS = J; | |
3020 } | |
3021 m_pModule->JBig2_Free(EXFLAGS); | |
3022 m_pModule->JBig2_Free(SDNEWSYMS); | |
3023 if(SDREFAGG == 0) { | |
3024 m_pModule->JBig2_Free(SDNEWSYMWIDTHS); | |
3025 } | |
3026 delete pHuffmanDecoder; | |
3027 return pDict; | |
3028 failed: | 3567 failed: |
3029 for(I = 0; I < NSYMSDECODED; I++) { | 3568 m_pModule->JBig2_Free(GSPLANES); |
3030 delete SDNEWSYMS[I]; | 3569 delete pGRD; |
3031 } | 3570 m_pModule->JBig2_Free(GSVALS); |
3032 m_pModule->JBig2_Free(SDNEWSYMS); | 3571 return NULL; |
3033 if(SDREFAGG == 0) { | 3572 } |
3034 m_pModule->JBig2_Free(SDNEWSYMWIDTHS); | 3573 FX_DWORD* CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream* pStream, |
3035 } | 3574 IFX_Pause* pPause) { |
3036 delete pHuffmanDecoder; | 3575 CJBig2_Image** GSPLANES; |
| 3576 int32_t J, K; |
| 3577 FX_DWORD x, y; |
| 3578 FX_DWORD* GSVALS; |
| 3579 CJBig2_GRDProc* pGRD; |
| 3580 GSPLANES = |
| 3581 (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP); |
| 3582 if (!GSPLANES) { |
3037 return NULL; | 3583 return NULL; |
3038 } | 3584 } |
3039 CJBig2_Image *CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, | 3585 GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH); |
3040 JBig2ArithCtx *gbContext, IFX_Pause* pPause) | 3586 if (!GSVALS) { |
3041 { | 3587 if (GSPLANES) { |
3042 FX_DWORD ng, mg; | 3588 m_pModule->JBig2_Free(GSPLANES); |
3043 int32_t x, y; | 3589 } |
3044 CJBig2_Image *HSKIP; | 3590 return NULL; |
3045 FX_DWORD HBPP; | 3591 } |
3046 FX_DWORD *GI; | 3592 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP); |
3047 CJBig2_Image *HTREG; | 3593 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH); |
3048 CJBig2_GSIDProc *pGID; | 3594 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
3049 JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH)); | 3595 pGRD->MMR = GSMMR; |
3050 HTREG->fill(HDEFPIXEL); | 3596 pGRD->GBW = GSW; |
3051 HSKIP = NULL; | 3597 pGRD->GBH = GSH; |
3052 if(HENABLESKIP == 1) { | 3598 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream); |
3053 JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH)); | 3599 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
3054 for(mg = 0; mg < HGH; mg++) { | 3600 pGRD->Continue_decode(pPause); |
3055 for(ng = 0; ng < HGW; ng++) { | 3601 } |
3056 x = (HGX + mg * HRY + ng * HRX) >> 8; | 3602 if (GSPLANES[GSBPP - 1] == NULL) { |
3057 y = (HGY + mg * HRX - ng * HRY) >> 8; | 3603 goto failed; |
3058 if((x + HPW <= 0) | (x >= (int32_t)HBW) | 3604 } |
3059 | (y + HPH <= 0) | (y >= (int32_t)HPH)) { | 3605 pStream->alignByte(); |
3060 HSKIP->setPixel(ng, mg, 1); | 3606 pStream->offset(3); |
3061 } else { | 3607 J = GSBPP - 2; |
3062 HSKIP->setPixel(ng, mg, 0); | 3608 while (J >= 0) { |
3063 } | 3609 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream); |
3064 } | 3610 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
3065 } | 3611 pGRD->Continue_decode(pPause); |
3066 } | 3612 } |
3067 HBPP = 1; | 3613 if (GSPLANES[J] == NULL) { |
3068 while((FX_DWORD)(1 << HBPP) < HNUMPATS) { | 3614 for (K = GSBPP - 1; K > J; K--) { |
3069 HBPP ++; | 3615 delete GSPLANES[K]; |
3070 } | |
3071 JBIG2_ALLOC(pGID, CJBig2_GSIDProc()); | |
3072 pGID->GSMMR = HMMR; | |
3073 pGID->GSW = HGW; | |
3074 pGID->GSH = HGH; | |
3075 pGID->GSBPP = (uint8_t)HBPP; | |
3076 pGID->GSUSESKIP = HENABLESKIP; | |
3077 pGID->GSKIP = HSKIP; | |
3078 pGID->GSTEMPLATE = HTEMPLATE; | |
3079 GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause); | |
3080 if(GI == NULL) { | |
3081 goto failed; | 3616 goto failed; |
3082 } | 3617 } |
3083 for(mg = 0; mg < HGH; mg++) { | |
3084 for(ng = 0; ng < HGW; ng++) { | |
3085 x = (HGX + mg * HRY + ng * HRX) >> 8; | |
3086 y = (HGY + mg * HRX - ng * HRY) >> 8; | |
3087 FX_DWORD pat_index = GI[mg * HGW + ng]; | |
3088 if (pat_index >= HNUMPATS) { | |
3089 pat_index = HNUMPATS - 1; | |
3090 } | |
3091 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); | |
3092 } | |
3093 } | |
3094 m_pModule->JBig2_Free(GI); | |
3095 delete HSKIP; | |
3096 delete pGID; | |
3097 return HTREG; | |
3098 failed: | |
3099 delete HSKIP; | |
3100 delete pGID; | |
3101 delete HTREG; | |
3102 return NULL; | |
3103 } | |
3104 CJBig2_Image *CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause*
pPause) | |
3105 { | |
3106 FX_DWORD ng, mg; | |
3107 int32_t x, y; | |
3108 FX_DWORD HBPP; | |
3109 FX_DWORD *GI; | |
3110 CJBig2_Image *HTREG; | |
3111 CJBig2_GSIDProc *pGID; | |
3112 JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH)); | |
3113 HTREG->fill(HDEFPIXEL); | |
3114 HBPP = 1; | |
3115 while((FX_DWORD)(1 << HBPP) < HNUMPATS) { | |
3116 HBPP ++; | |
3117 } | |
3118 JBIG2_ALLOC(pGID, CJBig2_GSIDProc()); | |
3119 pGID->GSMMR = HMMR; | |
3120 pGID->GSW = HGW; | |
3121 pGID->GSH = HGH; | |
3122 pGID->GSBPP = (uint8_t)HBPP; | |
3123 pGID->GSUSESKIP = 0; | |
3124 GI = pGID->decode_MMR(pStream, pPause); | |
3125 if(GI == NULL) { | |
3126 goto failed; | |
3127 } | |
3128 for(mg = 0; mg < HGH; mg++) { | |
3129 for(ng = 0; ng < HGW; ng++) { | |
3130 x = (HGX + mg * HRY + ng * HRX) >> 8; | |
3131 y = (HGY + mg * HRX - ng * HRY) >> 8; | |
3132 FX_DWORD pat_index = GI[mg * HGW + ng]; | |
3133 if (pat_index >= HNUMPATS) { | |
3134 pat_index = HNUMPATS - 1; | |
3135 } | |
3136 HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); | |
3137 } | |
3138 } | |
3139 m_pModule->JBig2_Free(GI); | |
3140 delete pGID; | |
3141 return HTREG; | |
3142 failed: | |
3143 delete pGID; | |
3144 delete HTREG; | |
3145 return NULL; | |
3146 } | |
3147 CJBig2_PatternDict *CJBig2_PDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDeco
der, | |
3148 JBig2ArithCtx *gbContext, IFX_Pause* pPause) | |
3149 { | |
3150 FX_DWORD GRAY; | |
3151 CJBig2_Image *BHDC = NULL; | |
3152 CJBig2_PatternDict *pDict; | |
3153 CJBig2_GRDProc *pGRD; | |
3154 JBIG2_ALLOC(pDict, CJBig2_PatternDict()); | |
3155 pDict->NUMPATS = GRAYMAX + 1; | |
3156 pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image
*), pDict->NUMPATS); | |
3157 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS); | |
3158 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); | |
3159 pGRD->MMR = HDMMR; | |
3160 pGRD->GBW = (GRAYMAX + 1) * HDPW; | |
3161 pGRD->GBH = HDPH; | |
3162 pGRD->GBTEMPLATE = HDTEMPLATE; | |
3163 pGRD->TPGDON = 0; | |
3164 pGRD->USESKIP = 0; | |
3165 pGRD->GBAT[0] = -(int32_t)HDPW; | |
3166 pGRD->GBAT[1] = 0; | |
3167 if(pGRD->GBTEMPLATE == 0) { | |
3168 pGRD->GBAT[2] = -3; | |
3169 pGRD->GBAT[3] = -1; | |
3170 pGRD->GBAT[4] = 2; | |
3171 pGRD->GBAT[5] = -2; | |
3172 pGRD->GBAT[6] = -2; | |
3173 pGRD->GBAT[7] = -2; | |
3174 } | |
3175 FXCODEC_STATUS status = pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbCon
text); | |
3176 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | |
3177 pGRD->Continue_decode(pPause); | |
3178 } | |
3179 if(BHDC == NULL) { | |
3180 delete pGRD; | |
3181 goto failed; | |
3182 } | |
3183 delete pGRD; | |
3184 GRAY = 0; | |
3185 while(GRAY <= GRAYMAX) { | |
3186 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); | |
3187 GRAY = GRAY + 1; | |
3188 } | |
3189 delete BHDC; | |
3190 return pDict; | |
3191 failed: | |
3192 delete pDict; | |
3193 return NULL; | |
3194 } | |
3195 | |
3196 CJBig2_PatternDict *CJBig2_PDDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pa
use* pPause) | |
3197 { | |
3198 FX_DWORD GRAY; | |
3199 CJBig2_Image *BHDC = NULL; | |
3200 CJBig2_PatternDict *pDict; | |
3201 CJBig2_GRDProc *pGRD; | |
3202 JBIG2_ALLOC(pDict, CJBig2_PatternDict()); | |
3203 pDict->NUMPATS = GRAYMAX + 1; | |
3204 pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image
*), pDict->NUMPATS); | |
3205 JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS); | |
3206 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); | |
3207 pGRD->MMR = HDMMR; | |
3208 pGRD->GBW = (GRAYMAX + 1) * HDPW; | |
3209 pGRD->GBH = HDPH; | |
3210 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream); | |
3211 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | |
3212 pGRD->Continue_decode(pPause); | |
3213 } | |
3214 if(BHDC == NULL) { | |
3215 delete pGRD; | |
3216 goto failed; | |
3217 } | |
3218 delete pGRD; | |
3219 GRAY = 0; | |
3220 while(GRAY <= GRAYMAX) { | |
3221 pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); | |
3222 GRAY = GRAY + 1; | |
3223 } | |
3224 delete BHDC; | |
3225 return pDict; | |
3226 failed: | |
3227 delete pDict; | |
3228 return NULL; | |
3229 } | |
3230 FX_DWORD *CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, | |
3231 JBig2ArithCtx *gbContext, IFX_Pause* pPa
use) | |
3232 { | |
3233 CJBig2_Image **GSPLANES; | |
3234 int32_t J, K; | |
3235 FX_DWORD x, y; | |
3236 FX_DWORD *GSVALS; | |
3237 CJBig2_GRDProc *pGRD; | |
3238 GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*),
GSBPP); | |
3239 if (!GSPLANES) { | |
3240 return NULL; | |
3241 } | |
3242 GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH); | |
3243 if (!GSVALS) { | |
3244 m_pModule->JBig2_Free(GSPLANES); | |
3245 return NULL; | |
3246 } | |
3247 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP); | |
3248 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH); | |
3249 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); | |
3250 pGRD->MMR = GSMMR; | |
3251 pGRD->GBW = GSW; | |
3252 pGRD->GBH = GSH; | |
3253 pGRD->GBTEMPLATE = GSTEMPLATE; | |
3254 pGRD->TPGDON = 0; | |
3255 pGRD->USESKIP = GSUSESKIP; | |
3256 pGRD->SKIP = GSKIP; | |
3257 if(GSTEMPLATE <= 1) { | |
3258 pGRD->GBAT[0] = 3; | |
3259 } else { | |
3260 pGRD->GBAT[0] = 2; | |
3261 } | |
3262 pGRD->GBAT[1] = -1; | |
3263 if(pGRD->GBTEMPLATE == 0) { | |
3264 pGRD->GBAT[2] = -3; | |
3265 pGRD->GBAT[3] = -1; | |
3266 pGRD->GBAT[4] = 2; | |
3267 pGRD->GBAT[5] = -2; | |
3268 pGRD->GBAT[6] = -2; | |
3269 pGRD->GBAT[7] = -2; | |
3270 } | |
3271 FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArit
hDecoder, gbContext); | |
3272 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | |
3273 pGRD->Continue_decode(pPause); | |
3274 } | |
3275 if(GSPLANES[GSBPP - 1] == NULL) { | |
3276 goto failed; | |
3277 } | |
3278 J = GSBPP - 2; | |
3279 while(J >= 0) { | |
3280 FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[J], pArithDec
oder, gbContext); | |
3281 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | |
3282 pGRD->Continue_decode(pPause); | |
3283 } | |
3284 if(GSPLANES[J] == NULL) { | |
3285 for(K = GSBPP - 1; K > J; K--) { | |
3286 delete GSPLANES[K]; | |
3287 goto failed; | |
3288 } | |
3289 } | |
3290 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); | |
3291 J = J - 1; | |
3292 } | |
3293 for(y = 0; y < GSH; y++) { | |
3294 for(x = 0; x < GSW; x++) { | |
3295 for(J = 0; J < GSBPP; J++) { | |
3296 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J; | |
3297 } | |
3298 } | |
3299 } | |
3300 for(J = 0; J < GSBPP; J++) { | |
3301 delete GSPLANES[J]; | |
3302 } | |
3303 m_pModule->JBig2_Free(GSPLANES); | |
3304 delete pGRD; | |
3305 return GSVALS; | |
3306 failed: | |
3307 m_pModule->JBig2_Free(GSPLANES); | |
3308 delete pGRD; | |
3309 m_pModule->JBig2_Free(GSVALS); | |
3310 return NULL; | |
3311 } | |
3312 FX_DWORD *CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPau
se) | |
3313 { | |
3314 CJBig2_Image **GSPLANES; | |
3315 int32_t J, K; | |
3316 FX_DWORD x, y; | |
3317 FX_DWORD *GSVALS; | |
3318 CJBig2_GRDProc *pGRD; | |
3319 GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*),
GSBPP); | |
3320 if (!GSPLANES) { | |
3321 return NULL; | |
3322 } | |
3323 GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH); | |
3324 if (!GSVALS) { | |
3325 if (GSPLANES) { | |
3326 m_pModule->JBig2_Free(GSPLANES); | |
3327 } | |
3328 return NULL; | |
3329 } | |
3330 JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP); | |
3331 JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH); | |
3332 JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); | |
3333 pGRD->MMR = GSMMR; | |
3334 pGRD->GBW = GSW; | |
3335 pGRD->GBH = GSH; | |
3336 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream
); | |
3337 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | |
3338 pGRD->Continue_decode(pPause); | |
3339 } | |
3340 if(GSPLANES[GSBPP - 1] == NULL) { | |
3341 goto failed; | |
3342 } | 3618 } |
3343 pStream->alignByte(); | 3619 pStream->alignByte(); |
3344 pStream->offset(3); | 3620 pStream->offset(3); |
3345 J = GSBPP - 2; | 3621 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); |
3346 while(J >= 0) { | 3622 J = J - 1; |
3347 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream); | 3623 } |
3348 while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 3624 for (y = 0; y < GSH; y++) { |
3349 pGRD->Continue_decode(pPause); | 3625 for (x = 0; x < GSW; x++) { |
3350 } | 3626 for (J = 0; J < GSBPP; J++) { |
3351 if(GSPLANES[J] == NULL) { | 3627 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J; |
3352 for(K = GSBPP - 1; K > J; K--) { | 3628 } |
3353 delete GSPLANES[K]; | 3629 } |
3354 goto failed; | 3630 } |
3355 } | 3631 for (J = 0; J < GSBPP; J++) { |
3356 } | 3632 delete GSPLANES[J]; |
3357 pStream->alignByte(); | 3633 } |
3358 pStream->offset(3); | 3634 m_pModule->JBig2_Free(GSPLANES); |
3359 GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); | 3635 delete pGRD; |
3360 J = J - 1; | 3636 return GSVALS; |
3361 } | |
3362 for(y = 0; y < GSH; y++) { | |
3363 for(x = 0; x < GSW; x++) { | |
3364 for(J = 0; J < GSBPP; J++) { | |
3365 GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J; | |
3366 } | |
3367 } | |
3368 } | |
3369 for(J = 0; J < GSBPP; J++) { | |
3370 delete GSPLANES[J]; | |
3371 } | |
3372 m_pModule->JBig2_Free(GSPLANES); | |
3373 delete pGRD; | |
3374 return GSVALS; | |
3375 failed: | 3637 failed: |
3376 m_pModule->JBig2_Free(GSPLANES); | 3638 m_pModule->JBig2_Free(GSPLANES); |
3377 delete pGRD; | 3639 delete pGRD; |
3378 m_pModule->JBig2_Free(GSVALS); | 3640 m_pModule->JBig2_Free(GSVALS); |
3379 return NULL; | 3641 return NULL; |
3380 } | 3642 } |
3381 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith(CJBig2_Image** pImage, CJBig2_
ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) | 3643 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith( |
3382 { | 3644 CJBig2_Image** pImage, |
3383 if (GBW == 0 || GBH == 0) { | 3645 CJBig2_ArithDecoder* pArithDecoder, |
3384 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | 3646 JBig2ArithCtx* gbContext, |
3385 return FXCODEC_STATUS_DECODE_FINISH; | 3647 IFX_Pause* pPause) { |
3386 } | 3648 if (GBW == 0 || GBH == 0) { |
3387 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; | |
3388 m_pPause = pPause; | |
3389 if(*pImage == NULL) { | |
3390 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); | |
3391 } | |
3392 if ((*pImage)->m_pData == NULL) { | |
3393 delete *pImage; | |
3394 *pImage = NULL; | |
3395 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | |
3396 m_ProssiveStatus = FXCODEC_STATUS_ERROR; | |
3397 return FXCODEC_STATUS_ERROR; | |
3398 } | |
3399 m_DecodeType = 1; | |
3400 m_pImage = pImage; | |
3401 (*m_pImage)->fill(0); | |
3402 m_pArithDecoder = pArithDecoder; | |
3403 m_gbContext = gbContext; | |
3404 LTP = 0; | |
3405 m_pLine = NULL; | |
3406 m_loopIndex = 0; | |
3407 return decode_Arith(pPause); | |
3408 } | |
3409 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause) | |
3410 { | |
3411 int iline = m_loopIndex; | |
3412 CJBig2_Image* pImage = *m_pImage; | |
3413 if(GBTEMPLATE == 0) { | |
3414 if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1) | |
3415 && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) -
1) | |
3416 && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2) | |
3417 && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) -
2)) { | |
3418 m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecod
er, m_gbContext, pPause); | |
3419 } else { | |
3420 m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDeco
der, m_gbContext, pPause); | |
3421 } | |
3422 } else if(GBTEMPLATE == 1) { | |
3423 if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) { | |
3424 m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecod
er, m_gbContext, pPause); | |
3425 } else { | |
3426 m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDeco
der, m_gbContext, pPause); | |
3427 } | |
3428 } else if(GBTEMPLATE == 2) { | |
3429 if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) { | |
3430 m_ProssiveStatus = decode_Arith_Template2_opt3(pImage, m_pArithDeco
der, m_gbContext, pPause); | |
3431 } else { | |
3432 m_ProssiveStatus = decode_Arith_Template2_unopt(pImage, m_pArithDec
oder, m_gbContext, pPause); | |
3433 } | |
3434 } else { | |
3435 if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) { | |
3436 m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecod
er, m_gbContext, pPause); | |
3437 } else { | |
3438 m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDeco
der, m_gbContext, pPause); | |
3439 } | |
3440 } | |
3441 m_ReplaceRect.left = 0; | |
3442 m_ReplaceRect.right = pImage->m_nWidth; | |
3443 m_ReplaceRect.top = iline; | |
3444 m_ReplaceRect.bottom = m_loopIndex; | |
3445 if(m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) { | |
3446 m_loopIndex = 0; | |
3447 } | |
3448 return m_ProssiveStatus; | |
3449 } | |
3450 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2(CJBig2_Image** pImage, CJBi
g2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) | |
3451 { | |
3452 if(GBW == 0 || GBH == 0) { | |
3453 * pImage = NULL; | |
3454 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | |
3455 return FXCODEC_STATUS_DECODE_FINISH; | |
3456 } | |
3457 if(*pImage == NULL) { | |
3458 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); | |
3459 } | |
3460 if ((*pImage)->m_pData == NULL) { | |
3461 delete *pImage; | |
3462 *pImage = NULL; | |
3463 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | |
3464 m_ProssiveStatus = FXCODEC_STATUS_ERROR; | |
3465 return FXCODEC_STATUS_ERROR; | |
3466 } | |
3467 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; | |
3468 m_DecodeType = 2; | |
3469 m_pPause = pPause; | |
3470 m_pImage = pImage; | |
3471 (*m_pImage)->fill(0); | |
3472 LTP = 0; | |
3473 m_loopIndex = 0; | |
3474 m_pArithDecoder = pArithDecoder; | |
3475 m_gbContext = gbContext; | |
3476 return decode_Arith_V2(pPause); | |
3477 } | |
3478 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause) | |
3479 { | |
3480 FX_BOOL SLTP, bVal; | |
3481 FX_DWORD CONTEXT; | |
3482 CJBig2_Image *GBREG = *m_pImage; | |
3483 FX_DWORD line1, line2, line3; | |
3484 LTP = 0; | |
3485 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); | |
3486 GBREG->fill(0); | |
3487 for(; m_loopIndex < GBH; m_loopIndex++) { | |
3488 if(TPGDON) { | |
3489 switch(GBTEMPLATE) { | |
3490 case 0: | |
3491 CONTEXT = 0x9b25; | |
3492 break; | |
3493 case 1: | |
3494 CONTEXT = 0x0795; | |
3495 break; | |
3496 case 2: | |
3497 CONTEXT = 0x00e5; | |
3498 break; | |
3499 case 3: | |
3500 CONTEXT = 0x0195; | |
3501 break; | |
3502 } | |
3503 SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); | |
3504 LTP = LTP ^ SLTP; | |
3505 } | |
3506 if(LTP == 1) { | |
3507 GBREG->copyLine(m_loopIndex, m_loopIndex - 1); | |
3508 } else { | |
3509 switch(GBTEMPLATE) { | |
3510 case 0: { | |
3511 line1 = GBREG->getPixel(1, m_loopIndex - 2); | |
3512 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1; | |
3513 line2 = GBREG->getPixel(2, m_loopIndex - 1); | |
3514 line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1; | |
3515 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2; | |
3516 line3 = 0; | |
3517 for(FX_DWORD w = 0; w < GBW; w++) { | |
3518 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { | |
3519 bVal = 0; | |
3520 } else { | |
3521 CONTEXT = line3; | |
3522 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIn
dex + GBAT[1]) << 4; | |
3523 CONTEXT |= line2 << 5; | |
3524 CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIn
dex + GBAT[3]) << 10; | |
3525 CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIn
dex + GBAT[5]) << 11; | |
3526 CONTEXT |= line1 << 12; | |
3527 CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIn
dex + GBAT[7]) << 15; | |
3528 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONT
EXT]); | |
3529 } | |
3530 if(bVal) { | |
3531 GBREG->setPixel(w, m_loopIndex, bVal); | |
3532 } | |
3533 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loo
pIndex - 2)) & 0x07; | |
3534 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loo
pIndex - 1)) & 0x1f; | |
3535 line3 = ((line3 << 1) | bVal) & 0x0f; | |
3536 } | |
3537 } | |
3538 break; | |
3539 case 1: { | |
3540 line1 = GBREG->getPixel(2, m_loopIndex - 2); | |
3541 line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1; | |
3542 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2; | |
3543 line2 = GBREG->getPixel(2, m_loopIndex - 1); | |
3544 line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1; | |
3545 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2; | |
3546 line3 = 0; | |
3547 for(FX_DWORD w = 0; w < GBW; w++) { | |
3548 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { | |
3549 bVal = 0; | |
3550 } else { | |
3551 CONTEXT = line3; | |
3552 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIn
dex + GBAT[1]) << 3; | |
3553 CONTEXT |= line2 << 4; | |
3554 CONTEXT |= line1 << 9; | |
3555 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONT
EXT]); | |
3556 } | |
3557 if(bVal) { | |
3558 GBREG->setPixel(w, m_loopIndex, bVal); | |
3559 } | |
3560 line1 = ((line1 << 1) | GBREG->getPixel(w + 3, m_loo
pIndex - 2)) & 0x0f; | |
3561 line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loo
pIndex - 1)) & 0x1f; | |
3562 line3 = ((line3 << 1) | bVal) & 0x07; | |
3563 } | |
3564 } | |
3565 break; | |
3566 case 2: { | |
3567 line1 = GBREG->getPixel(1, m_loopIndex - 2); | |
3568 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1; | |
3569 line2 = GBREG->getPixel(1, m_loopIndex - 1); | |
3570 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1; | |
3571 line3 = 0; | |
3572 for(FX_DWORD w = 0; w < GBW; w++) { | |
3573 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { | |
3574 bVal = 0; | |
3575 } else { | |
3576 CONTEXT = line3; | |
3577 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIn
dex + GBAT[1]) << 2; | |
3578 CONTEXT |= line2 << 3; | |
3579 CONTEXT |= line1 << 7; | |
3580 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONT
EXT]); | |
3581 } | |
3582 if(bVal) { | |
3583 GBREG->setPixel(w, m_loopIndex, bVal); | |
3584 } | |
3585 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loo
pIndex - 2)) & 0x07; | |
3586 line2 = ((line2 << 1) | GBREG->getPixel(w + 2, m_loo
pIndex - 1)) & 0x0f; | |
3587 line3 = ((line3 << 1) | bVal) & 0x03; | |
3588 } | |
3589 } | |
3590 break; | |
3591 case 3: { | |
3592 line1 = GBREG->getPixel(1, m_loopIndex - 1); | |
3593 line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1; | |
3594 line2 = 0; | |
3595 for(FX_DWORD w = 0; w < GBW; w++) { | |
3596 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { | |
3597 bVal = 0; | |
3598 } else { | |
3599 CONTEXT = line2; | |
3600 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIn
dex + GBAT[1]) << 4; | |
3601 CONTEXT |= line1 << 5; | |
3602 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONT
EXT]); | |
3603 } | |
3604 if(bVal) { | |
3605 GBREG->setPixel(w, m_loopIndex, bVal); | |
3606 } | |
3607 line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loo
pIndex - 1)) & 0x1f; | |
3608 line2 = ((line2 << 1) | bVal) & 0x0f; | |
3609 } | |
3610 } | |
3611 break; | |
3612 } | |
3613 } | |
3614 if(pPause && pPause->NeedToPauseNow()) { | |
3615 m_loopIndex ++; | |
3616 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
3617 return FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
3618 } | |
3619 } | |
3620 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | 3649 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
3621 return FXCODEC_STATUS_DECODE_FINISH; | 3650 return FXCODEC_STATUS_DECODE_FINISH; |
3622 } | 3651 } |
3623 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1(CJBig2_Image** pImage, CJBi
g2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) | 3652 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; |
3624 { | 3653 m_pPause = pPause; |
3625 if(GBW == 0 || GBH == 0) { | 3654 if (*pImage == NULL) { |
3626 * pImage = NULL; | 3655 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
3627 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | 3656 } |
3628 return FXCODEC_STATUS_DECODE_FINISH; | 3657 if ((*pImage)->m_pData == NULL) { |
3629 } | 3658 delete *pImage; |
3630 if(*pImage == NULL) { | 3659 *pImage = NULL; |
3631 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); | 3660 m_pModule->JBig2_Error( |
3632 } | 3661 "Generic region decoding procedure: Create Image Failed with width = " |
3633 if ((*pImage)->m_pData == NULL) { | 3662 "%d, height = %d\n", |
3634 delete *pImage; | 3663 GBW, GBH); |
3635 *pImage = NULL; | 3664 m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
3636 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | 3665 return FXCODEC_STATUS_ERROR; |
3637 m_ProssiveStatus = FXCODEC_STATUS_ERROR; | 3666 } |
3638 return FXCODEC_STATUS_ERROR; | 3667 m_DecodeType = 1; |
3639 } | 3668 m_pImage = pImage; |
3640 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; | 3669 (*m_pImage)->fill(0); |
3641 m_pPause = pPause; | 3670 m_pArithDecoder = pArithDecoder; |
3642 m_pImage = pImage; | 3671 m_gbContext = gbContext; |
3643 m_DecodeType = 3; | 3672 LTP = 0; |
3644 (*m_pImage)->fill(0); | 3673 m_pLine = NULL; |
3645 LTP = 0; | 3674 m_loopIndex = 0; |
| 3675 return decode_Arith(pPause); |
| 3676 } |
| 3677 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause) { |
| 3678 int iline = m_loopIndex; |
| 3679 CJBig2_Image* pImage = *m_pImage; |
| 3680 if (GBTEMPLATE == 0) { |
| 3681 if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1) && |
| 3682 (GBAT[2] == (signed char)-3) && (GBAT[3] == (signed char)-1) && |
| 3683 (GBAT[4] == 2) && (GBAT[5] == (signed char)-2) && |
| 3684 (GBAT[6] == (signed char)-2) && (GBAT[7] == (signed char)-2)) { |
| 3685 m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder, |
| 3686 m_gbContext, pPause); |
| 3687 } else { |
| 3688 m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDecoder, |
| 3689 m_gbContext, pPause); |
| 3690 } |
| 3691 } else if (GBTEMPLATE == 1) { |
| 3692 if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1)) { |
| 3693 m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecoder, |
| 3694 m_gbContext, pPause); |
| 3695 } else { |
| 3696 m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDecoder, |
| 3697 m_gbContext, pPause); |
| 3698 } |
| 3699 } else if (GBTEMPLATE == 2) { |
| 3700 if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) { |
| 3701 m_ProssiveStatus = decode_Arith_Template2_opt3(pImage, m_pArithDecoder, |
| 3702 m_gbContext, pPause); |
| 3703 } else { |
| 3704 m_ProssiveStatus = decode_Arith_Template2_unopt(pImage, m_pArithDecoder, |
| 3705 m_gbContext, pPause); |
| 3706 } |
| 3707 } else { |
| 3708 if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) { |
| 3709 m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecoder, |
| 3710 m_gbContext, pPause); |
| 3711 } else { |
| 3712 m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDecoder, |
| 3713 m_gbContext, pPause); |
| 3714 } |
| 3715 } |
| 3716 m_ReplaceRect.left = 0; |
| 3717 m_ReplaceRect.right = pImage->m_nWidth; |
| 3718 m_ReplaceRect.top = iline; |
| 3719 m_ReplaceRect.bottom = m_loopIndex; |
| 3720 if (m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) { |
3646 m_loopIndex = 0; | 3721 m_loopIndex = 0; |
3647 m_pArithDecoder = pArithDecoder; | 3722 } |
3648 m_gbContext = gbContext; | 3723 return m_ProssiveStatus; |
3649 return decode_Arith_V1(pPause); | 3724 } |
3650 } | 3725 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2( |
3651 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause) | 3726 CJBig2_Image** pImage, |
3652 { | 3727 CJBig2_ArithDecoder* pArithDecoder, |
3653 FX_BOOL SLTP, bVal; | 3728 JBig2ArithCtx* gbContext, |
3654 FX_DWORD CONTEXT = 0; | 3729 IFX_Pause* pPause) { |
3655 CJBig2_Image *GBREG = (*m_pImage); | 3730 if (GBW == 0 || GBH == 0) { |
3656 for(; m_loopIndex < GBH; m_loopIndex++) { | 3731 *pImage = NULL; |
3657 if(TPGDON) { | |
3658 switch(GBTEMPLATE) { | |
3659 case 0: | |
3660 CONTEXT = 0x9b25; | |
3661 break; | |
3662 case 1: | |
3663 CONTEXT = 0x0795; | |
3664 break; | |
3665 case 2: | |
3666 CONTEXT = 0x00e5; | |
3667 break; | |
3668 case 3: | |
3669 CONTEXT = 0x0195; | |
3670 break; | |
3671 } | |
3672 SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); | |
3673 LTP = LTP ^ SLTP; | |
3674 } | |
3675 if(LTP == 1) { | |
3676 for(FX_DWORD w = 0; w < GBW; w++) { | |
3677 GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex -
1)); | |
3678 } | |
3679 } else { | |
3680 for(FX_DWORD w = 0; w < GBW; w++) { | |
3681 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { | |
3682 GBREG->setPixel(w, m_loopIndex, 0); | |
3683 } else { | |
3684 CONTEXT = 0; | |
3685 switch(GBTEMPLATE) { | |
3686 case 0: | |
3687 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); | |
3688 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; | |
3689 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; | |
3690 CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3; | |
3691 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex
+ GBAT[1]) << 4; | |
3692 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) <
< 5; | |
3693 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) <
< 6; | |
3694 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7; | |
3695 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) <
< 8; | |
3696 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) <
< 9; | |
3697 CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex
+ GBAT[3]) << 10; | |
3698 CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex
+ GBAT[5]) << 11; | |
3699 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) <
< 12; | |
3700 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13
; | |
3701 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) <
< 14; | |
3702 CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex
+ GBAT[7]) << 15; | |
3703 break; | |
3704 case 1: | |
3705 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); | |
3706 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; | |
3707 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; | |
3708 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex
+ GBAT[1]) << 3; | |
3709 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) <
< 4; | |
3710 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) <
< 5; | |
3711 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6; | |
3712 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) <
< 7; | |
3713 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) <
< 8; | |
3714 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) <
< 9; | |
3715 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) <
< 10; | |
3716 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11
; | |
3717 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) <
< 12; | |
3718 break; | |
3719 case 2: | |
3720 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); | |
3721 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; | |
3722 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex
+ GBAT[1]) << 2; | |
3723 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) <
< 3; | |
3724 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4; | |
3725 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) <
< 5; | |
3726 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) <
< 6; | |
3727 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) <
< 7; | |
3728 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8; | |
3729 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) <
< 9; | |
3730 break; | |
3731 case 3: | |
3732 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); | |
3733 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; | |
3734 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; | |
3735 CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3; | |
3736 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex
+ GBAT[1]) << 4; | |
3737 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) <
< 5; | |
3738 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6; | |
3739 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) <
< 7; | |
3740 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) <
< 8; | |
3741 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) <
< 9; | |
3742 break; | |
3743 } | |
3744 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); | |
3745 GBREG->setPixel(w, m_loopIndex, bVal); | |
3746 } | |
3747 } | |
3748 } | |
3749 if(pPause && pPause->NeedToPauseNow()) { | |
3750 m_loopIndex ++; | |
3751 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
3752 return FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
3753 } | |
3754 } | |
3755 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | 3732 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
3756 return FXCODEC_STATUS_DECODE_FINISH; | 3733 return FXCODEC_STATUS_DECODE_FINISH; |
3757 } | 3734 } |
3758 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, CJBig2_Bi
tStream *pStream, IFX_Pause* pPause) | 3735 if (*pImage == NULL) { |
3759 { | 3736 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
3760 int bitpos, i; | 3737 } |
3761 JBIG2_ALLOC((* pImage), CJBig2_Image(GBW, GBH)); | 3738 if ((*pImage)->m_pData == NULL) { |
3762 if ((* pImage)->m_pData == NULL) { | 3739 delete *pImage; |
3763 delete (* pImage); | 3740 *pImage = NULL; |
3764 (* pImage) = NULL; | 3741 m_pModule->JBig2_Error( |
3765 m_pModule->JBig2_Error("Generic region decoding procedure: Create Image
Failed with width = %d, height = %d\n", GBW, GBH); | 3742 "Generic region decoding procedure: Create Image Failed with width = " |
3766 m_ProssiveStatus = FXCODEC_STATUS_ERROR; | 3743 "%d, height = %d\n", |
3767 return m_ProssiveStatus; | 3744 GBW, GBH); |
3768 } | 3745 m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
3769 bitpos = (int)pStream->getBitPos(); | 3746 return FXCODEC_STATUS_ERROR; |
3770 _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, (*
pImage)->m_pData, GBW, GBH, (* pImage)->m_nStride); | 3747 } |
3771 pStream->setBitPos(bitpos); | 3748 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; |
3772 for(i = 0; (FX_DWORD)i < (* pImage)->m_nStride * GBH; i++) { | 3749 m_DecodeType = 2; |
3773 (* pImage)->m_pData[i] = ~(* pImage)->m_pData[i]; | 3750 m_pPause = pPause; |
3774 } | 3751 m_pImage = pImage; |
| 3752 (*m_pImage)->fill(0); |
| 3753 LTP = 0; |
| 3754 m_loopIndex = 0; |
| 3755 m_pArithDecoder = pArithDecoder; |
| 3756 m_gbContext = gbContext; |
| 3757 return decode_Arith_V2(pPause); |
| 3758 } |
| 3759 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause) { |
| 3760 FX_BOOL SLTP, bVal; |
| 3761 FX_DWORD CONTEXT; |
| 3762 CJBig2_Image* GBREG = *m_pImage; |
| 3763 FX_DWORD line1, line2, line3; |
| 3764 LTP = 0; |
| 3765 JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
| 3766 GBREG->fill(0); |
| 3767 for (; m_loopIndex < GBH; m_loopIndex++) { |
| 3768 if (TPGDON) { |
| 3769 switch (GBTEMPLATE) { |
| 3770 case 0: |
| 3771 CONTEXT = 0x9b25; |
| 3772 break; |
| 3773 case 1: |
| 3774 CONTEXT = 0x0795; |
| 3775 break; |
| 3776 case 2: |
| 3777 CONTEXT = 0x00e5; |
| 3778 break; |
| 3779 case 3: |
| 3780 CONTEXT = 0x0195; |
| 3781 break; |
| 3782 } |
| 3783 SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
| 3784 LTP = LTP ^ SLTP; |
| 3785 } |
| 3786 if (LTP == 1) { |
| 3787 GBREG->copyLine(m_loopIndex, m_loopIndex - 1); |
| 3788 } else { |
| 3789 switch (GBTEMPLATE) { |
| 3790 case 0: { |
| 3791 line1 = GBREG->getPixel(1, m_loopIndex - 2); |
| 3792 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1; |
| 3793 line2 = GBREG->getPixel(2, m_loopIndex - 1); |
| 3794 line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1; |
| 3795 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2; |
| 3796 line3 = 0; |
| 3797 for (FX_DWORD w = 0; w < GBW; w++) { |
| 3798 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
| 3799 bVal = 0; |
| 3800 } else { |
| 3801 CONTEXT = line3; |
| 3802 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
| 3803 << 4; |
| 3804 CONTEXT |= line2 << 5; |
| 3805 CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) |
| 3806 << 10; |
| 3807 CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) |
| 3808 << 11; |
| 3809 CONTEXT |= line1 << 12; |
| 3810 CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) |
| 3811 << 15; |
| 3812 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
| 3813 } |
| 3814 if (bVal) { |
| 3815 GBREG->setPixel(w, m_loopIndex, bVal); |
| 3816 } |
| 3817 line1 = |
| 3818 ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
| 3819 line2 = |
| 3820 ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f; |
| 3821 line3 = ((line3 << 1) | bVal) & 0x0f; |
| 3822 } |
| 3823 } break; |
| 3824 case 1: { |
| 3825 line1 = GBREG->getPixel(2, m_loopIndex - 2); |
| 3826 line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1; |
| 3827 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2; |
| 3828 line2 = GBREG->getPixel(2, m_loopIndex - 1); |
| 3829 line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1; |
| 3830 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2; |
| 3831 line3 = 0; |
| 3832 for (FX_DWORD w = 0; w < GBW; w++) { |
| 3833 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
| 3834 bVal = 0; |
| 3835 } else { |
| 3836 CONTEXT = line3; |
| 3837 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
| 3838 << 3; |
| 3839 CONTEXT |= line2 << 4; |
| 3840 CONTEXT |= line1 << 9; |
| 3841 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
| 3842 } |
| 3843 if (bVal) { |
| 3844 GBREG->setPixel(w, m_loopIndex, bVal); |
| 3845 } |
| 3846 line1 = |
| 3847 ((line1 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 2)) & 0x0f; |
| 3848 line2 = |
| 3849 ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f; |
| 3850 line3 = ((line3 << 1) | bVal) & 0x07; |
| 3851 } |
| 3852 } break; |
| 3853 case 2: { |
| 3854 line1 = GBREG->getPixel(1, m_loopIndex - 2); |
| 3855 line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1; |
| 3856 line2 = GBREG->getPixel(1, m_loopIndex - 1); |
| 3857 line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1; |
| 3858 line3 = 0; |
| 3859 for (FX_DWORD w = 0; w < GBW; w++) { |
| 3860 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
| 3861 bVal = 0; |
| 3862 } else { |
| 3863 CONTEXT = line3; |
| 3864 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
| 3865 << 2; |
| 3866 CONTEXT |= line2 << 3; |
| 3867 CONTEXT |= line1 << 7; |
| 3868 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
| 3869 } |
| 3870 if (bVal) { |
| 3871 GBREG->setPixel(w, m_loopIndex, bVal); |
| 3872 } |
| 3873 line1 = |
| 3874 ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
| 3875 line2 = |
| 3876 ((line2 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x0f; |
| 3877 line3 = ((line3 << 1) | bVal) & 0x03; |
| 3878 } |
| 3879 } break; |
| 3880 case 3: { |
| 3881 line1 = GBREG->getPixel(1, m_loopIndex - 1); |
| 3882 line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1; |
| 3883 line2 = 0; |
| 3884 for (FX_DWORD w = 0; w < GBW; w++) { |
| 3885 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
| 3886 bVal = 0; |
| 3887 } else { |
| 3888 CONTEXT = line2; |
| 3889 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
| 3890 << 4; |
| 3891 CONTEXT |= line1 << 5; |
| 3892 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
| 3893 } |
| 3894 if (bVal) { |
| 3895 GBREG->setPixel(w, m_loopIndex, bVal); |
| 3896 } |
| 3897 line1 = |
| 3898 ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x1f; |
| 3899 line2 = ((line2 << 1) | bVal) & 0x0f; |
| 3900 } |
| 3901 } break; |
| 3902 } |
| 3903 } |
| 3904 if (pPause && pPause->NeedToPauseNow()) { |
| 3905 m_loopIndex++; |
| 3906 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 3907 return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 3908 } |
| 3909 } |
| 3910 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
| 3911 return FXCODEC_STATUS_DECODE_FINISH; |
| 3912 } |
| 3913 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1( |
| 3914 CJBig2_Image** pImage, |
| 3915 CJBig2_ArithDecoder* pArithDecoder, |
| 3916 JBig2ArithCtx* gbContext, |
| 3917 IFX_Pause* pPause) { |
| 3918 if (GBW == 0 || GBH == 0) { |
| 3919 *pImage = NULL; |
3775 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | 3920 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
3776 return m_ProssiveStatus; | 3921 return FXCODEC_STATUS_DECODE_FINISH; |
3777 } | 3922 } |
3778 FXCODEC_STATUS CJBig2_GRDProc::decode_MMR() | 3923 if (*pImage == NULL) { |
3779 { | 3924 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
3780 return m_ProssiveStatus; | 3925 } |
3781 } | 3926 if ((*pImage)->m_pData == NULL) { |
3782 FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause) | 3927 delete *pImage; |
3783 { | 3928 *pImage = NULL; |
3784 if(m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 3929 m_pModule->JBig2_Error( |
3785 return m_ProssiveStatus; | 3930 "Generic region decoding procedure: Create Image Failed with width = " |
3786 } | 3931 "%d, height = %d\n", |
3787 switch (m_DecodeType) { | 3932 GBW, GBH); |
| 3933 m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
| 3934 return FXCODEC_STATUS_ERROR; |
| 3935 } |
| 3936 m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; |
| 3937 m_pPause = pPause; |
| 3938 m_pImage = pImage; |
| 3939 m_DecodeType = 3; |
| 3940 (*m_pImage)->fill(0); |
| 3941 LTP = 0; |
| 3942 m_loopIndex = 0; |
| 3943 m_pArithDecoder = pArithDecoder; |
| 3944 m_gbContext = gbContext; |
| 3945 return decode_Arith_V1(pPause); |
| 3946 } |
| 3947 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause) { |
| 3948 FX_BOOL SLTP, bVal; |
| 3949 FX_DWORD CONTEXT = 0; |
| 3950 CJBig2_Image* GBREG = (*m_pImage); |
| 3951 for (; m_loopIndex < GBH; m_loopIndex++) { |
| 3952 if (TPGDON) { |
| 3953 switch (GBTEMPLATE) { |
| 3954 case 0: |
| 3955 CONTEXT = 0x9b25; |
| 3956 break; |
3788 case 1: | 3957 case 1: |
3789 return decode_Arith(pPause); | 3958 CONTEXT = 0x0795; |
| 3959 break; |
3790 case 2: | 3960 case 2: |
3791 return decode_Arith_V2(pPause); | 3961 CONTEXT = 0x00e5; |
| 3962 break; |
3792 case 3: | 3963 case 3: |
3793 return decode_Arith_V1(pPause); | 3964 CONTEXT = 0x0195; |
3794 case 4: | 3965 break; |
3795 return decode_MMR(); | 3966 } |
3796 } | 3967 SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
| 3968 LTP = LTP ^ SLTP; |
| 3969 } |
| 3970 if (LTP == 1) { |
| 3971 for (FX_DWORD w = 0; w < GBW; w++) { |
| 3972 GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex - 1)); |
| 3973 } |
| 3974 } else { |
| 3975 for (FX_DWORD w = 0; w < GBW; w++) { |
| 3976 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
| 3977 GBREG->setPixel(w, m_loopIndex, 0); |
| 3978 } else { |
| 3979 CONTEXT = 0; |
| 3980 switch (GBTEMPLATE) { |
| 3981 case 0: |
| 3982 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
| 3983 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
| 3984 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; |
| 3985 CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3; |
| 3986 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
| 3987 << 4; |
| 3988 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 5; |
| 3989 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 6; |
| 3990 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7; |
| 3991 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 8; |
| 3992 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 9; |
| 3993 CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) |
| 3994 << 10; |
| 3995 CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) |
| 3996 << 11; |
| 3997 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 12; |
| 3998 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13; |
| 3999 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 14; |
| 4000 CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) |
| 4001 << 15; |
| 4002 break; |
| 4003 case 1: |
| 4004 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
| 4005 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
| 4006 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; |
| 4007 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
| 4008 << 3; |
| 4009 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 4; |
| 4010 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5; |
| 4011 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6; |
| 4012 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7; |
| 4013 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8; |
| 4014 CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) << 9; |
| 4015 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 10; |
| 4016 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11; |
| 4017 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 12; |
| 4018 break; |
| 4019 case 2: |
| 4020 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
| 4021 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
| 4022 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
| 4023 << 2; |
| 4024 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 3; |
| 4025 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4; |
| 4026 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 5; |
| 4027 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 6; |
| 4028 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 7; |
| 4029 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8; |
| 4030 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 9; |
| 4031 break; |
| 4032 case 3: |
| 4033 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
| 4034 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
| 4035 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; |
| 4036 CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3; |
| 4037 CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
| 4038 << 4; |
| 4039 CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5; |
| 4040 CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6; |
| 4041 CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7; |
| 4042 CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8; |
| 4043 CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) << 9; |
| 4044 break; |
| 4045 } |
| 4046 bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
| 4047 GBREG->setPixel(w, m_loopIndex, bVal); |
| 4048 } |
| 4049 } |
| 4050 } |
| 4051 if (pPause && pPause->NeedToPauseNow()) { |
| 4052 m_loopIndex++; |
| 4053 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 4054 return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 4055 } |
| 4056 } |
| 4057 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
| 4058 return FXCODEC_STATUS_DECODE_FINISH; |
| 4059 } |
| 4060 FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, |
| 4061 CJBig2_BitStream* pStream, |
| 4062 IFX_Pause* pPause) { |
| 4063 int bitpos, i; |
| 4064 JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
| 4065 if ((*pImage)->m_pData == NULL) { |
| 4066 delete (*pImage); |
| 4067 (*pImage) = NULL; |
| 4068 m_pModule->JBig2_Error( |
| 4069 "Generic region decoding procedure: Create Image Failed with width = " |
| 4070 "%d, height = %d\n", |
| 4071 GBW, GBH); |
3797 m_ProssiveStatus = FXCODEC_STATUS_ERROR; | 4072 m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
3798 return m_ProssiveStatus; | 4073 return m_ProssiveStatus; |
3799 } | 4074 } |
3800 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_Image *pImage,
CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause
) | 4075 bitpos = (int)pStream->getBitPos(); |
3801 { | 4076 _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, |
3802 FX_BOOL SLTP, bVal; | 4077 (*pImage)->m_pData, GBW, GBH, (*pImage)->m_nStride); |
3803 FX_DWORD CONTEXT; | 4078 pStream->setBitPos(bitpos); |
3804 FX_DWORD line1, line2; | 4079 for (i = 0; (FX_DWORD)i < (*pImage)->m_nStride * GBH; i++) { |
3805 uint8_t *pLine1, *pLine2, cVal; | 4080 (*pImage)->m_pData[i] = ~(*pImage)->m_pData[i]; |
3806 int32_t nStride, nStride2, k; | 4081 } |
3807 int32_t nLineBytes, nBitsLeft, cc; | 4082 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
3808 if(m_pLine == NULL) { | 4083 return m_ProssiveStatus; |
3809 m_pLine = pImage->m_pData; | 4084 } |
3810 } | 4085 FXCODEC_STATUS CJBig2_GRDProc::decode_MMR() { |
3811 nStride = pImage->m_nStride; | 4086 return m_ProssiveStatus; |
3812 nStride2 = nStride << 1; | 4087 } |
3813 nLineBytes = ((GBW + 7) >> 3) - 1; | 4088 FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause) { |
3814 nBitsLeft = GBW - (nLineBytes << 3); | 4089 if (m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
3815 FX_DWORD height = GBH & 0x7fffffff; | 4090 return m_ProssiveStatus; |
3816 for(; m_loopIndex < height; m_loopIndex++) { | 4091 } |
3817 if(TPGDON) { | 4092 switch (m_DecodeType) { |
3818 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); | 4093 case 1: |
3819 LTP = LTP ^ SLTP; | 4094 return decode_Arith(pPause); |
3820 } | 4095 case 2: |
3821 if(LTP == 1) { | 4096 return decode_Arith_V2(pPause); |
3822 pImage->copyLine(m_loopIndex, m_loopIndex - 1); | 4097 case 3: |
| 4098 return decode_Arith_V1(pPause); |
| 4099 case 4: |
| 4100 return decode_MMR(); |
| 4101 } |
| 4102 m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
| 4103 return m_ProssiveStatus; |
| 4104 } |
| 4105 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3( |
| 4106 CJBig2_Image* pImage, |
| 4107 CJBig2_ArithDecoder* pArithDecoder, |
| 4108 JBig2ArithCtx* gbContext, |
| 4109 IFX_Pause* pPause) { |
| 4110 FX_BOOL SLTP, bVal; |
| 4111 FX_DWORD CONTEXT; |
| 4112 FX_DWORD line1, line2; |
| 4113 uint8_t *pLine1, *pLine2, cVal; |
| 4114 int32_t nStride, nStride2, k; |
| 4115 int32_t nLineBytes, nBitsLeft, cc; |
| 4116 if (m_pLine == NULL) { |
| 4117 m_pLine = pImage->m_pData; |
| 4118 } |
| 4119 nStride = pImage->m_nStride; |
| 4120 nStride2 = nStride << 1; |
| 4121 nLineBytes = ((GBW + 7) >> 3) - 1; |
| 4122 nBitsLeft = GBW - (nLineBytes << 3); |
| 4123 FX_DWORD height = GBH & 0x7fffffff; |
| 4124 for (; m_loopIndex < height; m_loopIndex++) { |
| 4125 if (TPGDON) { |
| 4126 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
| 4127 LTP = LTP ^ SLTP; |
| 4128 } |
| 4129 if (LTP == 1) { |
| 4130 pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
| 4131 } else { |
| 4132 if (m_loopIndex > 1) { |
| 4133 pLine1 = m_pLine - nStride2; |
| 4134 pLine2 = m_pLine - nStride; |
| 4135 line1 = (*pLine1++) << 6; |
| 4136 line2 = *pLine2++; |
| 4137 CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); |
| 4138 for (cc = 0; cc < nLineBytes; cc++) { |
| 4139 line1 = (line1 << 8) | ((*pLine1++) << 6); |
| 4140 line2 = (line2 << 8) | (*pLine2++); |
| 4141 cVal = 0; |
| 4142 for (k = 7; k >= 0; k--) { |
| 4143 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4144 cVal |= bVal << k; |
| 4145 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | |
| 4146 ((line1 >> k) & 0x0800) | ((line2 >> k) & 0x0010)); |
| 4147 } |
| 4148 m_pLine[cc] = cVal; |
| 4149 } |
| 4150 line1 <<= 8; |
| 4151 line2 <<= 8; |
| 4152 cVal = 0; |
| 4153 for (k = 0; k < nBitsLeft; k++) { |
| 4154 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4155 cVal |= bVal << (7 - k); |
| 4156 CONTEXT = |
| 4157 (((CONTEXT & 0x7bf7) << 1) | bVal | |
| 4158 ((line1 >> (7 - k)) & 0x0800) | ((line2 >> (7 - k)) & 0x0010)); |
| 4159 } |
| 4160 m_pLine[nLineBytes] = cVal; |
| 4161 } else { |
| 4162 pLine2 = m_pLine - nStride; |
| 4163 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; |
| 4164 CONTEXT = (line2 & 0x07f0); |
| 4165 for (cc = 0; cc < nLineBytes; cc++) { |
| 4166 if (m_loopIndex & 1) { |
| 4167 line2 = (line2 << 8) | (*pLine2++); |
| 4168 } |
| 4169 cVal = 0; |
| 4170 for (k = 7; k >= 0; k--) { |
| 4171 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4172 cVal |= bVal << k; |
| 4173 CONTEXT = |
| 4174 (((CONTEXT & 0x7bf7) << 1) | bVal | ((line2 >> k) & 0x0010)); |
| 4175 } |
| 4176 m_pLine[cc] = cVal; |
| 4177 } |
| 4178 line2 <<= 8; |
| 4179 cVal = 0; |
| 4180 for (k = 0; k < nBitsLeft; k++) { |
| 4181 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4182 cVal |= bVal << (7 - k); |
| 4183 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | |
| 4184 ((line2 >> (7 - k)) & 0x0010)); |
| 4185 } |
| 4186 m_pLine[nLineBytes] = cVal; |
| 4187 } |
| 4188 } |
| 4189 m_pLine += nStride; |
| 4190 if (pPause && pPause->NeedToPauseNow()) { |
| 4191 m_loopIndex++; |
| 4192 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 4193 return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 4194 } |
| 4195 } |
| 4196 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
| 4197 return FXCODEC_STATUS_DECODE_FINISH; |
| 4198 } |
| 4199 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt( |
| 4200 CJBig2_Image* pImage, |
| 4201 CJBig2_ArithDecoder* pArithDecoder, |
| 4202 JBig2ArithCtx* gbContext, |
| 4203 IFX_Pause* pPause) { |
| 4204 FX_BOOL SLTP, bVal; |
| 4205 FX_DWORD CONTEXT; |
| 4206 FX_DWORD line1, line2, line3; |
| 4207 for (; m_loopIndex < GBH; m_loopIndex++) { |
| 4208 if (TPGDON) { |
| 4209 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
| 4210 LTP = LTP ^ SLTP; |
| 4211 } |
| 4212 if (LTP == 1) { |
| 4213 pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
| 4214 } else { |
| 4215 line1 = pImage->getPixel(1, m_loopIndex - 2); |
| 4216 line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; |
| 4217 line2 = pImage->getPixel(2, m_loopIndex - 1); |
| 4218 line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1; |
| 4219 line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2; |
| 4220 line3 = 0; |
| 4221 for (FX_DWORD w = 0; w < GBW; w++) { |
| 4222 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
| 4223 bVal = 0; |
3823 } else { | 4224 } else { |
3824 if(m_loopIndex > 1) { | 4225 CONTEXT = line3; |
3825 pLine1 = m_pLine - nStride2; | 4226 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; |
3826 pLine2 = m_pLine - nStride; | 4227 CONTEXT |= line2 << 5; |
3827 line1 = (*pLine1++) << 6; | 4228 CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10; |
3828 line2 = *pLine2++; | 4229 CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11; |
3829 CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); | 4230 CONTEXT |= line1 << 12; |
3830 for(cc = 0; cc < nLineBytes; cc++) { | 4231 CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15; |
3831 line1 = (line1 << 8) | ((*pLine1++) << 6); | 4232 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
3832 line2 = (line2 << 8) | (*pLine2++); | 4233 } |
3833 cVal = 0; | 4234 if (bVal) { |
3834 for(k = 7; k >= 0; k--) { | 4235 pImage->setPixel(w, m_loopIndex, bVal); |
3835 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 4236 } |
3836 cVal |= bVal << k; | 4237 line1 = |
3837 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | 4238 ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
3838 | ((line1 >> k) & 0x0800) | 4239 line2 = |
3839 | ((line2 >> k) & 0x0010)); | 4240 ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)) & 0x1f; |
3840 } | 4241 line3 = ((line3 << 1) | bVal) & 0x0f; |
3841 m_pLine[cc] = cVal; | 4242 } |
3842 } | 4243 } |
3843 line1 <<= 8; | 4244 if (pPause && pPause->NeedToPauseNow()) { |
3844 line2 <<= 8; | 4245 m_loopIndex++; |
3845 cVal = 0; | 4246 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
3846 for(k = 0; k < nBitsLeft; k++) { | 4247 return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
3847 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 4248 } |
3848 cVal |= bVal << (7 - k); | 4249 } |
3849 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | 4250 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
3850 | ((line1 >> (7 - k)) & 0x0800) | 4251 return FXCODEC_STATUS_DECODE_FINISH; |
3851 | ((line2 >> (7 - k)) & 0x0010)); | 4252 } |
3852 } | 4253 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3( |
3853 m_pLine[nLineBytes] = cVal; | 4254 CJBig2_Image* pImage, |
3854 } else { | 4255 CJBig2_ArithDecoder* pArithDecoder, |
3855 pLine2 = m_pLine - nStride; | 4256 JBig2ArithCtx* gbContext, |
3856 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; | 4257 IFX_Pause* pPause) { |
3857 CONTEXT = (line2 & 0x07f0); | 4258 FX_BOOL SLTP, bVal; |
3858 for(cc = 0; cc < nLineBytes; cc++) { | 4259 FX_DWORD CONTEXT; |
3859 if(m_loopIndex & 1) { | 4260 FX_DWORD line1, line2; |
3860 line2 = (line2 << 8) | (*pLine2++); | 4261 uint8_t *pLine1, *pLine2, cVal; |
3861 } | 4262 int32_t nStride, nStride2, k; |
3862 cVal = 0; | 4263 int32_t nLineBytes, nBitsLeft, cc; |
3863 for(k = 7; k >= 0; k--) { | 4264 if (!m_pLine) { |
3864 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 4265 m_pLine = pImage->m_pData; |
3865 cVal |= bVal << k; | 4266 } |
3866 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | 4267 nStride = pImage->m_nStride; |
3867 | ((line2 >> k) & 0x0010)); | 4268 nStride2 = nStride << 1; |
3868 } | 4269 nLineBytes = ((GBW + 7) >> 3) - 1; |
3869 m_pLine[cc] = cVal; | 4270 nBitsLeft = GBW - (nLineBytes << 3); |
3870 } | 4271 for (; m_loopIndex < GBH; m_loopIndex++) { |
3871 line2 <<= 8; | 4272 if (TPGDON) { |
3872 cVal = 0; | 4273 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
3873 for(k = 0; k < nBitsLeft; k++) { | 4274 LTP = LTP ^ SLTP; |
3874 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 4275 } |
3875 cVal |= bVal << (7 - k); | 4276 if (LTP == 1) { |
3876 CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | 4277 pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
3877 | ((line2 >> (7 - k)) & 0x0010)); | 4278 } else { |
3878 } | 4279 if (m_loopIndex > 1) { |
3879 m_pLine[nLineBytes] = cVal; | 4280 pLine1 = m_pLine - nStride2; |
3880 } | 4281 pLine2 = m_pLine - nStride; |
3881 } | 4282 line1 = (*pLine1++) << 4; |
3882 m_pLine += nStride; | 4283 line2 = *pLine2++; |
3883 if(pPause && pPause->NeedToPauseNow()) { | 4284 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); |
3884 m_loopIndex++; | 4285 for (cc = 0; cc < nLineBytes; cc++) { |
3885 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | 4286 line1 = (line1 << 8) | ((*pLine1++) << 4); |
3886 return FXCODEC_STATUS_DECODE_TOBECONTINUE; | 4287 line2 = (line2 << 8) | (*pLine2++); |
3887 } | 4288 cVal = 0; |
3888 } | 4289 for (k = 7; k >= 0; k--) { |
3889 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | 4290 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
3890 return FXCODEC_STATUS_DECODE_FINISH; | 4291 cVal |= bVal << k; |
3891 } | 4292 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
3892 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_Image * pImag
e, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPau
se) | 4293 ((line1 >> k) & 0x0200) | ((line2 >> (k + 1)) & 0x0008); |
3893 { | 4294 } |
3894 FX_BOOL SLTP, bVal; | 4295 m_pLine[cc] = cVal; |
3895 FX_DWORD CONTEXT; | 4296 } |
3896 FX_DWORD line1, line2, line3; | 4297 line1 <<= 8; |
3897 for(; m_loopIndex < GBH; m_loopIndex++) { | 4298 line2 <<= 8; |
3898 if(TPGDON) { | 4299 cVal = 0; |
3899 SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); | 4300 for (k = 0; k < nBitsLeft; k++) { |
3900 LTP = LTP ^ SLTP; | 4301 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
3901 } | 4302 cVal |= bVal << (7 - k); |
3902 if(LTP == 1) { | 4303 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
3903 pImage->copyLine(m_loopIndex, m_loopIndex - 1); | 4304 ((line1 >> (7 - k)) & 0x0200) | |
| 4305 ((line2 >> (8 - k)) & 0x0008); |
| 4306 } |
| 4307 m_pLine[nLineBytes] = cVal; |
| 4308 } else { |
| 4309 pLine2 = m_pLine - nStride; |
| 4310 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; |
| 4311 CONTEXT = (line2 >> 1) & 0x01f8; |
| 4312 for (cc = 0; cc < nLineBytes; cc++) { |
| 4313 if (m_loopIndex & 1) { |
| 4314 line2 = (line2 << 8) | (*pLine2++); |
| 4315 } |
| 4316 cVal = 0; |
| 4317 for (k = 7; k >= 0; k--) { |
| 4318 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4319 cVal |= bVal << k; |
| 4320 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
| 4321 ((line2 >> (k + 1)) & 0x0008); |
| 4322 } |
| 4323 m_pLine[cc] = cVal; |
| 4324 } |
| 4325 line2 <<= 8; |
| 4326 cVal = 0; |
| 4327 for (k = 0; k < nBitsLeft; k++) { |
| 4328 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4329 cVal |= bVal << (7 - k); |
| 4330 CONTEXT = |
| 4331 ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008); |
| 4332 } |
| 4333 m_pLine[nLineBytes] = cVal; |
| 4334 } |
| 4335 } |
| 4336 m_pLine += nStride; |
| 4337 if (pPause && pPause->NeedToPauseNow()) { |
| 4338 m_loopIndex++; |
| 4339 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 4340 return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 4341 } |
| 4342 } |
| 4343 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
| 4344 return FXCODEC_STATUS_DECODE_FINISH; |
| 4345 } |
| 4346 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt( |
| 4347 CJBig2_Image* pImage, |
| 4348 CJBig2_ArithDecoder* pArithDecoder, |
| 4349 JBig2ArithCtx* gbContext, |
| 4350 IFX_Pause* pPause) { |
| 4351 FX_BOOL SLTP, bVal; |
| 4352 FX_DWORD CONTEXT; |
| 4353 FX_DWORD line1, line2, line3; |
| 4354 for (FX_DWORD h = 0; h < GBH; h++) { |
| 4355 if (TPGDON) { |
| 4356 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
| 4357 LTP = LTP ^ SLTP; |
| 4358 } |
| 4359 if (LTP == 1) { |
| 4360 pImage->copyLine(h, h - 1); |
| 4361 } else { |
| 4362 line1 = pImage->getPixel(2, h - 2); |
| 4363 line1 |= pImage->getPixel(1, h - 2) << 1; |
| 4364 line1 |= pImage->getPixel(0, h - 2) << 2; |
| 4365 line2 = pImage->getPixel(2, h - 1); |
| 4366 line2 |= pImage->getPixel(1, h - 1) << 1; |
| 4367 line2 |= pImage->getPixel(0, h - 1) << 2; |
| 4368 line3 = 0; |
| 4369 for (FX_DWORD w = 0; w < GBW; w++) { |
| 4370 if (USESKIP && SKIP->getPixel(w, h)) { |
| 4371 bVal = 0; |
3904 } else { | 4372 } else { |
3905 line1 = pImage->getPixel(1, m_loopIndex - 2); | 4373 CONTEXT = line3; |
3906 line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; | 4374 CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
3907 line2 = pImage->getPixel(2, m_loopIndex - 1); | 4375 CONTEXT |= line2 << 4; |
3908 line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1; | 4376 CONTEXT |= line1 << 9; |
3909 line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2; | 4377 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
3910 line3 = 0; | 4378 } |
3911 for(FX_DWORD w = 0; w < GBW; w++) { | 4379 if (bVal) { |
3912 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { | 4380 pImage->setPixel(w, h, bVal); |
3913 bVal = 0; | 4381 } |
3914 } else { | 4382 line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f; |
3915 CONTEXT = line3; | 4383 line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f; |
3916 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[
1]) << 4; | 4384 line3 = ((line3 << 1) | bVal) & 0x07; |
3917 CONTEXT |= line2 << 5; | 4385 } |
3918 CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[
3]) << 10; | 4386 } |
3919 CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[
5]) << 11; | 4387 if (pPause && pPause->NeedToPauseNow()) { |
3920 CONTEXT |= line1 << 12; | 4388 m_loopIndex++; |
3921 CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[
7]) << 15; | 4389 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
3922 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 4390 return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
3923 } | 4391 } |
3924 if(bVal) { | 4392 } |
3925 pImage->setPixel(w, m_loopIndex, bVal); | 4393 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
3926 } | 4394 return FXCODEC_STATUS_DECODE_FINISH; |
3927 line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)
) & 0x07; | 4395 } |
3928 line2 = ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)
) & 0x1f; | 4396 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3( |
3929 line3 = ((line3 << 1) | bVal) & 0x0f; | 4397 CJBig2_Image* pImage, |
3930 } | 4398 CJBig2_ArithDecoder* pArithDecoder, |
3931 } | 4399 JBig2ArithCtx* gbContext, |
3932 if(pPause && pPause->NeedToPauseNow()) { | 4400 IFX_Pause* pPause) { |
3933 m_loopIndex++; | 4401 FX_BOOL SLTP, bVal; |
3934 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | 4402 FX_DWORD CONTEXT; |
3935 return FXCODEC_STATUS_DECODE_TOBECONTINUE; | 4403 FX_DWORD line1, line2; |
3936 } | 4404 uint8_t *pLine1, *pLine2, cVal; |
3937 } | 4405 int32_t nStride, nStride2, k; |
3938 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | 4406 int32_t nLineBytes, nBitsLeft, cc; |
3939 return FXCODEC_STATUS_DECODE_FINISH; | 4407 if (!m_pLine) { |
3940 } | 4408 m_pLine = pImage->m_pData; |
3941 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_Image *pImage,
CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause
) | 4409 } |
3942 { | 4410 nStride = pImage->m_nStride; |
3943 FX_BOOL SLTP, bVal; | 4411 nStride2 = nStride << 1; |
3944 FX_DWORD CONTEXT; | 4412 nLineBytes = ((GBW + 7) >> 3) - 1; |
3945 FX_DWORD line1, line2; | 4413 nBitsLeft = GBW - (nLineBytes << 3); |
3946 uint8_t *pLine1, *pLine2, cVal; | 4414 for (; m_loopIndex < GBH; m_loopIndex++) { |
3947 int32_t nStride, nStride2, k; | 4415 if (TPGDON) { |
3948 int32_t nLineBytes, nBitsLeft, cc; | 4416 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
3949 if (!m_pLine) { | 4417 LTP = LTP ^ SLTP; |
3950 m_pLine = pImage->m_pData; | 4418 } |
3951 } | 4419 if (LTP == 1) { |
3952 nStride = pImage->m_nStride; | 4420 pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
3953 nStride2 = nStride << 1; | 4421 } else { |
3954 nLineBytes = ((GBW + 7) >> 3) - 1; | 4422 if (m_loopIndex > 1) { |
3955 nBitsLeft = GBW - (nLineBytes << 3); | 4423 pLine1 = m_pLine - nStride2; |
3956 for(; m_loopIndex < GBH; m_loopIndex++) { | 4424 pLine2 = m_pLine - nStride; |
3957 if(TPGDON) { | 4425 line1 = (*pLine1++) << 1; |
3958 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); | 4426 line2 = *pLine2++; |
3959 LTP = LTP ^ SLTP; | 4427 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); |
3960 } | 4428 for (cc = 0; cc < nLineBytes; cc++) { |
3961 if(LTP == 1) { | 4429 line1 = (line1 << 8) | ((*pLine1++) << 1); |
3962 pImage->copyLine(m_loopIndex, m_loopIndex - 1); | 4430 line2 = (line2 << 8) | (*pLine2++); |
| 4431 cVal = 0; |
| 4432 for (k = 7; k >= 0; k--) { |
| 4433 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4434 cVal |= bVal << k; |
| 4435 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
| 4436 ((line1 >> k) & 0x0080) | ((line2 >> (k + 3)) & 0x0004); |
| 4437 } |
| 4438 m_pLine[cc] = cVal; |
| 4439 } |
| 4440 line1 <<= 8; |
| 4441 line2 <<= 8; |
| 4442 cVal = 0; |
| 4443 for (k = 0; k < nBitsLeft; k++) { |
| 4444 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4445 cVal |= bVal << (7 - k); |
| 4446 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
| 4447 ((line1 >> (7 - k)) & 0x0080) | |
| 4448 ((line2 >> (10 - k)) & 0x0004); |
| 4449 } |
| 4450 m_pLine[nLineBytes] = cVal; |
| 4451 } else { |
| 4452 pLine2 = m_pLine - nStride; |
| 4453 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; |
| 4454 CONTEXT = (line2 >> 3) & 0x007c; |
| 4455 for (cc = 0; cc < nLineBytes; cc++) { |
| 4456 if (m_loopIndex & 1) { |
| 4457 line2 = (line2 << 8) | (*pLine2++); |
| 4458 } |
| 4459 cVal = 0; |
| 4460 for (k = 7; k >= 0; k--) { |
| 4461 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4462 cVal |= bVal << k; |
| 4463 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
| 4464 ((line2 >> (k + 3)) & 0x0004); |
| 4465 } |
| 4466 m_pLine[cc] = cVal; |
| 4467 } |
| 4468 line2 <<= 8; |
| 4469 cVal = 0; |
| 4470 for (k = 0; k < nBitsLeft; k++) { |
| 4471 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4472 cVal |= bVal << (7 - k); |
| 4473 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
| 4474 (((line2 >> (10 - k))) & 0x0004); |
| 4475 } |
| 4476 m_pLine[nLineBytes] = cVal; |
| 4477 } |
| 4478 } |
| 4479 m_pLine += nStride; |
| 4480 if (pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) { |
| 4481 m_loopIndex++; |
| 4482 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 4483 return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 4484 } |
| 4485 } |
| 4486 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
| 4487 return FXCODEC_STATUS_DECODE_FINISH; |
| 4488 } |
| 4489 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt( |
| 4490 CJBig2_Image* pImage, |
| 4491 CJBig2_ArithDecoder* pArithDecoder, |
| 4492 JBig2ArithCtx* gbContext, |
| 4493 IFX_Pause* pPause) { |
| 4494 FX_BOOL SLTP, bVal; |
| 4495 FX_DWORD CONTEXT; |
| 4496 FX_DWORD line1, line2, line3; |
| 4497 for (; m_loopIndex < GBH; m_loopIndex++) { |
| 4498 if (TPGDON) { |
| 4499 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
| 4500 LTP = LTP ^ SLTP; |
| 4501 } |
| 4502 if (LTP == 1) { |
| 4503 pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
| 4504 } else { |
| 4505 line1 = pImage->getPixel(1, m_loopIndex - 2); |
| 4506 line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; |
| 4507 line2 = pImage->getPixel(1, m_loopIndex - 1); |
| 4508 line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1; |
| 4509 line3 = 0; |
| 4510 for (FX_DWORD w = 0; w < GBW; w++) { |
| 4511 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
| 4512 bVal = 0; |
3963 } else { | 4513 } else { |
3964 if(m_loopIndex > 1) { | 4514 CONTEXT = line3; |
3965 pLine1 = m_pLine - nStride2; | 4515 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2; |
3966 pLine2 = m_pLine - nStride; | 4516 CONTEXT |= line2 << 3; |
3967 line1 = (*pLine1++) << 4; | 4517 CONTEXT |= line1 << 7; |
3968 line2 = *pLine2++; | 4518 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
3969 CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); | 4519 } |
3970 for(cc = 0; cc < nLineBytes; cc++) { | 4520 if (bVal) { |
3971 line1 = (line1 << 8) | ((*pLine1++) << 4); | 4521 pImage->setPixel(w, m_loopIndex, bVal); |
3972 line2 = (line2 << 8) | (*pLine2++); | 4522 } |
3973 cVal = 0; | 4523 line1 = |
3974 for(k = 7; k >= 0; k--) { | 4524 ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
3975 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 4525 line2 = |
3976 cVal |= bVal << k; | 4526 ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x0f; |
3977 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | 4527 line3 = ((line3 << 1) | bVal) & 0x03; |
3978 | ((line1 >> k) & 0x0200) | 4528 } |
3979 | ((line2 >> (k + 1)) & 0x0008); | 4529 } |
3980 } | 4530 if (pPause && pPause->NeedToPauseNow()) { |
3981 m_pLine[cc] = cVal; | 4531 m_loopIndex++; |
3982 } | 4532 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
3983 line1 <<= 8; | 4533 return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
3984 line2 <<= 8; | 4534 } |
3985 cVal = 0; | 4535 } |
3986 for(k = 0; k < nBitsLeft; k++) { | 4536 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
3987 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 4537 return FXCODEC_STATUS_DECODE_FINISH; |
3988 cVal |= bVal << (7 - k); | 4538 } |
3989 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | 4539 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3( |
3990 | ((line1 >> (7 - k)) & 0x0200) | 4540 CJBig2_Image* pImage, |
3991 | ((line2 >> (8 - k)) & 0x0008); | 4541 CJBig2_ArithDecoder* pArithDecoder, |
3992 } | 4542 JBig2ArithCtx* gbContext, |
3993 m_pLine[nLineBytes] = cVal; | 4543 IFX_Pause* pPause) { |
3994 } else { | 4544 FX_BOOL SLTP, bVal; |
3995 pLine2 = m_pLine - nStride; | 4545 FX_DWORD CONTEXT; |
3996 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; | 4546 FX_DWORD line1; |
3997 CONTEXT = (line2 >> 1) & 0x01f8; | 4547 uint8_t *pLine1, cVal; |
3998 for(cc = 0; cc < nLineBytes; cc++) { | 4548 int32_t nStride, k; |
3999 if(m_loopIndex & 1) { | 4549 int32_t nLineBytes, nBitsLeft, cc; |
4000 line2 = (line2 << 8) | (*pLine2++); | 4550 if (!m_pLine) { |
4001 } | 4551 m_pLine = pImage->m_pData; |
4002 cVal = 0; | 4552 } |
4003 for(k = 7; k >= 0; k--) { | 4553 nStride = pImage->m_nStride; |
4004 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 4554 nLineBytes = ((GBW + 7) >> 3) - 1; |
4005 cVal |= bVal << k; | 4555 nBitsLeft = GBW - (nLineBytes << 3); |
4006 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | 4556 for (; m_loopIndex < GBH; m_loopIndex++) { |
4007 | ((line2 >> (k + 1)) & 0x0008); | 4557 if (TPGDON) { |
4008 } | 4558 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
4009 m_pLine[cc] = cVal; | 4559 LTP = LTP ^ SLTP; |
4010 } | 4560 } |
4011 line2 <<= 8; | 4561 if (LTP == 1) { |
4012 cVal = 0; | 4562 pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
4013 for(k = 0; k < nBitsLeft; k++) { | 4563 } else { |
4014 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 4564 if (m_loopIndex > 0) { |
4015 cVal |= bVal << (7 - k); | 4565 pLine1 = m_pLine - nStride; |
4016 CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | 4566 line1 = *pLine1++; |
4017 | ((line2 >> (8 - k)) & 0x0008); | 4567 CONTEXT = (line1 >> 1) & 0x03f0; |
4018 } | 4568 for (cc = 0; cc < nLineBytes; cc++) { |
4019 m_pLine[nLineBytes] = cVal; | 4569 line1 = (line1 << 8) | (*pLine1++); |
4020 } | 4570 cVal = 0; |
4021 } | 4571 for (k = 7; k >= 0; k--) { |
4022 m_pLine += nStride; | 4572 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
4023 if(pPause && pPause->NeedToPauseNow()) { | 4573 cVal |= bVal << k; |
4024 m_loopIndex++; | 4574 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | |
4025 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | 4575 ((line1 >> (k + 1)) & 0x0010); |
4026 return FXCODEC_STATUS_DECODE_TOBECONTINUE; | 4576 } |
4027 } | 4577 m_pLine[cc] = cVal; |
4028 } | 4578 } |
4029 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | 4579 line1 <<= 8; |
4030 return FXCODEC_STATUS_DECODE_FINISH; | 4580 cVal = 0; |
4031 } | 4581 for (k = 0; k < nBitsLeft; k++) { |
4032 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_Image * pImag
e, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPau
se) | 4582 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
4033 { | 4583 cVal |= bVal << (7 - k); |
4034 FX_BOOL SLTP, bVal; | 4584 CONTEXT = |
4035 FX_DWORD CONTEXT; | 4585 ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010); |
4036 FX_DWORD line1, line2, line3; | 4586 } |
4037 for(FX_DWORD h = 0; h < GBH; h++) { | 4587 m_pLine[nLineBytes] = cVal; |
4038 if(TPGDON) { | 4588 } else { |
4039 SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); | 4589 CONTEXT = 0; |
4040 LTP = LTP ^ SLTP; | 4590 for (cc = 0; cc < nLineBytes; cc++) { |
4041 } | 4591 cVal = 0; |
4042 if(LTP == 1) { | 4592 for (k = 7; k >= 0; k--) { |
4043 pImage->copyLine(h, h - 1); | 4593 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4594 cVal |= bVal << k; |
| 4595 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
| 4596 } |
| 4597 m_pLine[cc] = cVal; |
| 4598 } |
| 4599 cVal = 0; |
| 4600 for (k = 0; k < nBitsLeft; k++) { |
| 4601 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
| 4602 cVal |= bVal << (7 - k); |
| 4603 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
| 4604 } |
| 4605 m_pLine[nLineBytes] = cVal; |
| 4606 } |
| 4607 } |
| 4608 m_pLine += nStride; |
| 4609 if (pPause && pPause->NeedToPauseNow()) { |
| 4610 m_loopIndex++; |
| 4611 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 4612 return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
| 4613 } |
| 4614 } |
| 4615 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
| 4616 return FXCODEC_STATUS_DECODE_FINISH; |
| 4617 } |
| 4618 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt( |
| 4619 CJBig2_Image* pImage, |
| 4620 CJBig2_ArithDecoder* pArithDecoder, |
| 4621 JBig2ArithCtx* gbContext, |
| 4622 IFX_Pause* pPause) { |
| 4623 FX_BOOL SLTP, bVal; |
| 4624 FX_DWORD CONTEXT; |
| 4625 FX_DWORD line1, line2; |
| 4626 for (; m_loopIndex < GBH; m_loopIndex++) { |
| 4627 if (TPGDON) { |
| 4628 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
| 4629 LTP = LTP ^ SLTP; |
| 4630 } |
| 4631 if (LTP == 1) { |
| 4632 pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
| 4633 } else { |
| 4634 line1 = pImage->getPixel(1, m_loopIndex - 1); |
| 4635 line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1; |
| 4636 line2 = 0; |
| 4637 for (FX_DWORD w = 0; w < GBW; w++) { |
| 4638 if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
| 4639 bVal = 0; |
4044 } else { | 4640 } else { |
4045 line1 = pImage->getPixel(2, h - 2); | 4641 CONTEXT = line2; |
4046 line1 |= pImage->getPixel(1, h - 2) << 1; | 4642 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; |
4047 line1 |= pImage->getPixel(0, h - 2) << 2; | 4643 CONTEXT |= line1 << 5; |
4048 line2 = pImage->getPixel(2, h - 1); | 4644 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
4049 line2 |= pImage->getPixel(1, h - 1) << 1; | 4645 } |
4050 line2 |= pImage->getPixel(0, h - 1) << 2; | 4646 if (bVal) { |
4051 line3 = 0; | 4647 pImage->setPixel(w, m_loopIndex, bVal); |
4052 for(FX_DWORD w = 0; w < GBW; w++) { | 4648 } |
4053 if(USESKIP && SKIP->getPixel(w, h)) { | 4649 line1 = |
4054 bVal = 0; | 4650 ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x1f; |
4055 } else { | 4651 line2 = ((line2 << 1) | bVal) & 0x0f; |
4056 CONTEXT = line3; | 4652 } |
4057 CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3; | 4653 } |
4058 CONTEXT |= line2 << 4; | 4654 if (pPause && pPause->NeedToPauseNow()) { |
4059 CONTEXT |= line1 << 9; | 4655 m_loopIndex++; |
4060 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | 4656 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
4061 } | 4657 return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
4062 if(bVal) { | 4658 } |
4063 pImage->setPixel(w, h, bVal); | 4659 } |
4064 } | 4660 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
4065 line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f; | 4661 return FXCODEC_STATUS_DECODE_FINISH; |
4066 line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f; | 4662 } |
4067 line3 = ((line3 << 1) | bVal) & 0x07; | |
4068 } | |
4069 } | |
4070 if(pPause && pPause->NeedToPauseNow()) { | |
4071 m_loopIndex++; | |
4072 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
4073 return FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
4074 } | |
4075 } | |
4076 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | |
4077 return FXCODEC_STATUS_DECODE_FINISH; | |
4078 } | |
4079 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_Image *pImage,
CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause
) | |
4080 { | |
4081 FX_BOOL SLTP, bVal; | |
4082 FX_DWORD CONTEXT; | |
4083 FX_DWORD line1, line2; | |
4084 uint8_t *pLine1, *pLine2, cVal; | |
4085 int32_t nStride, nStride2, k; | |
4086 int32_t nLineBytes, nBitsLeft, cc; | |
4087 if(!m_pLine) { | |
4088 m_pLine = pImage->m_pData; | |
4089 } | |
4090 nStride = pImage->m_nStride; | |
4091 nStride2 = nStride << 1; | |
4092 nLineBytes = ((GBW + 7) >> 3) - 1; | |
4093 nBitsLeft = GBW - (nLineBytes << 3); | |
4094 for(; m_loopIndex < GBH; m_loopIndex++) { | |
4095 if(TPGDON) { | |
4096 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); | |
4097 LTP = LTP ^ SLTP; | |
4098 } | |
4099 if(LTP == 1) { | |
4100 pImage->copyLine(m_loopIndex, m_loopIndex - 1); | |
4101 } else { | |
4102 if(m_loopIndex > 1) { | |
4103 pLine1 = m_pLine - nStride2; | |
4104 pLine2 = m_pLine - nStride; | |
4105 line1 = (*pLine1++) << 1; | |
4106 line2 = *pLine2++; | |
4107 CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); | |
4108 for(cc = 0; cc < nLineBytes; cc++) { | |
4109 line1 = (line1 << 8) | ((*pLine1++) << 1); | |
4110 line2 = (line2 << 8) | (*pLine2++); | |
4111 cVal = 0; | |
4112 for(k = 7; k >= 0; k--) { | |
4113 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
4114 cVal |= bVal << k; | |
4115 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
4116 | ((line1 >> k) & 0x0080) | |
4117 | ((line2 >> (k + 3)) & 0x0004); | |
4118 } | |
4119 m_pLine[cc] = cVal; | |
4120 } | |
4121 line1 <<= 8; | |
4122 line2 <<= 8; | |
4123 cVal = 0; | |
4124 for(k = 0; k < nBitsLeft; k++) { | |
4125 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
4126 cVal |= bVal << (7 - k); | |
4127 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
4128 | ((line1 >> (7 - k)) & 0x0080) | |
4129 | ((line2 >> (10 - k)) & 0x0004); | |
4130 } | |
4131 m_pLine[nLineBytes] = cVal; | |
4132 } else { | |
4133 pLine2 = m_pLine - nStride; | |
4134 line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; | |
4135 CONTEXT = (line2 >> 3) & 0x007c; | |
4136 for(cc = 0; cc < nLineBytes; cc++) { | |
4137 if(m_loopIndex & 1) { | |
4138 line2 = (line2 << 8) | (*pLine2++); | |
4139 } | |
4140 cVal = 0; | |
4141 for(k = 7; k >= 0; k--) { | |
4142 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
4143 cVal |= bVal << k; | |
4144 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
4145 | ((line2 >> (k + 3)) & 0x0004); | |
4146 } | |
4147 m_pLine[cc] = cVal; | |
4148 } | |
4149 line2 <<= 8; | |
4150 cVal = 0; | |
4151 for(k = 0; k < nBitsLeft; k++) { | |
4152 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
4153 cVal |= bVal << (7 - k); | |
4154 CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
4155 | (((line2 >> (10 - k))) & 0x0004); | |
4156 } | |
4157 m_pLine[nLineBytes] = cVal; | |
4158 } | |
4159 } | |
4160 m_pLine += nStride; | |
4161 if(pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) { | |
4162 m_loopIndex++; | |
4163 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
4164 return FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
4165 } | |
4166 } | |
4167 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | |
4168 return FXCODEC_STATUS_DECODE_FINISH; | |
4169 } | |
4170 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_Image * pImag
e, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPau
se) | |
4171 { | |
4172 FX_BOOL SLTP, bVal; | |
4173 FX_DWORD CONTEXT; | |
4174 FX_DWORD line1, line2, line3; | |
4175 for(; m_loopIndex < GBH; m_loopIndex++) { | |
4176 if(TPGDON) { | |
4177 SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); | |
4178 LTP = LTP ^ SLTP; | |
4179 } | |
4180 if(LTP == 1) { | |
4181 pImage->copyLine(m_loopIndex, m_loopIndex - 1); | |
4182 } else { | |
4183 line1 = pImage->getPixel(1, m_loopIndex - 2); | |
4184 line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; | |
4185 line2 = pImage->getPixel(1, m_loopIndex - 1); | |
4186 line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1; | |
4187 line3 = 0; | |
4188 for(FX_DWORD w = 0; w < GBW; w++) { | |
4189 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { | |
4190 bVal = 0; | |
4191 } else { | |
4192 CONTEXT = line3; | |
4193 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[
1]) << 2; | |
4194 CONTEXT |= line2 << 3; | |
4195 CONTEXT |= line1 << 7; | |
4196 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
4197 } | |
4198 if(bVal) { | |
4199 pImage->setPixel(w, m_loopIndex, bVal); | |
4200 } | |
4201 line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)
) & 0x07; | |
4202 line2 = ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)
) & 0x0f; | |
4203 line3 = ((line3 << 1) | bVal) & 0x03; | |
4204 } | |
4205 } | |
4206 if(pPause && pPause->NeedToPauseNow()) { | |
4207 m_loopIndex++; | |
4208 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
4209 return FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
4210 } | |
4211 } | |
4212 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | |
4213 return FXCODEC_STATUS_DECODE_FINISH; | |
4214 } | |
4215 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_Image *pImage,
CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause
) | |
4216 { | |
4217 FX_BOOL SLTP, bVal; | |
4218 FX_DWORD CONTEXT; | |
4219 FX_DWORD line1; | |
4220 uint8_t *pLine1, cVal; | |
4221 int32_t nStride, k; | |
4222 int32_t nLineBytes, nBitsLeft, cc; | |
4223 if (!m_pLine) { | |
4224 m_pLine = pImage->m_pData; | |
4225 } | |
4226 nStride = pImage->m_nStride; | |
4227 nLineBytes = ((GBW + 7) >> 3) - 1; | |
4228 nBitsLeft = GBW - (nLineBytes << 3); | |
4229 for(; m_loopIndex < GBH; m_loopIndex++) { | |
4230 if(TPGDON) { | |
4231 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); | |
4232 LTP = LTP ^ SLTP; | |
4233 } | |
4234 if(LTP == 1) { | |
4235 pImage->copyLine(m_loopIndex, m_loopIndex - 1); | |
4236 } else { | |
4237 if(m_loopIndex > 0) { | |
4238 pLine1 = m_pLine - nStride; | |
4239 line1 = *pLine1++; | |
4240 CONTEXT = (line1 >> 1) & 0x03f0; | |
4241 for(cc = 0; cc < nLineBytes; cc++) { | |
4242 line1 = (line1 << 8) | (*pLine1++); | |
4243 cVal = 0; | |
4244 for(k = 7; k >= 0; k--) { | |
4245 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
4246 cVal |= bVal << k; | |
4247 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | |
4248 | ((line1 >> (k + 1)) & 0x0010); | |
4249 } | |
4250 m_pLine[cc] = cVal; | |
4251 } | |
4252 line1 <<= 8; | |
4253 cVal = 0; | |
4254 for(k = 0; k < nBitsLeft; k++) { | |
4255 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
4256 cVal |= bVal << (7 - k); | |
4257 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | |
4258 | ((line1 >> (8 - k)) & 0x0010); | |
4259 } | |
4260 m_pLine[nLineBytes] = cVal; | |
4261 } else { | |
4262 CONTEXT = 0; | |
4263 for(cc = 0; cc < nLineBytes; cc++) { | |
4264 cVal = 0; | |
4265 for(k = 7; k >= 0; k--) { | |
4266 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
4267 cVal |= bVal << k; | |
4268 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; | |
4269 } | |
4270 m_pLine[cc] = cVal; | |
4271 } | |
4272 cVal = 0; | |
4273 for(k = 0; k < nBitsLeft; k++) { | |
4274 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
4275 cVal |= bVal << (7 - k); | |
4276 CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; | |
4277 } | |
4278 m_pLine[nLineBytes] = cVal; | |
4279 } | |
4280 } | |
4281 m_pLine += nStride; | |
4282 if(pPause && pPause->NeedToPauseNow()) { | |
4283 m_loopIndex++; | |
4284 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
4285 return FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
4286 } | |
4287 } | |
4288 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | |
4289 return FXCODEC_STATUS_DECODE_FINISH; | |
4290 } | |
4291 FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_Image * pImag
e, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPau
se) | |
4292 { | |
4293 FX_BOOL SLTP, bVal; | |
4294 FX_DWORD CONTEXT; | |
4295 FX_DWORD line1, line2; | |
4296 for(; m_loopIndex < GBH; m_loopIndex++) { | |
4297 if(TPGDON) { | |
4298 SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); | |
4299 LTP = LTP ^ SLTP; | |
4300 } | |
4301 if(LTP == 1) { | |
4302 pImage->copyLine(m_loopIndex, m_loopIndex - 1); | |
4303 } else { | |
4304 line1 = pImage->getPixel(1, m_loopIndex - 1); | |
4305 line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1; | |
4306 line2 = 0; | |
4307 for(FX_DWORD w = 0; w < GBW; w++) { | |
4308 if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { | |
4309 bVal = 0; | |
4310 } else { | |
4311 CONTEXT = line2; | |
4312 CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[
1]) << 4; | |
4313 CONTEXT |= line1 << 5; | |
4314 bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); | |
4315 } | |
4316 if(bVal) { | |
4317 pImage->setPixel(w, m_loopIndex, bVal); | |
4318 } | |
4319 line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)
) & 0x1f; | |
4320 line2 = ((line2 << 1) | bVal) & 0x0f; | |
4321 } | |
4322 } | |
4323 if(pPause && pPause->NeedToPauseNow()) { | |
4324 m_loopIndex++; | |
4325 m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
4326 return FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
4327 } | |
4328 } | |
4329 m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; | |
4330 return FXCODEC_STATUS_DECODE_FINISH; | |
4331 } | |
OLD | NEW |