Index: core/src/fxcodec/jbig2/JBig2_HtrdProc.cpp |
diff --git a/core/src/fxcodec/jbig2/JBig2_HtrdProc.cpp b/core/src/fxcodec/jbig2/JBig2_HtrdProc.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a5a8b7abfee0ed59d68b1bca23df9200f77b32f3 |
--- /dev/null |
+++ b/core/src/fxcodec/jbig2/JBig2_HtrdProc.cpp |
@@ -0,0 +1,103 @@ |
+// Copyright 2015 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_HtrdProc.h" |
+ |
+#include "../../../../third_party/base/nonstd_unique_ptr.h" |
+#include "../../../include/fxcrt/fx_basic.h" |
+#include "JBig2_GsidProc.h" |
+ |
+CJBig2_Image* CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, |
+ JBig2ArithCtx* gbContext, |
+ IFX_Pause* pPause) { |
+ FX_DWORD ng, mg; |
+ int32_t x, y; |
+ FX_DWORD HBPP; |
+ FX_DWORD* GI; |
+ nonstd::unique_ptr<CJBig2_Image> HSKIP; |
+ nonstd::unique_ptr<CJBig2_Image> HTREG(new CJBig2_Image(HBW, HBH)); |
+ HTREG->fill(HDEFPIXEL); |
+ if (HENABLESKIP == 1) { |
+ HSKIP.reset(new 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); |
+ } |
+ } |
+ } |
+ } |
+ HBPP = 1; |
+ while ((FX_DWORD)(1 << HBPP) < HNUMPATS) { |
+ HBPP++; |
+ } |
+ nonstd::unique_ptr<CJBig2_GSIDProc> pGID(new CJBig2_GSIDProc()); |
+ pGID->GSMMR = HMMR; |
+ pGID->GSW = HGW; |
+ pGID->GSH = HGH; |
+ pGID->GSBPP = (uint8_t)HBPP; |
+ pGID->GSUSESKIP = HENABLESKIP; |
+ pGID->GSKIP = HSKIP.get(); |
+ pGID->GSTEMPLATE = HTEMPLATE; |
+ GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause); |
+ if (!GI) |
+ return nullptr; |
+ |
+ 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); |
+ } |
+ } |
+ FX_Free(GI); |
+ return HTREG.release(); |
+} |
+ |
+CJBig2_Image* CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream* pStream, |
+ IFX_Pause* pPause) { |
+ FX_DWORD ng, mg; |
+ int32_t x, y; |
+ FX_DWORD* GI; |
+ nonstd::unique_ptr<CJBig2_Image> HTREG(new CJBig2_Image(HBW, HBH)); |
+ HTREG->fill(HDEFPIXEL); |
+ FX_DWORD HBPP = 1; |
+ while ((FX_DWORD)(1 << HBPP) < HNUMPATS) { |
+ HBPP++; |
+ } |
+ nonstd::unique_ptr<CJBig2_GSIDProc> pGID(new 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) |
+ return nullptr; |
+ |
+ 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); |
+ } |
+ } |
+ FX_Free(GI); |
+ return HTREG.release(); |
+} |