// 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();
|
}
|