summaryrefslogtreecommitdiff
path: root/core/fxcodec/jbig2/JBig2_HtrdProc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fxcodec/jbig2/JBig2_HtrdProc.cpp')
-rw-r--r--core/fxcodec/jbig2/JBig2_HtrdProc.cpp150
1 files changed, 99 insertions, 51 deletions
diff --git a/core/fxcodec/jbig2/JBig2_HtrdProc.cpp b/core/fxcodec/jbig2/JBig2_HtrdProc.cpp
index a7de28607e..25e6b9cf3f 100644
--- a/core/fxcodec/jbig2/JBig2_HtrdProc.cpp
+++ b/core/fxcodec/jbig2/JBig2_HtrdProc.cpp
@@ -7,8 +7,11 @@
#include "core/fxcodec/jbig2/JBig2_HtrdProc.h"
#include <algorithm>
+#include <utility>
-#include "core/fxcodec/jbig2/JBig2_GsidProc.h"
+#include "core/fxcodec/jbig2/JBig2_BitStream.h"
+#include "core/fxcodec/jbig2/JBig2_GrdProc.h"
+#include "core/fxcodec/jbig2/JBig2_Image.h"
#include "core/fxcrt/fx_basic.h"
#include "third_party/base/ptr_util.h"
@@ -16,21 +19,17 @@ std::unique_ptr<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;
auto HTREG = pdfium::MakeUnique<CJBig2_Image>(HBW, HBH);
HTREG->fill(HDEFPIXEL);
if (HENABLESKIP == 1) {
HSKIP = pdfium::MakeUnique<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)) {
+ for (uint32_t mg = 0; mg < HGH; ++mg) {
+ for (uint32_t ng = 0; ng < HGW; ++ng) {
+ int32_t x = (HGX + mg * HRY + ng * HRX) >> 8;
+ int32_t y = (HGY + mg * HRX - ng * HRY) >> 8;
+ if ((x + HPW <= 0) | (x >= static_cast<int32_t>(HBW)) | (y + HPH <= 0) |
+ (y >= static_cast<int32_t>(HPH))) {
HSKIP->setPixel(ng, mg, 1);
} else {
HSKIP->setPixel(ng, mg, 0);
@@ -38,63 +37,112 @@ std::unique_ptr<CJBig2_Image> CJBig2_HTRDProc::decode_Arith(
}
}
}
- HBPP = 1;
- while ((uint32_t)(1 << HBPP) < HNUMPATS) {
- HBPP++;
+ uint32_t HBPP = 1;
+ while (static_cast<uint32_t>(1 << HBPP) < HNUMPATS)
+ ++HBPP;
+
+ CJBig2_GRDProc GRD;
+ GRD.MMR = HMMR;
+ GRD.GBW = HGW;
+ GRD.GBH = HGH;
+ GRD.GBTEMPLATE = HTEMPLATE;
+ GRD.TPGDON = 0;
+ GRD.USESKIP = HENABLESKIP;
+ GRD.SKIP = HSKIP.get();
+ if (HTEMPLATE <= 1)
+ GRD.GBAT[0] = 3;
+ else
+ GRD.GBAT[0] = 2;
+ GRD.GBAT[1] = -1;
+ if (GRD.GBTEMPLATE == 0) {
+ GRD.GBAT[2] = -3;
+ GRD.GBAT[3] = -1;
+ GRD.GBAT[4] = 2;
+ GRD.GBAT[5] = -2;
+ GRD.GBAT[6] = -2;
+ GRD.GBAT[7] = -2;
+ }
+
+ uint8_t GSBPP = static_cast<uint8_t>(HBPP);
+ std::vector<std::unique_ptr<CJBig2_Image>> GSPLANES(GSBPP);
+ for (int32_t i = GSBPP - 1; i >= 0; --i) {
+ std::unique_ptr<CJBig2_Image> pImage;
+ FXCODEC_STATUS status =
+ GRD.Start_decode_Arith(&pImage, pArithDecoder, gbContext, nullptr);
+ while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE)
+ status = GRD.Continue_decode(pPause, pArithDecoder);
+
+ if (!pImage)
+ return nullptr;
+
+ GSPLANES[i] = std::move(pImage);
+ if (i < GSBPP - 1)
+ GSPLANES[i]->composeFrom(0, 0, GSPLANES[i + 1].get(), JBIG2_COMPOSE_XOR);
+ }
+ std::vector<uint32_t> GSVALS(HGW * HGH);
+ for (uint32_t y = 0; y < HGH; ++y) {
+ for (uint32_t x = 0; x < HGW; ++x) {
+ for (int32_t i = 0; i < GSBPP; ++i)
+ GSVALS[y * HGW + x] |= GSPLANES[i]->getPixel(x, y) << i;
+ }
}
- auto pGID = pdfium::MakeUnique<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 = std::min(GI[mg * HGW + ng], HNUMPATS - 1);
+ for (uint32_t mg = 0; mg < HGH; ++mg) {
+ for (uint32_t ng = 0; ng < HGW; ++ng) {
+ int32_t x = (HGX + mg * HRY + ng * HRX) >> 8;
+ int32_t y = (HGY + mg * HRX - ng * HRY) >> 8;
+ uint32_t pat_index = std::min(GSVALS[mg * HGW + ng], HNUMPATS - 1);
HTREG->composeFrom(x, y, (*HPATS)[pat_index].get(), HCOMBOP);
}
}
- FX_Free(GI);
return HTREG;
}
std::unique_ptr<CJBig2_Image> CJBig2_HTRDProc::decode_MMR(
CJBig2_BitStream* pStream) {
- uint32_t ng, mg;
- int32_t x, y;
- uint32_t* GI;
auto HTREG = pdfium::MakeUnique<CJBig2_Image>(HBW, HBH);
HTREG->fill(HDEFPIXEL);
uint32_t HBPP = 1;
- while ((uint32_t)(1 << HBPP) < HNUMPATS) {
- HBPP++;
- }
- auto pGID = pdfium::MakeUnique<CJBig2_GSIDProc>();
- pGID->GSMMR = HMMR;
- pGID->GSW = HGW;
- pGID->GSH = HGH;
- pGID->GSBPP = (uint8_t)HBPP;
- pGID->GSUSESKIP = 0;
- GI = pGID->decode_MMR(pStream);
- if (!GI)
+ while (static_cast<uint32_t>(1 << HBPP) < HNUMPATS)
+ ++HBPP;
+
+ CJBig2_GRDProc GRD;
+ GRD.MMR = HMMR;
+ GRD.GBW = HGW;
+ GRD.GBH = HGH;
+
+ uint8_t GSBPP = static_cast<uint8_t>(HBPP);
+ std::vector<std::unique_ptr<CJBig2_Image>> GSPLANES(GSBPP);
+ GRD.Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream);
+ if (!GSPLANES[GSBPP - 1])
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 = std::min(GI[mg * HGW + ng], HNUMPATS - 1);
+ pStream->alignByte();
+ pStream->offset(3);
+ for (int32_t J = GSBPP - 2; J >= 0; --J) {
+ GRD.Start_decode_MMR(&GSPLANES[J], pStream);
+ if (!GSPLANES[J])
+ return nullptr;
+
+ pStream->alignByte();
+ pStream->offset(3);
+ GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1].get(), JBIG2_COMPOSE_XOR);
+ }
+ std::vector<uint32_t> GSVALS(HGW * HGH);
+ for (uint32_t y = 0; y < HGH; ++y) {
+ for (uint32_t x = 0; x < HGW; ++x) {
+ for (int32_t i = 0; i < GSBPP; ++i)
+ GSVALS[y * HGW + x] |= GSPLANES[i]->getPixel(x, y) << i;
+ }
+ }
+
+ for (uint32_t mg = 0; mg < HGH; ++mg) {
+ for (uint32_t ng = 0; ng < HGW; ++ng) {
+ int32_t x = (HGX + mg * HRY + ng * HRX) >> 8;
+ int32_t y = (HGY + mg * HRX - ng * HRY) >> 8;
+ uint32_t pat_index = std::min(GSVALS[mg * HGW + ng], HNUMPATS - 1);
HTREG->composeFrom(x, y, (*HPATS)[pat_index].get(), HCOMBOP);
}
}
- FX_Free(GI);
return HTREG;
}