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