// 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 "core/fxcodec/jbig2/JBig2_HtrdProc.h" #include <memory> #include "core/fxcodec/jbig2/JBig2_GsidProc.h" #include "core/fxcrt/include/fx_basic.h" CJBig2_Image* CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, JBig2ArithCtx* gbContext, IFX_Pause* pPause) { uint32_t ng, mg; int32_t x, y; uint32_t HBPP; uint32_t* GI; std::unique_ptr<CJBig2_Image> HSKIP; std::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 ((uint32_t)(1 << HBPP) < HNUMPATS) { HBPP++; } std::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; uint32_t 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) { uint32_t ng, mg; int32_t x, y; uint32_t* GI; std::unique_ptr<CJBig2_Image> HTREG(new CJBig2_Image(HBW, HBH)); HTREG->fill(HDEFPIXEL); uint32_t HBPP = 1; while ((uint32_t)(1 << HBPP) < HNUMPATS) { HBPP++; } std::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; uint32_t 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(); }