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