diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/fxcodec/jbig2/JBig2_GrdProc.cpp | 288 | ||||
-rw-r--r-- | core/fxcodec/jbig2/JBig2_GrdProc.h | 11 |
2 files changed, 59 insertions, 240 deletions
diff --git a/core/fxcodec/jbig2/JBig2_GrdProc.cpp b/core/fxcodec/jbig2/JBig2_GrdProc.cpp index 054bfc5c15..421cdddb79 100644 --- a/core/fxcodec/jbig2/JBig2_GrdProc.cpp +++ b/core/fxcodec/jbig2/JBig2_GrdProc.cpp @@ -17,6 +17,20 @@ #include "core/fxcrt/pauseindicator_iface.h" #include "third_party/base/ptr_util.h" +namespace { + +// TODO(npm): Name this constants better or merge some together. +constexpr int kOptConstant1[] = {0x9b25, 0x0795, 0x00e5}; +constexpr int kOptConstant2[] = {6, 4, 1}; +constexpr int kOptConstant3[] = {0xf800, 0x1e00, 0x0380}; +constexpr int kOptConstant4[] = {0, 1, 3}; +constexpr int kOptConstant5[] = {0x07f0, 0x01f8, 0x007c}; +constexpr int kOptConstant6[] = {0x7bf7, 0x0efb, 0x01bd}; +constexpr int kOptConstant7[] = {0x0800, 0x0200, 0x0080}; +constexpr int kOptConstant8[] = {0x0010, 0x0008, 0x0004}; + +} // namespace + CJBig2_GRDProc::CJBig2_GRDProc() {} CJBig2_GRDProc::~CJBig2_GRDProc() {} @@ -41,33 +55,30 @@ std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArith( if (!CJBig2_Image::IsValidImageSize(GBW, GBH)) return pdfium::MakeUnique<CJBig2_Image>(GBW, GBH); - using DecodeFunction = std::function<std::unique_ptr<CJBig2_Image>( - CJBig2_GRDProc&, CJBig2_ArithDecoder*, JBig2ArithCtx*)>; - DecodeFunction func; switch (GBTEMPLATE) { case 0: - func = UseTemplate0Opt3() ? &CJBig2_GRDProc::DecodeArithTemplate0Opt3 - : &CJBig2_GRDProc::DecodeArithTemplate0Unopt; - break; + return UseTemplate0Opt3() + ? DecodeArithOpt3(pArithDecoder, gbContext, 0) + : DecodeArithTemplate0Unopt(pArithDecoder, gbContext); case 1: - func = UseTemplate1Opt3() ? &CJBig2_GRDProc::DecodeArithTemplate1Opt3 - : &CJBig2_GRDProc::DecodeArithTemplate1Unopt; - break; + return UseTemplate1Opt3() + ? DecodeArithOpt3(pArithDecoder, gbContext, 1) + : DecodeArithTemplate1Unopt(pArithDecoder, gbContext); case 2: - func = UseTemplate23Opt3() ? &CJBig2_GRDProc::DecodeArithTemplate2Opt3 - : &CJBig2_GRDProc::DecodeArithTemplate2Unopt; - break; + return UseTemplate23Opt3() + ? DecodeArithOpt3(pArithDecoder, gbContext, 2) + : DecodeArithTemplate2Unopt(pArithDecoder, gbContext); default: - func = UseTemplate23Opt3() ? &CJBig2_GRDProc::DecodeArithTemplate3Opt3 - : &CJBig2_GRDProc::DecodeArithTemplate3Unopt; - break; + return UseTemplate23Opt3() + ? DecodeArithTemplate3Opt3(pArithDecoder, gbContext) + : DecodeArithTemplate3Unopt(pArithDecoder, gbContext); } - return func(*this, pArithDecoder, gbContext); } -std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArithTemplate0Opt3( +std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArithOpt3( CJBig2_ArithDecoder* pArithDecoder, - JBig2ArithCtx* gbContext) { + JBig2ArithCtx* gbContext, + int OPT) { auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH); if (!GBREG->data()) return nullptr; @@ -78,13 +89,14 @@ std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArithTemplate0Opt3( int32_t nStride2 = nStride << 1; int32_t nLineBytes = ((GBW + 7) >> 3) - 1; int32_t nBitsLeft = GBW - (nLineBytes << 3); - uint32_t height = GBH & 0x7fffffff; - for (uint32_t h = 0; h < height; h++) { + // TODO(npm): Why is the height only trimmed when OPT is 0? + uint32_t height = OPT == 0 ? GBH & 0x7fffffff : GBH; + for (uint32_t h = 0; h < height; ++h) { if (TPGDON) { if (pArithDecoder->IsComplete()) return nullptr; - LTP = LTP ^ pArithDecoder->Decode(&gbContext[0x9b25]); + LTP = LTP ^ pArithDecoder->Decode(&gbContext[kOptConstant1[OPT]]); } if (LTP) { GBREG->CopyLine(h, h - 1); @@ -92,68 +104,74 @@ std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArithTemplate0Opt3( if (h > 1) { uint8_t* pLine1 = pLine - nStride2; uint8_t* pLine2 = pLine - nStride; - uint32_t line1 = (*pLine1++) << 6; + uint32_t line1 = (*pLine1++) << kOptConstant2[OPT]; uint32_t line2 = *pLine2++; - uint32_t CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); - for (int32_t cc = 0; cc < nLineBytes; cc++) { - line1 = (line1 << 8) | ((*pLine1++) << 6); + uint32_t CONTEXT = (line1 & kOptConstant3[OPT]) | + ((line2 >> kOptConstant4[OPT]) & kOptConstant5[OPT]); + for (int32_t cc = 0; cc < nLineBytes; ++cc) { + line1 = (line1 << 8) | ((*pLine1++) << kOptConstant2[OPT]); line2 = (line2 << 8) | (*pLine2++); uint8_t cVal = 0; - for (int32_t k = 7; k >= 0; k--) { + for (int32_t k = 7; k >= 0; --k) { if (pArithDecoder->IsComplete()) return nullptr; int bVal = pArithDecoder->Decode(&gbContext[CONTEXT]); cVal |= bVal << k; - CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | - ((line1 >> k) & 0x0800) | ((line2 >> k) & 0x0010)); + CONTEXT = + (((CONTEXT & kOptConstant6[OPT]) << 1) | bVal | + ((line1 >> k) & kOptConstant7[OPT]) | + ((line2 >> (k + kOptConstant4[OPT])) & kOptConstant8[OPT])); } pLine[cc] = cVal; } line1 <<= 8; line2 <<= 8; uint8_t cVal1 = 0; - for (int32_t k = 0; k < nBitsLeft; k++) { + for (int32_t k = 0; k < nBitsLeft; ++k) { if (pArithDecoder->IsComplete()) return nullptr; int bVal = pArithDecoder->Decode(&gbContext[CONTEXT]); cVal1 |= bVal << (7 - k); CONTEXT = - (((CONTEXT & 0x7bf7) << 1) | bVal | - ((line1 >> (7 - k)) & 0x0800) | ((line2 >> (7 - k)) & 0x0010)); + (((CONTEXT & kOptConstant6[OPT]) << 1) | bVal | + ((line1 >> (7 - k)) & kOptConstant7[OPT]) | + ((line2 >> (7 + kOptConstant4[OPT] - k)) & kOptConstant8[OPT])); } pLine[nLineBytes] = cVal1; } else { uint8_t* pLine2 = pLine - nStride; uint32_t line2 = (h & 1) ? (*pLine2++) : 0; - uint32_t CONTEXT = (line2 & 0x07f0); - for (int32_t cc = 0; cc < nLineBytes; cc++) { + uint32_t CONTEXT = ((line2 >> kOptConstant4[OPT]) & kOptConstant5[OPT]); + for (int32_t cc = 0; cc < nLineBytes; ++cc) { if (h & 1) { line2 = (line2 << 8) | (*pLine2++); } uint8_t cVal = 0; - for (int32_t k = 7; k >= 0; k--) { + for (int32_t k = 7; k >= 0; --k) { if (pArithDecoder->IsComplete()) return nullptr; int bVal = pArithDecoder->Decode(&gbContext[CONTEXT]); cVal |= bVal << k; CONTEXT = - (((CONTEXT & 0x7bf7) << 1) | bVal | ((line2 >> k) & 0x0010)); + (((CONTEXT & kOptConstant6[OPT]) << 1) | bVal | + ((line2 >> (k + kOptConstant4[OPT])) & kOptConstant8[OPT])); } pLine[cc] = cVal; } line2 <<= 8; uint8_t cVal1 = 0; - for (int32_t k = 0; k < nBitsLeft; k++) { + for (int32_t k = 0; k < nBitsLeft; ++k) { if (pArithDecoder->IsComplete()) return nullptr; int bVal = pArithDecoder->Decode(&gbContext[CONTEXT]); cVal1 |= bVal << (7 - k); - CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | - (((line2 >> (7 - k))) & 0x0010)); + CONTEXT = (((CONTEXT & kOptConstant6[OPT]) << 1) | bVal | + (((line2 >> (7 + kOptConstant4[OPT] - k))) & + kOptConstant8[OPT])); } pLine[nLineBytes] = cVal1; } @@ -217,103 +235,6 @@ std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArithTemplate0Unopt( return GBREG; } -std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArithTemplate1Opt3( - CJBig2_ArithDecoder* pArithDecoder, - JBig2ArithCtx* gbContext) { - auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH); - if (!GBREG->data()) - return nullptr; - - int LTP = 0; - uint8_t* pLine = GBREG->data(); - int32_t nStride = GBREG->stride(); - int32_t nStride2 = nStride << 1; - int32_t nLineBytes = ((GBW + 7) >> 3) - 1; - int32_t nBitsLeft = GBW - (nLineBytes << 3); - for (uint32_t h = 0; h < GBH; h++) { - if (TPGDON) { - if (pArithDecoder->IsComplete()) - return nullptr; - - LTP = LTP ^ pArithDecoder->Decode(&gbContext[0x0795]); - } - if (LTP) { - GBREG->CopyLine(h, h - 1); - } else { - if (h > 1) { - uint8_t* pLine1 = pLine - nStride2; - uint8_t* pLine2 = pLine - nStride; - uint32_t line1 = (*pLine1++) << 4; - uint32_t line2 = *pLine2++; - uint32_t CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); - for (int32_t cc = 0; cc < nLineBytes; cc++) { - line1 = (line1 << 8) | ((*pLine1++) << 4); - line2 = (line2 << 8) | (*pLine2++); - uint8_t cVal = 0; - for (int32_t k = 7; k >= 0; k--) { - if (pArithDecoder->IsComplete()) - return nullptr; - - int 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; - uint8_t cVal1 = 0; - for (int32_t k = 0; k < nBitsLeft; k++) { - if (pArithDecoder->IsComplete()) - return nullptr; - - int bVal = pArithDecoder->Decode(&gbContext[CONTEXT]); - cVal1 |= bVal << (7 - k); - CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | - ((line1 >> (7 - k)) & 0x0200) | - ((line2 >> (8 - k)) & 0x0008); - } - pLine[nLineBytes] = cVal1; - } else { - uint8_t* pLine2 = pLine - nStride; - uint32_t line2 = (h & 1) ? (*pLine2++) : 0; - uint32_t CONTEXT = (line2 >> 1) & 0x01f8; - for (int32_t cc = 0; cc < nLineBytes; cc++) { - if (h & 1) { - line2 = (line2 << 8) | (*pLine2++); - } - uint8_t cVal = 0; - for (int32_t k = 7; k >= 0; k--) { - if (pArithDecoder->IsComplete()) - return nullptr; - - int bVal = pArithDecoder->Decode(&gbContext[CONTEXT]); - cVal |= bVal << k; - CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | - ((line2 >> (k + 1)) & 0x0008); - } - pLine[cc] = cVal; - } - line2 <<= 8; - uint8_t cVal1 = 0; - for (int32_t k = 0; k < nBitsLeft; k++) { - if (pArithDecoder->IsComplete()) - return nullptr; - - int bVal = pArithDecoder->Decode(&gbContext[CONTEXT]); - cVal1 |= bVal << (7 - k); - CONTEXT = - ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008); - } - pLine[nLineBytes] = cVal1; - } - } - pLine += nStride; - } - return GBREG; -} - std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArithTemplate1Unopt( CJBig2_ArithDecoder* pArithDecoder, JBig2ArithCtx* gbContext) { @@ -366,103 +287,6 @@ std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArithTemplate1Unopt( return GBREG; } -std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArithTemplate2Opt3( - CJBig2_ArithDecoder* pArithDecoder, - JBig2ArithCtx* gbContext) { - auto GBREG = pdfium::MakeUnique<CJBig2_Image>(GBW, GBH); - if (!GBREG->data()) - return nullptr; - - int LTP = 0; - uint8_t* pLine = GBREG->data(); - int32_t nStride = GBREG->stride(); - int32_t nStride2 = nStride << 1; - int32_t nLineBytes = ((GBW + 7) >> 3) - 1; - int32_t nBitsLeft = GBW - (nLineBytes << 3); - for (uint32_t h = 0; h < GBH; h++) { - if (TPGDON) { - if (pArithDecoder->IsComplete()) - return nullptr; - - LTP = LTP ^ pArithDecoder->Decode(&gbContext[0x00e5]); - } - if (LTP) { - GBREG->CopyLine(h, h - 1); - } else { - if (h > 1) { - uint8_t* pLine1 = pLine - nStride2; - uint8_t* pLine2 = pLine - nStride; - uint32_t line1 = (*pLine1++) << 1; - uint32_t line2 = *pLine2++; - uint32_t CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); - for (int32_t cc = 0; cc < nLineBytes; cc++) { - line1 = (line1 << 8) | ((*pLine1++) << 1); - line2 = (line2 << 8) | (*pLine2++); - uint8_t cVal = 0; - for (int32_t k = 7; k >= 0; k--) { - if (pArithDecoder->IsComplete()) - return nullptr; - - int 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; - uint8_t cVal1 = 0; - for (int32_t k = 0; k < nBitsLeft; k++) { - if (pArithDecoder->IsComplete()) - return nullptr; - - int bVal = pArithDecoder->Decode(&gbContext[CONTEXT]); - cVal1 |= bVal << (7 - k); - CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | - ((line1 >> (7 - k)) & 0x0080) | - ((line2 >> (10 - k)) & 0x0004); - } - pLine[nLineBytes] = cVal1; - } else { - uint8_t* pLine2 = pLine - nStride; - uint32_t line2 = (h & 1) ? (*pLine2++) : 0; - uint32_t CONTEXT = (line2 >> 3) & 0x007c; - for (int32_t cc = 0; cc < nLineBytes; cc++) { - if (h & 1) { - line2 = (line2 << 8) | (*pLine2++); - } - uint8_t cVal = 0; - for (int32_t k = 7; k >= 0; k--) { - if (pArithDecoder->IsComplete()) - return nullptr; - - int bVal = pArithDecoder->Decode(&gbContext[CONTEXT]); - cVal |= bVal << k; - CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | - ((line2 >> (k + 3)) & 0x0004); - } - pLine[cc] = cVal; - } - line2 <<= 8; - uint8_t cVal1 = 0; - for (int32_t k = 0; k < nBitsLeft; k++) { - if (pArithDecoder->IsComplete()) - return nullptr; - - int bVal = pArithDecoder->Decode(&gbContext[CONTEXT]); - cVal1 |= bVal << (7 - k); - CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | - (((line2 >> (10 - k))) & 0x0004); - } - pLine[nLineBytes] = cVal1; - } - } - pLine += nStride; - } - return GBREG; -} - std::unique_ptr<CJBig2_Image> CJBig2_GRDProc::DecodeArithTemplate2Unopt( CJBig2_ArithDecoder* pArithDecoder, JBig2ArithCtx* gbContext) { diff --git a/core/fxcodec/jbig2/JBig2_GrdProc.h b/core/fxcodec/jbig2/JBig2_GrdProc.h index 67d83ddec6..fddb424415 100644 --- a/core/fxcodec/jbig2/JBig2_GrdProc.h +++ b/core/fxcodec/jbig2/JBig2_GrdProc.h @@ -73,21 +73,16 @@ class CJBig2_GRDProc { FXCODEC_STATUS ProgressiveDecodeArithTemplate3Unopt( ProgressiveArithDecodeState* pState); - std::unique_ptr<CJBig2_Image> DecodeArithTemplate0Opt3( + std::unique_ptr<CJBig2_Image> DecodeArithOpt3( CJBig2_ArithDecoder* pArithDecoder, - JBig2ArithCtx* gbContext); + JBig2ArithCtx* gbContext, + int OPT); std::unique_ptr<CJBig2_Image> DecodeArithTemplate0Unopt( CJBig2_ArithDecoder* pArithDecoder, JBig2ArithCtx* gbContext); - std::unique_ptr<CJBig2_Image> DecodeArithTemplate1Opt3( - CJBig2_ArithDecoder* pArithDecoder, - JBig2ArithCtx* gbContext); std::unique_ptr<CJBig2_Image> DecodeArithTemplate1Unopt( CJBig2_ArithDecoder* pArithDecoder, JBig2ArithCtx* gbContext); - std::unique_ptr<CJBig2_Image> DecodeArithTemplate2Opt3( - CJBig2_ArithDecoder* pArithDecoder, - JBig2ArithCtx* gbContext); std::unique_ptr<CJBig2_Image> DecodeArithTemplate2Unopt( CJBig2_ArithDecoder* pArithDecoder, JBig2ArithCtx* gbContext); |