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