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