Index: core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp |
diff --git a/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp |
index cabcd4c6340643d771e40be37634f6307de02f9c..415d919f2570516e568452f9538cbe76ee1ed334 100644 |
--- a/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp |
+++ b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp |
@@ -1,7 +1,7 @@ |
// Copyright 2014 PDFium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
- |
+ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
#include "JBig2_GeneralDecoder.h" |
@@ -12,2357 +12,2265 @@ |
#include "JBig2_PatternDict.h" |
extern const JBig2ArithQe QeTable[] = { |
- { 0x5601, 1, 1, 1 }, |
- { 0x3401, 2, 6, 0 }, |
- { 0x1801, 3, 9, 0 }, |
- { 0x0AC1, 4, 12, 0 }, |
- { 0x0521, 5, 29, 0 }, |
- { 0x0221, 38, 33, 0 }, |
- { 0x5601, 7, 6, 1 }, |
- { 0x5401, 8, 14, 0 }, |
- { 0x4801, 9, 14, 0 }, |
- { 0x3801, 10, 14, 0 }, |
- { 0x3001, 11, 17, 0 }, |
- { 0x2401, 12, 18, 0 }, |
- { 0x1C01, 13, 20, 0 }, |
- { 0x1601, 29, 21, 0 }, |
- { 0x5601, 15, 14, 1 }, |
- { 0x5401, 16, 14, 0 }, |
- { 0x5101, 17, 15, 0 }, |
- { 0x4801, 18, 16, 0 }, |
- { 0x3801, 19, 17, 0 }, |
- { 0x3401, 20, 18, 0 }, |
- { 0x3001, 21, 19, 0 }, |
- { 0x2801, 22, 19, 0 }, |
- { 0x2401, 23, 20, 0 }, |
- { 0x2201, 24, 21, 0 }, |
- { 0x1C01, 25, 22, 0 }, |
- { 0x1801, 26, 23, 0 }, |
- { 0x1601, 27, 24, 0 }, |
- { 0x1401, 28, 25, 0 }, |
- { 0x1201, 29, 26, 0 }, |
- { 0x1101, 30, 27, 0 }, |
- { 0x0AC1, 31, 28, 0 }, |
- { 0x09C1, 32, 29, 0 }, |
- { 0x08A1, 33, 30, 0 }, |
- { 0x0521, 34, 31, 0 }, |
- { 0x0441, 35, 32, 0 }, |
- { 0x02A1, 36, 33, 0 }, |
- { 0x0221, 37, 34, 0 }, |
- { 0x0141, 38, 35, 0 }, |
- { 0x0111, 39, 36, 0 }, |
- { 0x0085, 40, 37, 0 }, |
- { 0x0049, 41, 38, 0 }, |
- { 0x0025, 42, 39, 0 }, |
- { 0x0015, 43, 40, 0 }, |
- { 0x0009, 44, 41, 0 }, |
- { 0x0005, 45, 42, 0 }, |
- { 0x0001, 45, 43, 0 }, |
- { 0x5601, 46, 46, 0 } |
-}; |
+ {0x5601, 1, 1, 1}, {0x3401, 2, 6, 0}, {0x1801, 3, 9, 0}, |
+ {0x0AC1, 4, 12, 0}, {0x0521, 5, 29, 0}, {0x0221, 38, 33, 0}, |
+ {0x5601, 7, 6, 1}, {0x5401, 8, 14, 0}, {0x4801, 9, 14, 0}, |
+ {0x3801, 10, 14, 0}, {0x3001, 11, 17, 0}, {0x2401, 12, 18, 0}, |
+ {0x1C01, 13, 20, 0}, {0x1601, 29, 21, 0}, {0x5601, 15, 14, 1}, |
+ {0x5401, 16, 14, 0}, {0x5101, 17, 15, 0}, {0x4801, 18, 16, 0}, |
+ {0x3801, 19, 17, 0}, {0x3401, 20, 18, 0}, {0x3001, 21, 19, 0}, |
+ {0x2801, 22, 19, 0}, {0x2401, 23, 20, 0}, {0x2201, 24, 21, 0}, |
+ {0x1C01, 25, 22, 0}, {0x1801, 26, 23, 0}, {0x1601, 27, 24, 0}, |
+ {0x1401, 28, 25, 0}, {0x1201, 29, 26, 0}, {0x1101, 30, 27, 0}, |
+ {0x0AC1, 31, 28, 0}, {0x09C1, 32, 29, 0}, {0x08A1, 33, 30, 0}, |
+ {0x0521, 34, 31, 0}, {0x0441, 35, 32, 0}, {0x02A1, 36, 33, 0}, |
+ {0x0221, 37, 34, 0}, {0x0141, 38, 35, 0}, {0x0111, 39, 36, 0}, |
+ {0x0085, 40, 37, 0}, {0x0049, 41, 38, 0}, {0x0025, 42, 39, 0}, |
+ {0x0015, 43, 40, 0}, {0x0009, 44, 41, 0}, {0x0005, 45, 42, 0}, |
+ {0x0001, 45, 43, 0}, {0x5601, 46, 46, 0}}; |
extern const unsigned int JBIG2_QE_NUM = sizeof(QeTable) / sizeof(JBig2ArithQe); |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- if (GBW == 0 || GBH == 0) { |
- CJBig2_Image* pImage; |
- JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH)); |
- return pImage; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ if (GBW == 0 || GBH == 0) { |
+ CJBig2_Image* pImage; |
+ JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH)); |
+ return pImage; |
+ } |
+ if (GBTEMPLATE == 0) { |
+ if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1) && |
+ (GBAT[2] == (signed char)-3) && (GBAT[3] == (signed char)-1) && |
+ (GBAT[4] == 2) && (GBAT[5] == (signed char)-2) && |
+ (GBAT[6] == (signed char)-2) && (GBAT[7] == (signed char)-2)) { |
+ return decode_Arith_Template0_opt3(pArithDecoder, gbContext); |
+ } else { |
+ return decode_Arith_Template0_unopt(pArithDecoder, gbContext); |
} |
- if(GBTEMPLATE == 0) { |
- if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1) |
- && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1) |
- && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2) |
- && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) { |
- return decode_Arith_Template0_opt3(pArithDecoder, gbContext); |
- } else { |
- return decode_Arith_Template0_unopt(pArithDecoder, gbContext); |
- } |
- } else if(GBTEMPLATE == 1) { |
- if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) { |
- return decode_Arith_Template1_opt3(pArithDecoder, gbContext); |
- } else { |
- return decode_Arith_Template1_unopt(pArithDecoder, gbContext); |
- } |
- } else if(GBTEMPLATE == 2) { |
- if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) { |
- return decode_Arith_Template2_opt3(pArithDecoder, gbContext); |
- } else { |
- return decode_Arith_Template2_unopt(pArithDecoder, gbContext); |
- } |
+ } else if (GBTEMPLATE == 1) { |
+ if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1)) { |
+ return decode_Arith_Template1_opt3(pArithDecoder, gbContext); |
} else { |
- if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) { |
- return decode_Arith_Template3_opt3(pArithDecoder, gbContext); |
- } else { |
- return decode_Arith_Template3_unopt(pArithDecoder, gbContext); |
- } |
+ return decode_Arith_Template1_unopt(pArithDecoder, gbContext); |
+ } |
+ } else if (GBTEMPLATE == 2) { |
+ if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) { |
+ return decode_Arith_Template2_opt3(pArithDecoder, gbContext); |
+ } else { |
+ return decode_Arith_Template2_unopt(pArithDecoder, gbContext); |
+ } |
+ } else { |
+ if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) { |
+ return decode_Arith_Template3_opt3(pArithDecoder, gbContext); |
+ } else { |
+ return decode_Arith_Template3_unopt(pArithDecoder, gbContext); |
} |
+ } |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2, line3; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2, line3; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = GBREG->getPixel(2, h - 2); |
+ line1 |= GBREG->getPixel(1, h - 2) << 1; |
+ line1 |= GBREG->getPixel(0, h - 2) << 2; |
+ line2 = GBREG->getPixel(3, h - 1); |
+ line2 |= GBREG->getPixel(2, h - 1) << 1; |
+ line2 |= GBREG->getPixel(1, h - 1) << 2; |
+ line2 |= GBREG->getPixel(0, h - 1) << 3; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
} else { |
- line1 = GBREG->getPixel(2, h - 2); |
- line1 |= GBREG->getPixel(1, h - 2) << 1; |
- line1 |= GBREG->getPixel(0, h - 2) << 2; |
- line2 = GBREG->getPixel(3, h - 1); |
- line2 |= GBREG->getPixel(2, h - 1) << 1; |
- line2 |= GBREG->getPixel(1, h - 1) << 2; |
- line2 |= GBREG->getPixel(0, h - 1) << 3; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= line2 << 4; |
- CONTEXT |= line1 << 11; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f; |
- line3 = ((line3 << 1) | bVal) & 0x0f; |
- } |
+ CONTEXT = line3; |
+ CONTEXT |= line2 << 4; |
+ CONTEXT |= line1 << 11; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
} |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
+ } |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f; |
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f; |
+ line3 = ((line3 << 1) | bVal) & 0x0f; |
+ } |
} |
- return GBREG; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2; |
- uint8_t *pLine, cVal; |
- intptr_t nStride, nStride2; |
- int32_t nBits, k; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- if (GBREG->m_pData == NULL) { |
- delete GBREG; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- return NULL; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt2( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2; |
+ uint8_t *pLine, cVal; |
+ intptr_t nStride, nStride2; |
+ int32_t nBits, k; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ if (GBREG->m_pData == NULL) { |
+ delete GBREG; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ return NULL; |
+ } |
+ pLine = GBREG->m_pData; |
+ nStride = GBREG->m_nStride; |
+ nStride2 = nStride << 1; |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
+ LTP = LTP ^ SLTP; |
} |
- pLine = GBREG->m_pData; |
- nStride = GBREG->m_nStride; |
- nStride2 = nStride << 1; |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = (h > 1) ? pLine[-nStride2] << 6 : 0; |
+ line2 = (h > 0) ? pLine[-nStride] : 0; |
+ CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0); |
+ for (FX_DWORD w = 0; w < GBW; w += 8) { |
+ if (w + 8 < GBW) { |
+ nBits = 8; |
+ if (h > 1) { |
+ line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 6); |
+ } |
+ if (h > 0) { |
+ line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
+ } |
} else { |
- line1 = (h > 1) ? pLine[-nStride2] << 6 : 0; |
- line2 = (h > 0) ? pLine[-nStride] : 0; |
- CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0); |
- for(FX_DWORD w = 0; w < GBW; w += 8) { |
- if(w + 8 < GBW) { |
- nBits = 8; |
- if(h > 1) { |
- line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 6); |
- } |
- if(h > 0) { |
- line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
- } |
- } else { |
- nBits = GBW - w; |
- if(h > 1) { |
- line1 <<= 8; |
- } |
- if(h > 0) { |
- line2 <<= 8; |
- } |
- } |
- cVal = 0; |
- for(k = 0; k < nBits; k++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal |
- | ((line1 >> (7 - k)) & 0x0800) |
- | ((line2 >> (7 - k)) & 0x0010); |
- } |
- pLine[w >> 3] = cVal; |
- } |
+ nBits = GBW - w; |
+ if (h > 1) { |
+ line1 <<= 8; |
+ } |
+ if (h > 0) { |
+ line2 <<= 8; |
+ } |
+ } |
+ cVal = 0; |
+ for (k = 0; k < nBits; k++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
+ } else { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal | |
+ ((line1 >> (7 - k)) & 0x0800) | |
+ ((line2 >> (7 - k)) & 0x0010); |
} |
- pLine += nStride; |
+ pLine[w >> 3] = cVal; |
+ } |
} |
- return GBREG; |
+ pLine += nStride; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2; |
- uint8_t *pLine, *pLine1, *pLine2, cVal; |
- int32_t nStride, nStride2, k; |
- int32_t nLineBytes, nBitsLeft, cc; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- if (GBREG->m_pData == NULL) { |
- delete GBREG; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- return NULL; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt3( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2; |
+ uint8_t *pLine, *pLine1, *pLine2, cVal; |
+ int32_t nStride, nStride2, k; |
+ int32_t nLineBytes, nBitsLeft, cc; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ if (GBREG->m_pData == NULL) { |
+ delete GBREG; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ return NULL; |
+ } |
+ pLine = GBREG->m_pData; |
+ nStride = GBREG->m_nStride; |
+ nStride2 = nStride << 1; |
+ nLineBytes = ((GBW + 7) >> 3) - 1; |
+ nBitsLeft = GBW - (nLineBytes << 3); |
+ FX_DWORD height = GBH & 0x7fffffff; |
+ for (FX_DWORD h = 0; h < height; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
+ LTP = LTP ^ SLTP; |
} |
- pLine = GBREG->m_pData; |
- nStride = GBREG->m_nStride; |
- nStride2 = nStride << 1; |
- nLineBytes = ((GBW + 7) >> 3) - 1; |
- nBitsLeft = GBW - (nLineBytes << 3); |
- FX_DWORD height = GBH & 0x7fffffff; |
- for(FX_DWORD h = 0; h < height; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
- LTP = LTP ^ SLTP; |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ if (h > 1) { |
+ pLine1 = pLine - nStride2; |
+ pLine2 = pLine - nStride; |
+ line1 = (*pLine1++) << 6; |
+ line2 = *pLine2++; |
+ CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ line1 = (line1 << 8) | ((*pLine1++) << 6); |
+ line2 = (line2 << 8) | (*pLine2++); |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | |
+ ((line1 >> k) & 0x0800) | ((line2 >> k) & 0x0010)); |
+ } |
+ pLine[cc] = cVal; |
} |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
- } else { |
- if(h > 1) { |
- pLine1 = pLine - nStride2; |
- pLine2 = pLine - nStride; |
- line1 = (*pLine1++) << 6; |
- line2 = *pLine2++; |
- CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); |
- for(cc = 0; cc < nLineBytes; cc++) { |
- line1 = (line1 << 8) | ((*pLine1++) << 6); |
- line2 = (line2 << 8) | (*pLine2++); |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
- | ((line1 >> k) & 0x0800) |
- | ((line2 >> k) & 0x0010)); |
- } |
- pLine[cc] = cVal; |
- } |
- line1 <<= 8; |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
- | ((line1 >> (7 - k)) & 0x0800) |
- | ((line2 >> (7 - k)) & 0x0010)); |
- } |
- pLine[nLineBytes] = cVal; |
- } else { |
- pLine2 = pLine - nStride; |
- line2 = (h & 1) ? (*pLine2++) : 0; |
- CONTEXT = (line2 & 0x07f0); |
- for(cc = 0; cc < nLineBytes; cc++) { |
- if(h & 1) { |
- line2 = (line2 << 8) | (*pLine2++); |
- } |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
- | ((line2 >> k) & 0x0010)); |
- } |
- pLine[cc] = cVal; |
- } |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
- | (((line2 >> (7 - k))) & 0x0010)); |
- } |
- pLine[nLineBytes] = cVal; |
- } |
+ line1 <<= 8; |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = |
+ (((CONTEXT & 0x7bf7) << 1) | bVal | |
+ ((line1 >> (7 - k)) & 0x0800) | ((line2 >> (7 - k)) & 0x0010)); |
} |
- pLine += nStride; |
- } |
- return GBREG; |
-} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2, line3; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
- LTP = LTP ^ SLTP; |
+ pLine[nLineBytes] = cVal; |
+ } else { |
+ pLine2 = pLine - nStride; |
+ line2 = (h & 1) ? (*pLine2++) : 0; |
+ CONTEXT = (line2 & 0x07f0); |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ if (h & 1) { |
+ line2 = (line2 << 8) | (*pLine2++); |
+ } |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = |
+ (((CONTEXT & 0x7bf7) << 1) | bVal | ((line2 >> k) & 0x0010)); |
+ } |
+ pLine[cc] = cVal; |
} |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
- } else { |
- line1 = GBREG->getPixel(1, h - 2); |
- line1 |= GBREG->getPixel(0, h - 2) << 1; |
- line2 = GBREG->getPixel(2, h - 1); |
- line2 |= GBREG->getPixel(1, h - 1) << 1; |
- line2 |= GBREG->getPixel(0, h - 1) << 2; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
- CONTEXT |= line2 << 5; |
- CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; |
- CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; |
- CONTEXT |= line1 << 12; |
- CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
- line3 = ((line3 << 1) | bVal) & 0x0f; |
- } |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | |
+ (((line2 >> (7 - k))) & 0x0010)); |
} |
+ pLine[nLineBytes] = cVal; |
+ } |
} |
- return GBREG; |
+ pLine += nStride; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2, line3; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_unopt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2, line3; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = GBREG->getPixel(1, h - 2); |
+ line1 |= GBREG->getPixel(0, h - 2) << 1; |
+ line2 = GBREG->getPixel(2, h - 1); |
+ line2 |= GBREG->getPixel(1, h - 1) << 1; |
+ line2 |= GBREG->getPixel(0, h - 1) << 2; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
} else { |
- line1 = GBREG->getPixel(2, h - 2); |
- line1 |= GBREG->getPixel(1, h - 2) << 1; |
- line1 |= GBREG->getPixel(0, h - 2) << 2; |
- line2 = GBREG->getPixel(3, h - 1); |
- line2 |= GBREG->getPixel(2, h - 1) << 1; |
- line2 |= GBREG->getPixel(1, h - 1) << 2; |
- line2 |= GBREG->getPixel(0, h - 1) << 3; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= line2 << 3; |
- CONTEXT |= line1 << 9; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f; |
- line3 = ((line3 << 1) | bVal) & 0x07; |
- } |
+ CONTEXT = line3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
+ CONTEXT |= line2 << 5; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; |
+ CONTEXT |= line1 << 12; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
} |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
+ line3 = ((line3 << 1) | bVal) & 0x0f; |
+ } |
} |
- return GBREG; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2; |
- uint8_t *pLine, cVal; |
- intptr_t nStride, nStride2; |
- int32_t nBits, k; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- if (GBREG->m_pData == NULL) { |
- delete GBREG; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- return NULL; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2, line3; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
+ LTP = LTP ^ SLTP; |
} |
- pLine = GBREG->m_pData; |
- nStride = GBREG->m_nStride; |
- nStride2 = nStride << 1; |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = GBREG->getPixel(2, h - 2); |
+ line1 |= GBREG->getPixel(1, h - 2) << 1; |
+ line1 |= GBREG->getPixel(0, h - 2) << 2; |
+ line2 = GBREG->getPixel(3, h - 1); |
+ line2 |= GBREG->getPixel(2, h - 1) << 1; |
+ line2 |= GBREG->getPixel(1, h - 1) << 2; |
+ line2 |= GBREG->getPixel(0, h - 1) << 3; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
} else { |
- line1 = (h > 1) ? pLine[-nStride2] << 4 : 0; |
- line2 = (h > 0) ? pLine[-nStride] : 0; |
- CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); |
- for(FX_DWORD w = 0; w < GBW; w += 8) { |
- if(w + 8 < GBW) { |
- nBits = 8; |
- if(h > 1) { |
- line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 4); |
- } |
- if(h > 0) { |
- line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
- } |
- } else { |
- nBits = GBW - w; |
- if(h > 1) { |
- line1 <<= 8; |
- } |
- if(h > 0) { |
- line2 <<= 8; |
- } |
- } |
- cVal = 0; |
- for(k = 0; k < nBits; k++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
- | ((line1 >> (7 - k)) & 0x0200) |
- | ((line2 >> (8 - k)) & 0x0008); |
- } |
- pLine[w >> 3] = cVal; |
- } |
+ CONTEXT = line3; |
+ CONTEXT |= line2 << 3; |
+ CONTEXT |= line1 << 9; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
} |
- pLine += nStride; |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; |
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f; |
+ line3 = ((line3 << 1) | bVal) & 0x07; |
+ } |
} |
- return GBREG; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2; |
- uint8_t *pLine, *pLine1, *pLine2, cVal; |
- int32_t nStride, nStride2, k; |
- int32_t nLineBytes, nBitsLeft, cc; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- if (GBREG->m_pData == NULL) { |
- delete GBREG; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- return NULL; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt2( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2; |
+ uint8_t *pLine, cVal; |
+ intptr_t nStride, nStride2; |
+ int32_t nBits, k; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ if (GBREG->m_pData == NULL) { |
+ delete GBREG; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ return NULL; |
+ } |
+ pLine = GBREG->m_pData; |
+ nStride = GBREG->m_nStride; |
+ nStride2 = nStride << 1; |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
+ LTP = LTP ^ SLTP; |
} |
- pLine = GBREG->m_pData; |
- nStride = GBREG->m_nStride; |
- nStride2 = nStride << 1; |
- nLineBytes = ((GBW + 7) >> 3) - 1; |
- nBitsLeft = GBW - (nLineBytes << 3); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = (h > 1) ? pLine[-nStride2] << 4 : 0; |
+ line2 = (h > 0) ? pLine[-nStride] : 0; |
+ CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); |
+ for (FX_DWORD w = 0; w < GBW; w += 8) { |
+ if (w + 8 < GBW) { |
+ nBits = 8; |
+ if (h > 1) { |
+ line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 4); |
+ } |
+ if (h > 0) { |
+ line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
+ } |
} else { |
- if(h > 1) { |
- pLine1 = pLine - nStride2; |
- pLine2 = pLine - nStride; |
- line1 = (*pLine1++) << 4; |
- line2 = *pLine2++; |
- CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); |
- for(cc = 0; cc < nLineBytes; cc++) { |
- line1 = (line1 << 8) | ((*pLine1++) << 4); |
- line2 = (line2 << 8) | (*pLine2++); |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
- | ((line1 >> k) & 0x0200) |
- | ((line2 >> (k + 1)) & 0x0008); |
- } |
- pLine[cc] = cVal; |
- } |
- line1 <<= 8; |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
- | ((line1 >> (7 - k)) & 0x0200) |
- | ((line2 >> (8 - k)) & 0x0008); |
- } |
- pLine[nLineBytes] = cVal; |
- } else { |
- pLine2 = pLine - nStride; |
- line2 = (h & 1) ? (*pLine2++) : 0; |
- CONTEXT = (line2 >> 1) & 0x01f8; |
- for(cc = 0; cc < nLineBytes; cc++) { |
- if(h & 1) { |
- line2 = (line2 << 8) | (*pLine2++); |
- } |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
- | ((line2 >> (k + 1)) & 0x0008); |
- } |
- pLine[cc] = cVal; |
- } |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
- | ((line2 >> (8 - k)) & 0x0008); |
- } |
- pLine[nLineBytes] = cVal; |
- } |
+ nBits = GBW - w; |
+ if (h > 1) { |
+ line1 <<= 8; |
+ } |
+ if (h > 0) { |
+ line2 <<= 8; |
+ } |
+ } |
+ cVal = 0; |
+ for (k = 0; k < nBits; k++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
+ } else { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
+ ((line1 >> (7 - k)) & 0x0200) | |
+ ((line2 >> (8 - k)) & 0x0008); |
} |
- pLine += nStride; |
+ pLine[w >> 3] = cVal; |
+ } |
} |
- return GBREG; |
+ pLine += nStride; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2, line3; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
- LTP = LTP ^ SLTP; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt3( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2; |
+ uint8_t *pLine, *pLine1, *pLine2, cVal; |
+ int32_t nStride, nStride2, k; |
+ int32_t nLineBytes, nBitsLeft, cc; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ if (GBREG->m_pData == NULL) { |
+ delete GBREG; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ return NULL; |
+ } |
+ pLine = GBREG->m_pData; |
+ nStride = GBREG->m_nStride; |
+ nStride2 = nStride << 1; |
+ nLineBytes = ((GBW + 7) >> 3) - 1; |
+ nBitsLeft = GBW - (nLineBytes << 3); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ if (h > 1) { |
+ pLine1 = pLine - nStride2; |
+ pLine2 = pLine - nStride; |
+ line1 = (*pLine1++) << 4; |
+ line2 = *pLine2++; |
+ CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ line1 = (line1 << 8) | ((*pLine1++) << 4); |
+ line2 = (line2 << 8) | (*pLine2++); |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
+ ((line1 >> k) & 0x0200) | ((line2 >> (k + 1)) & 0x0008); |
+ } |
+ pLine[cc] = cVal; |
} |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
- } else { |
- line1 = GBREG->getPixel(2, h - 2); |
- line1 |= GBREG->getPixel(1, h - 2) << 1; |
- line1 |= GBREG->getPixel(0, h - 2) << 2; |
- line2 = GBREG->getPixel(2, h - 1); |
- line2 |= GBREG->getPixel(1, h - 1) << 1; |
- line2 |= GBREG->getPixel(0, h - 1) << 2; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
- CONTEXT |= line2 << 4; |
- CONTEXT |= line1 << 9; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
- line3 = ((line3 << 1) | bVal) & 0x07; |
- } |
+ line1 <<= 8; |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
+ ((line1 >> (7 - k)) & 0x0200) | |
+ ((line2 >> (8 - k)) & 0x0008); |
+ } |
+ pLine[nLineBytes] = cVal; |
+ } else { |
+ pLine2 = pLine - nStride; |
+ line2 = (h & 1) ? (*pLine2++) : 0; |
+ CONTEXT = (line2 >> 1) & 0x01f8; |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ if (h & 1) { |
+ line2 = (line2 << 8) | (*pLine2++); |
+ } |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
+ ((line2 >> (k + 1)) & 0x0008); |
+ } |
+ pLine[cc] = cVal; |
} |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = |
+ ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008); |
+ } |
+ pLine[nLineBytes] = cVal; |
+ } |
} |
- return GBREG; |
+ pLine += nStride; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2, line3; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_unopt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2, line3; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = GBREG->getPixel(2, h - 2); |
+ line1 |= GBREG->getPixel(1, h - 2) << 1; |
+ line1 |= GBREG->getPixel(0, h - 2) << 2; |
+ line2 = GBREG->getPixel(2, h - 1); |
+ line2 |= GBREG->getPixel(1, h - 1) << 1; |
+ line2 |= GBREG->getPixel(0, h - 1) << 2; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
} else { |
- line1 = GBREG->getPixel(1, h - 2); |
- line1 |= GBREG->getPixel(0, h - 2) << 1; |
- line2 = GBREG->getPixel(2, h - 1); |
- line2 |= GBREG->getPixel(1, h - 1) << 1; |
- line2 |= GBREG->getPixel(0, h - 1) << 2; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= line2 << 2; |
- CONTEXT |= line1 << 7; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
- line3 = ((line3 << 1) | bVal) & 0x03; |
- } |
+ CONTEXT = line3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
+ CONTEXT |= line2 << 4; |
+ CONTEXT |= line1 << 9; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
} |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; |
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
+ line3 = ((line3 << 1) | bVal) & 0x07; |
+ } |
} |
- return GBREG; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2; |
- uint8_t *pLine, cVal; |
- intptr_t nStride, nStride2; |
- int32_t nBits, k; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- if (GBREG->m_pData == NULL) { |
- delete GBREG; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- return NULL; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2, line3; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
+ LTP = LTP ^ SLTP; |
} |
- pLine = GBREG->m_pData; |
- nStride = GBREG->m_nStride; |
- nStride2 = nStride << 1; |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = GBREG->getPixel(1, h - 2); |
+ line1 |= GBREG->getPixel(0, h - 2) << 1; |
+ line2 = GBREG->getPixel(2, h - 1); |
+ line2 |= GBREG->getPixel(1, h - 1) << 1; |
+ line2 |= GBREG->getPixel(0, h - 1) << 2; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
} else { |
- line1 = (h > 1) ? pLine[-nStride2] << 1 : 0; |
- line2 = (h > 0) ? pLine[-nStride] : 0; |
- CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); |
- for(FX_DWORD w = 0; w < GBW; w += 8) { |
- if(w + 8 < GBW) { |
- nBits = 8; |
- if(h > 1) { |
- line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 1); |
- } |
- if(h > 0) { |
- line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
- } |
- } else { |
- nBits = GBW - w; |
- if(h > 1) { |
- line1 <<= 8; |
- } |
- if(h > 0) { |
- line2 <<= 8; |
- } |
- } |
- cVal = 0; |
- for(k = 0; k < nBits; k++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
- | ((line1 >> (7 - k)) & 0x0080) |
- | ((line2 >> (10 - k)) & 0x0004); |
- } |
- pLine[w >> 3] = cVal; |
- } |
+ CONTEXT = line3; |
+ CONTEXT |= line2 << 2; |
+ CONTEXT |= line1 << 7; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
} |
- pLine += nStride; |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
+ line3 = ((line3 << 1) | bVal) & 0x03; |
+ } |
} |
- return GBREG; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2; |
- uint8_t *pLine, *pLine1, *pLine2, cVal; |
- int32_t nStride, nStride2, k; |
- int32_t nLineBytes, nBitsLeft, cc; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- if (GBREG->m_pData == NULL) { |
- delete GBREG; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- return NULL; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt2( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2; |
+ uint8_t *pLine, cVal; |
+ intptr_t nStride, nStride2; |
+ int32_t nBits, k; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ if (GBREG->m_pData == NULL) { |
+ delete GBREG; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ return NULL; |
+ } |
+ pLine = GBREG->m_pData; |
+ nStride = GBREG->m_nStride; |
+ nStride2 = nStride << 1; |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
+ LTP = LTP ^ SLTP; |
} |
- pLine = GBREG->m_pData; |
- nStride = GBREG->m_nStride; |
- nStride2 = nStride << 1; |
- nLineBytes = ((GBW + 7) >> 3) - 1; |
- nBitsLeft = GBW - (nLineBytes << 3); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = (h > 1) ? pLine[-nStride2] << 1 : 0; |
+ line2 = (h > 0) ? pLine[-nStride] : 0; |
+ CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); |
+ for (FX_DWORD w = 0; w < GBW; w += 8) { |
+ if (w + 8 < GBW) { |
+ nBits = 8; |
+ if (h > 1) { |
+ line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 1); |
+ } |
+ if (h > 0) { |
+ line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
+ } |
} else { |
- if(h > 1) { |
- pLine1 = pLine - nStride2; |
- pLine2 = pLine - nStride; |
- line1 = (*pLine1++) << 1; |
- line2 = *pLine2++; |
- CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); |
- for(cc = 0; cc < nLineBytes; cc++) { |
- line1 = (line1 << 8) | ((*pLine1++) << 1); |
- line2 = (line2 << 8) | (*pLine2++); |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
- | ((line1 >> k) & 0x0080) |
- | ((line2 >> (k + 3)) & 0x0004); |
- } |
- pLine[cc] = cVal; |
- } |
- line1 <<= 8; |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
- | ((line1 >> (7 - k)) & 0x0080) |
- | ((line2 >> (10 - k)) & 0x0004); |
- } |
- pLine[nLineBytes] = cVal; |
- } else { |
- pLine2 = pLine - nStride; |
- line2 = (h & 1) ? (*pLine2++) : 0; |
- CONTEXT = (line2 >> 3) & 0x007c; |
- for(cc = 0; cc < nLineBytes; cc++) { |
- if(h & 1) { |
- line2 = (line2 << 8) | (*pLine2++); |
- } |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
- | ((line2 >> (k + 3)) & 0x0004); |
- } |
- pLine[cc] = cVal; |
- } |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
- | (((line2 >> (10 - k))) & 0x0004); |
- } |
- pLine[nLineBytes] = cVal; |
- } |
+ nBits = GBW - w; |
+ if (h > 1) { |
+ line1 <<= 8; |
+ } |
+ if (h > 0) { |
+ line2 <<= 8; |
+ } |
+ } |
+ cVal = 0; |
+ for (k = 0; k < nBits; k++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
+ } else { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
+ ((line1 >> (7 - k)) & 0x0080) | |
+ ((line2 >> (10 - k)) & 0x0004); |
} |
- pLine += nStride; |
+ pLine[w >> 3] = cVal; |
+ } |
} |
- return GBREG; |
+ pLine += nStride; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2, line3; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
- LTP = LTP ^ SLTP; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt3( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2; |
+ uint8_t *pLine, *pLine1, *pLine2, cVal; |
+ int32_t nStride, nStride2, k; |
+ int32_t nLineBytes, nBitsLeft, cc; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ if (GBREG->m_pData == NULL) { |
+ delete GBREG; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ return NULL; |
+ } |
+ pLine = GBREG->m_pData; |
+ nStride = GBREG->m_nStride; |
+ nStride2 = nStride << 1; |
+ nLineBytes = ((GBW + 7) >> 3) - 1; |
+ nBitsLeft = GBW - (nLineBytes << 3); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ if (h > 1) { |
+ pLine1 = pLine - nStride2; |
+ pLine2 = pLine - nStride; |
+ line1 = (*pLine1++) << 1; |
+ line2 = *pLine2++; |
+ CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ line1 = (line1 << 8) | ((*pLine1++) << 1); |
+ line2 = (line2 << 8) | (*pLine2++); |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
+ ((line1 >> k) & 0x0080) | ((line2 >> (k + 3)) & 0x0004); |
+ } |
+ pLine[cc] = cVal; |
} |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
- } else { |
- line1 = GBREG->getPixel(1, h - 2); |
- line1 |= GBREG->getPixel(0, h - 2) << 1; |
- line2 = GBREG->getPixel(1, h - 1); |
- line2 |= GBREG->getPixel(0, h - 1) << 1; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; |
- CONTEXT |= line2 << 3; |
- CONTEXT |= line1 << 7; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f; |
- line3 = ((line3 << 1) | bVal) & 0x03; |
- } |
+ line1 <<= 8; |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
+ ((line1 >> (7 - k)) & 0x0080) | |
+ ((line2 >> (10 - k)) & 0x0004); |
+ } |
+ pLine[nLineBytes] = cVal; |
+ } else { |
+ pLine2 = pLine - nStride; |
+ line2 = (h & 1) ? (*pLine2++) : 0; |
+ CONTEXT = (line2 >> 3) & 0x007c; |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ if (h & 1) { |
+ line2 = (line2 << 8) | (*pLine2++); |
+ } |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
+ ((line2 >> (k + 3)) & 0x0004); |
+ } |
+ pLine[cc] = cVal; |
} |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
+ (((line2 >> (10 - k))) & 0x0004); |
+ } |
+ pLine[nLineBytes] = cVal; |
+ } |
} |
- return GBREG; |
+ pLine += nStride; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_unopt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2, line3; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = GBREG->getPixel(1, h - 2); |
+ line1 |= GBREG->getPixel(0, h - 2) << 1; |
+ line2 = GBREG->getPixel(1, h - 1); |
+ line2 |= GBREG->getPixel(0, h - 1) << 1; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
} else { |
- line1 = GBREG->getPixel(2, h - 1); |
- line1 |= GBREG->getPixel(1, h - 1) << 1; |
- line1 |= GBREG->getPixel(0, h - 1) << 2; |
- line2 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line2; |
- CONTEXT |= line1 << 4; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f; |
- line2 = ((line2 << 1) | bVal) & 0x0f; |
- } |
+ CONTEXT = line3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; |
+ CONTEXT |= line2 << 3; |
+ CONTEXT |= line1 << 7; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
} |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f; |
+ line3 = ((line3 << 1) | bVal) & 0x03; |
+ } |
} |
- return GBREG; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1; |
- uint8_t *pLine, cVal; |
- intptr_t nStride; |
- int32_t nBits, k; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- if (GBREG->m_pData == NULL) { |
- delete GBREG; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- return NULL; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
+ LTP = LTP ^ SLTP; |
} |
- pLine = GBREG->m_pData; |
- nStride = GBREG->m_nStride; |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = GBREG->getPixel(2, h - 1); |
+ line1 |= GBREG->getPixel(1, h - 1) << 1; |
+ line1 |= GBREG->getPixel(0, h - 1) << 2; |
+ line2 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
} else { |
- line1 = (h > 0) ? pLine[-nStride] : 0; |
- CONTEXT = (line1 >> 1) & 0x03f0; |
- for(FX_DWORD w = 0; w < GBW; w += 8) { |
- if(w + 8 < GBW) { |
- nBits = 8; |
- if(h > 0) { |
- line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
- } |
- } else { |
- nBits = GBW - w; |
- if(h > 0) { |
- line1 <<= 8; |
- } |
- } |
- cVal = 0; |
- for(k = 0; k < nBits; k++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal |
- | ((line1 >> (8 - k)) & 0x0010); |
- } |
- pLine[w >> 3] = cVal; |
- } |
+ CONTEXT = line2; |
+ CONTEXT |= line1 << 4; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
} |
- pLine += nStride; |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f; |
+ line2 = ((line2 << 1) | bVal) & 0x0f; |
+ } |
} |
- return GBREG; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1; |
- uint8_t *pLine, *pLine1, cVal; |
- int32_t nStride, k; |
- int32_t nLineBytes, nBitsLeft, cc; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- if (GBREG->m_pData == NULL) { |
- delete GBREG; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- return NULL; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt2( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1; |
+ uint8_t *pLine, cVal; |
+ intptr_t nStride; |
+ int32_t nBits, k; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ if (GBREG->m_pData == NULL) { |
+ delete GBREG; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ return NULL; |
+ } |
+ pLine = GBREG->m_pData; |
+ nStride = GBREG->m_nStride; |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
+ LTP = LTP ^ SLTP; |
} |
- pLine = GBREG->m_pData; |
- nStride = GBREG->m_nStride; |
- nLineBytes = ((GBW + 7) >> 3) - 1; |
- nBitsLeft = GBW - (nLineBytes << 3); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = (h > 0) ? pLine[-nStride] : 0; |
+ CONTEXT = (line1 >> 1) & 0x03f0; |
+ for (FX_DWORD w = 0; w < GBW; w += 8) { |
+ if (w + 8 < GBW) { |
+ nBits = 8; |
+ if (h > 0) { |
+ line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]); |
+ } |
} else { |
- if(h > 0) { |
- pLine1 = pLine - nStride; |
- line1 = *pLine1++; |
- CONTEXT = (line1 >> 1) & 0x03f0; |
- for(cc = 0; cc < nLineBytes; cc++) { |
- line1 = (line1 << 8) | (*pLine1++); |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal |
- | ((line1 >> (k + 1)) & 0x0010); |
- } |
- pLine[cc] = cVal; |
- } |
- line1 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal |
- | ((line1 >> (8 - k)) & 0x0010); |
- } |
- pLine[nLineBytes] = cVal; |
- } else { |
- CONTEXT = 0; |
- for(cc = 0; cc < nLineBytes; cc++) { |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
- } |
- pLine[cc] = cVal; |
- } |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
- } |
- pLine[nLineBytes] = cVal; |
- } |
+ nBits = GBW - w; |
+ if (h > 0) { |
+ line1 <<= 8; |
+ } |
+ } |
+ cVal = 0; |
+ for (k = 0; k < nBits; k++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
+ } else { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = |
+ ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010); |
} |
- pLine += nStride; |
+ pLine[w >> 3] = cVal; |
+ } |
} |
- return GBREG; |
+ pLine += nStride; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
- LTP = LTP ^ SLTP; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt3( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1; |
+ uint8_t *pLine, *pLine1, cVal; |
+ int32_t nStride, k; |
+ int32_t nLineBytes, nBitsLeft, cc; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ if (GBREG->m_pData == NULL) { |
+ delete GBREG; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ return NULL; |
+ } |
+ pLine = GBREG->m_pData; |
+ nStride = GBREG->m_nStride; |
+ nLineBytes = ((GBW + 7) >> 3) - 1; |
+ nBitsLeft = GBW - (nLineBytes << 3); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ if (h > 0) { |
+ pLine1 = pLine - nStride; |
+ line1 = *pLine1++; |
+ CONTEXT = (line1 >> 1) & 0x03f0; |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ line1 = (line1 << 8) | (*pLine1++); |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | |
+ ((line1 >> (k + 1)) & 0x0010); |
+ } |
+ pLine[cc] = cVal; |
} |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
- } else { |
- line1 = GBREG->getPixel(1, h - 1); |
- line1 |= GBREG->getPixel(0, h - 1) << 1; |
- line2 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line2; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
- CONTEXT |= line1 << 5; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f; |
- line2 = ((line2 << 1) | bVal) & 0x0f; |
- } |
+ line1 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = |
+ ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010); |
+ } |
+ pLine[nLineBytes] = cVal; |
+ } else { |
+ CONTEXT = 0; |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
+ } |
+ pLine[cc] = cVal; |
} |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
+ } |
+ pLine[nLineBytes] = cVal; |
+ } |
} |
- return GBREG; |
+ pLine += nStride; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG; |
- FX_DWORD line1, line2, line3; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- switch(GBTEMPLATE) { |
- case 0: |
- CONTEXT = 0x9b25; |
- break; |
- case 1: |
- CONTEXT = 0x0795; |
- break; |
- case 2: |
- CONTEXT = 0x00e5; |
- break; |
- case 3: |
- CONTEXT = 0x0195; |
- break; |
- } |
- SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(h, h - 1); |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_unopt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ line1 = GBREG->getPixel(1, h - 1); |
+ line1 |= GBREG->getPixel(0, h - 1) << 1; |
+ line2 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
} else { |
- switch(GBTEMPLATE) { |
- case 0: { |
- line1 = GBREG->getPixel(1, h - 2); |
- line1 |= GBREG->getPixel(0, h - 2) << 1; |
- line2 = GBREG->getPixel(2, h - 1); |
- line2 |= GBREG->getPixel(1, h - 1) << 1; |
- line2 |= GBREG->getPixel(0, h - 1) << 2; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
- CONTEXT |= line2 << 5; |
- CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; |
- CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; |
- CONTEXT |= line1 << 12; |
- CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
- line3 = ((line3 << 1) | bVal) & 0x0f; |
- } |
- } |
- break; |
- case 1: { |
- line1 = GBREG->getPixel(2, h - 2); |
- line1 |= GBREG->getPixel(1, h - 2) << 1; |
- line1 |= GBREG->getPixel(0, h - 2) << 2; |
- line2 = GBREG->getPixel(2, h - 1); |
- line2 |= GBREG->getPixel(1, h - 1) << 1; |
- line2 |= GBREG->getPixel(0, h - 1) << 2; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
- CONTEXT |= line2 << 4; |
- CONTEXT |= line1 << 9; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
- line3 = ((line3 << 1) | bVal) & 0x07; |
- } |
- } |
- break; |
- case 2: { |
- line1 = GBREG->getPixel(1, h - 2); |
- line1 |= GBREG->getPixel(0, h - 2) << 1; |
- line2 = GBREG->getPixel(1, h - 1); |
- line2 |= GBREG->getPixel(0, h - 1) << 1; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; |
- CONTEXT |= line2 << 3; |
- CONTEXT |= line1 << 7; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f; |
- line3 = ((line3 << 1) | bVal) & 0x03; |
- } |
- } |
- break; |
- case 3: { |
- line1 = GBREG->getPixel(1, h - 1); |
- line1 |= GBREG->getPixel(0, h - 1) << 1; |
- line2 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line2; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
- CONTEXT |= line1 << 5; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f; |
- line2 = ((line2 << 1) | bVal) & 0x0f; |
- } |
- } |
- break; |
- } |
+ CONTEXT = line2; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
+ CONTEXT |= line1 << 5; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
} |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
+ } |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f; |
+ line2 = ((line2 << 1) | bVal) & 0x0f; |
+ } |
} |
- return GBREG; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT = 0; |
- CJBig2_Image *GBREG; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- switch(GBTEMPLATE) { |
- case 0: |
- CONTEXT = 0x9b25; |
- break; |
- case 1: |
- CONTEXT = 0x0795; |
- break; |
- case 2: |
- CONTEXT = 0x00e5; |
- break; |
- case 3: |
- CONTEXT = 0x0195; |
- break; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_V2( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG; |
+ FX_DWORD line1, line2, line3; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ switch (GBTEMPLATE) { |
+ case 0: |
+ CONTEXT = 0x9b25; |
+ break; |
+ case 1: |
+ CONTEXT = 0x0795; |
+ break; |
+ case 2: |
+ CONTEXT = 0x00e5; |
+ break; |
+ case 3: |
+ CONTEXT = 0x0195; |
+ break; |
+ } |
+ SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ GBREG->copyLine(h, h - 1); |
+ } else { |
+ switch (GBTEMPLATE) { |
+ case 0: { |
+ line1 = GBREG->getPixel(1, h - 2); |
+ line1 |= GBREG->getPixel(0, h - 2) << 1; |
+ line2 = GBREG->getPixel(2, h - 1); |
+ line2 |= GBREG->getPixel(1, h - 1) << 1; |
+ line2 |= GBREG->getPixel(0, h - 1) << 2; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
+ } else { |
+ CONTEXT = line3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
+ CONTEXT |= line2 << 5; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; |
+ CONTEXT |= line1 << 12; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
} |
- SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1)); |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
} |
- } else { |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- GBREG->setPixel(w, h, 0); |
- } else { |
- CONTEXT = 0; |
- switch(GBTEMPLATE) { |
- case 0: |
- CONTEXT |= GBREG->getPixel(w - 1, h); |
- CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
- CONTEXT |= GBREG->getPixel(w - 3, h) << 2; |
- CONTEXT |= GBREG->getPixel(w - 4, h) << 3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
- CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5; |
- CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6; |
- CONTEXT |= GBREG->getPixel(w, h - 1) << 7; |
- CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8; |
- CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9; |
- CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; |
- CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; |
- CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12; |
- CONTEXT |= GBREG->getPixel(w, h - 2) << 13; |
- CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14; |
- CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; |
- break; |
- case 1: |
- CONTEXT |= GBREG->getPixel(w - 1, h); |
- CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
- CONTEXT |= GBREG->getPixel(w - 3, h) << 2; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
- CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4; |
- CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5; |
- CONTEXT |= GBREG->getPixel(w, h - 1) << 6; |
- CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7; |
- CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8; |
- CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9; |
- CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10; |
- CONTEXT |= GBREG->getPixel(w, h - 2) << 11; |
- CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12; |
- break; |
- case 2: |
- CONTEXT |= GBREG->getPixel(w - 1, h); |
- CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; |
- CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3; |
- CONTEXT |= GBREG->getPixel(w, h - 1) << 4; |
- CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5; |
- CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6; |
- CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7; |
- CONTEXT |= GBREG->getPixel(w, h - 2) << 8; |
- CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9; |
- break; |
- case 3: |
- CONTEXT |= GBREG->getPixel(w - 1, h); |
- CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
- CONTEXT |= GBREG->getPixel(w - 3, h) << 2; |
- CONTEXT |= GBREG->getPixel(w - 4, h) << 3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
- CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5; |
- CONTEXT |= GBREG->getPixel(w, h - 1) << 6; |
- CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7; |
- CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8; |
- CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9; |
- break; |
- } |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- GBREG->setPixel(w, h, bVal); |
- } |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
+ line3 = ((line3 << 1) | bVal) & 0x0f; |
+ } |
+ } break; |
+ case 1: { |
+ line1 = GBREG->getPixel(2, h - 2); |
+ line1 |= GBREG->getPixel(1, h - 2) << 1; |
+ line1 |= GBREG->getPixel(0, h - 2) << 2; |
+ line2 = GBREG->getPixel(2, h - 1); |
+ line2 |= GBREG->getPixel(1, h - 1) << 1; |
+ line2 |= GBREG->getPixel(0, h - 1) << 2; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
+ } else { |
+ CONTEXT = line3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
+ CONTEXT |= line2 << 4; |
+ CONTEXT |= line1 << 9; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
} |
- } |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
+ } |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; |
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; |
+ line3 = ((line3 << 1) | bVal) & 0x07; |
+ } |
+ } break; |
+ case 2: { |
+ line1 = GBREG->getPixel(1, h - 2); |
+ line1 |= GBREG->getPixel(0, h - 2) << 1; |
+ line2 = GBREG->getPixel(1, h - 1); |
+ line2 |= GBREG->getPixel(0, h - 1) << 1; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
+ } else { |
+ CONTEXT = line3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; |
+ CONTEXT |= line2 << 3; |
+ CONTEXT |= line1 << 7; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
+ } |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; |
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f; |
+ line3 = ((line3 << 1) | bVal) & 0x03; |
+ } |
+ } break; |
+ case 3: { |
+ line1 = GBREG->getPixel(1, h - 1); |
+ line1 |= GBREG->getPixel(0, h - 1) << 1; |
+ line2 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
+ } else { |
+ CONTEXT = line2; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
+ CONTEXT |= line1 << 5; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ } |
+ if (bVal) { |
+ GBREG->setPixel(w, h, bVal); |
+ } |
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f; |
+ line2 = ((line2 << 1) | bVal) & 0x0f; |
+ } |
+ } break; |
+ } |
} |
- return GBREG; |
+ } |
+ return GBREG; |
} |
-CJBig2_Image *CJBig2_GRDProc::decode_MMR(CJBig2_BitStream *pStream) |
-{ |
- int bitpos, i; |
- CJBig2_Image *pImage; |
- JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH)); |
- if (pImage->m_pData == NULL) { |
- delete pImage; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- return NULL; |
+CJBig2_Image* CJBig2_GRDProc::decode_Arith_V1( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT = 0; |
+ CJBig2_Image* GBREG; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ switch (GBTEMPLATE) { |
+ case 0: |
+ CONTEXT = 0x9b25; |
+ break; |
+ case 1: |
+ CONTEXT = 0x0795; |
+ break; |
+ case 2: |
+ CONTEXT = 0x00e5; |
+ break; |
+ case 3: |
+ CONTEXT = 0x0195; |
+ break; |
+ } |
+ SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ LTP = LTP ^ SLTP; |
} |
- bitpos = (int)pStream->getBitPos(); |
- _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, pImage->m_pData, GBW, GBH, pImage->m_nStride); |
- pStream->setBitPos(bitpos); |
- for(i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) { |
- pImage->m_pData[i] = ~pImage->m_pData[i]; |
+ if (LTP == 1) { |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1)); |
+ } |
+ } else { |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ GBREG->setPixel(w, h, 0); |
+ } else { |
+ CONTEXT = 0; |
+ switch (GBTEMPLATE) { |
+ case 0: |
+ CONTEXT |= GBREG->getPixel(w - 1, h); |
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
+ CONTEXT |= GBREG->getPixel(w - 3, h) << 2; |
+ CONTEXT |= GBREG->getPixel(w - 4, h) << 3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
+ CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5; |
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6; |
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 7; |
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8; |
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; |
+ CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12; |
+ CONTEXT |= GBREG->getPixel(w, h - 2) << 13; |
+ CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; |
+ break; |
+ case 1: |
+ CONTEXT |= GBREG->getPixel(w - 1, h); |
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
+ CONTEXT |= GBREG->getPixel(w - 3, h) << 2; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
+ CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4; |
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5; |
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 6; |
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7; |
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8; |
+ CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9; |
+ CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10; |
+ CONTEXT |= GBREG->getPixel(w, h - 2) << 11; |
+ CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12; |
+ break; |
+ case 2: |
+ CONTEXT |= GBREG->getPixel(w - 1, h); |
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; |
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3; |
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 4; |
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5; |
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6; |
+ CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7; |
+ CONTEXT |= GBREG->getPixel(w, h - 2) << 8; |
+ CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9; |
+ break; |
+ case 3: |
+ CONTEXT |= GBREG->getPixel(w - 1, h); |
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1; |
+ CONTEXT |= GBREG->getPixel(w - 3, h) << 2; |
+ CONTEXT |= GBREG->getPixel(w - 4, h) << 3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; |
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5; |
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 6; |
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7; |
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8; |
+ CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9; |
+ break; |
+ } |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ GBREG->setPixel(w, h, bVal); |
+ } |
+ } |
} |
+ } |
+ return GBREG; |
+} |
+CJBig2_Image* CJBig2_GRDProc::decode_MMR(CJBig2_BitStream* pStream) { |
+ int bitpos, i; |
+ CJBig2_Image* pImage; |
+ JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH)); |
+ if (pImage->m_pData == NULL) { |
+ delete pImage; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ return NULL; |
+ } |
+ bitpos = (int)pStream->getBitPos(); |
+ _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, |
+ pImage->m_pData, GBW, GBH, pImage->m_nStride); |
+ pStream->setBitPos(bitpos); |
+ for (i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) { |
+ pImage->m_pData[i] = ~pImage->m_pData[i]; |
+ } |
+ return pImage; |
+} |
+CJBig2_Image* CJBig2_GRRDProc::decode(CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* grContext) { |
+ if (GRW == 0 || GRH == 0) { |
+ CJBig2_Image* pImage; |
+ JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH)); |
return pImage; |
+ } |
+ if (GRTEMPLATE == 0) { |
+ if ((GRAT[0] == (signed char)-1) && (GRAT[1] == (signed char)-1) && |
+ (GRAT[2] == (signed char)-1) && (GRAT[3] == (signed char)-1) && |
+ (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) { |
+ return decode_Template0_opt(pArithDecoder, grContext); |
+ } else { |
+ return decode_Template0_unopt(pArithDecoder, grContext); |
+ } |
+ } else { |
+ if ((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) { |
+ return decode_Template1_opt(pArithDecoder, grContext); |
+ } else { |
+ return decode_Template1_unopt(pArithDecoder, grContext); |
+ } |
+ } |
} |
-CJBig2_Image *CJBig2_GRRDProc::decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext) |
-{ |
- if (GRW == 0 || GRH == 0) { |
- CJBig2_Image* pImage; |
- JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH)); |
- return pImage; |
+CJBig2_Image* CJBig2_GRRDProc::decode_Template0_unopt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* grContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GRREG; |
+ FX_DWORD line1, line2, line3, line4, line5; |
+ LTP = 0; |
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
+ GRREG->fill(0); |
+ for (FX_DWORD h = 0; h < GRH; h++) { |
+ if (TPGRON) { |
+ SLTP = pArithDecoder->DECODE(&grContext[0x0010]); |
+ LTP = LTP ^ SLTP; |
} |
- if(GRTEMPLATE == 0) { |
- if((GRAT[0] == (signed char) - 1) && (GRAT[1] == (signed char) - 1) |
- && (GRAT[2] == (signed char) - 1) && (GRAT[3] == (signed char) - 1) |
- && (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) { |
- return decode_Template0_opt(pArithDecoder, grContext); |
- } else { |
- return decode_Template0_unopt(pArithDecoder, grContext); |
- } |
+ if (LTP == 0) { |
+ line1 = GRREG->getPixel(1, h - 1); |
+ line1 |= GRREG->getPixel(0, h - 1) << 1; |
+ line2 = 0; |
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1); |
+ line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) |
+ << 1; |
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) |
+ << 2; |
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) |
+ << 1; |
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) |
+ << 2; |
+ for (FX_DWORD w = 0; w < GRW; w++) { |
+ CONTEXT = line5; |
+ CONTEXT |= line4 << 3; |
+ CONTEXT |= line3 << 6; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], |
+ h - GRREFERENCEDY + GRAT[3]) |
+ << 8; |
+ CONTEXT |= line2 << 9; |
+ CONTEXT |= line1 << 10; |
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
+ GRREG->setPixel(w, h, bVal); |
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03; |
+ line2 = ((line2 << 1) | bVal) & 0x01; |
+ line3 = ((line3 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
+ h - GRREFERENCEDY - 1)) & |
+ 0x03; |
+ line4 = |
+ ((line4 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & |
+ 0x07; |
+ line5 = ((line5 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
+ h - GRREFERENCEDY + 1)) & |
+ 0x07; |
+ } |
} else { |
- if((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) { |
- return decode_Template1_opt(pArithDecoder, grContext); |
- } else { |
- return decode_Template1_unopt(pArithDecoder, grContext); |
+ line1 = GRREG->getPixel(1, h - 1); |
+ line1 |= GRREG->getPixel(0, h - 1) << 1; |
+ line2 = 0; |
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1); |
+ line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) |
+ << 1; |
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) |
+ << 2; |
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) |
+ << 1; |
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) |
+ << 2; |
+ for (FX_DWORD w = 0; w < GRW; w++) { |
+ bVal = GRREFERENCE->getPixel(w, h); |
+ if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w - 1, h)) && |
+ (bVal == GRREFERENCE->getPixel(w + 1, h)) && |
+ (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) && |
+ (bVal == GRREFERENCE->getPixel(w, h + 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) { |
+ CONTEXT = line5; |
+ CONTEXT |= line4 << 3; |
+ CONTEXT |= line3 << 6; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], |
+ h - GRREFERENCEDY + GRAT[3]) |
+ << 8; |
+ CONTEXT |= line2 << 9; |
+ CONTEXT |= line1 << 10; |
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
} |
+ GRREG->setPixel(w, h, bVal); |
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03; |
+ line2 = ((line2 << 1) | bVal) & 0x01; |
+ line3 = ((line3 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
+ h - GRREFERENCEDY - 1)) & |
+ 0x03; |
+ line4 = |
+ ((line4 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & |
+ 0x07; |
+ line5 = ((line5 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
+ h - GRREFERENCEDY + 1)) & |
+ 0x07; |
+ } |
} |
+ } |
+ return GRREG; |
} |
-CJBig2_Image *CJBig2_GRRDProc::decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GRREG; |
- FX_DWORD line1, line2, line3, line4, line5; |
- LTP = 0; |
- JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
- GRREG->fill(0); |
- for(FX_DWORD h = 0; h < GRH; h++) { |
- if(TPGRON) { |
- SLTP = pArithDecoder->DECODE(&grContext[0x0010]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 0) { |
- line1 = GRREG->getPixel(1, h - 1); |
- line1 |= GRREG->getPixel(0, h - 1) << 1; |
- line2 = 0; |
- line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1); |
- line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1; |
- line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2; |
- line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1; |
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2; |
- for(FX_DWORD w = 0; w < GRW; w++) { |
- CONTEXT = line5; |
- CONTEXT |= line4 << 3; |
- CONTEXT |= line3 << 6; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8; |
- CONTEXT |= line2 << 9; |
- CONTEXT |= line1 << 10; |
- CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- GRREG->setPixel(w, h, bVal); |
- line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03; |
- line2 = ((line2 << 1) | bVal) & 0x01; |
- line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03; |
- line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07; |
- line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07; |
- } |
+CJBig2_Image* CJBig2_GRRDProc::decode_Template0_opt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* grContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GRREG; |
+ FX_DWORD line1, line1_r, line2_r, line3_r; |
+ uint8_t *pLine, *pLineR, cVal; |
+ intptr_t nStride, nStrideR, nOffset; |
+ int32_t k, nBits; |
+ int32_t GRWR, GRHR; |
+ int32_t GRW, GRH; |
+ GRW = (int32_t)CJBig2_GRRDProc::GRW; |
+ GRH = (int32_t)CJBig2_GRRDProc::GRH; |
+ LTP = 0; |
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
+ if (GRREG->m_pData == NULL) { |
+ delete GRREG; |
+ m_pModule->JBig2_Error( |
+ "Generic refinement region decoding procedure: Create Image Failed " |
+ "with width = %d, height = %d\n", |
+ GRW, GRH); |
+ return NULL; |
+ } |
+ pLine = GRREG->m_pData; |
+ pLineR = GRREFERENCE->m_pData; |
+ nStride = GRREG->m_nStride; |
+ nStrideR = GRREFERENCE->m_nStride; |
+ GRWR = (int32_t)GRREFERENCE->m_nWidth; |
+ GRHR = (int32_t)GRREFERENCE->m_nHeight; |
+ if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { |
+ GRREFERENCEDY = 0; |
+ } |
+ nOffset = -GRREFERENCEDY * nStrideR; |
+ for (int32_t h = 0; h < GRH; h++) { |
+ if (TPGRON) { |
+ SLTP = pArithDecoder->DECODE(&grContext[0x0010]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ line1 = (h > 0) ? pLine[-nStride] << 4 : 0; |
+ int32_t reference_h = h - GRREFERENCEDY; |
+ FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); |
+ FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR); |
+ FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1); |
+ line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0; |
+ line2_r = line2_r_ok ? pLineR[nOffset] : 0; |
+ line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0; |
+ if (LTP == 0) { |
+ CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) | |
+ ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007); |
+ for (int32_t w = 0; w < GRW; w += 8) { |
+ nBits = GRW - w > 8 ? 8 : GRW - w; |
+ if (h > 0) |
+ line1 = (line1 << 8) | |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0); |
+ if (h > GRHR + GRREFERENCEDY + 1) { |
+ line1_r = 0; |
+ line2_r = 0; |
+ line3_r = 0; |
} else { |
- line1 = GRREG->getPixel(1, h - 1); |
- line1 |= GRREG->getPixel(0, h - 1) << 1; |
- line2 = 0; |
- line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1); |
- line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1; |
- line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2; |
- line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1; |
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2; |
- for(FX_DWORD w = 0; w < GRW; w++) { |
- bVal = GRREFERENCE->getPixel(w, h); |
- if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w - 1, h)) |
- && (bVal == GRREFERENCE->getPixel(w + 1, h)) |
- && (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) |
- && (bVal == GRREFERENCE->getPixel(w, h + 1)) |
- && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) { |
- CONTEXT = line5; |
- CONTEXT |= line4 << 3; |
- CONTEXT |= line3 << 6; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8; |
- CONTEXT |= line2 << 9; |
- CONTEXT |= line1 << 10; |
- CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- } |
- GRREG->setPixel(w, h, bVal); |
- line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03; |
- line2 = ((line2 << 1) | bVal) & 0x01; |
- line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03; |
- line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07; |
- line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07; |
- } |
+ if (line1_r_ok) |
+ line1_r = |
+ (line1_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
+ if (line2_r_ok) |
+ line2_r = (line2_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
+ if (line3_r_ok) |
+ line3_r = |
+ (line3_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
+ else { |
+ line3_r = 0; |
+ } |
+ } |
+ cVal = 0; |
+ for (k = 0; k < nBits; k++) { |
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) | |
+ ((line1 >> (7 - k)) & 0x0400) | |
+ ((line1_r >> (7 - k)) & 0x0040) | |
+ ((line2_r >> (10 - k)) & 0x0008) | |
+ ((line3_r >> (13 - k)) & 0x0001); |
+ } |
+ pLine[w >> 3] = cVal; |
+ } |
+ } else { |
+ CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) | |
+ ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007); |
+ for (int32_t w = 0; w < GRW; w += 8) { |
+ nBits = GRW - w > 8 ? 8 : GRW - w; |
+ if (h > 0) |
+ line1 = (line1 << 8) | |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0); |
+ if (line1_r_ok) |
+ line1_r = |
+ (line1_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
+ if (line2_r_ok) |
+ line2_r = (line2_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
+ if (line3_r_ok) |
+ line3_r = |
+ (line3_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
+ else { |
+ line3_r = 0; |
+ } |
+ cVal = 0; |
+ for (k = 0; k < nBits; k++) { |
+ bVal = GRREFERENCE->getPixel(w + k, h); |
+ if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + k, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + k - 1, h)) && |
+ (bVal == GRREFERENCE->getPixel(w + k + 1, h)) && |
+ (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + k, h + 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) { |
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
+ } |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) | |
+ ((line1 >> (7 - k)) & 0x0400) | |
+ ((line1_r >> (7 - k)) & 0x0040) | |
+ ((line2_r >> (10 - k)) & 0x0008) | |
+ ((line3_r >> (13 - k)) & 0x0001); |
} |
+ pLine[w >> 3] = cVal; |
+ } |
} |
- return GRREG; |
+ pLine += nStride; |
+ if (h < GRHR + GRREFERENCEDY) { |
+ pLineR += nStrideR; |
+ } |
+ } |
+ return GRREG; |
} |
-CJBig2_Image *CJBig2_GRRDProc::decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GRREG; |
- FX_DWORD line1, line1_r, line2_r, line3_r; |
- uint8_t *pLine, *pLineR, cVal; |
- intptr_t nStride, nStrideR, nOffset; |
- int32_t k, nBits; |
- int32_t GRWR, GRHR; |
- int32_t GRW, GRH; |
- GRW = (int32_t)CJBig2_GRRDProc::GRW; |
- GRH = (int32_t)CJBig2_GRRDProc::GRH; |
- LTP = 0; |
- JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
- if (GRREG->m_pData == NULL) { |
- delete GRREG; |
- m_pModule->JBig2_Error("Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\n", GRW, GRH); |
- return NULL; |
+CJBig2_Image* CJBig2_GRRDProc::decode_Template1_unopt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* grContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GRREG; |
+ FX_DWORD line1, line2, line3, line4, line5; |
+ LTP = 0; |
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
+ GRREG->fill(0); |
+ for (FX_DWORD h = 0; h < GRH; h++) { |
+ if (TPGRON) { |
+ SLTP = pArithDecoder->DECODE(&grContext[0x0008]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 0) { |
+ line1 = GRREG->getPixel(1, h - 1); |
+ line1 |= GRREG->getPixel(0, h - 1) << 1; |
+ line1 |= GRREG->getPixel(-1, h - 1) << 2; |
+ line2 = 0; |
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1); |
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) |
+ << 2; |
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) |
+ << 1; |
+ for (FX_DWORD w = 0; w < GRW; w++) { |
+ CONTEXT = line5; |
+ CONTEXT |= line4 << 2; |
+ CONTEXT |= line3 << 5; |
+ CONTEXT |= line2 << 6; |
+ CONTEXT |= line1 << 7; |
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
+ GRREG->setPixel(w, h, bVal); |
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07; |
+ line2 = ((line2 << 1) | bVal) & 0x01; |
+ line3 = ((line3 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
+ h - GRREFERENCEDY - 1)) & |
+ 0x01; |
+ line4 = |
+ ((line4 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & |
+ 0x07; |
+ line5 = ((line5 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
+ h - GRREFERENCEDY + 1)) & |
+ 0x03; |
+ } |
+ } else { |
+ line1 = GRREG->getPixel(1, h - 1); |
+ line1 |= GRREG->getPixel(0, h - 1) << 1; |
+ line1 |= GRREG->getPixel(-1, h - 1) << 2; |
+ line2 = 0; |
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1); |
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) |
+ << 2; |
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) |
+ << 1; |
+ for (FX_DWORD w = 0; w < GRW; w++) { |
+ bVal = GRREFERENCE->getPixel(w, h); |
+ if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w - 1, h)) && |
+ (bVal == GRREFERENCE->getPixel(w + 1, h)) && |
+ (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) && |
+ (bVal == GRREFERENCE->getPixel(w, h + 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) { |
+ CONTEXT = line5; |
+ CONTEXT |= line4 << 2; |
+ CONTEXT |= line3 << 5; |
+ CONTEXT |= line2 << 6; |
+ CONTEXT |= line1 << 7; |
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
+ } |
+ GRREG->setPixel(w, h, bVal); |
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07; |
+ line2 = ((line2 << 1) | bVal) & 0x01; |
+ line3 = ((line3 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
+ h - GRREFERENCEDY - 1)) & |
+ 0x01; |
+ line4 = |
+ ((line4 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & |
+ 0x07; |
+ line5 = ((line5 << 1) | |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, |
+ h - GRREFERENCEDY + 1)) & |
+ 0x03; |
+ } |
} |
- pLine = GRREG->m_pData; |
- pLineR = GRREFERENCE->m_pData; |
- nStride = GRREG->m_nStride; |
- nStrideR = GRREFERENCE->m_nStride; |
- GRWR = (int32_t)GRREFERENCE->m_nWidth; |
- GRHR = (int32_t)GRREFERENCE->m_nHeight; |
- if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { |
- GRREFERENCEDY = 0; |
+ } |
+ return GRREG; |
+} |
+CJBig2_Image* CJBig2_GRRDProc::decode_Template1_opt( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* grContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GRREG; |
+ FX_DWORD line1, line1_r, line2_r, line3_r; |
+ uint8_t *pLine, *pLineR, cVal; |
+ intptr_t nStride, nStrideR, nOffset; |
+ int32_t k, nBits; |
+ int32_t GRWR, GRHR; |
+ int32_t GRW, GRH; |
+ GRW = (int32_t)CJBig2_GRRDProc::GRW; |
+ GRH = (int32_t)CJBig2_GRRDProc::GRH; |
+ LTP = 0; |
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
+ if (GRREG->m_pData == NULL) { |
+ delete GRREG; |
+ m_pModule->JBig2_Error( |
+ "Generic refinement region decoding procedure: Create Image Failed " |
+ "with width = %d, height = %d\n", |
+ GRW, GRH); |
+ return NULL; |
+ } |
+ pLine = GRREG->m_pData; |
+ pLineR = GRREFERENCE->m_pData; |
+ nStride = GRREG->m_nStride; |
+ nStrideR = GRREFERENCE->m_nStride; |
+ GRWR = (int32_t)GRREFERENCE->m_nWidth; |
+ GRHR = (int32_t)GRREFERENCE->m_nHeight; |
+ if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { |
+ GRREFERENCEDY = 0; |
+ } |
+ nOffset = -GRREFERENCEDY * nStrideR; |
+ for (int32_t h = 0; h < GRH; h++) { |
+ if (TPGRON) { |
+ SLTP = pArithDecoder->DECODE(&grContext[0x0008]); |
+ LTP = LTP ^ SLTP; |
} |
- nOffset = -GRREFERENCEDY * nStrideR; |
- for (int32_t h = 0; h < GRH; h++) { |
- if(TPGRON) { |
- SLTP = pArithDecoder->DECODE(&grContext[0x0010]); |
- LTP = LTP ^ SLTP; |
+ line1 = (h > 0) ? pLine[-nStride] << 1 : 0; |
+ int32_t reference_h = h - GRREFERENCEDY; |
+ FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); |
+ FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR); |
+ FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1); |
+ line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0; |
+ line2_r = line2_r_ok ? pLineR[nOffset] : 0; |
+ line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0; |
+ if (LTP == 0) { |
+ CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) | |
+ ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003); |
+ for (int32_t w = 0; w < GRW; w += 8) { |
+ nBits = GRW - w > 8 ? 8 : GRW - w; |
+ if (h > 0) |
+ line1 = (line1 << 8) | |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0); |
+ if (line1_r_ok) |
+ line1_r = |
+ (line1_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
+ if (line2_r_ok) |
+ line2_r = (line2_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
+ if (line3_r_ok) |
+ line3_r = |
+ (line3_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
+ else { |
+ line3_r = 0; |
} |
- line1 = (h > 0) ? pLine[-nStride] << 4 : 0; |
- int32_t reference_h = h - GRREFERENCEDY; |
- FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); |
- FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR); |
- FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1); |
- line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0; |
- line2_r = line2_r_ok ? pLineR[nOffset] : 0; |
- line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0; |
- if(LTP == 0) { |
- CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) |
- | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007); |
- for (int32_t w = 0; w < GRW; w += 8) { |
- nBits = GRW - w > 8 ? 8 : GRW - w; |
- if (h > 0) |
- line1 = (line1 << 8) | |
- (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0); |
- if (h > GRHR + GRREFERENCEDY + 1) { |
- line1_r = 0; |
- line2_r = 0; |
- line3_r = 0; |
- } else { |
- if(line1_r_ok) |
- line1_r = (line1_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
- if(line2_r_ok) |
- line2_r = (line2_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
- if(line3_r_ok) |
- line3_r = (line3_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
- else { |
- line3_r = 0; |
- } |
- } |
- cVal = 0; |
- for (k = 0; k < nBits; k++) { |
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) | |
- ((line1 >> (7 - k)) & 0x0400) | |
- ((line1_r >> (7 - k)) & 0x0040) | |
- ((line2_r >> (10 - k)) & 0x0008) | |
- ((line3_r >> (13 - k)) & 0x0001); |
- } |
- pLine[w >> 3] = cVal; |
- } |
- } else { |
- CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) |
- | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007); |
- for (int32_t w = 0; w < GRW; w += 8) { |
- nBits = GRW - w > 8 ? 8 : GRW - w; |
- if (h > 0) |
- line1 = (line1 << 8) | |
- (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0); |
- if(line1_r_ok) |
- line1_r = (line1_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
- if(line2_r_ok) |
- line2_r = (line2_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
- if(line3_r_ok) |
- line3_r = (line3_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
- else { |
- line3_r = 0; |
- } |
- cVal = 0; |
- for (k = 0; k < nBits; k++) { |
- bVal = GRREFERENCE->getPixel(w + k, h); |
- if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w + k, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w + k - 1, h)) |
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h)) |
- && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) |
- && (bVal == GRREFERENCE->getPixel(w + k, h + 1)) |
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) { |
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- } |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) | |
- ((line1 >> (7 - k)) & 0x0400) | |
- ((line1_r >> (7 - k)) & 0x0040) | |
- ((line2_r >> (10 - k)) & 0x0008) | |
- ((line3_r >> (13 - k)) & 0x0001); |
- } |
- pLine[w >> 3] = cVal; |
- } |
+ cVal = 0; |
+ for (k = 0; k < nBits; k++) { |
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) | |
+ ((line1 >> (7 - k)) & 0x0080) | |
+ ((line1_r >> (9 - k)) & 0x0020) | |
+ ((line2_r >> (11 - k)) & 0x0004) | |
+ ((line3_r >> (13 - k)) & 0x0001); |
+ } |
+ pLine[w >> 3] = cVal; |
+ } |
+ } else { |
+ CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) | |
+ ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003); |
+ for (int32_t w = 0; w < GRW; w += 8) { |
+ nBits = GRW - w > 8 ? 8 : GRW - w; |
+ if (h > 0) |
+ line1 = (line1 << 8) | |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0); |
+ if (line1_r_ok) |
+ line1_r = |
+ (line1_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
+ if (line2_r_ok) |
+ line2_r = (line2_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
+ if (line3_r_ok) |
+ line3_r = |
+ (line3_r << 8) | |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
+ else { |
+ line3_r = 0; |
} |
- pLine += nStride; |
- if (h < GRHR + GRREFERENCEDY) { |
- pLineR += nStrideR; |
+ cVal = 0; |
+ for (k = 0; k < nBits; k++) { |
+ bVal = GRREFERENCE->getPixel(w + k, h); |
+ if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + k, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + k - 1, h)) && |
+ (bVal == GRREFERENCE->getPixel(w + k + 1, h)) && |
+ (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + k, h + 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) { |
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
+ } |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) | |
+ ((line1 >> (7 - k)) & 0x0080) | |
+ ((line1_r >> (9 - k)) & 0x0020) | |
+ ((line2_r >> (11 - k)) & 0x0004) | |
+ ((line3_r >> (13 - k)) & 0x0001); |
} |
+ pLine[w >> 3] = cVal; |
+ } |
+ } |
+ pLine += nStride; |
+ if (h < GRHR + GRREFERENCEDY) { |
+ pLineR += nStrideR; |
} |
- return GRREG; |
+ } |
+ return GRREG; |
} |
-CJBig2_Image *CJBig2_GRRDProc::decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GRREG; |
- FX_DWORD line1, line2, line3, line4, line5; |
- LTP = 0; |
- JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
- GRREG->fill(0); |
- for(FX_DWORD h = 0; h < GRH; h++) { |
- if(TPGRON) { |
- SLTP = pArithDecoder->DECODE(&grContext[0x0008]); |
- LTP = LTP ^ SLTP; |
+CJBig2_Image* CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* grContext) { |
+ FX_BOOL LTP, SLTP, bVal; |
+ FX_BOOL TPGRPIX, TPGRVAL; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GRREG; |
+ LTP = 0; |
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
+ GRREG->fill(0); |
+ for (FX_DWORD h = 0; h < GRH; h++) { |
+ if (TPGRON) { |
+ switch (GRTEMPLATE) { |
+ case 0: |
+ CONTEXT = 0x0010; |
+ break; |
+ case 1: |
+ CONTEXT = 0x0008; |
+ break; |
+ } |
+ SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 0) { |
+ for (FX_DWORD w = 0; w < GRW; w++) { |
+ CONTEXT = 0; |
+ switch (GRTEMPLATE) { |
+ case 0: |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
+ h - GRREFERENCEDY + 1); |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) |
+ << 1; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, |
+ h - GRREFERENCEDY + 1) |
+ << 2; |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) |
+ << 3; |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) |
+ << 4; |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) |
+ << 5; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
+ h - GRREFERENCEDY - 1) |
+ << 6; |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) |
+ << 7; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], |
+ h - GRREFERENCEDY + GRAT[3]) |
+ << 8; |
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 9; |
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10; |
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 11; |
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
+ break; |
+ case 1: |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
+ h - GRREFERENCEDY + 1); |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) |
+ << 1; |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) |
+ << 2; |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) |
+ << 3; |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) |
+ << 4; |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) |
+ << 5; |
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 6; |
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7; |
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 8; |
+ CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9; |
+ break; |
} |
- if(LTP == 0) { |
- line1 = GRREG->getPixel(1, h - 1); |
- line1 |= GRREG->getPixel(0, h - 1) << 1; |
- line1 |= GRREG->getPixel(-1, h - 1) << 2; |
- line2 = 0; |
- line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1); |
- line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2; |
- line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1; |
- for(FX_DWORD w = 0; w < GRW; w++) { |
- CONTEXT = line5; |
- CONTEXT |= line4 << 2; |
- CONTEXT |= line3 << 5; |
- CONTEXT |= line2 << 6; |
- CONTEXT |= line1 << 7; |
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- GRREG->setPixel(w, h, bVal); |
- line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07; |
- line2 = ((line2 << 1) | bVal) & 0x01; |
- line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01; |
- line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07; |
- line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03; |
- } |
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
+ GRREG->setPixel(w, h, bVal); |
+ } |
+ } else { |
+ for (FX_DWORD w = 0; w < GRW; w++) { |
+ bVal = GRREFERENCE->getPixel(w, h); |
+ if (TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) && |
+ (bVal == GRREFERENCE->getPixel(w - 1, h)) && |
+ (bVal == GRREFERENCE->getPixel(w + 1, h)) && |
+ (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) && |
+ (bVal == GRREFERENCE->getPixel(w, h + 1)) && |
+ (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) { |
+ TPGRPIX = 1; |
+ TPGRVAL = bVal; |
} else { |
- line1 = GRREG->getPixel(1, h - 1); |
- line1 |= GRREG->getPixel(0, h - 1) << 1; |
- line1 |= GRREG->getPixel(-1, h - 1) << 2; |
- line2 = 0; |
- line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1); |
- line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); |
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; |
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2; |
- line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1; |
- for(FX_DWORD w = 0; w < GRW; w++) { |
- bVal = GRREFERENCE->getPixel(w, h); |
- if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w - 1, h)) |
- && (bVal == GRREFERENCE->getPixel(w + 1, h)) |
- && (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) |
- && (bVal == GRREFERENCE->getPixel(w, h + 1)) |
- && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) { |
- CONTEXT = line5; |
- CONTEXT |= line4 << 2; |
- CONTEXT |= line3 << 5; |
- CONTEXT |= line2 << 6; |
- CONTEXT |= line1 << 7; |
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- } |
- GRREG->setPixel(w, h, bVal); |
- line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07; |
- line2 = ((line2 << 1) | bVal) & 0x01; |
- line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01; |
- line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07; |
- line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03; |
- } |
+ TPGRPIX = 0; |
+ } |
+ if (TPGRPIX) { |
+ GRREG->setPixel(w, h, TPGRVAL); |
+ } else { |
+ CONTEXT = 0; |
+ switch (GRTEMPLATE) { |
+ case 0: |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
+ h - GRREFERENCEDY + 1); |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, |
+ h - GRREFERENCEDY + 1) |
+ << 1; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, |
+ h - GRREFERENCEDY + 1) |
+ << 2; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
+ h - GRREFERENCEDY) |
+ << 3; |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) |
+ << 4; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, |
+ h - GRREFERENCEDY) |
+ << 5; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
+ h - GRREFERENCEDY - 1) |
+ << 6; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, |
+ h - GRREFERENCEDY - 1) |
+ << 7; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], |
+ h - GRREFERENCEDY + GRAT[3]) |
+ << 8; |
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 9; |
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10; |
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 11; |
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
+ break; |
+ case 1: |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
+ h - GRREFERENCEDY + 1); |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, |
+ h - GRREFERENCEDY + 1) |
+ << 1; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, |
+ h - GRREFERENCEDY) |
+ << 2; |
+ CONTEXT |= |
+ GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) |
+ << 3; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, |
+ h - GRREFERENCEDY) |
+ << 4; |
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, |
+ h - GRREFERENCEDY - 1) |
+ << 5; |
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 6; |
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7; |
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 8; |
+ CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9; |
+ break; |
+ } |
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
+ GRREG->setPixel(w, h, bVal); |
} |
+ } |
} |
- return GRREG; |
+ } |
+ return GRREG; |
} |
-CJBig2_Image *CJBig2_GRRDProc::decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GRREG; |
- FX_DWORD line1, line1_r, line2_r, line3_r; |
- uint8_t *pLine, *pLineR, cVal; |
- intptr_t nStride, nStrideR, nOffset; |
- int32_t k, nBits; |
- int32_t GRWR, GRHR; |
- int32_t GRW, GRH; |
- GRW = (int32_t)CJBig2_GRRDProc::GRW; |
- GRH = (int32_t)CJBig2_GRRDProc::GRH; |
- LTP = 0; |
- JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
- if (GRREG->m_pData == NULL) { |
- delete GRREG; |
- m_pModule->JBig2_Error("Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\n", GRW, GRH); |
- return NULL; |
- } |
- pLine = GRREG->m_pData; |
- pLineR = GRREFERENCE->m_pData; |
- nStride = GRREG->m_nStride; |
- nStrideR = GRREFERENCE->m_nStride; |
- GRWR = (int32_t)GRREFERENCE->m_nWidth; |
- GRHR = (int32_t)GRREFERENCE->m_nHeight; |
- if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { |
- GRREFERENCEDY = 0; |
+CJBig2_Image* CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream* pStream, |
+ JBig2ArithCtx* grContext) { |
+ int32_t STRIPT, FIRSTS; |
+ FX_DWORD NINSTANCES; |
+ int32_t DT, DFS, CURS; |
+ uint8_t CURT; |
+ int32_t SI, TI; |
+ FX_DWORD IDI; |
+ CJBig2_Image* IBI; |
+ FX_DWORD WI, HI; |
+ int32_t IDS; |
+ FX_BOOL RI; |
+ int32_t RDWI, RDHI, RDXI, RDYI; |
+ CJBig2_Image* IBOI; |
+ FX_DWORD WOI, HOI; |
+ CJBig2_Image* SBREG; |
+ FX_BOOL bFirst; |
+ FX_DWORD nTmp; |
+ int32_t nVal, nBits; |
+ CJBig2_HuffmanDecoder* pHuffmanDecoder; |
+ CJBig2_GRRDProc* pGRRD; |
+ CJBig2_ArithDecoder* pArithDecoder; |
+ JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream)); |
+ JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH)); |
+ SBREG->fill(SBDEFPIXEL); |
+ if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (huffman): too short."); |
+ goto failed; |
+ } |
+ STRIPT *= SBSTRIPS; |
+ STRIPT = -STRIPT; |
+ FIRSTS = 0; |
+ NINSTANCES = 0; |
+ while (NINSTANCES < SBNUMINSTANCES) { |
+ if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (huffman): too short."); |
+ goto failed; |
} |
- nOffset = -GRREFERENCEDY * nStrideR; |
- for (int32_t h = 0; h < GRH; h++) { |
- if(TPGRON) { |
- SLTP = pArithDecoder->DECODE(&grContext[0x0008]); |
- LTP = LTP ^ SLTP; |
+ DT *= SBSTRIPS; |
+ STRIPT = STRIPT + DT; |
+ bFirst = TRUE; |
+ for (;;) { |
+ if (bFirst) { |
+ if (pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (huffman): too short."); |
+ goto failed; |
} |
- line1 = (h > 0) ? pLine[-nStride] << 1 : 0; |
- int32_t reference_h = h - GRREFERENCEDY; |
- FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); |
- FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR); |
- FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1); |
- line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0; |
- line2_r = line2_r_ok ? pLineR[nOffset] : 0; |
- line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0; |
- if(LTP == 0) { |
- CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) |
- | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003); |
- for (int32_t w = 0; w < GRW; w += 8) { |
- nBits = GRW - w > 8 ? 8 : GRW - w; |
- if (h > 0) |
- line1 = (line1 << 8) | |
- (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0); |
- if(line1_r_ok) |
- line1_r = (line1_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
- if(line2_r_ok) |
- line2_r = (line2_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
- if(line3_r_ok) |
- line3_r = (line3_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
- else { |
- line3_r = 0; |
- } |
- cVal = 0; |
- for (k = 0; k < nBits; k++) { |
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) | |
- ((line1 >> (7 - k)) & 0x0080) | |
- ((line1_r >> (9 - k)) & 0x0020) | |
- ((line2_r >> (11 - k)) & 0x0004) | |
- ((line3_r >> (13 - k)) & 0x0001); |
- } |
- pLine[w >> 3] = cVal; |
- } |
+ FIRSTS = FIRSTS + DFS; |
+ CURS = FIRSTS; |
+ bFirst = FALSE; |
+ } else { |
+ nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS); |
+ if (nVal == JBIG2_OOB) { |
+ break; |
+ } else if (nVal != 0) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (huffman): too short."); |
+ goto failed; |
} else { |
- CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) |
- | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003); |
- for (int32_t w = 0; w < GRW; w += 8) { |
- nBits = GRW - w > 8 ? 8 : GRW - w; |
- if (h > 0) |
- line1 = (line1 << 8) | |
- (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0); |
- if(line1_r_ok) |
- line1_r = (line1_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); |
- if(line2_r_ok) |
- line2_r = (line2_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); |
- if(line3_r_ok) |
- line3_r = (line3_r << 8) | |
- (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); |
- else { |
- line3_r = 0; |
- } |
- cVal = 0; |
- for (k = 0; k < nBits; k++) { |
- bVal = GRREFERENCE->getPixel(w + k, h); |
- if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w + k, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w + k - 1, h)) |
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h)) |
- && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) |
- && (bVal == GRREFERENCE->getPixel(w + k, h + 1)) |
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) { |
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- } |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) | |
- ((line1 >> (7 - k)) & 0x0080) | |
- ((line1_r >> (9 - k)) & 0x0020) | |
- ((line2_r >> (11 - k)) & 0x0004) | |
- ((line3_r >> (13 - k)) & 0x0001); |
- } |
- pLine[w >> 3] = cVal; |
- } |
+ CURS = CURS + IDS + SBDSOFFSET; |
} |
- pLine += nStride; |
- if (h < GRHR + GRREFERENCEDY) { |
- pLineR += nStrideR; |
+ } |
+ if (SBSTRIPS == 1) { |
+ CURT = 0; |
+ } else { |
+ nTmp = 1; |
+ while ((FX_DWORD)(1 << nTmp) < SBSTRIPS) { |
+ nTmp++; |
} |
- } |
- return GRREG; |
-} |
-CJBig2_Image *CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext) |
-{ |
- FX_BOOL LTP, SLTP, bVal; |
- FX_BOOL TPGRPIX, TPGRVAL; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GRREG; |
- LTP = 0; |
- JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH)); |
- GRREG->fill(0); |
- for(FX_DWORD h = 0; h < GRH; h++) { |
- if(TPGRON) { |
- switch(GRTEMPLATE) { |
- case 0: |
- CONTEXT = 0x0010; |
- break; |
- case 1: |
- CONTEXT = 0x0008; |
- break; |
- } |
- SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- LTP = LTP ^ SLTP; |
+ if (pStream->readNBits(nTmp, &nVal) != 0) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (huffman): too short."); |
+ goto failed; |
} |
- if(LTP == 0) { |
- for(FX_DWORD w = 0; w < GRW; w++) { |
- CONTEXT = 0; |
- switch(GRTEMPLATE) { |
- case 0: |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8; |
- CONTEXT |= GRREG->getPixel(w - 1, h) << 9; |
- CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10; |
- CONTEXT |= GRREG->getPixel(w, h - 1) << 11; |
- CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
- break; |
- case 1: |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5; |
- CONTEXT |= GRREG->getPixel(w - 1, h) << 6; |
- CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7; |
- CONTEXT |= GRREG->getPixel(w, h - 1) << 8; |
- CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9; |
- break; |
- } |
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- GRREG->setPixel(w, h, bVal); |
- } |
- } else { |
- for(FX_DWORD w = 0; w < GRW; w++) { |
- bVal = GRREFERENCE->getPixel(w, h); |
- if(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) |
- && (bVal == GRREFERENCE->getPixel(w - 1, h)) |
- && (bVal == GRREFERENCE->getPixel(w + 1, h)) |
- && (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) |
- && (bVal == GRREFERENCE->getPixel(w, h + 1)) |
- && (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) { |
- TPGRPIX = 1; |
- TPGRVAL = bVal; |
- } else { |
- TPGRPIX = 0; |
- } |
- if(TPGRPIX) { |
- GRREG->setPixel(w, h, TPGRVAL); |
- } else { |
- CONTEXT = 0; |
- switch(GRTEMPLATE) { |
- case 0: |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8; |
- CONTEXT |= GRREG->getPixel(w - 1, h) << 9; |
- CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10; |
- CONTEXT |= GRREG->getPixel(w, h - 1) << 11; |
- CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; |
- break; |
- case 1: |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4; |
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5; |
- CONTEXT |= GRREG->getPixel(w - 1, h) << 6; |
- CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7; |
- CONTEXT |= GRREG->getPixel(w, h - 1) << 8; |
- CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9; |
- break; |
- } |
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); |
- GRREG->setPixel(w, h, bVal); |
- } |
- } |
+ CURT = nVal; |
+ } |
+ TI = STRIPT + CURT; |
+ nVal = 0; |
+ nBits = 0; |
+ for (;;) { |
+ if (pStream->read1Bit(&nTmp) != 0) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (huffman): too short."); |
+ goto failed; |
} |
- } |
- return GRREG; |
-} |
-CJBig2_Image *CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext) |
-{ |
- int32_t STRIPT, FIRSTS; |
- FX_DWORD NINSTANCES; |
- int32_t DT, DFS, CURS; |
- uint8_t CURT; |
- int32_t SI, TI; |
- FX_DWORD IDI; |
- CJBig2_Image *IBI; |
- FX_DWORD WI, HI; |
- int32_t IDS; |
- FX_BOOL RI; |
- int32_t RDWI, RDHI, RDXI, RDYI; |
- CJBig2_Image *IBOI; |
- FX_DWORD WOI, HOI; |
- CJBig2_Image *SBREG; |
- FX_BOOL bFirst; |
- FX_DWORD nTmp; |
- int32_t nVal, nBits; |
- CJBig2_HuffmanDecoder *pHuffmanDecoder; |
- CJBig2_GRRDProc *pGRRD; |
- CJBig2_ArithDecoder *pArithDecoder; |
- JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream)); |
- JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH)); |
- SBREG->fill(SBDEFPIXEL); |
- if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) { |
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- STRIPT *= SBSTRIPS; |
- STRIPT = -STRIPT; |
- FIRSTS = 0; |
- NINSTANCES = 0; |
- while(NINSTANCES < SBNUMINSTANCES) { |
- if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) { |
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short."); |
- goto failed; |
+ nVal = (nVal << 1) | nTmp; |
+ nBits++; |
+ for (IDI = 0; IDI < SBNUMSYMS; IDI++) { |
+ if ((nBits == SBSYMCODES[IDI].codelen) && |
+ (nVal == SBSYMCODES[IDI].code)) { |
+ break; |
+ } |
} |
- DT *= SBSTRIPS; |
- STRIPT = STRIPT + DT; |
- bFirst = TRUE; |
- for(;;) { |
- if(bFirst) { |
- if(pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) { |
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- FIRSTS = FIRSTS + DFS; |
- CURS = FIRSTS; |
- bFirst = FALSE; |
- } else { |
- nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS); |
- if(nVal == JBIG2_OOB) { |
- break; |
- } else if(nVal != 0) { |
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short."); |
- goto failed; |
- } else { |
- CURS = CURS + IDS + SBDSOFFSET; |
- } |
- } |
- if(SBSTRIPS == 1) { |
- CURT = 0; |
- } else { |
- nTmp = 1; |
- while((FX_DWORD)(1 << nTmp) < SBSTRIPS) { |
- nTmp ++; |
- } |
- if(pStream->readNBits(nTmp, &nVal) != 0) { |
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- CURT = nVal; |
- } |
- TI = STRIPT + CURT; |
- nVal = 0; |
- nBits = 0; |
- for(;;) { |
- if(pStream->read1Bit(&nTmp) != 0) { |
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- nVal = (nVal << 1) | nTmp; |
- nBits ++; |
- for(IDI = 0; IDI < SBNUMSYMS; IDI++) { |
- if((nBits == SBSYMCODES[IDI].codelen) && (nVal == SBSYMCODES[IDI].code)) { |
- break; |
- } |
- } |
- if(IDI < SBNUMSYMS) { |
- break; |
- } |
- } |
- if(SBREFINE == 0) { |
- RI = 0; |
- } else { |
- if(pStream->read1Bit(&RI) != 0) { |
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- } |
- if(RI == 0) { |
- IBI = SBSYMS[IDI]; |
- } else { |
- if((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0) |
- || (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0) |
- || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) |
- || (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0) |
- || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) { |
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- pStream->alignByte(); |
- nTmp = pStream->getOffset(); |
- IBOI = SBSYMS[IDI]; |
- if (!IBOI) { |
- goto failed; |
- } |
- WOI = IBOI->m_nWidth; |
- HOI = IBOI->m_nHeight; |
- if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { |
- m_pModule->JBig2_Error("text region decoding procedure (huffman): Invalid RDWI or RDHI value."); |
- goto failed; |
- } |
- JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
- pGRRD->GRW = WOI + RDWI; |
- pGRRD->GRH = HOI + RDHI; |
- pGRRD->GRTEMPLATE = SBRTEMPLATE; |
- pGRRD->GRREFERENCE = IBOI; |
- pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI; |
- pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI; |
- pGRRD->TPGRON = 0; |
- pGRRD->GRAT[0] = SBRAT[0]; |
- pGRRD->GRAT[1] = SBRAT[1]; |
- pGRRD->GRAT[2] = SBRAT[2]; |
- pGRRD->GRAT[3] = SBRAT[3]; |
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream)); |
- IBI = pGRRD->decode(pArithDecoder, grContext); |
- if(IBI == NULL) { |
- delete pGRRD; |
- delete pArithDecoder; |
- goto failed; |
- } |
- delete pArithDecoder; |
- pStream->alignByte(); |
- pStream->offset(2); |
- if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { |
- delete IBI; |
- delete pGRRD; |
- m_pModule->JBig2_Error("text region decoding procedure (huffman):" |
- "bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE."); |
- goto failed; |
- } |
- delete pGRRD; |
- } |
- if (!IBI) { |
- continue; |
- } |
- WI = IBI->m_nWidth; |
- HI = IBI->m_nHeight; |
- if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) |
- || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
- CURS = CURS + WI - 1; |
- } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) |
- || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
- CURS = CURS + HI - 1; |
- } |
- SI = CURS; |
- if(TRANSPOSED == 0) { |
- switch(REFCORNER) { |
- case JBIG2_CORNER_TOPLEFT: |
- SBREG->composeFrom(SI, TI, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_TOPRIGHT: |
- SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_BOTTOMLEFT: |
- SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_BOTTOMRIGHT: |
- SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP); |
- break; |
- } |
- } else { |
- switch(REFCORNER) { |
- case JBIG2_CORNER_TOPLEFT: |
- SBREG->composeFrom(TI, SI, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_TOPRIGHT: |
- SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_BOTTOMLEFT: |
- SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_BOTTOMRIGHT: |
- SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP); |
- break; |
- } |
- } |
- if(RI != 0) { |
- delete IBI; |
- } |
- if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) |
- || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { |
- CURS = CURS + WI - 1; |
- } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) |
- || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) { |
- CURS = CURS + HI - 1; |
- } |
- NINSTANCES = NINSTANCES + 1; |
+ if (IDI < SBNUMSYMS) { |
+ break; |
} |
- } |
- delete pHuffmanDecoder; |
- return SBREG; |
-failed: |
- delete pHuffmanDecoder; |
- delete SBREG; |
- return NULL; |
-} |
-CJBig2_Image *CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext, |
- JBig2IntDecoderState *pIDS) |
-{ |
- int32_t STRIPT, FIRSTS; |
- FX_DWORD NINSTANCES; |
- int32_t DT, DFS, CURS; |
- int32_t CURT; |
- int32_t SI, TI; |
- FX_DWORD IDI; |
- CJBig2_Image *IBI; |
- FX_DWORD WI, HI; |
- int32_t IDS; |
- int RI; |
- int32_t RDWI, RDHI, RDXI, RDYI; |
- CJBig2_Image *IBOI; |
- FX_DWORD WOI, HOI; |
- CJBig2_Image *SBREG; |
- FX_BOOL bFirst; |
- int32_t nRet, nVal; |
- int32_t bRetained; |
- CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, *IARDX, *IARDY; |
- CJBig2_ArithIaidDecoder *IAID; |
- CJBig2_GRRDProc *pGRRD; |
- if(pIDS) { |
- IADT = pIDS->IADT; |
- IAFS = pIDS->IAFS; |
- IADS = pIDS->IADS; |
- IAIT = pIDS->IAIT; |
- IARI = pIDS->IARI; |
- IARDW = pIDS->IARDW; |
- IARDH = pIDS->IARDH; |
- IARDX = pIDS->IARDX; |
- IARDY = pIDS->IARDY; |
- IAID = pIDS->IAID; |
- bRetained = TRUE; |
- } else { |
- JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IAID , CJBig2_ArithIaidDecoder(SBSYMCODELEN)); |
- bRetained = FALSE; |
- } |
- JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH)); |
- SBREG->fill(SBDEFPIXEL); |
- if(IADT->decode(pArithDecoder, &STRIPT) == -1) { |
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short."); |
- goto failed; |
- } |
- STRIPT *= SBSTRIPS; |
- STRIPT = -STRIPT; |
- FIRSTS = 0; |
- NINSTANCES = 0; |
- while(NINSTANCES < SBNUMINSTANCES) { |
- if(IADT->decode(pArithDecoder, &DT) == -1) { |
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short."); |
- goto failed; |
+ } |
+ if (SBREFINE == 0) { |
+ RI = 0; |
+ } else { |
+ if (pStream->read1Bit(&RI) != 0) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (huffman): too short."); |
+ goto failed; |
} |
- DT *= SBSTRIPS; |
- STRIPT = STRIPT + DT; |
- bFirst = TRUE; |
- for(;;) { |
- if(bFirst) { |
- if(IAFS->decode(pArithDecoder, &DFS) == -1) { |
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short."); |
- goto failed; |
- } |
- FIRSTS = FIRSTS + DFS; |
- CURS = FIRSTS; |
- bFirst = FALSE; |
- } else { |
- nRet = IADS->decode(pArithDecoder, &IDS); |
- if(nRet == JBIG2_OOB) { |
- break; |
- } else if(nRet != 0) { |
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short."); |
- goto failed; |
- } else { |
- CURS = CURS + IDS + SBDSOFFSET; |
- } |
- } |
- if (NINSTANCES >= SBNUMINSTANCES) { |
- break; |
- } |
- if(SBSTRIPS == 1) { |
- CURT = 0; |
- } else { |
- if(IAIT->decode(pArithDecoder, &nVal) == -1) { |
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short."); |
- goto failed; |
- } |
- CURT = nVal; |
- } |
- TI = STRIPT + CURT; |
- if(IAID->decode(pArithDecoder, &nVal) == -1) { |
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short."); |
- goto failed; |
- } |
- IDI = nVal; |
- if(IDI >= SBNUMSYMS) { |
- m_pModule->JBig2_Error("text region decoding procedure (arith): symbol id out of range.(%d/%d)", |
- IDI, SBNUMSYMS); |
- goto failed; |
- } |
- if(SBREFINE == 0) { |
- RI = 0; |
- } else { |
- if(IARI->decode(pArithDecoder, &RI) == -1) { |
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short."); |
- goto failed; |
- } |
- } |
- if (!SBSYMS[IDI]) { |
- goto failed; |
- } |
- if(RI == 0) { |
- IBI = SBSYMS[IDI]; |
- } else { |
- if((IARDW->decode(pArithDecoder, &RDWI) == -1) |
- || (IARDH->decode(pArithDecoder, &RDHI) == -1) |
- || (IARDX->decode(pArithDecoder, &RDXI) == -1) |
- || (IARDY->decode(pArithDecoder, &RDYI) == -1)) { |
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short."); |
- goto failed; |
- } |
- IBOI = SBSYMS[IDI]; |
- WOI = IBOI->m_nWidth; |
- HOI = IBOI->m_nHeight; |
- if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { |
- m_pModule->JBig2_Error("text region decoding procedure (arith): Invalid RDWI or RDHI value."); |
- goto failed; |
- } |
- JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
- pGRRD->GRW = WOI + RDWI; |
- pGRRD->GRH = HOI + RDHI; |
- pGRRD->GRTEMPLATE = SBRTEMPLATE; |
- pGRRD->GRREFERENCE = IBOI; |
- pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI; |
- pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI; |
- pGRRD->TPGRON = 0; |
- pGRRD->GRAT[0] = SBRAT[0]; |
- pGRRD->GRAT[1] = SBRAT[1]; |
- pGRRD->GRAT[2] = SBRAT[2]; |
- pGRRD->GRAT[3] = SBRAT[3]; |
- IBI = pGRRD->decode(pArithDecoder, grContext); |
- if(IBI == NULL) { |
- delete pGRRD; |
- goto failed; |
- } |
- delete pGRRD; |
- } |
- WI = IBI->m_nWidth; |
- HI = IBI->m_nHeight; |
- if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) |
- || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
- CURS = CURS + WI - 1; |
- } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) |
- || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
- CURS = CURS + HI - 1; |
- } |
- SI = CURS; |
- if(TRANSPOSED == 0) { |
- switch(REFCORNER) { |
- case JBIG2_CORNER_TOPLEFT: |
- SBREG->composeFrom(SI, TI, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_TOPRIGHT: |
- SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_BOTTOMLEFT: |
- SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_BOTTOMRIGHT: |
- SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP); |
- break; |
- } |
- } else { |
- switch(REFCORNER) { |
- case JBIG2_CORNER_TOPLEFT: |
- SBREG->composeFrom(TI, SI, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_TOPRIGHT: |
- SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_BOTTOMLEFT: |
- SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP); |
- break; |
- case JBIG2_CORNER_BOTTOMRIGHT: |
- SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP); |
- break; |
- } |
- } |
- if(RI != 0) { |
- delete IBI; |
- } |
- if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) |
- || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { |
- CURS = CURS + WI - 1; |
- } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) |
- || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) { |
- CURS = CURS + HI - 1; |
- } |
- NINSTANCES = NINSTANCES + 1; |
+ } |
+ if (RI == 0) { |
+ IBI = SBSYMS[IDI]; |
+ } else { |
+ if ((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0) || |
+ (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0) || |
+ (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) || |
+ (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0) || |
+ (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (huffman): too short."); |
+ goto failed; |
} |
+ pStream->alignByte(); |
+ nTmp = pStream->getOffset(); |
+ IBOI = SBSYMS[IDI]; |
+ if (!IBOI) { |
+ goto failed; |
+ } |
+ WOI = IBOI->m_nWidth; |
+ HOI = IBOI->m_nHeight; |
+ if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (huffman): Invalid RDWI or RDHI " |
+ "value."); |
+ goto failed; |
+ } |
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
+ pGRRD->GRW = WOI + RDWI; |
+ pGRRD->GRH = HOI + RDHI; |
+ pGRRD->GRTEMPLATE = SBRTEMPLATE; |
+ pGRRD->GRREFERENCE = IBOI; |
+ pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI; |
+ pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI; |
+ pGRRD->TPGRON = 0; |
+ pGRRD->GRAT[0] = SBRAT[0]; |
+ pGRRD->GRAT[1] = SBRAT[1]; |
+ pGRRD->GRAT[2] = SBRAT[2]; |
+ pGRRD->GRAT[3] = SBRAT[3]; |
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream)); |
+ IBI = pGRRD->decode(pArithDecoder, grContext); |
+ if (IBI == NULL) { |
+ delete pGRRD; |
+ delete pArithDecoder; |
+ goto failed; |
+ } |
+ delete pArithDecoder; |
+ pStream->alignByte(); |
+ pStream->offset(2); |
+ if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { |
+ delete IBI; |
+ delete pGRRD; |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (huffman):" |
+ "bytes processed by generic refinement region decoding procedure " |
+ "doesn't equal SBHUFFRSIZE."); |
+ goto failed; |
+ } |
+ delete pGRRD; |
+ } |
+ if (!IBI) { |
+ continue; |
+ } |
+ WI = IBI->m_nWidth; |
+ HI = IBI->m_nHeight; |
+ if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) || |
+ (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
+ CURS = CURS + WI - 1; |
+ } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) || |
+ (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
+ CURS = CURS + HI - 1; |
+ } |
+ SI = CURS; |
+ if (TRANSPOSED == 0) { |
+ switch (REFCORNER) { |
+ case JBIG2_CORNER_TOPLEFT: |
+ SBREG->composeFrom(SI, TI, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_TOPRIGHT: |
+ SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_BOTTOMLEFT: |
+ SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_BOTTOMRIGHT: |
+ SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP); |
+ break; |
+ } |
+ } else { |
+ switch (REFCORNER) { |
+ case JBIG2_CORNER_TOPLEFT: |
+ SBREG->composeFrom(TI, SI, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_TOPRIGHT: |
+ SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_BOTTOMLEFT: |
+ SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_BOTTOMRIGHT: |
+ SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP); |
+ break; |
+ } |
+ } |
+ if (RI != 0) { |
+ delete IBI; |
+ } |
+ if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || |
+ (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { |
+ CURS = CURS + WI - 1; |
+ } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || |
+ (REFCORNER == JBIG2_CORNER_TOPRIGHT))) { |
+ CURS = CURS + HI - 1; |
+ } |
+ NINSTANCES = NINSTANCES + 1; |
} |
- if(bRetained == FALSE) { |
- delete IADT; |
- delete IAFS; |
- delete IADS; |
- delete IAIT; |
- delete IARI; |
- delete IARDW; |
- delete IARDH; |
- delete IARDX; |
- delete IARDY; |
- delete IAID; |
- } |
- return SBREG; |
+ } |
+ delete pHuffmanDecoder; |
+ return SBREG; |
failed: |
- if(bRetained == FALSE) { |
- delete IADT; |
- delete IAFS; |
- delete IADS; |
- delete IAIT; |
- delete IARI; |
- delete IARDW; |
- delete IARDH; |
- delete IARDX; |
- delete IARDY; |
- delete IAID; |
- } |
- delete SBREG; |
- return NULL; |
+ delete pHuffmanDecoder; |
+ delete SBREG; |
+ return NULL; |
} |
-CJBig2_SymbolDict *CJBig2_SDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, |
- JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext) |
-{ |
- CJBig2_Image **SDNEWSYMS; |
- FX_DWORD HCHEIGHT, NSYMSDECODED; |
- int32_t HCDH; |
- FX_DWORD SYMWIDTH, TOTWIDTH; |
- int32_t DW; |
- CJBig2_Image *BS; |
- FX_DWORD I, J, REFAGGNINST; |
- FX_BOOL *EXFLAGS; |
- FX_DWORD EXINDEX; |
- FX_BOOL CUREXFLAG; |
- FX_DWORD EXRUNLENGTH; |
- int32_t nVal; |
- FX_DWORD nTmp; |
- FX_DWORD SBNUMSYMS; |
- uint8_t SBSYMCODELEN; |
- FX_DWORD IDI; |
- int32_t RDXI, RDYI; |
- CJBig2_Image **SBSYMS; |
- CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY, |
- *SBHUFFRSIZE; |
- CJBig2_GRRDProc *pGRRD; |
- CJBig2_GRDProc *pGRD; |
- CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX, |
- *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH; |
- CJBig2_ArithIaidDecoder *IAID; |
- CJBig2_SymbolDict *pDict; |
- JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder()); |
- JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder()); |
+CJBig2_Image* CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* grContext, |
+ JBig2IntDecoderState* pIDS) { |
+ int32_t STRIPT, FIRSTS; |
+ FX_DWORD NINSTANCES; |
+ int32_t DT, DFS, CURS; |
+ int32_t CURT; |
+ int32_t SI, TI; |
+ FX_DWORD IDI; |
+ CJBig2_Image* IBI; |
+ FX_DWORD WI, HI; |
+ int32_t IDS; |
+ int RI; |
+ int32_t RDWI, RDHI, RDXI, RDYI; |
+ CJBig2_Image* IBOI; |
+ FX_DWORD WOI, HOI; |
+ CJBig2_Image* SBREG; |
+ FX_BOOL bFirst; |
+ int32_t nRet, nVal; |
+ int32_t bRetained; |
+ CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, |
+ *IARDX, *IARDY; |
+ CJBig2_ArithIaidDecoder* IAID; |
+ CJBig2_GRRDProc* pGRRD; |
+ if (pIDS) { |
+ IADT = pIDS->IADT; |
+ IAFS = pIDS->IAFS; |
+ IADS = pIDS->IADS; |
+ IAIT = pIDS->IAIT; |
+ IARI = pIDS->IARI; |
+ IARDW = pIDS->IARDW; |
+ IARDH = pIDS->IARDH; |
+ IARDX = pIDS->IARDX; |
+ IARDY = pIDS->IARDY; |
+ IAID = pIDS->IAID; |
+ bRetained = TRUE; |
+ } else { |
JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder()); |
JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder()); |
JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder()); |
@@ -2370,269 +2278,186 @@ CJBig2_SymbolDict *CJBig2_SDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecod |
JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder()); |
JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder()); |
JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder()); |
- nTmp = 0; |
- while((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { |
- nTmp ++; |
+ JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder(SBSYMCODELEN)); |
+ bRetained = FALSE; |
+ } |
+ JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH)); |
+ SBREG->fill(SBDEFPIXEL); |
+ if (IADT->decode(pArithDecoder, &STRIPT) == -1) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (arith): too short."); |
+ goto failed; |
+ } |
+ STRIPT *= SBSTRIPS; |
+ STRIPT = -STRIPT; |
+ FIRSTS = 0; |
+ NINSTANCES = 0; |
+ while (NINSTANCES < SBNUMINSTANCES) { |
+ if (IADT->decode(pArithDecoder, &DT) == -1) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (arith): too short."); |
+ goto failed; |
} |
- JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((uint8_t)nTmp)); |
- SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*)); |
- FXSYS_memset(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
- HCHEIGHT = 0; |
- NSYMSDECODED = 0; |
- while(NSYMSDECODED < SDNUMNEWSYMS) { |
- BS = NULL; |
- if(IADH->decode(pArithDecoder, &HCDH) == -1) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short."); |
- goto failed; |
+ DT *= SBSTRIPS; |
+ STRIPT = STRIPT + DT; |
+ bFirst = TRUE; |
+ for (;;) { |
+ if (bFirst) { |
+ if (IAFS->decode(pArithDecoder, &DFS) == -1) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (arith): too short."); |
+ goto failed; |
} |
- HCHEIGHT = HCHEIGHT + HCDH; |
- if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid HCHEIGHT value."); |
- goto failed; |
+ FIRSTS = FIRSTS + DFS; |
+ CURS = FIRSTS; |
+ bFirst = FALSE; |
+ } else { |
+ nRet = IADS->decode(pArithDecoder, &IDS); |
+ if (nRet == JBIG2_OOB) { |
+ break; |
+ } else if (nRet != 0) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (arith): too short."); |
+ goto failed; |
+ } else { |
+ CURS = CURS + IDS + SBDSOFFSET; |
} |
- SYMWIDTH = 0; |
- TOTWIDTH = 0; |
- for(;;) { |
- nVal = IADW->decode(pArithDecoder, &DW); |
- if(nVal == JBIG2_OOB) { |
- break; |
- } else if(nVal != 0) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short."); |
- goto failed; |
- } else { |
- if (NSYMSDECODED >= SDNUMNEWSYMS) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): NSYMSDECODED >= SDNUMNEWSYMS."); |
- goto failed; |
- } |
- SYMWIDTH = SYMWIDTH + DW; |
- if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid SYMWIDTH value."); |
- goto failed; |
- } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { |
- TOTWIDTH = TOTWIDTH + SYMWIDTH; |
- SDNEWSYMS[NSYMSDECODED] = NULL; |
- NSYMSDECODED = NSYMSDECODED + 1; |
- continue; |
- } |
- TOTWIDTH = TOTWIDTH + SYMWIDTH; |
- } |
- if(SDREFAGG == 0) { |
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
- pGRD->MMR = 0; |
- pGRD->GBW = SYMWIDTH; |
- pGRD->GBH = HCHEIGHT; |
- pGRD->GBTEMPLATE = SDTEMPLATE; |
- pGRD->TPGDON = 0; |
- pGRD->USESKIP = 0; |
- pGRD->GBAT[0] = SDAT[0]; |
- pGRD->GBAT[1] = SDAT[1]; |
- pGRD->GBAT[2] = SDAT[2]; |
- pGRD->GBAT[3] = SDAT[3]; |
- pGRD->GBAT[4] = SDAT[4]; |
- pGRD->GBAT[5] = SDAT[5]; |
- pGRD->GBAT[6] = SDAT[6]; |
- pGRD->GBAT[7] = SDAT[7]; |
- BS = pGRD->decode_Arith(pArithDecoder, gbContext); |
- if(BS == NULL) { |
- delete pGRD; |
- goto failed; |
- } |
- delete pGRD; |
- } else { |
- if(IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short."); |
- goto failed; |
- } |
- if(REFAGGNINST > 1) { |
- CJBig2_TRDProc *pDecoder; |
- JBIG2_ALLOC(pDecoder, CJBig2_TRDProc()); |
- pDecoder->SBHUFF = SDHUFF; |
- pDecoder->SBREFINE = 1; |
- pDecoder->SBW = SYMWIDTH; |
- pDecoder->SBH = HCHEIGHT; |
- pDecoder->SBNUMINSTANCES = REFAGGNINST; |
- pDecoder->SBSTRIPS = 1; |
- pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
- SBNUMSYMS = pDecoder->SBNUMSYMS; |
- nTmp = 0; |
- while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
- nTmp ++; |
- } |
- SBSYMCODELEN = (uint8_t)nTmp; |
- pDecoder->SBSYMCODELEN = SBSYMCODELEN; |
- SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*)); |
- JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
- JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*)); |
- pDecoder->SBSYMS = SBSYMS; |
- pDecoder->SBDEFPIXEL = 0; |
- pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
- pDecoder->TRANSPOSED = 0; |
- pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
- pDecoder->SBDSOFFSET = 0; |
- JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6, |
- sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6)); |
- JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8, |
- sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8)); |
- JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11, |
- sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11)); |
- JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1, |
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1)); |
- pDecoder->SBHUFFFS = SBHUFFFS; |
- pDecoder->SBHUFFDS = SBHUFFDS; |
- pDecoder->SBHUFFDT = SBHUFFDT; |
- pDecoder->SBHUFFRDW = SBHUFFRDW; |
- pDecoder->SBHUFFRDH = SBHUFFRDH; |
- pDecoder->SBHUFFRDX = SBHUFFRDX; |
- pDecoder->SBHUFFRDY = SBHUFFRDY; |
- pDecoder->SBHUFFRSIZE = SBHUFFRSIZE; |
- pDecoder->SBRTEMPLATE = SDRTEMPLATE; |
- pDecoder->SBRAT[0] = SDRAT[0]; |
- pDecoder->SBRAT[1] = SDRAT[1]; |
- pDecoder->SBRAT[2] = SDRAT[2]; |
- pDecoder->SBRAT[3] = SDRAT[3]; |
- JBig2IntDecoderState ids; |
- ids.IADT = IADT; |
- ids.IAFS = IAFS; |
- ids.IADS = IADS; |
- ids.IAIT = IAIT; |
- ids.IARI = IARI; |
- ids.IARDW = IARDW; |
- ids.IARDH = IARDH; |
- ids.IARDX = IARDX; |
- ids.IARDY = IARDY; |
- ids.IAID = IAID; |
- BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids); |
- if(BS == NULL) { |
- m_pModule->JBig2_Free(SBSYMS); |
- delete SBHUFFFS; |
- delete SBHUFFDS; |
- delete SBHUFFDT; |
- delete SBHUFFRDW; |
- delete SBHUFFRDH; |
- delete SBHUFFRDX; |
- delete SBHUFFRDY; |
- delete SBHUFFRSIZE; |
- delete pDecoder; |
- goto failed; |
- } |
- m_pModule->JBig2_Free(SBSYMS); |
- delete SBHUFFFS; |
- delete SBHUFFDS; |
- delete SBHUFFDT; |
- delete SBHUFFRDW; |
- delete SBHUFFRDH; |
- delete SBHUFFRDX; |
- delete SBHUFFRDY; |
- delete SBHUFFRSIZE; |
- delete pDecoder; |
- } else if(REFAGGNINST == 1) { |
- SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
- if(IAID->decode(pArithDecoder, (int*)&IDI) == -1) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short."); |
- goto failed; |
- } |
- if((IARDX->decode(pArithDecoder, &RDXI) == -1) |
- || (IARDY->decode(pArithDecoder, &RDYI) == -1)) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short."); |
- goto failed; |
- } |
- if (IDI >= SBNUMSYMS) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith):" |
- " refinement references unknown symbol %d", IDI); |
- goto failed; |
- } |
- SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*)); |
- JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
- JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*)); |
- if (!SBSYMS[IDI]) { |
- m_pModule->JBig2_Free(SBSYMS); |
- goto failed; |
- } |
- JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
- pGRRD->GRW = SYMWIDTH; |
- pGRRD->GRH = HCHEIGHT; |
- pGRRD->GRTEMPLATE = SDRTEMPLATE; |
- pGRRD->GRREFERENCE = SBSYMS[IDI]; |
- pGRRD->GRREFERENCEDX = RDXI; |
- pGRRD->GRREFERENCEDY = RDYI; |
- pGRRD->TPGRON = 0; |
- pGRRD->GRAT[0] = SDRAT[0]; |
- pGRRD->GRAT[1] = SDRAT[1]; |
- pGRRD->GRAT[2] = SDRAT[2]; |
- pGRRD->GRAT[3] = SDRAT[3]; |
- BS = pGRRD->decode(pArithDecoder, grContext); |
- if(BS == NULL) { |
- m_pModule->JBig2_Free(SBSYMS); |
- delete pGRRD; |
- goto failed; |
- } |
- m_pModule->JBig2_Free(SBSYMS); |
- delete pGRRD; |
- } |
- } |
- SDNEWSYMS[NSYMSDECODED] = BS; |
- BS = NULL; |
- NSYMSDECODED = NSYMSDECODED + 1; |
+ } |
+ if (NINSTANCES >= SBNUMINSTANCES) { |
+ break; |
+ } |
+ if (SBSTRIPS == 1) { |
+ CURT = 0; |
+ } else { |
+ if (IAIT->decode(pArithDecoder, &nVal) == -1) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (arith): too short."); |
+ goto failed; |
} |
- } |
- EXINDEX = 0; |
- CUREXFLAG = 0; |
- EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS)); |
- while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { |
- if(IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) { |
- m_pModule->JBig2_Free(EXFLAGS); |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short."); |
- goto failed; |
+ CURT = nVal; |
+ } |
+ TI = STRIPT + CURT; |
+ if (IAID->decode(pArithDecoder, &nVal) == -1) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (arith): too short."); |
+ goto failed; |
+ } |
+ IDI = nVal; |
+ if (IDI >= SBNUMSYMS) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (arith): symbol id out of " |
+ "range.(%d/%d)", |
+ IDI, SBNUMSYMS); |
+ goto failed; |
+ } |
+ if (SBREFINE == 0) { |
+ RI = 0; |
+ } else { |
+ if (IARI->decode(pArithDecoder, &RI) == -1) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (arith): too short."); |
+ goto failed; |
} |
- if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { |
- m_pModule->JBig2_Free(EXFLAGS); |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value."); |
- goto failed; |
+ } |
+ if (!SBSYMS[IDI]) { |
+ goto failed; |
+ } |
+ if (RI == 0) { |
+ IBI = SBSYMS[IDI]; |
+ } else { |
+ if ((IARDW->decode(pArithDecoder, &RDWI) == -1) || |
+ (IARDH->decode(pArithDecoder, &RDHI) == -1) || |
+ (IARDX->decode(pArithDecoder, &RDXI) == -1) || |
+ (IARDY->decode(pArithDecoder, &RDYI) == -1)) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (arith): too short."); |
+ goto failed; |
} |
- if(EXRUNLENGTH != 0) { |
- for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { |
- EXFLAGS[I] = CUREXFLAG; |
- } |
+ IBOI = SBSYMS[IDI]; |
+ WOI = IBOI->m_nWidth; |
+ HOI = IBOI->m_nHeight; |
+ if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) { |
+ m_pModule->JBig2_Error( |
+ "text region decoding procedure (arith): Invalid RDWI or RDHI " |
+ "value."); |
+ goto failed; |
} |
- EXINDEX = EXINDEX + EXRUNLENGTH; |
- CUREXFLAG = !CUREXFLAG; |
- } |
- JBIG2_ALLOC(pDict, CJBig2_SymbolDict()); |
- pDict->SDNUMEXSYMS = SDNUMEXSYMS; |
- pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS); |
- I = J = 0; |
- for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { |
- if(EXFLAGS[I] && J < SDNUMEXSYMS) { |
- if(I < SDNUMINSYMS) { |
- JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I])); |
- } else { |
- pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS]; |
- } |
- J = J + 1; |
- } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { |
- delete SDNEWSYMS[I - SDNUMINSYMS]; |
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
+ pGRRD->GRW = WOI + RDWI; |
+ pGRRD->GRH = HOI + RDHI; |
+ pGRRD->GRTEMPLATE = SBRTEMPLATE; |
+ pGRRD->GRREFERENCE = IBOI; |
+ pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI; |
+ pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI; |
+ pGRRD->TPGRON = 0; |
+ pGRRD->GRAT[0] = SBRAT[0]; |
+ pGRRD->GRAT[1] = SBRAT[1]; |
+ pGRRD->GRAT[2] = SBRAT[2]; |
+ pGRRD->GRAT[3] = SBRAT[3]; |
+ IBI = pGRRD->decode(pArithDecoder, grContext); |
+ if (IBI == NULL) { |
+ delete pGRRD; |
+ goto failed; |
} |
+ delete pGRRD; |
+ } |
+ WI = IBI->m_nWidth; |
+ HI = IBI->m_nHeight; |
+ if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) || |
+ (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
+ CURS = CURS + WI - 1; |
+ } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) || |
+ (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { |
+ CURS = CURS + HI - 1; |
+ } |
+ SI = CURS; |
+ if (TRANSPOSED == 0) { |
+ switch (REFCORNER) { |
+ case JBIG2_CORNER_TOPLEFT: |
+ SBREG->composeFrom(SI, TI, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_TOPRIGHT: |
+ SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_BOTTOMLEFT: |
+ SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_BOTTOMRIGHT: |
+ SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP); |
+ break; |
+ } |
+ } else { |
+ switch (REFCORNER) { |
+ case JBIG2_CORNER_TOPLEFT: |
+ SBREG->composeFrom(TI, SI, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_TOPRIGHT: |
+ SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_BOTTOMLEFT: |
+ SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP); |
+ break; |
+ case JBIG2_CORNER_BOTTOMRIGHT: |
+ SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP); |
+ break; |
+ } |
+ } |
+ if (RI != 0) { |
+ delete IBI; |
+ } |
+ if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || |
+ (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { |
+ CURS = CURS + WI - 1; |
+ } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || |
+ (REFCORNER == JBIG2_CORNER_TOPRIGHT))) { |
+ CURS = CURS + HI - 1; |
+ } |
+ NINSTANCES = NINSTANCES + 1; |
} |
- if (J < SDNUMEXSYMS) { |
- pDict->SDNUMEXSYMS = J; |
- } |
- m_pModule->JBig2_Free(EXFLAGS); |
- m_pModule->JBig2_Free(SDNEWSYMS); |
- delete IADH; |
- delete IADW; |
- delete IAAI; |
- delete IARDX; |
- delete IARDY; |
- delete IAEX; |
- delete IAID; |
+ } |
+ if (bRetained == FALSE) { |
delete IADT; |
delete IAFS; |
delete IADS; |
@@ -2640,22 +2465,13 @@ CJBig2_SymbolDict *CJBig2_SDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecod |
delete IARI; |
delete IARDW; |
delete IARDH; |
- return pDict; |
-failed: |
- for(I = 0; I < NSYMSDECODED; I++) { |
- if (SDNEWSYMS[I]) { |
- delete SDNEWSYMS[I]; |
- SDNEWSYMS[I] = NULL; |
- } |
- } |
- m_pModule->JBig2_Free(SDNEWSYMS); |
- delete IADH; |
- delete IADW; |
- delete IAAI; |
delete IARDX; |
delete IARDY; |
- delete IAEX; |
delete IAID; |
+ } |
+ return SBREG; |
+failed: |
+ if (bRetained == FALSE) { |
delete IADT; |
delete IAFS; |
delete IADS; |
@@ -2663,1669 +2479,2184 @@ failed: |
delete IARI; |
delete IARDW; |
delete IARDH; |
- return NULL; |
+ delete IARDX; |
+ delete IARDY; |
+ delete IAID; |
+ } |
+ delete SBREG; |
+ return NULL; |
} |
-CJBig2_SymbolDict *CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream *pStream, |
- JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause) |
-{ |
- CJBig2_Image **SDNEWSYMS; |
- FX_DWORD *SDNEWSYMWIDTHS; |
- FX_DWORD HCHEIGHT, NSYMSDECODED; |
- int32_t HCDH; |
- FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM; |
- int32_t DW; |
- CJBig2_Image *BS, *BHC; |
- FX_DWORD I, J, REFAGGNINST; |
- FX_BOOL *EXFLAGS; |
- FX_DWORD EXINDEX; |
- FX_BOOL CUREXFLAG; |
- FX_DWORD EXRUNLENGTH; |
- int32_t nVal, nBits; |
- FX_DWORD nTmp; |
- FX_DWORD SBNUMSYMS; |
- uint8_t SBSYMCODELEN; |
- JBig2HuffmanCode *SBSYMCODES; |
- FX_DWORD IDI; |
- int32_t RDXI, RDYI; |
- FX_DWORD BMSIZE; |
- FX_DWORD stride; |
- CJBig2_Image **SBSYMS; |
- CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY, |
- *SBHUFFRSIZE, *pTable; |
- CJBig2_HuffmanDecoder *pHuffmanDecoder; |
- CJBig2_GRRDProc *pGRRD; |
- CJBig2_ArithDecoder *pArithDecoder; |
- CJBig2_GRDProc *pGRD; |
- CJBig2_SymbolDict *pDict; |
- JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream)); |
- SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*)); |
- FXSYS_memset(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
- SDNEWSYMWIDTHS = NULL; |
- BHC = NULL; |
- if(SDREFAGG == 0) { |
- SDNEWSYMWIDTHS = (FX_DWORD *)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(FX_DWORD)); |
- FXSYS_memset(SDNEWSYMWIDTHS, 0 , SDNUMNEWSYMS * sizeof(FX_DWORD)); |
- } |
- HCHEIGHT = 0; |
- NSYMSDECODED = 0; |
+CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ JBig2ArithCtx* grContext) { |
+ CJBig2_Image** SDNEWSYMS; |
+ FX_DWORD HCHEIGHT, NSYMSDECODED; |
+ int32_t HCDH; |
+ FX_DWORD SYMWIDTH, TOTWIDTH; |
+ int32_t DW; |
+ CJBig2_Image* BS; |
+ FX_DWORD I, J, REFAGGNINST; |
+ FX_BOOL* EXFLAGS; |
+ FX_DWORD EXINDEX; |
+ FX_BOOL CUREXFLAG; |
+ FX_DWORD EXRUNLENGTH; |
+ int32_t nVal; |
+ FX_DWORD nTmp; |
+ FX_DWORD SBNUMSYMS; |
+ uint8_t SBSYMCODELEN; |
+ FX_DWORD IDI; |
+ int32_t RDXI, RDYI; |
+ CJBig2_Image** SBSYMS; |
+ CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, |
+ *SBHUFFRDX, *SBHUFFRDY, *SBHUFFRSIZE; |
+ CJBig2_GRRDProc* pGRRD; |
+ CJBig2_GRDProc* pGRD; |
+ CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX, *IADT, |
+ *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH; |
+ CJBig2_ArithIaidDecoder* IAID; |
+ CJBig2_SymbolDict* pDict; |
+ JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder()); |
+ JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder()); |
+ nTmp = 0; |
+ while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { |
+ nTmp++; |
+ } |
+ JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((uint8_t)nTmp)); |
+ SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, |
+ sizeof(CJBig2_Image*)); |
+ FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
+ HCHEIGHT = 0; |
+ NSYMSDECODED = 0; |
+ while (NSYMSDECODED < SDNUMNEWSYMS) { |
BS = NULL; |
- while(NSYMSDECODED < SDNUMNEWSYMS) { |
- if(pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short."); |
- goto failed; |
+ if (IADH->decode(pArithDecoder, &HCDH) == -1) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): too short."); |
+ goto failed; |
+ } |
+ HCHEIGHT = HCHEIGHT + HCDH; |
+ if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): invalid HCHEIGHT " |
+ "value."); |
+ goto failed; |
+ } |
+ SYMWIDTH = 0; |
+ TOTWIDTH = 0; |
+ for (;;) { |
+ nVal = IADW->decode(pArithDecoder, &DW); |
+ if (nVal == JBIG2_OOB) { |
+ break; |
+ } else if (nVal != 0) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): too short."); |
+ goto failed; |
+ } else { |
+ if (NSYMSDECODED >= SDNUMNEWSYMS) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): NSYMSDECODED >= " |
+ "SDNUMNEWSYMS."); |
+ goto failed; |
} |
- HCHEIGHT = HCHEIGHT + HCDH; |
- if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid HCHEIGHT value."); |
- goto failed; |
+ SYMWIDTH = SYMWIDTH + DW; |
+ if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): invalid SYMWIDTH " |
+ "value."); |
+ goto failed; |
+ } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { |
+ TOTWIDTH = TOTWIDTH + SYMWIDTH; |
+ SDNEWSYMS[NSYMSDECODED] = NULL; |
+ NSYMSDECODED = NSYMSDECODED + 1; |
+ continue; |
} |
- SYMWIDTH = 0; |
- TOTWIDTH = 0; |
- HCFIRSTSYM = NSYMSDECODED; |
- for(;;) { |
- nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW); |
- if(nVal == JBIG2_OOB) { |
- break; |
- } else if(nVal != 0) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short."); |
- goto failed; |
- } else { |
- if (NSYMSDECODED >= SDNUMNEWSYMS) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): NSYMSDECODED >= SDNUMNEWSYMS."); |
- goto failed; |
- } |
- SYMWIDTH = SYMWIDTH + DW; |
- if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid SYMWIDTH value."); |
- goto failed; |
- } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { |
- TOTWIDTH = TOTWIDTH + SYMWIDTH; |
- SDNEWSYMS[NSYMSDECODED] = NULL; |
- NSYMSDECODED = NSYMSDECODED + 1; |
- continue; |
- } |
- TOTWIDTH = TOTWIDTH + SYMWIDTH; |
- } |
- if(SDREFAGG == 1) { |
- if(pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != 0) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- BS = NULL; |
- if(REFAGGNINST > 1) { |
- CJBig2_TRDProc *pDecoder; |
- JBIG2_ALLOC(pDecoder, CJBig2_TRDProc()); |
- pDecoder->SBHUFF = SDHUFF; |
- pDecoder->SBREFINE = 1; |
- pDecoder->SBW = SYMWIDTH; |
- pDecoder->SBH = HCHEIGHT; |
- pDecoder->SBNUMINSTANCES = REFAGGNINST; |
- pDecoder->SBSTRIPS = 1; |
- pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
- SBNUMSYMS = pDecoder->SBNUMSYMS; |
- SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode)); |
- nTmp = 1; |
- while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
- nTmp ++; |
- } |
- for(I = 0; I < SBNUMSYMS; I++) { |
- SBSYMCODES[I].codelen = nTmp; |
- SBSYMCODES[I].code = I; |
- } |
- pDecoder->SBSYMCODES = SBSYMCODES; |
- SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*)); |
- JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
- JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*)); |
- pDecoder->SBSYMS = SBSYMS; |
- pDecoder->SBDEFPIXEL = 0; |
- pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
- pDecoder->TRANSPOSED = 0; |
- pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
- pDecoder->SBDSOFFSET = 0; |
- JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6, |
- sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6)); |
- JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8, |
- sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8)); |
- JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11, |
- sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11)); |
- JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1, |
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1)); |
- pDecoder->SBHUFFFS = SBHUFFFS; |
- pDecoder->SBHUFFDS = SBHUFFDS; |
- pDecoder->SBHUFFDT = SBHUFFDT; |
- pDecoder->SBHUFFRDW = SBHUFFRDW; |
- pDecoder->SBHUFFRDH = SBHUFFRDH; |
- pDecoder->SBHUFFRDX = SBHUFFRDX; |
- pDecoder->SBHUFFRDY = SBHUFFRDY; |
- pDecoder->SBHUFFRSIZE = SBHUFFRSIZE; |
- pDecoder->SBRTEMPLATE = SDRTEMPLATE; |
- pDecoder->SBRAT[0] = SDRAT[0]; |
- pDecoder->SBRAT[1] = SDRAT[1]; |
- pDecoder->SBRAT[2] = SDRAT[2]; |
- pDecoder->SBRAT[3] = SDRAT[3]; |
- BS = pDecoder->decode_Huffman(pStream, grContext); |
- if(BS == NULL) { |
- m_pModule->JBig2_Free(SBSYMCODES); |
- m_pModule->JBig2_Free(SBSYMS); |
- delete SBHUFFFS; |
- delete SBHUFFDS; |
- delete SBHUFFDT; |
- delete SBHUFFRDW; |
- delete SBHUFFRDH; |
- delete SBHUFFRDX; |
- delete SBHUFFRDY; |
- delete SBHUFFRSIZE; |
- delete pDecoder; |
- goto failed; |
- } |
- m_pModule->JBig2_Free(SBSYMCODES); |
- m_pModule->JBig2_Free(SBSYMS); |
- delete SBHUFFFS; |
- delete SBHUFFDS; |
- delete SBHUFFDT; |
- delete SBHUFFRDW; |
- delete SBHUFFRDH; |
- delete SBHUFFRDX; |
- delete SBHUFFRDY; |
- delete SBHUFFRSIZE; |
- delete pDecoder; |
- } else if(REFAGGNINST == 1) { |
- SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS; |
- nTmp = 1; |
- while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
- nTmp ++; |
- } |
- SBSYMCODELEN = (uint8_t)nTmp; |
- SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode)); |
- for(I = 0; I < SBNUMSYMS; I++) { |
- SBSYMCODES[I].codelen = SBSYMCODELEN; |
- SBSYMCODES[I].code = I; |
- } |
- nVal = 0; |
- nBits = 0; |
- for(;;) { |
- if(pStream->read1Bit(&nTmp) != 0) { |
- m_pModule->JBig2_Free(SBSYMCODES); |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- nVal = (nVal << 1) | nTmp; |
- for(IDI = 0; IDI < SBNUMSYMS; IDI++) { |
- if((nVal == SBSYMCODES[IDI].code) |
- && (nBits == SBSYMCODES[IDI].codelen)) { |
- break; |
- } |
- } |
- if(IDI < SBNUMSYMS) { |
- break; |
- } |
- } |
- m_pModule->JBig2_Free(SBSYMCODES); |
- JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, |
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15)); |
- JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1, |
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1)); |
- if((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) |
- || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0) |
- || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) { |
- delete SBHUFFRDX; |
- delete SBHUFFRSIZE; |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- delete SBHUFFRDX; |
- delete SBHUFFRSIZE; |
- pStream->alignByte(); |
- nTmp = pStream->getOffset(); |
- SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*)); |
- JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
- JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*)); |
- JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
- pGRRD->GRW = SYMWIDTH; |
- pGRRD->GRH = HCHEIGHT; |
- pGRRD->GRTEMPLATE = SDRTEMPLATE; |
- pGRRD->GRREFERENCE = SBSYMS[IDI]; |
- pGRRD->GRREFERENCEDX = RDXI; |
- pGRRD->GRREFERENCEDY = RDYI; |
- pGRRD->TPGRON = 0; |
- pGRRD->GRAT[0] = SDRAT[0]; |
- pGRRD->GRAT[1] = SDRAT[1]; |
- pGRRD->GRAT[2] = SDRAT[2]; |
- pGRRD->GRAT[3] = SDRAT[3]; |
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream)); |
- BS = pGRRD->decode(pArithDecoder, grContext); |
- if(BS == NULL) { |
- m_pModule->JBig2_Free(SBSYMS); |
- delete pGRRD; |
- delete pArithDecoder; |
- goto failed; |
- } |
- pStream->alignByte(); |
- pStream->offset(2); |
- if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { |
- delete BS; |
- m_pModule->JBig2_Free(SBSYMS); |
- delete pGRRD; |
- delete pArithDecoder; |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman):" |
- "bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE."); |
- goto failed; |
- } |
- m_pModule->JBig2_Free(SBSYMS); |
- delete pGRRD; |
- delete pArithDecoder; |
- } |
- SDNEWSYMS[NSYMSDECODED] = BS; |
- } |
- if(SDREFAGG == 0) { |
- SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH; |
- } |
- NSYMSDECODED = NSYMSDECODED + 1; |
+ TOTWIDTH = TOTWIDTH + SYMWIDTH; |
+ } |
+ if (SDREFAGG == 0) { |
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
+ pGRD->MMR = 0; |
+ pGRD->GBW = SYMWIDTH; |
+ pGRD->GBH = HCHEIGHT; |
+ pGRD->GBTEMPLATE = SDTEMPLATE; |
+ pGRD->TPGDON = 0; |
+ pGRD->USESKIP = 0; |
+ pGRD->GBAT[0] = SDAT[0]; |
+ pGRD->GBAT[1] = SDAT[1]; |
+ pGRD->GBAT[2] = SDAT[2]; |
+ pGRD->GBAT[3] = SDAT[3]; |
+ pGRD->GBAT[4] = SDAT[4]; |
+ pGRD->GBAT[5] = SDAT[5]; |
+ pGRD->GBAT[6] = SDAT[6]; |
+ pGRD->GBAT[7] = SDAT[7]; |
+ BS = pGRD->decode_Arith(pArithDecoder, gbContext); |
+ if (BS == NULL) { |
+ delete pGRD; |
+ goto failed; |
} |
- if(SDREFAGG == 0) { |
- if(pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (int32_t*)&BMSIZE) != 0) { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- pStream->alignByte(); |
- if(BMSIZE == 0) { |
- stride = (TOTWIDTH + 7) >> 3; |
- if(pStream->getByteLeft() >= stride * HCHEIGHT) { |
- JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT)); |
- for(I = 0; I < HCHEIGHT; I ++) { |
- JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, pStream->getPointer(), stride); |
- pStream->offset(stride); |
- } |
- } else { |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short."); |
- goto failed; |
- } |
- } else { |
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
- pGRD->MMR = 1; |
- pGRD->GBW = TOTWIDTH; |
- pGRD->GBH = HCHEIGHT; |
- FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream); |
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- pGRD->Continue_decode(pPause); |
- } |
- delete pGRD; |
- pStream->alignByte(); |
- } |
- nTmp = 0; |
- if (!BHC) { |
- continue; |
- } |
- for(I = HCFIRSTSYM; I < NSYMSDECODED; I++) { |
- SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT); |
- nTmp += SDNEWSYMWIDTHS[I]; |
- } |
- delete BHC; |
- BHC = NULL; |
+ delete pGRD; |
+ } else { |
+ if (IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): too short."); |
+ goto failed; |
} |
- } |
- EXINDEX = 0; |
- CUREXFLAG = 0; |
- JBIG2_ALLOC(pTable, CJBig2_HuffmanTable(HuffmanTable_B1, |
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1)); |
- EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS)); |
- while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { |
- if(pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) { |
- delete pTable; |
- m_pModule->JBig2_Free(EXFLAGS); |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short."); |
+ if (REFAGGNINST > 1) { |
+ CJBig2_TRDProc* pDecoder; |
+ JBIG2_ALLOC(pDecoder, CJBig2_TRDProc()); |
+ pDecoder->SBHUFF = SDHUFF; |
+ pDecoder->SBREFINE = 1; |
+ pDecoder->SBW = SYMWIDTH; |
+ pDecoder->SBH = HCHEIGHT; |
+ pDecoder->SBNUMINSTANCES = REFAGGNINST; |
+ pDecoder->SBSTRIPS = 1; |
+ pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
+ SBNUMSYMS = pDecoder->SBNUMSYMS; |
+ nTmp = 0; |
+ while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
+ nTmp++; |
+ } |
+ SBSYMCODELEN = (uint8_t)nTmp; |
+ pDecoder->SBSYMCODELEN = SBSYMCODELEN; |
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
+ SBNUMSYMS, sizeof(CJBig2_Image*)); |
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
+ NSYMSDECODED * sizeof(CJBig2_Image*)); |
+ pDecoder->SBSYMS = SBSYMS; |
+ pDecoder->SBDEFPIXEL = 0; |
+ pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
+ pDecoder->TRANSPOSED = 0; |
+ pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
+ pDecoder->SBDSOFFSET = 0; |
+ JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6, |
+ sizeof(HuffmanTable_B6) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B6)); |
+ JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8, |
+ sizeof(HuffmanTable_B8) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B8)); |
+ JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11, |
+ sizeof(HuffmanTable_B11) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B11)); |
+ JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ JBIG2_ALLOC(SBHUFFRSIZE, |
+ CJBig2_HuffmanTable( |
+ HuffmanTable_B1, |
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B1)); |
+ pDecoder->SBHUFFFS = SBHUFFFS; |
+ pDecoder->SBHUFFDS = SBHUFFDS; |
+ pDecoder->SBHUFFDT = SBHUFFDT; |
+ pDecoder->SBHUFFRDW = SBHUFFRDW; |
+ pDecoder->SBHUFFRDH = SBHUFFRDH; |
+ pDecoder->SBHUFFRDX = SBHUFFRDX; |
+ pDecoder->SBHUFFRDY = SBHUFFRDY; |
+ pDecoder->SBHUFFRSIZE = SBHUFFRSIZE; |
+ pDecoder->SBRTEMPLATE = SDRTEMPLATE; |
+ pDecoder->SBRAT[0] = SDRAT[0]; |
+ pDecoder->SBRAT[1] = SDRAT[1]; |
+ pDecoder->SBRAT[2] = SDRAT[2]; |
+ pDecoder->SBRAT[3] = SDRAT[3]; |
+ JBig2IntDecoderState ids; |
+ ids.IADT = IADT; |
+ ids.IAFS = IAFS; |
+ ids.IADS = IADS; |
+ ids.IAIT = IAIT; |
+ ids.IARI = IARI; |
+ ids.IARDW = IARDW; |
+ ids.IARDH = IARDH; |
+ ids.IARDX = IARDX; |
+ ids.IARDY = IARDY; |
+ ids.IAID = IAID; |
+ BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids); |
+ if (BS == NULL) { |
+ m_pModule->JBig2_Free(SBSYMS); |
+ delete SBHUFFFS; |
+ delete SBHUFFDS; |
+ delete SBHUFFDT; |
+ delete SBHUFFRDW; |
+ delete SBHUFFRDH; |
+ delete SBHUFFRDX; |
+ delete SBHUFFRDY; |
+ delete SBHUFFRSIZE; |
+ delete pDecoder; |
goto failed; |
- } |
- if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { |
- delete pTable; |
- m_pModule->JBig2_Free(EXFLAGS); |
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value."); |
+ } |
+ m_pModule->JBig2_Free(SBSYMS); |
+ delete SBHUFFFS; |
+ delete SBHUFFDS; |
+ delete SBHUFFDT; |
+ delete SBHUFFRDW; |
+ delete SBHUFFRDH; |
+ delete SBHUFFRDX; |
+ delete SBHUFFRDY; |
+ delete SBHUFFRSIZE; |
+ delete pDecoder; |
+ } else if (REFAGGNINST == 1) { |
+ SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
+ if (IAID->decode(pArithDecoder, (int*)&IDI) == -1) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): too short."); |
goto failed; |
+ } |
+ if ((IARDX->decode(pArithDecoder, &RDXI) == -1) || |
+ (IARDY->decode(pArithDecoder, &RDYI) == -1)) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): too short."); |
+ goto failed; |
+ } |
+ if (IDI >= SBNUMSYMS) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith):" |
+ " refinement references unknown symbol %d", |
+ IDI); |
+ goto failed; |
+ } |
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
+ SBNUMSYMS, sizeof(CJBig2_Image*)); |
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
+ NSYMSDECODED * sizeof(CJBig2_Image*)); |
+ if (!SBSYMS[IDI]) { |
+ m_pModule->JBig2_Free(SBSYMS); |
+ goto failed; |
+ } |
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
+ pGRRD->GRW = SYMWIDTH; |
+ pGRRD->GRH = HCHEIGHT; |
+ pGRRD->GRTEMPLATE = SDRTEMPLATE; |
+ pGRRD->GRREFERENCE = SBSYMS[IDI]; |
+ pGRRD->GRREFERENCEDX = RDXI; |
+ pGRRD->GRREFERENCEDY = RDYI; |
+ pGRRD->TPGRON = 0; |
+ pGRRD->GRAT[0] = SDRAT[0]; |
+ pGRRD->GRAT[1] = SDRAT[1]; |
+ pGRRD->GRAT[2] = SDRAT[2]; |
+ pGRRD->GRAT[3] = SDRAT[3]; |
+ BS = pGRRD->decode(pArithDecoder, grContext); |
+ if (BS == NULL) { |
+ m_pModule->JBig2_Free(SBSYMS); |
+ delete pGRRD; |
+ goto failed; |
+ } |
+ m_pModule->JBig2_Free(SBSYMS); |
+ delete pGRRD; |
} |
- if(EXRUNLENGTH != 0) { |
- for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { |
- EXFLAGS[I] = CUREXFLAG; |
- } |
- } |
- EXINDEX = EXINDEX + EXRUNLENGTH; |
- CUREXFLAG = !CUREXFLAG; |
+ } |
+ SDNEWSYMS[NSYMSDECODED] = BS; |
+ BS = NULL; |
+ NSYMSDECODED = NSYMSDECODED + 1; |
} |
- delete pTable; |
- JBIG2_ALLOC(pDict, CJBig2_SymbolDict()); |
- pDict->SDNUMEXSYMS = SDNUMEXSYMS; |
- pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS); |
- I = J = 0; |
- for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { |
- if(EXFLAGS[I] && J < SDNUMEXSYMS) { |
- if(I < SDNUMINSYMS) { |
- JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I])); |
- } else { |
- pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS]; |
- } |
- J = J + 1; |
- } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { |
- delete SDNEWSYMS[I - SDNUMINSYMS]; |
- } |
+ } |
+ EXINDEX = 0; |
+ CUREXFLAG = 0; |
+ EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), |
+ (SDNUMINSYMS + SDNUMNEWSYMS)); |
+ while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { |
+ if (IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) { |
+ m_pModule->JBig2_Free(EXFLAGS); |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): too short."); |
+ goto failed; |
} |
- if (J < SDNUMEXSYMS) { |
- pDict->SDNUMEXSYMS = J; |
+ if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { |
+ m_pModule->JBig2_Free(EXFLAGS); |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH " |
+ "value."); |
+ goto failed; |
} |
- m_pModule->JBig2_Free(EXFLAGS); |
- m_pModule->JBig2_Free(SDNEWSYMS); |
- if(SDREFAGG == 0) { |
- m_pModule->JBig2_Free(SDNEWSYMWIDTHS); |
+ if (EXRUNLENGTH != 0) { |
+ for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { |
+ EXFLAGS[I] = CUREXFLAG; |
+ } |
} |
- delete pHuffmanDecoder; |
- return pDict; |
-failed: |
- for(I = 0; I < NSYMSDECODED; I++) { |
- delete SDNEWSYMS[I]; |
+ EXINDEX = EXINDEX + EXRUNLENGTH; |
+ CUREXFLAG = !CUREXFLAG; |
+ } |
+ JBIG2_ALLOC(pDict, CJBig2_SymbolDict()); |
+ pDict->SDNUMEXSYMS = SDNUMEXSYMS; |
+ pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
+ sizeof(CJBig2_Image*), SDNUMEXSYMS); |
+ I = J = 0; |
+ for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { |
+ if (EXFLAGS[I] && J < SDNUMEXSYMS) { |
+ if (I < SDNUMINSYMS) { |
+ JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I])); |
+ } else { |
+ pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS]; |
+ } |
+ J = J + 1; |
+ } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { |
+ delete SDNEWSYMS[I - SDNUMINSYMS]; |
} |
- m_pModule->JBig2_Free(SDNEWSYMS); |
- if(SDREFAGG == 0) { |
- m_pModule->JBig2_Free(SDNEWSYMWIDTHS); |
+ } |
+ if (J < SDNUMEXSYMS) { |
+ pDict->SDNUMEXSYMS = J; |
+ } |
+ m_pModule->JBig2_Free(EXFLAGS); |
+ m_pModule->JBig2_Free(SDNEWSYMS); |
+ delete IADH; |
+ delete IADW; |
+ delete IAAI; |
+ delete IARDX; |
+ delete IARDY; |
+ delete IAEX; |
+ delete IAID; |
+ delete IADT; |
+ delete IAFS; |
+ delete IADS; |
+ delete IAIT; |
+ delete IARI; |
+ delete IARDW; |
+ delete IARDH; |
+ return pDict; |
+failed: |
+ for (I = 0; I < NSYMSDECODED; I++) { |
+ if (SDNEWSYMS[I]) { |
+ delete SDNEWSYMS[I]; |
+ SDNEWSYMS[I] = NULL; |
} |
- delete pHuffmanDecoder; |
- return NULL; |
+ } |
+ m_pModule->JBig2_Free(SDNEWSYMS); |
+ delete IADH; |
+ delete IADW; |
+ delete IAAI; |
+ delete IARDX; |
+ delete IARDY; |
+ delete IAEX; |
+ delete IAID; |
+ delete IADT; |
+ delete IAFS; |
+ delete IADS; |
+ delete IAIT; |
+ delete IARI; |
+ delete IARDW; |
+ delete IARDH; |
+ return NULL; |
} |
-CJBig2_Image *CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, |
- JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- FX_DWORD ng, mg; |
- int32_t x, y; |
- CJBig2_Image *HSKIP; |
- FX_DWORD HBPP; |
- FX_DWORD *GI; |
- CJBig2_Image *HTREG; |
- CJBig2_GSIDProc *pGID; |
- JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH)); |
- HTREG->fill(HDEFPIXEL); |
- HSKIP = NULL; |
- if(HENABLESKIP == 1) { |
- JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH)); |
- for(mg = 0; mg < HGH; mg++) { |
- for(ng = 0; ng < HGW; ng++) { |
- x = (HGX + mg * HRY + ng * HRX) >> 8; |
- y = (HGY + mg * HRX - ng * HRY) >> 8; |
- if((x + HPW <= 0) | (x >= (int32_t)HBW) |
- | (y + HPH <= 0) | (y >= (int32_t)HPH)) { |
- HSKIP->setPixel(ng, mg, 1); |
- } else { |
- HSKIP->setPixel(ng, mg, 0); |
- } |
- } |
- } |
+CJBig2_SymbolDict* CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream* pStream, |
+ JBig2ArithCtx* gbContext, |
+ JBig2ArithCtx* grContext, |
+ IFX_Pause* pPause) { |
+ CJBig2_Image** SDNEWSYMS; |
+ FX_DWORD* SDNEWSYMWIDTHS; |
+ FX_DWORD HCHEIGHT, NSYMSDECODED; |
+ int32_t HCDH; |
+ FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM; |
+ int32_t DW; |
+ CJBig2_Image *BS, *BHC; |
+ FX_DWORD I, J, REFAGGNINST; |
+ FX_BOOL* EXFLAGS; |
+ FX_DWORD EXINDEX; |
+ FX_BOOL CUREXFLAG; |
+ FX_DWORD EXRUNLENGTH; |
+ int32_t nVal, nBits; |
+ FX_DWORD nTmp; |
+ FX_DWORD SBNUMSYMS; |
+ uint8_t SBSYMCODELEN; |
+ JBig2HuffmanCode* SBSYMCODES; |
+ FX_DWORD IDI; |
+ int32_t RDXI, RDYI; |
+ FX_DWORD BMSIZE; |
+ FX_DWORD stride; |
+ CJBig2_Image** SBSYMS; |
+ CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, |
+ *SBHUFFRDX, *SBHUFFRDY, *SBHUFFRSIZE, *pTable; |
+ CJBig2_HuffmanDecoder* pHuffmanDecoder; |
+ CJBig2_GRRDProc* pGRRD; |
+ CJBig2_ArithDecoder* pArithDecoder; |
+ CJBig2_GRDProc* pGRD; |
+ CJBig2_SymbolDict* pDict; |
+ JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream)); |
+ SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, |
+ sizeof(CJBig2_Image*)); |
+ FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
+ SDNEWSYMWIDTHS = NULL; |
+ BHC = NULL; |
+ if (SDREFAGG == 0) { |
+ SDNEWSYMWIDTHS = |
+ (FX_DWORD*)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(FX_DWORD)); |
+ FXSYS_memset(SDNEWSYMWIDTHS, 0, SDNUMNEWSYMS * sizeof(FX_DWORD)); |
+ } |
+ HCHEIGHT = 0; |
+ NSYMSDECODED = 0; |
+ BS = NULL; |
+ while (NSYMSDECODED < SDNUMNEWSYMS) { |
+ if (pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): too short."); |
+ goto failed; |
} |
- HBPP = 1; |
- while((FX_DWORD)(1 << HBPP) < HNUMPATS) { |
- HBPP ++; |
+ HCHEIGHT = HCHEIGHT + HCDH; |
+ if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): invalid HCHEIGHT " |
+ "value."); |
+ goto failed; |
} |
- JBIG2_ALLOC(pGID, CJBig2_GSIDProc()); |
- pGID->GSMMR = HMMR; |
- pGID->GSW = HGW; |
- pGID->GSH = HGH; |
- pGID->GSBPP = (uint8_t)HBPP; |
- pGID->GSUSESKIP = HENABLESKIP; |
- pGID->GSKIP = HSKIP; |
- pGID->GSTEMPLATE = HTEMPLATE; |
- GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause); |
- if(GI == NULL) { |
+ SYMWIDTH = 0; |
+ TOTWIDTH = 0; |
+ HCFIRSTSYM = NSYMSDECODED; |
+ for (;;) { |
+ nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW); |
+ if (nVal == JBIG2_OOB) { |
+ break; |
+ } else if (nVal != 0) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): too short."); |
goto failed; |
- } |
- for(mg = 0; mg < HGH; mg++) { |
- for(ng = 0; ng < HGW; ng++) { |
- x = (HGX + mg * HRY + ng * HRX) >> 8; |
- y = (HGY + mg * HRX - ng * HRY) >> 8; |
- FX_DWORD pat_index = GI[mg * HGW + ng]; |
- if (pat_index >= HNUMPATS) { |
- pat_index = HNUMPATS - 1; |
+ } else { |
+ if (NSYMSDECODED >= SDNUMNEWSYMS) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): NSYMSDECODED >= " |
+ "SDNUMNEWSYMS."); |
+ goto failed; |
+ } |
+ SYMWIDTH = SYMWIDTH + DW; |
+ if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): invalid " |
+ "SYMWIDTH value."); |
+ goto failed; |
+ } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { |
+ TOTWIDTH = TOTWIDTH + SYMWIDTH; |
+ SDNEWSYMS[NSYMSDECODED] = NULL; |
+ NSYMSDECODED = NSYMSDECODED + 1; |
+ continue; |
+ } |
+ TOTWIDTH = TOTWIDTH + SYMWIDTH; |
+ } |
+ if (SDREFAGG == 1) { |
+ if (pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != |
+ 0) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): too short."); |
+ goto failed; |
+ } |
+ BS = NULL; |
+ if (REFAGGNINST > 1) { |
+ CJBig2_TRDProc* pDecoder; |
+ JBIG2_ALLOC(pDecoder, CJBig2_TRDProc()); |
+ pDecoder->SBHUFF = SDHUFF; |
+ pDecoder->SBREFINE = 1; |
+ pDecoder->SBW = SYMWIDTH; |
+ pDecoder->SBH = HCHEIGHT; |
+ pDecoder->SBNUMINSTANCES = REFAGGNINST; |
+ pDecoder->SBSTRIPS = 1; |
+ pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
+ SBNUMSYMS = pDecoder->SBNUMSYMS; |
+ SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2( |
+ SBNUMSYMS, sizeof(JBig2HuffmanCode)); |
+ nTmp = 1; |
+ while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
+ nTmp++; |
+ } |
+ for (I = 0; I < SBNUMSYMS; I++) { |
+ SBSYMCODES[I].codelen = nTmp; |
+ SBSYMCODES[I].code = I; |
+ } |
+ pDecoder->SBSYMCODES = SBSYMCODES; |
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
+ SBNUMSYMS, sizeof(CJBig2_Image*)); |
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
+ NSYMSDECODED * sizeof(CJBig2_Image*)); |
+ pDecoder->SBSYMS = SBSYMS; |
+ pDecoder->SBDEFPIXEL = 0; |
+ pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
+ pDecoder->TRANSPOSED = 0; |
+ pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
+ pDecoder->SBDSOFFSET = 0; |
+ JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6, |
+ sizeof(HuffmanTable_B6) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B6)); |
+ JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8, |
+ sizeof(HuffmanTable_B8) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B8)); |
+ JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11, |
+ sizeof(HuffmanTable_B11) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B11)); |
+ JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ JBIG2_ALLOC(SBHUFFRSIZE, |
+ CJBig2_HuffmanTable( |
+ HuffmanTable_B1, |
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B1)); |
+ pDecoder->SBHUFFFS = SBHUFFFS; |
+ pDecoder->SBHUFFDS = SBHUFFDS; |
+ pDecoder->SBHUFFDT = SBHUFFDT; |
+ pDecoder->SBHUFFRDW = SBHUFFRDW; |
+ pDecoder->SBHUFFRDH = SBHUFFRDH; |
+ pDecoder->SBHUFFRDX = SBHUFFRDX; |
+ pDecoder->SBHUFFRDY = SBHUFFRDY; |
+ pDecoder->SBHUFFRSIZE = SBHUFFRSIZE; |
+ pDecoder->SBRTEMPLATE = SDRTEMPLATE; |
+ pDecoder->SBRAT[0] = SDRAT[0]; |
+ pDecoder->SBRAT[1] = SDRAT[1]; |
+ pDecoder->SBRAT[2] = SDRAT[2]; |
+ pDecoder->SBRAT[3] = SDRAT[3]; |
+ BS = pDecoder->decode_Huffman(pStream, grContext); |
+ if (BS == NULL) { |
+ m_pModule->JBig2_Free(SBSYMCODES); |
+ m_pModule->JBig2_Free(SBSYMS); |
+ delete SBHUFFFS; |
+ delete SBHUFFDS; |
+ delete SBHUFFDT; |
+ delete SBHUFFRDW; |
+ delete SBHUFFRDH; |
+ delete SBHUFFRDX; |
+ delete SBHUFFRDY; |
+ delete SBHUFFRSIZE; |
+ delete pDecoder; |
+ goto failed; |
+ } |
+ m_pModule->JBig2_Free(SBSYMCODES); |
+ m_pModule->JBig2_Free(SBSYMS); |
+ delete SBHUFFFS; |
+ delete SBHUFFDS; |
+ delete SBHUFFDT; |
+ delete SBHUFFRDW; |
+ delete SBHUFFRDH; |
+ delete SBHUFFRDX; |
+ delete SBHUFFRDY; |
+ delete SBHUFFRSIZE; |
+ delete pDecoder; |
+ } else if (REFAGGNINST == 1) { |
+ SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS; |
+ nTmp = 1; |
+ while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
+ nTmp++; |
+ } |
+ SBSYMCODELEN = (uint8_t)nTmp; |
+ SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2( |
+ SBNUMSYMS, sizeof(JBig2HuffmanCode)); |
+ for (I = 0; I < SBNUMSYMS; I++) { |
+ SBSYMCODES[I].codelen = SBSYMCODELEN; |
+ SBSYMCODES[I].code = I; |
+ } |
+ nVal = 0; |
+ nBits = 0; |
+ for (;;) { |
+ if (pStream->read1Bit(&nTmp) != 0) { |
+ m_pModule->JBig2_Free(SBSYMCODES); |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): too short."); |
+ goto failed; |
+ } |
+ nVal = (nVal << 1) | nTmp; |
+ for (IDI = 0; IDI < SBNUMSYMS; IDI++) { |
+ if ((nVal == SBSYMCODES[IDI].code) && |
+ (nBits == SBSYMCODES[IDI].codelen)) { |
+ break; |
+ } |
+ } |
+ if (IDI < SBNUMSYMS) { |
+ break; |
} |
- HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); |
+ } |
+ m_pModule->JBig2_Free(SBSYMCODES); |
+ JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15, |
+ sizeof(HuffmanTable_B15) / |
+ sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B15)); |
+ JBIG2_ALLOC(SBHUFFRSIZE, |
+ CJBig2_HuffmanTable( |
+ HuffmanTable_B1, |
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B1)); |
+ if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) || |
+ (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0) || |
+ (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) { |
+ delete SBHUFFRDX; |
+ delete SBHUFFRSIZE; |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): too short."); |
+ goto failed; |
+ } |
+ delete SBHUFFRDX; |
+ delete SBHUFFRSIZE; |
+ pStream->alignByte(); |
+ nTmp = pStream->getOffset(); |
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
+ SBNUMSYMS, sizeof(CJBig2_Image*)); |
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
+ NSYMSDECODED * sizeof(CJBig2_Image*)); |
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc()); |
+ pGRRD->GRW = SYMWIDTH; |
+ pGRRD->GRH = HCHEIGHT; |
+ pGRRD->GRTEMPLATE = SDRTEMPLATE; |
+ pGRRD->GRREFERENCE = SBSYMS[IDI]; |
+ pGRRD->GRREFERENCEDX = RDXI; |
+ pGRRD->GRREFERENCEDY = RDYI; |
+ pGRRD->TPGRON = 0; |
+ pGRRD->GRAT[0] = SDRAT[0]; |
+ pGRRD->GRAT[1] = SDRAT[1]; |
+ pGRRD->GRAT[2] = SDRAT[2]; |
+ pGRRD->GRAT[3] = SDRAT[3]; |
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream)); |
+ BS = pGRRD->decode(pArithDecoder, grContext); |
+ if (BS == NULL) { |
+ m_pModule->JBig2_Free(SBSYMS); |
+ delete pGRRD; |
+ delete pArithDecoder; |
+ goto failed; |
+ } |
+ pStream->alignByte(); |
+ pStream->offset(2); |
+ if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { |
+ delete BS; |
+ m_pModule->JBig2_Free(SBSYMS); |
+ delete pGRRD; |
+ delete pArithDecoder; |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman):" |
+ "bytes processed by generic refinement region decoding " |
+ "procedure doesn't equal SBHUFFRSIZE."); |
+ goto failed; |
+ } |
+ m_pModule->JBig2_Free(SBSYMS); |
+ delete pGRRD; |
+ delete pArithDecoder; |
} |
+ SDNEWSYMS[NSYMSDECODED] = BS; |
+ } |
+ if (SDREFAGG == 0) { |
+ SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH; |
+ } |
+ NSYMSDECODED = NSYMSDECODED + 1; |
} |
- m_pModule->JBig2_Free(GI); |
- delete HSKIP; |
- delete pGID; |
- return HTREG; |
-failed: |
- delete HSKIP; |
- delete pGID; |
- delete HTREG; |
- return NULL; |
-} |
-CJBig2_Image *CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause) |
-{ |
- FX_DWORD ng, mg; |
- int32_t x, y; |
- FX_DWORD HBPP; |
- FX_DWORD *GI; |
- CJBig2_Image *HTREG; |
- CJBig2_GSIDProc *pGID; |
- JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH)); |
- HTREG->fill(HDEFPIXEL); |
- HBPP = 1; |
- while((FX_DWORD)(1 << HBPP) < HNUMPATS) { |
- HBPP ++; |
- } |
- JBIG2_ALLOC(pGID, CJBig2_GSIDProc()); |
- pGID->GSMMR = HMMR; |
- pGID->GSW = HGW; |
- pGID->GSH = HGH; |
- pGID->GSBPP = (uint8_t)HBPP; |
- pGID->GSUSESKIP = 0; |
- GI = pGID->decode_MMR(pStream, pPause); |
- if(GI == NULL) { |
+ if (SDREFAGG == 0) { |
+ if (pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (int32_t*)&BMSIZE) != 0) { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): too short."); |
goto failed; |
- } |
- for(mg = 0; mg < HGH; mg++) { |
- for(ng = 0; ng < HGW; ng++) { |
- x = (HGX + mg * HRY + ng * HRX) >> 8; |
- y = (HGY + mg * HRX - ng * HRY) >> 8; |
- FX_DWORD pat_index = GI[mg * HGW + ng]; |
- if (pat_index >= HNUMPATS) { |
- pat_index = HNUMPATS - 1; |
- } |
- HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); |
+ } |
+ pStream->alignByte(); |
+ if (BMSIZE == 0) { |
+ stride = (TOTWIDTH + 7) >> 3; |
+ if (pStream->getByteLeft() >= stride * HCHEIGHT) { |
+ JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT)); |
+ for (I = 0; I < HCHEIGHT; I++) { |
+ JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, |
+ pStream->getPointer(), stride); |
+ pStream->offset(stride); |
+ } |
+ } else { |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): too short."); |
+ goto failed; |
+ } |
+ } else { |
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
+ pGRD->MMR = 1; |
+ pGRD->GBW = TOTWIDTH; |
+ pGRD->GBH = HCHEIGHT; |
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream); |
+ while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ pGRD->Continue_decode(pPause); |
} |
+ delete pGRD; |
+ pStream->alignByte(); |
+ } |
+ nTmp = 0; |
+ if (!BHC) { |
+ continue; |
+ } |
+ for (I = HCFIRSTSYM; I < NSYMSDECODED; I++) { |
+ SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT); |
+ nTmp += SDNEWSYMWIDTHS[I]; |
+ } |
+ delete BHC; |
+ BHC = NULL; |
+ } |
+ } |
+ EXINDEX = 0; |
+ CUREXFLAG = 0; |
+ JBIG2_ALLOC(pTable, CJBig2_HuffmanTable( |
+ HuffmanTable_B1, |
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), |
+ HuffmanTable_HTOOB_B1)); |
+ EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), |
+ (SDNUMINSYMS + SDNUMNEWSYMS)); |
+ while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { |
+ if (pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) { |
+ delete pTable; |
+ m_pModule->JBig2_Free(EXFLAGS); |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (huffman): too short."); |
+ goto failed; |
+ } |
+ if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { |
+ delete pTable; |
+ m_pModule->JBig2_Free(EXFLAGS); |
+ m_pModule->JBig2_Error( |
+ "symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH " |
+ "value."); |
+ goto failed; |
} |
- m_pModule->JBig2_Free(GI); |
- delete pGID; |
- return HTREG; |
+ if (EXRUNLENGTH != 0) { |
+ for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { |
+ EXFLAGS[I] = CUREXFLAG; |
+ } |
+ } |
+ EXINDEX = EXINDEX + EXRUNLENGTH; |
+ CUREXFLAG = !CUREXFLAG; |
+ } |
+ delete pTable; |
+ JBIG2_ALLOC(pDict, CJBig2_SymbolDict()); |
+ pDict->SDNUMEXSYMS = SDNUMEXSYMS; |
+ pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
+ sizeof(CJBig2_Image*), SDNUMEXSYMS); |
+ I = J = 0; |
+ for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { |
+ if (EXFLAGS[I] && J < SDNUMEXSYMS) { |
+ if (I < SDNUMINSYMS) { |
+ JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I])); |
+ } else { |
+ pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS]; |
+ } |
+ J = J + 1; |
+ } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { |
+ delete SDNEWSYMS[I - SDNUMINSYMS]; |
+ } |
+ } |
+ if (J < SDNUMEXSYMS) { |
+ pDict->SDNUMEXSYMS = J; |
+ } |
+ m_pModule->JBig2_Free(EXFLAGS); |
+ m_pModule->JBig2_Free(SDNEWSYMS); |
+ if (SDREFAGG == 0) { |
+ m_pModule->JBig2_Free(SDNEWSYMWIDTHS); |
+ } |
+ delete pHuffmanDecoder; |
+ return pDict; |
failed: |
- delete pGID; |
- delete HTREG; |
- return NULL; |
+ for (I = 0; I < NSYMSDECODED; I++) { |
+ delete SDNEWSYMS[I]; |
+ } |
+ m_pModule->JBig2_Free(SDNEWSYMS); |
+ if (SDREFAGG == 0) { |
+ m_pModule->JBig2_Free(SDNEWSYMWIDTHS); |
+ } |
+ delete pHuffmanDecoder; |
+ return NULL; |
} |
-CJBig2_PatternDict *CJBig2_PDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, |
- JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- FX_DWORD GRAY; |
- CJBig2_Image *BHDC = NULL; |
- CJBig2_PatternDict *pDict; |
- CJBig2_GRDProc *pGRD; |
- JBIG2_ALLOC(pDict, CJBig2_PatternDict()); |
- pDict->NUMPATS = GRAYMAX + 1; |
- pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS); |
- JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS); |
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
- pGRD->MMR = HDMMR; |
- pGRD->GBW = (GRAYMAX + 1) * HDPW; |
- pGRD->GBH = HDPH; |
- pGRD->GBTEMPLATE = HDTEMPLATE; |
- pGRD->TPGDON = 0; |
- pGRD->USESKIP = 0; |
- pGRD->GBAT[0] = -(int32_t)HDPW; |
- pGRD->GBAT[1] = 0; |
- if(pGRD->GBTEMPLATE == 0) { |
- pGRD->GBAT[2] = -3; |
- pGRD->GBAT[3] = -1; |
- pGRD->GBAT[4] = 2; |
- pGRD->GBAT[5] = -2; |
- pGRD->GBAT[6] = -2; |
- pGRD->GBAT[7] = -2; |
+CJBig2_Image* CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_DWORD ng, mg; |
+ int32_t x, y; |
+ CJBig2_Image* HSKIP; |
+ FX_DWORD HBPP; |
+ FX_DWORD* GI; |
+ CJBig2_Image* HTREG; |
+ CJBig2_GSIDProc* pGID; |
+ JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH)); |
+ HTREG->fill(HDEFPIXEL); |
+ HSKIP = NULL; |
+ if (HENABLESKIP == 1) { |
+ JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH)); |
+ for (mg = 0; mg < HGH; mg++) { |
+ for (ng = 0; ng < HGW; ng++) { |
+ x = (HGX + mg * HRY + ng * HRX) >> 8; |
+ y = (HGY + mg * HRX - ng * HRY) >> 8; |
+ if ((x + HPW <= 0) | (x >= (int32_t)HBW) | (y + HPH <= 0) | |
+ (y >= (int32_t)HPH)) { |
+ HSKIP->setPixel(ng, mg, 1); |
+ } else { |
+ HSKIP->setPixel(ng, mg, 0); |
+ } |
+ } |
} |
- FXCODEC_STATUS status = pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext); |
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- pGRD->Continue_decode(pPause); |
+ } |
+ HBPP = 1; |
+ while ((FX_DWORD)(1 << HBPP) < HNUMPATS) { |
+ HBPP++; |
+ } |
+ JBIG2_ALLOC(pGID, CJBig2_GSIDProc()); |
+ pGID->GSMMR = HMMR; |
+ pGID->GSW = HGW; |
+ pGID->GSH = HGH; |
+ pGID->GSBPP = (uint8_t)HBPP; |
+ pGID->GSUSESKIP = HENABLESKIP; |
+ pGID->GSKIP = HSKIP; |
+ pGID->GSTEMPLATE = HTEMPLATE; |
+ GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause); |
+ if (GI == NULL) { |
+ goto failed; |
+ } |
+ for (mg = 0; mg < HGH; mg++) { |
+ for (ng = 0; ng < HGW; ng++) { |
+ x = (HGX + mg * HRY + ng * HRX) >> 8; |
+ y = (HGY + mg * HRX - ng * HRY) >> 8; |
+ FX_DWORD pat_index = GI[mg * HGW + ng]; |
+ if (pat_index >= HNUMPATS) { |
+ pat_index = HNUMPATS - 1; |
+ } |
+ HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); |
} |
- if(BHDC == NULL) { |
- delete pGRD; |
- goto failed; |
+ } |
+ m_pModule->JBig2_Free(GI); |
+ delete HSKIP; |
+ delete pGID; |
+ return HTREG; |
+failed: |
+ delete HSKIP; |
+ delete pGID; |
+ delete HTREG; |
+ return NULL; |
+} |
+CJBig2_Image* CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream* pStream, |
+ IFX_Pause* pPause) { |
+ FX_DWORD ng, mg; |
+ int32_t x, y; |
+ FX_DWORD HBPP; |
+ FX_DWORD* GI; |
+ CJBig2_Image* HTREG; |
+ CJBig2_GSIDProc* pGID; |
+ JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH)); |
+ HTREG->fill(HDEFPIXEL); |
+ HBPP = 1; |
+ while ((FX_DWORD)(1 << HBPP) < HNUMPATS) { |
+ HBPP++; |
+ } |
+ JBIG2_ALLOC(pGID, CJBig2_GSIDProc()); |
+ pGID->GSMMR = HMMR; |
+ pGID->GSW = HGW; |
+ pGID->GSH = HGH; |
+ pGID->GSBPP = (uint8_t)HBPP; |
+ pGID->GSUSESKIP = 0; |
+ GI = pGID->decode_MMR(pStream, pPause); |
+ if (GI == NULL) { |
+ goto failed; |
+ } |
+ for (mg = 0; mg < HGH; mg++) { |
+ for (ng = 0; ng < HGW; ng++) { |
+ x = (HGX + mg * HRY + ng * HRX) >> 8; |
+ y = (HGY + mg * HRX - ng * HRY) >> 8; |
+ FX_DWORD pat_index = GI[mg * HGW + ng]; |
+ if (pat_index >= HNUMPATS) { |
+ pat_index = HNUMPATS - 1; |
+ } |
+ HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); |
} |
+ } |
+ m_pModule->JBig2_Free(GI); |
+ delete pGID; |
+ return HTREG; |
+failed: |
+ delete pGID; |
+ delete HTREG; |
+ return NULL; |
+} |
+CJBig2_PatternDict* CJBig2_PDDProc::decode_Arith( |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_DWORD GRAY; |
+ CJBig2_Image* BHDC = NULL; |
+ CJBig2_PatternDict* pDict; |
+ CJBig2_GRDProc* pGRD; |
+ JBIG2_ALLOC(pDict, CJBig2_PatternDict()); |
+ pDict->NUMPATS = GRAYMAX + 1; |
+ pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
+ sizeof(CJBig2_Image*), pDict->NUMPATS); |
+ JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS); |
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
+ pGRD->MMR = HDMMR; |
+ pGRD->GBW = (GRAYMAX + 1) * HDPW; |
+ pGRD->GBH = HDPH; |
+ pGRD->GBTEMPLATE = HDTEMPLATE; |
+ pGRD->TPGDON = 0; |
+ pGRD->USESKIP = 0; |
+ pGRD->GBAT[0] = -(int32_t)HDPW; |
+ pGRD->GBAT[1] = 0; |
+ if (pGRD->GBTEMPLATE == 0) { |
+ pGRD->GBAT[2] = -3; |
+ pGRD->GBAT[3] = -1; |
+ pGRD->GBAT[4] = 2; |
+ pGRD->GBAT[5] = -2; |
+ pGRD->GBAT[6] = -2; |
+ pGRD->GBAT[7] = -2; |
+ } |
+ FXCODEC_STATUS status = |
+ pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext); |
+ while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ pGRD->Continue_decode(pPause); |
+ } |
+ if (BHDC == NULL) { |
delete pGRD; |
- GRAY = 0; |
- while(GRAY <= GRAYMAX) { |
- pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); |
- GRAY = GRAY + 1; |
- } |
- delete BHDC; |
- return pDict; |
+ goto failed; |
+ } |
+ delete pGRD; |
+ GRAY = 0; |
+ while (GRAY <= GRAYMAX) { |
+ pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); |
+ GRAY = GRAY + 1; |
+ } |
+ delete BHDC; |
+ return pDict; |
failed: |
- delete pDict; |
- return NULL; |
+ delete pDict; |
+ return NULL; |
} |
-CJBig2_PatternDict *CJBig2_PDDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause) |
-{ |
- FX_DWORD GRAY; |
- CJBig2_Image *BHDC = NULL; |
- CJBig2_PatternDict *pDict; |
- CJBig2_GRDProc *pGRD; |
- JBIG2_ALLOC(pDict, CJBig2_PatternDict()); |
- pDict->NUMPATS = GRAYMAX + 1; |
- pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS); |
- JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS); |
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
- pGRD->MMR = HDMMR; |
- pGRD->GBW = (GRAYMAX + 1) * HDPW; |
- pGRD->GBH = HDPH; |
- FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream); |
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- pGRD->Continue_decode(pPause); |
- } |
- if(BHDC == NULL) { |
- delete pGRD; |
- goto failed; |
- } |
+CJBig2_PatternDict* CJBig2_PDDProc::decode_MMR(CJBig2_BitStream* pStream, |
+ IFX_Pause* pPause) { |
+ FX_DWORD GRAY; |
+ CJBig2_Image* BHDC = NULL; |
+ CJBig2_PatternDict* pDict; |
+ CJBig2_GRDProc* pGRD; |
+ JBIG2_ALLOC(pDict, CJBig2_PatternDict()); |
+ pDict->NUMPATS = GRAYMAX + 1; |
+ pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2( |
+ sizeof(CJBig2_Image*), pDict->NUMPATS); |
+ JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS); |
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
+ pGRD->MMR = HDMMR; |
+ pGRD->GBW = (GRAYMAX + 1) * HDPW; |
+ pGRD->GBH = HDPH; |
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream); |
+ while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ pGRD->Continue_decode(pPause); |
+ } |
+ if (BHDC == NULL) { |
delete pGRD; |
- GRAY = 0; |
- while(GRAY <= GRAYMAX) { |
- pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); |
- GRAY = GRAY + 1; |
- } |
- delete BHDC; |
- return pDict; |
+ goto failed; |
+ } |
+ delete pGRD; |
+ GRAY = 0; |
+ while (GRAY <= GRAYMAX) { |
+ pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); |
+ GRAY = GRAY + 1; |
+ } |
+ delete BHDC; |
+ return pDict; |
failed: |
- delete pDict; |
- return NULL; |
+ delete pDict; |
+ return NULL; |
} |
-FX_DWORD *CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, |
- JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- CJBig2_Image **GSPLANES; |
- int32_t J, K; |
- FX_DWORD x, y; |
- FX_DWORD *GSVALS; |
- CJBig2_GRDProc *pGRD; |
- GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP); |
- if (!GSPLANES) { |
- return NULL; |
- } |
- GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH); |
- if (!GSVALS) { |
- m_pModule->JBig2_Free(GSPLANES); |
- return NULL; |
- } |
- JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP); |
- JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH); |
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
- pGRD->MMR = GSMMR; |
- pGRD->GBW = GSW; |
- pGRD->GBH = GSH; |
- pGRD->GBTEMPLATE = GSTEMPLATE; |
- pGRD->TPGDON = 0; |
- pGRD->USESKIP = GSUSESKIP; |
- pGRD->SKIP = GSKIP; |
- if(GSTEMPLATE <= 1) { |
- pGRD->GBAT[0] = 3; |
- } else { |
- pGRD->GBAT[0] = 2; |
- } |
- pGRD->GBAT[1] = -1; |
- if(pGRD->GBTEMPLATE == 0) { |
- pGRD->GBAT[2] = -3; |
- pGRD->GBAT[3] = -1; |
- pGRD->GBAT[4] = 2; |
- pGRD->GBAT[5] = -2; |
- pGRD->GBAT[6] = -2; |
- pGRD->GBAT[7] = -2; |
- } |
- FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext); |
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- pGRD->Continue_decode(pPause); |
+FX_DWORD* CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ CJBig2_Image** GSPLANES; |
+ int32_t J, K; |
+ FX_DWORD x, y; |
+ FX_DWORD* GSVALS; |
+ CJBig2_GRDProc* pGRD; |
+ GSPLANES = |
+ (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP); |
+ if (!GSPLANES) { |
+ return NULL; |
+ } |
+ GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH); |
+ if (!GSVALS) { |
+ m_pModule->JBig2_Free(GSPLANES); |
+ return NULL; |
+ } |
+ JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP); |
+ JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH); |
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
+ pGRD->MMR = GSMMR; |
+ pGRD->GBW = GSW; |
+ pGRD->GBH = GSH; |
+ pGRD->GBTEMPLATE = GSTEMPLATE; |
+ pGRD->TPGDON = 0; |
+ pGRD->USESKIP = GSUSESKIP; |
+ pGRD->SKIP = GSKIP; |
+ if (GSTEMPLATE <= 1) { |
+ pGRD->GBAT[0] = 3; |
+ } else { |
+ pGRD->GBAT[0] = 2; |
+ } |
+ pGRD->GBAT[1] = -1; |
+ if (pGRD->GBTEMPLATE == 0) { |
+ pGRD->GBAT[2] = -3; |
+ pGRD->GBAT[3] = -1; |
+ pGRD->GBAT[4] = 2; |
+ pGRD->GBAT[5] = -2; |
+ pGRD->GBAT[6] = -2; |
+ pGRD->GBAT[7] = -2; |
+ } |
+ FXCODEC_STATUS status = |
+ pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext); |
+ while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ pGRD->Continue_decode(pPause); |
+ } |
+ if (GSPLANES[GSBPP - 1] == NULL) { |
+ goto failed; |
+ } |
+ J = GSBPP - 2; |
+ while (J >= 0) { |
+ FXCODEC_STATUS status = |
+ pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext); |
+ while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ pGRD->Continue_decode(pPause); |
} |
- if(GSPLANES[GSBPP - 1] == NULL) { |
+ if (GSPLANES[J] == NULL) { |
+ for (K = GSBPP - 1; K > J; K--) { |
+ delete GSPLANES[K]; |
goto failed; |
+ } |
} |
- J = GSBPP - 2; |
- while(J >= 0) { |
- FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext); |
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- pGRD->Continue_decode(pPause); |
- } |
- if(GSPLANES[J] == NULL) { |
- for(K = GSBPP - 1; K > J; K--) { |
- delete GSPLANES[K]; |
- goto failed; |
- } |
- } |
- GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); |
- J = J - 1; |
- } |
- for(y = 0; y < GSH; y++) { |
- for(x = 0; x < GSW; x++) { |
- for(J = 0; J < GSBPP; J++) { |
- GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J; |
- } |
- } |
- } |
- for(J = 0; J < GSBPP; J++) { |
- delete GSPLANES[J]; |
+ GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); |
+ J = J - 1; |
+ } |
+ for (y = 0; y < GSH; y++) { |
+ for (x = 0; x < GSW; x++) { |
+ for (J = 0; J < GSBPP; J++) { |
+ GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J; |
+ } |
} |
- m_pModule->JBig2_Free(GSPLANES); |
- delete pGRD; |
- return GSVALS; |
+ } |
+ for (J = 0; J < GSBPP; J++) { |
+ delete GSPLANES[J]; |
+ } |
+ m_pModule->JBig2_Free(GSPLANES); |
+ delete pGRD; |
+ return GSVALS; |
failed: |
- m_pModule->JBig2_Free(GSPLANES); |
- delete pGRD; |
- m_pModule->JBig2_Free(GSVALS); |
- return NULL; |
+ m_pModule->JBig2_Free(GSPLANES); |
+ delete pGRD; |
+ m_pModule->JBig2_Free(GSVALS); |
+ return NULL; |
} |
-FX_DWORD *CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause) |
-{ |
- CJBig2_Image **GSPLANES; |
- int32_t J, K; |
- FX_DWORD x, y; |
- FX_DWORD *GSVALS; |
- CJBig2_GRDProc *pGRD; |
- GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP); |
- if (!GSPLANES) { |
- return NULL; |
- } |
- GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH); |
- if (!GSVALS) { |
- if (GSPLANES) { |
- m_pModule->JBig2_Free(GSPLANES); |
- } |
- return NULL; |
+FX_DWORD* CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream* pStream, |
+ IFX_Pause* pPause) { |
+ CJBig2_Image** GSPLANES; |
+ int32_t J, K; |
+ FX_DWORD x, y; |
+ FX_DWORD* GSVALS; |
+ CJBig2_GRDProc* pGRD; |
+ GSPLANES = |
+ (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP); |
+ if (!GSPLANES) { |
+ return NULL; |
+ } |
+ GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH); |
+ if (!GSVALS) { |
+ if (GSPLANES) { |
+ m_pModule->JBig2_Free(GSPLANES); |
} |
- JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP); |
- JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH); |
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
- pGRD->MMR = GSMMR; |
- pGRD->GBW = GSW; |
- pGRD->GBH = GSH; |
- FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream); |
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- pGRD->Continue_decode(pPause); |
+ return NULL; |
+ } |
+ JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP); |
+ JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH); |
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc()); |
+ pGRD->MMR = GSMMR; |
+ pGRD->GBW = GSW; |
+ pGRD->GBH = GSH; |
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream); |
+ while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ pGRD->Continue_decode(pPause); |
+ } |
+ if (GSPLANES[GSBPP - 1] == NULL) { |
+ goto failed; |
+ } |
+ pStream->alignByte(); |
+ pStream->offset(3); |
+ J = GSBPP - 2; |
+ while (J >= 0) { |
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream); |
+ while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ pGRD->Continue_decode(pPause); |
} |
- if(GSPLANES[GSBPP - 1] == NULL) { |
+ if (GSPLANES[J] == NULL) { |
+ for (K = GSBPP - 1; K > J; K--) { |
+ delete GSPLANES[K]; |
goto failed; |
+ } |
} |
pStream->alignByte(); |
pStream->offset(3); |
- J = GSBPP - 2; |
- while(J >= 0) { |
- FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream); |
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- pGRD->Continue_decode(pPause); |
- } |
- if(GSPLANES[J] == NULL) { |
- for(K = GSBPP - 1; K > J; K--) { |
- delete GSPLANES[K]; |
- goto failed; |
- } |
- } |
- pStream->alignByte(); |
- pStream->offset(3); |
- GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); |
- J = J - 1; |
- } |
- for(y = 0; y < GSH; y++) { |
- for(x = 0; x < GSW; x++) { |
- for(J = 0; J < GSBPP; J++) { |
- GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J; |
- } |
- } |
+ GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR); |
+ J = J - 1; |
+ } |
+ for (y = 0; y < GSH; y++) { |
+ for (x = 0; x < GSW; x++) { |
+ for (J = 0; J < GSBPP; J++) { |
+ GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J; |
+ } |
} |
- for(J = 0; J < GSBPP; J++) { |
- delete GSPLANES[J]; |
- } |
- m_pModule->JBig2_Free(GSPLANES); |
- delete pGRD; |
- return GSVALS; |
+ } |
+ for (J = 0; J < GSBPP; J++) { |
+ delete GSPLANES[J]; |
+ } |
+ m_pModule->JBig2_Free(GSPLANES); |
+ delete pGRD; |
+ return GSVALS; |
failed: |
- m_pModule->JBig2_Free(GSPLANES); |
- delete pGRD; |
- m_pModule->JBig2_Free(GSVALS); |
- return NULL; |
+ m_pModule->JBig2_Free(GSPLANES); |
+ delete pGRD; |
+ m_pModule->JBig2_Free(GSVALS); |
+ return NULL; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- if (GBW == 0 || GBH == 0) { |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
- } |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; |
- m_pPause = pPause; |
- if(*pImage == NULL) { |
- JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
- } |
- if ((*pImage)->m_pData == NULL) { |
- delete *pImage; |
- *pImage = NULL; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
- return FXCODEC_STATUS_ERROR; |
- } |
- m_DecodeType = 1; |
- m_pImage = pImage; |
- (*m_pImage)->fill(0); |
- m_pArithDecoder = pArithDecoder; |
- m_gbContext = gbContext; |
- LTP = 0; |
- m_pLine = NULL; |
- m_loopIndex = 0; |
- return decode_Arith(pPause); |
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith( |
+ CJBig2_Image** pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ if (GBW == 0 || GBH == 0) { |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; |
+ m_pPause = pPause; |
+ if (*pImage == NULL) { |
+ JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
+ } |
+ if ((*pImage)->m_pData == NULL) { |
+ delete *pImage; |
+ *pImage = NULL; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
+ return FXCODEC_STATUS_ERROR; |
+ } |
+ m_DecodeType = 1; |
+ m_pImage = pImage; |
+ (*m_pImage)->fill(0); |
+ m_pArithDecoder = pArithDecoder; |
+ m_gbContext = gbContext; |
+ LTP = 0; |
+ m_pLine = NULL; |
+ m_loopIndex = 0; |
+ return decode_Arith(pPause); |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause) |
-{ |
- int iline = m_loopIndex; |
- CJBig2_Image* pImage = *m_pImage; |
- if(GBTEMPLATE == 0) { |
- if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1) |
- && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1) |
- && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2) |
- && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) { |
- m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder, m_gbContext, pPause); |
- } else { |
- m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDecoder, m_gbContext, pPause); |
- } |
- } else if(GBTEMPLATE == 1) { |
- if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) { |
- m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecoder, m_gbContext, pPause); |
- } else { |
- m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDecoder, m_gbContext, pPause); |
- } |
- } else if(GBTEMPLATE == 2) { |
- if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) { |
- m_ProssiveStatus = decode_Arith_Template2_opt3(pImage, m_pArithDecoder, m_gbContext, pPause); |
- } else { |
- m_ProssiveStatus = decode_Arith_Template2_unopt(pImage, m_pArithDecoder, m_gbContext, pPause); |
- } |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause) { |
+ int iline = m_loopIndex; |
+ CJBig2_Image* pImage = *m_pImage; |
+ if (GBTEMPLATE == 0) { |
+ if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1) && |
+ (GBAT[2] == (signed char)-3) && (GBAT[3] == (signed char)-1) && |
+ (GBAT[4] == 2) && (GBAT[5] == (signed char)-2) && |
+ (GBAT[6] == (signed char)-2) && (GBAT[7] == (signed char)-2)) { |
+ m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder, |
+ m_gbContext, pPause); |
} else { |
- if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) { |
- m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecoder, m_gbContext, pPause); |
- } else { |
- m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDecoder, m_gbContext, pPause); |
- } |
+ m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDecoder, |
+ m_gbContext, pPause); |
} |
- m_ReplaceRect.left = 0; |
- m_ReplaceRect.right = pImage->m_nWidth; |
- m_ReplaceRect.top = iline; |
- m_ReplaceRect.bottom = m_loopIndex; |
- if(m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) { |
- m_loopIndex = 0; |
- } |
- return m_ProssiveStatus; |
-} |
-FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- if(GBW == 0 || GBH == 0) { |
- * pImage = NULL; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
+ } else if (GBTEMPLATE == 1) { |
+ if ((GBAT[0] == 3) && (GBAT[1] == (signed char)-1)) { |
+ m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecoder, |
+ m_gbContext, pPause); |
+ } else { |
+ m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDecoder, |
+ m_gbContext, pPause); |
} |
- if(*pImage == NULL) { |
- JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
+ } else if (GBTEMPLATE == 2) { |
+ if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) { |
+ m_ProssiveStatus = decode_Arith_Template2_opt3(pImage, m_pArithDecoder, |
+ m_gbContext, pPause); |
+ } else { |
+ m_ProssiveStatus = decode_Arith_Template2_unopt(pImage, m_pArithDecoder, |
+ m_gbContext, pPause); |
} |
- if ((*pImage)->m_pData == NULL) { |
- delete *pImage; |
- *pImage = NULL; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
- return FXCODEC_STATUS_ERROR; |
+ } else { |
+ if ((GBAT[0] == 2) && (GBAT[1] == (signed char)-1)) { |
+ m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecoder, |
+ m_gbContext, pPause); |
+ } else { |
+ m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDecoder, |
+ m_gbContext, pPause); |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; |
- m_DecodeType = 2; |
- m_pPause = pPause; |
- m_pImage = pImage; |
- (*m_pImage)->fill(0); |
- LTP = 0; |
+ } |
+ m_ReplaceRect.left = 0; |
+ m_ReplaceRect.right = pImage->m_nWidth; |
+ m_ReplaceRect.top = iline; |
+ m_ReplaceRect.bottom = m_loopIndex; |
+ if (m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) { |
m_loopIndex = 0; |
- m_pArithDecoder = pArithDecoder; |
- m_gbContext = gbContext; |
- return decode_Arith_V2(pPause); |
+ } |
+ return m_ProssiveStatus; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause) |
-{ |
- FX_BOOL SLTP, bVal; |
- FX_DWORD CONTEXT; |
- CJBig2_Image *GBREG = *m_pImage; |
- FX_DWORD line1, line2, line3; |
- LTP = 0; |
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
- GBREG->fill(0); |
- for(; m_loopIndex < GBH; m_loopIndex++) { |
- if(TPGDON) { |
- switch(GBTEMPLATE) { |
- case 0: |
- CONTEXT = 0x9b25; |
- break; |
- case 1: |
- CONTEXT = 0x0795; |
- break; |
- case 2: |
- CONTEXT = 0x00e5; |
- break; |
- case 3: |
- CONTEXT = 0x0195; |
- break; |
- } |
- SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- GBREG->copyLine(m_loopIndex, m_loopIndex - 1); |
- } else { |
- switch(GBTEMPLATE) { |
- case 0: { |
- line1 = GBREG->getPixel(1, m_loopIndex - 2); |
- line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1; |
- line2 = GBREG->getPixel(2, m_loopIndex - 1); |
- line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1; |
- line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; |
- CONTEXT |= line2 << 5; |
- CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10; |
- CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11; |
- CONTEXT |= line1 << 12; |
- CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15; |
- bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, m_loopIndex, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f; |
- line3 = ((line3 << 1) | bVal) & 0x0f; |
- } |
- } |
- break; |
- case 1: { |
- line1 = GBREG->getPixel(2, m_loopIndex - 2); |
- line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1; |
- line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2; |
- line2 = GBREG->getPixel(2, m_loopIndex - 1); |
- line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1; |
- line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3; |
- CONTEXT |= line2 << 4; |
- CONTEXT |= line1 << 9; |
- bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, m_loopIndex, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 2)) & 0x0f; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f; |
- line3 = ((line3 << 1) | bVal) & 0x07; |
- } |
- } |
- break; |
- case 2: { |
- line1 = GBREG->getPixel(1, m_loopIndex - 2); |
- line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1; |
- line2 = GBREG->getPixel(1, m_loopIndex - 1); |
- line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2; |
- CONTEXT |= line2 << 3; |
- CONTEXT |= line1 << 7; |
- bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, m_loopIndex, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
- line2 = ((line2 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x0f; |
- line3 = ((line3 << 1) | bVal) & 0x03; |
- } |
- } |
- break; |
- case 3: { |
- line1 = GBREG->getPixel(1, m_loopIndex - 1); |
- line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1; |
- line2 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line2; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; |
- CONTEXT |= line1 << 5; |
- bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- GBREG->setPixel(w, m_loopIndex, bVal); |
- } |
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x1f; |
- line2 = ((line2 << 1) | bVal) & 0x0f; |
- } |
- } |
- break; |
- } |
- } |
- if(pPause && pPause->NeedToPauseNow()) { |
- m_loopIndex ++; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- } |
- } |
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2( |
+ CJBig2_Image** pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ if (GBW == 0 || GBH == 0) { |
+ *pImage = NULL; |
m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
return FXCODEC_STATUS_DECODE_FINISH; |
+ } |
+ if (*pImage == NULL) { |
+ JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
+ } |
+ if ((*pImage)->m_pData == NULL) { |
+ delete *pImage; |
+ *pImage = NULL; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
+ return FXCODEC_STATUS_ERROR; |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; |
+ m_DecodeType = 2; |
+ m_pPause = pPause; |
+ m_pImage = pImage; |
+ (*m_pImage)->fill(0); |
+ LTP = 0; |
+ m_loopIndex = 0; |
+ m_pArithDecoder = pArithDecoder; |
+ m_gbContext = gbContext; |
+ return decode_Arith_V2(pPause); |
} |
-FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- if(GBW == 0 || GBH == 0) { |
- * pImage = NULL; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
- } |
- if(*pImage == NULL) { |
- JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
- } |
- if ((*pImage)->m_pData == NULL) { |
- delete *pImage; |
- *pImage = NULL; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
- return FXCODEC_STATUS_ERROR; |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause) { |
+ FX_BOOL SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ CJBig2_Image* GBREG = *m_pImage; |
+ FX_DWORD line1, line2, line3; |
+ LTP = 0; |
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH)); |
+ GBREG->fill(0); |
+ for (; m_loopIndex < GBH; m_loopIndex++) { |
+ if (TPGDON) { |
+ switch (GBTEMPLATE) { |
+ case 0: |
+ CONTEXT = 0x9b25; |
+ break; |
+ case 1: |
+ CONTEXT = 0x0795; |
+ break; |
+ case 2: |
+ CONTEXT = 0x00e5; |
+ break; |
+ case 3: |
+ CONTEXT = 0x0195; |
+ break; |
+ } |
+ SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
+ LTP = LTP ^ SLTP; |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; |
- m_pPause = pPause; |
- m_pImage = pImage; |
- m_DecodeType = 3; |
- (*m_pImage)->fill(0); |
- LTP = 0; |
- m_loopIndex = 0; |
- m_pArithDecoder = pArithDecoder; |
- m_gbContext = gbContext; |
- return decode_Arith_V1(pPause); |
-} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause) |
-{ |
- FX_BOOL SLTP, bVal; |
- FX_DWORD CONTEXT = 0; |
- CJBig2_Image *GBREG = (*m_pImage); |
- for(; m_loopIndex < GBH; m_loopIndex++) { |
- if(TPGDON) { |
- switch(GBTEMPLATE) { |
- case 0: |
- CONTEXT = 0x9b25; |
- break; |
- case 1: |
- CONTEXT = 0x0795; |
- break; |
- case 2: |
- CONTEXT = 0x00e5; |
- break; |
- case 3: |
- CONTEXT = 0x0195; |
- break; |
+ if (LTP == 1) { |
+ GBREG->copyLine(m_loopIndex, m_loopIndex - 1); |
+ } else { |
+ switch (GBTEMPLATE) { |
+ case 0: { |
+ line1 = GBREG->getPixel(1, m_loopIndex - 2); |
+ line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1; |
+ line2 = GBREG->getPixel(2, m_loopIndex - 1); |
+ line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1; |
+ line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
+ bVal = 0; |
+ } else { |
+ CONTEXT = line3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
+ << 4; |
+ CONTEXT |= line2 << 5; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) |
+ << 10; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) |
+ << 11; |
+ CONTEXT |= line1 << 12; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) |
+ << 15; |
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
} |
- SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex - 1)); |
+ if (bVal) { |
+ GBREG->setPixel(w, m_loopIndex, bVal); |
} |
- } else { |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
- GBREG->setPixel(w, m_loopIndex, 0); |
- } else { |
- CONTEXT = 0; |
- switch(GBTEMPLATE) { |
- case 0: |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
- CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; |
- CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; |
- CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 5; |
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 6; |
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7; |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 8; |
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 9; |
- CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10; |
- CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11; |
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 12; |
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13; |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 14; |
- CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15; |
- break; |
- case 1: |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
- CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3; |
- CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 4; |
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5; |
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6; |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7; |
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8; |
- CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) << 9; |
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 10; |
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11; |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 12; |
- break; |
- case 2: |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2; |
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 3; |
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4; |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 5; |
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 6; |
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 7; |
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8; |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 9; |
- break; |
- case 3: |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
- CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; |
- CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3; |
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; |
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5; |
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6; |
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7; |
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8; |
- CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) << 9; |
- break; |
- } |
- bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
- GBREG->setPixel(w, m_loopIndex, bVal); |
- } |
+ line1 = |
+ ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
+ line2 = |
+ ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f; |
+ line3 = ((line3 << 1) | bVal) & 0x0f; |
+ } |
+ } break; |
+ case 1: { |
+ line1 = GBREG->getPixel(2, m_loopIndex - 2); |
+ line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1; |
+ line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2; |
+ line2 = GBREG->getPixel(2, m_loopIndex - 1); |
+ line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1; |
+ line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
+ bVal = 0; |
+ } else { |
+ CONTEXT = line3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
+ << 3; |
+ CONTEXT |= line2 << 4; |
+ CONTEXT |= line1 << 9; |
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
} |
- } |
- if(pPause && pPause->NeedToPauseNow()) { |
- m_loopIndex ++; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- } |
- } |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
-} |
-FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause) |
-{ |
- int bitpos, i; |
- JBIG2_ALLOC((* pImage), CJBig2_Image(GBW, GBH)); |
- if ((* pImage)->m_pData == NULL) { |
- delete (* pImage); |
- (* pImage) = NULL; |
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH); |
- m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
- return m_ProssiveStatus; |
+ if (bVal) { |
+ GBREG->setPixel(w, m_loopIndex, bVal); |
+ } |
+ line1 = |
+ ((line1 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 2)) & 0x0f; |
+ line2 = |
+ ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f; |
+ line3 = ((line3 << 1) | bVal) & 0x07; |
+ } |
+ } break; |
+ case 2: { |
+ line1 = GBREG->getPixel(1, m_loopIndex - 2); |
+ line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1; |
+ line2 = GBREG->getPixel(1, m_loopIndex - 1); |
+ line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
+ bVal = 0; |
+ } else { |
+ CONTEXT = line3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
+ << 2; |
+ CONTEXT |= line2 << 3; |
+ CONTEXT |= line1 << 7; |
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
+ } |
+ if (bVal) { |
+ GBREG->setPixel(w, m_loopIndex, bVal); |
+ } |
+ line1 = |
+ ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
+ line2 = |
+ ((line2 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x0f; |
+ line3 = ((line3 << 1) | bVal) & 0x03; |
+ } |
+ } break; |
+ case 3: { |
+ line1 = GBREG->getPixel(1, m_loopIndex - 1); |
+ line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1; |
+ line2 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
+ bVal = 0; |
+ } else { |
+ CONTEXT = line2; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
+ << 4; |
+ CONTEXT |= line1 << 5; |
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
+ } |
+ if (bVal) { |
+ GBREG->setPixel(w, m_loopIndex, bVal); |
+ } |
+ line1 = |
+ ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x1f; |
+ line2 = ((line2 << 1) | bVal) & 0x0f; |
+ } |
+ } break; |
+ } |
} |
- bitpos = (int)pStream->getBitPos(); |
- _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, (* pImage)->m_pData, GBW, GBH, (* pImage)->m_nStride); |
- pStream->setBitPos(bitpos); |
- for(i = 0; (FX_DWORD)i < (* pImage)->m_nStride * GBH; i++) { |
- (* pImage)->m_pData[i] = ~(* pImage)->m_pData[i]; |
+ if (pPause && pPause->NeedToPauseNow()) { |
+ m_loopIndex++; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return m_ProssiveStatus; |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_MMR() |
-{ |
- return m_ProssiveStatus; |
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1( |
+ CJBig2_Image** pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ if (GBW == 0 || GBH == 0) { |
+ *pImage = NULL; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
+ } |
+ if (*pImage == NULL) { |
+ JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
+ } |
+ if ((*pImage)->m_pData == NULL) { |
+ delete *pImage; |
+ *pImage = NULL; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
+ return FXCODEC_STATUS_ERROR; |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; |
+ m_pPause = pPause; |
+ m_pImage = pImage; |
+ m_DecodeType = 3; |
+ (*m_pImage)->fill(0); |
+ LTP = 0; |
+ m_loopIndex = 0; |
+ m_pArithDecoder = pArithDecoder; |
+ m_gbContext = gbContext; |
+ return decode_Arith_V1(pPause); |
} |
-FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause) |
-{ |
- if(m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
- return m_ProssiveStatus; |
- } |
- switch (m_DecodeType) { |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause) { |
+ FX_BOOL SLTP, bVal; |
+ FX_DWORD CONTEXT = 0; |
+ CJBig2_Image* GBREG = (*m_pImage); |
+ for (; m_loopIndex < GBH; m_loopIndex++) { |
+ if (TPGDON) { |
+ switch (GBTEMPLATE) { |
+ case 0: |
+ CONTEXT = 0x9b25; |
+ break; |
case 1: |
- return decode_Arith(pPause); |
+ CONTEXT = 0x0795; |
+ break; |
case 2: |
- return decode_Arith_V2(pPause); |
+ CONTEXT = 0x00e5; |
+ break; |
case 3: |
- return decode_Arith_V1(pPause); |
- case 4: |
- return decode_MMR(); |
+ CONTEXT = 0x0195; |
+ break; |
+ } |
+ SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex - 1)); |
+ } |
+ } else { |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
+ GBREG->setPixel(w, m_loopIndex, 0); |
+ } else { |
+ CONTEXT = 0; |
+ switch (GBTEMPLATE) { |
+ case 0: |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; |
+ CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
+ << 4; |
+ CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 5; |
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 6; |
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7; |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 8; |
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 9; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) |
+ << 10; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) |
+ << 11; |
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 12; |
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13; |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 14; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) |
+ << 15; |
+ break; |
+ case 1: |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
+ << 3; |
+ CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 4; |
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5; |
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6; |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7; |
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8; |
+ CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) << 9; |
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 10; |
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11; |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 12; |
+ break; |
+ case 2: |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
+ << 2; |
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 3; |
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4; |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 5; |
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 6; |
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 7; |
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8; |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 9; |
+ break; |
+ case 3: |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex); |
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1; |
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2; |
+ CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3; |
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) |
+ << 4; |
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5; |
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6; |
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7; |
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8; |
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) << 9; |
+ break; |
+ } |
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]); |
+ GBREG->setPixel(w, m_loopIndex, bVal); |
+ } |
+ } |
} |
+ if (pPause && pPause->NeedToPauseNow()) { |
+ m_loopIndex++; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ } |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
+} |
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, |
+ CJBig2_BitStream* pStream, |
+ IFX_Pause* pPause) { |
+ int bitpos, i; |
+ JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH)); |
+ if ((*pImage)->m_pData == NULL) { |
+ delete (*pImage); |
+ (*pImage) = NULL; |
+ m_pModule->JBig2_Error( |
+ "Generic region decoding procedure: Create Image Failed with width = " |
+ "%d, height = %d\n", |
+ GBW, GBH); |
m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
return m_ProssiveStatus; |
+ } |
+ bitpos = (int)pStream->getBitPos(); |
+ _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, |
+ (*pImage)->m_pData, GBW, GBH, (*pImage)->m_nStride); |
+ pStream->setBitPos(bitpos); |
+ for (i = 0; (FX_DWORD)i < (*pImage)->m_nStride * GBH; i++) { |
+ (*pImage)->m_pData[i] = ~(*pImage)->m_pData[i]; |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return m_ProssiveStatus; |
+} |
+FXCODEC_STATUS CJBig2_GRDProc::decode_MMR() { |
+ return m_ProssiveStatus; |
+} |
+FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause) { |
+ if (m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
+ return m_ProssiveStatus; |
+ } |
+ switch (m_DecodeType) { |
+ case 1: |
+ return decode_Arith(pPause); |
+ case 2: |
+ return decode_Arith_V2(pPause); |
+ case 3: |
+ return decode_Arith_V1(pPause); |
+ case 4: |
+ return decode_MMR(); |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR; |
+ return m_ProssiveStatus; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- FX_BOOL SLTP, bVal; |
- FX_DWORD CONTEXT; |
- FX_DWORD line1, line2; |
- uint8_t *pLine1, *pLine2, cVal; |
- int32_t nStride, nStride2, k; |
- int32_t nLineBytes, nBitsLeft, cc; |
- if(m_pLine == NULL) { |
- m_pLine = pImage->m_pData; |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3( |
+ CJBig2_Image* pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_BOOL SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ FX_DWORD line1, line2; |
+ uint8_t *pLine1, *pLine2, cVal; |
+ int32_t nStride, nStride2, k; |
+ int32_t nLineBytes, nBitsLeft, cc; |
+ if (m_pLine == NULL) { |
+ m_pLine = pImage->m_pData; |
+ } |
+ nStride = pImage->m_nStride; |
+ nStride2 = nStride << 1; |
+ nLineBytes = ((GBW + 7) >> 3) - 1; |
+ nBitsLeft = GBW - (nLineBytes << 3); |
+ FX_DWORD height = GBH & 0x7fffffff; |
+ for (; m_loopIndex < height; m_loopIndex++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
+ LTP = LTP ^ SLTP; |
} |
- nStride = pImage->m_nStride; |
- nStride2 = nStride << 1; |
- nLineBytes = ((GBW + 7) >> 3) - 1; |
- nBitsLeft = GBW - (nLineBytes << 3); |
- FX_DWORD height = GBH & 0x7fffffff; |
- for(; m_loopIndex < height; m_loopIndex++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
- LTP = LTP ^ SLTP; |
+ if (LTP == 1) { |
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
+ } else { |
+ if (m_loopIndex > 1) { |
+ pLine1 = m_pLine - nStride2; |
+ pLine2 = m_pLine - nStride; |
+ line1 = (*pLine1++) << 6; |
+ line2 = *pLine2++; |
+ CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ line1 = (line1 << 8) | ((*pLine1++) << 6); |
+ line2 = (line2 << 8) | (*pLine2++); |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | |
+ ((line1 >> k) & 0x0800) | ((line2 >> k) & 0x0010)); |
+ } |
+ m_pLine[cc] = cVal; |
} |
- if(LTP == 1) { |
- pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
- } else { |
- if(m_loopIndex > 1) { |
- pLine1 = m_pLine - nStride2; |
- pLine2 = m_pLine - nStride; |
- line1 = (*pLine1++) << 6; |
- line2 = *pLine2++; |
- CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); |
- for(cc = 0; cc < nLineBytes; cc++) { |
- line1 = (line1 << 8) | ((*pLine1++) << 6); |
- line2 = (line2 << 8) | (*pLine2++); |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
- | ((line1 >> k) & 0x0800) |
- | ((line2 >> k) & 0x0010)); |
- } |
- m_pLine[cc] = cVal; |
- } |
- line1 <<= 8; |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
- | ((line1 >> (7 - k)) & 0x0800) |
- | ((line2 >> (7 - k)) & 0x0010)); |
- } |
- m_pLine[nLineBytes] = cVal; |
- } else { |
- pLine2 = m_pLine - nStride; |
- line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; |
- CONTEXT = (line2 & 0x07f0); |
- for(cc = 0; cc < nLineBytes; cc++) { |
- if(m_loopIndex & 1) { |
- line2 = (line2 << 8) | (*pLine2++); |
- } |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
- | ((line2 >> k) & 0x0010)); |
- } |
- m_pLine[cc] = cVal; |
- } |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal |
- | ((line2 >> (7 - k)) & 0x0010)); |
- } |
- m_pLine[nLineBytes] = cVal; |
- } |
+ line1 <<= 8; |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = |
+ (((CONTEXT & 0x7bf7) << 1) | bVal | |
+ ((line1 >> (7 - k)) & 0x0800) | ((line2 >> (7 - k)) & 0x0010)); |
} |
- m_pLine += nStride; |
- if(pPause && pPause->NeedToPauseNow()) { |
- m_loopIndex++; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ m_pLine[nLineBytes] = cVal; |
+ } else { |
+ pLine2 = m_pLine - nStride; |
+ line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; |
+ CONTEXT = (line2 & 0x07f0); |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ if (m_loopIndex & 1) { |
+ line2 = (line2 << 8) | (*pLine2++); |
+ } |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = |
+ (((CONTEXT & 0x7bf7) << 1) | bVal | ((line2 >> k) & 0x0010)); |
+ } |
+ m_pLine[cc] = cVal; |
} |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | |
+ ((line2 >> (7 - k)) & 0x0010)); |
+ } |
+ m_pLine[nLineBytes] = cVal; |
+ } |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
+ m_pLine += nStride; |
+ if (pPause && pPause->NeedToPauseNow()) { |
+ m_loopIndex++; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ } |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- FX_BOOL SLTP, bVal; |
- FX_DWORD CONTEXT; |
- FX_DWORD line1, line2, line3; |
- for(; m_loopIndex < GBH; m_loopIndex++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt( |
+ CJBig2_Image* pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_BOOL SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ FX_DWORD line1, line2, line3; |
+ for (; m_loopIndex < GBH; m_loopIndex++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
+ } else { |
+ line1 = pImage->getPixel(1, m_loopIndex - 2); |
+ line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; |
+ line2 = pImage->getPixel(2, m_loopIndex - 1); |
+ line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1; |
+ line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
+ bVal = 0; |
} else { |
- line1 = pImage->getPixel(1, m_loopIndex - 2); |
- line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; |
- line2 = pImage->getPixel(2, m_loopIndex - 1); |
- line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1; |
- line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; |
- CONTEXT |= line2 << 5; |
- CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10; |
- CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11; |
- CONTEXT |= line1 << 12; |
- CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- pImage->setPixel(w, m_loopIndex, bVal); |
- } |
- line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
- line2 = ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)) & 0x1f; |
- line3 = ((line3 << 1) | bVal) & 0x0f; |
- } |
+ CONTEXT = line3; |
+ CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; |
+ CONTEXT |= line2 << 5; |
+ CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10; |
+ CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11; |
+ CONTEXT |= line1 << 12; |
+ CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
} |
- if(pPause && pPause->NeedToPauseNow()) { |
- m_loopIndex++; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ if (bVal) { |
+ pImage->setPixel(w, m_loopIndex, bVal); |
} |
+ line1 = |
+ ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
+ line2 = |
+ ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)) & 0x1f; |
+ line3 = ((line3 << 1) | bVal) & 0x0f; |
+ } |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
+ if (pPause && pPause->NeedToPauseNow()) { |
+ m_loopIndex++; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ } |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- FX_BOOL SLTP, bVal; |
- FX_DWORD CONTEXT; |
- FX_DWORD line1, line2; |
- uint8_t *pLine1, *pLine2, cVal; |
- int32_t nStride, nStride2, k; |
- int32_t nLineBytes, nBitsLeft, cc; |
- if (!m_pLine) { |
- m_pLine = pImage->m_pData; |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3( |
+ CJBig2_Image* pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_BOOL SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ FX_DWORD line1, line2; |
+ uint8_t *pLine1, *pLine2, cVal; |
+ int32_t nStride, nStride2, k; |
+ int32_t nLineBytes, nBitsLeft, cc; |
+ if (!m_pLine) { |
+ m_pLine = pImage->m_pData; |
+ } |
+ nStride = pImage->m_nStride; |
+ nStride2 = nStride << 1; |
+ nLineBytes = ((GBW + 7) >> 3) - 1; |
+ nBitsLeft = GBW - (nLineBytes << 3); |
+ for (; m_loopIndex < GBH; m_loopIndex++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
+ LTP = LTP ^ SLTP; |
} |
- nStride = pImage->m_nStride; |
- nStride2 = nStride << 1; |
- nLineBytes = ((GBW + 7) >> 3) - 1; |
- nBitsLeft = GBW - (nLineBytes << 3); |
- for(; m_loopIndex < GBH; m_loopIndex++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
- LTP = LTP ^ SLTP; |
+ if (LTP == 1) { |
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
+ } else { |
+ if (m_loopIndex > 1) { |
+ pLine1 = m_pLine - nStride2; |
+ pLine2 = m_pLine - nStride; |
+ line1 = (*pLine1++) << 4; |
+ line2 = *pLine2++; |
+ CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ line1 = (line1 << 8) | ((*pLine1++) << 4); |
+ line2 = (line2 << 8) | (*pLine2++); |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
+ ((line1 >> k) & 0x0200) | ((line2 >> (k + 1)) & 0x0008); |
+ } |
+ m_pLine[cc] = cVal; |
} |
- if(LTP == 1) { |
- pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
- } else { |
- if(m_loopIndex > 1) { |
- pLine1 = m_pLine - nStride2; |
- pLine2 = m_pLine - nStride; |
- line1 = (*pLine1++) << 4; |
- line2 = *pLine2++; |
- CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); |
- for(cc = 0; cc < nLineBytes; cc++) { |
- line1 = (line1 << 8) | ((*pLine1++) << 4); |
- line2 = (line2 << 8) | (*pLine2++); |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
- | ((line1 >> k) & 0x0200) |
- | ((line2 >> (k + 1)) & 0x0008); |
- } |
- m_pLine[cc] = cVal; |
- } |
- line1 <<= 8; |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
- | ((line1 >> (7 - k)) & 0x0200) |
- | ((line2 >> (8 - k)) & 0x0008); |
- } |
- m_pLine[nLineBytes] = cVal; |
- } else { |
- pLine2 = m_pLine - nStride; |
- line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; |
- CONTEXT = (line2 >> 1) & 0x01f8; |
- for(cc = 0; cc < nLineBytes; cc++) { |
- if(m_loopIndex & 1) { |
- line2 = (line2 << 8) | (*pLine2++); |
- } |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
- | ((line2 >> (k + 1)) & 0x0008); |
- } |
- m_pLine[cc] = cVal; |
- } |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal |
- | ((line2 >> (8 - k)) & 0x0008); |
- } |
- m_pLine[nLineBytes] = cVal; |
- } |
+ line1 <<= 8; |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
+ ((line1 >> (7 - k)) & 0x0200) | |
+ ((line2 >> (8 - k)) & 0x0008); |
+ } |
+ m_pLine[nLineBytes] = cVal; |
+ } else { |
+ pLine2 = m_pLine - nStride; |
+ line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; |
+ CONTEXT = (line2 >> 1) & 0x01f8; |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ if (m_loopIndex & 1) { |
+ line2 = (line2 << 8) | (*pLine2++); |
+ } |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | |
+ ((line2 >> (k + 1)) & 0x0008); |
+ } |
+ m_pLine[cc] = cVal; |
} |
- m_pLine += nStride; |
- if(pPause && pPause->NeedToPauseNow()) { |
- m_loopIndex++; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = |
+ ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008); |
} |
+ m_pLine[nLineBytes] = cVal; |
+ } |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
+ m_pLine += nStride; |
+ if (pPause && pPause->NeedToPauseNow()) { |
+ m_loopIndex++; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ } |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- FX_BOOL SLTP, bVal; |
- FX_DWORD CONTEXT; |
- FX_DWORD line1, line2, line3; |
- for(FX_DWORD h = 0; h < GBH; h++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- pImage->copyLine(h, h - 1); |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt( |
+ CJBig2_Image* pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_BOOL SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ FX_DWORD line1, line2, line3; |
+ for (FX_DWORD h = 0; h < GBH; h++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ pImage->copyLine(h, h - 1); |
+ } else { |
+ line1 = pImage->getPixel(2, h - 2); |
+ line1 |= pImage->getPixel(1, h - 2) << 1; |
+ line1 |= pImage->getPixel(0, h - 2) << 2; |
+ line2 = pImage->getPixel(2, h - 1); |
+ line2 |= pImage->getPixel(1, h - 1) << 1; |
+ line2 |= pImage->getPixel(0, h - 1) << 2; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, h)) { |
+ bVal = 0; |
} else { |
- line1 = pImage->getPixel(2, h - 2); |
- line1 |= pImage->getPixel(1, h - 2) << 1; |
- line1 |= pImage->getPixel(0, h - 2) << 2; |
- line2 = pImage->getPixel(2, h - 1); |
- line2 |= pImage->getPixel(1, h - 1) << 1; |
- line2 |= pImage->getPixel(0, h - 1) << 2; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, h)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
- CONTEXT |= line2 << 4; |
- CONTEXT |= line1 << 9; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- pImage->setPixel(w, h, bVal); |
- } |
- line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f; |
- line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f; |
- line3 = ((line3 << 1) | bVal) & 0x07; |
- } |
+ CONTEXT = line3; |
+ CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3; |
+ CONTEXT |= line2 << 4; |
+ CONTEXT |= line1 << 9; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
} |
- if(pPause && pPause->NeedToPauseNow()) { |
- m_loopIndex++; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ if (bVal) { |
+ pImage->setPixel(w, h, bVal); |
} |
+ line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f; |
+ line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f; |
+ line3 = ((line3 << 1) | bVal) & 0x07; |
+ } |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
+ if (pPause && pPause->NeedToPauseNow()) { |
+ m_loopIndex++; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ } |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- FX_BOOL SLTP, bVal; |
- FX_DWORD CONTEXT; |
- FX_DWORD line1, line2; |
- uint8_t *pLine1, *pLine2, cVal; |
- int32_t nStride, nStride2, k; |
- int32_t nLineBytes, nBitsLeft, cc; |
- if(!m_pLine) { |
- m_pLine = pImage->m_pData; |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3( |
+ CJBig2_Image* pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_BOOL SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ FX_DWORD line1, line2; |
+ uint8_t *pLine1, *pLine2, cVal; |
+ int32_t nStride, nStride2, k; |
+ int32_t nLineBytes, nBitsLeft, cc; |
+ if (!m_pLine) { |
+ m_pLine = pImage->m_pData; |
+ } |
+ nStride = pImage->m_nStride; |
+ nStride2 = nStride << 1; |
+ nLineBytes = ((GBW + 7) >> 3) - 1; |
+ nBitsLeft = GBW - (nLineBytes << 3); |
+ for (; m_loopIndex < GBH; m_loopIndex++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
+ LTP = LTP ^ SLTP; |
} |
- nStride = pImage->m_nStride; |
- nStride2 = nStride << 1; |
- nLineBytes = ((GBW + 7) >> 3) - 1; |
- nBitsLeft = GBW - (nLineBytes << 3); |
- for(; m_loopIndex < GBH; m_loopIndex++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
- LTP = LTP ^ SLTP; |
+ if (LTP == 1) { |
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
+ } else { |
+ if (m_loopIndex > 1) { |
+ pLine1 = m_pLine - nStride2; |
+ pLine2 = m_pLine - nStride; |
+ line1 = (*pLine1++) << 1; |
+ line2 = *pLine2++; |
+ CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ line1 = (line1 << 8) | ((*pLine1++) << 1); |
+ line2 = (line2 << 8) | (*pLine2++); |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
+ ((line1 >> k) & 0x0080) | ((line2 >> (k + 3)) & 0x0004); |
+ } |
+ m_pLine[cc] = cVal; |
} |
- if(LTP == 1) { |
- pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
- } else { |
- if(m_loopIndex > 1) { |
- pLine1 = m_pLine - nStride2; |
- pLine2 = m_pLine - nStride; |
- line1 = (*pLine1++) << 1; |
- line2 = *pLine2++; |
- CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); |
- for(cc = 0; cc < nLineBytes; cc++) { |
- line1 = (line1 << 8) | ((*pLine1++) << 1); |
- line2 = (line2 << 8) | (*pLine2++); |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
- | ((line1 >> k) & 0x0080) |
- | ((line2 >> (k + 3)) & 0x0004); |
- } |
- m_pLine[cc] = cVal; |
- } |
- line1 <<= 8; |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
- | ((line1 >> (7 - k)) & 0x0080) |
- | ((line2 >> (10 - k)) & 0x0004); |
- } |
- m_pLine[nLineBytes] = cVal; |
- } else { |
- pLine2 = m_pLine - nStride; |
- line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; |
- CONTEXT = (line2 >> 3) & 0x007c; |
- for(cc = 0; cc < nLineBytes; cc++) { |
- if(m_loopIndex & 1) { |
- line2 = (line2 << 8) | (*pLine2++); |
- } |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
- | ((line2 >> (k + 3)) & 0x0004); |
- } |
- m_pLine[cc] = cVal; |
- } |
- line2 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal |
- | (((line2 >> (10 - k))) & 0x0004); |
- } |
- m_pLine[nLineBytes] = cVal; |
- } |
+ line1 <<= 8; |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
+ ((line1 >> (7 - k)) & 0x0080) | |
+ ((line2 >> (10 - k)) & 0x0004); |
} |
- m_pLine += nStride; |
- if(pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) { |
- m_loopIndex++; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ m_pLine[nLineBytes] = cVal; |
+ } else { |
+ pLine2 = m_pLine - nStride; |
+ line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; |
+ CONTEXT = (line2 >> 3) & 0x007c; |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ if (m_loopIndex & 1) { |
+ line2 = (line2 << 8) | (*pLine2++); |
+ } |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
+ ((line2 >> (k + 3)) & 0x0004); |
+ } |
+ m_pLine[cc] = cVal; |
} |
+ line2 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | |
+ (((line2 >> (10 - k))) & 0x0004); |
+ } |
+ m_pLine[nLineBytes] = cVal; |
+ } |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
+ m_pLine += nStride; |
+ if (pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) { |
+ m_loopIndex++; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ } |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- FX_BOOL SLTP, bVal; |
- FX_DWORD CONTEXT; |
- FX_DWORD line1, line2, line3; |
- for(; m_loopIndex < GBH; m_loopIndex++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt( |
+ CJBig2_Image* pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_BOOL SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ FX_DWORD line1, line2, line3; |
+ for (; m_loopIndex < GBH; m_loopIndex++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
+ } else { |
+ line1 = pImage->getPixel(1, m_loopIndex - 2); |
+ line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; |
+ line2 = pImage->getPixel(1, m_loopIndex - 1); |
+ line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1; |
+ line3 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
+ bVal = 0; |
} else { |
- line1 = pImage->getPixel(1, m_loopIndex - 2); |
- line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; |
- line2 = pImage->getPixel(1, m_loopIndex - 1); |
- line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1; |
- line3 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line3; |
- CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2; |
- CONTEXT |= line2 << 3; |
- CONTEXT |= line1 << 7; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- pImage->setPixel(w, m_loopIndex, bVal); |
- } |
- line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
- line2 = ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x0f; |
- line3 = ((line3 << 1) | bVal) & 0x03; |
- } |
+ CONTEXT = line3; |
+ CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2; |
+ CONTEXT |= line2 << 3; |
+ CONTEXT |= line1 << 7; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
} |
- if(pPause && pPause->NeedToPauseNow()) { |
- m_loopIndex++; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ if (bVal) { |
+ pImage->setPixel(w, m_loopIndex, bVal); |
} |
+ line1 = |
+ ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07; |
+ line2 = |
+ ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x0f; |
+ line3 = ((line3 << 1) | bVal) & 0x03; |
+ } |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
+ if (pPause && pPause->NeedToPauseNow()) { |
+ m_loopIndex++; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ } |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- FX_BOOL SLTP, bVal; |
- FX_DWORD CONTEXT; |
- FX_DWORD line1; |
- uint8_t *pLine1, cVal; |
- int32_t nStride, k; |
- int32_t nLineBytes, nBitsLeft, cc; |
- if (!m_pLine) { |
- m_pLine = pImage->m_pData; |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3( |
+ CJBig2_Image* pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_BOOL SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ FX_DWORD line1; |
+ uint8_t *pLine1, cVal; |
+ int32_t nStride, k; |
+ int32_t nLineBytes, nBitsLeft, cc; |
+ if (!m_pLine) { |
+ m_pLine = pImage->m_pData; |
+ } |
+ nStride = pImage->m_nStride; |
+ nLineBytes = ((GBW + 7) >> 3) - 1; |
+ nBitsLeft = GBW - (nLineBytes << 3); |
+ for (; m_loopIndex < GBH; m_loopIndex++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
+ LTP = LTP ^ SLTP; |
} |
- nStride = pImage->m_nStride; |
- nLineBytes = ((GBW + 7) >> 3) - 1; |
- nBitsLeft = GBW - (nLineBytes << 3); |
- for(; m_loopIndex < GBH; m_loopIndex++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
- LTP = LTP ^ SLTP; |
+ if (LTP == 1) { |
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
+ } else { |
+ if (m_loopIndex > 0) { |
+ pLine1 = m_pLine - nStride; |
+ line1 = *pLine1++; |
+ CONTEXT = (line1 >> 1) & 0x03f0; |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ line1 = (line1 << 8) | (*pLine1++); |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | |
+ ((line1 >> (k + 1)) & 0x0010); |
+ } |
+ m_pLine[cc] = cVal; |
} |
- if(LTP == 1) { |
- pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
- } else { |
- if(m_loopIndex > 0) { |
- pLine1 = m_pLine - nStride; |
- line1 = *pLine1++; |
- CONTEXT = (line1 >> 1) & 0x03f0; |
- for(cc = 0; cc < nLineBytes; cc++) { |
- line1 = (line1 << 8) | (*pLine1++); |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal |
- | ((line1 >> (k + 1)) & 0x0010); |
- } |
- m_pLine[cc] = cVal; |
- } |
- line1 <<= 8; |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal |
- | ((line1 >> (8 - k)) & 0x0010); |
- } |
- m_pLine[nLineBytes] = cVal; |
- } else { |
- CONTEXT = 0; |
- for(cc = 0; cc < nLineBytes; cc++) { |
- cVal = 0; |
- for(k = 7; k >= 0; k--) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << k; |
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
- } |
- m_pLine[cc] = cVal; |
- } |
- cVal = 0; |
- for(k = 0; k < nBitsLeft; k++) { |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- cVal |= bVal << (7 - k); |
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
- } |
- m_pLine[nLineBytes] = cVal; |
- } |
+ line1 <<= 8; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = |
+ ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010); |
+ } |
+ m_pLine[nLineBytes] = cVal; |
+ } else { |
+ CONTEXT = 0; |
+ for (cc = 0; cc < nLineBytes; cc++) { |
+ cVal = 0; |
+ for (k = 7; k >= 0; k--) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << k; |
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
+ } |
+ m_pLine[cc] = cVal; |
} |
- m_pLine += nStride; |
- if(pPause && pPause->NeedToPauseNow()) { |
- m_loopIndex++; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ cVal = 0; |
+ for (k = 0; k < nBitsLeft; k++) { |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
+ cVal |= bVal << (7 - k); |
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; |
} |
+ m_pLine[nLineBytes] = cVal; |
+ } |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
+ m_pLine += nStride; |
+ if (pPause && pPause->NeedToPauseNow()) { |
+ m_loopIndex++; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ } |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
} |
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause) |
-{ |
- FX_BOOL SLTP, bVal; |
- FX_DWORD CONTEXT; |
- FX_DWORD line1, line2; |
- for(; m_loopIndex < GBH; m_loopIndex++) { |
- if(TPGDON) { |
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
- LTP = LTP ^ SLTP; |
- } |
- if(LTP == 1) { |
- pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt( |
+ CJBig2_Image* pImage, |
+ CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_BOOL SLTP, bVal; |
+ FX_DWORD CONTEXT; |
+ FX_DWORD line1, line2; |
+ for (; m_loopIndex < GBH; m_loopIndex++) { |
+ if (TPGDON) { |
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]); |
+ LTP = LTP ^ SLTP; |
+ } |
+ if (LTP == 1) { |
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1); |
+ } else { |
+ line1 = pImage->getPixel(1, m_loopIndex - 1); |
+ line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1; |
+ line2 = 0; |
+ for (FX_DWORD w = 0; w < GBW; w++) { |
+ if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
+ bVal = 0; |
} else { |
- line1 = pImage->getPixel(1, m_loopIndex - 1); |
- line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1; |
- line2 = 0; |
- for(FX_DWORD w = 0; w < GBW; w++) { |
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) { |
- bVal = 0; |
- } else { |
- CONTEXT = line2; |
- CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; |
- CONTEXT |= line1 << 5; |
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
- } |
- if(bVal) { |
- pImage->setPixel(w, m_loopIndex, bVal); |
- } |
- line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x1f; |
- line2 = ((line2 << 1) | bVal) & 0x0f; |
- } |
+ CONTEXT = line2; |
+ CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; |
+ CONTEXT |= line1 << 5; |
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); |
} |
- if(pPause && pPause->NeedToPauseNow()) { |
- m_loopIndex++; |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
- return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ if (bVal) { |
+ pImage->setPixel(w, m_loopIndex, bVal); |
} |
+ line1 = |
+ ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x1f; |
+ line2 = ((line2 << 1) | bVal) & 0x0f; |
+ } |
} |
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
- return FXCODEC_STATUS_DECODE_FINISH; |
+ if (pPause && pPause->NeedToPauseNow()) { |
+ m_loopIndex++; |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE; |
+ } |
+ } |
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
+ return FXCODEC_STATUS_DECODE_FINISH; |
} |